Compare commits

...

49 Commits

Author SHA1 Message Date
Florian Müllner
ee3cd450a5 build: Don't introspect ShellMenu
It is now only used internally by ShellApp to track remote actions,
so there's no need to expose it to javascript code.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-01-26 14:35:30 +01:00
Florian Müllner
996369a22d build: Remove remote menu support
It is now unused.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-01-26 14:35:30 +01:00
Florian Müllner
ce6ab7e121 app: Remove :menu property
It is now unused.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-01-26 14:34:59 +01:00
Florian Müllner
3da747ec2d app: Don't rely on app menu to check for GtkApplications
As the app menu is being phased out, it is no longer a good indicator
for GtkApplications. Instead, base the check directly on the appropriate
D-Bus properties.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-01-26 14:34:59 +01:00
Florian Müllner
593f15ad63 windowMenu: Remove fallback app menu support
With the app menu being phased out entirely, there's no good reason to
keep support for the fallback app menu in decorations either - the number
of applications that set an app menu and haven't embraced client-side
decorations is extremely small, and they should already have alternative
fallbacks for non-GNOME environment in place.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-01-26 14:34:59 +01:00
Florian Müllner
acdbd28262 panel: Remove the app menu
As the app menu is in the process of being retired[0], stop displaying
it in the shell - GTK+ still has a fallback path for applications that
haven't removed it yet.

[0] https://gitlab.gnome.org/GNOME/Initiatives/wikis/App-Menu-Retirement

https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-01-26 14:34:00 +01:00
Florian Müllner
ca70a4fc17 panel: Remove unused import
https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-01-26 14:32:20 +01:00
Lubomir Rintel
dfa0750ffd networkAgent: Advise the user to push a WPS button on their router
When connecting to a Wi-Fi router that supports the WPS button method
(PBC, push button connection) the user can simply press the button on
the router. Show an explanation in the PSK prompt when this is
possible.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/329
2019-01-25 15:25:26 +01:00
Florian Müllner
d80e7e0118 lookingGlass: Don't import Lang by default
With arrow functions, Function.prototype.bind() and ES6 classes, the
Lang module is rarely needed nowadays.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/361
2019-01-25 14:02:44 +00:00
Florian Müllner
b7e2718bdc docs: Update HACKING
We no longer use Lang.Class(), so update the guidelines accordingly.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/361
2019-01-25 14:02:44 +00:00
Florian Müllner
e68dfed1f7 cleanup: Port GObject classes to JS6 classes
GJS added API for defining GObject classes with ES6 class syntax
last cycle, use it to port the remaining Lang.Class classes to
the new syntax.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/361
2019-01-25 14:02:44 +00:00
Florian Müllner
bacfdbbb03 cleanup: Port non-GObject classes to JS6 classes
ES6 finally adds standard class syntax to the language, so we can
replace our custom Lang.Class framework with the new syntax. Any
classes that inherit from GObject will need special treatment,
so limit the port to regular javascript classes for now.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/361
2019-01-25 14:02:44 +00:00
verdre
99ce3deeb0 st-button: Handle touch-cancel events
Handling those events is neccessary if a touch event that pressed down a
button turns out to be a gesture. In this case the button should be
released without emitting the clicked signal.
2019-01-25 10:31:41 +00:00
Sergio Costas
d75a3484d6 windowManager: detect change to a non-existent WS
When using dynamic workspaces, it is possible to try to change to a
non-existent one if the user defines hotkeys for changing to desktop
1, 2, 3... This case is not detected, and gnome shell shows an error:

JS ERROR: TypeError: workspace is null
actionMoveWorkspace@resource:///org/gnome/shell/ui/windowManager.js:2130:13
wrapper@resource:///org/gnome/gjs/modules/_legacy.js:82:22
_showWorkspaceSwitcher@resource:///org/gnome/shell/ui/windowManager.js:2104:13
wrapper@resource:///org/gnome/gjs/modules/_legacy.js:82:22

This patch adds a check before trying to change the workspace, to avoid
switching to a non-existent one.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/365
2019-01-24 23:59:23 +01:00
Georges Basile Stavracas Neto
3dcb593a71 texture-cache: Simplify function with g_autoptr
st_texture_cache_reset_texture() is slightly easier to
read and follow by using g_autoptr, so use that.
2019-01-24 16:23:58 -02:00
Georges Basile Stavracas Neto
1847a4f4cc texture-cache: Avoid creating unnecessary ClutterImages
After loading the GdkPixbuf, StTextureCache unconditionally
creates a ClutterImage and, if it's not in the cache, add
it to the cache. That's a waste of resources when the image
is already committed to the texture cache.

Fix that by reusing the ClutterImage of the cache if it is
already there; otherwise, create a new ClutterImage as we
were previously doing.
2019-01-24 16:23:58 -02:00
Georges Basile Stavracas Neto
deec0bf255 texture-cache: Replace ClutterTexture by ClutterImage
ClutterTexture is a deprecated class that is simultaneously
an actor, and the content of the actor. Clutter's new model
is to separate painting (via ClutterContent) from actors.

Currently, StTextureCache relies on ClutterTexture to store
the loaded textures. This not only does not match the latest
practices of Clutter, but also generates various compile-time
warnings.

Port StTextureCache to store ClutterImages instead of storing
ClutterTextures. ClutterImage exposes the internal CoglTexture,
so no helpers are needed to match the current StTextureCache
API. Aspect ratio was dropped, but from my testing, it doesn't
change anything.
2019-01-24 16:23:58 -02:00
Philip Withnall
8bb9eb0fc9 keyboard: Disconnect from input source manager when destroying indicator
When an InputSourceIndicator is destroyed, the InputSourceManager it was
connected to could (and probably will) outlive it (since the manager is
a singleton). If the InputSourceManager emits any subsequent signals,
the callbacks from the finalised InputSourceIndicator could be invoked,
and will reference finalised objects.

This can be triggered by running `pkexec true` from a gnome-terminal
window, then calling `pkill pkexec` from another terminal (on a
different VT or via SSH). This causes the dialogue to be cancelled by
polkitd.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/357
2019-01-24 14:48:48 +00:00
Philip Withnall
21de3c327b polkitAgent: Disconnect from user signals when closing dialogue
Otherwise the user object could outlive the dialogue, emit a subsequent
signal, and the callback from that signal could reference finalised
objects/widgets from the dialogue. The likely mechanism for the user
outliving the dialogue is caching of user objects within
libaccountsservice.

This can be triggered by running `pkexec true` from a gnome-terminal
window, then calling `pkill pkexec` from another terminal (on a
different VT or via SSH). This causes the dialogue to be cancelled by
polkitd.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/357
2019-01-24 14:48:48 +00:00
Philip Withnall
081d94e0f6 polkitAgent: Destroy session from dialogue closed handler
Rather than explicitly destroying the session after calling close(),
destroy it from the `closed` signal handler.

This also means we can make the method internal.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/357
2019-01-24 14:48:48 +00:00
Philip Withnall
ddd1825162 polkitAgent: Drop close() override in favour of closed signal
In case there are any internal ways the dialogue can close itself
without calling its own close() method, it’s probably better to do all
our cleanup on a handler for the `closed` signal instead.

This should introduce no functional changes except ensuring the
polkitAgent cleanup is always done.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/357
2019-01-24 14:48:48 +00:00
Philip Withnall
5f223e0bd8 polkitAgent: Disconnect session signal handlers when destroying session
Otherwise the session could outlive the dialogue, emit a subsequent
signal, and its callback would reference finalised objects/widgets from
the dialogue. The PolkitSession object is implemented by
libpolkit-gobject, so we have no guarantees about its reference counting
— the session object could keep itself alive in another thread, or be a
singleton. In all likelihood, the session hangs around for longer than
the dialogue due to differences in when the two objects are garbage
collected.

This can be triggered by running `pkexec true` from a gnome-terminal
window, then calling `pkill pkexec` from another terminal (on a
different VT or via SSH). This causes the dialogue to be cancelled by
polkitd.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/357
2019-01-24 14:48:48 +00:00
Philip Withnall
809d92129b search: Initialise searchInProgress when search providers are registered
This avoids the following warning sometimes happening later:

JS WARNING: [resource:///org/gnome/shell/ui/search.js 701]: reference to undefined property "searchInProgress"

Signed-off-by: Philip Withnall <withnall@endlessm.com>

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/357
2019-01-24 14:48:48 +00:00
Jordi Mas
8840608a25 Update Catalan translation 2019-01-24 11:31:05 +01:00
Florian Müllner
edbb204332 animation: Disable spinner animations when actor is destroyed
There's nothing to animate anymore, just a source for warnings when
trying to access a destroyed object.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/362
2019-01-24 00:20:58 +01:00
Florian Müllner
9dc3b73ef9 calendar: Rename "Clear All" button
While it hasn't really cleared everything previously (media notifications),
it does less so now. Update the button label to reflect that.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/262
2019-01-22 21:35:52 +00:00
Florian Müllner
a7d618915c calendar: Remove ability to hide events
The functionality is no longer exposed, so remove it altogether.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/262
2019-01-22 21:35:52 +00:00
Florian Müllner
3e3da8e2f8 calendar: Don't allow event messages to be closed
The built-in calendar isn't meant to replace a full-fledged calendar
app, which is why clearing event messages only hides the event in
gnome-shell rather than deleting the actual event. This has turned out
to not be overly useful and often confusing - it creates a discrepancy
with visible events in apps, isn't revertible in a non-obscure fashion
and non-obviously limited to the current date.

As we are considering moving events out of the message list and back to
the calendar, it looks like a good time to remove that ability and keep
notifications as the only removable messages.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/262
2019-01-22 21:35:52 +00:00
Florian Müllner
a6763e7731 messageTray: Chain up in NotificationPolicy constructor
We currently deliberately avoid chaining up in derived policy
constructors to not override properties with their defaults.
That's a neat trick that will stop working when porting to ES6
classes, as chaining up is necessary to actually initialize the
object there (including "this").

Address this by turning all properties into (overridable) getters
that are backed by private properties by default.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/350
2019-01-22 21:33:46 +00:00
Florian Müllner
8f15193b40 messageTray: Split out policy creation
The _createPolicy() method of a subclass usually depends on some
constructor parameters that need to be set before chaining up to
the parent. This works fine with Lang.Class, but will break with
ES6 classes, as "this" is only initialized after chaining up.

Prepare for this by not creating the policy in the constructor,
but when it is first accessed.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/350
2019-01-22 21:33:46 +00:00
Florian Müllner
467b7c1bca lookingGlass: Stop using eval()
Its use is not only strongly discouraged[0], we also rely on it injecting
variables into the global scope to get command-line-like behavior. That
behavior is incompatible with strict mode[1], and in extension with ES6
classes (which imply strict mode).

So to prepare for porting to ES6 classes, replace it with a somewhat less
evil construct that is compatible with strict mode.

[0] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Do_not_ever_use_eval!
[1]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Simplifying_variable_uses

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/350
2019-01-22 21:33:46 +00:00
Florian Müllner
97963a1ca8 docs: Remove obsolete Lang references
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/350
2019-01-22 21:33:46 +00:00
Florian Müllner
2fc1f1adbe cleanup: Remove obsolete Lang imports
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/350
2019-01-22 21:33:46 +00:00
Pieter Schalk Schoeman
200f4908d5 Update Afrikaans translation 2019-01-20 23:04:31 +00:00
Christian Kellner
1f864c905d thunderbolt: only try to enroll if we are allowed
Check via Polkit if the current user is actually allowed to enroll
devices before trying to do so. If not, show a notification that
explains that a system administrator needs to authorize the device.
Clicking on the notification will guide the user to the thunderbolt
control center panel. Before this patch, when the current user was
not allowed to enroll a device a polkit dialog would pop up which
is confusing because it did not contain any information why it was
shown. This patch implements the behavior as designed (see [1],
section "Multi-user environments").

[1] https://wiki.gnome.org/Design/Whiteboards/ThunderboltAccess
2019-01-18 22:10:23 +01:00
Ignat Loskutov
df77fb6793 media section: Change size of the fallback cover
Fallback cover used to be larger than the non-fallback one,
making the media controls look inconsistent.
2019-01-18 21:36:10 +03:00
Charles Monzat
3fa3889fa5 Update French translation
(cherry picked from commit ee97f73521)
2019-01-17 16:58:43 +00:00
Daniel van Vugt
4b28b90e0f notificationDaemon.js: Fix a typo (missing ')')
Introduced in e0a992af73 it was preventing gnome-shell from starting.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/915
2019-01-17 11:55:04 +08:00
Florian Müllner
e0a992af73 notificationDaemon: Fix warning
Since commit 33b8537bf5, we unconditionally access the 'image-path'
hint, resulting in a gjs warning if the hint is not defined.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/309
2019-01-16 18:57:04 +01:00
Niels De Graef
7c4e43c84f Remove deprecated CoglHandle
Prefer something a bit more type-safe instead and in the meantime use
the newly available `cogl_clear_object` to simplify some code a bit.
2019-01-16 17:54:29 +00:00
Florian Müllner
b57832716a calendar: Disconnect signals when resetting notification
Since commit 5fb8d4f730, a NotificationMessage's notification property
is reset to null when the notification is destroyed. However at that
point we still have connected signal handlers around that we'll try
to disconnect later.

Avoid the warnings by disconnecting and resetting the handler IDs at
the same time as the notification.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/308
2019-01-16 17:46:09 +00:00
Florian Müllner
945a019974 animation: Optionally animate spinner start/stop
In contrast to generic animated icons, it is reasonable to expect
spinners to be invisible while inactive. Implement that behavior
in the new Spinner class and optionally animate the transitions.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/316
2019-01-16 17:44:42 +00:00
Florian Müllner
22e21ad7d1 animation: Add dedicated Spinner class
We use AnimatedIcon with the same resource all over the place, cut
down on the duplication by providing a dedicated class.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/316
2019-01-16 17:44:42 +00:00
Takao Fujiwara
ae48f8bda9 inputMethod: Delete the enabled member since it's not used
When `ibus restart` runs, InputMethod.enabled is changed to false
and no longer enable ibus but 'enabled' and 'disabled' signals
are not used in the current IBus clients and it's good to delete
the member simply.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/295
2019-01-16 17:33:58 +00:00
Florian Müllner
62abf3edc7 audioDeviceSelection: Only include settings button when allowed
https://gitlab.gnome.org/GNOME/gnome-shell/issues/909
2019-01-16 00:30:46 +00:00
Florian Müllner
f8ce47c24d keyboard: Use addSettingsItem() in language menu
If the session mode doesn't allow access to Settings, the language
menu should respect that and not expose the "Region & Languages"
panel. Using the dedicated method instead of manually constructing
the menu item takes care of that and makes for less code.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/780
2019-01-16 00:29:23 +00:00
Bilal Elmoussaoui
ddb3a5c625 Add Iagno to appFavorites 2019-01-15 15:31:13 +00:00
Carmen Bianca BAKKER
c6d2bc4c57 Update Esperanto translation 2019-01-14 21:48:02 +00:00
Daniel Mustieles
e3a0b6d4ee Updated Spanish translation 2019-01-14 15:43:41 +01:00
154 changed files with 6725 additions and 9652 deletions

View File

@@ -82,7 +82,6 @@ don't use.
```javascript ```javascript
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -121,40 +120,34 @@ See [What's new in JavaScript 1.7](https://developer.mozilla.org/en/JavaScript/N
## Classes ## Classes
There are many approaches to classes in JavaScript. We use our own class framework There are many approaches to classes in JavaScript. We use standard ES6 classes
(sigh), which is built in gjs. The advantage is that it supports inheriting from whenever possible, that is when not inheriting from GObjects.
GObjects, although this feature isn't used very often in the Shell itself.
```javascript ```javascript
var IconLabelMenuItem = new Lang.Class({ var IconLabelMenuItem = class extends PopupMenu.PopupMenuBaseItem {
Name: 'IconLabelMenuItem', constructor(icon, label) {
Extends: PopupMenu.PopupMenuBaseItem, super({ reactive: false });
_init(icon, label) {
this.parent({ reactive: false });
this.actor.add_child(icon); this.actor.add_child(icon);
this.actor.add_child(label); this.actor.add_child(label);
}, }
open() { open() {
log("menu opened!"); log("menu opened!");
} }
}); };
``` ```
* 'Name' is required. 'Extends' is optional. If you leave it out, you will For GObject inheritence, we use the GObject.registerClass() function provided
automatically inherit from Object. by gjs.
```javascript
var MyActor = GObject.registerClass(
class MyActor extends Clutter.Actor {
_init(params) {
super._init(params);
* Leave a blank line between the "class header" (Name, Extends, and other this.name = 'MyCustomActor';
things) and the "class body" (methods). Leave a blank line between each }
method. });
```
* No space before the colon, one space after.
* No trailing comma after the last item.
* Make sure to use a semicolon after the closing paren to the class. It's
still a giant function call, even though it may resemble a more
conventional syntax.
## GObject Introspection ## GObject Introspection
@@ -162,17 +155,16 @@ GObject Introspection is a powerful feature that allows us to have native
bindings for almost any library built around GObject. If a library requires bindings for almost any library built around GObject. If a library requires
you to inherit from a type to use it, you can do so: you to inherit from a type to use it, you can do so:
```javascript ```javascript
var MyClutterActor = new Lang.Class({ var MyClutterActor = GObject.registerClass(
Name: 'MyClutterActor', class MyClutterActor extends Clutter.Actor {
Extends: Clutter.Actor,
vfunc_get_preferred_width(actor, forHeight) { vfunc_get_preferred_width(actor, forHeight) {
return [100, 100]; return [100, 100];
}, }
vfunc_get_preferred_height(actor, forWidth) { vfunc_get_preferred_height(actor, forWidth) {
return [100, 100]; return [100, 100];
}, }
vfunc_paint(actor) { vfunc_paint(actor) {
let alloc = this.get_allocation_box(); let alloc = this.get_allocation_box();
@@ -207,20 +199,18 @@ that has a property called `actor`. We call this wrapper class the "delegate".
We sometimes use expando properties to set a property called `_delegate` on We sometimes use expando properties to set a property called `_delegate` on
the actor itself: the actor itself:
```javascript ```javascript
var MyClass = new Lang.Class({ var MyClass = class {
Name: 'MyClass', constructor() {
_init() {
this.actor = new St.Button({ text: "This is a button" }); this.actor = new St.Button({ text: "This is a button" });
this.actor._delegate = this; this.actor._delegate = this;
this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('clicked', this._onClicked.bind(this));
}, }
_onClicked(actor) { _onClicked(actor) {
actor.set_label("You clicked the button!"); actor.set_label("You clicked the button!");
} }
}); };
``` ```
The 'delegate' property is important for anything which trying to get the The 'delegate' property is important for anything which trying to get the
@@ -246,8 +236,6 @@ variable that can be captured in closures.
All closures should be wrapped with Function.prototype.bind or use arrow All closures should be wrapped with Function.prototype.bind or use arrow
notation. notation.
```javascript ```javascript
const Lang = imports.lang;
let closure1 = () => { this._fnorbate(); }; let closure1 = () => { this._fnorbate(); };
let closure2 = this._fnorbate.bind(this); let closure2 = this._fnorbate.bind(this);
``` ```
@@ -255,19 +243,18 @@ notation.
A more realistic example would be connecting to a signal on a method of a A more realistic example would be connecting to a signal on a method of a
prototype: prototype:
```javascript ```javascript
const Lang = imports.lang;
const FnorbLib = imports.fborbLib; const FnorbLib = imports.fborbLib;
var MyClass = new Lang.Class({ var MyClass = class {
_init() { _init() {
let fnorb = new FnorbLib.Fnorb(); let fnorb = new FnorbLib.Fnorb();
fnorb.connect('frobate', this._onFnorbFrobate.bind(this)); fnorb.connect('frobate', this._onFnorbFrobate.bind(this));
}, }
_onFnorbFrobate(fnorb) { _onFnorbFrobate(fnorb) {
this._updateFnorb(); this._updateFnorb();
} }
}); };
``` ```
## Object literal syntax ## Object literal syntax
@@ -301,23 +288,21 @@ property.
```javascript ```javascript
var ANIMATION_TIME = 2000; var ANIMATION_TIME = 2000;
var MyClass = new Lang.Class({ var MyClass = class {
Name: 'MyClass', constructor() {
_init() {
this.actor = new St.BoxLayout(); this.actor = new St.BoxLayout();
this._position = 0; this._position = 0;
}, }
get position() { get position() {
return this._position; return this._position;
}, }
set position(value) { set position(value) {
this._position = value; this._position = value;
this.actor.set_position(value, value); this.actor.set_position(value, value);
} }
}); };
let myThing = new MyClass(); let myThing = new MyClass();
Tweener.addTween(myThing, Tweener.addTween(myThing,

View File

@@ -104,13 +104,6 @@
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/" <schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
gettext-domain="@GETTEXT_PACKAGE@"> gettext-domain="@GETTEXT_PACKAGE@">
<key name="open-application-menu" type="as">
<default>["&lt;Super&gt;F10"]</default>
<summary>Keybinding to open the application menu</summary>
<description>
Keybinding to open the application menu.
</description>
</key>
<key name="toggle-application-view" type="as"> <key name="toggle-application-view" type="as">
<default>["&lt;Super&gt;a"]</default> <default>["&lt;Super&gt;a"]</default>
<summary>Keybinding to open the “Show Applications” view</summary> <summary>Keybinding to open the “Show Applications” view</summary>

View File

@@ -1084,8 +1084,8 @@ StScrollBar {
background-color: $bg_color; background-color: $bg_color;
border: 2px solid $bg_color; border: 2px solid $bg_color;
border-radius: 2px; border-radius: 2px;
icon-size: 16px; icon-size: 32px !important;
padding: 8px; } padding: 6px; }
} }

View File

@@ -1,5 +1,3 @@
const Lang = imports.lang;
const Gettext = imports.gettext; const Gettext = imports.gettext;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
@@ -24,9 +22,8 @@ function stripPrefix(string, prefix) {
return string; return string;
} }
var Application = new Lang.Class({ var Application = class {
Name: 'Application', constructor() {
_init() {
GLib.set_prgname('gnome-shell-extension-prefs'); GLib.set_prgname('gnome-shell-extension-prefs');
this.application = new Gtk.Application({ this.application = new Gtk.Application({
application_id: 'org.gnome.shell.ExtensionPrefs', application_id: 'org.gnome.shell.ExtensionPrefs',
@@ -42,7 +39,7 @@ var Application = new Lang.Class({
this._startupUuid = null; this._startupUuid = null;
this._loaded = false; this._loaded = false;
this._skipMainWindow = false; this._skipMainWindow = false;
}, }
_extensionAvailable(uuid) { _extensionAvailable(uuid) {
let extension = ExtensionUtils.extensions[uuid]; let extension = ExtensionUtils.extensions[uuid];
@@ -54,7 +51,7 @@ var Application = new Lang.Class({
return false; return false;
return true; return true;
}, }
_getExtensionPrefsModule(extension) { _getExtensionPrefsModule(extension) {
let uuid = extension.metadata.uuid; let uuid = extension.metadata.uuid;
@@ -69,7 +66,7 @@ var Application = new Lang.Class({
this._extensionPrefsModules[uuid] = prefsModule; this._extensionPrefsModules[uuid] = prefsModule;
return prefsModule; return prefsModule;
}, }
_selectExtension(uuid) { _selectExtension(uuid) {
if (!this._extensionAvailable(uuid)) if (!this._extensionAvailable(uuid))
@@ -104,7 +101,7 @@ var Application = new Lang.Class({
dialog.set_default_size(600, 400); dialog.set_default_size(600, 400);
dialog.add(widget); dialog.add(widget);
dialog.show(); dialog.show();
}, }
_buildErrorUI(extension, exc) { _buildErrorUI(extension, exc) {
let box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL }); let box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
@@ -130,7 +127,7 @@ var Application = new Lang.Class({
box.show_all(); box.show_all();
return box; return box;
}, }
_buildUI(app) { _buildUI(app) {
this._window = new Gtk.ApplicationWindow({ application: app, this._window = new Gtk.ApplicationWindow({ application: app,
@@ -167,13 +164,13 @@ var Application = new Lang.Class({
}); });
this._window.show_all(); this._window.show_all();
}, }
_sortList(row1, row2) { _sortList(row1, row2) {
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name; let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name; let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
return name1.localeCompare(name2); return name1.localeCompare(name2);
}, }
_updateHeader(row, before) { _updateHeader(row, before) {
if (!before || row.get_header()) if (!before || row.get_header())
@@ -181,14 +178,14 @@ var Application = new Lang.Class({
let sep = new Gtk.Separator({ orientation: Gtk.Orientation.HORIZONTAL }); let sep = new Gtk.Separator({ orientation: Gtk.Orientation.HORIZONTAL });
row.set_header(sep); row.set_header(sep);
}, }
_scanExtensions() { _scanExtensions() {
let finder = new ExtensionUtils.ExtensionFinder(); let finder = new ExtensionUtils.ExtensionFinder();
finder.connect('extension-found', this._extensionFound.bind(this)); finder.connect('extension-found', this._extensionFound.bind(this));
finder.scanExtensions(); finder.scanExtensions();
this._extensionsLoaded(); this._extensionsLoaded();
}, }
_extensionFound(finder, extension) { _extensionFound(finder, extension) {
let row = new ExtensionRow(extension.uuid); let row = new ExtensionRow(extension.uuid);
@@ -200,7 +197,7 @@ var Application = new Lang.Class({
row.show_all(); row.show_all();
this._extensionSelector.add(row); this._extensionSelector.add(row);
}, }
_extensionsLoaded() { _extensionsLoaded() {
if (this._startupUuid && this._extensionAvailable(this._startupUuid)) if (this._startupUuid && this._extensionAvailable(this._startupUuid))
@@ -208,16 +205,16 @@ var Application = new Lang.Class({
this._startupUuid = null; this._startupUuid = null;
this._skipMainWindow = false; this._skipMainWindow = false;
this._loaded = true; this._loaded = true;
}, }
_onActivate() { _onActivate() {
this._window.present(); this._window.present();
}, }
_onStartup(app) { _onStartup(app) {
this._buildUI(app); this._buildUI(app);
this._scanExtensions(); this._scanExtensions();
}, }
_onCommandLine(app, commandLine) { _onCommandLine(app, commandLine) {
app.activate(); app.activate();
@@ -240,26 +237,22 @@ var Application = new Lang.Class({
} }
return 0; return 0;
} }
}); };
var DescriptionLabel = new Lang.Class({
Name: 'DescriptionLabel',
Extends: Gtk.Label,
var DescriptionLabel = GObject.registerClass(
class DescriptionLabel extends Gtk.Label {
vfunc_get_preferred_height_for_width(width) { vfunc_get_preferred_height_for_width(width) {
// Hack: Request the maximum height allowed by the line limit // Hack: Request the maximum height allowed by the line limit
if (this.lines > 0) if (this.lines > 0)
return this.parent(0); return super.vfunc_get_preferred_height_for_width(0);
return this.parent(width); return super.vfunc_get_preferred_height_for_width(width);
} }
}); });
var ExtensionRow = new Lang.Class({ var ExtensionRow = GObject.registerClass(
Name: 'ExtensionRow', class ExtensionRow extends Gtk.ListBoxRow {
Extends: Gtk.ListBoxRow,
_init(uuid) { _init(uuid) {
this.parent(); super._init();
this.uuid = uuid; this.uuid = uuid;
@@ -277,7 +270,7 @@ var ExtensionRow = new Lang.Class({
}); });
this._buildUI(); this._buildUI();
}, }
_buildUI() { _buildUI() {
let extension = ExtensionUtils.extensions[this.uuid]; let extension = ExtensionUtils.extensions[this.uuid];
@@ -324,7 +317,7 @@ var ExtensionRow = new Lang.Class({
}); });
this._switch.connect('state-set', () => true); this._switch.connect('state-set', () => true);
hbox.add(this._switch); hbox.add(this._switch);
}, }
_canEnable() { _canEnable() {
let extension = ExtensionUtils.extensions[this.uuid]; let extension = ExtensionUtils.extensions[this.uuid];
@@ -332,12 +325,12 @@ var ExtensionRow = new Lang.Class({
return !this._settings.get_boolean('disable-user-extensions') && return !this._settings.get_boolean('disable-user-extensions') &&
!(checkVersion && ExtensionUtils.isOutOfDate(extension)); !(checkVersion && ExtensionUtils.isOutOfDate(extension));
}, }
_isEnabled() { _isEnabled() {
let extensions = this._settings.get_strv('enabled-extensions'); let extensions = this._settings.get_strv('enabled-extensions');
return extensions.indexOf(this.uuid) != -1; return extensions.indexOf(this.uuid) != -1;
}, }
_enable() { _enable() {
let extensions = this._settings.get_strv('enabled-extensions'); let extensions = this._settings.get_strv('enabled-extensions');
@@ -346,7 +339,7 @@ var ExtensionRow = new Lang.Class({
extensions.push(this.uuid); extensions.push(this.uuid);
this._settings.set_strv('enabled-extensions', extensions); this._settings.set_strv('enabled-extensions', extensions);
}, }
_disable() { _disable() {
let extensions = this._settings.get_strv('enabled-extensions'); let extensions = this._settings.get_strv('enabled-extensions');

View File

@@ -2,7 +2,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
@@ -38,10 +37,8 @@ var BeginRequestType = {
DONT_PROVIDE_USERNAME: 1 DONT_PROVIDE_USERNAME: 1
}; };
var AuthPrompt = new Lang.Class({ var AuthPrompt = class {
Name: 'AuthPrompt', constructor(gdmClient, mode) {
_init(gdmClient, mode) {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this._gdmClient = gdmClient; this._gdmClient = gdmClient;
@@ -127,17 +124,16 @@ var AuthPrompt = new Lang.Class({
this._initButtons(); this._initButtons();
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); this._spinner = new Animation.Spinner(DEFAULT_BUTTON_WELL_ICON_SIZE);
this._spinner = new Animation.AnimatedIcon(spinnerIcon, DEFAULT_BUTTON_WELL_ICON_SIZE);
this._spinner.actor.opacity = 0; this._spinner.actor.opacity = 0;
this._spinner.actor.show(); this._spinner.actor.show();
this._defaultButtonWell.add_child(this._spinner.actor); this._defaultButtonWell.add_child(this._spinner.actor);
}, }
_onDestroy() { _onDestroy() {
this._userVerifier.destroy(); this._userVerifier.destroy();
this._userVerifier = null; this._userVerifier = null;
}, }
_initButtons() { _initButtons() {
this.cancelButton = new St.Button({ style_class: 'modal-dialog-button button', this.cancelButton = new St.Button({ style_class: 'modal-dialog-button button',
@@ -185,7 +181,7 @@ var AuthPrompt = new Lang.Class({
if (this.nextButton.reactive) if (this.nextButton.reactive)
this.emit('next'); this.emit('next');
}); });
}, }
_onAskQuestion(verifier, serviceName, question, passwordChar) { _onAskQuestion(verifier, serviceName, question, passwordChar) {
if (this._queryingService) if (this._queryingService)
@@ -211,12 +207,12 @@ var AuthPrompt = new Lang.Class({
this.updateSensitivity(true); this.updateSensitivity(true);
this.emit('prompted'); this.emit('prompted');
}, }
_onOVirtUserAuthenticated() { _onOVirtUserAuthenticated() {
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset(); this.reset();
}, }
_onSmartcardStatusChanged() { _onSmartcardStatusChanged() {
this.smartcardDetected = this._userVerifier.smartcardDetected; this.smartcardDetected = this._userVerifier.smartcardDetected;
@@ -235,12 +231,12 @@ var AuthPrompt = new Lang.Class({
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset(); this.reset();
}, }
_onShowMessage(userVerifier, message, type) { _onShowMessage(userVerifier, message, type) {
this.setMessage(message, type); this.setMessage(message, type);
this.emit('prompted'); this.emit('prompted');
}, }
_onVerificationFailed(userVerifier, canRetry) { _onVerificationFailed(userVerifier, canRetry) {
this._queryingService = null; this._queryingService = null;
@@ -249,22 +245,22 @@ var AuthPrompt = new Lang.Class({
this.updateSensitivity(canRetry); this.updateSensitivity(canRetry);
this.setActorInDefaultButtonWell(null); this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
}, }
_onVerificationComplete() { _onVerificationComplete() {
this.setActorInDefaultButtonWell(null); this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED; this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
this.cancelButton.reactive = false; this.cancelButton.reactive = false;
}, }
_onReset() { _onReset() {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.reset(); this.reset();
}, }
addActorToDefaultButtonWell(actor) { addActorToDefaultButtonWell(actor) {
this._defaultButtonWell.add_child(actor); this._defaultButtonWell.add_child(actor);
}, }
setActorInDefaultButtonWell(actor, animate) { setActorInDefaultButtonWell(actor, animate) {
if (!this._defaultButtonWellActor && if (!this._defaultButtonWellActor &&
@@ -328,25 +324,25 @@ var AuthPrompt = new Lang.Class({
} }
this._defaultButtonWellActor = actor; this._defaultButtonWellActor = actor;
}, }
startSpinning() { startSpinning() {
this.setActorInDefaultButtonWell(this._spinner.actor, true); this.setActorInDefaultButtonWell(this._spinner.actor, true);
}, }
stopSpinning() { stopSpinning() {
this.setActorInDefaultButtonWell(null, false); this.setActorInDefaultButtonWell(null, false);
}, }
clear() { clear() {
this._entry.text = ''; this._entry.text = '';
this.stopSpinning(); this.stopSpinning();
}, }
setPasswordChar(passwordChar) { setPasswordChar(passwordChar) {
this._entry.clutter_text.set_password_char(passwordChar); this._entry.clutter_text.set_password_char(passwordChar);
this._entry.menu.isPassword = passwordChar != ''; this._entry.menu.isPassword = passwordChar != '';
}, }
setQuestion(question) { setQuestion(question) {
this._label.set_text(question); this._label.set_text(question);
@@ -355,7 +351,7 @@ var AuthPrompt = new Lang.Class({
this._entry.show(); this._entry.show();
this._entry.grab_key_focus(); this._entry.grab_key_focus();
}, }
getAnswer() { getAnswer() {
let text; let text;
@@ -368,7 +364,7 @@ var AuthPrompt = new Lang.Class({
} }
return text; return text;
}, }
_fadeOutMessage() { _fadeOutMessage() {
if (this._message.opacity == 0) if (this._message.opacity == 0)
@@ -379,7 +375,7 @@ var AuthPrompt = new Lang.Class({
time: MESSAGE_FADE_OUT_ANIMATION_TIME, time: MESSAGE_FADE_OUT_ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
}, }
setMessage(message, type) { setMessage(message, type) {
if (type == GdmUtil.MessageType.ERROR) if (type == GdmUtil.MessageType.ERROR)
@@ -399,18 +395,18 @@ var AuthPrompt = new Lang.Class({
} else { } else {
this._message.opacity = 0; this._message.opacity = 0;
} }
}, }
_updateNextButtonSensitivity(sensitive) { _updateNextButtonSensitivity(sensitive) {
this.nextButton.reactive = sensitive; this.nextButton.reactive = sensitive;
this.nextButton.can_focus = sensitive; this.nextButton.can_focus = sensitive;
}, }
updateSensitivity(sensitive) { updateSensitivity(sensitive) {
this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING)); this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING));
this._entry.reactive = sensitive; this._entry.reactive = sensitive;
this._entry.clutter_text.editable = sensitive; this._entry.clutter_text.editable = sensitive;
}, }
hide() { hide() {
this.setActorInDefaultButtonWell(null, true); this.setActorInDefaultButtonWell(null, true);
@@ -421,7 +417,7 @@ var AuthPrompt = new Lang.Class({
this.updateSensitivity(true); this.updateSensitivity(true);
this._entry.set_text(''); this._entry.set_text('');
}, }
setUser(user) { setUser(user) {
let oldChild = this._userWell.get_child(); let oldChild = this._userWell.get_child();
@@ -432,7 +428,7 @@ var AuthPrompt = new Lang.Class({
let userWidget = new UserWidget.UserWidget(user); let userWidget = new UserWidget.UserWidget(user);
this._userWell.set_child(userWidget.actor); this._userWell.set_child(userWidget.actor);
} }
}, }
reset() { reset() {
let oldStatus = this.verificationStatus; let oldStatus = this.verificationStatus;
@@ -470,7 +466,7 @@ var AuthPrompt = new Lang.Class({
} }
this.emit('reset', beginRequestType); this.emit('reset', beginRequestType);
}, }
addCharacter(unichar) { addCharacter(unichar) {
if (!this._entry.visible) if (!this._entry.visible)
@@ -478,7 +474,7 @@ var AuthPrompt = new Lang.Class({
this._entry.grab_key_focus(); this._entry.grab_key_focus();
this._entry.clutter_text.insert_unichar(unichar); this._entry.clutter_text.insert_unichar(unichar);
}, }
begin(params) { begin(params) {
params = Params.parse(params, { userName: null, params = Params.parse(params, { userName: null,
@@ -492,7 +488,7 @@ var AuthPrompt = new Lang.Class({
this._userVerifier.begin(params.userName, hold); this._userVerifier.begin(params.userName, hold);
this.verificationStatus = AuthPromptStatus.VERIFYING; this.verificationStatus = AuthPromptStatus.VERIFYING;
}, }
finish(onComplete) { finish(onComplete) {
if (!this._userVerifier.hasPendingMessages) { if (!this._userVerifier.hasPendingMessages) {
@@ -506,7 +502,7 @@ var AuthPrompt = new Lang.Class({
this._userVerifier.clear(); this._userVerifier.clear();
onComplete(); onComplete();
}); });
}, }
cancel() { cancel() {
if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) { if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
@@ -515,5 +511,5 @@ var AuthPrompt = new Lang.Class({
this.reset(); this.reset();
this.emit('cancelled'); this.emit('cancelled');
} }
}); };
Signals.addSignalMethods(AuthPrompt.prototype); Signals.addSignalMethods(AuthPrompt.prototype);

View File

@@ -44,45 +44,39 @@
* replaced by something else. * replaced by something else.
*/ */
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
var Task = new Lang.Class({ var Task = class {
Name: 'Task', constructor(scope, handler) {
_init(scope, handler) {
if (scope) if (scope)
this.scope = scope; this.scope = scope;
else else
this.scope = this; this.scope = this;
this.handler = handler; this.handler = handler;
}, }
run() { run() {
if (this.handler) if (this.handler)
return this.handler.call(this.scope); return this.handler.call(this.scope);
return null; return null;
}, }
}); };
Signals.addSignalMethods(Task.prototype); Signals.addSignalMethods(Task.prototype);
var Hold = new Lang.Class({ var Hold = class extends Task {
Name: 'Hold', constructor() {
Extends: Task, super(null, () => this);
_init() {
this.parent(this, () => this);
this._acquisitions = 1; this._acquisitions = 1;
}, }
acquire() { acquire() {
if (this._acquisitions <= 0) if (this._acquisitions <= 0)
throw new Error("Cannot acquire hold after it's been released"); throw new Error("Cannot acquire hold after it's been released");
this._acquisitions++; this._acquisitions++;
}, }
acquireUntilAfter(hold) { acquireUntilAfter(hold) {
if (!hold.isAcquired()) if (!hold.isAcquired())
@@ -93,27 +87,24 @@ var Hold = new Lang.Class({
hold.disconnect(signalId); hold.disconnect(signalId);
this.release(); this.release();
}); });
}, }
release() { release() {
this._acquisitions--; this._acquisitions--;
if (this._acquisitions == 0) if (this._acquisitions == 0)
this.emit('release'); this.emit('release');
}, }
isAcquired() { isAcquired() {
return this._acquisitions > 0; return this._acquisitions > 0;
} }
}); };
Signals.addSignalMethods(Hold.prototype); Signals.addSignalMethods(Hold.prototype);
var Batch = new Lang.Class({ var Batch = class extends Task {
Name: 'Batch', constructor(scope, tasks) {
Extends: Task, super();
_init(scope, tasks) {
this.parent();
this.tasks = []; this.tasks = [];
@@ -130,11 +121,11 @@ var Batch = new Lang.Class({
this.tasks.push(task); this.tasks.push(task);
} }
}, }
process() { process() {
throw new Error('Not implemented'); throw new Error('Not implemented');
}, }
runTask() { runTask() {
if (!(this._currentTaskIndex in this.tasks)) { if (!(this._currentTaskIndex in this.tasks)) {
@@ -142,11 +133,11 @@ var Batch = new Lang.Class({
} }
return this.tasks[this._currentTaskIndex].run(); return this.tasks[this._currentTaskIndex].run();
}, }
_finish() { _finish() {
this.hold.release(); this.hold.release();
}, }
nextTask() { nextTask() {
this._currentTaskIndex++; this._currentTaskIndex++;
@@ -159,7 +150,7 @@ var Batch = new Lang.Class({
} }
this.process(); this.process();
}, }
_start() { _start() {
// acquire a hold to get released when the entire // acquire a hold to get released when the entire
@@ -167,7 +158,7 @@ var Batch = new Lang.Class({
this.hold = new Hold(); this.hold = new Hold();
this._currentTaskIndex = 0; this._currentTaskIndex = 0;
this.process(); this.process();
}, }
run() { run() {
this._start(); this._start();
@@ -175,18 +166,15 @@ var Batch = new Lang.Class({
// hold may be destroyed at this point // hold may be destroyed at this point
// if we're already done running // if we're already done running
return this.hold; return this.hold;
}, }
cancel() { cancel() {
this.tasks = this.tasks.splice(0, this._currentTaskIndex + 1); this.tasks = this.tasks.splice(0, this._currentTaskIndex + 1);
} }
}); };
Signals.addSignalMethods(Batch.prototype); Signals.addSignalMethods(Batch.prototype);
var ConcurrentBatch = new Lang.Class({ var ConcurrentBatch = class extends Batch {
Name: 'ConcurrentBatch',
Extends: Batch,
process() { process() {
let hold = this.runTask(); let hold = this.runTask();
@@ -199,13 +187,10 @@ var ConcurrentBatch = new Lang.Class({
// concurrently. // concurrently.
this.nextTask(); this.nextTask();
} }
}); };
Signals.addSignalMethods(ConcurrentBatch.prototype); Signals.addSignalMethods(ConcurrentBatch.prototype);
var ConsecutiveBatch = new Lang.Class({ var ConsecutiveBatch = class extends Batch {
Name: 'ConsecutiveBatch',
Extends: Batch,
process() { process() {
let hold = this.runTask(); let hold = this.runTask();
@@ -222,5 +207,5 @@ var ConsecutiveBatch = new Lang.Class({
this.nextTask(); this.nextTask();
} }
} }
}); };
Signals.addSignalMethods(ConsecutiveBatch.prototype); Signals.addSignalMethods(ConsecutiveBatch.prototype);

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;

View File

@@ -24,7 +24,6 @@ const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -50,10 +49,8 @@ const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_HEIGHT = 48; const _LOGO_ICON_HEIGHT = 48;
const _MAX_BOTTOM_MENU_ITEMS = 5; const _MAX_BOTTOM_MENU_ITEMS = 5;
var UserListItem = new Lang.Class({ var UserListItem = class {
Name: 'UserListItem', constructor(user) {
_init(user) {
this.user = user; this.user = user;
this._userChangedId = this.user.connect('changed', this._userChangedId = this.user.connect('changed',
this._onUserChanged.bind(this)); this._onUserChanged.bind(this));
@@ -91,26 +88,26 @@ var UserListItem = new Lang.Class({
this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('clicked', this._onClicked.bind(this));
this._onUserChanged(); this._onUserChanged();
}, }
_onUserChanged() { _onUserChanged() {
this._updateLoggedIn(); this._updateLoggedIn();
}, }
_updateLoggedIn() { _updateLoggedIn() {
if (this.user.is_logged_in()) if (this.user.is_logged_in())
this.actor.add_style_pseudo_class('logged-in'); this.actor.add_style_pseudo_class('logged-in');
else else
this.actor.remove_style_pseudo_class('logged-in'); this.actor.remove_style_pseudo_class('logged-in');
}, }
_onDestroy() { _onDestroy() {
this.user.disconnect(this._userChangedId); this.user.disconnect(this._userChangedId);
}, }
_onClicked() { _onClicked() {
this.emit('activate'); this.emit('activate');
}, }
_setSelected(selected) { _setSelected(selected) {
if (selected) { if (selected) {
@@ -119,7 +116,7 @@ var UserListItem = new Lang.Class({
} else { } else {
this.actor.remove_style_pseudo_class('selected'); this.actor.remove_style_pseudo_class('selected');
} }
}, }
showTimedLoginIndicator(time) { showTimedLoginIndicator(time) {
let hold = new Batch.Hold(); let hold = new Batch.Hold();
@@ -147,7 +144,7 @@ var UserListItem = new Lang.Class({
GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId'); GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId');
return hold; return hold;
}, }
hideTimedLoginIndicator() { hideTimedLoginIndicator() {
if (this._timedLoginTimeoutId) { if (this._timedLoginTimeoutId) {
@@ -158,13 +155,11 @@ var UserListItem = new Lang.Class({
this._timedLoginIndicator.visible = false; this._timedLoginIndicator.visible = false;
this._timedLoginIndicator.scale_x = 0.; this._timedLoginIndicator.scale_x = 0.;
} }
}); };
Signals.addSignalMethods(UserListItem.prototype); Signals.addSignalMethods(UserListItem.prototype);
var UserList = new Lang.Class({ var UserList = class {
Name: 'UserList', constructor() {
_init() {
this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'}); this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'});
this.actor.set_policy(Gtk.PolicyType.NEVER, this.actor.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.AUTOMATIC); Gtk.PolicyType.AUTOMATIC);
@@ -177,7 +172,7 @@ var UserList = new Lang.Class({
this._items = {}; this._items = {};
this.actor.connect('key-focus-in', this._moveFocusToItems.bind(this)); this.actor.connect('key-focus-in', this._moveFocusToItems.bind(this));
}, }
_moveFocusToItems() { _moveFocusToItems() {
let hasItems = Object.keys(this._items).length > 0; let hasItems = Object.keys(this._items).length > 0;
@@ -195,11 +190,11 @@ var UserList = new Lang.Class({
return false; return false;
}); });
} }
}, }
_onItemActivated(activatedItem) { _onItemActivated(activatedItem) {
this.emit('activate', activatedItem); this.emit('activate', activatedItem);
}, }
updateStyle(isExpanded) { updateStyle(isExpanded) {
let tasks = []; let tasks = [];
@@ -213,7 +208,7 @@ var UserList = new Lang.Class({
let item = this._items[userName]; let item = this._items[userName];
item.actor.sync_hover(); item.actor.sync_hover();
} }
}, }
scrollToItem(item) { scrollToItem(item) {
let box = item.actor.get_allocation_box(); let box = item.actor.get_allocation_box();
@@ -226,7 +221,7 @@ var UserList = new Lang.Class({
{ value: value, { value: value,
time: _SCROLL_ANIMATION_TIME, time: _SCROLL_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, }
jumpToItem(item) { jumpToItem(item) {
let box = item.actor.get_allocation_box(); let box = item.actor.get_allocation_box();
@@ -236,7 +231,7 @@ var UserList = new Lang.Class({
let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0); let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
adjustment.set_value(value); adjustment.set_value(value);
}, }
getItemFromUserName(userName) { getItemFromUserName(userName) {
let item = this._items[userName]; let item = this._items[userName];
@@ -245,11 +240,11 @@ var UserList = new Lang.Class({
return null; return null;
return item; return item;
}, }
containsUser(user) { containsUser(user) {
return this._items[user.get_user_name()] != null; return this._items[user.get_user_name()] != null;
}, }
addUser(user) { addUser(user) {
if (!user.is_loaded) if (!user.is_loaded)
@@ -281,7 +276,7 @@ var UserList = new Lang.Class({
this._moveFocusToItems(); this._moveFocusToItems();
this.emit('item-added', item); this.emit('item-added', item);
}, }
removeUser(user) { removeUser(user) {
if (!user.is_loaded) if (!user.is_loaded)
@@ -299,18 +294,16 @@ var UserList = new Lang.Class({
item.actor.destroy(); item.actor.destroy();
delete this._items[userName]; delete this._items[userName];
}, }
numItems() { numItems() {
return Object.keys(this._items).length; return Object.keys(this._items).length;
} }
}); };
Signals.addSignalMethods(UserList.prototype); Signals.addSignalMethods(UserList.prototype);
var SessionMenuButton = new Lang.Class({ var SessionMenuButton = class {
Name: 'SessionMenuButton', constructor() {
_init() {
let gearIcon = new St.Icon({ icon_name: 'emblem-system-symbolic' }); let gearIcon = new St.Icon({ icon_name: 'emblem-system-symbolic' });
this._button = new St.Button({ style_class: 'login-dialog-session-list-button', this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
reactive: true, reactive: true,
@@ -350,13 +343,13 @@ var SessionMenuButton = new Lang.Class({
this._items = {}; this._items = {};
this._activeSessionId = null; this._activeSessionId = null;
this._populate(); this._populate();
}, }
updateSensitivity(sensitive) { updateSensitivity(sensitive) {
this._button.reactive = sensitive; this._button.reactive = sensitive;
this._button.can_focus = sensitive; this._button.can_focus = sensitive;
this._menu.close(BoxPointer.PopupAnimation.NONE); this._menu.close(BoxPointer.PopupAnimation.NONE);
}, }
_updateOrnament() { _updateOrnament() {
let itemIds = Object.keys(this._items); let itemIds = Object.keys(this._items);
@@ -366,7 +359,7 @@ var SessionMenuButton = new Lang.Class({
else else
this._items[itemIds[i]].setOrnament(PopupMenu.Ornament.NONE); this._items[itemIds[i]].setOrnament(PopupMenu.Ornament.NONE);
} }
}, }
setActiveSession(sessionId) { setActiveSession(sessionId) {
if (sessionId == this._activeSessionId) if (sessionId == this._activeSessionId)
@@ -374,11 +367,11 @@ var SessionMenuButton = new Lang.Class({
this._activeSessionId = sessionId; this._activeSessionId = sessionId;
this._updateOrnament(); this._updateOrnament();
}, }
close() { close() {
this._menu.close(); this._menu.close();
}, }
_populate() { _populate() {
let ids = Gdm.get_session_ids(); let ids = Gdm.get_session_ids();
@@ -403,16 +396,14 @@ var SessionMenuButton = new Lang.Class({
}); });
} }
} }
}); };
Signals.addSignalMethods(SessionMenuButton.prototype); Signals.addSignalMethods(SessionMenuButton.prototype);
var LoginDialog = new Lang.Class({ var LoginDialog = GObject.registerClass({
Name: 'LoginDialog',
Extends: St.Widget,
Signals: { 'failed': {} }, Signals: { 'failed': {} },
}, class LoginDialog extends St.Widget {
_init(parentActor) { _init(parentActor) {
this.parent({ style_class: 'login-dialog', super._init({ style_class: 'login-dialog',
visible: false }); visible: false });
this.get_accessible().set_role(Atk.Role.WINDOW); this.get_accessible().set_role(Atk.Role.WINDOW);
@@ -530,7 +521,7 @@ var LoginDialog = new Lang.Class({
// focus later // focus later
this._startupCompleteId = Main.layoutManager.connect('startup-complete', this._startupCompleteId = Main.layoutManager.connect('startup-complete',
this._updateDisableUserList.bind(this)); this._updateDisableUserList.bind(this));
}, }
_getBannerAllocation(dialogBox) { _getBannerAllocation(dialogBox) {
let actorBox = new Clutter.ActorBox(); let actorBox = new Clutter.ActorBox();
@@ -544,7 +535,7 @@ var LoginDialog = new Lang.Class({
actorBox.y2 = actorBox.y1 + natHeight; actorBox.y2 = actorBox.y1 + natHeight;
return actorBox; return actorBox;
}, }
_getLogoBinAllocation(dialogBox) { _getLogoBinAllocation(dialogBox) {
let actorBox = new Clutter.ActorBox(); let actorBox = new Clutter.ActorBox();
@@ -558,7 +549,7 @@ var LoginDialog = new Lang.Class({
actorBox.y2 = actorBox.y1 + natHeight; actorBox.y2 = actorBox.y1 + natHeight;
return actorBox; return actorBox;
}, }
_getCenterActorAllocation(dialogBox, actor) { _getCenterActorAllocation(dialogBox, actor) {
let actorBox = new Clutter.ActorBox(); let actorBox = new Clutter.ActorBox();
@@ -576,7 +567,7 @@ var LoginDialog = new Lang.Class({
actorBox.y2 = actorBox.y1 + natHeight; actorBox.y2 = actorBox.y1 + natHeight;
return actorBox; return actorBox;
}, }
vfunc_allocate(dialogBox, flags) { vfunc_allocate(dialogBox, flags) {
this.set_allocation(dialogBox, flags); this.set_allocation(dialogBox, flags);
@@ -719,7 +710,7 @@ var LoginDialog = new Lang.Class({
if (logoAllocation) if (logoAllocation)
this._logoBin.allocate(logoAllocation, flags); this._logoBin.allocate(logoAllocation, flags);
}, }
_ensureUserListLoaded() { _ensureUserListLoaded() {
if (!this._userManager.is_loaded) { if (!this._userManager.is_loaded) {
@@ -735,7 +726,7 @@ var LoginDialog = new Lang.Class({
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, this._loadUserList.bind(this)); let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, this._loadUserList.bind(this));
GLib.Source.set_name_by_id(id, '[gnome-shell] _loadUserList'); GLib.Source.set_name_by_id(id, '[gnome-shell] _loadUserList');
} }
}, }
_updateDisableUserList() { _updateDisableUserList() {
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
@@ -750,7 +741,7 @@ var LoginDialog = new Lang.Class({
if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
this._authPrompt.reset(); this._authPrompt.reset();
} }
}, }
_updateCancelButton() { _updateCancelButton() {
let cancelVisible; let cancelVisible;
@@ -763,7 +754,7 @@ var LoginDialog = new Lang.Class({
cancelVisible = true; cancelVisible = true;
this._authPrompt.cancelButton.visible = cancelVisible; this._authPrompt.cancelButton.visible = cancelVisible;
}, }
_updateBanner() { _updateBanner() {
let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY); let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY);
@@ -775,7 +766,7 @@ var LoginDialog = new Lang.Class({
} else { } else {
this._bannerLabel.hide(); this._bannerLabel.hide();
} }
}, }
_fadeInBannerView() { _fadeInBannerView() {
this._bannerView.show(); this._bannerView.show();
@@ -783,13 +774,13 @@ var LoginDialog = new Lang.Class({
{ opacity: 255, { opacity: 255,
time: _FADE_ANIMATION_TIME, time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, }
_hideBannerView() { _hideBannerView() {
Tweener.removeTweens(this._bannerView); Tweener.removeTweens(this._bannerView);
this._bannerView.opacity = 0; this._bannerView.opacity = 0;
this._bannerView.hide(); this._bannerView.hide();
}, }
_updateLogoTexture(cache, file) { _updateLogoTexture(cache, file) {
if (this._logoFile && !this._logoFile.equal(file)) if (this._logoFile && !this._logoFile.equal(file))
@@ -802,14 +793,14 @@ var LoginDialog = new Lang.Class({
-1, _LOGO_ICON_HEIGHT, -1, _LOGO_ICON_HEIGHT,
scaleFactor)); scaleFactor));
} }
}, }
_updateLogo() { _updateLogo() {
let path = this._settings.get_string(GdmUtil.LOGO_KEY); let path = this._settings.get_string(GdmUtil.LOGO_KEY);
this._logoFile = path ? Gio.file_new_for_path(path) : null; this._logoFile = path ? Gio.file_new_for_path(path) : null;
this._updateLogoTexture(this._textureCache, this._logoFile); this._updateLogoTexture(this._textureCache, this._logoFile);
}, }
_onPrompted() { _onPrompted() {
if (this._shouldShowSessionMenuButton()) { if (this._shouldShowSessionMenuButton()) {
@@ -819,7 +810,7 @@ var LoginDialog = new Lang.Class({
this._sessionMenuButton.updateSensitivity(false); this._sessionMenuButton.updateSensitivity(false);
} }
this._showPrompt(); this._showPrompt();
}, }
_resetGreeterProxy() { _resetGreeterProxy() {
if (GLib.getenv('GDM_GREETER_TEST') != '1') { if (GLib.getenv('GDM_GREETER_TEST') != '1') {
@@ -835,7 +826,7 @@ var LoginDialog = new Lang.Class({
this._timedLoginRequestedId = this._greeter.connect('timed-login-requested', this._timedLoginRequestedId = this._greeter.connect('timed-login-requested',
this._onTimedLoginRequested.bind(this)); this._onTimedLoginRequested.bind(this));
} }
}, }
_onReset(authPrompt, beginRequest) { _onReset(authPrompt, beginRequest) {
this._resetGreeterProxy(); this._resetGreeterProxy();
@@ -856,11 +847,11 @@ var LoginDialog = new Lang.Class({
} else { } else {
this._hideUserListAndBeginVerification(); this._hideUserListAndBeginVerification();
} }
}, }
_onDefaultSessionChanged(client, sessionId) { _onDefaultSessionChanged(client, sessionId) {
this._sessionMenuButton.setActiveSession(sessionId); this._sessionMenuButton.setActiveSession(sessionId);
}, }
_shouldShowSessionMenuButton() { _shouldShowSessionMenuButton() {
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING && if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING &&
@@ -871,7 +862,7 @@ var LoginDialog = new Lang.Class({
return false; return false;
return true; return true;
}, }
_showPrompt() { _showPrompt() {
if (this._authPrompt.actor.visible) if (this._authPrompt.actor.visible)
@@ -883,7 +874,7 @@ var LoginDialog = new Lang.Class({
time: _FADE_ANIMATION_TIME, time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
this._fadeInBannerView(); this._fadeInBannerView();
}, }
_showRealmLoginHint(realmManager, hint) { _showRealmLoginHint(realmManager, hint) {
if (!hint) if (!hint)
@@ -896,7 +887,7 @@ var LoginDialog = new Lang.Class({
// Translators: this message is shown below the username entry field // Translators: this message is shown below the username entry field
// to clue the user in on how to login to the local network realm // to clue the user in on how to login to the local network realm
this._authPrompt.setMessage(_("(e.g., user or %s)").format(hint), GdmUtil.MessageType.HINT); this._authPrompt.setMessage(_("(e.g., user or %s)").format(hint), GdmUtil.MessageType.HINT);
}, }
_askForUsernameAndBeginVerification() { _askForUsernameAndBeginVerification() {
this._authPrompt.setPasswordChar(''); this._authPrompt.setPasswordChar('');
@@ -923,7 +914,7 @@ var LoginDialog = new Lang.Class({
this._sessionMenuButton.updateSensitivity(false); this._sessionMenuButton.updateSensitivity(false);
this._authPrompt.updateSensitivity(true); this._authPrompt.updateSensitivity(true);
this._showPrompt(); this._showPrompt();
}, }
_loginScreenSessionActivated() { _loginScreenSessionActivated() {
if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
@@ -947,7 +938,7 @@ var LoginDialog = new Lang.Class({
this._authPrompt.reset(); this._authPrompt.reset();
}, },
onCompleteScope: this }); onCompleteScope: this });
}, }
_gotGreeterSessionProxy(proxy) { _gotGreeterSessionProxy(proxy) {
this._greeterSessionProxy = proxy; this._greeterSessionProxy = proxy;
@@ -956,7 +947,7 @@ var LoginDialog = new Lang.Class({
if (proxy.Active) if (proxy.Active)
this._loginScreenSessionActivated(); this._loginScreenSessionActivated();
}); });
}, }
_startSession(serviceName) { _startSession(serviceName) {
Tweener.addTween(this, Tweener.addTween(this,
@@ -976,11 +967,11 @@ var LoginDialog = new Lang.Class({
this._greeter.call_start_session_when_ready_sync(serviceName, true, null); this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
}, },
onCompleteScope: this }); onCompleteScope: this });
}, }
_onSessionOpened(client, serviceName) { _onSessionOpened(client, serviceName) {
this._authPrompt.finish(() => { this._startSession(serviceName); }); this._authPrompt.finish(() => { this._startSession(serviceName); });
}, }
_waitForItemForUser(userName) { _waitForItemForUser(userName) {
let item = this._userList.getItemFromUserName(userName); let item = this._userList.getItemFromUserName(userName);
@@ -1000,7 +991,7 @@ var LoginDialog = new Lang.Class({
hold.connect('release', () => { this._userList.disconnect(signalId); }); hold.connect('release', () => { this._userList.disconnect(signalId); });
return hold; return hold;
}, }
_blockTimedLoginUntilIdle() { _blockTimedLoginUntilIdle() {
let hold = new Batch.Hold(); let hold = new Batch.Hold();
@@ -1013,7 +1004,7 @@ var LoginDialog = new Lang.Class({
}); });
GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId'); GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId');
return hold; return hold;
}, }
_startTimedLogin(userName, delay) { _startTimedLogin(userName, delay) {
let firstRun = true; let firstRun = true;
@@ -1086,7 +1077,7 @@ var LoginDialog = new Lang.Class({
this._timedLoginBatch = new Batch.ConsecutiveBatch(this, tasks); this._timedLoginBatch = new Batch.ConsecutiveBatch(this, tasks);
return this._timedLoginBatch.run(); return this._timedLoginBatch.run();
}, }
_onTimedLoginRequested(client, userName, seconds) { _onTimedLoginRequested(client, userName, seconds) {
if (this._timedLoginBatch) if (this._timedLoginBatch)
@@ -1103,28 +1094,28 @@ var LoginDialog = new Lang.Class({
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });
}, }
_setUserListExpanded(expanded) { _setUserListExpanded(expanded) {
this._userList.updateStyle(expanded); this._userList.updateStyle(expanded);
this._userSelectionBox.visible = expanded; this._userSelectionBox.visible = expanded;
}, }
_hideUserList() { _hideUserList() {
this._setUserListExpanded(false); this._setUserListExpanded(false);
if (this._userSelectionBox.visible) if (this._userSelectionBox.visible)
GdmUtil.cloneAndFadeOutActor(this._userSelectionBox); GdmUtil.cloneAndFadeOutActor(this._userSelectionBox);
}, }
_hideUserListAskForUsernameAndBeginVerification() { _hideUserListAskForUsernameAndBeginVerification() {
this._hideUserList(); this._hideUserList();
this._askForUsernameAndBeginVerification(); this._askForUsernameAndBeginVerification();
}, }
_hideUserListAndBeginVerification() { _hideUserListAndBeginVerification() {
this._hideUserList(); this._hideUserList();
this._authPrompt.begin(); this._authPrompt.begin();
}, }
_showUserList() { _showUserList() {
this._ensureUserListLoaded(); this._ensureUserListLoaded();
@@ -1134,7 +1125,7 @@ var LoginDialog = new Lang.Class({
this._setUserListExpanded(true); this._setUserListExpanded(true);
this._notListedButton.show(); this._notListedButton.show();
this._userList.actor.grab_key_focus(); this._userList.actor.grab_key_focus();
}, }
_beginVerificationForItem(item) { _beginVerificationForItem(item) {
this._authPrompt.setUser(item.user); this._authPrompt.setUser(item.user);
@@ -1145,7 +1136,7 @@ var LoginDialog = new Lang.Class({
this._authPrompt.begin({ userName: userName, this._authPrompt.begin({ userName: userName,
hold: hold }); hold: hold });
return hold; return hold;
}, }
_onUserListActivated(activatedItem) { _onUserListActivated(activatedItem) {
this._user = activatedItem.user; this._user = activatedItem.user;
@@ -1155,7 +1146,7 @@ var LoginDialog = new Lang.Class({
let batch = new Batch.ConcurrentBatch(this, [GdmUtil.cloneAndFadeOutActor(this._userSelectionBox), let batch = new Batch.ConcurrentBatch(this, [GdmUtil.cloneAndFadeOutActor(this._userSelectionBox),
this._beginVerificationForItem(activatedItem)]); this._beginVerificationForItem(activatedItem)]);
batch.run(); batch.run();
}, }
_onDestroy() { _onDestroy() {
if (this._userManagerLoadedId) { if (this._userManagerLoadedId) {
@@ -1196,7 +1187,7 @@ var LoginDialog = new Lang.Class({
this._realmManager.release(); this._realmManager.release();
this._realmManager = null; this._realmManager = null;
} }
}, }
_loadUserList() { _loadUserList() {
if (this._userListLoaded) if (this._userListLoaded)
@@ -1234,7 +1225,7 @@ var LoginDialog = new Lang.Class({
}); });
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
open() { open() {
Main.ctrlAltTabManager.addGroup(this, Main.ctrlAltTabManager.addGroup(this,
@@ -1253,22 +1244,22 @@ var LoginDialog = new Lang.Class({
transition: 'easeInQuad' }); transition: 'easeInQuad' });
return true; return true;
}, }
close() { close() {
Main.popModal(this); Main.popModal(this);
Main.ctrlAltTabManager.removeGroup(this); Main.ctrlAltTabManager.removeGroup(this);
}, }
cancel() { cancel() {
this._authPrompt.cancel(); this._authPrompt.cancel();
}, }
addCharacter(unichar) { addCharacter(unichar) {
// Don't allow type ahead at the login screen // Don't allow type ahead at the login screen
}, }
finish(onComplete) { finish(onComplete) {
this._authPrompt.finish(onComplete); this._authPrompt.finish(onComplete);
}, }
}); });

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const OVirtCredentialsIface = ` const OVirtCredentialsIface = `
@@ -28,33 +27,32 @@ function OVirtCredentials() {
return self; return self;
} }
var OVirtCredentialsManager = new Lang.Class({ var OVirtCredentialsManager = class {
Name: 'OVirtCredentialsManager', constructor() {
_init() {
this._token = null; this._token = null;
this._credentials = new OVirtCredentials(); this._credentials = new OVirtCredentials();
this._credentials.connectSignal('UserAuthenticated', this._credentials.connectSignal('UserAuthenticated',
this._onUserAuthenticated.bind(this)); this._onUserAuthenticated.bind(this));
}, }
_onUserAuthenticated(proxy, sender, [token]) { _onUserAuthenticated(proxy, sender, [token]) {
this._token = token; this._token = token;
this.emit('user-authenticated', token); this.emit('user-authenticated', token);
}, }
hasToken() { hasToken() {
return this._token != null; return this._token != null;
}, }
getToken() { getToken() {
return this._token; return this._token;
}, }
resetToken() { resetToken() {
this._token = null; this._token = null;
} }
}); };
Signals.addSignalMethods(OVirtCredentialsManager.prototype); Signals.addSignalMethods(OVirtCredentialsManager.prototype);
function getOVirtCredentialsManager() { function getOVirtCredentialsManager() {

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -16,10 +15,8 @@ const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface);
const RealmIface = loadInterfaceXML("org.freedesktop.realmd.Realm"); const RealmIface = loadInterfaceXML("org.freedesktop.realmd.Realm");
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface); const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
var Manager = new Lang.Class({ var Manager = class {
Name: 'Manager', constructor(parentActor) {
_init(parentActor) {
this._aggregateProvider = Provider(Gio.DBus.system, this._aggregateProvider = Provider(Gio.DBus.system,
'org.freedesktop.realmd', 'org.freedesktop.realmd',
'/org/freedesktop/realmd', '/org/freedesktop/realmd',
@@ -31,7 +28,7 @@ var Manager = new Lang.Class({
if ('Realms' in properties.deep_unpack()) if ('Realms' in properties.deep_unpack())
this._reloadRealms(); this._reloadRealms();
}); });
}, }
_reloadRealms() { _reloadRealms() {
let realmPaths = this._aggregateProvider.Realms; let realmPaths = this._aggregateProvider.Realms;
@@ -45,7 +42,7 @@ var Manager = new Lang.Class({
realmPaths[i], realmPaths[i],
this._onRealmLoaded.bind(this)); this._onRealmLoaded.bind(this));
} }
}, }
_reloadRealm(realm) { _reloadRealm(realm) {
if (!realm.Configured) { if (!realm.Configured) {
@@ -58,7 +55,7 @@ var Manager = new Lang.Class({
this._realms[realm.get_object_path()] = realm; this._realms[realm.get_object_path()] = realm;
this._updateLoginFormat(); this._updateLoginFormat();
}, }
_onRealmLoaded(realm, error) { _onRealmLoaded(realm, error) {
if (error) if (error)
@@ -70,7 +67,7 @@ var Manager = new Lang.Class({
if ('Configured' in properties.deep_unpack()) if ('Configured' in properties.deep_unpack())
this._reloadRealm(realm); this._reloadRealm(realm);
}); });
}, }
_updateLoginFormat() { _updateLoginFormat() {
let newLoginFormat; let newLoginFormat;
@@ -87,7 +84,7 @@ var Manager = new Lang.Class({
this._loginFormat = newLoginFormat; this._loginFormat = newLoginFormat;
this.emit('login-format-changed', newLoginFormat); this.emit('login-format-changed', newLoginFormat);
} }
}, }
get loginFormat() { get loginFormat() {
if (this._loginFormat !== undefined) if (this._loginFormat !== undefined)
@@ -96,7 +93,7 @@ var Manager = new Lang.Class({
this._updateLoginFormat(); this._updateLoginFormat();
return this._loginFormat; return this._loginFormat;
}, }
release() { release() {
Service(Gio.DBus.system, Service(Gio.DBus.system,
@@ -107,5 +104,5 @@ var Manager = new Lang.Class({
this._realms = { }; this._realms = { };
this._updateLoginFormat(); this._updateLoginFormat();
} }
}); };
Signals.addSignalMethods(Manager.prototype) Signals.addSignalMethods(Manager.prototype)

View File

@@ -3,7 +3,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
@@ -119,10 +118,8 @@ function cloneAndFadeOutActor(actor) {
return hold; return hold;
} }
var ShellUserVerifier = new Lang.Class({ var ShellUserVerifier = class {
Name: 'ShellUserVerifier', constructor(client, params) {
_init(client, params) {
params = Params.parse(params, { reauthenticationOnly: false }); params = Params.parse(params, { reauthenticationOnly: false });
this._reauthOnly = params.reauthenticationOnly; this._reauthOnly = params.reauthenticationOnly;
@@ -165,7 +162,7 @@ var ShellUserVerifier = new Lang.Class({
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated', this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
this._oVirtUserAuthenticated.bind(this)); this._oVirtUserAuthenticated.bind(this));
}, }
begin(userName, hold) { begin(userName, hold) {
this._cancellable = new Gio.Cancellable(); this._cancellable = new Gio.Cancellable();
@@ -183,7 +180,7 @@ var ShellUserVerifier = new Lang.Class({
} else { } else {
this._client.get_user_verifier(this._cancellable, this._userVerifierGot.bind(this)); this._client.get_user_verifier(this._cancellable, this._userVerifierGot.bind(this));
} }
}, }
cancel() { cancel() {
if (this._cancellable) if (this._cancellable)
@@ -193,14 +190,14 @@ var ShellUserVerifier = new Lang.Class({
this._userVerifier.call_cancel_sync(null); this._userVerifier.call_cancel_sync(null);
this.clear(); this.clear();
} }
}, }
_clearUserVerifier() { _clearUserVerifier() {
if (this._userVerifier) { if (this._userVerifier) {
this._userVerifier.run_dispose(); this._userVerifier.run_dispose();
this._userVerifier = null; this._userVerifier = null;
} }
}, }
clear() { clear() {
if (this._cancellable) { if (this._cancellable) {
@@ -210,7 +207,7 @@ var ShellUserVerifier = new Lang.Class({
this._clearUserVerifier(); this._clearUserVerifier();
this._clearMessageQueue(); this._clearMessageQueue();
}, }
destroy() { destroy() {
this.clear(); this.clear();
@@ -224,7 +221,7 @@ var ShellUserVerifier = new Lang.Class({
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId); this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
this._oVirtCredentialsManager = null; this._oVirtCredentialsManager = null;
}, }
answerQuery(serviceName, answer) { answerQuery(serviceName, answer) {
if (!this.hasPendingMessages) { if (!this.hasPendingMessages) {
@@ -235,12 +232,12 @@ var ShellUserVerifier = new Lang.Class({
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}); });
} }
}, }
_getIntervalForMessage(message) { _getIntervalForMessage(message) {
// We probably could be smarter here // We probably could be smarter here
return message.length * USER_READ_TIME; return message.length * USER_READ_TIME;
}, }
finishMessageQueue() { finishMessageQueue() {
if (!this.hasPendingMessages) if (!this.hasPendingMessages)
@@ -250,7 +247,7 @@ var ShellUserVerifier = new Lang.Class({
this.hasPendingMessages = false; this.hasPendingMessages = false;
this.emit('no-more-messages'); this.emit('no-more-messages');
}, }
_queueMessageTimeout() { _queueMessageTimeout() {
if (this._messageQueue.length == 0) { if (this._messageQueue.length == 0) {
@@ -273,7 +270,7 @@ var ShellUserVerifier = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout'); GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout');
}, }
_queueMessage(message, messageType) { _queueMessage(message, messageType) {
let interval = this._getIntervalForMessage(message); let interval = this._getIntervalForMessage(message);
@@ -281,7 +278,7 @@ var ShellUserVerifier = new Lang.Class({
this.hasPendingMessages = true; this.hasPendingMessages = true;
this._messageQueue.push({ text: message, type: messageType, interval: interval }); this._messageQueue.push({ text: message, type: messageType, interval: interval });
this._queueMessageTimeout(); this._queueMessageTimeout();
}, }
_clearMessageQueue() { _clearMessageQueue() {
this.finishMessageQueue(); this.finishMessageQueue();
@@ -291,7 +288,7 @@ var ShellUserVerifier = new Lang.Class({
this._messageQueueTimeoutId = 0; this._messageQueueTimeoutId = 0;
} }
this.emit('show-message', null, MessageType.NONE); this.emit('show-message', null, MessageType.NONE);
}, }
_checkForFingerprintReader() { _checkForFingerprintReader() {
this._haveFingerprintReader = false; this._haveFingerprintReader = false;
@@ -309,12 +306,12 @@ var ShellUserVerifier = new Lang.Class({
this._updateDefaultService(); this._updateDefaultService();
} }
}); });
}, }
_oVirtUserAuthenticated(token) { _oVirtUserAuthenticated(token) {
this._preemptingService = OVIRT_SERVICE_NAME; this._preemptingService = OVIRT_SERVICE_NAME;
this.emit('ovirt-user-authenticated'); this.emit('ovirt-user-authenticated');
}, }
_checkForSmartcard() { _checkForSmartcard() {
let smartcardDetected; let smartcardDetected;
@@ -336,7 +333,7 @@ var ShellUserVerifier = new Lang.Class({
this.emit('smartcard-status-changed'); this.emit('smartcard-status-changed');
} }
}, }
_reportInitError(where, error) { _reportInitError(where, error) {
logError(error, where); logError(error, where);
@@ -344,7 +341,7 @@ var ShellUserVerifier = new Lang.Class({
this._queueMessage(_("Authentication error"), MessageType.ERROR); this._queueMessage(_("Authentication error"), MessageType.ERROR);
this._verificationFailed(false); this._verificationFailed(false);
}, }
_reauthenticationChannelOpened(client, result) { _reauthenticationChannelOpened(client, result) {
try { try {
@@ -371,7 +368,7 @@ var ShellUserVerifier = new Lang.Class({
this._connectSignals(); this._connectSignals();
this._beginVerification(); this._beginVerification();
this._hold.release(); this._hold.release();
}, }
_userVerifierGot(client, result) { _userVerifierGot(client, result) {
try { try {
@@ -387,7 +384,7 @@ var ShellUserVerifier = new Lang.Class({
this._connectSignals(); this._connectSignals();
this._beginVerification(); this._beginVerification();
this._hold.release(); this._hold.release();
}, }
_connectSignals() { _connectSignals() {
this._userVerifier.connect('info', this._onInfo.bind(this)); this._userVerifier.connect('info', this._onInfo.bind(this));
@@ -397,22 +394,22 @@ var ShellUserVerifier = new Lang.Class({
this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this)); this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this));
this._userVerifier.connect('reset', this._onReset.bind(this)); this._userVerifier.connect('reset', this._onReset.bind(this));
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this)); this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
}, }
_getForegroundService() { _getForegroundService() {
if (this._preemptingService) if (this._preemptingService)
return this._preemptingService; return this._preemptingService;
return this._defaultService; return this._defaultService;
}, }
serviceIsForeground(serviceName) { serviceIsForeground(serviceName) {
return serviceName == this._getForegroundService(); return serviceName == this._getForegroundService();
}, }
serviceIsDefault(serviceName) { serviceIsDefault(serviceName) {
return serviceName == this._defaultService; return serviceName == this._defaultService;
}, }
_updateDefaultService() { _updateDefaultService() {
if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
@@ -426,7 +423,7 @@ var ShellUserVerifier = new Lang.Class({
log("no authentication service is enabled, using password authentication"); log("no authentication service is enabled, using password authentication");
this._defaultService = PASSWORD_SERVICE_NAME; this._defaultService = PASSWORD_SERVICE_NAME;
} }
}, }
_startService(serviceName) { _startService(serviceName) {
this._hold.acquire(); this._hold.acquire();
@@ -462,14 +459,14 @@ var ShellUserVerifier = new Lang.Class({
this._hold.release(); this._hold.release();
}); });
} }
}, }
_beginVerification() { _beginVerification() {
this._startService(this._getForegroundService()); this._startService(this._getForegroundService());
if (this._userName && this._haveFingerprintReader && !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME)) if (this._userName && this._haveFingerprintReader && !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME))
this._startService(FINGERPRINT_SERVICE_NAME); this._startService(FINGERPRINT_SERVICE_NAME);
}, }
_onInfo(client, serviceName, info) { _onInfo(client, serviceName, info) {
if (this.serviceIsForeground(serviceName)) { if (this.serviceIsForeground(serviceName)) {
@@ -484,21 +481,21 @@ var ShellUserVerifier = new Lang.Class({
// to indicate the user can swipe their finger instead // to indicate the user can swipe their finger instead
this._queueMessage(_("(or swipe finger)"), MessageType.HINT); this._queueMessage(_("(or swipe finger)"), MessageType.HINT);
} }
}, }
_onProblem(client, serviceName, problem) { _onProblem(client, serviceName, problem) {
if (!this.serviceIsForeground(serviceName)) if (!this.serviceIsForeground(serviceName))
return; return;
this._queueMessage(problem, MessageType.ERROR); this._queueMessage(problem, MessageType.ERROR);
}, }
_onInfoQuery(client, serviceName, question) { _onInfoQuery(client, serviceName, question) {
if (!this.serviceIsForeground(serviceName)) if (!this.serviceIsForeground(serviceName))
return; return;
this.emit('ask-question', serviceName, question, ''); this.emit('ask-question', serviceName, question, '');
}, }
_onSecretInfoQuery(client, serviceName, secretQuestion) { _onSecretInfoQuery(client, serviceName, secretQuestion) {
if (!this.serviceIsForeground(serviceName)) if (!this.serviceIsForeground(serviceName))
@@ -511,7 +508,7 @@ var ShellUserVerifier = new Lang.Class({
} }
this.emit('ask-question', serviceName, secretQuestion, '\u25cf'); this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
}, }
_onReset() { _onReset() {
// Clear previous attempts to authenticate // Clear previous attempts to authenticate
@@ -519,20 +516,20 @@ var ShellUserVerifier = new Lang.Class({
this._updateDefaultService(); this._updateDefaultService();
this.emit('reset'); this.emit('reset');
}, }
_onVerificationComplete() { _onVerificationComplete() {
this.emit('verification-complete'); this.emit('verification-complete');
}, }
_cancelAndReset() { _cancelAndReset() {
this.cancel(); this.cancel();
this._onReset(); this._onReset();
}, }
_retry() { _retry() {
this.begin(this._userName, new Batch.Hold()); this.begin(this._userName, new Batch.Hold());
}, }
_verificationFailed(retry) { _verificationFailed(retry) {
// For Not Listed / enterprise logins, immediately reset // For Not Listed / enterprise logins, immediately reset
@@ -567,7 +564,7 @@ var ShellUserVerifier = new Lang.Class({
} }
this.emit('verification-failed', canRetry); this.emit('verification-failed', canRetry);
}, }
_onConversationStopped(client, serviceName) { _onConversationStopped(client, serviceName) {
// If the login failed with the preauthenticated oVirt credentials // If the login failed with the preauthenticated oVirt credentials
@@ -586,6 +583,6 @@ var ShellUserVerifier = new Lang.Class({
if (this.serviceIsForeground(serviceName)) { if (this.serviceIsForeground(serviceName)) {
this._verificationFailed(true); this._verificationFailed(true);
} }
}, }
}); };
Signals.addSignalMethods(ShellUserVerifier.prototype); Signals.addSignalMethods(ShellUserVerifier.prototype);

View File

@@ -82,7 +82,6 @@
<file>ui/panelMenu.js</file> <file>ui/panelMenu.js</file>
<file>ui/pointerWatcher.js</file> <file>ui/pointerWatcher.js</file>
<file>ui/popupMenu.js</file> <file>ui/popupMenu.js</file>
<file>ui/remoteMenu.js</file>
<file>ui/remoteSearch.js</file> <file>ui/remoteSearch.js</file>
<file>ui/runDialog.js</file> <file>ui/runDialog.js</file>
<file>ui/screenShield.js</file> <file>ui/screenShield.js</file>

View File

@@ -3,7 +3,6 @@
// Common utils for the extension system and the extension // Common utils for the extension system and the extension
// preferences tool // preferences tool
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
@@ -160,9 +159,7 @@ function installImporter(extension) {
imports.searchPath = oldSearchPath; imports.searchPath = oldSearchPath;
} }
var ExtensionFinder = new Lang.Class({ var ExtensionFinder = class {
Name: 'ExtensionFinder',
_loadExtension(extensionDir, info, perUserDir) { _loadExtension(extensionDir, info, perUserDir) {
let fileType = info.get_file_type(); let fileType = info.get_file_type();
if (fileType != Gio.FileType.DIRECTORY) if (fileType != Gio.FileType.DIRECTORY)
@@ -184,7 +181,7 @@ var ExtensionFinder = new Lang.Class({
return; return;
} }
this.emit('extension-found', extension); this.emit('extension-found', extension);
}, }
scanExtensions() { scanExtensions() {
let perUserDir = Gio.File.new_for_path(global.userdatadir); let perUserDir = Gio.File.new_for_path(global.userdatadir);
@@ -192,5 +189,5 @@ var ExtensionFinder = new Lang.Class({
this._loadExtension(dir, info, perUserDir); this._loadExtension(dir, info, perUserDir);
}); });
} }
}); };
Signals.addSignalMethods(ExtensionFinder.prototype); Signals.addSignalMethods(ExtensionFinder.prototype);

View File

@@ -2,7 +2,6 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Config = imports.misc.config; const Config = imports.misc.config;
const Params = imports.misc.params; const Params = imports.misc.params;

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const { loadInterfaceXML } = imports.misc.fileUtils; const { loadInterfaceXML } = imports.misc.fileUtils;

View File

@@ -1,16 +1,13 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Params = imports.misc.params; const Params = imports.misc.params;
var DEFAULT_LIMIT = 512; var DEFAULT_LIMIT = 512;
var HistoryManager = new Lang.Class({ var HistoryManager = class {
Name: 'HistoryManager', constructor(params) {
_init(params) {
params = Params.parse(params, { gsettingsKey: null, params = Params.parse(params, { gsettingsKey: null,
limit: DEFAULT_LIMIT, limit: DEFAULT_LIMIT,
entry: null }); entry: null });
@@ -34,12 +31,12 @@ var HistoryManager = new Lang.Class({
this._entry.connect('key-press-event', this._entry.connect('key-press-event',
this._onEntryKeyPress.bind(this)); this._onEntryKeyPress.bind(this));
} }
}, }
_historyChanged() { _historyChanged() {
this._history = global.settings.get_strv(this._key); this._history = global.settings.get_strv(this._key);
this._historyIndex = this._history.length; this._historyIndex = this._history.length;
}, }
_setPrevItem(text) { _setPrevItem(text) {
if (this._historyIndex <= 0) if (this._historyIndex <= 0)
@@ -50,7 +47,7 @@ var HistoryManager = new Lang.Class({
this._historyIndex--; this._historyIndex--;
this._indexChanged(); this._indexChanged();
return true; return true;
}, }
_setNextItem(text) { _setNextItem(text) {
if (this._historyIndex >= this._history.length) if (this._historyIndex >= this._history.length)
@@ -61,7 +58,7 @@ var HistoryManager = new Lang.Class({
this._historyIndex++; this._historyIndex++;
this._indexChanged(); this._indexChanged();
return true; return true;
}, }
lastItem() { lastItem() {
if (this._historyIndex != this._history.length) { if (this._historyIndex != this._history.length) {
@@ -70,7 +67,7 @@ var HistoryManager = new Lang.Class({
} }
return this._historyIndex ? this._history[this._historyIndex -1] : null; return this._historyIndex ? this._history[this._historyIndex -1] : null;
}, }
addItem(input) { addItem(input) {
if (this._history.length == 0 || if (this._history.length == 0 ||
@@ -81,7 +78,7 @@ var HistoryManager = new Lang.Class({
this._save(); this._save();
} }
this._historyIndex = this._history.length; this._historyIndex = this._history.length;
}, }
_onEntryKeyPress(entry, event) { _onEntryKeyPress(entry, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
@@ -91,7 +88,7 @@ var HistoryManager = new Lang.Class({
return this._setNextItem(entry.get_text()); return this._setNextItem(entry.get_text());
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_indexChanged() { _indexChanged() {
let current = this._history[this._historyIndex] || ''; let current = this._history[this._historyIndex] || '';
@@ -99,7 +96,7 @@ var HistoryManager = new Lang.Class({
if (this._entry) if (this._entry)
this._entry.set_text(current); this._entry.set_text(current);
}, }
_save() { _save() {
if (this._history.length > this._limit) if (this._history.length > this._limit)
@@ -108,5 +105,5 @@ var HistoryManager = new Lang.Class({
if (this._key) if (this._key)
global.settings.set_strv(this._key, this._history); global.settings.set_strv(this._key, this._history);
} }
}); };
Signals.addSignalMethods(HistoryManager.prototype); Signals.addSignalMethods(HistoryManager.prototype);

View File

@@ -2,7 +2,6 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
@@ -32,17 +31,16 @@ function getIBusManager() {
return _ibusManager; return _ibusManager;
} }
var IBusManager = new Lang.Class({ var IBusManager = class {
Name: 'IBusManager', constructor() {
// This is the longest we'll keep the keyboard frozen until an input
// source is active.
_MAX_INPUT_SOURCE_ACTIVATION_TIME: 4000, // ms
_PRELOAD_ENGINES_DELAY_TIME: 30, // sec
_init() {
IBus.init(); IBus.init();
// This is the longest we'll keep the keyboard frozen until an input
// source is active.
this._MAX_INPUT_SOURCE_ACTIVATION_TIME = 4000; // ms
this._PRELOAD_ENGINES_DELAY_TIME = 30; // sec
this._candidatePopup = new IBusCandidatePopup.CandidatePopup(); this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
this._panelService = null; this._panelService = null;
@@ -60,7 +58,7 @@ var IBusManager = new Lang.Class({
this._ibus.connect('global-engine-changed', this._engineChanged.bind(this)); this._ibus.connect('global-engine-changed', this._engineChanged.bind(this));
this._spawn(); this._spawn();
}, }
_spawn() { _spawn() {
try { try {
@@ -69,7 +67,7 @@ var IBusManager = new Lang.Class({
} catch(e) { } catch(e) {
log('Failed to launch ibus-daemon: ' + e.message); log('Failed to launch ibus-daemon: ' + e.message);
} }
}, }
_clear() { _clear() {
if (this._panelService) if (this._panelService)
@@ -85,7 +83,7 @@ var IBusManager = new Lang.Class({
this.emit('ready', false); this.emit('ready', false);
this._spawn(); this._spawn();
}, }
_onConnected() { _onConnected() {
this._ibus.list_engines_async(-1, null, this._initEngines.bind(this)); this._ibus.list_engines_async(-1, null, this._initEngines.bind(this));
@@ -93,7 +91,7 @@ var IBusManager = new Lang.Class({
IBus.BusNameFlag.REPLACE_EXISTING, IBus.BusNameFlag.REPLACE_EXISTING,
-1, null, -1, null,
this._initPanelService.bind(this)); this._initPanelService.bind(this));
}, }
_initEngines(ibus, result) { _initEngines(ibus, result) {
let enginesList = this._ibus.list_engines_async_finish(result); let enginesList = this._ibus.list_engines_async_finish(result);
@@ -106,7 +104,7 @@ var IBusManager = new Lang.Class({
} else { } else {
this._clear(); this._clear();
} }
}, }
_initPanelService(ibus, result) { _initPanelService(ibus, result) {
let success = this._ibus.request_name_async_finish(result); let success = this._ibus.request_name_async_finish(result);
@@ -151,13 +149,13 @@ var IBusManager = new Lang.Class({
} else { } else {
this._clear(); this._clear();
} }
}, }
_updateReadiness() { _updateReadiness() {
this._ready = (Object.keys(this._engines).length > 0 && this._ready = (Object.keys(this._engines).length > 0 &&
this._panelService != null); this._panelService != null);
this.emit('ready', this._ready); this.emit('ready', this._ready);
}, }
_engineChanged(bus, engineName) { _engineChanged(bus, engineName) {
if (!this._ready) if (!this._ready)
@@ -178,26 +176,26 @@ var IBusManager = new Lang.Class({
this.emit('properties-registered', this._currentEngineName, props); this.emit('properties-registered', this._currentEngineName, props);
}); });
}, }
_updateProperty(panel, prop) { _updateProperty(panel, prop) {
this.emit('property-updated', this._currentEngineName, prop); this.emit('property-updated', this._currentEngineName, prop);
}, }
_setContentType(panel, purpose, hints) { _setContentType(panel, purpose, hints) {
this.emit('set-content-type', purpose, hints); this.emit('set-content-type', purpose, hints);
}, }
activateProperty(key, state) { activateProperty(key, state) {
this._panelService.property_activate(key, state); this._panelService.property_activate(key, state);
}, }
getEngineDesc(id) { getEngineDesc(id) {
if (!this._ready || !this._engines.hasOwnProperty(id)) if (!this._ready || !this._engines.hasOwnProperty(id))
return null; return null;
return this._engines[id]; return this._engines[id];
}, }
setEngine(id, callback) { setEngine(id, callback) {
// Send id even if id == this._currentEngineName // Send id even if id == this._currentEngineName
@@ -211,7 +209,7 @@ var IBusManager = new Lang.Class({
this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME, this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
null, callback || null); null, callback || null);
}, }
preloadEngines(ids) { preloadEngines(ids) {
if (!this._ibus || ids.length == 0) if (!this._ibus || ids.length == 0)
@@ -233,6 +231,6 @@ var IBusManager = new Lang.Class({
this._preloadEnginesId = 0; this._preloadEnginesId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
}, }
}); };
Signals.addSignalMethods(IBusManager.prototype); Signals.addSignalMethods(IBusManager.prototype);

View File

@@ -1,19 +1,16 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GObject = imports.gi.GObject;
const IBus = imports.gi.IBus; const IBus = imports.gi.IBus;
const Keyboard = imports.ui.status.keyboard; const Keyboard = imports.ui.status.keyboard;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
var InputMethod = new Lang.Class({ var InputMethod = GObject.registerClass(
Name: 'InputMethod', class InputMethod extends Clutter.InputMethod {
Extends: Clutter.InputMethod,
_init() { _init() {
this.parent(); super._init();
this._hints = 0; this._hints = 0;
this._purpose = 0; this._purpose = 0;
this._enabled = true;
this._currentFocus = null; this._currentFocus = null;
this._preeditStr = ''; this._preeditStr = '';
this._preeditPos = 0; this._preeditPos = 0;
@@ -30,11 +27,11 @@ var InputMethod = new Lang.Class({
if (this._ibus.is_connected()) if (this._ibus.is_connected())
this._onConnected(); this._onConnected();
}, }
get currentFocus() { get currentFocus() {
return this._currentFocus; return this._currentFocus;
}, }
_updateCapabilities() { _updateCapabilities() {
let caps = 0; let caps = 0;
@@ -49,21 +46,19 @@ var InputMethod = new Lang.Class({
if (this._context) if (this._context)
this._context.set_capabilities(caps); this._context.set_capabilities(caps);
}, }
_onSourceChanged() { _onSourceChanged() {
this._currentSource = this._inputSourceManager.currentSource; this._currentSource = this._inputSourceManager.currentSource;
}, }
_onConnected() { _onConnected() {
this._ibus.create_input_context_async ('gnome-shell', -1, null, this._ibus.create_input_context_async ('gnome-shell', -1, null,
this._setContext.bind(this)); this._setContext.bind(this));
}, }
_setContext(bus, res) { _setContext(bus, res) {
this._context = this._ibus.create_input_context_async_finish(res); this._context = this._ibus.create_input_context_async_finish(res);
this._context.connect('enabled', () => { this._enabled = true });
this._context.connect('disabled', () => { this._enabled = false });
this._context.connect('commit-text', this._onCommitText.bind(this)); this._context.connect('commit-text', this._onCommitText.bind(this));
this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this)); this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this));
this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this)); this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this));
@@ -72,30 +67,29 @@ var InputMethod = new Lang.Class({
this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this)); this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this));
this._updateCapabilities(); this._updateCapabilities();
}, }
_clear() { _clear() {
this._context = null; this._context = null;
this._hints = 0; this._hints = 0;
this._purpose = 0; this._purpose = 0;
this._enabled = false;
this._preeditStr = '' this._preeditStr = ''
this._preeditPos = 0; this._preeditPos = 0;
this._preeditVisible = false; this._preeditVisible = false;
}, }
_emitRequestSurrounding() { _emitRequestSurrounding() {
if (this._context.needs_surrounding_text()) if (this._context.needs_surrounding_text())
this.emit('request-surrounding'); this.emit('request-surrounding');
}, }
_onCommitText(context, text) { _onCommitText(context, text) {
this.commit(text.get_text()); this.commit(text.get_text());
}, }
_onDeleteSurroundingText(context) { _onDeleteSurroundingText(context) {
this.delete_surrounding(); this.delete_surrounding();
}, }
_onUpdatePreeditText(context, text, pos, visible) { _onUpdatePreeditText(context, text, pos, visible) {
if (text == null) if (text == null)
@@ -111,17 +105,17 @@ var InputMethod = new Lang.Class({
this._preeditStr = preedit; this._preeditStr = preedit;
this._preeditPos = pos; this._preeditPos = pos;
this._preeditVisible = visible; this._preeditVisible = visible;
}, }
_onShowPreeditText(context) { _onShowPreeditText(context) {
this._preeditVisible = true; this._preeditVisible = true;
this.set_preedit_text(this._preeditStr, this._preeditPos); this.set_preedit_text(this._preeditStr, this._preeditPos);
}, }
_onHidePreeditText(context) { _onHidePreeditText(context) {
this.set_preedit_text(null, this._preeditPos); this.set_preedit_text(null, this._preeditPos);
this._preeditVisible = false; this._preeditVisible = false;
}, }
_onForwardKeyEvent(context, keyval, keycode, state) { _onForwardKeyEvent(context, keyval, keycode, state) {
let press = (state & IBus.ModifierType.RELEASE_MASK) == 0; let press = (state & IBus.ModifierType.RELEASE_MASK) == 0;
@@ -135,7 +129,7 @@ var InputMethod = new Lang.Class({
time = global.display.get_current_time_roundtrip(); time = global.display.get_current_time_roundtrip();
this.forward_key(keyval, keycode + 8, state & Clutter.ModifierType.MODIFIER_MASK, time, press); this.forward_key(keyval, keycode + 8, state & Clutter.ModifierType.MODIFIER_MASK, time, press);
}, }
vfunc_focus_in(focus) { vfunc_focus_in(focus) {
this._currentFocus = focus; this._currentFocus = focus;
@@ -144,7 +138,7 @@ var InputMethod = new Lang.Class({
this._updateCapabilities(); this._updateCapabilities();
this._emitRequestSurrounding(); this._emitRequestSurrounding();
} }
}, }
vfunc_focus_out() { vfunc_focus_out() {
this._currentFocus = null; this._currentFocus = null;
@@ -158,7 +152,7 @@ var InputMethod = new Lang.Class({
this.set_preedit_text(null, 0); this.set_preedit_text(null, 0);
this._preeditStr = null; this._preeditStr = null;
} }
}, }
vfunc_reset() { vfunc_reset() {
if (this._context) { if (this._context) {
@@ -171,7 +165,7 @@ var InputMethod = new Lang.Class({
this.set_preedit_text(null, 0); this.set_preedit_text(null, 0);
this._preeditStr = null; this._preeditStr = null;
} }
}, }
vfunc_set_cursor_location(rect) { vfunc_set_cursor_location(rect) {
if (this._context) { if (this._context) {
@@ -179,7 +173,7 @@ var InputMethod = new Lang.Class({
rect.get_width(), rect.get_height()); rect.get_width(), rect.get_height());
this._emitRequestSurrounding(); this._emitRequestSurrounding();
} }
}, }
vfunc_set_surrounding(text, cursor, anchor) { vfunc_set_surrounding(text, cursor, anchor) {
if (!this._context || !text) if (!this._context || !text)
@@ -187,7 +181,7 @@ var InputMethod = new Lang.Class({
let ibusText = IBus.Text.new_from_string(text); let ibusText = IBus.Text.new_from_string(text);
this._context.set_surrounding_text(ibusText, cursor, anchor); this._context.set_surrounding_text(ibusText, cursor, anchor);
}, }
vfunc_update_content_hints(hints) { vfunc_update_content_hints(hints) {
let ibusHints = 0; let ibusHints = 0;
@@ -207,7 +201,7 @@ var InputMethod = new Lang.Class({
this._hints = ibusHints; this._hints = ibusHints;
if (this._context) if (this._context)
this._context.set_content_type(this._purpose, this._hints); this._context.set_content_type(this._purpose, this._hints);
}, }
vfunc_update_content_purpose(purpose) { vfunc_update_content_purpose(purpose) {
let ibusPurpose = 0; let ibusPurpose = 0;
@@ -233,10 +227,10 @@ var InputMethod = new Lang.Class({
this._purpose = ibusPurpose; this._purpose = ibusPurpose;
if (this._context) if (this._context)
this._context.set_content_type(this._purpose, this._hints); this._context.set_content_type(this._purpose, this._hints);
}, }
vfunc_filter_key_event(event) { vfunc_filter_key_event(event) {
if (!this._context || !this._enabled) if (!this._context)
return false; return false;
if (!this._currentSource) if (!this._currentSource)
return false; return false;
@@ -260,5 +254,5 @@ var InputMethod = new Lang.Class({
} }
}); });
return true; return true;
}, }
}); });

View File

@@ -1,6 +1,5 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -12,10 +11,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
const IntrospectDBusIface = loadInterfaceXML('org.gnome.Shell.Introspect'); const IntrospectDBusIface = loadInterfaceXML('org.gnome.Shell.Introspect');
var IntrospectService = new Lang.Class({ var IntrospectService = class {
Name: 'IntrospectService', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(IntrospectDBusIface, this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(IntrospectDBusIface,
this); this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Introspect'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Introspect');
@@ -45,21 +42,21 @@ var IntrospectService = new Lang.Class({
}); });
this._syncRunningApplications(); this._syncRunningApplications();
}, }
_isStandaloneApp(app) { _isStandaloneApp(app) {
let windows = app.get_windows(); let windows = app.get_windows();
return app.get_windows().some(w => w.transient_for == null); return app.get_windows().some(w => w.transient_for == null);
}, }
_isIntrospectEnabled() { _isIntrospectEnabled() {
return this._settings.get_boolean(INTROSPECT_KEY); return this._settings.get_boolean(INTROSPECT_KEY);
}, }
_isSenderWhitelisted(sender) { _isSenderWhitelisted(sender) {
return APP_WHITELIST.includes(sender); return APP_WHITELIST.includes(sender);
}, }
_syncRunningApplications() { _syncRunningApplications() {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
@@ -95,7 +92,7 @@ var IntrospectService = new Lang.Class({
} }
this._runningApplicationsDirty = false; this._runningApplicationsDirty = false;
this._activeApplicationDirty = false; this._activeApplicationDirty = false;
}, }
_isEligibleWindow(window) { _isEligibleWindow(window) {
if (window.is_override_redirect()) if (window.is_override_redirect())
@@ -106,7 +103,7 @@ var IntrospectService = new Lang.Class({
type == Meta.WindowType.DIALOG || type == Meta.WindowType.DIALOG ||
type == Meta.WindowType.MODAL_DIALOG || type == Meta.WindowType.MODAL_DIALOG ||
type == Meta.WindowType.UTILITY); type == Meta.WindowType.UTILITY);
}, }
GetRunningApplicationsAsync(params, invocation) { GetRunningApplicationsAsync(params, invocation) {
if (!this._isIntrospectEnabled() && if (!this._isIntrospectEnabled() &&
@@ -118,7 +115,7 @@ var IntrospectService = new Lang.Class({
} }
invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications])); invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications]));
}, }
GetWindowsAsync(params, invocation) { GetWindowsAsync(params, invocation) {
let focusWindow = global.display.get_focus_window(); let focusWindow = global.display.get_focus_window();
@@ -163,4 +160,4 @@ var IntrospectService = new Lang.Class({
} }
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList])); invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
} }
}); };

View File

@@ -2,7 +2,6 @@
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop; const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -38,22 +37,20 @@ function holdKeyboard() {
global.display.freeze_keyboard(global.get_current_time()); global.display.freeze_keyboard(global.get_current_time());
} }
var KeyboardManager = new Lang.Class({ var KeyboardManager = class {
Name: 'KeyboardManager', constructor() {
// The XKB protocol doesn't allow for more that 4 layouts in a
// keymap. Wayland doesn't impose this limit and libxkbcommon can
// handle up to 32 layouts but since we need to support X clients
// even as a Wayland compositor, we can't bump this.
this.MAX_LAYOUTS_PER_GROUP = 4;
// The XKB protocol doesn't allow for more that 4 layouts in a
// keymap. Wayland doesn't impose this limit and libxkbcommon can
// handle up to 32 layouts but since we need to support X clients
// even as a Wayland compositor, we can't bump this.
MAX_LAYOUTS_PER_GROUP: 4,
_init() {
this._xkbInfo = getXkbInfo(); this._xkbInfo = getXkbInfo();
this._current = null; this._current = null;
this._localeLayoutInfo = this._getLocaleLayout(); this._localeLayoutInfo = this._getLocaleLayout();
this._layoutInfos = {}; this._layoutInfos = {};
this._currentKeymap = null; this._currentKeymap = null;
}, }
_applyLayoutGroup(group) { _applyLayoutGroup(group) {
let options = this._buildOptionsString(); let options = this._buildOptionsString();
@@ -67,11 +64,11 @@ var KeyboardManager = new Lang.Class({
this._currentKeymap = {layouts, variants, options}; this._currentKeymap = {layouts, variants, options};
Meta.get_backend().set_keymap(layouts, variants, options); Meta.get_backend().set_keymap(layouts, variants, options);
}, }
_applyLayoutGroupIndex(idx) { _applyLayoutGroupIndex(idx) {
Meta.get_backend().lock_layout_group(idx); Meta.get_backend().lock_layout_group(idx);
}, }
apply(id) { apply(id) {
let info = this._layoutInfos[id]; let info = this._layoutInfos[id];
@@ -87,7 +84,7 @@ var KeyboardManager = new Lang.Class({
} }
this._current = info; this._current = info;
}, }
reapply() { reapply() {
if (!this._current) if (!this._current)
@@ -95,7 +92,7 @@ var KeyboardManager = new Lang.Class({
this._applyLayoutGroup(this._current.group); this._applyLayoutGroup(this._current.group);
this._applyLayoutGroupIndex(this._current.groupIndex); this._applyLayoutGroupIndex(this._current.groupIndex);
}, }
setUserLayouts(ids) { setUserLayouts(ids) {
this._current = null; this._current = null;
@@ -126,7 +123,7 @@ var KeyboardManager = new Lang.Class({
i += 1; i += 1;
} }
}, }
_getLocaleLayout() { _getLocaleLayout() {
let locale = GLib.get_language_names()[0]; let locale = GLib.get_language_names()[0];
@@ -143,21 +140,21 @@ var KeyboardManager = new Lang.Class({
return { layout: _layout, variant: _variant }; return { layout: _layout, variant: _variant };
else else
return { layout: DEFAULT_LAYOUT, variant: DEFAULT_VARIANT }; return { layout: DEFAULT_LAYOUT, variant: DEFAULT_VARIANT };
}, }
_buildGroupStrings(_group) { _buildGroupStrings(_group) {
let group = _group.concat(this._localeLayoutInfo); let group = _group.concat(this._localeLayoutInfo);
let layouts = group.map(g => g.layout).join(','); let layouts = group.map(g => g.layout).join(',');
let variants = group.map(g => g.variant).join(','); let variants = group.map(g => g.variant).join(',');
return [layouts, variants]; return [layouts, variants];
}, }
setKeyboardOptions(options) { setKeyboardOptions(options) {
this._xkbOptions = options; this._xkbOptions = options;
}, }
_buildOptionsString() { _buildOptionsString() {
let options = this._xkbOptions.join(','); let options = this._xkbOptions.join(',');
return options; return options;
} }
}); };

View File

@@ -2,7 +2,6 @@
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -70,10 +69,8 @@ function getLoginManager() {
return _loginManager; return _loginManager;
} }
var LoginManagerSystemd = new Lang.Class({ var LoginManagerSystemd = class {
Name: 'LoginManagerSystemd', constructor() {
_init() {
this._proxy = new SystemdLoginManager(Gio.DBus.system, this._proxy = new SystemdLoginManager(Gio.DBus.system,
'org.freedesktop.login1', 'org.freedesktop.login1',
'/org/freedesktop/login1'); '/org/freedesktop/login1');
@@ -82,7 +79,7 @@ var LoginManagerSystemd = new Lang.Class({
'/org/freedesktop/login1/user/self'); '/org/freedesktop/login1/user/self');
this._proxy.connectSignal('PrepareForSleep', this._proxy.connectSignal('PrepareForSleep',
this._prepareForSleep.bind(this)); this._prepareForSleep.bind(this));
}, }
getCurrentSessionProxy(callback) { getCurrentSessionProxy(callback) {
if (this._currentSession) { if (this._currentSession) {
@@ -129,7 +126,7 @@ var LoginManagerSystemd = new Lang.Class({
callback(this._currentSession); callback(this._currentSession);
} }
}); });
}, }
canSuspend(asyncCallback) { canSuspend(asyncCallback) {
this._proxy.CanSuspendRemote((result, error) => { this._proxy.CanSuspendRemote((result, error) => {
@@ -141,7 +138,7 @@ var LoginManagerSystemd = new Lang.Class({
asyncCallback(canSuspend, needsAuth); asyncCallback(canSuspend, needsAuth);
} }
}); });
}, }
listSessions(asyncCallback) { listSessions(asyncCallback) {
this._proxy.ListSessionsRemote((result, error) => { this._proxy.ListSessionsRemote((result, error) => {
@@ -150,11 +147,11 @@ var LoginManagerSystemd = new Lang.Class({
else else
asyncCallback(result[0]); asyncCallback(result[0]);
}); });
}, }
suspend() { suspend() {
this._proxy.SuspendRemote(true); this._proxy.SuspendRemote(true);
}, }
inhibit(reason, callback) { inhibit(reason, callback) {
let inVariant = GLib.Variant.new('(ssss)', let inVariant = GLib.Variant.new('(ssss)',
@@ -174,38 +171,36 @@ var LoginManagerSystemd = new Lang.Class({
callback(null); callback(null);
} }
}); });
}, }
_prepareForSleep(proxy, sender, [aboutToSuspend]) { _prepareForSleep(proxy, sender, [aboutToSuspend]) {
this.emit('prepare-for-sleep', aboutToSuspend); this.emit('prepare-for-sleep', aboutToSuspend);
} }
}); };
Signals.addSignalMethods(LoginManagerSystemd.prototype); Signals.addSignalMethods(LoginManagerSystemd.prototype);
var LoginManagerDummy = new Lang.Class({ var LoginManagerDummy = class {
Name: 'LoginManagerDummy',
getCurrentSessionProxy(callback) { getCurrentSessionProxy(callback) {
// we could return a DummySession object that fakes whatever callers // we could return a DummySession object that fakes whatever callers
// expect (at the time of writing: connect() and connectSignal() // expect (at the time of writing: connect() and connectSignal()
// methods), but just never calling the callback should be safer // methods), but just never calling the callback should be safer
}, }
canSuspend(asyncCallback) { canSuspend(asyncCallback) {
asyncCallback(false, false); asyncCallback(false, false);
}, }
listSessions(asyncCallback) { listSessions(asyncCallback) {
asyncCallback([]); asyncCallback([]);
}, }
suspend() { suspend() {
this.emit('prepare-for-sleep', true); this.emit('prepare-for-sleep', true);
this.emit('prepare-for-sleep', false); this.emit('prepare-for-sleep', false);
}, }
inhibit(reason, callback) { inhibit(reason, callback) {
callback(null); callback(null);
} }
}); };
Signals.addSignalMethods(LoginManagerDummy.prototype); Signals.addSignalMethods(LoginManagerDummy.prototype);

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const NMA = imports.gi.NMA; const NMA = imports.gi.NMA;
const Signals = imports.signals; const Signals = imports.signals;
@@ -100,10 +99,8 @@ const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInter
const ModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager.Modem.Cdma'); const ModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager.Modem.Cdma');
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface); const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
var ModemGsm = new Lang.Class({ var ModemGsm = class {
Name: 'ModemGsm', constructor(path) {
_init(path) {
this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
this.signal_quality = 0; this.signal_quality = 0;
@@ -139,13 +136,11 @@ var ModemGsm = new Lang.Class({
this.emit('notify::signal-quality'); this.emit('notify::signal-quality');
}); });
} }
}); };
Signals.addSignalMethods(ModemGsm.prototype); Signals.addSignalMethods(ModemGsm.prototype);
var ModemCdma = new Lang.Class({ var ModemCdma = class {
Name: 'ModemCdma', constructor(path) {
_init(path) {
this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
this.signal_quality = 0; this.signal_quality = 0;
@@ -169,7 +164,7 @@ var ModemCdma = new Lang.Class({
} }
this.emit('notify::signal-quality'); this.emit('notify::signal-quality');
}); });
}, }
_refreshServingSystem() { _refreshServingSystem() {
this._proxy.GetServingSystemRemote(([result], err) => { this._proxy.GetServingSystemRemote(([result], err) => {
@@ -184,7 +179,7 @@ var ModemCdma = new Lang.Class({
this.emit('notify::operator-name'); this.emit('notify::operator-name');
}); });
} }
}); };
Signals.addSignalMethods(ModemCdma.prototype); Signals.addSignalMethods(ModemCdma.prototype);
@@ -201,10 +196,8 @@ const BroadbandModem3gppProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModem3gp
const BroadbandModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem.ModemCdma'); const BroadbandModemCdmaInterface = loadInterfaceXML('org.freedesktop.ModemManager1.Modem.ModemCdma');
const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface); const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
var BroadbandModem = new Lang.Class({ var BroadbandModem = class {
Name: 'BroadbandModem', constructor(path, capabilities) {
_init(path, capabilities) {
this._proxy = new BroadbandModemProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path); this._proxy = new BroadbandModemProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path);
this._proxy_3gpp = new BroadbandModem3gppProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path); this._proxy_3gpp = new BroadbandModem3gppProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path);
this._proxy_cdma = new BroadbandModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path); this._proxy_cdma = new BroadbandModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path);
@@ -229,13 +222,13 @@ var BroadbandModem = new Lang.Class({
this._reloadCdmaOperatorName(); this._reloadCdmaOperatorName();
}); });
this._reloadCdmaOperatorName(); this._reloadCdmaOperatorName();
}, }
_reloadSignalQuality() { _reloadSignalQuality() {
let [quality, recent] = this._proxy.SignalQuality; let [quality, recent] = this._proxy.SignalQuality;
this.signal_quality = quality; this.signal_quality = quality;
this.emit('notify::signal-quality'); this.emit('notify::signal-quality');
}, }
_reloadOperatorName() { _reloadOperatorName() {
let new_name = ""; let new_name = "";
@@ -250,19 +243,19 @@ var BroadbandModem = new Lang.Class({
this.operator_name = new_name; this.operator_name = new_name;
this.emit('notify::operator-name'); this.emit('notify::operator-name');
}, }
_reload3gppOperatorName() { _reload3gppOperatorName() {
let name = this._proxy_3gpp.OperatorName; let name = this._proxy_3gpp.OperatorName;
let code = this._proxy_3gpp.OperatorCode; let code = this._proxy_3gpp.OperatorCode;
this.operator_name_3gpp = _findProviderForMccMnc(name, code); this.operator_name_3gpp = _findProviderForMccMnc(name, code);
this._reloadOperatorName(); this._reloadOperatorName();
}, }
_reloadCdmaOperatorName() { _reloadCdmaOperatorName() {
let sid = this._proxy_cdma.Sid; let sid = this._proxy_cdma.Sid;
this.operator_name_cdma = _findProviderForSid(sid); this.operator_name_cdma = _findProviderForSid(sid);
this._reloadOperatorName(); this._reloadOperatorName();
} }
}); };
Signals.addSignalMethods(BroadbandModem.prototype); Signals.addSignalMethods(BroadbandModem.prototype);

View File

@@ -2,7 +2,6 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Params = imports.misc.params; const Params = imports.misc.params;
const Signals = imports.signals; const Signals = imports.signals;
@@ -27,9 +26,8 @@ const ObjectManagerIface = `
const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface); const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);
var ObjectManager = new Lang.Class({ var ObjectManager = class {
Name: 'ObjectManager', constructor(params) {
_init(params) {
params = Params.parse(params, { connection: null, params = Params.parse(params, { connection: null,
name: null, name: null,
objectPath: null, objectPath: null,
@@ -63,7 +61,7 @@ var ObjectManager = new Lang.Class({
this._managerProxy.init_async(GLib.PRIORITY_DEFAULT, this._managerProxy.init_async(GLib.PRIORITY_DEFAULT,
this._cancellable, this._cancellable,
this._onManagerProxyLoaded.bind(this)); this._onManagerProxyLoaded.bind(this));
}, }
_tryToCompleteLoad() { _tryToCompleteLoad() {
if (this._numLoadInhibitors == 0) if (this._numLoadInhibitors == 0)
@@ -74,7 +72,7 @@ var ObjectManager = new Lang.Class({
if (this._onLoaded) if (this._onLoaded)
this._onLoaded(); this._onLoaded();
} }
}, }
_addInterface(objectPath, interfaceName, onFinished) { _addInterface(objectPath, interfaceName, onFinished) {
let info = this._interfaceInfos[interfaceName]; let info = this._interfaceInfos[interfaceName];
@@ -129,7 +127,7 @@ var ObjectManager = new Lang.Class({
if (onFinished) if (onFinished)
onFinished(); onFinished();
}); });
}, }
_removeInterface(objectPath, interfaceName) { _removeInterface(objectPath, interfaceName) {
if (!this._objects[objectPath]) if (!this._objects[objectPath])
@@ -155,7 +153,7 @@ var ObjectManager = new Lang.Class({
delete this._objects[objectPath]; delete this._objects[objectPath];
this.emit('object-removed', objectPath); this.emit('object-removed', objectPath);
} }
}, }
_onManagerProxyLoaded(initable, result) { _onManagerProxyLoaded(initable, result) {
let error = null; let error = null;
@@ -194,7 +192,7 @@ var ObjectManager = new Lang.Class({
if (this._managerProxy.g_name_owner) if (this._managerProxy.g_name_owner)
this._onNameAppeared(); this._onNameAppeared();
}, }
_onNameAppeared() { _onNameAppeared() {
this._managerProxy.GetManagedObjectsRemote((result, error) => { this._managerProxy.GetManagedObjectsRemote((result, error) => {
@@ -232,7 +230,7 @@ var ObjectManager = new Lang.Class({
} }
this._tryToCompleteLoad(); this._tryToCompleteLoad();
}); });
}, }
_onNameVanished() { _onNameVanished() {
let objectPaths = Object.keys(this._objects); let objectPaths = Object.keys(this._objects);
@@ -248,14 +246,14 @@ var ObjectManager = new Lang.Class({
this._removeInterface(objectPath, interfaceName); this._removeInterface(objectPath, interfaceName);
} }
} }
}, }
_registerInterfaces(interfaces) { _registerInterfaces(interfaces) {
for (let i = 0; i < interfaces.length; i++) { for (let i = 0; i < interfaces.length; i++) {
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]); let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
this._interfaceInfos[info.name] = info; this._interfaceInfos[info.name] = info;
} }
}, }
getProxy(objectPath, interfaceName) { getProxy(objectPath, interfaceName) {
let object = this._objects[objectPath]; let object = this._objects[objectPath];
@@ -264,7 +262,7 @@ var ObjectManager = new Lang.Class({
return null; return null;
return object[interfaceName]; return object[interfaceName];
}, }
getProxiesForInterface(interfaceName) { getProxiesForInterface(interfaceName) {
let proxyList = this._interfaces[interfaceName]; let proxyList = this._interfaces[interfaceName];
@@ -273,7 +271,7 @@ var ObjectManager = new Lang.Class({
return []; return [];
return proxyList; return proxyList;
}, }
getAllProxies() { getAllProxies() {
let proxies = []; let proxies = [];
@@ -292,5 +290,5 @@ var ObjectManager = new Lang.Class({
return proxies; return proxies;
} }
}); };
Signals.addSignalMethods(ObjectManager.prototype); Signals.addSignalMethods(ObjectManager.prototype);

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -26,9 +25,8 @@ function getSmartcardManager() {
return _smartcardManager; return _smartcardManager;
} }
var SmartcardManager = new Lang.Class({ var SmartcardManager = class {
Name: 'SmartcardManager', constructor() {
_init() {
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session, this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
name: "org.gnome.SettingsDaemon.Smartcard", name: "org.gnome.SettingsDaemon.Smartcard",
objectPath: '/org/gnome/SettingsDaemon/Smartcard', objectPath: '/org/gnome/SettingsDaemon/Smartcard',
@@ -36,7 +34,7 @@ var SmartcardManager = new Lang.Class({
onLoaded: this._onLoaded.bind(this) }); onLoaded: this._onLoaded.bind(this) });
this._insertedTokens = {}; this._insertedTokens = {};
this._loginToken = null; this._loginToken = null;
}, }
_onLoaded() { _onLoaded() {
let tokens = this._objectManager.getProxiesForInterface('org.gnome.SettingsDaemon.Smartcard.Token'); let tokens = this._objectManager.getProxiesForInterface('org.gnome.SettingsDaemon.Smartcard.Token');
@@ -53,7 +51,7 @@ var SmartcardManager = new Lang.Class({
if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token') if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token')
this._removeToken(proxy); this._removeToken(proxy);
}); });
}, }
_updateToken(token) { _updateToken(token) {
let objectPath = token.get_object_path(); let objectPath = token.get_object_path();
@@ -65,7 +63,7 @@ var SmartcardManager = new Lang.Class({
if (token.UsedToLogin) if (token.UsedToLogin)
this._loginToken = token; this._loginToken = token;
}, }
_addToken(token) { _addToken(token) {
this._updateToken(token); this._updateToken(token);
@@ -85,7 +83,7 @@ var SmartcardManager = new Lang.Class({
// Emit a smartcard-inserted at startup if it's already plugged in // Emit a smartcard-inserted at startup if it's already plugged in
if (token.IsInserted) if (token.IsInserted)
this.emit('smartcard-inserted', token); this.emit('smartcard-inserted', token);
}, }
_removeToken(token) { _removeToken(token) {
let objectPath = token.get_object_path(); let objectPath = token.get_object_path();
@@ -99,11 +97,11 @@ var SmartcardManager = new Lang.Class({
this._loginToken = null; this._loginToken = null;
token.disconnectAll(); token.disconnectAll();
}, }
hasInsertedTokens() { hasInsertedTokens() {
return Object.keys(this._insertedTokens).length > 0; return Object.keys(this._insertedTokens).length > 0;
}, }
hasInsertedLoginToken() { hasInsertedLoginToken() {
if (!this._loginToken) if (!this._loginToken)
@@ -115,5 +113,5 @@ var SmartcardManager = new Lang.Class({
return true; return true;
} }
}); };
Signals.addSignalMethods(SmartcardManager.prototype); Signals.addSignalMethods(SmartcardManager.prototype);

View File

@@ -3,7 +3,6 @@ const Clutter = imports.gi.Clutter;
const Gdm = imports.gi.Gdm; const Gdm = imports.gi.Gdm;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
@@ -44,9 +43,7 @@ function getDefault() {
return _singleton; return _singleton;
} }
const SystemActions = new Lang.Class({ const SystemActions = GObject.registerClass({
Name: 'SystemActions',
Extends: GObject.Object,
Properties: { Properties: {
'can-power-off': GObject.ParamSpec.boolean('can-power-off', 'can-power-off': GObject.ParamSpec.boolean('can-power-off',
'can-power-off', 'can-power-off',
@@ -83,10 +80,10 @@ const SystemActions = new Lang.Class({
'orientation-lock-icon', 'orientation-lock-icon',
GObject.ParamFlags.READWRITE, GObject.ParamFlags.READWRITE,
null) null)
}, }
}, class SystemActions extends GObject.Object {
_init() { _init() {
this.parent(); super._init();
this._canHavePowerOff = true; this._canHavePowerOff = true;
this._canHaveSuspend = true; this._canHaveSuspend = true;
@@ -186,35 +183,35 @@ const SystemActions = new Lang.Class({
Main.sessionMode.connect('updated', () => { this._sessionUpdated(); }); Main.sessionMode.connect('updated', () => { this._sessionUpdated(); });
this._sessionUpdated(); this._sessionUpdated();
}, }
get can_power_off() { get can_power_off() {
return this._actions.get(POWER_OFF_ACTION_ID).available; return this._actions.get(POWER_OFF_ACTION_ID).available;
}, }
get can_suspend() { get can_suspend() {
return this._actions.get(SUSPEND_ACTION_ID).available; return this._actions.get(SUSPEND_ACTION_ID).available;
}, }
get can_lock_screen() { get can_lock_screen() {
return this._actions.get(LOCK_SCREEN_ACTION_ID).available; return this._actions.get(LOCK_SCREEN_ACTION_ID).available;
}, }
get can_switch_user() { get can_switch_user() {
return this._actions.get(SWITCH_USER_ACTION_ID).available; return this._actions.get(SWITCH_USER_ACTION_ID).available;
}, }
get can_logout() { get can_logout() {
return this._actions.get(LOGOUT_ACTION_ID).available; return this._actions.get(LOGOUT_ACTION_ID).available;
}, }
get can_lock_orientation() { get can_lock_orientation() {
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).available; return this._actions.get(LOCK_ORIENTATION_ACTION_ID).available;
}, }
get orientation_lock_icon() { get orientation_lock_icon() {
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName; return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName;
}, }
_sensorProxyAppeared() { _sensorProxyAppeared() {
this._sensorProxy = new SensorProxy(Gio.DBus.system, SENSOR_BUS_NAME, SENSOR_OBJECT_PATH, this._sensorProxy = new SensorProxy(Gio.DBus.system, SENSOR_BUS_NAME, SENSOR_OBJECT_PATH,
@@ -227,7 +224,7 @@ const SystemActions = new Lang.Class({
() => { this._updateOrientationLock(); }); () => { this._updateOrientationLock(); });
this._updateOrientationLock(); this._updateOrientationLock();
}); });
}, }
_updateOrientationLock() { _updateOrientationLock() {
let available = false; let available = false;
@@ -238,7 +235,7 @@ const SystemActions = new Lang.Class({
this._actions.get(LOCK_ORIENTATION_ACTION_ID).available = available; this._actions.get(LOCK_ORIENTATION_ACTION_ID).available = available;
this.notify('can-lock-orientation'); this.notify('can-lock-orientation');
}, }
_updateOrientationLockIcon() { _updateOrientationLockIcon() {
let locked = this._orientationSettings.get_boolean('orientation-lock'); let locked = this._orientationSettings.get_boolean('orientation-lock');
@@ -247,14 +244,14 @@ const SystemActions = new Lang.Class({
this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName; this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName;
this.notify('orientation-lock-icon'); this.notify('orientation-lock-icon');
}, }
_sessionUpdated() { _sessionUpdated() {
this._updateLockScreen(); this._updateLockScreen();
this._updatePowerOff(); this._updatePowerOff();
this._updateSuspend(); this._updateSuspend();
this._updateMultiUser(); this._updateMultiUser();
}, }
forceUpdate() { forceUpdate() {
// Whether those actions are available or not depends on both lockdown // Whether those actions are available or not depends on both lockdown
@@ -262,7 +259,7 @@ const SystemActions = new Lang.Class({
// latter, so their value may be outdated; force an update now // latter, so their value may be outdated; force an update now
this._updateHaveShutdown(); this._updateHaveShutdown();
this._updateHaveSuspend(); this._updateHaveSuspend();
}, }
getMatchingActions(terms) { getMatchingActions(terms) {
// terms is a list of strings // terms is a list of strings
@@ -275,15 +272,15 @@ const SystemActions = new Lang.Class({
results.push(key); results.push(key);
return results; return results;
}, }
getName(id) { getName(id) {
return this._actions.get(id).name; return this._actions.get(id).name;
}, }
getIconName(id) { getIconName(id) {
return this._actions.get(id).iconName; return this._actions.get(id).iconName;
}, }
activateAction(id) { activateAction(id) {
switch (id) { switch (id) {
@@ -306,14 +303,14 @@ const SystemActions = new Lang.Class({
this.activateLockOrientation(); this.activateLockOrientation();
break; break;
} }
}, }
_updateLockScreen() { _updateLockScreen() {
let showLock = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; let showLock = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY); let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
this._actions.get(LOCK_SCREEN_ACTION_ID).available = showLock && allowLockScreen && LoginManager.canLock(); this._actions.get(LOCK_SCREEN_ACTION_ID).available = showLock && allowLockScreen && LoginManager.canLock();
this.notify('can-lock-screen'); this.notify('can-lock-screen');
}, }
_updateHaveShutdown() { _updateHaveShutdown() {
this._session.CanShutdownRemote((result, error) => { this._session.CanShutdownRemote((result, error) => {
@@ -323,7 +320,7 @@ const SystemActions = new Lang.Class({
this._canHavePowerOff = result[0]; this._canHavePowerOff = result[0];
this._updatePowerOff(); this._updatePowerOff();
}); });
}, }
_updatePowerOff() { _updatePowerOff() {
let disabled = Main.sessionMode.isLocked || let disabled = Main.sessionMode.isLocked ||
@@ -331,7 +328,7 @@ const SystemActions = new Lang.Class({
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY)); this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
this._actions.get(POWER_OFF_ACTION_ID).available = this._canHavePowerOff && !disabled; this._actions.get(POWER_OFF_ACTION_ID).available = this._canHavePowerOff && !disabled;
this.notify('can-power-off'); this.notify('can-power-off');
}, }
_updateHaveSuspend() { _updateHaveSuspend() {
this._loginManager.canSuspend( this._loginManager.canSuspend(
@@ -340,7 +337,7 @@ const SystemActions = new Lang.Class({
this._suspendNeedsAuth = needsAuth; this._suspendNeedsAuth = needsAuth;
this._updateSuspend(); this._updateSuspend();
}); });
}, }
_updateSuspend() { _updateSuspend() {
let disabled = (Main.sessionMode.isLocked && let disabled = (Main.sessionMode.isLocked &&
@@ -349,12 +346,12 @@ const SystemActions = new Lang.Class({
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY)); this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
this._actions.get(SUSPEND_ACTION_ID).available = this._canHaveSuspend && !disabled; this._actions.get(SUSPEND_ACTION_ID).available = this._canHaveSuspend && !disabled;
this.notify('can-suspend'); this.notify('can-suspend');
}, }
_updateMultiUser() { _updateMultiUser() {
this._updateLogout(); this._updateLogout();
this._updateSwitchUser(); this._updateSwitchUser();
}, }
_updateSwitchUser() { _updateSwitchUser() {
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY); let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
@@ -366,7 +363,7 @@ const SystemActions = new Lang.Class({
this.notify('can-switch-user'); this.notify('can-switch-user');
return visible; return visible;
}, }
_updateLogout() { _updateLogout() {
let user = this._userManager.get_user(GLib.get_user_name()); let user = this._userManager.get_user(GLib.get_user_name());
@@ -384,7 +381,7 @@ const SystemActions = new Lang.Class({
this.notify('can-logout'); this.notify('can-logout');
return visible; return visible;
}, }
activateLockOrientation() { activateLockOrientation() {
if (!this._actions.get(LOCK_ORIENTATION_ACTION_ID).available) if (!this._actions.get(LOCK_ORIENTATION_ACTION_ID).available)
@@ -392,14 +389,14 @@ const SystemActions = new Lang.Class({
let locked = this._orientationSettings.get_boolean('orientation-lock'); let locked = this._orientationSettings.get_boolean('orientation-lock');
this._orientationSettings.set_boolean('orientation-lock', !locked); this._orientationSettings.set_boolean('orientation-lock', !locked);
}, }
activateLockScreen() { activateLockScreen() {
if (!this._actions.get(LOCK_SCREEN_ACTION_ID).available) if (!this._actions.get(LOCK_SCREEN_ACTION_ID).available)
throw new Error('The lock-screen action is not available!'); throw new Error('The lock-screen action is not available!');
Main.screenShield.lock(true); Main.screenShield.lock(true);
}, }
activateSwitchUser() { activateSwitchUser() {
if (!this._actions.get(SWITCH_USER_ACTION_ID).available) if (!this._actions.get(SWITCH_USER_ACTION_ID).available)
@@ -412,7 +409,7 @@ const SystemActions = new Lang.Class({
Gdm.goto_login_session_sync(null); Gdm.goto_login_session_sync(null);
return false; return false;
}); });
}, }
activateLogout() { activateLogout() {
if (!this._actions.get(LOGOUT_ACTION_ID).available) if (!this._actions.get(LOGOUT_ACTION_ID).available)
@@ -420,14 +417,14 @@ const SystemActions = new Lang.Class({
Main.overview.hide(); Main.overview.hide();
this._session.LogoutRemote(0); this._session.LogoutRemote(0);
}, }
activatePowerOff() { activatePowerOff() {
if (!this._actions.get(POWER_OFF_ACTION_ID).available) if (!this._actions.get(POWER_OFF_ACTION_ID).available)
throw new Error('The power-off action is not available!'); throw new Error('The power-off action is not available!');
this._session.ShutdownRemote(0); this._session.ShutdownRemote(0);
}, }
activateSuspend() { activateSuspend() {
if (!this._actions.get(SUSPEND_ACTION_ID).available) if (!this._actions.get(SUSPEND_ACTION_ID).available)

View File

@@ -4,7 +4,7 @@ const Clutter = imports.gi.Clutter;
const Gettext = imports.gettext; const Gettext = imports.gettext;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const GObject = imports.gi.GObject;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -348,12 +348,10 @@ function insertSorted(array, val, cmp) {
return pos; return pos;
} }
var CloseButton = new Lang.Class({ var CloseButton = GObject.registerClass(
Name: 'CloseButton', class CloseButton extends St.Button {
Extends: St.Button,
_init(boxpointer) { _init(boxpointer) {
this.parent({ style_class: 'notification-close'}); super._init({ style_class: 'notification-close'});
// This is a bit tricky. St.Bin has its own x-align/y-align properties // This is a bit tricky. St.Bin has its own x-align/y-align properties
// that compete with Clutter's properties. This should be fixed for // that compete with Clutter's properties. This should be fixed for
@@ -370,7 +368,7 @@ var CloseButton = new Lang.Class({
this._boxPointer = boxpointer; this._boxPointer = boxpointer;
if (boxpointer) if (boxpointer)
this._boxPointer.connect('arrow-side-changed', this._sync.bind(this)); this._boxPointer.connect('arrow-side-changed', this._sync.bind(this));
}, }
_computeBoxPointerOffset() { _computeBoxPointerOffset() {
if (!this._boxPointer || !this._boxPointer.actor.get_stage()) if (!this._boxPointer || !this._boxPointer.actor.get_stage())
@@ -381,7 +379,7 @@ var CloseButton = new Lang.Class({
return this._boxPointer.getArrowHeight(); return this._boxPointer.getArrowHeight();
else else
return 0; return 0;
}, }
_sync() { _sync() {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -389,12 +387,12 @@ var CloseButton = new Lang.Class({
let offY = this._computeBoxPointerOffset(); let offY = this._computeBoxPointerOffset();
this.translation_x = themeNode.get_length('-shell-close-overlap-x') this.translation_x = themeNode.get_length('-shell-close-overlap-x')
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY; this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
}, }
vfunc_style_changed() { vfunc_style_changed() {
this._sync(); this._sync();
this.parent(); super.vfunc_style_changed();
}, }
}); });
function makeCloseButton(boxpointer) { function makeCloseButton(boxpointer) {
@@ -437,10 +435,8 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
} }
var AppSettingsMonitor = new Lang.Class({ var AppSettingsMonitor = class {
Name: 'AppSettingsMonitor', constructor(appId, schemaId) {
_init(appId, schemaId) {
this._appId = appId; this._appId = appId;
this._schemaId = schemaId; this._schemaId = schemaId;
@@ -454,23 +450,23 @@ var AppSettingsMonitor = new Lang.Class({
this._appSystem.connect('installed-changed', this._appSystem.connect('installed-changed',
this._onInstalledChanged.bind(this)); this._onInstalledChanged.bind(this));
this._onInstalledChanged(); this._onInstalledChanged();
}, }
get available() { get available() {
return this._app != null && this._settings != null; return this._app != null && this._settings != null;
}, }
activateApp() { activateApp() {
if (this._app) if (this._app)
this._app.activate(); this._app.activate();
}, }
watchSetting(key, callback) { watchSetting(key, callback) {
let handler = { id: 0, key: key, callback: callback }; let handler = { id: 0, key: key, callback: callback };
this._handlers.push(handler); this._handlers.push(handler);
this._connectHandler(handler); this._connectHandler(handler);
}, }
_connectHandler(handler) { _connectHandler(handler) {
if (!this._settings || handler.id > 0) if (!this._settings || handler.id > 0)
@@ -479,13 +475,13 @@ var AppSettingsMonitor = new Lang.Class({
handler.id = this._settings.connect('changed::' + handler.key, handler.id = this._settings.connect('changed::' + handler.key,
handler.callback); handler.callback);
handler.callback(this._settings, handler.key); handler.callback(this._settings, handler.key);
}, }
_disconnectHandler(handler) { _disconnectHandler(handler) {
if (this._settings && handler.id > 0) if (this._settings && handler.id > 0)
this._settings.disconnect(handler.id); this._settings.disconnect(handler.id);
handler.id = 0; handler.id = 0;
}, }
_onInstalledChanged() { _onInstalledChanged() {
let hadApp = (this._app != null); let hadApp = (this._app != null);
@@ -499,7 +495,7 @@ var AppSettingsMonitor = new Lang.Class({
this._checkSettings(); this._checkSettings();
else else
this._setSettings(null); this._setSettings(null);
}, }
_setSettings(settings) { _setSettings(settings) {
this._handlers.forEach((handler) => { this._disconnectHandler(handler); }); this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
@@ -512,7 +508,7 @@ var AppSettingsMonitor = new Lang.Class({
if (hadSettings != haveSettings) if (hadSettings != haveSettings)
this.emit('available-changed'); this.emit('available-changed');
}, }
_checkSettings() { _checkSettings() {
let schema = this._schemaSource.lookup(this._schemaId, true); let schema = this._schemaSource.lookup(this._schemaId, true);
@@ -525,5 +521,5 @@ var AppSettingsMonitor = new Lang.Class({
}); });
} }
} }
}); };
Signals.addSignalMethods(AppSettingsMonitor.prototype); Signals.addSignalMethods(AppSettingsMonitor.prototype);

View File

@@ -4,7 +4,6 @@ const Geoclue = imports.gi.Geoclue;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GWeather = imports.gi.GWeather; const GWeather = imports.gi.GWeather;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const PermissionStore = imports.misc.permissionStore; const PermissionStore = imports.misc.permissionStore;
@@ -13,10 +12,8 @@ const Util = imports.misc.util;
// Minimum time between updates to show loading indication // Minimum time between updates to show loading indication
var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE; var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
var WeatherClient = new Lang.Class({ var WeatherClient = class {
Name: 'WeatherClient', constructor() {
_init() {
this._loading = false; this._loading = false;
this._locationValid = false; this._locationValid = false;
this._lastUpdate = GLib.DateTime.new_from_unix_local(0); this._lastUpdate = GLib.DateTime.new_from_unix_local(0);
@@ -71,27 +68,27 @@ var WeatherClient = new Lang.Class({
this._onAutomaticLocationChanged.bind(this)); this._onAutomaticLocationChanged.bind(this));
this._weatherAppMon.watchSetting('locations', this._weatherAppMon.watchSetting('locations',
this._onLocationsChanged.bind(this)); this._onLocationsChanged.bind(this));
}, }
get available() { get available() {
return this._weatherAppMon.available; return this._weatherAppMon.available;
}, }
get loading() { get loading() {
return this._loading; return this._loading;
}, }
get hasLocation() { get hasLocation() {
return this._locationValid; return this._locationValid;
}, }
get info() { get info() {
return this._weatherInfo; return this._weatherInfo;
}, }
activateApp() { activateApp() {
this._weatherAppMon.activateApp(); this._weatherAppMon.activateApp();
}, }
update() { update() {
if (!this._locationValid) if (!this._locationValid)
@@ -104,13 +101,13 @@ var WeatherClient = new Lang.Class({
this._weatherInfo.update(); this._weatherInfo.update();
else else
this._loadInfo(); this._loadInfo();
}, }
get _useAutoLocation() { get _useAutoLocation() {
return this._autoLocationRequested && return this._autoLocationRequested &&
this._locationSettings.get_boolean('enabled') && this._locationSettings.get_boolean('enabled') &&
this._weatherAuthorized; this._weatherAuthorized;
}, }
_loadInfo() { _loadInfo() {
let id = this._weatherInfo.connect('updated', () => { let id = this._weatherInfo.connect('updated', () => {
@@ -122,7 +119,7 @@ var WeatherClient = new Lang.Class({
this.emit('changed'); this.emit('changed');
this._weatherInfo.update(); this._weatherInfo.update();
}, }
_locationsEqual(loc1, loc2) { _locationsEqual(loc1, loc2) {
if (loc1 == loc2) if (loc1 == loc2)
@@ -132,7 +129,7 @@ var WeatherClient = new Lang.Class({
return false; return false;
return loc1.equal(loc2); return loc1.equal(loc2);
}, }
_setLocation(location) { _setLocation(location) {
if (this._locationsEqual(this._weatherInfo.location, location)) if (this._locationsEqual(this._weatherInfo.location, location))
@@ -148,7 +145,7 @@ var WeatherClient = new Lang.Class({
this._loadInfo(); this._loadInfo();
else else
this.emit('changed'); this.emit('changed');
}, }
_updateLocationMonitoring() { _updateLocationMonitoring() {
if (this._useAutoLocation) { if (this._useAutoLocation) {
@@ -164,7 +161,7 @@ var WeatherClient = new Lang.Class({
this._gclueService.disconnect(this._gclueLocationChangedId); this._gclueService.disconnect(this._gclueLocationChangedId);
this._gclueLocationChangedId = 0; this._gclueLocationChangedId = 0;
} }
}, }
_startGClueService() { _startGClueService() {
if (this._gclueStarting) if (this._gclueStarting)
@@ -185,7 +182,7 @@ var WeatherClient = new Lang.Class({
this._gclueService.get_client().distance_threshold = 100; this._gclueService.get_client().distance_threshold = 100;
this._updateLocationMonitoring(); this._updateLocationMonitoring();
}); });
}, }
_onGClueLocationChanged() { _onGClueLocationChanged() {
let geoLocation = this._gclueService.location; let geoLocation = this._gclueService.location;
@@ -194,7 +191,7 @@ var WeatherClient = new Lang.Class({
geoLocation.latitude, geoLocation.latitude,
geoLocation.longitude); geoLocation.longitude);
this._setLocation(location); this._setLocation(location);
}, }
_onAutomaticLocationChanged(settings, key) { _onAutomaticLocationChanged(settings, key) {
let useAutoLocation = settings.get_boolean(key); let useAutoLocation = settings.get_boolean(key);
@@ -204,7 +201,7 @@ var WeatherClient = new Lang.Class({
this._autoLocationRequested = useAutoLocation; this._autoLocationRequested = useAutoLocation;
this._updateAutoLocation(); this._updateAutoLocation();
}, }
_updateAutoLocation() { _updateAutoLocation() {
this._updateLocationMonitoring(); this._updateLocationMonitoring();
@@ -213,7 +210,7 @@ var WeatherClient = new Lang.Class({
this._startGClueService(); this._startGClueService();
else else
this._setLocation(this._mostRecentLocation); this._setLocation(this._mostRecentLocation);
}, }
_onLocationsChanged(settings, key) { _onLocationsChanged(settings, key) {
let serialized = settings.get_value(key).deep_unpack().shift(); let serialized = settings.get_value(key).deep_unpack().shift();
@@ -229,7 +226,7 @@ var WeatherClient = new Lang.Class({
if (!this._useAutoLocation || !this._gclueStarted) if (!this._useAutoLocation || !this._gclueStarted)
this._setLocation(this._mostRecentLocation); this._setLocation(this._mostRecentLocation);
}, }
_onPermStoreChanged(proxy, sender, params) { _onPermStoreChanged(proxy, sender, params) {
let [table, id, deleted, data, perms] = params; let [table, id, deleted, data, perms] = params;
@@ -243,5 +240,5 @@ var WeatherClient = new Lang.Class({
this._updateAutoLocation(); this._updateAutoLocation();
} }
}); };
Signals.addSignalMethods(WeatherClient.prototype); Signals.addSignalMethods(WeatherClient.prototype);

View File

@@ -4,7 +4,6 @@ const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Soup = imports.gi.Soup; const Soup = imports.gi.Soup;
const WebKit = imports.gi.WebKit2; const WebKit = imports.gi.WebKit2;
@@ -33,12 +32,10 @@ const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
const HelperDBusInterface = loadInterfaceXML('org.gnome.Shell.PortalHelper'); const HelperDBusInterface = loadInterfaceXML('org.gnome.Shell.PortalHelper');
var PortalHeaderBar = new Lang.Class({ var PortalHeaderBar = GObject.registerClass(
Name: 'PortalHeaderBar', class PortalHeaderBar extends Gtk.HeaderBar {
Extends: Gtk.HeaderBar,
_init() { _init() {
this.parent({ show_close_button: true }); super._init({ show_close_button: true });
// See ephy-title-box.c in epiphany for the layout // See ephy-title-box.c in epiphany for the layout
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
@@ -73,11 +70,11 @@ var PortalHeaderBar = new Lang.Class({
hbox.add(this.subtitleLabel); hbox.add(this.subtitleLabel);
vbox.show_all(); vbox.show_all();
}, }
setSubtitle(label) { setSubtitle(label) {
this.subtitleLabel.set_text(label); this.subtitleLabel.set_text(label);
}, }
setSecurityIcon(securityLevel) { setSecurityIcon(securityLevel) {
switch (securityLevel) { switch (securityLevel) {
@@ -95,15 +92,13 @@ var PortalHeaderBar = new Lang.Class({
this._lockImage.set_tooltip_text(_('Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby.')); this._lockImage.set_tooltip_text(_('Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby.'));
break; break;
} }
}, }
}); });
var PortalWindow = new Lang.Class({ var PortalWindow = GObject.registerClass(
Name: 'PortalWindow', class PortalWindow extends Gtk.ApplicationWindow {
Extends: Gtk.ApplicationWindow,
_init(application, url, timestamp, doneCallback) { _init(application, url, timestamp, doneCallback) {
this.parent({ application: application }); super._init({ application: application });
this.connect('delete-event', this.destroyWindow.bind(this)); this.connect('delete-event', this.destroyWindow.bind(this));
this._headerBar = new PortalHeaderBar(); this._headerBar = new PortalHeaderBar();
@@ -144,11 +139,11 @@ var PortalWindow = new Lang.Class({
this.present_with_time(timestamp); this.present_with_time(timestamp);
this.application.set_accels_for_action('app.quit', ['<Primary>q', '<Primary>w']); this.application.set_accels_for_action('app.quit', ['<Primary>q', '<Primary>w']);
}, }
destroyWindow() { destroyWindow() {
this.destroy(); this.destroy();
}, }
_syncUri() { _syncUri() {
let uri = this._webView.uri; let uri = this._webView.uri;
@@ -156,12 +151,12 @@ var PortalWindow = new Lang.Class({
this._headerBar.setSubtitle(GLib.uri_unescape_string(uri, null)); this._headerBar.setSubtitle(GLib.uri_unescape_string(uri, null));
else else
this._headerBar.setSubtitle(''); this._headerBar.setSubtitle('');
}, }
refresh() { refresh() {
this._everSeenRedirect = false; this._everSeenRedirect = false;
this._webView.load_uri(this._originalUrl); this._webView.load_uri(this._originalUrl);
}, }
vfunc_delete_event(event) { vfunc_delete_event(event) {
if (this._recheckAtExit) if (this._recheckAtExit)
@@ -169,7 +164,7 @@ var PortalWindow = new Lang.Class({
else else
this._doneCallback(PortalHelperResult.CANCELLED); this._doneCallback(PortalHelperResult.CANCELLED);
return false; return false;
}, }
_onLoadChanged(view, loadEvent) { _onLoadChanged(view, loadEvent) {
if (loadEvent == WebKit.LoadEvent.STARTED) { if (loadEvent == WebKit.LoadEvent.STARTED) {
@@ -183,11 +178,11 @@ var PortalWindow = new Lang.Class({
else else
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE); this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
} }
}, }
_onInsecureContentDetected() { _onInsecureContentDetected() {
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE); this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
}, }
_onLoadFailedWithTlsErrors(view, failingURI, certificate, errors) { _onLoadFailedWithTlsErrors(view, failingURI, certificate, errors) {
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE); this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
@@ -195,7 +190,7 @@ var PortalWindow = new Lang.Class({
this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host()); this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host());
this._webView.load_uri(failingURI); this._webView.load_uri(failingURI);
return true; return true;
}, }
_onDecidePolicy(view, decision, type) { _onDecidePolicy(view, decision, type) {
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) { if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
@@ -262,15 +257,13 @@ var PortalWindow = new Lang.Class({
decision.use(); decision.use();
return true; return true;
}, }
}); });
var WebPortalHelper = new Lang.Class({ var WebPortalHelper = GObject.registerClass(
Name: 'WebPortalHelper', class WebPortalHelper extends Gtk.Application {
Extends: Gtk.Application,
_init() { _init() {
this.parent({ application_id: 'org.gnome.Shell.PortalHelper', super._init({ application_id: 'org.gnome.Shell.PortalHelper',
flags: Gio.ApplicationFlags.IS_SERVICE, flags: Gio.ApplicationFlags.IS_SERVICE,
inactivity_timeout: 30000 }); inactivity_timeout: 30000 });
@@ -280,30 +273,30 @@ var WebPortalHelper = new Lang.Class({
let action = new Gio.SimpleAction({ name: 'quit' }); let action = new Gio.SimpleAction({ name: 'quit' });
action.connect('activate', () => { this.active_window.destroyWindow(); }); action.connect('activate', () => { this.active_window.destroyWindow(); });
this.add_action(action); this.add_action(action);
}, }
vfunc_dbus_register(connection, path) { vfunc_dbus_register(connection, path) {
this._dbusImpl.export(connection, path); this._dbusImpl.export(connection, path);
this.parent(connection, path); super.vfunc_dbus_register(connection, path);
return true; return true;
}, }
vfunc_dbus_unregister(connection, path) { vfunc_dbus_unregister(connection, path) {
this._dbusImpl.unexport_from_connection(connection); this._dbusImpl.unexport_from_connection(connection);
this.parent(connection, path); super.vfunc_dbus_unregister(connection, path);
}, }
vfunc_activate() { vfunc_activate() {
// If launched manually (for example for testing), force a dummy authentication // If launched manually (for example for testing), force a dummy authentication
// session with the default url // session with the default url
this.Authenticate('/org/gnome/dummy', '', 0); this.Authenticate('/org/gnome/dummy', '', 0);
}, }
Authenticate(connection, url, timestamp) { Authenticate(connection, url, timestamp) {
this._queue.push({ connection: connection, url: url, timestamp: timestamp }); this._queue.push({ connection: connection, url: url, timestamp: timestamp });
this._processQueue(); this._processQueue();
}, }
Close(connection) { Close(connection) {
for (let i = 0; i < this._queue.length; i++) { for (let i = 0; i < this._queue.length; i++) {
@@ -318,7 +311,7 @@ var WebPortalHelper = new Lang.Class({
} }
this._processQueue(); this._processQueue();
}, }
Refresh(connection) { Refresh(connection) {
for (let i = 0; i < this._queue.length; i++) { for (let i = 0; i < this._queue.length; i++) {
@@ -330,7 +323,7 @@ var WebPortalHelper = new Lang.Class({
break; break;
} }
} }
}, }
_processQueue() { _processQueue() {
if (this._queue.length == 0) if (this._queue.length == 0)
@@ -343,7 +336,7 @@ var WebPortalHelper = new Lang.Class({
top.window = new PortalWindow(this, top.url, top.timestamp, result => { top.window = new PortalWindow(this, top.url, top.timestamp, result => {
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result])); this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
}); });
}, }
}); });
function initEnvironment() { function initEnvironment() {

View File

@@ -1,7 +1,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -21,12 +20,9 @@ var DialogResponse = {
CLOSED: 2 CLOSED: 2
}; };
var AccessDialog = new Lang.Class({ var AccessDialog = class extends ModalDialog.ModalDialog {
Name: 'AccessDialog', constructor(invocation, handle, title, subtitle, body, options) {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'access-dialog' });
_init(invocation, handle, title, subtitle, body, options) {
this.parent({ styleClass: 'access-dialog' });
this._invocation = invocation; this._invocation = invocation;
this._handle = handle; this._handle = handle;
@@ -38,7 +34,7 @@ var AccessDialog = new Lang.Class({
options[option] = options[option].deep_unpack(); options[option] = options[option].deep_unpack();
this._buildLayout(title, subtitle, body, options); this._buildLayout(title, subtitle, body, options);
}, }
_buildLayout(title, subtitle, body, options) { _buildLayout(title, subtitle, body, options) {
// No support for non-modal system dialogs, so ignore the option // No support for non-modal system dialogs, so ignore the option
@@ -78,14 +74,14 @@ var AccessDialog = new Lang.Class({
action: () => { action: () => {
this._sendResponse(DialogResponse.OK); this._sendResponse(DialogResponse.OK);
}}); }});
}, }
open() { open() {
this.parent(); super.open();
let connection = this._invocation.get_connection(); let connection = this._invocation.get_connection();
this._requestExported = this._request.export(connection, this._handle); this._requestExported = this._request.export(connection, this._handle);
}, }
CloseAsync(invocation, params) { CloseAsync(invocation, params) {
if (this._invocation.get_sender() != invocation.get_sender()) { if (this._invocation.get_sender() != invocation.get_sender()) {
@@ -96,7 +92,7 @@ var AccessDialog = new Lang.Class({
} }
this._sendResponse(DialogResponse.CLOSED); this._sendResponse(DialogResponse.CLOSED);
}, }
_sendResponse(response) { _sendResponse(response) {
if (this._requestExported) if (this._requestExported)
@@ -118,12 +114,10 @@ var AccessDialog = new Lang.Class({
}); });
this.close(); this.close();
} }
}); };
var AccessDialogDBus = new Lang.Class({ var AccessDialogDBus = class {
Name: 'AccessDialogDBus', constructor() {
_init() {
this._accessDialog = null; this._accessDialog = null;
this._windowTracker = Shell.WindowTracker.get_default(); this._windowTracker = Shell.WindowTracker.get_default();
@@ -132,7 +126,7 @@ var AccessDialogDBus = new Lang.Class({
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop'); this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop');
Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, }
AccessDialogAsync(params, invocation) { AccessDialogAsync(params, invocation) {
if (this._accessDialog) { if (this._accessDialog) {
@@ -160,4 +154,4 @@ var AccessDialogDBus = new Lang.Class({
this._accessDialog = dialog; this._accessDialog = dialog;
} }
}); };

View File

@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -59,12 +58,10 @@ function getWindows(workspace) {
}).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i); }).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i);
} }
var AppSwitcherPopup = new Lang.Class({ var AppSwitcherPopup = GObject.registerClass(
Name: 'AppSwitcherPopup', class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
Extends: SwitcherPopup.SwitcherPopup,
_init() { _init() {
this.parent(); super._init();
this._thumbnails = null; this._thumbnails = null;
this._thumbnailTimeoutId = 0; this._thumbnailTimeoutId = 0;
@@ -79,10 +76,10 @@ var AppSwitcherPopup = new Lang.Class({
this._switcherList = new AppSwitcher(apps, this); this._switcherList = new AppSwitcher(apps, this);
this._items = this._switcherList.icons; this._items = this._switcherList.icons;
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.parent(box, flags); super.vfunc_allocate(box, flags);
// Allocate the thumbnails // Allocate the thumbnails
// We try to avoid overflowing the screen so we base the resulting size on // We try to avoid overflowing the screen so we base the resulting size on
@@ -117,7 +114,7 @@ var AppSwitcherPopup = new Lang.Class({
childBox.y2 = childBox.y1 + childNaturalHeight; childBox.y2 = childBox.y1 + childNaturalHeight;
this._thumbnails.allocate(childBox, flags); this._thumbnails.allocate(childBox, flags);
} }
}, }
_initialSelection(backward, binding) { _initialSelection(backward, binding) {
if (binding == 'switch-group') { if (binding == 'switch-group') {
@@ -140,7 +137,7 @@ var AppSwitcherPopup = new Lang.Class({
} else { } else {
this._select(1); this._select(1);
} }
}, }
_nextWindow() { _nextWindow() {
// We actually want the second window if we're in the unset state // We actually want the second window if we're in the unset state
@@ -148,14 +145,15 @@ var AppSwitcherPopup = new Lang.Class({
this._currentWindow = 0; this._currentWindow = 0;
return SwitcherPopup.mod(this._currentWindow + 1, return SwitcherPopup.mod(this._currentWindow + 1,
this._items[this._selectedIndex].cachedWindows.length); this._items[this._selectedIndex].cachedWindows.length);
}, }
_previousWindow() { _previousWindow() {
// Also assume second window here // Also assume second window here
if (this._currentWindow == -1) if (this._currentWindow == -1)
this._currentWindow = 1; this._currentWindow = 1;
return SwitcherPopup.mod(this._currentWindow - 1, return SwitcherPopup.mod(this._currentWindow - 1,
this._items[this._selectedIndex].cachedWindows.length); this._items[this._selectedIndex].cachedWindows.length);
}, }
_closeAppWindow(appIndex, windowIndex) { _closeAppWindow(appIndex, windowIndex) {
let appIcon = this._items[appIndex]; let appIcon = this._items[appIndex];
@@ -167,7 +165,7 @@ var AppSwitcherPopup = new Lang.Class({
return; return;
window.delete(global.get_current_time()); window.delete(global.get_current_time());
}, }
_quitApplication(appIndex) { _quitApplication(appIndex) {
let appIcon = this._items[appIndex]; let appIcon = this._items[appIndex];
@@ -175,7 +173,7 @@ var AppSwitcherPopup = new Lang.Class({
return; return;
appIcon.app.request_quit(); appIcon.app.request_quit();
}, }
_keyPressHandler(keysym, action) { _keyPressHandler(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_GROUP) { if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
@@ -214,7 +212,7 @@ var AppSwitcherPopup = new Lang.Class({
} }
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_scrollHandler(direction) { _scrollHandler(direction) {
if (direction == Clutter.ScrollDirection.UP) { if (direction == Clutter.ScrollDirection.UP) {
@@ -244,7 +242,7 @@ var AppSwitcherPopup = new Lang.Class({
this._select(this._next()); this._select(this._next());
} }
} }
}, }
_itemActivatedHandler(n) { _itemActivatedHandler(n) {
// If the user clicks on the selected app, activate the // If the user clicks on the selected app, activate the
@@ -254,24 +252,24 @@ var AppSwitcherPopup = new Lang.Class({
this._select(n, this._currentWindow); this._select(n, this._currentWindow);
else else
this._select(n); this._select(n);
}, }
_itemEnteredHandler(n) { _itemEnteredHandler(n) {
this._select(n); this._select(n);
}, }
_windowActivated(thumbnailList, n) { _windowActivated(thumbnailList, n) {
let appIcon = this._items[this._selectedIndex]; let appIcon = this._items[this._selectedIndex];
Main.activateWindow(appIcon.cachedWindows[n]); Main.activateWindow(appIcon.cachedWindows[n]);
this.fadeAndDestroy(); this.fadeAndDestroy();
}, }
_windowEntered(thumbnailList, n) { _windowEntered(thumbnailList, n) {
if (!this.mouseActive) if (!this.mouseActive)
return; return;
this._select(this._selectedIndex, n); this._select(this._selectedIndex, n);
}, }
_windowRemoved(thumbnailList, n) { _windowRemoved(thumbnailList, n) {
let appIcon = this._items[this._selectedIndex]; let appIcon = this._items[this._selectedIndex];
@@ -282,7 +280,7 @@ var AppSwitcherPopup = new Lang.Class({
let newIndex = Math.min(n, appIcon.cachedWindows.length - 1); let newIndex = Math.min(n, appIcon.cachedWindows.length - 1);
this._select(this._selectedIndex, newIndex); this._select(this._selectedIndex, newIndex);
} }
}, }
_finish(timestamp) { _finish(timestamp) {
let appIcon = this._items[this._selectedIndex]; let appIcon = this._items[this._selectedIndex];
@@ -291,17 +289,17 @@ var AppSwitcherPopup = new Lang.Class({
else if (appIcon.cachedWindows[this._currentWindow]) else if (appIcon.cachedWindows[this._currentWindow])
Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp); Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp);
this.parent(); super._finish(timestamp);
}, }
_onDestroy() { _onDestroy() {
this.parent(); super._onDestroy();
if (this._thumbnails) if (this._thumbnails)
this._destroyThumbnails(); this._destroyThumbnails();
if (this._thumbnailTimeoutId != 0) if (this._thumbnailTimeoutId != 0)
Mainloop.source_remove(this._thumbnailTimeoutId); Mainloop.source_remove(this._thumbnailTimeoutId);
}, }
/** /**
* _select: * _select:
@@ -357,7 +355,7 @@ var AppSwitcherPopup = new Lang.Class({
this._timeoutPopupThumbnails.bind(this)); this._timeoutPopupThumbnails.bind(this));
GLib.Source.set_name_by_id(this._thumbnailTimeoutId, '[gnome-shell] this._timeoutPopupThumbnails'); GLib.Source.set_name_by_id(this._thumbnailTimeoutId, '[gnome-shell] this._timeoutPopupThumbnails');
} }
}, }
_timeoutPopupThumbnails() { _timeoutPopupThumbnails() {
if (!this._thumbnails) if (!this._thumbnails)
@@ -365,7 +363,7 @@ var AppSwitcherPopup = new Lang.Class({
this._thumbnailTimeoutId = 0; this._thumbnailTimeoutId = 0;
this._thumbnailsFocused = false; this._thumbnailsFocused = false;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_destroyThumbnails() { _destroyThumbnails() {
let thumbnailsActor = this._thumbnails; let thumbnailsActor = this._thumbnails;
@@ -379,9 +377,9 @@ var AppSwitcherPopup = new Lang.Class({
} }
}); });
this._thumbnails = null; this._thumbnails = null;
if (this._switcherList._items[this._selectedIndex]) if (this._switcherList._items[this._selectedIndex])
this._switcherList._items[this._selectedIndex].remove_accessible_state (Atk.StateType.EXPANDED); this._switcherList._items[this._selectedIndex].remove_accessible_state (Atk.StateType.EXPANDED);
}, }
_createThumbnails() { _createThumbnails() {
this._thumbnails = new ThumbnailList (this._items[this._selectedIndex].cachedWindows); this._thumbnails = new ThumbnailList (this._items[this._selectedIndex].cachedWindows);
@@ -411,10 +409,8 @@ var AppSwitcherPopup = new Lang.Class({
} }
}); });
var CyclerHighlight = new Lang.Class({ class CyclerHighlight {
Name: 'CyclerHighlight', constructor() {
_init() {
this._window = null; this._window = null;
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout() }); this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout() });
@@ -434,7 +430,7 @@ var CyclerHighlight = new Lang.Class({
this.actor.connect('notify::allocation', this.actor.connect('notify::allocation',
this._onAllocationChanged.bind(this)); this._onAllocationChanged.bind(this));
this.actor.connect('destroy', this._onDestroy.bind(this)); this.actor.connect('destroy', this._onDestroy.bind(this));
}, }
set window(w) { set window(w) {
if (this._window == w) if (this._window == w)
@@ -452,7 +448,7 @@ var CyclerHighlight = new Lang.Class({
windowActor.hide(); windowActor.hide();
this._clone.source = windowActor; this._clone.source = windowActor;
}, }
_onAllocationChanged() { _onAllocationChanged() {
if (!this._window) { if (!this._window) {
@@ -465,35 +461,33 @@ var CyclerHighlight = new Lang.Class({
this._highlight.set_position(rect.x - x, rect.y - y); this._highlight.set_position(rect.x - x, rect.y - y);
this._highlight.show(); this._highlight.show();
} }
}, }
_onDestroy() { _onDestroy() {
this.window = null; this.window = null;
} }
}); };
// We don't show an actual popup, so just provide what SwitcherPopup // We don't show an actual popup, so just provide what SwitcherPopup
// expects instead of inheriting from SwitcherList // expects instead of inheriting from SwitcherList
var CyclerList = new Lang.Class({ var CyclerList = GObject.registerClass({
Name: 'CyclerList',
Extends: St.Widget,
Signals: { 'item-activated': { param_types: [GObject.TYPE_INT] }, Signals: { 'item-activated': { param_types: [GObject.TYPE_INT] },
'item-entered': { param_types: [GObject.TYPE_INT] }, 'item-entered': { param_types: [GObject.TYPE_INT] },
'item-removed': { param_types: [GObject.TYPE_INT] }, 'item-removed': { param_types: [GObject.TYPE_INT] },
'item-highlighted': { param_types: [GObject.TYPE_INT] } }, 'item-highlighted': { param_types: [GObject.TYPE_INT] } },
}, class CyclerList extends St.Widget {
highlight(index, justOutline) { highlight(index, justOutline) {
this.emit('item-highlighted', index); this.emit('item-highlighted', index);
} }
}); });
var CyclerPopup = new Lang.Class({ var CyclerPopup = GObject.registerClass(
Name: 'CyclerPopup', class CyclerPopup extends SwitcherPopup.SwitcherPopup {
Extends: SwitcherPopup.SwitcherPopup,
Abstract: true,
_init() { _init() {
this.parent(); if (new.target === CyclerPopup)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
super._init();
this._items = this._getWindows(); this._items = this._getWindows();
@@ -507,12 +501,12 @@ var CyclerPopup = new Lang.Class({
this._switcherList.connect('item-highlighted', (list, index) => { this._switcherList.connect('item-highlighted', (list, index) => {
this._highlightItem(index); this._highlightItem(index);
}); });
}, }
_highlightItem(index, justOutline) { _highlightItem(index, justOutline) {
this._highlight.window = this._items[index]; this._highlight.window = this._items[index];
global.window_group.set_child_above_sibling(this._highlight.actor, null); global.window_group.set_child_above_sibling(this._highlight.actor, null);
}, }
_finish() { _finish() {
let window = this._items[this._selectedIndex]; let window = this._items[this._selectedIndex];
@@ -537,25 +531,23 @@ var CyclerPopup = new Lang.Class({
Main.wm.actionMoveWindow(window, ws); Main.wm.actionMoveWindow(window, ws);
} }
this.parent(); super._finish();
}, }
_onDestroy() { _onDestroy() {
this._highlight.actor.destroy(); this._highlight.actor.destroy();
this.parent(); super._onDestroy();
} }
}); });
var GroupCyclerPopup = new Lang.Class({ var GroupCyclerPopup = GObject.registerClass(
Name: 'GroupCyclerPopup', class GroupCyclerPopup extends CyclerPopup {
Extends: CyclerPopup,
_getWindows() { _getWindows() {
let app = Shell.WindowTracker.get_default().focus_app; let app = Shell.WindowTracker.get_default().focus_app;
return app ? app.get_windows() : []; return app ? app.get_windows() : [];
}, }
_keyPressHandler(keysym, action) { _keyPressHandler(keysym, action) {
if (action == Meta.KeyBindingAction.CYCLE_GROUP) if (action == Meta.KeyBindingAction.CYCLE_GROUP)
@@ -569,12 +561,10 @@ var GroupCyclerPopup = new Lang.Class({
} }
}); });
var WindowSwitcherPopup = new Lang.Class({ var WindowSwitcherPopup = GObject.registerClass(
Name: 'WindowSwitcherPopup', class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
Extends: SwitcherPopup.SwitcherPopup,
_init() { _init() {
this.parent(); super._init();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
let windows = this._getWindowList(); let windows = this._getWindowList();
@@ -585,7 +575,7 @@ var WindowSwitcherPopup = new Lang.Class({
let mode = this._settings.get_enum('app-icon-mode'); let mode = this._settings.get_enum('app-icon-mode');
this._switcherList = new WindowList(windows, mode); this._switcherList = new WindowList(windows, mode);
this._items = this._switcherList.icons; this._items = this._switcherList.icons;
}, }
_getWindowList() { _getWindowList() {
let workspace = null; let workspace = null;
@@ -597,7 +587,7 @@ var WindowSwitcherPopup = new Lang.Class({
} }
return getWindows(workspace); return getWindows(workspace);
}, }
_closeWindow(windowIndex) { _closeWindow(windowIndex) {
let windowIcon = this._items[windowIndex]; let windowIcon = this._items[windowIndex];
@@ -605,7 +595,7 @@ var WindowSwitcherPopup = new Lang.Class({
return; return;
windowIcon.window.delete(global.get_current_time()); windowIcon.window.delete(global.get_current_time());
}, }
_keyPressHandler(keysym, action) { _keyPressHandler(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) { if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
@@ -624,23 +614,22 @@ var WindowSwitcherPopup = new Lang.Class({
} }
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_finish() { _finish() {
Main.activateWindow(this._items[this._selectedIndex].window); Main.activateWindow(this._items[this._selectedIndex].window);
this.parent(); super._finish();
} }
}); });
var WindowCyclerPopup = new Lang.Class({ var WindowCyclerPopup = GObject.registerClass(
Name: 'WindowCyclerPopup', class WindowCyclerPopup extends CyclerPopup {
Extends: CyclerPopup,
_init() { _init() {
super._init();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
this.parent(); }
},
_getWindows() { _getWindows() {
let workspace = null; let workspace = null;
@@ -652,7 +641,7 @@ var WindowCyclerPopup = new Lang.Class({
} }
return getWindows(workspace); return getWindows(workspace);
}, }
_keyPressHandler(keysym, action) { _keyPressHandler(keysym, action) {
if (action == Meta.KeyBindingAction.CYCLE_WINDOWS) if (action == Meta.KeyBindingAction.CYCLE_WINDOWS)
@@ -666,12 +655,10 @@ var WindowCyclerPopup = new Lang.Class({
} }
}); });
var AppIcon = new Lang.Class({ var AppIcon = GObject.registerClass(
Name: 'AppIcon', class AppIcon extends St.BoxLayout {
Extends: St.BoxLayout,
_init(app) { _init(app) {
this.parent({ style_class: 'alt-tab-app', super._init({ style_class: 'alt-tab-app',
vertical: true }); vertical: true });
this.app = app; this.app = app;
@@ -681,28 +668,26 @@ var AppIcon = new Lang.Class({
this.add(this._iconBin, { x_fill: false, y_fill: false } ); this.add(this._iconBin, { x_fill: false, y_fill: false } );
this.label = new St.Label({ text: this.app.get_name() }); this.label = new St.Label({ text: this.app.get_name() });
this.add(this.label, { x_fill: false }); this.add(this.label, { x_fill: false });
}, }
set_size(size) { set_size(size) {
this.icon = this.app.create_icon_texture(size); this.icon = this.app.create_icon_texture(size);
this._iconBin.child = this.icon; this._iconBin.child = this.icon;
this._iconBin.set_size(size, size); this._iconBin.set_size(size, size);
}, }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
let [minWidth, ] = this.parent(forHeight); let [minWidth, ] = super.vfunc_get_preferred_width(forHeight);
minWidth = Math.max(minWidth, forHeight); minWidth = Math.max(minWidth, forHeight);
return [minWidth, minWidth]; return [minWidth, minWidth];
} }
}); });
var AppSwitcher = new Lang.Class({ var AppSwitcher = GObject.registerClass(
Name: 'AppSwitcher', class AppSwitcher extends SwitcherPopup.SwitcherList {
Extends: SwitcherPopup.SwitcherList,
_init(apps, altTabPopup) { _init(apps, altTabPopup) {
this.parent(true); super._init(true);
this.icons = []; this.icons = [];
this._arrows = []; this._arrows = [];
@@ -736,7 +721,7 @@ var AppSwitcher = new Lang.Class({
this._mouseTimeOutId = 0; this._mouseTimeOutId = 0;
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
}, }
_onDestroy() { _onDestroy() {
if (this._mouseTimeOutId != 0) if (this._mouseTimeOutId != 0)
@@ -745,7 +730,7 @@ var AppSwitcher = new Lang.Class({
this.icons.forEach(icon => { this.icons.forEach(icon => {
icon.app.disconnect(icon._stateChangedId); icon.app.disconnect(icon._stateChangedId);
}); });
}, }
_setIconSize() { _setIconSize() {
let j = 0; let j = 0;
@@ -786,16 +771,16 @@ var AppSwitcher = new Lang.Class({
break; break;
this.icons[i].set_size(iconSize); this.icons[i].set_size(iconSize);
} }
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
this._setIconSize(); this._setIconSize();
return this.parent(forWidth); return super.vfunc_get_preferred_height(forWidth);
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
// Allocate the main list items // Allocate the main list items
this.parent(box, flags); super.vfunc_allocate(box, flags);
let contentBox = this.get_theme_node().get_content_box(box); let contentBox = this.get_theme_node().get_content_box(box);
@@ -812,7 +797,7 @@ var AppSwitcher = new Lang.Class({
childBox.y2 = childBox.y1 + arrowHeight; childBox.y2 = childBox.y1 + arrowHeight;
this._arrows[i].allocate(childBox, flags); this._arrows[i].allocate(childBox, flags);
} }
}, }
// We override SwitcherList's _onItemEnter method to delay // We override SwitcherList's _onItemEnter method to delay
// activation when the thumbnail list is open // activation when the thumbnail list is open
@@ -829,14 +814,14 @@ var AppSwitcher = new Lang.Class({
GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem'); GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
} else } else
this._itemEntered(index); this._itemEntered(index);
}, }
_enterItem(index) { _enterItem(index) {
let [x, y, mask] = global.get_pointer(); let [x, y, mask] = global.get_pointer();
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
if (this._items[index].contains(pickedActor)) if (this._items[index].contains(pickedActor))
this._itemEntered(index); this._itemEntered(index);
}, }
// We override SwitcherList's highlight() method to also deal with // We override SwitcherList's highlight() method to also deal with
// the AppSwitcher->ThumbnailList arrows. Apps with only 1 window // the AppSwitcher->ThumbnailList arrows. Apps with only 1 window
@@ -853,7 +838,7 @@ var AppSwitcher = new Lang.Class({
this._arrows[this._curApp].remove_style_pseudo_class('highlighted'); this._arrows[this._curApp].remove_style_pseudo_class('highlighted');
} }
this.parent(n, justOutline); super.highlight(n, justOutline);
this._curApp = n; this._curApp = n;
if (this._curApp != -1) { if (this._curApp != -1) {
@@ -862,7 +847,7 @@ var AppSwitcher = new Lang.Class({
else else
this._arrows[this._curApp].add_style_pseudo_class('highlighted'); this._arrows[this._curApp].add_style_pseudo_class('highlighted');
} }
}, }
_addIcon(appIcon) { _addIcon(appIcon) {
this.icons.push(appIcon); this.icons.push(appIcon);
@@ -883,7 +868,7 @@ var AppSwitcher = new Lang.Class({
arrow.hide(); arrow.hide();
else else
item.add_accessible_state (Atk.StateType.EXPANDABLE); item.add_accessible_state (Atk.StateType.EXPANDABLE);
}, }
_removeIcon(app) { _removeIcon(app) {
let index = this.icons.findIndex(icon => { let index = this.icons.findIndex(icon => {
@@ -894,15 +879,13 @@ var AppSwitcher = new Lang.Class({
this.icons.splice(index, 1); this.icons.splice(index, 1);
this.removeItem(index); this.removeItem(index);
}, }
}); });
var ThumbnailList = new Lang.Class({ var ThumbnailList = GObject.registerClass(
Name: 'ThumbnailList', class ThumbnailList extends SwitcherPopup.SwitcherList {
Extends: SwitcherPopup.SwitcherList,
_init(windows) { _init(windows) {
this.parent(false); super._init(false);
this._labels = new Array(); this._labels = new Array();
this._thumbnailBins = new Array(); this._thumbnailBins = new Array();
@@ -935,7 +918,7 @@ var ThumbnailList = new Lang.Class({
} }
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
}, }
addClones(availHeight) { addClones(availHeight) {
if (!this._thumbnailBins.length) if (!this._thumbnailBins.length)
@@ -968,7 +951,7 @@ var ThumbnailList = new Lang.Class({
// Make sure we only do this once // Make sure we only do this once
this._thumbnailBins = new Array(); this._thumbnailBins = new Array();
}, }
_removeThumbnail(source, clone) { _removeThumbnail(source, clone) {
let index = this._clones.indexOf(clone); let index = this._clones.indexOf(clone);
@@ -984,23 +967,20 @@ var ThumbnailList = new Lang.Class({
this.highlight(SwitcherPopup.mod(index, this._clones.length)); this.highlight(SwitcherPopup.mod(index, this._clones.length));
else else
this.destroy(); this.destroy();
}, }
_onDestroy() { _onDestroy() {
this._clones.forEach(clone => { this._clones.forEach(clone => {
if (clone.source) if (clone.source)
clone.source.disconnect(clone._destroyId); clone.source.disconnect(clone._destroyId);
}); });
}, }
}); });
var WindowIcon = new Lang.Class({ var WindowIcon = GObject.registerClass(
Name: 'WindowIcon', class WindowIcon extends St.BoxLayout {
Extends: St.BoxLayout,
_init(window, mode) { _init(window, mode) {
this.parent({ style_class: 'alt-tab-app', super._init({ style_class: 'alt-tab-app',
vertical: true }); vertical: true });
this.window = window; this.window = window;
@@ -1041,7 +1021,7 @@ var WindowIcon = new Lang.Class({
} }
this._icon.set_size(size * scaleFactor, size * scaleFactor); this._icon.set_size(size * scaleFactor, size * scaleFactor);
}, }
_createAppIcon(app, size) { _createAppIcon(app, size) {
let appIcon = app ? app.create_icon_texture(size) let appIcon = app ? app.create_icon_texture(size)
@@ -1054,12 +1034,10 @@ var WindowIcon = new Lang.Class({
} }
}); });
var WindowList = new Lang.Class({ var WindowList = GObject.registerClass(
Name: 'WindowList', class WindowList extends SwitcherPopup.SwitcherList {
Extends: SwitcherPopup.SwitcherList,
_init(windows, mode) { _init(windows, mode) {
this.parent(true); super._init(true);
this._label = new St.Label({ x_align: Clutter.ActorAlign.CENTER, this._label = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
@@ -1081,16 +1059,16 @@ var WindowList = new Lang.Class({
} }
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
}, }
_onDestroy() { _onDestroy() {
this.icons.forEach(icon => { this.icons.forEach(icon => {
icon.window.disconnect(icon._unmanagedSignalId); icon.window.disconnect(icon._unmanagedSignalId);
}); });
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
let [minHeight, natHeight] = this.parent(forWidth); let [minHeight, natHeight] = super.vfunc_get_preferred_height(forWidth);
let spacing = this.get_theme_node().get_padding(St.Side.BOTTOM); let spacing = this.get_theme_node().get_padding(St.Side.BOTTOM);
let [labelMin, labelNat] = this._label.get_preferred_height(-1); let [labelMin, labelNat] = this._label.get_preferred_height(-1);
@@ -1099,7 +1077,7 @@ var WindowList = new Lang.Class({
natHeight += labelNat + spacing; natHeight += labelNat + spacing;
return [minHeight, natHeight]; return [minHeight, natHeight];
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -1117,19 +1095,19 @@ var WindowList = new Lang.Class({
childBox.x2 = box.x2; childBox.x2 = box.x2;
childBox.y1 = box.y1; childBox.y1 = box.y1;
childBox.y2 = box.y2 - totalLabelHeight; childBox.y2 = box.y2 - totalLabelHeight;
this.parent(childBox, flags); super.vfunc_allocate(childBox, flags);
// Hooking up the parent vfunc will call this.set_allocation() with // Hooking up the parent vfunc will call this.set_allocation() with
// the height without the label height, so call it again with the // the height without the label height, so call it again with the
// correct size here. // correct size here.
this.set_allocation(box, flags); this.set_allocation(box, flags);
}, }
highlight(index, justOutline) { highlight(index, justOutline) {
this.parent(index, justOutline); super.highlight(index, justOutline);
this._label.set_text(index == -1 ? '' : this.icons[index].label.text); this._label.set_text(index == -1 ? '' : this.icons[index].label.text);
}, }
_removeWindow(window) { _removeWindow(window) {
let index = this.icons.findIndex(icon => { let index = this.icons.findIndex(icon => {

View File

@@ -1,18 +1,20 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const Gio = imports.gi.Gio;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const St = imports.gi.St; const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Tweener = imports.ui.tweener;
var ANIMATED_ICON_UPDATE_TIMEOUT = 16; var ANIMATED_ICON_UPDATE_TIMEOUT = 16;
var SPINNER_ANIMATION_TIME = 0.3;
var SPINNER_ANIMATION_DELAY = 1.0;
var Animation = new Lang.Class({ var Animation = class {
Name: 'Animation', constructor(file, width, height, speed) {
_init(file, width, height, speed) {
this.actor = new St.Bin(); this.actor = new St.Bin();
this.actor.connect('destroy', this._onDestroy.bind(this)); this.actor.connect('destroy', this._onDestroy.bind(this));
this._speed = speed; this._speed = speed;
@@ -26,7 +28,7 @@ var Animation = new Lang.Class({
this._animations = St.TextureCache.get_default().load_sliced_image (file, width, height, scaleFactor, this._animations = St.TextureCache.get_default().load_sliced_image (file, width, height, scaleFactor,
this._animationsLoaded.bind(this)); this._animationsLoaded.bind(this));
this.actor.set_child(this._animations); this.actor.set_child(this._animations);
}, }
play() { play() {
if (this._isLoaded && this._timeoutId == 0) { if (this._isLoaded && this._timeoutId == 0) {
@@ -38,7 +40,7 @@ var Animation = new Lang.Class({
} }
this._isPlaying = true; this._isPlaying = true;
}, }
stop() { stop() {
if (this._timeoutId > 0) { if (this._timeoutId > 0) {
@@ -47,7 +49,7 @@ var Animation = new Lang.Class({
} }
this._isPlaying = false; this._isPlaying = false;
}, }
_showFrame(frame) { _showFrame(frame) {
let oldFrameActor = this._animations.get_child_at_index(this._frame); let oldFrameActor = this._animations.get_child_at_index(this._frame);
@@ -59,30 +61,77 @@ var Animation = new Lang.Class({
let newFrameActor = this._animations.get_child_at_index(this._frame); let newFrameActor = this._animations.get_child_at_index(this._frame);
if (newFrameActor) if (newFrameActor)
newFrameActor.show(); newFrameActor.show();
}, }
_update() { _update() {
this._showFrame(this._frame + 1); this._showFrame(this._frame + 1);
return GLib.SOURCE_CONTINUE; return GLib.SOURCE_CONTINUE;
}, }
_animationsLoaded() { _animationsLoaded() {
this._isLoaded = this._animations.get_n_children() > 0; this._isLoaded = this._animations.get_n_children() > 0;
if (this._isPlaying) if (this._isPlaying)
this.play(); this.play();
}, }
_onDestroy() { _onDestroy() {
this.stop(); this.stop();
} }
}); };
var AnimatedIcon = new Lang.Class({ var AnimatedIcon = class extends Animation {
Name: 'AnimatedIcon', constructor(file, size) {
Extends: Animation, super(file, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
_init(file, size) {
this.parent(file, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
} }
}); };
var Spinner = class extends AnimatedIcon {
constructor(size, animate=false) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
super(file, size);
this.actor.opacity = 0;
this._animate = animate;
}
_onDestroy() {
this._animate = false;
super._onDestroy();
}
play() {
Tweener.removeTweens(this.actor);
if (this._animate) {
super.play();
Tweener.addTween(this.actor, {
opacity: 255,
delay: SPINNER_ANIMATION_DELAY,
time: SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
this.actor.opacity = 255;
super.play();
}
}
stop() {
Tweener.removeTweens(this.actor);
if (this._animate) {
Tweener.addTween(this.actor, {
opacity: 0,
time: SPINNER_ANIMATION_TIME,
transition: 'linear',
onComplete: () => {
this.stop(false);
}
});
} else {
this.actor.opacity = 0;
super.stop();
}
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -30,6 +29,7 @@ const RENAMED_DESKTOP_IDS = {
'gnome-documents.desktop': 'org.gnome.Documents.desktop', 'gnome-documents.desktop': 'org.gnome.Documents.desktop',
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop', 'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop', 'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
'gnome-music.desktop': 'org.gnome.Music.desktop', 'gnome-music.desktop': 'org.gnome.Music.desktop',
'gnome-photos.desktop': 'org.gnome.Photos.desktop', 'gnome-photos.desktop': 'org.gnome.Photos.desktop',
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', 'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
@@ -41,27 +41,25 @@ const RENAMED_DESKTOP_IDS = {
'gnotravex.desktop': 'gnome-tetravex.desktop', 'gnotravex.desktop': 'gnome-tetravex.desktop',
'gnotski.desktop': 'gnome-klotski.desktop', 'gnotski.desktop': 'gnome-klotski.desktop',
'gtali.desktop': 'tali.desktop', 'gtali.desktop': 'tali.desktop',
'iagno.desktop': 'org.gnome.Iagno.desktop',
'nautilus.desktop': 'org.gnome.Nautilus.desktop', 'nautilus.desktop': 'org.gnome.Nautilus.desktop',
'polari.desktop': 'org.gnome.Polari.desktop', 'polari.desktop': 'org.gnome.Polari.desktop',
'totem.desktop': 'org.gnome.Totem.desktop', 'totem.desktop': 'org.gnome.Totem.desktop',
'evince.desktop': 'org.gnome.Evince.desktop', 'evince.desktop': 'org.gnome.Evince.desktop',
}; };
var AppFavorites = new Lang.Class({ class AppFavorites {
Name: 'AppFavorites', constructor() {
this.FAVORITE_APPS_KEY = 'favorite-apps';
FAVORITE_APPS_KEY: 'favorite-apps',
_init() {
this._favorites = {}; this._favorites = {};
global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, this._onFavsChanged.bind(this)); global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, this._onFavsChanged.bind(this));
this.reload(); this.reload();
}, }
_onFavsChanged() { _onFavsChanged() {
this.reload(); this.reload();
this.emit('changed'); this.emit('changed');
}, }
reload() { reload() {
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY); let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
@@ -89,29 +87,29 @@ var AppFavorites = new Lang.Class({
let app = apps[i]; let app = apps[i];
this._favorites[app.get_id()] = app; this._favorites[app.get_id()] = app;
} }
}, }
_getIds() { _getIds() {
let ret = []; let ret = [];
for (let id in this._favorites) for (let id in this._favorites)
ret.push(id); ret.push(id);
return ret; return ret;
}, }
getFavoriteMap() { getFavoriteMap() {
return this._favorites; return this._favorites;
}, }
getFavorites() { getFavorites() {
let ret = []; let ret = [];
for (let id in this._favorites) for (let id in this._favorites)
ret.push(this._favorites[id]); ret.push(this._favorites[id]);
return ret; return ret;
}, }
isFavorite(appId) { isFavorite(appId) {
return appId in this._favorites; return appId in this._favorites;
}, }
_addFavorite(appId, pos) { _addFavorite(appId, pos) {
if (appId in this._favorites) if (appId in this._favorites)
@@ -129,7 +127,7 @@ var AppFavorites = new Lang.Class({
ids.splice(pos, 0, appId); ids.splice(pos, 0, appId);
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids); global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
return true; return true;
}, }
addFavoriteAtPos(appId, pos) { addFavoriteAtPos(appId, pos) {
if (!this._addFavorite(appId, pos)) if (!this._addFavorite(appId, pos))
@@ -143,16 +141,16 @@ var AppFavorites = new Lang.Class({
this._removeFavorite(appId); this._removeFavorite(appId);
} }
}); });
}, }
addFavorite(appId) { addFavorite(appId) {
this.addFavoriteAtPos(appId, -1); this.addFavoriteAtPos(appId, -1);
}, }
moveFavoriteToPos(appId, pos) { moveFavoriteToPos(appId, pos) {
this._removeFavorite(appId); this._removeFavorite(appId);
this._addFavorite(appId, pos); this._addFavorite(appId, pos);
}, }
_removeFavorite(appId) { _removeFavorite(appId) {
if (!appId in this._favorites) if (!appId in this._favorites)
@@ -161,7 +159,7 @@ var AppFavorites = new Lang.Class({
let ids = this._getIds().filter(id => id != appId); let ids = this._getIds().filter(id => id != appId);
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids); global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
return true; return true;
}, }
removeFavorite(appId) { removeFavorite(appId) {
let ids = this._getIds(); let ids = this._getIds();
@@ -178,7 +176,7 @@ var AppFavorites = new Lang.Class({
} }
}); });
} }
}); };
Signals.addSignalMethods(AppFavorites.prototype); Signals.addSignalMethods(AppFavorites.prototype);
var appFavoritesInstance = null; var appFavoritesInstance = null;

View File

@@ -1,7 +1,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -19,12 +18,10 @@ var AudioDevice = {
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection'); const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
var AudioDeviceSelectionDialog = new Lang.Class({ var AudioDeviceSelectionDialog =
Name: 'AudioDeviceSelectionDialog', class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
Extends: ModalDialog.ModalDialog, constructor(devices) {
super({ styleClass: 'audio-device-selection-dialog' });
_init(devices) {
this.parent({ styleClass: 'audio-device-selection-dialog' });
this._deviceItems = {}; this._deviceItems = {};
@@ -39,11 +36,11 @@ var AudioDeviceSelectionDialog = new Lang.Class({
if (this._selectionBox.get_n_children() < 2) if (this._selectionBox.get_n_children() < 2)
throw new Error('Too few devices for a selection'); throw new Error('Too few devices for a selection');
}, }
destroy() { destroy() {
this.parent(); super.destroy();
}, }
_buildLayout(devices) { _buildLayout(devices) {
let title = new St.Label({ style_class: 'audio-selection-title', let title = new St.Label({ style_class: 'audio-selection-title',
@@ -56,12 +53,13 @@ var AudioDeviceSelectionDialog = new Lang.Class({
this._selectionBox = new St.BoxLayout({ style_class: 'audio-selection-box' }); this._selectionBox = new St.BoxLayout({ style_class: 'audio-selection-box' });
this.contentLayout.add(this._selectionBox, { expand: true }); this.contentLayout.add(this._selectionBox, { expand: true });
this.addButton({ action: this._openSettings.bind(this), if (Main.sessionMode.allowSettings)
label: _("Sound Settings") }); this.addButton({ action: this._openSettings.bind(this),
label: _("Sound Settings") });
this.addButton({ action: this.close.bind(this), this.addButton({ action: this.close.bind(this),
label: _("Cancel"), label: _("Cancel"),
key: Clutter.Escape }); key: Clutter.Escape });
}, }
_getDeviceLabel(device) { _getDeviceLabel(device) {
switch(device) { switch(device) {
@@ -74,7 +72,7 @@ var AudioDeviceSelectionDialog = new Lang.Class({
default: default:
return null; return null;
} }
}, }
_getDeviceIcon(device) { _getDeviceIcon(device) {
switch(device) { switch(device) {
@@ -87,7 +85,7 @@ var AudioDeviceSelectionDialog = new Lang.Class({
default: default:
return null; return null;
} }
}, }
_addDevice(device) { _addDevice(device) {
let box = new St.BoxLayout({ style_class: 'audio-selection-device-box', let box = new St.BoxLayout({ style_class: 'audio-selection-device-box',
@@ -117,7 +115,7 @@ var AudioDeviceSelectionDialog = new Lang.Class({
this.close(); this.close();
Main.overview.hide(); Main.overview.hide();
}); });
}, }
_openSettings() { _openSettings() {
let desktopFile = 'gnome-sound-panel.desktop' let desktopFile = 'gnome-sound-panel.desktop'
@@ -132,23 +130,21 @@ var AudioDeviceSelectionDialog = new Lang.Class({
Main.overview.hide(); Main.overview.hide();
app.activate(); app.activate();
} }
}); };
var AudioDeviceSelectionDBus = new Lang.Class({ var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
Name: 'AudioDeviceSelectionDBus', constructor() {
_init() {
this._audioSelectionDialog = null; this._audioSelectionDialog = null;
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection');
Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, }
_onDialogClosed() { _onDialogClosed() {
this._audioSelectionDialog = null; this._audioSelectionDialog = null;
}, }
_onDeviceSelected(dialog, device) { _onDeviceSelected(dialog, device) {
let connection = this._dbusImpl.get_connection(); let connection = this._dbusImpl.get_connection();
@@ -161,7 +157,7 @@ var AudioDeviceSelectionDBus = new Lang.Class({
info ? info.name : null, info ? info.name : null,
'DeviceSelected', 'DeviceSelected',
GLib.Variant.new('(s)', [deviceName])); GLib.Variant.new('(s)', [deviceName]));
}, }
OpenAsync(params, invocation) { OpenAsync(params, invocation) {
if (this._audioSelectionDialog) { if (this._audioSelectionDialog) {
@@ -189,7 +185,7 @@ var AudioDeviceSelectionDBus = new Lang.Class({
this._audioSelectionDialog = dialog; this._audioSelectionDialog = dialog;
invocation.return_value(null); invocation.return_value(null);
}, }
CloseAsync(params, invocation) { CloseAsync(params, invocation) {
if (this._audioSelectionDialog && if (this._audioSelectionDialog &&
@@ -198,4 +194,4 @@ var AudioDeviceSelectionDBus = new Lang.Class({
invocation.return_value(null); invocation.return_value(null);
} }
}); };

View File

@@ -98,7 +98,6 @@ const GDesktopEnums = imports.gi.GDesktopEnums;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop; const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Signals = imports.signals; const Signals = imports.signals;
@@ -138,14 +137,12 @@ function _fileEqual0(file1, file2) {
return file1.equal(file2); return file1.equal(file2);
} }
var BackgroundCache = new Lang.Class({ var BackgroundCache = class BackgroundCache {
Name: 'BackgroundCache', constructor() {
_init() {
this._fileMonitors = {}; this._fileMonitors = {};
this._backgroundSources = {}; this._backgroundSources = {};
this._animations = {}; this._animations = {};
}, }
monitorFile(file) { monitorFile(file) {
let key = file.hash(); let key = file.hash();
@@ -163,7 +160,7 @@ var BackgroundCache = new Lang.Class({
}); });
this._fileMonitors[key] = monitor; this._fileMonitors[key] = monitor;
}, }
getAnimation(params) { getAnimation(params) {
params = Params.parse(params, { file: null, params = Params.parse(params, { file: null,
@@ -195,7 +192,7 @@ var BackgroundCache = new Lang.Class({
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded'); GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
} }
}); });
}, }
getBackgroundSource(layoutManager, settingsSchema) { getBackgroundSource(layoutManager, settingsSchema) {
// The layoutManager is always the same one; we pass in it since // The layoutManager is always the same one; we pass in it since
@@ -209,7 +206,7 @@ var BackgroundCache = new Lang.Class({
} }
return this._backgroundSources[settingsSchema]; return this._backgroundSources[settingsSchema];
}, }
releaseBackgroundSource(settingsSchema) { releaseBackgroundSource(settingsSchema) {
if (settingsSchema in this._backgroundSources) { if (settingsSchema in this._backgroundSources) {
@@ -221,7 +218,7 @@ var BackgroundCache = new Lang.Class({
} }
} }
} }
}); };
Signals.addSignalMethods(BackgroundCache.prototype); Signals.addSignalMethods(BackgroundCache.prototype);
function getBackgroundCache() { function getBackgroundCache() {
@@ -230,10 +227,8 @@ function getBackgroundCache() {
return _backgroundCache; return _backgroundCache;
} }
var Background = new Lang.Class({ var Background = class Background {
Name: 'Background', constructor(params) {
_init(params) {
params = Params.parse(params, { monitorIndex: 0, params = Params.parse(params, { monitorIndex: 0,
layoutManager: Main.layoutManager, layoutManager: Main.layoutManager,
settings: null, settings: null,
@@ -272,7 +267,7 @@ var Background = new Lang.Class({
}); });
this._load(); this._load();
}, }
destroy() { destroy() {
this._cancellable.cancel(); this._cancellable.cancel();
@@ -298,12 +293,12 @@ var Background = new Lang.Class({
if (this._settingsChangedSignalId != 0) if (this._settingsChangedSignalId != 0)
this._settings.disconnect(this._settingsChangedSignalId); this._settings.disconnect(this._settingsChangedSignalId);
this._settingsChangedSignalId = 0; this._settingsChangedSignalId = 0;
}, }
updateResolution() { updateResolution() {
if (this._animation) if (this._animation)
this._refreshAnimation(); this._refreshAnimation();
}, }
_refreshAnimation() { _refreshAnimation() {
if (!this._animation) if (!this._animation)
@@ -311,7 +306,7 @@ var Background = new Lang.Class({
this._removeAnimationTimeout(); this._removeAnimationTimeout();
this._updateAnimation(); this._updateAnimation();
}, }
_setLoaded() { _setLoaded() {
if (this.isLoaded) if (this.isLoaded)
@@ -324,7 +319,7 @@ var Background = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(id, '[gnome-shell] this.emit'); GLib.Source.set_name_by_id(id, '[gnome-shell] this.emit');
}, }
_loadPattern() { _loadPattern() {
let colorString, res, color, secondColor; let colorString, res, color, secondColor;
@@ -340,7 +335,7 @@ var Background = new Lang.Class({
this.background.set_color(color); this.background.set_color(color);
else else
this.background.set_gradient(shadingType, color, secondColor); this.background.set_gradient(shadingType, color, secondColor);
}, }
_watchFile(file) { _watchFile(file) {
let key = file.hash(); let key = file.hash();
@@ -357,14 +352,14 @@ var Background = new Lang.Class({
} }
}); });
this._fileWatches[key] = signalId; this._fileWatches[key] = signalId;
}, }
_removeAnimationTimeout() { _removeAnimationTimeout() {
if (this._updateAnimationTimeoutId) { if (this._updateAnimationTimeoutId) {
GLib.source_remove(this._updateAnimationTimeoutId); GLib.source_remove(this._updateAnimationTimeoutId);
this._updateAnimationTimeoutId = 0; this._updateAnimationTimeoutId = 0;
} }
}, }
_updateAnimation() { _updateAnimation() {
this._updateAnimationTimeoutId = 0; this._updateAnimationTimeoutId = 0;
@@ -404,7 +399,7 @@ var Background = new Lang.Class({
}); });
} }
} }
}, }
_queueUpdateAnimation() { _queueUpdateAnimation() {
if (this._updateAnimationTimeoutId != 0) if (this._updateAnimationTimeoutId != 0)
@@ -433,7 +428,7 @@ var Background = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation'); GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
}, }
_loadAnimation(file) { _loadAnimation(file) {
this._cache.getAnimation({ file: file, this._cache.getAnimation({ file: file,
@@ -450,7 +445,7 @@ var Background = new Lang.Class({
this._watchFile(file); this._watchFile(file);
} }
}); });
}, }
_loadImage(file) { _loadImage(file) {
this.background.set_file(file, this._style); this.background.set_file(file, this._style);
@@ -466,14 +461,14 @@ var Background = new Lang.Class({
image.disconnect(id); image.disconnect(id);
}); });
} }
}, }
_loadFile(file) { _loadFile(file) {
if (file.get_basename().endsWith('.xml')) if (file.get_basename().endsWith('.xml'))
this._loadAnimation(file); this._loadAnimation(file);
else else
this._loadImage(file); this._loadImage(file);
}, }
_load() { _load() {
this._cache = getBackgroundCache(); this._cache = getBackgroundCache();
@@ -486,16 +481,14 @@ var Background = new Lang.Class({
} }
this._loadFile(this._file); this._loadFile(this._file);
}, }
}); };
Signals.addSignalMethods(Background.prototype); Signals.addSignalMethods(Background.prototype);
let _systemBackground; let _systemBackground;
var SystemBackground = new Lang.Class({ var SystemBackground = class SystemBackground {
Name: 'SystemBackground', constructor() {
_init() {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png'); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png');
if (_systemBackground == null) { if (_systemBackground == null) {
@@ -524,14 +517,12 @@ var SystemBackground = new Lang.Class({
image = null; image = null;
}); });
} }
}, }
}); };
Signals.addSignalMethods(SystemBackground.prototype); Signals.addSignalMethods(SystemBackground.prototype);
var BackgroundSource = new Lang.Class({ var BackgroundSource = class BackgroundSource {
Name: 'BackgroundSource', constructor(layoutManager, settingsSchema) {
_init(layoutManager, settingsSchema) {
// Allow override the background image setting for performance testing // Allow override the background image setting for performance testing
this._layoutManager = layoutManager; this._layoutManager = layoutManager;
this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE'); this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
@@ -542,7 +533,7 @@ var BackgroundSource = new Lang.Class({
this._monitorsChangedId = this._monitorsChangedId =
monitorManager.connect('monitors-changed', monitorManager.connect('monitors-changed',
this._onMonitorsChanged.bind(this)); this._onMonitorsChanged.bind(this));
}, }
_onMonitorsChanged() { _onMonitorsChanged() {
for (let monitorIndex in this._backgrounds) { for (let monitorIndex in this._backgrounds) {
@@ -556,7 +547,7 @@ var BackgroundSource = new Lang.Class({
delete this._backgrounds[monitorIndex]; delete this._backgrounds[monitorIndex];
} }
} }
}, }
getBackground(monitorIndex) { getBackground(monitorIndex) {
let file = null; let file = null;
@@ -603,7 +594,7 @@ var BackgroundSource = new Lang.Class({
} }
return this._backgrounds[monitorIndex]; return this._backgrounds[monitorIndex];
}, }
destroy() { destroy() {
let monitorManager = Meta.MonitorManager.get(); let monitorManager = Meta.MonitorManager.get();
@@ -617,12 +608,10 @@ var BackgroundSource = new Lang.Class({
this._backgrounds = null; this._backgrounds = null;
} }
}); };
var Animation = new Lang.Class({ var Animation = class Animation {
Name: 'Animation', constructor(params) {
_init(params) {
params = Params.parse(params, { file: null }); params = Params.parse(params, { file: null });
this.file = params.file; this.file = params.file;
@@ -630,7 +619,7 @@ var Animation = new Lang.Class({
this.transitionProgress = 0.0; this.transitionProgress = 0.0;
this.transitionDuration = 0.0; this.transitionDuration = 0.0;
this.loaded = false; this.loaded = false;
}, }
load(callback) { load(callback) {
this._show = new GnomeDesktop.BGSlideShow({ filename: this.file.get_path() }); this._show = new GnomeDesktop.BGSlideShow({ filename: this.file.get_path() });
@@ -640,7 +629,7 @@ var Animation = new Lang.Class({
if (callback) if (callback)
callback(); callback();
}); });
}, }
update(monitor) { update(monitor) {
this.keyFrameFiles = []; this.keyFrameFiles = [];
@@ -661,14 +650,12 @@ var Animation = new Lang.Class({
if (filename2) if (filename2)
this.keyFrameFiles.push(Gio.File.new_for_path(filename2)); this.keyFrameFiles.push(Gio.File.new_for_path(filename2));
}, }
}); };
Signals.addSignalMethods(Animation.prototype); Signals.addSignalMethods(Animation.prototype);
var BackgroundManager = new Lang.Class({ var BackgroundManager = class BackgroundManager {
Name: 'BackgroundManager', constructor(params) {
_init(params) {
params = Params.parse(params, { container: null, params = Params.parse(params, { container: null,
layoutManager: Main.layoutManager, layoutManager: Main.layoutManager,
monitorIndex: null, monitorIndex: null,
@@ -688,7 +675,7 @@ var BackgroundManager = new Lang.Class({
this.backgroundActor = this._createBackgroundActor(); this.backgroundActor = this._createBackgroundActor();
this._newBackgroundActor = null; this._newBackgroundActor = null;
}, }
destroy() { destroy() {
let cache = getBackgroundCache(); let cache = getBackgroundCache();
@@ -704,7 +691,7 @@ var BackgroundManager = new Lang.Class({
this.backgroundActor.destroy(); this.backgroundActor.destroy();
this.backgroundActor = null; this.backgroundActor = null;
} }
}, }
_swapBackgroundActor() { _swapBackgroundActor() {
let oldBackgroundActor = this.backgroundActor; let oldBackgroundActor = this.backgroundActor;
@@ -721,7 +708,7 @@ var BackgroundManager = new Lang.Class({
oldBackgroundActor.destroy(); oldBackgroundActor.destroy();
} }
}); });
}, }
_updateBackgroundActor() { _updateBackgroundActor() {
if (this._newBackgroundActor) { if (this._newBackgroundActor) {
@@ -750,7 +737,7 @@ var BackgroundManager = new Lang.Class({
this._swapBackgroundActor(); this._swapBackgroundActor();
}); });
} }
}, }
_createBackgroundActor() { _createBackgroundActor() {
let background = this._backgroundSource.getBackground(this._monitorIndex); let background = this._backgroundSource.getBackground(this._monitorIndex);
@@ -787,6 +774,6 @@ var BackgroundManager = new Lang.Class({
}); });
return backgroundActor; return backgroundActor;
}, }
}); };
Signals.addSignalMethods(BackgroundManager.prototype); Signals.addSignalMethods(BackgroundManager.prototype);

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -9,12 +8,9 @@ const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main; const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
var BackgroundMenu = new Lang.Class({ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
Name: 'BackgroundMenu', constructor(layoutManager) {
Extends: PopupMenu.PopupMenu, super(layoutManager.dummyCursor, 0, St.Side.TOP);
_init(layoutManager) {
this.parent(layoutManager.dummyCursor, 0, St.Side.TOP);
this.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop'); this.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop');
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@@ -26,7 +22,7 @@ var BackgroundMenu = new Lang.Class({
layoutManager.uiGroup.add_actor(this.actor); layoutManager.uiGroup.add_actor(this.actor);
this.actor.hide(); this.actor.hide();
} }
}); };
function addBackgroundMenu(actor, layoutManager) { function addBackgroundMenu(actor, layoutManager) {
actor.reactive = true; actor.reactive = true;

View File

@@ -3,14 +3,11 @@
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Cairo = imports.cairo; const Cairo = imports.cairo;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
var BarLevel = new Lang.Class({ var BarLevel = class {
Name: "BarLevel", constructor(value, params) {
_init(value, params) {
if (isNaN(value)) if (isNaN(value))
// Avoid spreading NaNs around // Avoid spreading NaNs around
throw TypeError('The bar level value must be a number'); throw TypeError('The bar level value must be a number');
@@ -40,7 +37,7 @@ var BarLevel = new Lang.Class({
this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this)); this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
this.connect('value-changed', this._valueChanged.bind(this)); this.connect('value-changed', this._valueChanged.bind(this));
}, }
setValue(value) { setValue(value) {
if (isNaN(value)) if (isNaN(value))
@@ -48,7 +45,7 @@ var BarLevel = new Lang.Class({
this._value = Math.max(Math.min(value, this._maxValue), 0); this._value = Math.max(Math.min(value, this._maxValue), 0);
this.actor.queue_repaint(); this.actor.queue_repaint();
}, }
setMaximumValue(value) { setMaximumValue(value) {
if (isNaN(value)) if (isNaN(value))
@@ -57,7 +54,7 @@ var BarLevel = new Lang.Class({
this._maxValue = Math.max(value, 1); this._maxValue = Math.max(value, 1);
this._overdriveStart = Math.min(this._overdriveStart, this._maxValue); this._overdriveStart = Math.min(this._overdriveStart, this._maxValue);
this.actor.queue_repaint(); this.actor.queue_repaint();
}, }
setOverdriveStart(value) { setOverdriveStart(value) {
if (isNaN(value)) if (isNaN(value))
@@ -69,7 +66,7 @@ var BarLevel = new Lang.Class({
this._overdriveStart = value; this._overdriveStart = value;
this._value = Math.max(Math.min(value, this._maxValue), 0); this._value = Math.max(Math.min(value, this._maxValue), 0);
this.actor.queue_repaint(); this.actor.queue_repaint();
}, }
_barLevelRepaint(area) { _barLevelRepaint(area) {
let cr = area.get_context(); let cr = area.get_context();
@@ -176,35 +173,34 @@ var BarLevel = new Lang.Class({
} }
cr.$dispose(); cr.$dispose();
}, }
_getCurrentValue(actor) { _getCurrentValue(actor) {
return this._value; return this._value;
}, }
_getOverdriveStart(actor) { _getOverdriveStart(actor) {
return this._overdriveStart; return this._overdriveStart;
}, }
_getMinimumValue(actor) { _getMinimumValue(actor) {
return 0; return 0;
}, }
_getMaximumValue(actor) { _getMaximumValue(actor) {
return this._maxValue; return this._maxValue;
}, }
_setCurrentValue(actor, value) { _setCurrentValue(actor, value) {
this._value = value; this._value = value;
}, }
_valueChanged(barLevel, value, property) { _valueChanged(barLevel, value, property) {
this._customAccessible.notify("accessible-value"); this._customAccessible.notify("accessible-value");
}, }
get value() { get value() {
return this._value; return this._value;
} }
}); };
Signals.addSignalMethods(BarLevel.prototype); Signals.addSignalMethods(BarLevel.prototype);

View File

@@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const GObject = imports.gi.GObject;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -32,13 +32,11 @@ var POPUP_ANIMATION_TIME = 0.15;
* totally inside the monitor if possible. * totally inside the monitor if possible.
* *
*/ */
var BoxPointer = new Lang.Class({ var BoxPointer = GObject.registerClass({
Name: 'BoxPointer',
Extends: St.Widget,
Signals: { 'arrow-side-changed': {} }, Signals: { 'arrow-side-changed': {} },
}, class BoxPointer extends St.Widget {
_init(arrowSide, binProperties) { _init(arrowSide, binProperties) {
this.parent(); super._init();
this.actor = this; this.actor = this;
@@ -61,24 +59,24 @@ var BoxPointer = new Lang.Class({
this._sourceAlignment = 0.5; this._sourceAlignment = 0.5;
this._capturedEventId = 0; this._capturedEventId = 0;
this._muteInput(); this._muteInput();
}, }
get arrowSide() { get arrowSide() {
return this._arrowSide; return this._arrowSide;
}, }
_muteInput() { _muteInput() {
if (this._capturedEventId == 0) if (this._capturedEventId == 0)
this._capturedEventId = this.connect('captured-event', this._capturedEventId = this.connect('captured-event',
() => Clutter.EVENT_STOP); () => Clutter.EVENT_STOP);
}, }
_unmuteInput() { _unmuteInput() {
if (this._capturedEventId != 0) { if (this._capturedEventId != 0) {
this.disconnect(this._capturedEventId); this.disconnect(this._capturedEventId);
this._capturedEventId = 0; this._capturedEventId = 0;
} }
}, }
// BoxPointer.show() and BoxPointer.hide() are here for only compatibility // BoxPointer.show() and BoxPointer.hide() are here for only compatibility
// purposes, and will be removed in 3.32. // purposes, and will be removed in 3.32.
@@ -94,7 +92,7 @@ var BoxPointer = new Lang.Class({
} }
this.visible = true; this.visible = true;
}, }
hide(animate, onComplete) { hide(animate, onComplete) {
if (animate !== undefined) { if (animate !== undefined) {
@@ -108,7 +106,7 @@ var BoxPointer = new Lang.Class({
} }
this.visible = false; this.visible = false;
}, }
open(animate, onComplete) { open(animate, onComplete) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -149,7 +147,7 @@ var BoxPointer = new Lang.Class({
onComplete(); onComplete();
}, },
time: animationTime }); time: animationTime });
}, }
close(animate, onComplete) { close(animate, onComplete) {
if (!this.visible) if (!this.visible)
@@ -196,7 +194,7 @@ var BoxPointer = new Lang.Class({
onComplete(); onComplete();
} }
}); });
}, }
_adjustAllocationForArrow(isWidth, minSize, natSize) { _adjustAllocationForArrow(isWidth, minSize, natSize) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -211,7 +209,7 @@ var BoxPointer = new Lang.Class({
} }
return [minSize, natSize]; return [minSize, natSize];
}, }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -221,7 +219,7 @@ var BoxPointer = new Lang.Class({
width = this._adjustAllocationForArrow(true, ...width); width = this._adjustAllocationForArrow(true, ...width);
return themeNode.adjust_preferred_width(...width); return themeNode.adjust_preferred_width(...width);
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -232,7 +230,7 @@ var BoxPointer = new Lang.Class({
height = this._adjustAllocationForArrow(false, ...height); height = this._adjustAllocationForArrow(false, ...height);
return themeNode.adjust_preferred_height(...height); return themeNode.adjust_preferred_height(...height);
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.set_allocation(box, flags); this.set_allocation(box, flags);
@@ -276,7 +274,7 @@ var BoxPointer = new Lang.Class({
this._reposition(); this._reposition();
this._updateFlip(); this._updateFlip();
} }
}, }
_drawBorder(area) { _drawBorder(area) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -458,7 +456,7 @@ var BoxPointer = new Lang.Class({
} }
cr.$dispose(); cr.$dispose();
}, }
setPosition(sourceActor, alignment) { setPosition(sourceActor, alignment) {
// We need to show it now to force an allocation, // We need to show it now to force an allocation,
@@ -470,7 +468,7 @@ var BoxPointer = new Lang.Class({
this._reposition(); this._reposition();
this._updateFlip(); this._updateFlip();
}, }
setSourceAlignment(alignment) { setSourceAlignment(alignment) {
this._sourceAlignment = alignment; this._sourceAlignment = alignment;
@@ -479,7 +477,7 @@ var BoxPointer = new Lang.Class({
return; return;
this.setPosition(this._sourceActor, this._arrowAlignment); this.setPosition(this._sourceActor, this._arrowAlignment);
}, }
_reposition() { _reposition() {
let sourceActor = this._sourceActor; let sourceActor = this._sourceActor;
@@ -593,7 +591,7 @@ var BoxPointer = new Lang.Class({
this._xPosition = Math.floor(x); this._xPosition = Math.floor(x);
this._yPosition = Math.floor(y); this._yPosition = Math.floor(y);
this._shiftActor(); this._shiftActor();
}, }
// @origin: Coordinate specifying middle of the arrow, along // @origin: Coordinate specifying middle of the arrow, along
// the Y axis for St.Side.LEFT, St.Side.RIGHT from the top and X axis from // the Y axis for St.Side.LEFT, St.Side.RIGHT from the top and X axis from
@@ -603,7 +601,7 @@ var BoxPointer = new Lang.Class({
this._arrowOrigin = origin; this._arrowOrigin = origin;
this._border.queue_repaint(); this._border.queue_repaint();
} }
}, }
// @actor: an actor relative to which the arrow is positioned. // @actor: an actor relative to which the arrow is positioned.
// Differently from setPosition, this will not move the boxpointer itself, // Differently from setPosition, this will not move the boxpointer itself,
@@ -613,7 +611,7 @@ var BoxPointer = new Lang.Class({
this._arrowActor = actor; this._arrowActor = actor;
this._border.queue_repaint(); this._border.queue_repaint();
} }
}, }
_shiftActor() { _shiftActor() {
// Since the position of the BoxPointer depends on the allocated size // Since the position of the BoxPointer depends on the allocated size
@@ -624,7 +622,7 @@ var BoxPointer = new Lang.Class({
// x == y == 0. // x == y == 0.
this.set_anchor_point(-(this._xPosition + this._xOffset), this.set_anchor_point(-(this._xPosition + this._xOffset),
-(this._yPosition + this._yOffset)); -(this._yPosition + this._yOffset));
}, }
_calculateArrowSide(arrowSide) { _calculateArrowSide(arrowSide) {
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor); let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
@@ -658,7 +656,7 @@ var BoxPointer = new Lang.Class({
} }
return arrowSide; return arrowSide;
}, }
_updateFlip() { _updateFlip() {
let arrowSide = this._calculateArrowSide(this._userArrowSide); let arrowSide = this._calculateArrowSide(this._userArrowSide);
@@ -672,36 +670,36 @@ var BoxPointer = new Lang.Class({
this.emit('arrow-side-changed'); this.emit('arrow-side-changed');
} }
}, }
set xOffset(offset) { set xOffset(offset) {
this._xOffset = offset; this._xOffset = offset;
this._shiftActor(); this._shiftActor();
}, }
get xOffset() { get xOffset() {
return this._xOffset; return this._xOffset;
}, }
set yOffset(offset) { set yOffset(offset) {
this._yOffset = offset; this._yOffset = offset;
this._shiftActor(); this._shiftActor();
}, }
get yOffset() { get yOffset() {
return this._yOffset; return this._yOffset;
}, }
updateArrowSide(side) { updateArrowSide(side) {
this._arrowSide = side; this._arrowSide = side;
this._border.queue_repaint(); this._border.queue_repaint();
this.emit('arrow-side-changed'); this.emit('arrow-side-changed');
}, }
getPadding(side) { getPadding(side) {
return this.bin.get_theme_node().get_padding(side); return this.bin.get_theme_node().get_padding(side);
}, }
getArrowHeight() { getArrowHeight() {
return this.get_theme_node().get_length('-arrow-rise'); return this.get_theme_node().get_length('-arrow-rise');

View File

@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -89,49 +88,42 @@ function _getCalendarDayAbbreviation(dayNumber) {
// Abstraction for an appointment/event in a calendar // Abstraction for an appointment/event in a calendar
var CalendarEvent = new Lang.Class({ var CalendarEvent = class CalendarEvent {
Name: 'CalendarEvent', constructor(id, date, end, summary, allDay) {
_init(id, date, end, summary, allDay) {
this.id = id; this.id = id;
this.date = date; this.date = date;
this.end = end; this.end = end;
this.summary = summary; this.summary = summary;
this.allDay = allDay; this.allDay = allDay;
} }
}); };
// Interface for appointments/events - e.g. the contents of a calendar // Interface for appointments/events - e.g. the contents of a calendar
// //
// First, an implementation with no events // First, an implementation with no events
var EmptyEventSource = new Lang.Class({ var EmptyEventSource = class EmptyEventSource {
Name: 'EmptyEventSource', constructor() {
_init() {
this.isLoading = false; this.isLoading = false;
this.isDummy = true; this.isDummy = true;
this.hasCalendars = false; this.hasCalendars = false;
}, }
destroy() { destroy() {
}, }
ignoreEvent(event) {
},
requestRange(begin, end) { requestRange(begin, end) {
}, }
getEvents(begin, end) { getEvents(begin, end) {
let result = []; let result = [];
return result; return result;
}, }
hasEvents(day) { hasEvents(day) {
return false; return false;
} }
}); };
Signals.addSignalMethods(EmptyEventSource.prototype); Signals.addSignalMethods(EmptyEventSource.prototype);
const CalendarServerIface = ` const CalendarServerIface = `
@@ -177,22 +169,12 @@ function _dateIntervalsOverlap(a0, a1, b0, b1)
} }
// an implementation that reads data from a session bus service // an implementation that reads data from a session bus service
var DBusEventSource = new Lang.Class({ var DBusEventSource = class DBusEventSource {
Name: 'DBusEventSource', constructor() {
_init() {
this._resetCache(); this._resetCache();
this.isLoading = false; this.isLoading = false;
this.isDummy = false; this.isDummy = false;
this._ignoredEvents = new Map();
let savedState = global.get_persistent_state('as', 'ignored_events');
if (savedState)
savedState.deep_unpack().forEach(eventId => {
this._ignoredEvents.set(eventId, true);
});
this._initialized = false; this._initialized = false;
this._dbusProxy = new CalendarServer(); this._dbusProxy = new CalendarServer();
this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, (object, result) => { this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, (object, result) => {
@@ -235,39 +217,39 @@ var DBusEventSource = new Lang.Class({
this._onNameAppeared(); this._onNameAppeared();
} }
}); });
}, }
destroy() { destroy() {
this._dbusProxy.run_dispose(); this._dbusProxy.run_dispose();
}, }
get hasCalendars() { get hasCalendars() {
if (this._initialized) if (this._initialized)
return this._dbusProxy.HasCalendars; return this._dbusProxy.HasCalendars;
else else
return false; return false;
}, }
_resetCache() { _resetCache() {
this._events = []; this._events = [];
this._lastRequestBegin = null; this._lastRequestBegin = null;
this._lastRequestEnd = null; this._lastRequestEnd = null;
}, }
_onNameAppeared(owner) { _onNameAppeared(owner) {
this._initialized = true; this._initialized = true;
this._resetCache(); this._resetCache();
this._loadEvents(true); this._loadEvents(true);
}, }
_onNameVanished(oldOwner) { _onNameVanished(oldOwner) {
this._resetCache(); this._resetCache();
this.emit('changed'); this.emit('changed');
}, }
_onChanged() { _onChanged() {
this._loadEvents(false); this._loadEvents(false);
}, }
_onEventsReceived(results, error) { _onEventsReceived(results, error) {
let newEvents = []; let newEvents = [];
@@ -289,7 +271,7 @@ var DBusEventSource = new Lang.Class({
this._events = newEvents; this._events = newEvents;
this.isLoading = false; this.isLoading = false;
this.emit('changed'); this.emit('changed');
}, }
_loadEvents(forceReload) { _loadEvents(forceReload) {
// Ignore while loading // Ignore while loading
@@ -303,17 +285,7 @@ var DBusEventSource = new Lang.Class({
this._onEventsReceived.bind(this), this._onEventsReceived.bind(this),
Gio.DBusCallFlags.NONE); Gio.DBusCallFlags.NONE);
} }
}, }
ignoreEvent(event) {
if (this._ignoredEvents.get(event.id))
return;
this._ignoredEvents.set(event.id, true);
let savedState = new GLib.Variant('as', [...this._ignoredEvents.keys()]);
global.set_persistent_state('ignored_events', savedState);
this.emit('changed');
},
requestRange(begin, end) { requestRange(begin, end) {
if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) { if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) {
@@ -324,16 +296,13 @@ var DBusEventSource = new Lang.Class({
this._curRequestEnd = end; this._curRequestEnd = end;
this._loadEvents(false); this._loadEvents(false);
} }
}, }
getEvents(begin, end) { getEvents(begin, end) {
let result = []; let result = [];
for(let n = 0; n < this._events.length; n++) { for(let n = 0; n < this._events.length; n++) {
let event = this._events[n]; let event = this._events[n];
if (this._ignoredEvents.has(event.id))
continue;
if (_dateIntervalsOverlap (event.date, event.end, begin, end)) { if (_dateIntervalsOverlap (event.date, event.end, begin, end)) {
result.push(event); result.push(event);
} }
@@ -345,7 +314,7 @@ var DBusEventSource = new Lang.Class({
return d1.getTime() - d2.getTime(); return d1.getTime() - d2.getTime();
}); });
return result; return result;
}, }
hasEvents(day) { hasEvents(day) {
let dayBegin = _getBeginningOfDay(day); let dayBegin = _getBeginningOfDay(day);
@@ -358,13 +327,11 @@ var DBusEventSource = new Lang.Class({
return true; return true;
} }
}); };
Signals.addSignalMethods(DBusEventSource.prototype); Signals.addSignalMethods(DBusEventSource.prototype);
var Calendar = new Lang.Class({ var Calendar = class Calendar {
Name: 'Calendar', constructor() {
_init() {
this._weekStart = Shell.util_get_week_start(); this._weekStart = Shell.util_get_week_start();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' }); this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
@@ -402,7 +369,7 @@ var Calendar = new Lang.Class({
this._onScroll.bind(this)); this._onScroll.bind(this));
this._buildHeader (); this._buildHeader ();
}, }
// @eventSource: is an object implementing the EventSource API, e.g. the // @eventSource: is an object implementing the EventSource API, e.g. the
// requestRange(), getEvents(), hasEvents() methods and the ::changed signal. // requestRange(), getEvents(), hasEvents() methods and the ::changed signal.
@@ -414,7 +381,7 @@ var Calendar = new Lang.Class({
}); });
this._rebuildCalendar(); this._rebuildCalendar();
this._update(); this._update();
}, }
// Sets the calendar to show a specific date // Sets the calendar to show a specific date
setDate(date) { setDate(date) {
@@ -424,14 +391,14 @@ var Calendar = new Lang.Class({
this._selectedDate = date; this._selectedDate = date;
this._update(); this._update();
this.emit('selected-date-changed', new Date(this._selectedDate)); this.emit('selected-date-changed', new Date(this._selectedDate));
}, }
updateTimeZone() { updateTimeZone() {
// The calendar need to be rebuilt after a time zone update because // The calendar need to be rebuilt after a time zone update because
// the date might have changed. // the date might have changed.
this._rebuildCalendar(); this._rebuildCalendar();
this._update(); this._update();
}, }
_buildHeader() { _buildHeader() {
let layout = this.actor.layout_manager; let layout = this.actor.layout_manager;
@@ -488,7 +455,7 @@ var Calendar = new Lang.Class({
// All the children after this are days, and get removed when we update the calendar // All the children after this are days, and get removed when we update the calendar
this._firstDayIndex = this.actor.get_n_children(); this._firstDayIndex = this.actor.get_n_children();
}, }
_onScroll(actor, event) { _onScroll(actor, event) {
switch (event.get_scroll_direction()) { switch (event.get_scroll_direction()) {
@@ -502,7 +469,7 @@ var Calendar = new Lang.Class({
break; break;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onPrevMonthButtonClicked() { _onPrevMonthButtonClicked() {
let newDate = new Date(this._selectedDate); let newDate = new Date(this._selectedDate);
@@ -526,7 +493,7 @@ var Calendar = new Lang.Class({
this._backButton.grab_key_focus(); this._backButton.grab_key_focus();
this.setDate(newDate); this.setDate(newDate);
}, }
_onNextMonthButtonClicked() { _onNextMonthButtonClicked() {
let newDate = new Date(this._selectedDate); let newDate = new Date(this._selectedDate);
@@ -550,14 +517,14 @@ var Calendar = new Lang.Class({
this._forwardButton.grab_key_focus(); this._forwardButton.grab_key_focus();
this.setDate(newDate); this.setDate(newDate);
}, }
_onSettingsChange() { _onSettingsChange() {
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY); this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
this._buildHeader(); this._buildHeader();
this._rebuildCalendar(); this._rebuildCalendar();
this._update(); this._update();
}, }
_rebuildCalendar() { _rebuildCalendar() {
let now = new Date(); let now = new Date();
@@ -678,7 +645,7 @@ var Calendar = new Lang.Class({
// Signal to the event source that we are interested in events // Signal to the event source that we are interested in events
// only from this date range // only from this date range
this._eventSource.requestRange(beginDate, iter); this._eventSource.requestRange(beginDate, iter);
}, }
_update() { _update() {
let now = new Date(); let now = new Date();
@@ -701,18 +668,17 @@ var Calendar = new Lang.Class({
button.remove_style_pseudo_class('selected'); button.remove_style_pseudo_class('selected');
}); });
} }
}); };
Signals.addSignalMethods(Calendar.prototype); Signals.addSignalMethods(Calendar.prototype);
var EventMessage = new Lang.Class({ var EventMessage = class EventMessage extends MessageList.Message {
Name: 'EventMessage', constructor(event, date) {
Extends: MessageList.Message, super('', event.summary);
_init(event, date) {
this._event = event; this._event = event;
this._date = date; this._date = date;
this.parent(this._formatEventTime(), event.summary); this.setTitle(this._formatEventTime());
this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' }); this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' });
this.setIcon(this._icon); this.setIcon(this._icon);
@@ -721,7 +687,7 @@ var EventMessage = new Lang.Class({
let iconVisible = this.actor.get_parent().has_style_pseudo_class('first-child'); let iconVisible = this.actor.get_parent().has_style_pseudo_class('first-child');
this._icon.opacity = (iconVisible ? 255 : 0); this._icon.opacity = (iconVisible ? 255 : 0);
}); });
}, }
_formatEventTime() { _formatEventTime() {
let periodBegin = _getBeginningOfDay(this._date); let periodBegin = _getBeginningOfDay(this._date);
@@ -754,23 +720,17 @@ var EventMessage = new Lang.Class({
title = title + ELLIPSIS_CHAR; title = title + ELLIPSIS_CHAR;
} }
return title; return title;
},
canClose() {
return isToday(this._date);
} }
}); };
var NotificationMessage = new Lang.Class({ var NotificationMessage =
Name: 'NotificationMessage', class NotificationMessage extends MessageList.Message {
Extends: MessageList.Message, constructor(notification) {
super(notification.title, notification.bannerBodyText);
_init(notification) {
this.notification = notification;
this.parent(notification.title, notification.bannerBodyText);
this.setUseBodyMarkup(notification.bannerBodyMarkup); this.setUseBodyMarkup(notification.bannerBodyMarkup);
this.notification = notification;
this.setIcon(this._getIcon()); this.setIcon(this._getIcon());
this.connect('close', () => { this.connect('close', () => {
@@ -779,13 +739,14 @@ var NotificationMessage = new Lang.Class({
this.notification.destroy(MessageTray.NotificationDestroyedReason.DISMISSED); this.notification.destroy(MessageTray.NotificationDestroyedReason.DISMISSED);
}); });
this._destroyId = notification.connect('destroy', () => { this._destroyId = notification.connect('destroy', () => {
this._disconnectNotificationSignals();
this.notification = null; this.notification = null;
if (!this._closed) if (!this._closed)
this.close(); this.close();
}); });
this._updatedId = notification.connect('updated', this._updatedId = notification.connect('updated',
this._onUpdated.bind(this)); this._onUpdated.bind(this));
}, }
_getIcon() { _getIcon() {
if (this.notification.gicon) if (this.notification.gicon)
@@ -793,22 +754,25 @@ var NotificationMessage = new Lang.Class({
icon_size: MESSAGE_ICON_SIZE }); icon_size: MESSAGE_ICON_SIZE });
else else
return this.notification.source.createIcon(MESSAGE_ICON_SIZE); return this.notification.source.createIcon(MESSAGE_ICON_SIZE);
}, }
_onUpdated(n, clear) { _onUpdated(n, clear) {
this.setIcon(this._getIcon()); this.setIcon(this._getIcon());
this.setTitle(n.title); this.setTitle(n.title);
this.setBody(n.bannerBodyText); this.setBody(n.bannerBodyText);
this.setUseBodyMarkup(n.bannerBodyMarkup); this.setUseBodyMarkup(n.bannerBodyMarkup);
}, }
_onClicked() { _onClicked() {
this.notification.activate(); this.notification.activate();
}, }
_onDestroy() { _onDestroy() {
this.parent(); super._onDestroy();
this._disconnectNotificationSignals();
}
_disconnectNotificationSignals() {
if (this._updatedId) if (this._updatedId)
this.notification.disconnect(this._updatedId); this.notification.disconnect(this._updatedId);
this._updatedId = 0; this._updatedId = 0;
@@ -817,21 +781,22 @@ var NotificationMessage = new Lang.Class({
this.notification.disconnect(this._destroyId); this.notification.disconnect(this._destroyId);
this._destroyId = 0; this._destroyId = 0;
} }
});
var EventsSection = new Lang.Class({ canClose() {
Name: 'EventsSection', return true;
Extends: MessageList.MessageListSection, }
};
var EventsSection = class EventsSection extends MessageList.MessageListSection {
constructor() {
super();
_init() {
this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
this._desktopSettings.connect('changed', this._reloadEvents.bind(this)); this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
this._eventSource = new EmptyEventSource(); this._eventSource = new EmptyEventSource();
this._messageById = new Map(); this._messageById = new Map();
this.parent();
this._title = new St.Button({ style_class: 'events-section-title', this._title = new St.Button({ style_class: 'events-section-title',
label: '', label: '',
x_align: St.Align.START, x_align: St.Align.START,
@@ -844,20 +809,16 @@ var EventsSection = new Lang.Class({
Shell.AppSystem.get_default().connect('installed-changed', Shell.AppSystem.get_default().connect('installed-changed',
this._appInstalledChanged.bind(this)); this._appInstalledChanged.bind(this));
this._appInstalledChanged(); this._appInstalledChanged();
}, }
_ignoreEvent(event) {
this._eventSource.ignoreEvent(event);
},
setEventSource(eventSource) { setEventSource(eventSource) {
this._eventSource = eventSource; this._eventSource = eventSource;
this._eventSource.connect('changed', this._reloadEvents.bind(this)); this._eventSource.connect('changed', this._reloadEvents.bind(this));
}, }
get allowed() { get allowed() {
return Main.sessionMode.showCalendarEvents; return Main.sessionMode.showCalendarEvents;
}, }
_updateTitle() { _updateTitle() {
this._title.visible = !isToday(this._date); this._title.visible = !isToday(this._date);
@@ -876,7 +837,7 @@ var EventsSection = new Lang.Class({
dayFormat = Shell.util_translate_time_string(NC_("calendar heading", dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
"%A, %B %-d, %Y")); "%A, %B %-d, %Y"));
this._title.label = this._date.toLocaleFormat(dayFormat); this._title.label = this._date.toLocaleFormat(dayFormat);
}, }
_reloadEvents() { _reloadEvents() {
if (this._eventSource.isLoading) if (this._eventSource.isLoading)
@@ -902,9 +863,6 @@ var EventsSection = new Lang.Class({
let message = this._messageById.get(event.id); let message = this._messageById.get(event.id);
if (!message) { if (!message) {
message = new EventMessage(event, this._date); message = new EventMessage(event, this._date);
message.connect('close', () => {
this._ignoreEvent(event);
});
this._messageById.set(event.id, message); this._messageById.set(event.id, message);
this.addMessage(message, false); this.addMessage(message, false);
} else { } else {
@@ -914,12 +872,12 @@ var EventsSection = new Lang.Class({
this._reloading = false; this._reloading = false;
this._sync(); this._sync();
}, }
_appInstalledChanged() { _appInstalledChanged() {
this._calendarApp = undefined; this._calendarApp = undefined;
this._title.reactive = (this._getCalendarApp() != null); this._title.reactive = (this._getCalendarApp() != null);
}, }
_getCalendarApp() { _getCalendarApp() {
if (this._calendarApp !== undefined) if (this._calendarApp !== undefined)
@@ -934,7 +892,7 @@ var EventsSection = new Lang.Class({
this._calendarApp = null; this._calendarApp = null;
} }
return this._calendarApp; return this._calendarApp;
}, }
_onTitleClicked() { _onTitleClicked() {
Main.overview.hide(); Main.overview.hide();
@@ -944,32 +902,30 @@ var EventsSection = new Lang.Class({
if (app.get_id() == 'evolution.desktop') if (app.get_id() == 'evolution.desktop')
app = Gio.DesktopAppInfo.new('evolution-calendar.desktop'); app = Gio.DesktopAppInfo.new('evolution-calendar.desktop');
app.launch([], global.create_app_launch_context(0, -1)); app.launch([], global.create_app_launch_context(0, -1));
}, }
setDate(date) { setDate(date) {
this.parent(date); super.setDate(date);
this._updateTitle(); this._updateTitle();
this._reloadEvents(); this._reloadEvents();
}, }
_shouldShow() { _shouldShow() {
return !this.empty || !isToday(this._date); return !this.empty || !isToday(this._date);
}, }
_sync() { _sync() {
if (this._reloading) if (this._reloading)
return; return;
this.parent(); super._sync();
} }
}); };
var NotificationSection = new Lang.Class({ var NotificationSection =
Name: 'NotificationSection', class NotificationSection extends MessageList.MessageListSection {
Extends: MessageList.MessageListSection, constructor() {
super();
_init() {
this.parent();
this._sources = new Map(); this._sources = new Map();
this._nUrgent = 0; this._nUrgent = 0;
@@ -980,12 +936,12 @@ var NotificationSection = new Lang.Class({
}); });
this.actor.connect('notify::mapped', this._onMapped.bind(this)); this.actor.connect('notify::mapped', this._onMapped.bind(this));
}, }
get allowed() { get allowed() {
return Main.sessionMode.hasNotifications && return Main.sessionMode.hasNotifications &&
!Main.sessionMode.isGreeter; !Main.sessionMode.isGreeter;
}, }
_createTimeLabel(datetime) { _createTimeLabel(datetime) {
let label = new St.Label({ style_class: 'event-time', let label = new St.Label({ style_class: 'event-time',
@@ -996,7 +952,7 @@ var NotificationSection = new Lang.Class({
label.text = Util.formatTimeSpan(datetime); label.text = Util.formatTimeSpan(datetime);
}); });
return label; return label;
}, }
_sourceAdded(tray, source) { _sourceAdded(tray, source) {
let obj = { let obj = {
@@ -1011,7 +967,7 @@ var NotificationSection = new Lang.Class({
this._onNotificationAdded.bind(this)); this._onNotificationAdded.bind(this));
this._sources.set(source, obj); this._sources.set(source, obj);
}, }
_onNotificationAdded(source, notification) { _onNotificationAdded(source, notification) {
let message = new NotificationMessage(notification); let message = new NotificationMessage(notification);
@@ -1042,14 +998,14 @@ var NotificationSection = new Lang.Class({
let index = isUrgent ? 0 : this._nUrgent; let index = isUrgent ? 0 : this._nUrgent;
this.addMessageAtIndex(message, index, this.actor.mapped); this.addMessageAtIndex(message, index, this.actor.mapped);
}, }
_onSourceDestroy(source, obj) { _onSourceDestroy(source, obj) {
source.disconnect(obj.destroyId); source.disconnect(obj.destroyId);
source.disconnect(obj.notificationAddedId); source.disconnect(obj.notificationAddedId);
this._sources.delete(source); this._sources.delete(source);
}, }
_onMapped() { _onMapped() {
if (!this.actor.mapped) if (!this.actor.mapped)
@@ -1058,17 +1014,15 @@ var NotificationSection = new Lang.Class({
for (let message of this._messages.keys()) for (let message of this._messages.keys())
if (message.notification.urgency != MessageTray.Urgency.CRITICAL) if (message.notification.urgency != MessageTray.Urgency.CRITICAL)
message.notification.acknowledged = true; message.notification.acknowledged = true;
}, }
_shouldShow() { _shouldShow() {
return !this.empty && isToday(this._date); return !this.empty && isToday(this._date);
} }
}); };
var Placeholder = new Lang.Class({ var Placeholder = class Placeholder {
Name: 'Placeholder', constructor() {
_init() {
this.actor = new St.BoxLayout({ style_class: 'message-list-placeholder', this.actor = new St.BoxLayout({ style_class: 'message-list-placeholder',
vertical: true }); vertical: true });
@@ -1086,14 +1040,14 @@ var Placeholder = new Lang.Class({
this.actor.add_actor(this._label); this.actor.add_actor(this._label);
this._sync(); this._sync();
}, }
setDate(date) { setDate(date) {
if (sameDay(this._date, date)) if (sameDay(this._date, date))
return; return;
this._date = date; this._date = date;
this._sync(); this._sync();
}, }
_sync() { _sync() {
let today = isToday(this._date); let today = isToday(this._date);
@@ -1110,12 +1064,10 @@ var Placeholder = new Lang.Class({
this._label.text = _("No Events"); this._label.text = _("No Events");
} }
} }
}); };
var CalendarMessageList = new Lang.Class({ var CalendarMessageList = class CalendarMessageList {
Name: 'CalendarMessageList', constructor() {
_init() {
this.actor = new St.Widget({ style_class: 'message-list', this.actor = new St.Widget({ style_class: 'message-list',
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
x_expand: true, y_expand: true }); x_expand: true, y_expand: true });
@@ -1135,7 +1087,7 @@ var CalendarMessageList = new Lang.Class({
box.add_actor(this._scrollView); box.add_actor(this._scrollView);
this._clearButton = new St.Button({ style_class: 'message-list-clear-button button', this._clearButton = new St.Button({ style_class: 'message-list-clear-button button',
label: _("Clear All"), label: _("Clear"),
can_focus: true }); can_focus: true });
this._clearButton.set_x_align(Clutter.ActorAlign.END); this._clearButton.set_x_align(Clutter.ActorAlign.END);
this._clearButton.connect('clicked', () => { this._clearButton.connect('clicked', () => {
@@ -1161,7 +1113,7 @@ var CalendarMessageList = new Lang.Class({
this._addSection(this._eventsSection); this._addSection(this._eventsSection);
Main.sessionMode.connect('updated', this._sync.bind(this)); Main.sessionMode.connect('updated', this._sync.bind(this));
}, }
_addSection(section) { _addSection(section) {
let obj = { let obj = {
@@ -1186,7 +1138,7 @@ var CalendarMessageList = new Lang.Class({
this._sections.set(section, obj); this._sections.set(section, obj);
this._sectionList.add_actor(section.actor); this._sectionList.add_actor(section.actor);
this._sync(); this._sync();
}, }
_removeSection(section) { _removeSection(section) {
let obj = this._sections.get(section); let obj = this._sections.get(section);
@@ -1199,11 +1151,11 @@ var CalendarMessageList = new Lang.Class({
this._sections.delete(section); this._sections.delete(section);
this._sectionList.remove_actor(section.actor); this._sectionList.remove_actor(section.actor);
this._sync(); this._sync();
}, }
_onKeyFocusIn(section, actor) { _onKeyFocusIn(section, actor) {
Util.ensureActorVisibleInScrollView(this._scrollView, actor); Util.ensureActorVisibleInScrollView(this._scrollView, actor);
}, }
_sync() { _sync() {
let sections = [...this._sections.keys()]; let sections = [...this._sections.keys()];
@@ -1218,15 +1170,15 @@ var CalendarMessageList = new Lang.Class({
let canClear = sections.some(s => s.canClear && s.actor.visible); let canClear = sections.some(s => s.canClear && s.actor.visible);
this._clearButton.reactive = canClear; this._clearButton.reactive = canClear;
}, }
setEventSource(eventSource) { setEventSource(eventSource) {
this._eventsSection.setEventSource(eventSource); this._eventsSection.setEventSource(eventSource);
}, }
setDate(date) { setDate(date) {
for (let section of this._sections.keys()) for (let section of this._sections.keys())
section.setDate(date); section.setDate(date);
this._placeholder.setDate(date); this._placeholder.setDate(date);
} }
}); };

View File

@@ -2,12 +2,8 @@ const Clutter = imports.gi.Clutter;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang; var CheckBox = class CheckBox {
constructor(label) {
var CheckBox = new Lang.Class({
Name: 'CheckBox',
_init(label) {
let container = new St.BoxLayout(); let container = new St.BoxLayout();
this.actor = new St.Button({ style_class: 'check-box', this.actor = new St.Button({ style_class: 'check-box',
child: container, child: container,
@@ -28,13 +24,13 @@ var CheckBox = new Lang.Class({
if (label) if (label)
this.setLabel(label); this.setLabel(label);
}, }
setLabel(label) { setLabel(label) {
this._label.set_text(label); this._label.set_text(label);
}, }
getLabelActor() { getLabelActor() {
return this._label; return this._label;
} }
}); };

View File

@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -16,31 +15,29 @@ var FROZEN_WINDOW_BRIGHTNESS = -0.3
var DIALOG_TRANSITION_TIME = 0.15 var DIALOG_TRANSITION_TIME = 0.15
var ALIVE_TIMEOUT = 5000; var ALIVE_TIMEOUT = 5000;
var CloseDialog = new Lang.Class({ var CloseDialog = GObject.registerClass({
Name: 'CloseDialog',
Extends: GObject.Object,
Implements: [ Meta.CloseDialog ], Implements: [ Meta.CloseDialog ],
Properties: { Properties: {
'window': GObject.ParamSpec.override('window', Meta.CloseDialog) 'window': GObject.ParamSpec.override('window', Meta.CloseDialog)
}, },
}, class CloseDialog extends GObject.Object {
_init(window) { _init(window) {
this.parent(); super._init();
this._window = window; this._window = window;
this._dialog = null; this._dialog = null;
this._tracked = undefined; this._tracked = undefined;
this._timeoutId = 0; this._timeoutId = 0;
this._windowFocusChangedId = 0; this._windowFocusChangedId = 0;
this._keyFocusChangedId = 0; this._keyFocusChangedId = 0;
}, }
get window() { get window() {
return this._window; return this._window;
}, }
set window(window) { set window(window) {
this._window = window; this._window = window;
}, }
_createDialogContent() { _createDialogContent() {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
@@ -52,7 +49,7 @@ var CloseDialog = new Lang.Class({
"continue or force the application to quit entirely."); "continue or force the application to quit entirely.");
let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' }); let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' });
return new Dialog.MessageDialogContent({ icon, title, subtitle }); return new Dialog.MessageDialogContent({ icon, title, subtitle });
}, }
_initDialog() { _initDialog() {
if (this._dialog) if (this._dialog)
@@ -72,7 +69,7 @@ var CloseDialog = new Lang.Class({
key: Clutter.Escape }); key: Clutter.Escape });
global.focus_manager.add_group(this._dialog); global.focus_manager.add_group(this._dialog);
}, }
_addWindowEffect() { _addWindowEffect() {
// We set the effect on the surface actor, so the dialog itself // We set the effect on the surface actor, so the dialog itself
@@ -83,21 +80,21 @@ var CloseDialog = new Lang.Class({
let effect = new Clutter.BrightnessContrastEffect(); let effect = new Clutter.BrightnessContrastEffect();
effect.set_brightness(FROZEN_WINDOW_BRIGHTNESS); effect.set_brightness(FROZEN_WINDOW_BRIGHTNESS);
surfaceActor.add_effect_with_name("gnome-shell-frozen-window", effect); surfaceActor.add_effect_with_name("gnome-shell-frozen-window", effect);
}, }
_removeWindowEffect() { _removeWindowEffect() {
let windowActor = this._window.get_compositor_private(); let windowActor = this._window.get_compositor_private();
let surfaceActor = windowActor.get_first_child(); let surfaceActor = windowActor.get_first_child();
surfaceActor.remove_effect_by_name("gnome-shell-frozen-window"); surfaceActor.remove_effect_by_name("gnome-shell-frozen-window");
}, }
_onWait() { _onWait() {
this.response(Meta.CloseDialogResponse.WAIT); this.response(Meta.CloseDialogResponse.WAIT);
}, }
_onClose() { _onClose() {
this.response(Meta.CloseDialogResponse.FORCE_CLOSE); this.response(Meta.CloseDialogResponse.FORCE_CLOSE);
}, }
_onFocusChanged() { _onFocusChanged() {
if (Meta.is_wayland_compositor()) if (Meta.is_wayland_compositor())
@@ -128,7 +125,7 @@ var CloseDialog = new Lang.Class({
}); });
this._tracked = shouldTrack; this._tracked = shouldTrack;
}, }
vfunc_show() { vfunc_show() {
if (this._dialog != null) if (this._dialog != null)
@@ -162,7 +159,7 @@ var CloseDialog = new Lang.Class({
time: DIALOG_TRANSITION_TIME, time: DIALOG_TRANSITION_TIME,
onComplete: this._onFocusChanged.bind(this) onComplete: this._onFocusChanged.bind(this)
}); });
}, }
vfunc_hide() { vfunc_hide() {
if (this._dialog == null) if (this._dialog == null)
@@ -191,7 +188,7 @@ var CloseDialog = new Lang.Class({
dialog.destroy(); dialog.destroy();
} }
}); });
}, }
vfunc_focus() { vfunc_focus() {
if (this._dialog) if (this._dialog)

View File

@@ -1,17 +1,13 @@
const Lang = imports.lang;
const Main = imports.ui.main; const Main = imports.ui.main;
var ComponentManager = new Lang.Class({ var ComponentManager = class {
Name: 'ComponentManager', constructor() {
_init() {
this._allComponents = {}; this._allComponents = {};
this._enabledComponents = []; this._enabledComponents = [];
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
this._sessionUpdated(); this._sessionUpdated();
}, }
_sessionUpdated() { _sessionUpdated() {
let newEnabledComponents = Main.sessionMode.components; let newEnabledComponents = Main.sessionMode.components;
@@ -29,12 +25,12 @@ var ComponentManager = new Lang.Class({
}); });
this._enabledComponents = newEnabledComponents; this._enabledComponents = newEnabledComponents;
}, }
_importComponent(name) { _importComponent(name) {
let module = imports.ui.components[name]; let module = imports.ui.components[name];
return module.Component; return module.Component;
}, }
_ensureComponent(name) { _ensureComponent(name) {
let component = this._allComponents[name]; let component = this._allComponents[name];
@@ -48,13 +44,13 @@ var ComponentManager = new Lang.Class({
component = new constructor(); component = new constructor();
this._allComponents[name] = component; this._allComponents[name] = component;
return component; return component;
}, }
_enableComponent(name) { _enableComponent(name) {
let component = this._ensureComponent(name); let component = this._ensureComponent(name);
if (component) if (component)
component.enable(); component.enable();
}, }
_disableComponent(name) { _disableComponent(name) {
let component = this._allComponents[name]; let component = this._allComponents[name];
@@ -62,4 +58,4 @@ var ComponentManager = new Lang.Class({
return; return;
component.disable(); component.disable();
} }
}); };

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
@@ -19,10 +18,8 @@ const SETTING_ENABLE_AUTOMOUNT = 'automount';
var AUTORUN_EXPIRE_TIMEOUT_SECS = 10; var AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
var AutomountManager = new Lang.Class({ var AutomountManager = class {
Name: 'AutomountManager', constructor() {
_init() {
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
this._volumeQueue = []; this._volumeQueue = [];
this._activeOperations = new Map(); this._activeOperations = new Map();
@@ -34,7 +31,7 @@ var AutomountManager = new Lang.Class({
this._inhibited = false; this._inhibited = false;
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();
}, }
enable() { enable() {
this._volumeAddedId = this._volumeMonitor.connect('volume-added', this._onVolumeAdded.bind(this)); this._volumeAddedId = this._volumeMonitor.connect('volume-added', this._onVolumeAdded.bind(this));
@@ -45,7 +42,7 @@ var AutomountManager = new Lang.Class({
this._mountAllId = Mainloop.idle_add(this._startupMountAll.bind(this)); this._mountAllId = Mainloop.idle_add(this._startupMountAll.bind(this));
GLib.Source.set_name_by_id(this._mountAllId, '[gnome-shell] this._startupMountAll'); GLib.Source.set_name_by_id(this._mountAllId, '[gnome-shell] this._startupMountAll');
}, }
disable() { disable() {
this._volumeMonitor.disconnect(this._volumeAddedId); this._volumeMonitor.disconnect(this._volumeAddedId);
@@ -58,7 +55,7 @@ var AutomountManager = new Lang.Class({
Mainloop.source_remove(this._mountAllId); Mainloop.source_remove(this._mountAllId);
this._mountAllId = 0; this._mountAllId = 0;
} }
}, }
_InhibitorsChanged(object, senderName, [inhibtor]) { _InhibitorsChanged(object, senderName, [inhibtor]) {
this._session.IsInhibitedRemote(GNOME_SESSION_AUTOMOUNT_INHIBIT, this._session.IsInhibitedRemote(GNOME_SESSION_AUTOMOUNT_INHIBIT,
@@ -67,7 +64,7 @@ var AutomountManager = new Lang.Class({
this._inhibited = result[0]; this._inhibited = result[0];
} }
}); });
}, }
_startupMountAll() { _startupMountAll() {
let volumes = this._volumeMonitor.get_volumes(); let volumes = this._volumeMonitor.get_volumes();
@@ -79,7 +76,7 @@ var AutomountManager = new Lang.Class({
this._mountAllId = 0; this._mountAllId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_onDriveConnected() { _onDriveConnected() {
// if we're not in the current ConsoleKit session, // if we're not in the current ConsoleKit session,
@@ -91,7 +88,7 @@ var AutomountManager = new Lang.Class({
player.play_from_theme('device-added-media', player.play_from_theme('device-added-media',
_("External drive connected"), _("External drive connected"),
null); null);
}, }
_onDriveDisconnected() { _onDriveDisconnected() {
// if we're not in the current ConsoleKit session, // if we're not in the current ConsoleKit session,
@@ -103,7 +100,7 @@ var AutomountManager = new Lang.Class({
sound.play_from_theme('device-removed-media', sound.play_from_theme('device-removed-media',
_("External drive disconnected"), _("External drive disconnected"),
null); null);
}, }
_onDriveEjectButton(monitor, drive) { _onDriveEjectButton(monitor, drive) {
// TODO: this code path is not tested, as the GVfs volume monitor // TODO: this code path is not tested, as the GVfs volume monitor
@@ -134,11 +131,11 @@ var AutomountManager = new Lang.Class({
} }
}); });
} }
}, }
_onVolumeAdded(monitor, volume) { _onVolumeAdded(monitor, volume) {
this._checkAndMountVolume(volume); this._checkAndMountVolume(volume);
}, }
_checkAndMountVolume(volume, params) { _checkAndMountVolume(volume, params) {
params = Params.parse(params, { checkSession: true, params = Params.parse(params, { checkSession: true,
@@ -178,7 +175,7 @@ var AutomountManager = new Lang.Class({
} else { } else {
this._mountVolume(volume, null, params.allowAutorun); this._mountVolume(volume, null, params.allowAutorun);
} }
}, }
_mountVolume(volume, operation, allowAutorun) { _mountVolume(volume, operation, allowAutorun) {
if (allowAutorun) if (allowAutorun)
@@ -189,7 +186,7 @@ var AutomountManager = new Lang.Class({
volume.mount(0, mountOp, null, volume.mount(0, mountOp, null,
this._onVolumeMounted.bind(this)); this._onVolumeMounted.bind(this));
}, }
_onVolumeMounted(volume, res) { _onVolumeMounted(volume, res) {
this._allowAutorunExpire(volume); this._allowAutorunExpire(volume);
@@ -214,7 +211,7 @@ var AutomountManager = new Lang.Class({
this._closeOperation(volume); this._closeOperation(volume);
} }
} }
}, }
_onVolumeRemoved(monitor, volume) { _onVolumeRemoved(monitor, volume) {
if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) { if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) {
@@ -223,7 +220,7 @@ var AutomountManager = new Lang.Class({
} }
this._volumeQueue = this._volumeQueue =
this._volumeQueue.filter(element => (element != volume)); this._volumeQueue.filter(element => (element != volume));
}, }
_reaskPassword(volume) { _reaskPassword(volume) {
let prevOperation = this._activeOperations.get(volume); let prevOperation = this._activeOperations.get(volume);
@@ -232,7 +229,7 @@ var AutomountManager = new Lang.Class({
new ShellMountOperation.ShellMountOperation(volume, new ShellMountOperation.ShellMountOperation(volume,
{ existingDialog: existingDialog }); { existingDialog: existingDialog });
this._mountVolume(volume, operation); this._mountVolume(volume, operation);
}, }
_closeOperation(volume) { _closeOperation(volume) {
let operation = this._activeOperations.get(volume); let operation = this._activeOperations.get(volume);
@@ -240,11 +237,11 @@ var AutomountManager = new Lang.Class({
return; return;
operation.close(); operation.close();
this._activeOperations.delete(volume); this._activeOperations.delete(volume);
}, }
_allowAutorun(volume) { _allowAutorun(volume) {
volume.allowAutorun = true; volume.allowAutorun = true;
}, }
_allowAutorunExpire(volume) { _allowAutorunExpire(volume) {
let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => { let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => {
@@ -255,5 +252,5 @@ var AutomountManager = new Lang.Class({
volume._allowAutorunExpireId = id; volume._allowAutorunExpireId = id;
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun'); GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
} }
}); };
var Component = AutomountManager; var Component = AutomountManager;

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const St = imports.gi.St; const St = imports.gi.St;
@@ -84,13 +83,11 @@ function HotplugSniffer() {
'/org/gnome/Shell/HotplugSniffer'); '/org/gnome/Shell/HotplugSniffer');
} }
var ContentTypeDiscoverer = new Lang.Class({ var ContentTypeDiscoverer = class {
Name: 'ContentTypeDiscoverer', constructor(callback) {
_init(callback) {
this._callback = callback; this._callback = callback;
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
}, }
guessContentTypes(mount) { guessContentTypes(mount) {
let autorunEnabled = !this._settings.get_boolean(SETTING_DISABLE_AUTORUN); let autorunEnabled = !this._settings.get_boolean(SETTING_DISABLE_AUTORUN);
@@ -103,7 +100,7 @@ var ContentTypeDiscoverer = new Lang.Class({
} else { } else {
this._emitCallback(mount, []); this._emitCallback(mount, []);
} }
}, }
_onContentTypeGuessed(mount, res) { _onContentTypeGuessed(mount, res) {
let contentTypes = []; let contentTypes = [];
@@ -126,7 +123,7 @@ var ContentTypeDiscoverer = new Lang.Class({
this._emitCallback(mount, contentTypes); this._emitCallback(mount, contentTypes);
}); });
} }
}, }
_emitCallback(mount, contentTypes) { _emitCallback(mount, contentTypes) {
if (!contentTypes) if (!contentTypes)
@@ -150,27 +147,25 @@ var ContentTypeDiscoverer = new Lang.Class({
this._callback(mount, apps, contentTypes); this._callback(mount, apps, contentTypes);
} }
}); };
var AutorunManager = new Lang.Class({ var AutorunManager = class {
Name: 'AutorunManager', constructor() {
_init() {
this._session = new GnomeSession.SessionManager(); this._session = new GnomeSession.SessionManager();
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();
this._dispatcher = new AutorunDispatcher(this); this._dispatcher = new AutorunDispatcher(this);
}, }
enable() { enable() {
this._mountAddedId = this._volumeMonitor.connect('mount-added', this._onMountAdded.bind(this)); this._mountAddedId = this._volumeMonitor.connect('mount-added', this._onMountAdded.bind(this));
this._mountRemovedId = this._volumeMonitor.connect('mount-removed', this._onMountRemoved.bind(this)); this._mountRemovedId = this._volumeMonitor.connect('mount-removed', this._onMountRemoved.bind(this));
}, }
disable() { disable() {
this._volumeMonitor.disconnect(this._mountAddedId); this._volumeMonitor.disconnect(this._mountAddedId);
this._volumeMonitor.disconnect(this._mountRemovedId); this._volumeMonitor.disconnect(this._mountRemovedId);
}, }
_onMountAdded(monitor, mount) { _onMountAdded(monitor, mount) {
// don't do anything if our session is not the currently // don't do anything if our session is not the currently
@@ -182,21 +177,19 @@ var AutorunManager = new Lang.Class({
this._dispatcher.addMount(mount, apps, contentTypes); this._dispatcher.addMount(mount, apps, contentTypes);
}); });
discoverer.guessContentTypes(mount); discoverer.guessContentTypes(mount);
}, }
_onMountRemoved(monitor, mount) { _onMountRemoved(monitor, mount) {
this._dispatcher.removeMount(mount); this._dispatcher.removeMount(mount);
} }
}); };
var AutorunDispatcher = new Lang.Class({ var AutorunDispatcher = class {
Name: 'AutorunDispatcher', constructor(manager) {
_init(manager) {
this._manager = manager; this._manager = manager;
this._sources = []; this._sources = [];
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
}, }
_getAutorunSettingForType(contentType) { _getAutorunSettingForType(contentType) {
let runApp = this._settings.get_strv(SETTING_START_APP); let runApp = this._settings.get_strv(SETTING_START_APP);
@@ -212,7 +205,7 @@ var AutorunDispatcher = new Lang.Class({
return AutorunSetting.FILES; return AutorunSetting.FILES;
return AutorunSetting.ASK; return AutorunSetting.ASK;
}, }
_getSourceForMount(mount) { _getSourceForMount(mount) {
let filtered = this._sources.filter(source => (source.mount == mount)); let filtered = this._sources.filter(source => (source.mount == mount));
@@ -224,7 +217,7 @@ var AutorunDispatcher = new Lang.Class({
return filtered[0]; return filtered[0];
return null; return null;
}, }
_addSource(mount, apps) { _addSource(mount, apps) {
// if we already have a source showing for this // if we already have a source showing for this
@@ -234,7 +227,7 @@ var AutorunDispatcher = new Lang.Class({
// add a new source // add a new source
this._sources.push(new AutorunSource(this._manager, mount, apps)); this._sources.push(new AutorunSource(this._manager, mount, apps));
}, }
addMount(mount, apps, contentTypes) { addMount(mount, apps, contentTypes) {
// if autorun is disabled globally, return // if autorun is disabled globally, return
@@ -272,7 +265,7 @@ var AutorunDispatcher = new Lang.Class({
// but we failed launching the default app or the default file manager // but we failed launching the default app or the default file manager
if (!success) if (!success)
this._addSource(mount, apps); this._addSource(mount, apps);
}, }
removeMount(mount) { removeMount(mount) {
let source = this._getSourceForMount(mount); let source = this._getSourceForMount(mount);
@@ -284,45 +277,39 @@ var AutorunDispatcher = new Lang.Class({
// destroy the notification source // destroy the notification source
source.destroy(); source.destroy();
} }
}); };
var AutorunSource = new Lang.Class({ var AutorunSource = class extends MessageTray.Source {
Name: 'AutorunSource', constructor(manager, mount, apps) {
Extends: MessageTray.Source, super(mount.get_name());
_init(manager, mount, apps) {
this._manager = manager; this._manager = manager;
this.mount = mount; this.mount = mount;
this.apps = apps; this.apps = apps;
this.parent(mount.get_name());
this._notification = new AutorunNotification(this._manager, this); this._notification = new AutorunNotification(this._manager, this);
// add ourselves as a source, and popup the notification // add ourselves as a source, and popup the notification
Main.messageTray.add(this); Main.messageTray.add(this);
this.notify(this._notification); this.notify(this._notification);
}, }
getIcon() { getIcon() {
return this.mount.get_icon(); return this.mount.get_icon();
}, }
_createPolicy() { _createPolicy() {
return new MessageTray.NotificationApplicationPolicy('org.gnome.Nautilus'); return new MessageTray.NotificationApplicationPolicy('org.gnome.Nautilus');
} }
}); };
var AutorunNotification = new Lang.Class({ var AutorunNotification = class extends MessageTray.Notification {
Name: 'AutorunNotification', constructor(manager, source) {
Extends: MessageTray.Notification, super(source, source.title);
_init(manager, source) {
this.parent(source, source.title);
this._manager = manager; this._manager = manager;
this._mount = source.mount; this._mount = source.mount;
}, }
createBanner() { createBanner() {
let banner = new MessageTray.NotificationBanner(this); let banner = new MessageTray.NotificationBanner(this);
@@ -335,7 +322,7 @@ var AutorunNotification = new Lang.Class({
}); });
return banner; return banner;
}, }
_buttonForApp(app) { _buttonForApp(app) {
let box = new St.BoxLayout(); let box = new St.BoxLayout();
@@ -362,14 +349,14 @@ var AutorunNotification = new Lang.Class({
}); });
return button; return button;
}, }
activate() { activate() {
this.parent(); super.activate();
let app = Gio.app_info_get_default_for_type('inode/directory', false); let app = Gio.app_info_get_default_for_type('inode/directory', false);
startAppForMount(app, this._mount); startAppForMount(app, this._mount);
} }
}); };
var Component = AutorunManager; var Component = AutorunManager;

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const St = imports.gi.St; const St = imports.gi.St;
@@ -17,15 +16,10 @@ const CheckBox = imports.ui.checkBox;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var WORK_SPINNER_ANIMATION_DELAY = 1.0;
var WORK_SPINNER_ANIMATION_TIME = 0.3;
var KeyringDialog = new Lang.Class({ var KeyringDialog = class extends ModalDialog.ModalDialog {
Name: 'KeyringDialog', constructor() {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'prompt-dialog' });
_init() {
this.parent({ styleClass: 'prompt-dialog' });
this.prompt = new Shell.KeyringPrompt(); this.prompt = new Shell.KeyringPrompt();
this.prompt.connect('show-password', this._onShowPassword.bind(this)); this.prompt.connect('show-password', this._onShowPassword.bind(this));
@@ -63,34 +57,17 @@ var KeyringDialog = new Lang.Class({
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
}, }
_setWorking(working) { _setWorking(working) {
if (!this._workSpinner) if (!this._workSpinner)
return; return;
Tweener.removeTweens(this._workSpinner.actor); if (working)
if (working) {
this._workSpinner.play(); this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor, else
{ opacity: 255, this._workSpinner.stop();
delay: WORK_SPINNER_ANIMATION_DELAY, }
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
}
},
_buildControlTable() { _buildControlTable() {
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
@@ -114,9 +91,7 @@ var KeyringDialog = new Lang.Class({
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this)); this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this));
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true);
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
if (rtl) { if (rtl) {
layout.attach(this._workSpinner.actor, 0, row, 1, 1); layout.attach(this._workSpinner.actor, 0, row, 1, 1);
@@ -183,7 +158,7 @@ var KeyringDialog = new Lang.Class({
this._controlTable = table; this._controlTable = table;
this._content.messageBox.add(table, { x_fill: true, y_fill: true }); this._content.messageBox.add(table, { x_fill: true, y_fill: true });
}, }
_updateSensitivity(sensitive) { _updateSensitivity(sensitive) {
if (this._passwordEntry) { if (this._passwordEntry) {
@@ -199,7 +174,7 @@ var KeyringDialog = new Lang.Class({
this._continueButton.can_focus = sensitive; this._continueButton.can_focus = sensitive;
this._continueButton.reactive = sensitive; this._continueButton.reactive = sensitive;
this._setWorking(!sensitive); this._setWorking(!sensitive);
}, }
_ensureOpen() { _ensureOpen() {
// NOTE: ModalDialog.open() is safe to call if the dialog is // NOTE: ModalDialog.open() is safe to call if the dialog is
@@ -217,65 +192,61 @@ var KeyringDialog = new Lang.Class({
' Dismissing prompt request'); ' Dismissing prompt request');
this.prompt.cancel() this.prompt.cancel()
return false; return false;
}, }
_onShowPassword(prompt) { _onShowPassword(prompt) {
this._buildControlTable(); this._buildControlTable();
this._ensureOpen(); this._ensureOpen();
this._updateSensitivity(true); this._updateSensitivity(true);
this._passwordEntry.grab_key_focus(); this._passwordEntry.grab_key_focus();
}, }
_onShowConfirm(prompt) { _onShowConfirm(prompt) {
this._buildControlTable(); this._buildControlTable();
this._ensureOpen(); this._ensureOpen();
this._updateSensitivity(true); this._updateSensitivity(true);
this._continueButton.grab_key_focus(); this._continueButton.grab_key_focus();
}, }
_onHidePrompt(prompt) { _onHidePrompt(prompt) {
this.close(); this.close();
}, }
_onPasswordActivate() { _onPasswordActivate() {
if (this.prompt.confirm_visible) if (this.prompt.confirm_visible)
this._confirmEntry.grab_key_focus(); this._confirmEntry.grab_key_focus();
else else
this._onContinueButton(); this._onContinueButton();
}, }
_onConfirmActivate() { _onConfirmActivate() {
this._onContinueButton(); this._onContinueButton();
}, }
_onContinueButton() { _onContinueButton() {
this._updateSensitivity(false); this._updateSensitivity(false);
this.prompt.complete(); this.prompt.complete();
}, }
_onCancelButton() { _onCancelButton() {
this.prompt.cancel(); this.prompt.cancel();
}, }
}); };
var KeyringDummyDialog = new Lang.Class({ var KeyringDummyDialog = class {
Name: 'KeyringDummyDialog', constructor() {
_init() {
this.prompt = new Shell.KeyringPrompt(); this.prompt = new Shell.KeyringPrompt();
this.prompt.connect('show-password', this._cancelPrompt.bind(this)); this.prompt.connect('show-password', this._cancelPrompt.bind(this));
this.prompt.connect('show-confirm', this._cancelPrompt.bind(this)); this.prompt.connect('show-confirm', this._cancelPrompt.bind(this));
}, }
_cancelPrompt() { _cancelPrompt() {
this.prompt.cancel(); this.prompt.cancel();
} }
}); };
var KeyringPrompter = new Lang.Class({ var KeyringPrompter = class {
Name: 'KeyringPrompter', constructor() {
_init() {
this._prompter = new Gcr.SystemPrompter(); this._prompter = new Gcr.SystemPrompter();
this._prompter.connect('new-prompt', () => { this._prompter.connect('new-prompt', () => {
let dialog = this._enabled ? new KeyringDialog() let dialog = this._enabled ? new KeyringDialog()
@@ -287,7 +258,7 @@ var KeyringPrompter = new Lang.Class({
this._registered = false; this._registered = false;
this._enabled = false; this._enabled = false;
this._currentPrompt = null; this._currentPrompt = null;
}, }
enable() { enable() {
if (!this._registered) { if (!this._registered) {
@@ -297,7 +268,7 @@ var KeyringPrompter = new Lang.Class({
this._registered = true; this._registered = true;
} }
this._enabled = true; this._enabled = true;
}, }
disable() { disable() {
this._enabled = false; this._enabled = false;
@@ -306,6 +277,6 @@ var KeyringPrompter = new Lang.Class({
this._currentPrompt.cancel(); this._currentPrompt.cancel();
this._currentPrompt = null; this._currentPrompt = null;
} }
}); };
var Component = KeyringPrompter; var Component = KeyringPrompter;

View File

@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang;
const NM = imports.gi.NM; const NM = imports.gi.NM;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -21,12 +20,9 @@ const ShellEntry = imports.ui.shellEntry;
const VPN_UI_GROUP = 'VPN Plugin UI'; const VPN_UI_GROUP = 'VPN Plugin UI';
var NetworkSecretDialog = new Lang.Class({ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
Name: 'NetworkSecretDialog', constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'prompt-dialog' });
_init(agent, requestId, connection, settingName, hints, contentOverride) {
this.parent({ styleClass: 'prompt-dialog' });
this._agent = agent; this._agent = agent;
this._requestId = requestId; this._requestId = requestId;
@@ -109,6 +105,18 @@ var NetworkSecretDialog = new Lang.Class({
contentBox.messageBox.add(secretTable); contentBox.messageBox.add(secretTable);
if (flags & NM.SecretAgentGetSecretsFlags.WPS_PBC_ACTIVE) {
let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
text: _("Alternatively you can connect by pushing the “WPS” button on your router.") });
descriptionLabel.clutter_text.line_wrap = true;
descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
messageBox.add(descriptionLabel,
{ y_fill: true,
y_align: St.Align.START,
expand: true });
}
this._okButton = { label: _("Connect"), this._okButton = { label: _("Connect"),
action: this._onOk.bind(this), action: this._onOk.bind(this),
default: true default: true
@@ -121,7 +129,7 @@ var NetworkSecretDialog = new Lang.Class({
this._okButton]); this._okButton]);
this._updateOkButton(); this._updateOkButton();
}, }
_updateOkButton() { _updateOkButton() {
let valid = true; let valid = true;
@@ -132,7 +140,7 @@ var NetworkSecretDialog = new Lang.Class({
this._okButton.button.reactive = valid; this._okButton.button.reactive = valid;
this._okButton.button.can_focus = valid; this._okButton.button.can_focus = valid;
}, }
_onOk() { _onOk() {
let valid = true; let valid = true;
@@ -148,12 +156,12 @@ var NetworkSecretDialog = new Lang.Class({
this.close(global.get_current_time()); this.close(global.get_current_time());
} }
// do nothing if not valid // do nothing if not valid
}, }
cancel() { cancel() {
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED); this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
this.close(global.get_current_time()); this.close(global.get_current_time());
}, }
_validateWpaPsk(secret) { _validateWpaPsk(secret) {
let value = secret.value; let value = secret.value;
@@ -169,7 +177,7 @@ var NetworkSecretDialog = new Lang.Class({
} }
return (value.length >= 8 && value.length <= 63); return (value.length >= 8 && value.length <= 63);
}, }
_validateStaticWep(secret) { _validateStaticWep(secret) {
let value = secret.value; let value = secret.value;
@@ -194,7 +202,7 @@ var NetworkSecretDialog = new Lang.Class({
return false; return false;
} }
return true; return true;
}, }
_getWirelessSecrets(secrets, wirelessSetting) { _getWirelessSecrets(secrets, wirelessSetting) {
let wirelessSecuritySetting = this._connection.get_setting_wireless_security(); let wirelessSecuritySetting = this._connection.get_setting_wireless_security();
@@ -231,7 +239,7 @@ var NetworkSecretDialog = new Lang.Class({
default: default:
log('Invalid wireless key management: ' + wirelessSecuritySetting.key_mgmt); log('Invalid wireless key management: ' + wirelessSecuritySetting.key_mgmt);
} }
}, }
_get8021xSecrets(secrets) { _get8021xSecrets(secrets) {
let ieee8021xSetting = this._connection.get_setting_802_1x(); let ieee8021xSetting = this._connection.get_setting_802_1x();
@@ -274,7 +282,7 @@ var NetworkSecretDialog = new Lang.Class({
default: default:
log('Invalid EAP/IEEE802.1x method: ' + ieee8021xSetting.get_eap_method(0)); log('Invalid EAP/IEEE802.1x method: ' + ieee8021xSetting.get_eap_method(0));
} }
}, }
_getPPPoESecrets(secrets) { _getPPPoESecrets(secrets) {
let pppoeSetting = this._connection.get_setting_pppoe(); let pppoeSetting = this._connection.get_setting_pppoe();
@@ -284,7 +292,7 @@ var NetworkSecretDialog = new Lang.Class({
value: pppoeSetting.service || '', password: false }); value: pppoeSetting.service || '', password: false });
secrets.push({ label: _("Password: "), key: 'password', secrets.push({ label: _("Password: "), key: 'password',
value: pppoeSetting.password || '', password: true }); value: pppoeSetting.password || '', password: true });
}, }
_getMobileSecrets(secrets, connectionType) { _getMobileSecrets(secrets, connectionType) {
let setting; let setting;
@@ -294,7 +302,7 @@ var NetworkSecretDialog = new Lang.Class({
setting = this._connection.get_setting_by_name(connectionType); setting = this._connection.get_setting_by_name(connectionType);
secrets.push({ label: _("Password: "), key: 'password', secrets.push({ label: _("Password: "), key: 'password',
value: setting.value || '', password: true }); value: setting.value || '', password: true });
}, }
_getContent() { _getContent() {
let connectionSetting = this._connection.get_setting_connection(); let connectionSetting = this._connection.get_setting_connection();
@@ -347,15 +355,14 @@ var NetworkSecretDialog = new Lang.Class({
return content; return content;
} }
}); };
var VPNRequestHandler = new Lang.Class({ var VPNRequestHandler = class {
Name: 'VPNRequestHandler', constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) {
_init(agent, requestId, authHelper, serviceType, connection, hints, flags) {
this._agent = agent; this._agent = agent;
this._requestId = requestId; this._requestId = requestId;
this._connection = connection; this._connection = connection;
this._flags = flags;
this._pluginOutBuffer = []; this._pluginOutBuffer = [];
this._title = null; this._title = null;
this._description = null; this._description = null;
@@ -412,7 +419,7 @@ var VPNRequestHandler = new Lang.Class({
this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
} }
}, }
cancel(respond) { cancel(respond) {
if (respond) if (respond)
@@ -428,7 +435,7 @@ var VPNRequestHandler = new Lang.Class({
} }
this.destroy(); this.destroy();
}, }
destroy() { destroy() {
if (this._destroyed) if (this._destroyed)
@@ -442,7 +449,7 @@ var VPNRequestHandler = new Lang.Class({
// Stdout is closed when we finish reading from it // Stdout is closed when we finish reading from it
this._destroyed = true; this._destroyed = true;
}, }
_vpnChildFinished(pid, status, requestObj) { _vpnChildFinished(pid, status, requestObj) {
this._childWatch = 0; this._childWatch = 0;
@@ -463,7 +470,7 @@ var VPNRequestHandler = new Lang.Class({
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
this.destroy(); this.destroy();
}, }
_vpnChildProcessLineOldStyle(line) { _vpnChildProcessLineOldStyle(line) {
if (this._previousLine != undefined) { if (this._previousLine != undefined) {
@@ -481,7 +488,7 @@ var VPNRequestHandler = new Lang.Class({
} else { } else {
this._previousLine = line; this._previousLine = line;
} }
}, }
_readStdoutOldStyle() { _readStdoutOldStyle() {
this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null, (stream, result) => { this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null, (stream, result) => {
@@ -498,7 +505,7 @@ var VPNRequestHandler = new Lang.Class({
// try to read more! // try to read more!
this._readStdoutOldStyle(); this._readStdoutOldStyle();
}); });
}, }
_readStdoutNewStyle() { _readStdoutNewStyle() {
this._dataStdout.fill_async(-1, GLib.PRIORITY_DEFAULT, null, (stream, result) => { this._dataStdout.fill_async(-1, GLib.PRIORITY_DEFAULT, null, (stream, result) => {
@@ -516,7 +523,7 @@ var VPNRequestHandler = new Lang.Class({
this._dataStdout.set_buffer_size(2 * this._dataStdout.get_buffer_size()); this._dataStdout.set_buffer_size(2 * this._dataStdout.get_buffer_size());
this._readStdoutNewStyle(); this._readStdoutNewStyle();
}); });
}, }
_showNewStyleDialog() { _showNewStyleDialog() {
let keyfile = new GLib.KeyFile(); let keyfile = new GLib.KeyFile();
@@ -574,13 +581,13 @@ var VPNRequestHandler = new Lang.Class({
if (contentOverride && contentOverride.secrets.length) { if (contentOverride && contentOverride.secrets.length) {
// Only show the dialog if we actually have something to ask // Only show the dialog if we actually have something to ask
this._shellDialog = new NetworkSecretDialog(this._agent, this._requestId, this._connection, 'vpn', [], contentOverride); this._shellDialog = new NetworkSecretDialog(this._agent, this._requestId, this._connection, 'vpn', [], this._flags, contentOverride);
this._shellDialog.open(global.get_current_time()); this._shellDialog.open(global.get_current_time());
} else { } else {
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED); this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED);
this.destroy(); this.destroy();
} }
}, }
_writeConnection() { _writeConnection() {
let vpnSetting = this._connection.get_setting_vpn(); let vpnSetting = this._connection.get_setting_vpn();
@@ -601,14 +608,12 @@ var VPNRequestHandler = new Lang.Class({
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
this.destroy(); this.destroy();
} }
}, }
}); };
Signals.addSignalMethods(VPNRequestHandler.prototype); Signals.addSignalMethods(VPNRequestHandler.prototype);
var NetworkAgent = new Lang.Class({ var NetworkAgent = class {
Name: 'NetworkAgent', constructor() {
_init() {
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent', this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent',
capabilities: NM.SecretAgentCapabilities.VPN_HINTS, capabilities: NM.SecretAgentCapabilities.VPN_HINTS,
auto_register: false auto_register: false
@@ -639,7 +644,7 @@ var NetworkAgent = new Lang.Class({
logError(e, 'error initializing the NetworkManager Agent'); logError(e, 'error initializing the NetworkManager Agent');
} }
}); });
}, }
enable() { enable() {
if (!this._native) if (!this._native)
@@ -648,7 +653,7 @@ var NetworkAgent = new Lang.Class({
this._native.auto_register = true; this._native.auto_register = true;
if (this._initialized && !this._native.registered) if (this._initialized && !this._native.registered)
this._native.register_async(null, null); this._native.register_async(null, null);
}, }
disable() { disable() {
let requestId; let requestId;
@@ -671,7 +676,7 @@ var NetworkAgent = new Lang.Class({
this._native.auto_register = false; this._native.auto_register = false;
if (this._initialized && this._native.registered) if (this._initialized && this._native.registered)
this._native.unregister_async(null, null); this._native.unregister_async(null, null);
}, }
_showNotification(requestId, connection, settingName, hints, flags) { _showNotification(requestId, connection, settingName, hints, flags) {
let source = new MessageTray.Source(_("Network Manager"), 'network-transmit-receive'); let source = new MessageTray.Source(_("Network Manager"), 'network-transmit-receive');
@@ -731,14 +736,14 @@ var NetworkAgent = new Lang.Class({
Main.messageTray.add(source); Main.messageTray.add(source);
source.notify(notification); source.notify(notification);
}, }
_newRequest(agent, requestId, connection, settingName, hints, flags) { _newRequest(agent, requestId, connection, settingName, hints, flags) {
if (!(flags & NM.SecretAgentGetSecretsFlags.USER_REQUESTED)) if (!(flags & NM.SecretAgentGetSecretsFlags.USER_REQUESTED))
this._showNotification(requestId, connection, settingName, hints, flags); this._showNotification(requestId, connection, settingName, hints, flags);
else else
this._handleRequest(requestId, connection, settingName, hints, flags); this._handleRequest(requestId, connection, settingName, hints, flags);
}, }
_handleRequest(requestId, connection, settingName, hints, flags) { _handleRequest(requestId, connection, settingName, hints, flags) {
if (settingName == 'vpn') { if (settingName == 'vpn') {
@@ -746,13 +751,13 @@ var NetworkAgent = new Lang.Class({
return; return;
} }
let dialog = new NetworkSecretDialog(this._native, requestId, connection, settingName, hints); let dialog = new NetworkSecretDialog(this._native, requestId, connection, settingName, hints, flags);
dialog.connect('destroy', () => { dialog.connect('destroy', () => {
delete this._dialogs[requestId]; delete this._dialogs[requestId];
}); });
this._dialogs[requestId] = dialog; this._dialogs[requestId] = dialog;
dialog.open(global.get_current_time()); dialog.open(global.get_current_time());
}, }
_cancelRequest(agent, requestId) { _cancelRequest(agent, requestId) {
if (this._dialogs[requestId]) { if (this._dialogs[requestId]) {
@@ -763,7 +768,7 @@ var NetworkAgent = new Lang.Class({
this._vpnRequests[requestId].cancel(false); this._vpnRequests[requestId].cancel(false);
delete this._vpnRequests[requestId]; delete this._vpnRequests[requestId];
} }
}, }
_vpnRequest(requestId, connection, hints, flags) { _vpnRequest(requestId, connection, hints, flags) {
let vpnSetting = connection.get_setting_vpn(); let vpnSetting = connection.get_setting_vpn();
@@ -785,7 +790,7 @@ var NetworkAgent = new Lang.Class({
delete this._vpnRequests[requestId]; delete this._vpnRequests[requestId];
}); });
this._vpnRequests[requestId] = vpnRequest; this._vpnRequests[requestId] = vpnRequest;
}, }
_buildVPNServiceCache() { _buildVPNServiceCache() {
if (this._vpnCacheBuilt) if (this._vpnCacheBuilt)
@@ -818,5 +823,5 @@ var NetworkAgent = new Lang.Class({
} }
}); });
} }
}); };
var Component = NetworkAgent; var Component = NetworkAgent;

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const AccountsService = imports.gi.AccountsService; const AccountsService = imports.gi.AccountsService;
@@ -25,15 +24,10 @@ const Tweener = imports.ui.tweener;
var DIALOG_ICON_SIZE = 48; var DIALOG_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var WORK_SPINNER_ANIMATION_DELAY = 1.0;
var WORK_SPINNER_ANIMATION_TIME = 0.3;
var AuthenticationDialog = new Lang.Class({ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
Name: 'AuthenticationDialog', constructor(actionId, body, cookie, userNames) {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'prompt-dialog' });
_init(actionId, body, cookie, userNames) {
this.parent({ styleClass: 'prompt-dialog' });
this.actionId = actionId; this.actionId = actionId;
this.message = body; this.message = body;
@@ -44,6 +38,8 @@ var AuthenticationDialog = new Lang.Class({
this._group.visible = !Main.sessionMode.isLocked; this._group.visible = !Main.sessionMode.isLocked;
}); });
this.connect('closed', this._onDialogClosed.bind(this));
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' }); let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
let title = _("Authentication Required"); let title = _("Authentication Required");
@@ -117,10 +113,7 @@ var AuthenticationDialog = new Lang.Class({
this._passwordBox.add(this._passwordEntry, this._passwordBox.add(this._passwordEntry,
{ expand: true }); { expand: true });
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true);
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._passwordBox.add(this._workSpinner.actor); this._passwordBox.add(this._workSpinner.actor);
this.setInitialKeyFocus(this._passwordEntry); this.setInitialKeyFocus(this._passwordEntry);
@@ -161,50 +154,25 @@ var AuthenticationDialog = new Lang.Class({
this._identityToAuth = Polkit.UnixUser.new_for_name(userName); this._identityToAuth = Polkit.UnixUser.new_for_name(userName);
this._cookie = cookie; this._cookie = cookie;
}, }
_setWorking(working) { _setWorking(working) {
Tweener.removeTweens(this._workSpinner.actor); if (working)
if (working) {
this._workSpinner.play(); this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor, else
{ opacity: 255, this._workSpinner.stop();
delay: WORK_SPINNER_ANIMATION_DELAY, }
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
}
},
performAuthentication() { performAuthentication() {
this.destroySession(); this._destroySession();
this._session = new PolkitAgent.Session({ identity: this._identityToAuth, this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
cookie: this._cookie }); cookie: this._cookie });
this._session.connect('completed', this._onSessionCompleted.bind(this)); this._sessionCompletedId = this._session.connect('completed', this._onSessionCompleted.bind(this));
this._session.connect('request', this._onSessionRequest.bind(this)); this._sessionRequestId = this._session.connect('request', this._onSessionRequest.bind(this));
this._session.connect('show-error', this._onSessionShowError.bind(this)); this._sessionShowErrorId = this._session.connect('show-error', this._onSessionShowError.bind(this));
this._session.connect('show-info', this._onSessionShowInfo.bind(this)); this._sessionShowInfoId = this._session.connect('show-info', this._onSessionShowInfo.bind(this));
this._session.initiate(); this._session.initiate();
}, }
close(timestamp) {
this.parent(timestamp);
if (this._sessionUpdatedId)
Main.sessionMode.disconnect(this._sessionUpdatedId);
this._sessionUpdatedId = 0;
},
_ensureOpen() { _ensureOpen() {
// NOTE: ModalDialog.open() is safe to call if the dialog is // NOTE: ModalDialog.open() is safe to call if the dialog is
@@ -226,14 +194,14 @@ var AuthenticationDialog = new Lang.Class({
' cookie ' + this._cookie); ' cookie ' + this._cookie);
this._emitDone(true); this._emitDone(true);
} }
}, }
_emitDone(dismissed) { _emitDone(dismissed) {
if (!this._doneEmitted) { if (!this._doneEmitted) {
this._doneEmitted = true; this._doneEmitted = true;
this.emit('done', dismissed); this.emit('done', dismissed);
} }
}, }
_updateSensitivity(sensitive) { _updateSensitivity(sensitive) {
this._passwordEntry.reactive = sensitive; this._passwordEntry.reactive = sensitive;
@@ -242,7 +210,7 @@ var AuthenticationDialog = new Lang.Class({
this._okButton.can_focus = sensitive; this._okButton.can_focus = sensitive;
this._okButton.reactive = sensitive; this._okButton.reactive = sensitive;
this._setWorking(!sensitive); this._setWorking(!sensitive);
}, }
_onEntryActivate() { _onEntryActivate() {
let response = this._passwordEntry.get_text(); let response = this._passwordEntry.get_text();
@@ -253,11 +221,11 @@ var AuthenticationDialog = new Lang.Class({
this._errorMessageLabel.hide(); this._errorMessageLabel.hide();
this._infoMessageLabel.hide(); this._infoMessageLabel.hide();
this._nullMessageLabel.show(); this._nullMessageLabel.show();
}, }
_onAuthenticateButtonPressed() { _onAuthenticateButtonPressed() {
this._onEntryActivate(); this._onEntryActivate();
}, }
_onSessionCompleted(session, gainedAuthorization) { _onSessionCompleted(session, gainedAuthorization) {
if (this._completed || this._doneEmitted) if (this._completed || this._doneEmitted)
@@ -289,7 +257,7 @@ var AuthenticationDialog = new Lang.Class({
/* Try and authenticate again */ /* Try and authenticate again */
this.performAuthentication(); this.performAuthentication();
} }
}, }
_onSessionRequest(session, request, echo_on) { _onSessionRequest(session, request, echo_on) {
// Cheap localization trick // Cheap localization trick
@@ -308,7 +276,7 @@ var AuthenticationDialog = new Lang.Class({
this._passwordEntry.grab_key_focus(); this._passwordEntry.grab_key_focus();
this._updateSensitivity(true); this._updateSensitivity(true);
this._ensureOpen(); this._ensureOpen();
}, }
_onSessionShowError(session, text) { _onSessionShowError(session, text) {
this._passwordEntry.set_text(''); this._passwordEntry.set_text('');
@@ -317,7 +285,7 @@ var AuthenticationDialog = new Lang.Class({
this._infoMessageLabel.hide(); this._infoMessageLabel.hide();
this._nullMessageLabel.hide(); this._nullMessageLabel.hide();
this._ensureOpen(); this._ensureOpen();
}, }
_onSessionShowInfo(session, text) { _onSessionShowInfo(session, text) {
this._passwordEntry.set_text(''); this._passwordEntry.set_text('');
@@ -326,43 +294,60 @@ var AuthenticationDialog = new Lang.Class({
this._errorMessageLabel.hide(); this._errorMessageLabel.hide();
this._nullMessageLabel.hide(); this._nullMessageLabel.hide();
this._ensureOpen(); this._ensureOpen();
}, }
destroySession() { _destroySession() {
if (this._session) { if (this._session) {
if (!this._completed) if (!this._completed)
this._session.cancel(); this._session.cancel();
this._completed = false; this._completed = false;
this._session.disconnect(this._sessionCompletedId);
this._session.disconnect(this._sessionRequestId);
this._session.disconnect(this._sessionShowErrorId);
this._session.disconnect(this._sessionShowInfoId);
this._session = null; this._session = null;
} }
}, }
_onUserChanged() { _onUserChanged() {
if (this._user.is_loaded && this._userAvatar) { if (this._user.is_loaded && this._userAvatar) {
this._userAvatar.update(); this._userAvatar.update();
this._userAvatar.actor.show(); this._userAvatar.actor.show();
} }
}, }
cancel() { cancel() {
this._wasDismissed = true; this._wasDismissed = true;
this.close(global.get_current_time()); this.close(global.get_current_time());
this._emitDone(true); this._emitDone(true);
}, }
});
_onDialogClosed() {
if (this._sessionUpdatedId)
Main.sessionMode.disconnect(this._sessionUpdatedId);
this._sessionUpdatedId = 0;
if (this._user) {
this._user.disconnect(this._userLoadedId);
this._user.disconnect(this._userChangedId);
this._user = null;
}
this._destroySession();
}
};
Signals.addSignalMethods(AuthenticationDialog.prototype); Signals.addSignalMethods(AuthenticationDialog.prototype);
var AuthenticationAgent = new Lang.Class({ var AuthenticationAgent = class {
Name: 'AuthenticationAgent', constructor() {
_init() {
this._currentDialog = null; this._currentDialog = null;
this._handle = null; this._handle = null;
this._native = new Shell.PolkitAuthenticationAgent(); this._native = new Shell.PolkitAuthenticationAgent();
this._native.connect('initiate', this._onInitiate.bind(this)); this._native.connect('initiate', this._onInitiate.bind(this));
this._native.connect('cancel', this._onCancel.bind(this)); this._native.connect('cancel', this._onCancel.bind(this));
this._sessionUpdatedId = 0; this._sessionUpdatedId = 0;
}, }
enable() { enable() {
try { try {
@@ -370,7 +355,7 @@ var AuthenticationAgent = new Lang.Class({
} catch(e) { } catch(e) {
log('Failed to register AuthenticationAgent'); log('Failed to register AuthenticationAgent');
} }
}, }
disable() { disable() {
try { try {
@@ -378,7 +363,7 @@ var AuthenticationAgent = new Lang.Class({
} catch(e) { } catch(e) {
log('Failed to unregister AuthenticationAgent'); log('Failed to unregister AuthenticationAgent');
} }
}, }
_onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) { _onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) {
// Don't pop up a dialog while locked // Don't pop up a dialog while locked
@@ -406,19 +391,18 @@ var AuthenticationAgent = new Lang.Class({
this._currentDialog.connect('done', this._onDialogDone.bind(this)); this._currentDialog.connect('done', this._onDialogDone.bind(this));
this._currentDialog.performAuthentication(); this._currentDialog.performAuthentication();
}, }
_onCancel(nativeAgent) { _onCancel(nativeAgent) {
this._completeRequest(false); this._completeRequest(false);
}, }
_onDialogDone(dialog, dismissed) { _onDialogDone(dialog, dismissed) {
this._completeRequest(dismissed); this._completeRequest(dismissed);
}, }
_completeRequest(dismissed) { _completeRequest(dismissed) {
this._currentDialog.close(); this._currentDialog.close();
this._currentDialog.destroySession();
this._currentDialog = null; this._currentDialog = null;
if (this._sessionUpdatedId) if (this._sessionUpdatedId)
@@ -426,7 +410,7 @@ var AuthenticationAgent = new Lang.Class({
this._sessionUpdatedId = 0; this._sessionUpdatedId = 0;
this._native.complete(dismissed); this._native.complete(dismissed);
}, }
}); };
var Component = AuthenticationAgent; var Component = AuthenticationAgent;

View File

@@ -3,6 +3,7 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
@@ -79,17 +80,15 @@ function makeMessageFromTplEvent(event) {
}; };
} }
var TelepathyComponent = new Lang.Class({ var TelepathyComponent = class {
Name: 'TelepathyComponent', constructor() {
_init() {
this._client = null; this._client = null;
if (!HAVE_TP) if (!HAVE_TP)
return; // Telepathy isn't available return; // Telepathy isn't available
this._client = new TelepathyClient(); this._client = new TelepathyClient();
}, }
enable() { enable() {
if (!this._client) if (!this._client)
@@ -103,7 +102,7 @@ var TelepathyComponent = new Lang.Class({
if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core())) if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
this._client.account_manager.prepare_async(null, null); this._client.account_manager.prepare_async(null, null);
}, }
disable() { disable() {
if (!this._client) if (!this._client)
@@ -111,12 +110,10 @@ var TelepathyComponent = new Lang.Class({
this._client.unregister(); this._client.unregister();
} }
}); };
var TelepathyClient = HAVE_TP ? new Lang.Class({
Name: 'TelepathyClient',
Extends: Tp.BaseClient,
var TelepathyClient = HAVE_TP ? GObject.registerClass(
class TelepathyClient extends Tp.BaseClient {
_init() { _init() {
// channel path -> ChatSource // channel path -> ChatSource
this._chatSources = {}; this._chatSources = {};
@@ -140,7 +137,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
// channel matching its filters is detected. // channel matching its filters is detected.
// The second argument, recover, means _observeChannels will be run // The second argument, recover, means _observeChannels will be run
// for any existing channel as well. // for any existing channel as well.
this.parent({ name: 'GnomeShell', super._init({ name: 'GnomeShell',
account_manager: this._accountManager, account_manager: this._accountManager,
uniquify_name: true }); uniquify_name: true });
@@ -158,7 +155,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
// needed // needed
this.set_delegated_channels_callback( this.set_delegated_channels_callback(
this._delegatedChannelsCb.bind(this)); this._delegatedChannelsCb.bind(this));
}, }
vfunc_observe_channels(account, conn, channels, vfunc_observe_channels(account, conn, channels,
dispatchOp, requests, context) { dispatchOp, requests, context) {
@@ -179,7 +176,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
} }
context.accept(); context.accept();
}, }
_createChatSource(account, conn, channel, contact) { _createChatSource(account, conn, channel, contact) {
if (this._chatSources[channel.get_object_path()]) if (this._chatSources[channel.get_object_path()])
@@ -191,13 +188,13 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
source.connect('destroy', () => { source.connect('destroy', () => {
delete this._chatSources[channel.get_object_path()]; delete this._chatSources[channel.get_object_path()];
}); });
}, }
vfunc_handle_channels(account, conn, channels, requests, vfunc_handle_channels(account, conn, channels, requests,
user_action_time, context) { user_action_time, context) {
this._handlingChannels(account, conn, channels, true); this._handlingChannels(account, conn, channels, true);
context.accept(); context.accept();
}, }
_handlingChannels(account, conn, channels, notify) { _handlingChannels(account, conn, channels, notify) {
let len = channels.length; let len = channels.length;
@@ -231,7 +228,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
source.notify(); source.notify();
} }
} }
}, }
vfunc_add_dispatch_operation(account, conn, channels, vfunc_add_dispatch_operation(account, conn, channels,
dispatchOp, context) { dispatchOp, context) {
@@ -249,7 +246,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
else else
context.fail(new Tp.Error({ code: Tp.Error.INVALID_ARGUMENT, context.fail(new Tp.Error({ code: Tp.Error.INVALID_ARGUMENT,
message: 'Unsupported channel type' })); message: 'Unsupported channel type' }));
}, }
_approveTextChannel(account, conn, channel, dispatchOp, context) { _approveTextChannel(account, conn, channel, dispatchOp, context) {
let [targetHandle, targetHandleType] = channel.get_handle(); let [targetHandle, targetHandleType] = channel.get_handle();
@@ -271,25 +268,22 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
}); });
context.accept(); context.accept();
}, }
_delegatedChannelsCb(client, channels) { _delegatedChannelsCb(client, channels) {
// Nothing to do as we don't make a distinction between observed and // Nothing to do as we don't make a distinction between observed and
// handled channels. // handled channels.
}, }
}) : null; }) : null;
var ChatSource = new Lang.Class({ var ChatSource = class extends MessageTray.Source {
Name: 'ChatSource', constructor(account, conn, channel, contact, client) {
Extends: MessageTray.Source, super(contact.get_alias());
_init(account, conn, channel, contact, client) {
this._account = account; this._account = account;
this._contact = contact; this._contact = contact;
this._client = client; this._client = client;
this.parent(contact.get_alias());
this.isChat = true; this.isChat = true;
this._pendingMessages = []; this._pendingMessages = [];
@@ -313,7 +307,7 @@ var ChatSource = new Lang.Class({
Main.messageTray.add(this); Main.messageTray.add(this);
this._getLogMessages(); this._getLogMessages();
}, }
_ensureNotification() { _ensureNotification() {
if (this._notification) if (this._notification)
@@ -329,13 +323,13 @@ var ChatSource = new Lang.Class({
this._notification = null; this._notification = null;
}); });
this.pushNotification(this._notification); this.pushNotification(this._notification);
}, }
_createPolicy() { _createPolicy() {
if (this._account.protocol_name == 'irc') if (this._account.protocol_name == 'irc')
return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari'); return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari');
return new MessageTray.NotificationApplicationPolicy('empathy'); return new MessageTray.NotificationApplicationPolicy('empathy');
}, }
createBanner() { createBanner() {
this._banner = new ChatNotificationBanner(this._notification); this._banner = new ChatNotificationBanner(this._notification);
@@ -348,7 +342,7 @@ var ChatSource = new Lang.Class({
}); });
return this._banner; return this._banner;
}, }
_updateAlias() { _updateAlias() {
let oldAlias = this.title; let oldAlias = this.title;
@@ -360,7 +354,7 @@ var ChatSource = new Lang.Class({
this.setTitle(newAlias); this.setTitle(newAlias);
if (this._notification) if (this._notification)
this._notification.appendAliasChange(oldAlias, newAlias); this._notification.appendAliasChange(oldAlias, newAlias);
}, }
getIcon() { getIcon() {
let file = this._contact.get_avatar_file(); let file = this._contact.get_avatar_file();
@@ -369,7 +363,7 @@ var ChatSource = new Lang.Class({
} else { } else {
return new Gio.ThemedIcon({ name: 'avatar-default' }); return new Gio.ThemedIcon({ name: 'avatar-default' });
} }
}, }
getSecondaryIcon() { getSecondaryIcon() {
let iconName; let iconName;
@@ -398,7 +392,7 @@ var ChatSource = new Lang.Class({
iconName = 'user-offline'; iconName = 'user-offline';
} }
return new Gio.ThemedIcon({ name: iconName }); return new Gio.ThemedIcon({ name: iconName });
}, }
_updateAvatarIcon() { _updateAvatarIcon() {
this.iconUpdated(); this.iconUpdated();
@@ -406,7 +400,7 @@ var ChatSource = new Lang.Class({
this._notification.update(this._notification.title, this._notification.update(this._notification.title,
this._notification.bannerBodyText, this._notification.bannerBodyText,
{ gicon: this.getIcon() }); { gicon: this.getIcon() });
}, }
open() { open() {
Main.overview.hide(); Main.overview.hide();
@@ -431,7 +425,7 @@ var ChatSource = new Lang.Class({
cd.present_channel_async(this._channel, global.get_current_time(), null); cd.present_channel_async(this._channel, global.get_current_time(), null);
} }
}, }
_getLogMessages() { _getLogMessages() {
let logManager = Tpl.LogManager.dup_singleton(); let logManager = Tpl.LogManager.dup_singleton();
@@ -440,7 +434,7 @@ var ChatSource = new Lang.Class({
logManager.get_filtered_events_async(this._account, entity, logManager.get_filtered_events_async(this._account, entity,
Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES, Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES,
null, this._displayPendingMessages.bind(this)); null, this._displayPendingMessages.bind(this));
}, }
_displayPendingMessages(logManager, result) { _displayPendingMessages(logManager, result) {
let [success, events] = logManager.get_filtered_events_finish(result); let [success, events] = logManager.get_filtered_events_finish(result);
@@ -493,7 +487,7 @@ var ChatSource = new Lang.Class({
if (pendingMessages.length > 0) if (pendingMessages.length > 0)
this.notify(); this.notify();
}, }
destroy(reason) { destroy(reason) {
if (this._client.is_handling_channel(this._channel)) { if (this._client.is_handling_channel(this._channel)) {
@@ -527,25 +521,25 @@ var ChatSource = new Lang.Class({
this._contact.disconnect(this._notifyAvatarId); this._contact.disconnect(this._notifyAvatarId);
this._contact.disconnect(this._presenceChangedId); this._contact.disconnect(this._presenceChangedId);
this.parent(reason); super.destroy(reason);
}, }
_channelClosed() { _channelClosed() {
this.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); this.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
}, }
/* All messages are new messages for Telepathy sources */ /* All messages are new messages for Telepathy sources */
get count() { get count() {
return this._pendingMessages.length; return this._pendingMessages.length;
}, }
get unseenCount() { get unseenCount() {
return this.count; return this.count;
}, }
get countVisible() { get countVisible() {
return this.count > 0; return this.count > 0;
}, }
_messageReceived(channel, message) { _messageReceived(channel, message) {
if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT) if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT)
@@ -565,7 +559,7 @@ var ChatSource = new Lang.Class({
this._notifyTimeoutId = Mainloop.timeout_add(500, this._notifyTimeoutId = Mainloop.timeout_add(500,
this._notifyTimeout.bind(this)); this._notifyTimeout.bind(this));
GLib.Source.set_name_by_id(this._notifyTimeoutId, '[gnome-shell] this._notifyTimeout'); GLib.Source.set_name_by_id(this._notifyTimeoutId, '[gnome-shell] this._notifyTimeout');
}, }
_notifyTimeout() { _notifyTimeout() {
if (this._pendingMessages.length != 0) if (this._pendingMessages.length != 0)
@@ -574,7 +568,7 @@ var ChatSource = new Lang.Class({
this._notifyTimeoutId = 0; this._notifyTimeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
// This is called for both messages we send from // This is called for both messages we send from
// our client and other clients as well. // our client and other clients as well.
@@ -582,11 +576,11 @@ var ChatSource = new Lang.Class({
this._ensureNotification(); this._ensureNotification();
message = makeMessageFromTpMessage(message, NotificationDirection.SENT); message = makeMessageFromTpMessage(message, NotificationDirection.SENT);
this._notification.appendMessage(message); this._notification.appendMessage(message);
}, }
notify() { notify() {
this.parent(this._notification); super.notify(this._notification);
}, }
respond(text) { respond(text) {
let type; let type;
@@ -601,7 +595,7 @@ var ChatSource = new Lang.Class({
this._channel.send_message_async(msg, 0, (src, result) => { this._channel.send_message_async(msg, 0, (src, result) => {
this._channel.send_message_finish(result); this._channel.send_message_finish(result);
}); });
}, }
setChatState(state) { setChatState(state) {
// We don't want to send COMPOSING every time a letter is typed into // We don't want to send COMPOSING every time a letter is typed into
@@ -614,14 +608,14 @@ var ChatSource = new Lang.Class({
this._chatState = state; this._chatState = state;
this._channel.set_chat_state_async(state, null); this._channel.set_chat_state_async(state, null);
} }
}, }
_presenceChanged(contact, presence, status, message) { _presenceChanged(contact, presence, status, message) {
if (this._notification) if (this._notification)
this._notification.update(this._notification.title, this._notification.update(this._notification.title,
this._notification.bannerBodyText, this._notification.bannerBodyText,
{ secondaryGIcon: this.getSecondaryIcon() }); { secondaryGIcon: this.getSecondaryIcon() });
}, }
_pendingRemoved(channel, message) { _pendingRemoved(channel, message) {
let idx = this._pendingMessages.indexOf(message); let idx = this._pendingMessages.indexOf(message);
@@ -634,35 +628,32 @@ var ChatSource = new Lang.Class({
if (this._pendingMessages.length == 0 && if (this._pendingMessages.length == 0 &&
this._banner && !this._banner.expanded) this._banner && !this._banner.expanded)
this._banner.hide(); this._banner.hide();
}, }
_ackMessages() { _ackMessages() {
// Don't clear our messages here, tp-glib will send a // Don't clear our messages here, tp-glib will send a
// 'pending-message-removed' for each one. // 'pending-message-removed' for each one.
this._channel.ack_all_pending_messages_async(null); this._channel.ack_all_pending_messages_async(null);
} }
}); };
var ChatNotification = new Lang.Class({ var ChatNotification = class extends MessageTray.Notification {
Name: 'ChatNotification', constructor(source) {
Extends: MessageTray.Notification, super(source, source.title, null,
{ secondaryGIcon: source.getSecondaryIcon() });
_init(source) {
this.parent(source, source.title, null,
{ secondaryGIcon: source.getSecondaryIcon() });
this.setUrgency(MessageTray.Urgency.HIGH); this.setUrgency(MessageTray.Urgency.HIGH);
this.setResident(true); this.setResident(true);
this.messages = []; this.messages = [];
this._timestampTimeoutId = 0; this._timestampTimeoutId = 0;
}, }
destroy(reason) { destroy(reason) {
if (this._timestampTimeoutId) if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId); Mainloop.source_remove(this._timestampTimeoutId);
this._timestampTimeoutId = 0; this._timestampTimeoutId = 0;
this.parent(reason); super.destroy(reason);
}, }
/** /**
* appendMessage: * appendMessage:
@@ -700,7 +691,7 @@ var ChatNotification = new Lang.Class({
styles: styles, styles: styles,
timestamp: message.timestamp, timestamp: message.timestamp,
noTimestamp: noTimestamp }); noTimestamp: noTimestamp });
}, }
_filterMessages() { _filterMessages() {
if (this.messages.length < 1) if (this.messages.length < 1)
@@ -725,7 +716,7 @@ var ChatNotification = new Lang.Class({
for (let i = 0; i < expired.length; i++) for (let i = 0; i < expired.length; i++)
this.emit('message-removed', expired[i]); this.emit('message-removed', expired[i]);
} }
}, }
/** /**
* _append: * _append:
@@ -773,7 +764,7 @@ var ChatNotification = new Lang.Class({
} }
this._filterMessages(); this._filterMessages();
}, }
appendTimestamp() { appendTimestamp() {
this._timestampTimeoutId = 0; this._timestampTimeoutId = 0;
@@ -784,7 +775,7 @@ var ChatNotification = new Lang.Class({
this._filterMessages(); this._filterMessages();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
appendAliasChange(oldAlias, newAlias) { appendAliasChange(oldAlias, newAlias) {
oldAlias = GLib.markup_escape_text(oldAlias, -1); oldAlias = GLib.markup_escape_text(oldAlias, -1);
@@ -800,24 +791,19 @@ var ChatNotification = new Lang.Class({
this._filterMessages(); this._filterMessages();
} }
}); };
var ChatLineBox = new Lang.Class({
Name: 'ChatLineBox',
Extends: St.BoxLayout,
var ChatLineBox = GObject.registerClass(
class ChatLineBox extends St.BoxLayout {
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
let [, natHeight] = this.parent(forWidth); let [, natHeight] = super.vfunc_get_preferred_height(forWidth);
return [natHeight, natHeight]; return [natHeight, natHeight];
} }
}); });
var ChatNotificationBanner = new Lang.Class({ var ChatNotificationBanner = class extends MessageTray.NotificationBanner {
Name: 'ChatNotificationBanner', constructor(notification) {
Extends: MessageTray.NotificationBanner, super(notification);
_init(notification) {
this.parent(notification);
this._responseEntry = new St.Entry({ style_class: 'chat-response', this._responseEntry = new St.Entry({ style_class: 'chat-response',
x_expand: true, x_expand: true,
@@ -880,14 +866,14 @@ var ChatNotificationBanner = new Lang.Class({
for (let i = this.notification.messages.length - 1; i >= 0; i--) for (let i = this.notification.messages.length - 1; i >= 0; i--)
this._addMessage(this.notification.messages[i]); this._addMessage(this.notification.messages[i]);
}, }
_onDestroy() { _onDestroy() {
this.parent(); super._onDestroy();
this.notification.disconnect(this._messageAddedId); this.notification.disconnect(this._messageAddedId);
this.notification.disconnect(this._messageRemovedId); this.notification.disconnect(this._messageRemovedId);
this.notification.disconnect(this._timestampChangedId); this.notification.disconnect(this._timestampChangedId);
}, }
scrollTo(side) { scrollTo(side) {
let adjustment = this._scrollArea.vscroll.adjustment; let adjustment = this._scrollArea.vscroll.adjustment;
@@ -895,11 +881,11 @@ var ChatNotificationBanner = new Lang.Class({
adjustment.value = adjustment.lower; adjustment.value = adjustment.lower;
else if (side == St.Side.BOTTOM) else if (side == St.Side.BOTTOM)
adjustment.value = adjustment.upper; adjustment.value = adjustment.upper;
}, }
hide() { hide() {
this.emit('done-displaying'); this.emit('done-displaying');
}, }
_addMessage(message) { _addMessage(message) {
let highlighter = new MessageList.URLHighlighter(message.body, true, true); let highlighter = new MessageList.URLHighlighter(message.body, true, true);
@@ -921,7 +907,7 @@ var ChatNotificationBanner = new Lang.Class({
this._messageActors.set(message, lineBox); this._messageActors.set(message, lineBox);
this._updateTimestamp(message); this._updateTimestamp(message);
}, }
_updateTimestamp(message) { _updateTimestamp(message) {
let actor = this._messageActors.get(message); let actor = this._messageActors.get(message);
@@ -942,7 +928,7 @@ var ChatNotificationBanner = new Lang.Class({
actor.add_actor(timeLabel); actor.add_actor(timeLabel);
} }
}, }
_onEntryActivated() { _onEntryActivated() {
let text = this._responseEntry.get_text(); let text = this._responseEntry.get_text();
@@ -955,7 +941,7 @@ var ChatNotificationBanner = new Lang.Class({
// see Source._messageSent // see Source._messageSent
this._responseEntry.set_text(''); this._responseEntry.set_text('');
this.notification.source.respond(text); this.notification.source.respond(text);
}, }
_composingStopTimeout() { _composingStopTimeout() {
this._composingTimeoutId = 0; this._composingTimeoutId = 0;
@@ -963,7 +949,7 @@ var ChatNotificationBanner = new Lang.Class({
this.notification.source.setChatState(Tp.ChannelChatState.PAUSED); this.notification.source.setChatState(Tp.ChannelChatState.PAUSED);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_onEntryChanged() { _onEntryChanged() {
let text = this._responseEntry.get_text(); let text = this._responseEntry.get_text();
@@ -990,6 +976,6 @@ var ChatNotificationBanner = new Lang.Class({
this.notification.source.setChatState(Tp.ChannelChatState.ACTIVE); this.notification.source.setChatState(Tp.ChannelChatState.ACTIVE);
} }
} }
}); };
var Component = TelepathyComponent; var Component = TelepathyComponent;

View File

@@ -2,7 +2,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -21,15 +20,13 @@ var SortGroup = {
BOTTOM: 2 BOTTOM: 2
}; };
var CtrlAltTabManager = new Lang.Class({ var CtrlAltTabManager = class CtrlAltTabManager {
Name: 'CtrlAltTabManager', constructor() {
_init() {
this._items = []; this._items = [];
this.addGroup(global.window_group, _("Windows"), this.addGroup(global.window_group, _("Windows"),
'focus-windows-symbolic', { sortGroup: SortGroup.TOP, 'focus-windows-symbolic', { sortGroup: SortGroup.TOP,
focusCallback: this._focusWindows.bind(this) }); focusCallback: this._focusWindows.bind(this) });
}, }
addGroup(root, name, icon, params) { addGroup(root, name, icon, params) {
let item = Params.parse(params, { sortGroup: SortGroup.MIDDLE, let item = Params.parse(params, { sortGroup: SortGroup.MIDDLE,
@@ -44,7 +41,7 @@ var CtrlAltTabManager = new Lang.Class({
root.connect('destroy', () => { this.removeGroup(root); }); root.connect('destroy', () => { this.removeGroup(root); });
if (root instanceof St.Widget) if (root instanceof St.Widget)
global.focus_manager.add_group(root); global.focus_manager.add_group(root);
}, }
removeGroup(root) { removeGroup(root) {
if (root instanceof St.Widget) if (root instanceof St.Widget)
@@ -55,14 +52,14 @@ var CtrlAltTabManager = new Lang.Class({
return; return;
} }
} }
}, }
focusGroup(item, timestamp) { focusGroup(item, timestamp) {
if (item.focusCallback) if (item.focusCallback)
item.focusCallback(timestamp); item.focusCallback(timestamp);
else else
item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}, }
// Sort the items into a consistent order; panel first, tray last, // Sort the items into a consistent order; panel first, tray last,
// and everything else in between, sorted by X coordinate, so that // and everything else in between, sorted by X coordinate, so that
@@ -77,7 +74,7 @@ var CtrlAltTabManager = new Lang.Class({
[bx, y] = b.proxy.get_transformed_position(); [bx, y] = b.proxy.get_transformed_position();
return ax - bx; return ax - bx;
}, }
popup(backward, binding, mask) { popup(backward, binding, mask) {
// Start with the set of focus groups that are currently mapped // Start with the set of focus groups that are currently mapped
@@ -130,22 +127,20 @@ var CtrlAltTabManager = new Lang.Class({
this._popup = null; this._popup = null;
}); });
} }
}, }
_focusWindows(timestamp) { _focusWindows(timestamp) {
global.display.focus_default_window(timestamp); global.display.focus_default_window(timestamp);
} }
}); };
var CtrlAltTabPopup = new Lang.Class({ var CtrlAltTabPopup =
Name: 'CtrlAltTabPopup', class CtrlAltTabPopup extends SwitcherPopup.SwitcherPopup {
Extends: SwitcherPopup.SwitcherPopup, constructor(items) {
super(items);
_init(items) {
this.parent(items);
this._switcherList = new CtrlAltTabSwitcher(this._items); this._switcherList = new CtrlAltTabSwitcher(this._items);
}, }
_keyPressHandler(keysym, action) { _keyPressHandler(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_PANELS) if (action == Meta.KeyBindingAction.SWITCH_PANELS)
@@ -160,24 +155,22 @@ var CtrlAltTabPopup = new Lang.Class({
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_finish(time) { _finish(time) {
this.parent(time); super._finish(time);
Main.ctrlAltTabManager.focusGroup(this._items[this._selectedIndex], time); Main.ctrlAltTabManager.focusGroup(this._items[this._selectedIndex], time);
}, }
}); };
var CtrlAltTabSwitcher = new Lang.Class({ var CtrlAltTabSwitcher =
Name: 'CtrlAltTabSwitcher', class CtrlAltTabSwitcher extends SwitcherPopup.SwitcherList {
Extends: SwitcherPopup.SwitcherList, constructor(items) {
super(true);
_init(items) {
this.parent(true);
for (let i = 0; i < items.length; i++) for (let i = 0; i < items.length; i++)
this._addIcon(items[i]); this._addIcon(items[i]);
}, }
_addIcon(item) { _addIcon(item) {
let box = new St.BoxLayout({ style_class: 'alt-tab-app', let box = new St.BoxLayout({ style_class: 'alt-tab-app',
@@ -195,4 +188,4 @@ var CtrlAltTabSwitcher = new Lang.Class({
this.addItem(box, text); this.addItem(box, text);
} }
}); };

View File

@@ -3,8 +3,8 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Signals = imports.signals; const Signals = imports.signals;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -33,12 +33,10 @@ function getAppFromSource(source) {
// A container like StBin, but taking the child's scale into account // A container like StBin, but taking the child's scale into account
// when requesting a size // when requesting a size
var DashItemContainer = new Lang.Class({ var DashItemContainer = GObject.registerClass(
Name: 'DashItemContainer', class DashItemContainer extends St.Widget {
Extends: St.Widget,
_init() { _init() {
this.parent({ style_class: 'dash-item-container', super._init({ style_class: 'dash-item-container',
pivot_point: new Clutter.Point({ x: .5, y: .5 }), pivot_point: new Clutter.Point({ x: .5, y: .5 }),
x_expand: true, x_expand: true,
x_align: Clutter.ActorAlign.CENTER }); x_align: Clutter.ActorAlign.CENTER });
@@ -59,23 +57,23 @@ var DashItemContainer = new Lang.Class({
this.child.destroy(); this.child.destroy();
this.label.destroy(); this.label.destroy();
}); });
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
forWidth = themeNode.adjust_for_width(forWidth); forWidth = themeNode.adjust_for_width(forWidth);
let [minHeight, natHeight] = this.parent(forWidth); let [minHeight, natHeight] = super.vfunc_get_preferred_height(forWidth);
return themeNode.adjust_preferred_height(minHeight * this.scale_y, return themeNode.adjust_preferred_height(minHeight * this.scale_y,
natHeight * this.scale_y); natHeight * this.scale_y);
}, }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
forHeight = themeNode.adjust_for_height(forHeight); forHeight = themeNode.adjust_for_height(forHeight);
let [minWidth, natWidth] = this.parent(forHeight); let [minWidth, natWidth] = super.vfunc_get_preferred_width(forHeight);
return themeNode.adjust_preferred_width(minWidth * this.scale_x, return themeNode.adjust_preferred_width(minWidth * this.scale_x,
natWidth * this.scale_x); natWidth * this.scale_x);
}, }
showLabel() { showLabel() {
if (!this._labelText) if (!this._labelText)
@@ -109,12 +107,12 @@ var DashItemContainer = new Lang.Class({
time: DASH_ITEM_LABEL_SHOW_TIME, time: DASH_ITEM_LABEL_SHOW_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
}); });
}, }
setLabelText(text) { setLabelText(text) {
this._labelText = text; this._labelText = text;
this.child.accessible_name = text; this.child.accessible_name = text;
}, }
hideLabel() { hideLabel() {
Tweener.addTween(this.label, Tweener.addTween(this.label,
@@ -125,7 +123,7 @@ var DashItemContainer = new Lang.Class({
this.label.hide(); this.label.hide();
} }
}); });
}, }
setChild(actor) { setChild(actor) {
if (this.child == actor) if (this.child == actor)
@@ -138,7 +136,7 @@ var DashItemContainer = new Lang.Class({
this.set_scale(this._childScale, this._childScale); this.set_scale(this._childScale, this._childScale);
this.set_opacity(this._childOpacity); this.set_opacity(this._childOpacity);
}, }
show(animate) { show(animate) {
if (this.child == null) if (this.child == null)
@@ -151,7 +149,7 @@ var DashItemContainer = new Lang.Class({
time: time, time: time,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
}, }
animateOutAndDestroy() { animateOutAndDestroy() {
this.label.hide(); this.label.hide();
@@ -171,37 +169,35 @@ var DashItemContainer = new Lang.Class({
this.destroy(); this.destroy();
} }
}); });
}, }
set childScale(scale) { set childScale(scale) {
this._childScale = scale; this._childScale = scale;
this.set_scale(scale, scale); this.set_scale(scale, scale);
this.queue_relayout(); this.queue_relayout();
}, }
get childScale() { get childScale() {
return this._childScale; return this._childScale;
}, }
set childOpacity(opacity) { set childOpacity(opacity) {
this._childOpacity = opacity; this._childOpacity = opacity;
this.set_opacity(opacity); this.set_opacity(opacity);
this.queue_redraw(); this.queue_redraw();
}, }
get childOpacity() { get childOpacity() {
return this._childOpacity; return this._childOpacity;
} }
}); });
var ShowAppsIcon = new Lang.Class({ var ShowAppsIcon = GObject.registerClass(
Name: 'ShowAppsIcon', class ShowAppsIcon extends DashItemContainer {
Extends: DashItemContainer,
_init() { _init() {
this.parent(); super._init();
this.toggleButton = new St.Button({ style_class: 'show-apps', this.toggleButton = new St.Button({ style_class: 'show-apps',
track_hover: true, track_hover: true,
@@ -217,7 +213,7 @@ var ShowAppsIcon = new Lang.Class({
this.setChild(this.toggleButton); this.setChild(this.toggleButton);
this.setDragApp(null); this.setDragApp(null);
}, }
_createIcon(size) { _createIcon(size) {
this._iconActor = new St.Icon({ icon_name: 'view-app-grid-symbolic', this._iconActor = new St.Icon({ icon_name: 'view-app-grid-symbolic',
@@ -225,7 +221,7 @@ var ShowAppsIcon = new Lang.Class({
style_class: 'show-apps-icon', style_class: 'show-apps-icon',
track_hover: true }); track_hover: true });
return this._iconActor; return this._iconActor;
}, }
_canRemoveApp(app) { _canRemoveApp(app) {
if (app == null) if (app == null)
@@ -237,7 +233,7 @@ var ShowAppsIcon = new Lang.Class({
let id = app.get_id(); let id = app.get_id();
let isFavorite = AppFavorites.getAppFavorites().isFavorite(id); let isFavorite = AppFavorites.getAppFavorites().isFavorite(id);
return isFavorite; return isFavorite;
}, }
setDragApp(app) { setDragApp(app) {
let canRemove = this._canRemoveApp(app); let canRemove = this._canRemoveApp(app);
@@ -250,14 +246,14 @@ var ShowAppsIcon = new Lang.Class({
this.setLabelText(_("Remove from Favorites")); this.setLabelText(_("Remove from Favorites"));
else else
this.setLabelText(_("Show Applications")); this.setLabelText(_("Show Applications"));
}, }
handleDragOver(source, actor, x, y, time) { handleDragOver(source, actor, x, y, time) {
if (!this._canRemoveApp(getAppFromSource(source))) if (!this._canRemoveApp(getAppFromSource(source)))
return DND.DragMotionResult.NO_DROP; return DND.DragMotionResult.NO_DROP;
return DND.DragMotionResult.MOVE_DROP; return DND.DragMotionResult.MOVE_DROP;
}, }
acceptDrop(source, actor, x, y, time) { acceptDrop(source, actor, x, y, time) {
let app = getAppFromSource(source); let app = getAppFromSource(source);
@@ -275,36 +271,30 @@ var ShowAppsIcon = new Lang.Class({
} }
}); });
var DragPlaceholderItem = new Lang.Class({ var DragPlaceholderItem = GObject.registerClass(
Name: 'DragPlaceholderItem', class DragPlaceholderItem extends DashItemContainer {
Extends: DashItemContainer,
_init() { _init() {
this.parent(); super._init();
this.setChild(new St.Bin({ style_class: 'placeholder' })); this.setChild(new St.Bin({ style_class: 'placeholder' }));
} }
}); });
var EmptyDropTargetItem = new Lang.Class({ var EmptyDropTargetItem = GObject.registerClass(
Name: 'EmptyDropTargetItem', class EmptyDropTargetItem extends DashItemContainer {
Extends: DashItemContainer,
_init() { _init() {
this.parent(); super._init();
this.setChild(new St.Bin({ style_class: 'empty-dash-drop-target' })); this.setChild(new St.Bin({ style_class: 'empty-dash-drop-target' }));
} }
}); });
var DashActor = new Lang.Class({ var DashActor = GObject.registerClass(
Name: 'DashActor', class DashActor extends St.Widget {
Extends: St.Widget,
_init() { _init() {
let layout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL }); let layout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL });
this.parent({ name: 'dash', super._init({ name: 'dash',
layout_manager: layout, layout_manager: layout,
clip_to_allocation: true }); clip_to_allocation: true });
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
let contentBox = this.get_theme_node().get_content_box(box); let contentBox = this.get_theme_node().get_content_box(box);
@@ -325,7 +315,7 @@ var DashActor = new Lang.Class({
childBox.y1 = contentBox.y2 - showAppsNatHeight; childBox.y1 = contentBox.y2 - showAppsNatHeight;
childBox.y2 = contentBox.y2; childBox.y2 = contentBox.y2;
showAppsButton.allocate(childBox, flags); showAppsButton.allocate(childBox, flags);
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
// We want to request the natural height of all our children // We want to request the natural height of all our children
@@ -333,7 +323,7 @@ var DashActor = new Lang.Class({
// then calls BoxLayout), but we only request the showApps // then calls BoxLayout), but we only request the showApps
// button as the minimum size // button as the minimum size
let [, natHeight] = this.parent(forWidth); let [, natHeight] = super.vfunc_get_preferred_height(forWidth);
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let adjustedForWidth = themeNode.adjust_for_width(forWidth); let adjustedForWidth = themeNode.adjust_for_width(forWidth);
@@ -347,10 +337,8 @@ var DashActor = new Lang.Class({
const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ]; const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ];
var Dash = new Lang.Class({ var Dash = class Dash {
Name: 'Dash', constructor() {
_init() {
this._maxHeight = -1; this._maxHeight = -1;
this.iconSize = 64; this.iconSize = 64;
this._shownInitially = false; this._shownInitially = false;
@@ -407,7 +395,7 @@ var Dash = new Lang.Class({
// Translators: this is the name of the dock/favorites area on // Translators: this is the name of the dock/favorites area on
// the left of the overview // the left of the overview
Main.ctrlAltTabManager.addGroup(this.actor, _("Dash"), 'user-bookmarks-symbolic'); Main.ctrlAltTabManager.addGroup(this.actor, _("Dash"), 'user-bookmarks-symbolic');
}, }
_onDragBegin() { _onDragBegin() {
this._dragCancelled = false; this._dragCancelled = false;
@@ -421,26 +409,26 @@ var Dash = new Lang.Class({
this._box.insert_child_at_index(this._emptyDropTarget, 0); this._box.insert_child_at_index(this._emptyDropTarget, 0);
this._emptyDropTarget.show(true); this._emptyDropTarget.show(true);
} }
}, }
_onDragCancelled() { _onDragCancelled() {
this._dragCancelled = true; this._dragCancelled = true;
this._endDrag(); this._endDrag();
}, }
_onDragEnd() { _onDragEnd() {
if (this._dragCancelled) if (this._dragCancelled)
return; return;
this._endDrag(); this._endDrag();
}, }
_endDrag() { _endDrag() {
this._clearDragPlaceholder(); this._clearDragPlaceholder();
this._clearEmptyDropTarget(); this._clearEmptyDropTarget();
this._showAppsIcon.setDragApp(null); this._showAppsIcon.setDragApp(null);
DND.removeDragMonitor(this._dragMonitor); DND.removeDragMonitor(this._dragMonitor);
}, }
_onDragMotion(dragEvent) { _onDragMotion(dragEvent) {
let app = getAppFromSource(dragEvent.source); let app = getAppFromSource(dragEvent.source);
@@ -459,18 +447,18 @@ var Dash = new Lang.Class({
this._showAppsIcon.setDragApp(null); this._showAppsIcon.setDragApp(null);
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;
}, }
_appIdListToHash(apps) { _appIdListToHash(apps) {
let ids = {}; let ids = {};
for (let i = 0; i < apps.length; i++) for (let i = 0; i < apps.length; i++)
ids[apps[i].get_id()] = apps[i]; ids[apps[i].get_id()] = apps[i];
return ids; return ids;
}, }
_queueRedisplay() { _queueRedisplay() {
Main.queueDeferredWork(this._workId); Main.queueDeferredWork(this._workId);
}, }
_hookUpLabel(item, appIcon) { _hookUpLabel(item, appIcon) {
item.child.connect('notify::hover', () => { item.child.connect('notify::hover', () => {
@@ -490,7 +478,7 @@ var Dash = new Lang.Class({
this._syncLabel(item, appIcon); this._syncLabel(item, appIcon);
}); });
} }
}, }
_createAppItem(app) { _createAppItem(app) {
let appIcon = new AppDisplay.AppIcon(app, let appIcon = new AppDisplay.AppIcon(app,
@@ -524,7 +512,7 @@ var Dash = new Lang.Class({
this._hookUpLabel(item, appIcon); this._hookUpLabel(item, appIcon);
return item; return item;
}, }
_itemMenuStateChanged(item, opened) { _itemMenuStateChanged(item, opened) {
// When the menu closes, it calls sync_hover, which means // When the menu closes, it calls sync_hover, which means
@@ -537,7 +525,7 @@ var Dash = new Lang.Class({
item.hideLabel(); item.hideLabel();
} }
}, }
_syncLabel(item, appIcon) { _syncLabel(item, appIcon) {
let shouldShow = appIcon ? appIcon.shouldShowTooltip() : item.child.get_hover(); let shouldShow = appIcon ? appIcon.shouldShowTooltip() : item.child.get_hover();
@@ -573,7 +561,7 @@ var Dash = new Lang.Class({
GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing'); GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing');
} }
} }
}, }
_adjustIconSize() { _adjustIconSize() {
// For the icon size, we only consider children which are "proper" // For the icon size, we only consider children which are "proper"
@@ -663,7 +651,7 @@ var Dash = new Lang.Class({
transition: 'easeOutQuad', transition: 'easeOutQuad',
}); });
} }
}, }
_redisplay() { _redisplay() {
let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
@@ -792,7 +780,7 @@ var Dash = new Lang.Class({
// Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744
// Without it, StBoxLayout may use a stale size cache // Without it, StBoxLayout may use a stale size cache
this._box.queue_relayout(); this._box.queue_relayout();
}, }
_clearDragPlaceholder() { _clearDragPlaceholder() {
if (this._dragPlaceholder) { if (this._dragPlaceholder) {
@@ -804,14 +792,14 @@ var Dash = new Lang.Class({
this._dragPlaceholder = null; this._dragPlaceholder = null;
} }
this._dragPlaceholderPos = -1; this._dragPlaceholderPos = -1;
}, }
_clearEmptyDropTarget() { _clearEmptyDropTarget() {
if (this._emptyDropTarget) { if (this._emptyDropTarget) {
this._emptyDropTarget.animateOutAndDestroy(); this._emptyDropTarget.animateOutAndDestroy();
this._emptyDropTarget = null; this._emptyDropTarget = null;
} }
}, }
handleDragOver(source, actor, x, y, time) { handleDragOver(source, actor, x, y, time) {
let app = getAppFromSource(source); let app = getAppFromSource(source);
@@ -888,7 +876,7 @@ var Dash = new Lang.Class({
return DND.DragMotionResult.MOVE_DROP; return DND.DragMotionResult.MOVE_DROP;
return DND.DragMotionResult.COPY_DROP; return DND.DragMotionResult.COPY_DROP;
}, }
// Draggable target interface // Draggable target interface
acceptDrop(source, actor, x, y, time) { acceptDrop(source, actor, x, y, time) {
@@ -938,6 +926,5 @@ var Dash = new Lang.Class({
return true; return true;
} }
}); };
Signals.addSignalMethods(Dash.prototype); Signals.addSignalMethods(Dash.prototype);

View File

@@ -6,7 +6,6 @@ const GnomeDesktop = imports.gi.GnomeDesktop;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const GWeather = imports.gi.GWeather; const GWeather = imports.gi.GWeather;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Cairo = imports.cairo; const Cairo = imports.cairo;
@@ -31,10 +30,8 @@ function _isToday(date) {
now.getDate() == date.getDate(); now.getDate() == date.getDate();
} }
var TodayButton = new Lang.Class({ var TodayButton = class TodayButton {
Name: 'TodayButton', constructor(calendar) {
_init(calendar) {
// Having the ability to go to the current date if the user is already // Having the ability to go to the current date if the user is already
// on the current date can be confusing. So don't make the button reactive // on the current date can be confusing. So don't make the button reactive
// until the selected date changes. // until the selected date changes.
@@ -63,7 +60,7 @@ var TodayButton = new Lang.Class({
// current date. // current date.
this.actor.reactive = !_isToday(date) this.actor.reactive = !_isToday(date)
}); });
}, }
setDate(date) { setDate(date) {
this._dayLabel.set_text(date.toLocaleFormat('%A')); this._dayLabel.set_text(date.toLocaleFormat('%A'));
@@ -83,12 +80,10 @@ var TodayButton = new Lang.Class({
dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y")); dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y"));
this.actor.accessible_name = date.toLocaleFormat(dateFormat); this.actor.accessible_name = date.toLocaleFormat(dateFormat);
} }
}); };
var WorldClocksSection = new Lang.Class({ var WorldClocksSection = class WorldClocksSection {
Name: 'WorldClocksSection', constructor() {
_init() {
this._clock = new GnomeDesktop.WallClock(); this._clock = new GnomeDesktop.WallClock();
this._clockNotifyId = 0; this._clockNotifyId = 0;
@@ -118,11 +113,11 @@ var WorldClocksSection = new Lang.Class({
this._clockAppMon.watchSetting('world-clocks', this._clockAppMon.watchSetting('world-clocks',
this._clocksChanged.bind(this)); this._clocksChanged.bind(this));
this._sync(); this._sync();
}, }
_sync() { _sync() {
this.actor.visible = this._clockAppMon.available; this.actor.visible = this._clockAppMon.available;
}, }
_clocksChanged(settings) { _clocksChanged(settings) {
this._grid.destroy_all_children(); this._grid.destroy_all_children();
@@ -187,7 +182,7 @@ var WorldClocksSection = new Lang.Class({
this._clock.disconnect(this._clockNotifyId); this._clock.disconnect(this._clockNotifyId);
this._clockNotifyId = 0; this._clockNotifyId = 0;
} }
}, }
_updateLabels() { _updateLabels() {
for (let i = 0; i < this._locations.length; i++) { for (let i = 0; i < this._locations.length; i++) {
@@ -197,12 +192,10 @@ var WorldClocksSection = new Lang.Class({
l.actor.text = Util.formatTime(now, { timeOnly: true }); l.actor.text = Util.formatTime(now, { timeOnly: true });
} }
} }
}); };
var WeatherSection = new Lang.Class({ var WeatherSection = class WeatherSection {
Name: 'WeatherSection', constructor() {
_init() {
this._weatherClient = new Weather.WeatherClient(); this._weatherClient = new Weather.WeatherClient();
this.actor = new St.Button({ style_class: 'weather-button', this.actor = new St.Button({ style_class: 'weather-button',
@@ -236,7 +229,7 @@ var WeatherSection = new Lang.Class({
this._weatherClient.connect('changed', this._sync.bind(this)); this._weatherClient.connect('changed', this._sync.bind(this));
this._sync(); this._sync();
}, }
_getSummary(info, capitalize=false) { _getSummary(info, capitalize=false) {
let options = capitalize ? GWeather.FormatOptions.SENTENCE_CAPITALIZATION let options = capitalize ? GWeather.FormatOptions.SENTENCE_CAPITALIZATION
@@ -250,7 +243,7 @@ var WeatherSection = new Lang.Class({
let [, sky] = info.get_value_sky(); let [, sky] = info.get_value_sky();
return GWeather.Sky.to_string_full(sky, options); return GWeather.Sky.to_string_full(sky, options);
}, }
_sameSummary(info1, info2) { _sameSummary(info1, info2) {
let [ok1, phenom1, qualifier1] = info1.get_value_conditions(); let [ok1, phenom1, qualifier1] = info1.get_value_conditions();
@@ -261,7 +254,7 @@ var WeatherSection = new Lang.Class({
let [, sky1] = info1.get_value_sky(); let [, sky1] = info1.get_value_sky();
let [, sky2] = info2.get_value_sky(); let [, sky2] = info2.get_value_sky();
return sky1 == sky2; return sky1 == sky2;
}, }
_getSummaryText() { _getSummaryText() {
let info = this._weatherClient.info; let info = this._weatherClient.info;
@@ -309,7 +302,7 @@ var WeatherSection = new Lang.Class({
return this._getSummary(info, capitalize); return this._getSummary(info, capitalize);
}); });
return String.prototype.format.apply(fmt, summaries); return String.prototype.format.apply(fmt, summaries);
}, }
_getLabelText() { _getLabelText() {
if (!this._weatherClient.hasLocation) if (!this._weatherClient.hasLocation)
@@ -328,7 +321,7 @@ var WeatherSection = new Lang.Class({
return _("Go online for weather information"); return _("Go online for weather information");
return _("Weather information is currently unavailable"); return _("Weather information is currently unavailable");
}, }
_sync() { _sync() {
this.actor.visible = this._weatherClient.available; this.actor.visible = this._weatherClient.available;
@@ -338,12 +331,10 @@ var WeatherSection = new Lang.Class({
this._conditionsLabel.text = this._getLabelText(); this._conditionsLabel.text = this._getLabelText();
} }
}); };
var MessagesIndicator = new Lang.Class({ var MessagesIndicator = class MessagesIndicator {
Name: 'MessagesIndicator', constructor() {
_init() {
this.actor = new St.Icon({ icon_name: 'message-indicator-symbolic', this.actor = new St.Icon({ icon_name: 'message-indicator-symbolic',
icon_size: 16, icon_size: 16,
visible: false, y_expand: true, visible: false, y_expand: true,
@@ -357,18 +348,18 @@ var MessagesIndicator = new Lang.Class({
let sources = Main.messageTray.getSources(); let sources = Main.messageTray.getSources();
sources.forEach(source => { this._onSourceAdded(null, source); }); sources.forEach(source => { this._onSourceAdded(null, source); });
}, }
_onSourceAdded(tray, source) { _onSourceAdded(tray, source) {
source.connect('count-updated', this._updateCount.bind(this)); source.connect('count-updated', this._updateCount.bind(this));
this._sources.push(source); this._sources.push(source);
this._updateCount(); this._updateCount();
}, }
_onSourceRemoved(tray, source) { _onSourceRemoved(tray, source) {
this._sources.splice(this._sources.indexOf(source), 1); this._sources.splice(this._sources.indexOf(source), 1);
this._updateCount(); this._updateCount();
}, }
_updateCount() { _updateCount() {
let count = 0; let count = 0;
@@ -377,23 +368,21 @@ var MessagesIndicator = new Lang.Class({
this.actor.visible = (count > 0); this.actor.visible = (count > 0);
} }
}); };
var IndicatorPad = new Lang.Class({
Name: 'IndicatorPad',
Extends: St.Widget,
var IndicatorPad = GObject.registerClass(
class IndicatorPad extends St.Widget {
_init(actor) { _init(actor) {
this._source = actor; this._source = actor;
this._source.connect('notify::visible', () => { this.queue_relayout(); }); this._source.connect('notify::visible', () => { this.queue_relayout(); });
this.parent(); super._init();
}, }
vfunc_get_preferred_width(container, forHeight) { vfunc_get_preferred_width(container, forHeight) {
if (this._source.visible) if (this._source.visible)
return this._source.get_preferred_width(forHeight); return this._source.get_preferred_width(forHeight);
return [0, 0]; return [0, 0];
}, }
vfunc_get_preferred_height(container, forWidth) { vfunc_get_preferred_height(container, forWidth) {
if (this._source.visible) if (this._source.visible)
@@ -402,17 +391,15 @@ var IndicatorPad = new Lang.Class({
} }
}); });
var FreezableBinLayout = new Lang.Class({ var FreezableBinLayout = GObject.registerClass(
Name: 'FreezableBinLayout', class FreezableBinLayout extends Clutter.BinLayout {
Extends: Clutter.BinLayout,
_init() { _init() {
this.parent(); super._init();
this._frozen = false; this._frozen = false;
this._savedWidth = [NaN, NaN]; this._savedWidth = [NaN, NaN];
this._savedHeight = [NaN, NaN]; this._savedHeight = [NaN, NaN];
}, }
set frozen(v) { set frozen(v) {
if (this._frozen == v) if (this._frozen == v)
@@ -421,22 +408,22 @@ var FreezableBinLayout = new Lang.Class({
this._frozen = v; this._frozen = v;
if (!this._frozen) if (!this._frozen)
this.layout_changed(); this.layout_changed();
}, }
vfunc_get_preferred_width(container, forHeight) { vfunc_get_preferred_width(container, forHeight) {
if (!this._frozen || this._savedWidth.some(isNaN)) if (!this._frozen || this._savedWidth.some(isNaN))
return this.parent(container, forHeight); return super.vfunc_get_preferred_width(container, forHeight);
return this._savedWidth; return this._savedWidth;
}, }
vfunc_get_preferred_height(container, forWidth) { vfunc_get_preferred_height(container, forWidth) {
if (!this._frozen || this._savedHeight.some(isNaN)) if (!this._frozen || this._savedHeight.some(isNaN))
return this.parent(container, forWidth); return super.vfunc_get_preferred_height(container, forWidth);
return this._savedHeight; return this._savedHeight;
}, }
vfunc_allocate(container, allocation, flags) { vfunc_allocate(container, allocation, flags) {
this.parent(container, allocation, flags); super.vfunc_allocate(container, allocation, flags);
let [width, height] = allocation.get_size(); let [width, height] = allocation.get_size();
this._savedWidth = [width, width]; this._savedWidth = [width, width];
@@ -444,26 +431,22 @@ var FreezableBinLayout = new Lang.Class({
} }
}); });
var CalendarColumnLayout = new Lang.Class({ var CalendarColumnLayout = GObject.registerClass(
Name: 'CalendarColumnLayout', class CalendarColumnLayout extends Clutter.BoxLayout {
Extends: Clutter.BoxLayout,
_init(actor) { _init(actor) {
this.parent({ orientation: Clutter.Orientation.VERTICAL }); super._init({ orientation: Clutter.Orientation.VERTICAL });
this._calActor = actor; this._calActor = actor;
}, }
vfunc_get_preferred_width(container, forHeight) { vfunc_get_preferred_width(container, forHeight) {
if (!this._calActor || this._calActor.get_parent() != container) if (!this._calActor || this._calActor.get_parent() != container)
return this.parent(container, forHeight); return super.vfunc_get_preferred_width(container, forHeight);
return this._calActor.get_preferred_width(forHeight); return this._calActor.get_preferred_width(forHeight);
} }
}); });
var DateMenuButton = new Lang.Class({ var DateMenuButton = GObject.registerClass(
Name: 'DateMenuButton', class DateMenuButton extends PanelMenu.Button {
Extends: PanelMenu.Button,
_init() { _init() {
let item; let item;
let hbox; let hbox;
@@ -472,7 +455,7 @@ var DateMenuButton = new Lang.Class({
let menuAlignment = 0.5; let menuAlignment = 0.5;
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
menuAlignment = 1.0 - menuAlignment; menuAlignment = 1.0 - menuAlignment;
this.parent(menuAlignment); super._init(menuAlignment);
this._clockDisplay = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); this._clockDisplay = new St.Label({ y_align: Clutter.ActorAlign.CENTER });
this._indicator = new MessagesIndicator(); this._indicator = new MessagesIndicator();
@@ -553,11 +536,11 @@ var DateMenuButton = new Lang.Class({
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
this._sessionUpdated(); this._sessionUpdated();
}, }
_getEventSource() { _getEventSource() {
return new Calendar.DBusEventSource(); return new Calendar.DBusEventSource();
}, }
_setEventSource(eventSource) { _setEventSource(eventSource) {
if (this._eventSource) if (this._eventSource)
@@ -567,7 +550,7 @@ var DateMenuButton = new Lang.Class({
this._messageList.setEventSource(eventSource); this._messageList.setEventSource(eventSource);
this._eventSource = eventSource; this._eventSource = eventSource;
}, }
_updateTimeZone() { _updateTimeZone() {
// SpiderMonkey caches the time zone so we must explicitly clear it // SpiderMonkey caches the time zone so we must explicitly clear it
@@ -576,7 +559,7 @@ var DateMenuButton = new Lang.Class({
System.clearDateCaches(); System.clearDateCaches();
this._calendar.updateTimeZone(); this._calendar.updateTimeZone();
}, }
_sessionUpdated() { _sessionUpdated() {
let eventSource; let eventSource;

View File

@@ -5,14 +5,11 @@ const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang;
var Dialog = new Lang.Class({
Name: 'Dialog',
Extends: St.Widget,
var Dialog = GObject.registerClass(
class Dialog extends St.Widget {
_init(parentActor, styleClass) { _init(parentActor, styleClass) {
this.parent({ layout_manager: new Clutter.BinLayout() }); super._init({ layout_manager: new Clutter.BinLayout() });
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._initialKeyFocus = null; this._initialKeyFocus = null;
@@ -28,7 +25,7 @@ var Dialog = new Lang.Class({
this._parentActor = parentActor; this._parentActor = parentActor;
this._eventId = this._parentActor.connect('event', this._modalEventHandler.bind(this)); this._eventId = this._parentActor.connect('event', this._modalEventHandler.bind(this));
this._parentActor.add_child(this); this._parentActor.add_child(this);
}, }
_createDialog() { _createDialog() {
this._dialog = new St.BoxLayout({ style_class: 'modal-dialog', this._dialog = new St.BoxLayout({ style_class: 'modal-dialog',
@@ -55,13 +52,13 @@ var Dialog = new Lang.Class({
this._dialog.add(this.buttonLayout, this._dialog.add(this.buttonLayout,
{ x_align: St.Align.MIDDLE, { x_align: St.Align.MIDDLE,
y_align: St.Align.START }); y_align: St.Align.START });
}, }
_onDestroy() { _onDestroy() {
if (this._eventId != 0) if (this._eventId != 0)
this._parentActor.disconnect(this._eventId); this._parentActor.disconnect(this._eventId);
this._eventId = 0; this._eventId = 0;
}, }
_modalEventHandler(actor, event) { _modalEventHandler(actor, event) {
if (event.type() == Clutter.EventType.KEY_PRESS) { if (event.type() == Clutter.EventType.KEY_PRESS) {
@@ -87,7 +84,7 @@ var Dialog = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_setInitialKeyFocus(actor) { _setInitialKeyFocus(actor) {
if (this._initialKeyFocus) if (this._initialKeyFocus)
@@ -99,15 +96,15 @@ var Dialog = new Lang.Class({
this._initialKeyFocus = null; this._initialKeyFocus = null;
this._initialKeyFocusDestroyId = 0; this._initialKeyFocusDestroyId = 0;
}); });
}, }
get initialKeyFocus() { get initialKeyFocus() {
return this._initialKeyFocus || this; return this._initialKeyFocus || this;
}, }
addContent(actor) { addContent(actor) {
this.contentLayout.add (actor, { expand: true }); this.contentLayout.add (actor, { expand: true });
}, }
addButton(buttonInfo) { addButton(buttonInfo) {
let { label, action, key } = buttonInfo; let { label, action, key } = buttonInfo;
@@ -144,17 +141,15 @@ var Dialog = new Lang.Class({
this.buttonLayout.add_actor(button); this.buttonLayout.add_actor(button);
return button; return button;
}, }
clearButtons() { clearButtons() {
this.buttonLayout.destroy_all_children(); this.buttonLayout.destroy_all_children();
this._buttonKeys = {}; this._buttonKeys = {};
}, }
}); });
var MessageDialogContent = new Lang.Class({ var MessageDialogContent = GObject.registerClass({
Name: 'MessageDialogContent',
Extends: St.BoxLayout,
Properties: { Properties: {
'icon': GObject.ParamSpec.object('icon', 'icon', 'icon', 'icon': GObject.ParamSpec.object('icon', 'icon', 'icon',
GObject.ParamFlags.READWRITE | GObject.ParamFlags.READWRITE |
@@ -172,8 +167,8 @@ var MessageDialogContent = new Lang.Class({
GObject.ParamFlags.READWRITE | GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT, GObject.ParamFlags.CONSTRUCT,
null) null)
}, }
}, class MessageDialogContent extends St.BoxLayout {
_init(params) { _init(params) {
this._icon = new St.Icon({ y_align: Clutter.ActorAlign.START }); this._icon = new St.Icon({ y_align: Clutter.ActorAlign.START });
this._title = new St.Label({ style_class: 'headline' }); this._title = new St.Label({ style_class: 'headline' });
@@ -192,7 +187,7 @@ var MessageDialogContent = new Lang.Class({
if (!params.hasOwnProperty('style_class')) if (!params.hasOwnProperty('style_class'))
params.style_class = 'message-dialog-main-layout'; params.style_class = 'message-dialog-main-layout';
this.parent(params); super._init(params);
this.messageBox = new St.BoxLayout({ style_class: 'message-dialog-content', this.messageBox = new St.BoxLayout({ style_class: 'message-dialog-content',
x_expand: true, x_expand: true,
@@ -204,45 +199,45 @@ var MessageDialogContent = new Lang.Class({
this.add_actor(this._icon); this.add_actor(this._icon);
this.add_actor(this.messageBox); this.add_actor(this.messageBox);
}, }
get icon() { get icon() {
return this._icon.gicon; return this._icon.gicon;
}, }
get title() { get title() {
return this._title.text; return this._title.text;
}, }
get subtitle() { get subtitle() {
return this._subtitle.text; return this._subtitle.text;
}, }
get body() { get body() {
return this._body.text; return this._body.text;
}, }
set icon(icon) { set icon(icon) {
Object.assign(this._icon, { gicon: icon, visible: icon != null }); Object.assign(this._icon, { gicon: icon, visible: icon != null });
this.notify('icon'); this.notify('icon');
}, }
set title(title) { set title(title) {
this._setLabel(this._title, 'title', title); this._setLabel(this._title, 'title', title);
}, }
set subtitle(subtitle) { set subtitle(subtitle) {
this._setLabel(this._subtitle, 'subtitle', subtitle); this._setLabel(this._subtitle, 'subtitle', subtitle);
}, }
set body(body) { set body(body) {
this._setLabel(this._body, 'body', body); this._setLabel(this._body, 'body', body);
}, }
_setLabel(label, prop, value) { _setLabel(label, prop, value) {
Object.assign(label, { text: value || '', visible: value != null }); Object.assign(label, { text: value || '', visible: value != null });
this.notify(prop); this.notify(prop);
}, }
insertBeforeBody(actor) { insertBeforeBody(actor) {
this.messageBox.insert_child_below(actor, this._body); this.messageBox.insert_child_below(actor, this._body);

View File

@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -74,10 +73,8 @@ function removeDragMonitor(monitor) {
} }
} }
var _Draggable = new Lang.Class({ var _Draggable = class _Draggable {
Name: 'Draggable', constructor(actor, params) {
_init(actor, params) {
params = Params.parse(params, { manualMode: false, params = Params.parse(params, { manualMode: false,
restoreOnSuccess: false, restoreOnSuccess: false,
dragActorMaxSize: undefined, dragActorMaxSize: undefined,
@@ -112,7 +109,7 @@ var _Draggable = new Lang.Class({
this._dragCancellable = true; this._dragCancellable = true;
this._eventsGrabbed = false; this._eventsGrabbed = false;
}, }
_onButtonPress(actor, event) { _onButtonPress(actor, event) {
if (event.get_button() != 1) if (event.get_button() != 1)
@@ -129,7 +126,7 @@ var _Draggable = new Lang.Class({
this._dragStartY = stageY; this._dragStartY = stageY;
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onTouchEvent(actor, event) { _onTouchEvent(actor, event) {
if (event.type() != Clutter.EventType.TOUCH_BEGIN || if (event.type() != Clutter.EventType.TOUCH_BEGIN ||
@@ -149,7 +146,7 @@ var _Draggable = new Lang.Class({
this._dragStartY = stageY; this._dragStartY = stageY;
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_grabDevice(actor) { _grabDevice(actor) {
let manager = Clutter.DeviceManager.get_default(); let manager = Clutter.DeviceManager.get_default();
@@ -161,7 +158,7 @@ var _Draggable = new Lang.Class({
pointer.grab (actor); pointer.grab (actor);
this._grabbedDevice = pointer; this._grabbedDevice = pointer;
}, }
_ungrabDevice() { _ungrabDevice() {
if (this._touchSequence) if (this._touchSequence)
@@ -171,13 +168,13 @@ var _Draggable = new Lang.Class({
this._touchSequence = null; this._touchSequence = null;
this._grabbedDevice = null; this._grabbedDevice = null;
}, }
_grabActor() { _grabActor() {
this._grabDevice(this.actor); this._grabDevice(this.actor);
this._onEventId = this.actor.connect('event', this._onEventId = this.actor.connect('event',
this._onEvent.bind(this)); this._onEvent.bind(this));
}, }
_ungrabActor() { _ungrabActor() {
if (!this._onEventId) if (!this._onEventId)
@@ -186,7 +183,7 @@ var _Draggable = new Lang.Class({
this._ungrabDevice(); this._ungrabDevice();
this.actor.disconnect(this._onEventId); this.actor.disconnect(this._onEventId);
this._onEventId = null; this._onEventId = null;
}, }
_grabEvents() { _grabEvents() {
if (!this._eventsGrabbed) { if (!this._eventsGrabbed) {
@@ -194,7 +191,7 @@ var _Draggable = new Lang.Class({
if (this._eventsGrabbed) if (this._eventsGrabbed)
this._grabDevice(_getEventHandlerActor()); this._grabDevice(_getEventHandlerActor());
} }
}, }
_ungrabEvents() { _ungrabEvents() {
if (this._eventsGrabbed) { if (this._eventsGrabbed) {
@@ -202,7 +199,7 @@ var _Draggable = new Lang.Class({
Main.popModal(_getEventHandlerActor()); Main.popModal(_getEventHandlerActor());
this._eventsGrabbed = false; this._eventsGrabbed = false;
} }
}, }
_onEvent(actor, event) { _onEvent(actor, event) {
// We intercept BUTTON_RELEASE event to know that the button was released in case we // We intercept BUTTON_RELEASE event to know that the button was released in case we
@@ -246,7 +243,7 @@ var _Draggable = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
/** /**
* fakeRelease: * fakeRelease:
@@ -259,7 +256,7 @@ var _Draggable = new Lang.Class({
fakeRelease() { fakeRelease() {
this._buttonDown = false; this._buttonDown = false;
this._ungrabActor(); this._ungrabActor();
}, }
/** /**
* startDrag: * startDrag:
@@ -395,7 +392,7 @@ var _Draggable = new Lang.Class({
onUpdateScope: this }); onUpdateScope: this });
} }
} }
}, }
_maybeStartDrag(event) { _maybeStartDrag(event) {
let [stageX, stageY] = event.get_coords(); let [stageX, stageY] = event.get_coords();
@@ -409,12 +406,12 @@ var _Draggable = new Lang.Class({
} }
return true; return true;
}, }
_pickTargetActor() { _pickTargetActor() {
return this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, return this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
this._dragX, this._dragY); this._dragX, this._dragY);
}, }
_updateDragHover() { _updateDragHover() {
this._updateHoverId = 0; this._updateHoverId = 0;
@@ -471,7 +468,7 @@ var _Draggable = new Lang.Class({
} }
global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); global.display.set_cursor(Meta.Cursor.DND_IN_DRAG);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_queueUpdateDragHover() { _queueUpdateDragHover() {
if (this._updateHoverId) if (this._updateHoverId)
@@ -480,7 +477,7 @@ var _Draggable = new Lang.Class({
this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT, this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT,
this._updateDragHover.bind(this)); this._updateDragHover.bind(this));
GLib.Source.set_name_by_id(this._updateHoverId, '[gnome-shell] this._updateDragHover'); GLib.Source.set_name_by_id(this._updateHoverId, '[gnome-shell] this._updateDragHover');
}, }
_updateDragPosition(event) { _updateDragPosition(event) {
let [stageX, stageY] = event.get_coords(); let [stageX, stageY] = event.get_coords();
@@ -491,7 +488,7 @@ var _Draggable = new Lang.Class({
this._queueUpdateDragHover(); this._queueUpdateDragHover();
return true; return true;
}, }
_dragActorDropped(event) { _dragActorDropped(event) {
let [dropX, dropY] = event.get_coords(); let [dropX, dropY] = event.get_coords();
@@ -554,7 +551,7 @@ var _Draggable = new Lang.Class({
this._cancelDrag(event.get_time()); this._cancelDrag(event.get_time());
return true; return true;
}, }
_getRestoreLocation() { _getRestoreLocation() {
let x, y, scale; let x, y, scale;
@@ -586,7 +583,7 @@ var _Draggable = new Lang.Class({
} }
return [x, y, scale]; return [x, y, scale];
}, }
_cancelDrag(eventTime) { _cancelDrag(eventTime) {
this.emit('drag-cancelled', eventTime); this.emit('drag-cancelled', eventTime);
@@ -613,7 +610,7 @@ var _Draggable = new Lang.Class({
scale_y: snapBackScale, scale_y: snapBackScale,
time: SNAP_BACK_ANIMATION_TIME, time: SNAP_BACK_ANIMATION_TIME,
}); });
}, }
_restoreDragActor(eventTime) { _restoreDragActor(eventTime) {
this._dragState = DragState.INIT; this._dragState = DragState.INIT;
@@ -626,7 +623,7 @@ var _Draggable = new Lang.Class({
this._animateDragEnd(eventTime, this._animateDragEnd(eventTime,
{ time: REVERT_ANIMATION_TIME }); { time: REVERT_ANIMATION_TIME });
}, }
_animateDragEnd(eventTime, params) { _animateDragEnd(eventTime, params) {
this._animationInProgress = true; this._animationInProgress = true;
@@ -639,7 +636,7 @@ var _Draggable = new Lang.Class({
// start the animation // start the animation
Tweener.addTween(this._dragActor, params) Tweener.addTween(this._dragActor, params)
}, }
_finishAnimation() { _finishAnimation() {
if (!this._animationInProgress) if (!this._animationInProgress)
@@ -650,7 +647,7 @@ var _Draggable = new Lang.Class({
this._dragComplete(); this._dragComplete();
global.display.set_cursor(Meta.Cursor.DEFAULT); global.display.set_cursor(Meta.Cursor.DEFAULT);
}, }
_onAnimationComplete(dragActor, eventTime) { _onAnimationComplete(dragActor, eventTime) {
if (this._dragOrigParent) { if (this._dragOrigParent) {
@@ -664,7 +661,7 @@ var _Draggable = new Lang.Class({
this.emit('drag-end', eventTime, false); this.emit('drag-end', eventTime, false);
this._finishAnimation(); this._finishAnimation();
}, }
_dragComplete() { _dragComplete() {
if (!this._actorDestroyed && this._dragActor) if (!this._actorDestroyed && this._dragActor)
@@ -686,8 +683,7 @@ var _Draggable = new Lang.Class({
this._dragState = DragState.INIT; this._dragState = DragState.INIT;
currentDraggable = null; currentDraggable = null;
} }
}); };
Signals.addSignalMethods(_Draggable.prototype); Signals.addSignalMethods(_Draggable.prototype);
/** /**

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang; const GObject = imports.gi.GObject;
const Signals = imports.signals; const Signals = imports.signals;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
@@ -11,26 +11,24 @@ const Main = imports.ui.main;
var EDGE_THRESHOLD = 20; var EDGE_THRESHOLD = 20;
var DRAG_DISTANCE = 80; var DRAG_DISTANCE = 80;
var EdgeDragAction = new Lang.Class({ var EdgeDragAction = GObject.registerClass({
Name: 'EdgeDragAction',
Extends: Clutter.GestureAction,
Signals: { 'activated': {} }, Signals: { 'activated': {} },
}, class EdgeDragAction extends Clutter.GestureAction {
_init(side, allowedModes) { _init(side, allowedModes) {
this.parent(); super._init();
this._side = side; this._side = side;
this._allowedModes = allowedModes; this._allowedModes = allowedModes;
this.set_n_touch_points(1); this.set_n_touch_points(1);
global.display.connect('grab-op-begin', () => { this.cancel(); }); global.display.connect('grab-op-begin', () => { this.cancel(); });
}, }
_getMonitorRect(x, y) { _getMonitorRect(x, y) {
let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 }); let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 });
let monitorIndex = global.display.get_monitor_index_for_rect(rect); let monitorIndex = global.display.get_monitor_index_for_rect(rect);
return global.display.get_monitor_geometry(monitorIndex); return global.display.get_monitor_geometry(monitorIndex);
}, }
vfunc_gesture_prepare(action, actor) { vfunc_gesture_prepare(action, actor) {
if (this.get_n_current_points() == 0) if (this.get_n_current_points() == 0)
@@ -46,7 +44,7 @@ var EdgeDragAction = new Lang.Class({
(this._side == St.Side.RIGHT && x > monitorRect.x + monitorRect.width - EDGE_THRESHOLD) || (this._side == St.Side.RIGHT && x > monitorRect.x + monitorRect.width - EDGE_THRESHOLD) ||
(this._side == St.Side.TOP && y < monitorRect.y + EDGE_THRESHOLD) || (this._side == St.Side.TOP && y < monitorRect.y + EDGE_THRESHOLD) ||
(this._side == St.Side.BOTTOM && y > monitorRect.y + monitorRect.height - EDGE_THRESHOLD)); (this._side == St.Side.BOTTOM && y > monitorRect.y + monitorRect.height - EDGE_THRESHOLD));
}, }
vfunc_gesture_progress(action, actor) { vfunc_gesture_progress(action, actor) {
let [startX, startY] = this.get_press_coords(0); let [startX, startY] = this.get_press_coords(0);
@@ -66,7 +64,7 @@ var EdgeDragAction = new Lang.Class({
} }
return true; return true;
}, }
vfunc_gesture_end(action, actor) { vfunc_gesture_end(action, actor) {
let [startX, startY] = this.get_press_coords(0); let [startX, startY] = this.get_press_coords(0);

View File

@@ -16,7 +16,6 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const AccountsService = imports.gi.AccountsService; const AccountsService = imports.gi.AccountsService;
@@ -235,13 +234,10 @@ function init() {
_endSessionDialog = new EndSessionDialog(); _endSessionDialog = new EndSessionDialog();
} }
var EndSessionDialog = new Lang.Class({ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
Name: 'EndSessionDialog', constructor() {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'end-session-dialog',
destroyOnClose: false });
_init() {
this.parent({ styleClass: 'end-session-dialog',
destroyOnClose: false });
this._loginManager = LoginManager.getLoginManager(); this._loginManager = LoginManager.getLoginManager();
this._userManager = AccountsService.UserManager.get_default(); this._userManager = AccountsService.UserManager.get_default();
@@ -356,12 +352,12 @@ var EndSessionDialog = new Lang.Class({
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
}, }
_onDestroy() { _onDestroy() {
this._user.disconnect(this._userLoadedId); this._user.disconnect(this._userLoadedId);
this._user.disconnect(this._userChangedId); this._user.disconnect(this._userChangedId);
}, }
_sync() { _sync() {
let open = (this.state == ModalDialog.State.OPENING || this.state == ModalDialog.State.OPENED); let open = (this.state == ModalDialog.State.OPENING || this.state == ModalDialog.State.OPENED);
@@ -434,7 +430,7 @@ var EndSessionDialog = new Lang.Class({
this._scrollView.visible = hasApplications || hasSessions; this._scrollView.visible = hasApplications || hasSessions;
this._applicationHeader.visible = hasApplications; this._applicationHeader.visible = hasApplications;
this._sessionHeader.visible = hasSessions; this._sessionHeader.visible = hasSessions;
}, }
_updateButtons() { _updateButtons() {
let dialogContent = DialogContent[this._type]; let dialogContent = DialogContent[this._type];
@@ -456,20 +452,20 @@ var EndSessionDialog = new Lang.Class({
} }
this.setButtons(buttons); this.setButtons(buttons);
}, }
close(skipSignal) { close(skipSignal) {
this.parent(); super.close();
if (!skipSignal) if (!skipSignal)
this._dbusImpl.emit_signal('Closed', null); this._dbusImpl.emit_signal('Closed', null);
}, }
cancel() { cancel() {
this._stopTimer(); this._stopTimer();
this._dbusImpl.emit_signal('Canceled', null); this._dbusImpl.emit_signal('Canceled', null);
this.close(); this.close();
}, }
_confirm(signal) { _confirm(signal) {
let callback = () => { let callback = () => {
@@ -504,11 +500,11 @@ var EndSessionDialog = new Lang.Class({
} else { } else {
this._triggerOfflineUpdateCancel(callback); this._triggerOfflineUpdateCancel(callback);
} }
}, }
_onOpened() { _onOpened() {
this._sync(); this._sync();
}, }
_triggerOfflineUpdateReboot(callback) { _triggerOfflineUpdateReboot(callback) {
this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => { this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
@@ -517,7 +513,7 @@ var EndSessionDialog = new Lang.Class({
callback(); callback();
}); });
}, }
_triggerOfflineUpdateShutdown(callback) { _triggerOfflineUpdateShutdown(callback) {
this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => { this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
@@ -526,7 +522,7 @@ var EndSessionDialog = new Lang.Class({
callback(); callback();
}); });
}, }
_triggerOfflineUpdateCancel(callback) { _triggerOfflineUpdateCancel(callback) {
this._pkOfflineProxy.CancelRemote((result, error) => { this._pkOfflineProxy.CancelRemote((result, error) => {
@@ -535,7 +531,7 @@ var EndSessionDialog = new Lang.Class({
callback(); callback();
}); });
}, }
_startTimer() { _startTimer() {
let startTime = GLib.get_monotonic_time(); let startTime = GLib.get_monotonic_time();
@@ -559,7 +555,7 @@ var EndSessionDialog = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._timerId, '[gnome-shell] this._confirm'); GLib.Source.set_name_by_id(this._timerId, '[gnome-shell] this._confirm');
}, }
_stopTimer() { _stopTimer() {
if (this._timerId > 0) { if (this._timerId > 0) {
@@ -568,7 +564,7 @@ var EndSessionDialog = new Lang.Class({
} }
this._secondsLeft = 0; this._secondsLeft = 0;
}, }
_constructListItemForApp(inhibitor, app) { _constructListItemForApp(inhibitor, app) {
let actor = new St.BoxLayout({ style_class: 'end-session-dialog-app-list-item', let actor = new St.BoxLayout({ style_class: 'end-session-dialog-app-list-item',
@@ -593,7 +589,7 @@ var EndSessionDialog = new Lang.Class({
} }
return actor; return actor;
}, }
_onInhibitorLoaded(inhibitor) { _onInhibitorLoaded(inhibitor) {
if (this._applications.indexOf(inhibitor) < 0) { if (this._applications.indexOf(inhibitor) < 0) {
@@ -612,7 +608,7 @@ var EndSessionDialog = new Lang.Class({
} }
this._sync(); this._sync();
}, }
_constructListItemForSession(session) { _constructListItemForSession(session) {
let avatar = new UserWidget.Avatar(session.user, { iconSize: _ITEM_ICON_SIZE }); let avatar = new UserWidget.Avatar(session.user, { iconSize: _ITEM_ICON_SIZE });
@@ -642,7 +638,7 @@ var EndSessionDialog = new Lang.Class({
actor.label_actor = nameLabel; actor.label_actor = nameLabel;
return actor; return actor;
}, }
_loadSessions() { _loadSessions() {
this._loginManager.listSessions(result => { this._loginManager.listSessions(result => {
@@ -684,7 +680,7 @@ var EndSessionDialog = new Lang.Class({
this._sync(); this._sync();
}); });
}, }
OpenAsync(parameters, invocation) { OpenAsync(parameters, invocation) {
let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters; let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters;
@@ -754,9 +750,9 @@ var EndSessionDialog = new Lang.Class({
invocation.return_value(null); invocation.return_value(null);
this.disconnect(signalId); this.disconnect(signalId);
}); });
}, }
Close(parameters, invocation) { Close(parameters, invocation) {
this.close(); this.close();
} }
}); };

View File

@@ -14,7 +14,6 @@ const Clutter = imports.gi.Clutter;
const Gettext = imports.gettext; const Gettext = imports.gettext;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;

View File

@@ -1,7 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
@@ -183,12 +181,10 @@ function checkForUpdates() {
}); });
} }
var InstallExtensionDialog = new Lang.Class({ var InstallExtensionDialog =
Name: 'InstallExtensionDialog', class InstallExtensionDialog extends ModalDialog.ModalDialog {
Extends: ModalDialog.ModalDialog, constructor(uuid, info, invocation) {
super({ styleClass: 'extension-dialog' });
_init(uuid, info, invocation) {
this.parent({ styleClass: 'extension-dialog' });
this._uuid = uuid; this._uuid = uuid;
this._info = info; this._info = info;
@@ -216,12 +212,12 @@ var InstallExtensionDialog = new Lang.Class({
let label = new St.Label({ style_class: 'message-dialog-title headline', let label = new St.Label({ style_class: 'message-dialog-title headline',
text: message }); text: message });
box.add(label); box.add(label);
}, }
_onCancelButtonPressed(button, event) { _onCancelButtonPressed(button, event) {
this.close(); this.close();
this._invocation.return_value(GLib.Variant.new('(s)', ['cancelled'])); this._invocation.return_value(GLib.Variant.new('(s)', ['cancelled']));
}, }
_onInstallButtonPressed(button, event) { _onInstallButtonPressed(button, event) {
let params = { shell_version: Config.PACKAGE_VERSION }; let params = { shell_version: Config.PACKAGE_VERSION };
@@ -264,7 +260,7 @@ var InstallExtensionDialog = new Lang.Class({
this.close(); this.close();
} }
}); };
function init() { function init() {
_httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true }); _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;

View File

@@ -22,29 +22,26 @@
*/ */
const Atspi = imports.gi.Atspi; const Atspi = imports.gi.Atspi;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const CARETMOVED = 'object:text-caret-moved'; const CARETMOVED = 'object:text-caret-moved';
const STATECHANGED = 'object:state-changed'; const STATECHANGED = 'object:state-changed';
var FocusCaretTracker = new Lang.Class({ var FocusCaretTracker = class FocusCaretTracker {
Name: 'FocusCaretTracker', constructor() {
_init() {
this._atspiListener = Atspi.EventListener.new(this._onChanged.bind(this)); this._atspiListener = Atspi.EventListener.new(this._onChanged.bind(this));
this._atspiInited = false; this._atspiInited = false;
this._focusListenerRegistered = false; this._focusListenerRegistered = false;
this._caretListenerRegistered = false; this._caretListenerRegistered = false;
}, }
_onChanged(event) { _onChanged(event) {
if (event.type.indexOf(STATECHANGED) == 0) if (event.type.indexOf(STATECHANGED) == 0)
this.emit('focus-changed', event); this.emit('focus-changed', event);
else if (event.type == CARETMOVED) else if (event.type == CARETMOVED)
this.emit('caret-moved', event); this.emit('caret-moved', event);
}, }
_initAtspi() { _initAtspi() {
if (!this._atspiInited && Atspi.init() == 0) { if (!this._atspiInited && Atspi.init() == 0) {
@@ -53,7 +50,7 @@ var FocusCaretTracker = new Lang.Class({
} }
return this._atspiInited; return this._atspiInited;
}, }
registerFocusListener() { registerFocusListener() {
if (!this._initAtspi() || this._focusListenerRegistered) if (!this._initAtspi() || this._focusListenerRegistered)
@@ -62,7 +59,7 @@ var FocusCaretTracker = new Lang.Class({
this._atspiListener.register(STATECHANGED + ':focused'); this._atspiListener.register(STATECHANGED + ':focused');
this._atspiListener.register(STATECHANGED + ':selected'); this._atspiListener.register(STATECHANGED + ':selected');
this._focusListenerRegistered = true; this._focusListenerRegistered = true;
}, }
registerCaretListener() { registerCaretListener() {
if (!this._initAtspi() || this._caretListenerRegistered) if (!this._initAtspi() || this._caretListenerRegistered)
@@ -70,7 +67,7 @@ var FocusCaretTracker = new Lang.Class({
this._atspiListener.register(CARETMOVED); this._atspiListener.register(CARETMOVED);
this._caretListenerRegistered = true; this._caretListenerRegistered = true;
}, }
deregisterFocusListener() { deregisterFocusListener() {
if (!this._focusListenerRegistered) if (!this._focusListenerRegistered)
@@ -79,7 +76,7 @@ var FocusCaretTracker = new Lang.Class({
this._atspiListener.deregister(STATECHANGED + ':focused'); this._atspiListener.deregister(STATECHANGED + ':focused');
this._atspiListener.deregister(STATECHANGED + ':selected'); this._atspiListener.deregister(STATECHANGED + ':selected');
this._focusListenerRegistered = false; this._focusListenerRegistered = false;
}, }
deregisterCaretListener() { deregisterCaretListener() {
if (!this._caretListenerRegistered) if (!this._caretListenerRegistered)
@@ -88,5 +85,5 @@ var FocusCaretTracker = new Lang.Class({
this._atspiListener.deregister(CARETMOVED); this._atspiListener.deregister(CARETMOVED);
this._caretListenerRegistered = false; this._caretListenerRegistered = false;
} }
}); };
Signals.addSignalMethods(FocusCaretTracker.prototype); Signals.addSignalMethods(FocusCaretTracker.prototype);

View File

@@ -2,7 +2,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -46,10 +45,8 @@ function _popGrabHelper(grabHelper) {
// your code just needs to deal with it; you shouldn't adjust behavior directly // your code just needs to deal with it; you shouldn't adjust behavior directly
// after you call ungrab(), but instead pass an 'onUngrab' callback when you // after you call ungrab(), but instead pass an 'onUngrab' callback when you
// call grab(). // call grab().
var GrabHelper = new Lang.Class({ var GrabHelper = class GrabHelper {
Name: 'GrabHelper', constructor(owner, params) {
_init(owner, params) {
this._owner = owner; this._owner = owner;
this._modalParams = params; this._modalParams = params;
@@ -59,7 +56,7 @@ var GrabHelper = new Lang.Class({
this._ignoreUntilRelease = false; this._ignoreUntilRelease = false;
this._modalCount = 0; this._modalCount = 0;
}, }
// addActor: // addActor:
// @actor: an actor // @actor: an actor
@@ -71,7 +68,7 @@ var GrabHelper = new Lang.Class({
this.removeActor(actor); this.removeActor(actor);
}); });
this._actors.push(actor); this._actors.push(actor);
}, }
// removeActor: // removeActor:
// @actor: an actor // @actor: an actor
@@ -86,7 +83,7 @@ var GrabHelper = new Lang.Class({
actor.disconnect(actor.__grabHelperDestroyId); actor.disconnect(actor.__grabHelperDestroyId);
delete actor.__grabHelperDestroyId; delete actor.__grabHelperDestroyId;
} }
}, }
_isWithinGrabbedActor(actor) { _isWithinGrabbedActor(actor) {
let currentActor = this.currentGrab.actor; let currentActor = this.currentGrab.actor;
@@ -98,19 +95,19 @@ var GrabHelper = new Lang.Class({
actor = actor.get_parent(); actor = actor.get_parent();
} }
return false; return false;
}, }
get currentGrab() { get currentGrab() {
return this._grabStack[this._grabStack.length - 1] || {}; return this._grabStack[this._grabStack.length - 1] || {};
}, }
get grabbed() { get grabbed() {
return this._grabStack.length > 0; return this._grabStack.length > 0;
}, }
get grabStack() { get grabStack() {
return this._grabStack; return this._grabStack;
}, }
_findStackIndex(actor) { _findStackIndex(actor) {
if (!actor) if (!actor)
@@ -121,7 +118,7 @@ var GrabHelper = new Lang.Class({
return i; return i;
} }
return -1; return -1;
}, }
_actorInGrabStack(actor) { _actorInGrabStack(actor) {
while (actor) { while (actor) {
@@ -131,11 +128,11 @@ var GrabHelper = new Lang.Class({
actor = actor.get_parent(); actor = actor.get_parent();
} }
return -1; return -1;
}, }
isActorGrabbed(actor) { isActorGrabbed(actor) {
return this._findStackIndex(actor) >= 0; return this._findStackIndex(actor) >= 0;
}, }
// grab: // grab:
// @params: A bunch of parameters, see below // @params: A bunch of parameters, see below
@@ -195,7 +192,7 @@ var GrabHelper = new Lang.Class({
} }
return true; return true;
}, }
_takeModalGrab() { _takeModalGrab() {
let firstGrab = (this._modalCount == 0); let firstGrab = (this._modalCount == 0);
@@ -208,7 +205,7 @@ var GrabHelper = new Lang.Class({
this._modalCount++; this._modalCount++;
return true; return true;
}, }
_releaseModalGrab() { _releaseModalGrab() {
this._modalCount--; this._modalCount--;
@@ -221,7 +218,7 @@ var GrabHelper = new Lang.Class({
Main.popModal(this._owner); Main.popModal(this._owner);
global.sync_pointer(); global.sync_pointer();
}, }
// ignoreRelease: // ignoreRelease:
// //
@@ -231,7 +228,7 @@ var GrabHelper = new Lang.Class({
// the next release event. // the next release event.
ignoreRelease() { ignoreRelease() {
this._ignoreUntilRelease = true; this._ignoreUntilRelease = true;
}, }
// ungrab: // ungrab:
// @params: The parameters for the grab; see below. // @params: The parameters for the grab; see below.
@@ -274,7 +271,7 @@ var GrabHelper = new Lang.Class({
if (poppedGrab.savedFocus) if (poppedGrab.savedFocus)
poppedGrab.savedFocus.grab_key_focus(); poppedGrab.savedFocus.grab_key_focus();
} }
}, }
onCapturedEvent(event) { onCapturedEvent(event) {
let type = event.type(); let type = event.type();
@@ -322,5 +319,5 @@ var GrabHelper = new Lang.Class({
} }
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
}); };

View File

@@ -2,7 +2,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const IBus = imports.gi.IBus; const IBus = imports.gi.IBus;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
@@ -14,10 +13,8 @@ var MAX_CANDIDATES_PER_PAGE = 16;
var DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8', var DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ]; '9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ];
var CandidateArea = new Lang.Class({ var CandidateArea = class CandidateArea {
Name: 'CandidateArea', constructor() {
_init() {
this.actor = new St.BoxLayout({ vertical: true, this.actor = new St.BoxLayout({ vertical: true,
reactive: true, reactive: true,
visible: false }); visible: false });
@@ -74,7 +71,7 @@ var CandidateArea = new Lang.Class({
this._orientation = -1; this._orientation = -1;
this._cursorPosition = 0; this._cursorPosition = 0;
}, }
setOrientation(orientation) { setOrientation(orientation) {
if (this._orientation == orientation) if (this._orientation == orientation)
@@ -95,7 +92,7 @@ var CandidateArea = new Lang.Class({
this._previousButton.child.icon_name = 'go-up-symbolic'; this._previousButton.child.icon_name = 'go-up-symbolic';
this._nextButton.child.icon_name = 'go-down-symbolic'; this._nextButton.child.icon_name = 'go-down-symbolic';
} }
}, }
setCandidates(indexes, candidates, cursorPosition, cursorVisible) { setCandidates(indexes, candidates, cursorPosition, cursorVisible) {
for (let i = 0; i < MAX_CANDIDATES_PER_PAGE; ++i) { for (let i = 0; i < MAX_CANDIDATES_PER_PAGE; ++i) {
@@ -114,7 +111,7 @@ var CandidateArea = new Lang.Class({
this._cursorPosition = cursorPosition; this._cursorPosition = cursorPosition;
if (cursorVisible) if (cursorVisible)
this._candidateBoxes[cursorPosition].add_style_pseudo_class('selected'); this._candidateBoxes[cursorPosition].add_style_pseudo_class('selected');
}, }
updateButtons(wrapsAround, page, nPages) { updateButtons(wrapsAround, page, nPages) {
if (nPages < 2) { if (nPages < 2) {
@@ -124,14 +121,12 @@ var CandidateArea = new Lang.Class({
this._buttonBox.show(); this._buttonBox.show();
this._previousButton.reactive = wrapsAround || page > 0; this._previousButton.reactive = wrapsAround || page > 0;
this._nextButton.reactive = wrapsAround || page < nPages - 1; this._nextButton.reactive = wrapsAround || page < nPages - 1;
}, }
}); };
Signals.addSignalMethods(CandidateArea.prototype); Signals.addSignalMethods(CandidateArea.prototype);
var CandidatePopup = new Lang.Class({ var CandidatePopup = class CandidatePopup {
Name: 'CandidatePopup', constructor() {
_init() {
this._boxPointer = new BoxPointer.BoxPointer(St.Side.TOP); this._boxPointer = new BoxPointer.BoxPointer(St.Side.TOP);
this._boxPointer.visible = false; this._boxPointer.visible = false;
this._boxPointer.style_class = 'candidate-popup-boxpointer'; this._boxPointer.style_class = 'candidate-popup-boxpointer';
@@ -171,7 +166,7 @@ var CandidatePopup = new Lang.Class({
}); });
this._panelService = null; this._panelService = null;
}, }
setPanelService(panelService) { setPanelService(panelService) {
this._panelService = panelService; this._panelService = panelService;
@@ -275,13 +270,13 @@ var CandidatePopup = new Lang.Class({
this._boxPointer.close(BoxPointer.PopupAnimation.NONE); this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
Main.keyboard.resetSuggestions(); Main.keyboard.resetSuggestions();
}); });
}, }
_setDummyCursorGeometry(x, y, w, h) { _setDummyCursorGeometry(x, y, w, h) {
Main.layoutManager.setDummyCursorGeometry(x, y, w, h); Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
if (this._boxPointer.actor.visible) if (this._boxPointer.actor.visible)
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
}, }
_updateVisibility() { _updateVisibility() {
let isVisible = (!Main.keyboard.visible && let isVisible = (!Main.keyboard.visible &&
@@ -296,7 +291,7 @@ var CandidatePopup = new Lang.Class({
} else { } else {
this._boxPointer.close(BoxPointer.PopupAnimation.NONE); this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
} }
}, }
_setTextAttributes(clutterText, ibusAttrList) { _setTextAttributes(clutterText, ibusAttrList) {
let attr; let attr;
@@ -304,4 +299,4 @@ var CandidatePopup = new Lang.Class({
if (attr.get_attr_type() == IBus.AttrType.BACKGROUND) if (attr.get_attr_type() == IBus.AttrType.BACKGROUND)
clutterText.set_selection(attr.get_start_index(), attr.get_end_index()); clutterText.set_selection(attr.get_start_index(), attr.get_end_index());
} }
}); };

View File

@@ -1,13 +1,13 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang;
const Params = imports.misc.params; const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -34,10 +34,8 @@ var AnimationDirection = {
var APPICON_ANIMATION_OUT_SCALE = 3; var APPICON_ANIMATION_OUT_SCALE = 3;
var APPICON_ANIMATION_OUT_TIME = 0.25; var APPICON_ANIMATION_OUT_TIME = 0.25;
var BaseIcon = new Lang.Class({ var BaseIcon = GObject.registerClass(
Name: 'BaseIcon', class BaseIcon extends St.Bin {
Extends: St.Bin,
_init(label, params) { _init(label, params) {
params = Params.parse(params, { createIcon: null, params = Params.parse(params, { createIcon: null,
setSizeManually: false, setSizeManually: false,
@@ -47,7 +45,7 @@ var BaseIcon = new Lang.Class({
if (params.showLabel) if (params.showLabel)
styleClass += ' overview-icon-with-label'; styleClass += ' overview-icon-with-label';
this.parent({ style_class: styleClass, super._init({ style_class: styleClass,
x_fill: true, x_fill: true,
y_fill: true }); y_fill: true });
@@ -79,18 +77,18 @@ var BaseIcon = new Lang.Class({
let cache = St.TextureCache.get_default(); let cache = St.TextureCache.get_default();
this._iconThemeChangedId = cache.connect('icon-theme-changed', this._onIconThemeChanged.bind(this)); this._iconThemeChangedId = cache.connect('icon-theme-changed', this._onIconThemeChanged.bind(this));
}, }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
// Return the actual height to keep the squared aspect // Return the actual height to keep the squared aspect
return this.get_preferred_height(-1); return this.get_preferred_height(-1);
}, }
// This can be overridden by a subclass, or by the createIcon // This can be overridden by a subclass, or by the createIcon
// parameter to _init() // parameter to _init()
createIcon(size) { createIcon(size) {
throw new Error('no implementation of createIcon in ' + this); throw new Error('no implementation of createIcon in ' + this);
}, }
setIconSize(size) { setIconSize(size) {
if (!this._setSizeManually) if (!this._setSizeManually)
@@ -100,7 +98,7 @@ var BaseIcon = new Lang.Class({
return; return;
this._createIconTexture(size); this._createIconTexture(size);
}, }
_createIconTexture(size) { _createIconTexture(size) {
if (this.icon) if (this.icon)
@@ -109,7 +107,7 @@ var BaseIcon = new Lang.Class({
this.icon = this.createIcon(this.iconSize); this.icon = this.createIcon(this.iconSize);
this._iconBin.child = this.icon; this._iconBin.child = this.icon;
}, }
vfunc_style_changed() { vfunc_style_changed() {
let node = this.get_theme_node(); let node = this.get_theme_node();
@@ -126,7 +124,7 @@ var BaseIcon = new Lang.Class({
return; return;
this._createIconTexture(size); this._createIconTexture(size);
}, }
_onDestroy() { _onDestroy() {
if (this._iconThemeChangedId > 0) { if (this._iconThemeChangedId > 0) {
@@ -134,11 +132,11 @@ var BaseIcon = new Lang.Class({
cache.disconnect(this._iconThemeChangedId); cache.disconnect(this._iconThemeChangedId);
this._iconThemeChangedId = 0; this._iconThemeChangedId = 0;
} }
}, }
_onIconThemeChanged() { _onIconThemeChanged() {
this._createIconTexture(this.iconSize); this._createIconTexture(this.iconSize);
}, }
animateZoomOut() { animateZoomOut() {
// Animate only the child instead of the entire actor, so the // Animate only the child instead of the entire actor, so the
@@ -187,14 +185,12 @@ function zoomOutActor(actor) {
}); });
} }
var IconGrid = new Lang.Class({ var IconGrid = GObject.registerClass({
Name: 'IconGrid',
Extends: St.Widget,
Signals: {'animation-done': {}, Signals: {'animation-done': {},
'child-focused': { param_types: [Clutter.Actor.$gtype]} }, 'child-focused': { param_types: [Clutter.Actor.$gtype]} },
}, class IconGrid extends St.Widget {
_init(params) { _init(params) {
this.parent({ style_class: 'icon-grid', super._init({ style_class: 'icon-grid',
y_align: Clutter.ActorAlign.START }); y_align: Clutter.ActorAlign.START });
this.actor = this; this.actor = this;
@@ -236,19 +232,19 @@ var IconGrid = new Lang.Class({
this.connect('actor-added', this._childAdded.bind(this)); this.connect('actor-added', this._childAdded.bind(this));
this.connect('actor-removed', this._childRemoved.bind(this)); this.connect('actor-removed', this._childRemoved.bind(this));
}, }
_keyFocusIn(actor) { _keyFocusIn(actor) {
this.emit('child-focused', actor); this.emit('child-focused', actor);
}, }
_childAdded(grid, child) { _childAdded(grid, child) {
child._iconGridKeyFocusInId = child.connect('key-focus-in', this._keyFocusIn.bind(this)); child._iconGridKeyFocusInId = child.connect('key-focus-in', this._keyFocusIn.bind(this));
}, }
_childRemoved(grid, child) { _childRemoved(grid, child) {
child.disconnect(child._iconGridKeyFocusInId); child.disconnect(child._iconGridKeyFocusInId);
}, }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
if (this._fillParent) if (this._fillParent)
@@ -268,11 +264,11 @@ var IconGrid = new Lang.Class({
let natSize = nColumns * this._getHItemSize() + totalSpacing + this.leftPadding + this.rightPadding; let natSize = nColumns * this._getHItemSize() + totalSpacing + this.leftPadding + this.rightPadding;
return this.get_theme_node().adjust_preferred_width(minSize, natSize); return this.get_theme_node().adjust_preferred_width(minSize, natSize);
}, }
_getVisibleChildren() { _getVisibleChildren() {
return this.get_children().filter(actor => actor.visible); return this.get_children().filter(actor => actor.visible);
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
if (this._fillParent) if (this._fillParent)
@@ -302,7 +298,7 @@ var IconGrid = new Lang.Class({
let height = nRows * this._getVItemSize() + totalSpacing + this.topPadding + this.bottomPadding; let height = nRows * this._getVItemSize() + totalSpacing + this.topPadding + this.bottomPadding;
return themeNode.adjust_preferred_height(height, height); return themeNode.adjust_preferred_height(height, height);
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.set_allocation(box, flags); this.set_allocation(box, flags);
@@ -363,7 +359,7 @@ var IconGrid = new Lang.Class({
x += this._getHItemSize() + spacing; x += this._getHItemSize() + spacing;
} }
} }
}, }
vfunc_get_paint_volume(paintVolume) { vfunc_get_paint_volume(paintVolume) {
// Setting the paint volume does not make sense when we don't have // Setting the paint volume does not make sense when we don't have
@@ -402,7 +398,7 @@ var IconGrid = new Lang.Class({
} }
return true; return true;
}, }
/** /**
* Intended to be override by subclasses if they need a different * Intended to be override by subclasses if they need a different
@@ -410,12 +406,12 @@ var IconGrid = new Lang.Class({
*/ */
_getChildrenToAnimate() { _getChildrenToAnimate() {
return this._getVisibleChildren(); return this._getVisibleChildren();
}, }
_cancelAnimation() { _cancelAnimation() {
this._clonesAnimating.forEach(clone => { clone.destroy(); }); this._clonesAnimating.forEach(clone => { clone.destroy(); });
this._clonesAnimating = []; this._clonesAnimating = [];
}, }
_animationDone() { _animationDone() {
this._clonesAnimating.forEach(clone => { this._clonesAnimating.forEach(clone => {
@@ -425,7 +421,7 @@ var IconGrid = new Lang.Class({
}); });
this._clonesAnimating = []; this._clonesAnimating = [];
this.emit('animation-done'); this.emit('animation-done');
}, }
animatePulse(animationDirection) { animatePulse(animationDirection) {
if (animationDirection != AnimationDirection.IN) if (animationDirection != AnimationDirection.IN)
@@ -474,7 +470,7 @@ var IconGrid = new Lang.Class({
} }
}); });
} }
}, }
animateSpring(animationDirection, sourceActor) { animateSpring(animationDirection, sourceActor) {
this._cancelAnimation(); this._cancelAnimation();
@@ -574,7 +570,7 @@ var IconGrid = new Lang.Class({
Tweener.addTween(actorClone, movementParams); Tweener.addTween(actorClone, movementParams);
Tweener.addTween(actorClone, fadeParams); Tweener.addTween(actorClone, fadeParams);
} }
}, }
_getAllocatedChildSizeAndSpacing(child) { _getAllocatedChildSizeAndSpacing(child) {
let [,, natWidth, natHeight] = child.get_preferred_size(); let [,, natWidth, natHeight] = child.get_preferred_size();
@@ -583,7 +579,7 @@ var IconGrid = new Lang.Class({
let height = Math.min(this._getVItemSize(), natHeight); let height = Math.min(this._getVItemSize(), natHeight);
let ySpacing = Math.max(0, height - natHeight) / 2; let ySpacing = Math.max(0, height - natHeight) / 2;
return [width, height, xSpacing, ySpacing]; return [width, height, xSpacing, ySpacing];
}, }
_calculateChildBox(child, x, y, box) { _calculateChildBox(child, x, y, box) {
/* Center the item in its allocation horizontally */ /* Center the item in its allocation horizontally */
@@ -601,15 +597,15 @@ var IconGrid = new Lang.Class({
childBox.x2 = childBox.x1 + width; childBox.x2 = childBox.x1 + width;
childBox.y2 = childBox.y1 + height; childBox.y2 = childBox.y1 + height;
return childBox; return childBox;
}, }
columnsForWidth(rowWidth) { columnsForWidth(rowWidth) {
return this._computeLayout(rowWidth)[0]; return this._computeLayout(rowWidth)[0];
}, }
getRowLimit() { getRowLimit() {
return this._rowLimit; return this._rowLimit;
}, }
_computeLayout(forWidth) { _computeLayout(forWidth) {
let nColumns = 0; let nColumns = 0;
@@ -626,7 +622,7 @@ var IconGrid = new Lang.Class({
usedWidth -= spacing; usedWidth -= spacing;
return [nColumns, usedWidth]; return [nColumns, usedWidth];
}, }
_onStyleChanged() { _onStyleChanged() {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
@@ -634,7 +630,7 @@ var IconGrid = new Lang.Class({
this._hItemSize = themeNode.get_length('-shell-grid-horizontal-item-size') || ICON_SIZE; this._hItemSize = themeNode.get_length('-shell-grid-horizontal-item-size') || ICON_SIZE;
this._vItemSize = themeNode.get_length('-shell-grid-vertical-item-size') || ICON_SIZE; this._vItemSize = themeNode.get_length('-shell-grid-vertical-item-size') || ICON_SIZE;
this.queue_relayout(); this.queue_relayout();
}, }
nRows(forWidth) { nRows(forWidth) {
let children = this._getVisibleChildren(); let children = this._getVisibleChildren();
@@ -643,35 +639,35 @@ var IconGrid = new Lang.Class({
if (this._rowLimit) if (this._rowLimit)
nRows = Math.min(nRows, this._rowLimit); nRows = Math.min(nRows, this._rowLimit);
return nRows; return nRows;
}, }
rowsForHeight(forHeight) { rowsForHeight(forHeight) {
return Math.floor((forHeight - (this.topPadding + this.bottomPadding) + this._getSpacing()) / (this._getVItemSize() + this._getSpacing())); return Math.floor((forHeight - (this.topPadding + this.bottomPadding) + this._getSpacing()) / (this._getVItemSize() + this._getSpacing()));
}, }
usedHeightForNRows(nRows) { usedHeightForNRows(nRows) {
return (this._getVItemSize() + this._getSpacing()) * nRows - this._getSpacing() + this.topPadding + this.bottomPadding; return (this._getVItemSize() + this._getSpacing()) * nRows - this._getSpacing() + this.topPadding + this.bottomPadding;
}, }
usedWidth(forWidth) { usedWidth(forWidth) {
return this.usedWidthForNColumns(this.columnsForWidth(forWidth)); return this.usedWidthForNColumns(this.columnsForWidth(forWidth));
}, }
usedWidthForNColumns(columns) { usedWidthForNColumns(columns) {
let usedWidth = columns * (this._getHItemSize() + this._getSpacing()); let usedWidth = columns * (this._getHItemSize() + this._getSpacing());
usedWidth -= this._getSpacing(); usedWidth -= this._getSpacing();
return usedWidth + this.leftPadding + this.rightPadding; return usedWidth + this.leftPadding + this.rightPadding;
}, }
removeAll() { removeAll() {
this._items = []; this._items = [];
this.remove_all_children(); this.remove_all_children();
}, }
destroyAll() { destroyAll() {
this._items = []; this._items = [];
this.destroy_all_children(); this.destroy_all_children();
}, }
addItem(item, index) { addItem(item, index) {
if (!item.icon instanceof BaseIcon) if (!item.icon instanceof BaseIcon)
@@ -682,35 +678,35 @@ var IconGrid = new Lang.Class({
this.insert_child_at_index(item.actor, index); this.insert_child_at_index(item.actor, index);
else else
this.add_actor(item.actor); this.add_actor(item.actor);
}, }
removeItem(item) { removeItem(item) {
this.remove_child(item.actor); this.remove_child(item.actor);
}, }
getItemAtIndex(index) { getItemAtIndex(index) {
return this.get_child_at_index(index); return this.get_child_at_index(index);
}, }
visibleItemsCount() { visibleItemsCount() {
return this.get_children().filter(c => c.is_visible()).length; return this.get_children().filter(c => c.is_visible()).length;
}, }
setSpacing(spacing) { setSpacing(spacing) {
this._fixedSpacing = spacing; this._fixedSpacing = spacing;
}, }
_getSpacing() { _getSpacing() {
return this._fixedSpacing ? this._fixedSpacing : this._spacing; return this._fixedSpacing ? this._fixedSpacing : this._spacing;
}, }
_getHItemSize() { _getHItemSize() {
return this._fixedHItemSize ? this._fixedHItemSize : this._hItemSize; return this._fixedHItemSize ? this._fixedHItemSize : this._hItemSize;
}, }
_getVItemSize() { _getVItemSize() {
return this._fixedVItemSize ? this._fixedVItemSize : this._vItemSize; return this._fixedVItemSize ? this._fixedVItemSize : this._vItemSize;
}, }
_updateSpacingForSize(availWidth, availHeight) { _updateSpacingForSize(availWidth, availHeight) {
let maxEmptyVArea = availHeight - this._minRows * this._getVItemSize(); let maxEmptyVArea = availHeight - this._minRows * this._getVItemSize();
@@ -743,7 +739,7 @@ var IconGrid = new Lang.Class({
this.setSpacing(spacing); this.setSpacing(spacing);
if (this._padWithSpacing) if (this._padWithSpacing)
this.topPadding = this.rightPadding = this.bottomPadding = this.leftPadding = spacing; this.topPadding = this.rightPadding = this.bottomPadding = this.leftPadding = spacing;
}, }
/** /**
* This function must to be called before iconGrid allocation, * This function must to be called before iconGrid allocation,
@@ -768,7 +764,7 @@ var IconGrid = new Lang.Class({
} }
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
this._updateIconSizes.bind(this)); this._updateIconSizes.bind(this));
}, }
// Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up // Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up
_updateIconSizes() { _updateIconSizes() {
@@ -780,25 +776,23 @@ var IconGrid = new Lang.Class({
} }
}); });
var PaginatedIconGrid = new Lang.Class({ var PaginatedIconGrid = GObject.registerClass({
Name: 'PaginatedIconGrid',
Extends: IconGrid,
Signals: {'space-opened': {}, Signals: {'space-opened': {},
'space-closed': {} }, 'space-closed': {} },
}, class PaginatedIconGrid extends IconGrid {
_init(params) { _init(params) {
this.parent(params); super._init(params);
this._nPages = 0; this._nPages = 0;
this.currentPage = 0; this.currentPage = 0;
this._rowsPerPage = 0; this._rowsPerPage = 0;
this._spaceBetweenPages = 0; this._spaceBetweenPages = 0;
this._childrenPerPage = 0; this._childrenPerPage = 0;
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
let height = (this._availableHeightPerPageForItems() + this.bottomPadding + this.topPadding) * this._nPages + this._spaceBetweenPages * this._nPages; let height = (this._availableHeightPerPageForItems() + this.bottomPadding + this.topPadding) * this._nPages + this._spaceBetweenPages * this._nPages;
return [height, height]; return [height, height];
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
if (this._childrenPerPage == 0) if (this._childrenPerPage == 0)
@@ -853,7 +847,7 @@ var PaginatedIconGrid = new Lang.Class({
} else } else
x += this._getHItemSize() + spacing; x += this._getHItemSize() + spacing;
} }
}, }
// Overriden from IconGrid // Overriden from IconGrid
_getChildrenToAnimate() { _getChildrenToAnimate() {
@@ -862,7 +856,7 @@ var PaginatedIconGrid = new Lang.Class({
let lastIndex = firstIndex + this._childrenPerPage; let lastIndex = firstIndex + this._childrenPerPage;
return children.slice(firstIndex, lastIndex); return children.slice(firstIndex, lastIndex);
}, }
_computePages(availWidthPerPage, availHeightPerPage) { _computePages(availWidthPerPage, availHeightPerPage) {
let [nColumns, usedWidth] = this._computeLayout(availWidthPerPage); let [nColumns, usedWidth] = this._computeLayout(availWidthPerPage);
@@ -881,24 +875,24 @@ var PaginatedIconGrid = new Lang.Class({
this._nPages = Math.ceil(nRows / this._rowsPerPage); this._nPages = Math.ceil(nRows / this._rowsPerPage);
this._spaceBetweenPages = availHeightPerPage - (this.topPadding + this.bottomPadding) - this._availableHeightPerPageForItems(); this._spaceBetweenPages = availHeightPerPage - (this.topPadding + this.bottomPadding) - this._availableHeightPerPageForItems();
this._childrenPerPage = nColumns * this._rowsPerPage; this._childrenPerPage = nColumns * this._rowsPerPage;
}, }
adaptToSize(availWidth, availHeight) { adaptToSize(availWidth, availHeight) {
this.parent(availWidth, availHeight); super.adaptToSize(availWidth, availHeight);
this._computePages(availWidth, availHeight); this._computePages(availWidth, availHeight);
}, }
_availableHeightPerPageForItems() { _availableHeightPerPageForItems() {
return this.usedHeightForNRows(this._rowsPerPage) - (this.topPadding + this.bottomPadding); return this.usedHeightForNRows(this._rowsPerPage) - (this.topPadding + this.bottomPadding);
}, }
nPages() { nPages() {
return this._nPages; return this._nPages;
}, }
getPageHeight() { getPageHeight() {
return this._availableHeightPerPageForItems(); return this._availableHeightPerPageForItems();
}, }
getPageY(pageNumber) { getPageY(pageNumber) {
if (!this._nPages) if (!this._nPages)
@@ -907,7 +901,7 @@ var PaginatedIconGrid = new Lang.Class({
let firstPageItem = pageNumber * this._childrenPerPage let firstPageItem = pageNumber * this._childrenPerPage
let childBox = this._getVisibleChildren()[firstPageItem].get_allocation_box(); let childBox = this._getVisibleChildren()[firstPageItem].get_allocation_box();
return childBox.y1 - this.topPadding; return childBox.y1 - this.topPadding;
}, }
getItemPage(item) { getItemPage(item) {
let children = this._getVisibleChildren(); let children = this._getVisibleChildren();
@@ -917,7 +911,7 @@ var PaginatedIconGrid = new Lang.Class({
return 0; return 0;
} }
return Math.floor(index / this._childrenPerPage); return Math.floor(index / this._childrenPerPage);
}, }
/** /**
* openExtraSpace: * openExtraSpace:
@@ -969,7 +963,7 @@ var PaginatedIconGrid = new Lang.Class({
this._translateChildren(childrenDown, Gtk.DirectionType.DOWN, nRowsDown); this._translateChildren(childrenDown, Gtk.DirectionType.DOWN, nRowsDown);
this._translatedChildren = childrenUp.concat(childrenDown); this._translatedChildren = childrenUp.concat(childrenDown);
} }
}, }
_translateChildren(children, direction, nRows) { _translateChildren(children, direction, nRows) {
let translationY = nRows * (this._getVItemSize() + this._getSpacing()); let translationY = nRows * (this._getVItemSize() + this._getSpacing());
@@ -989,7 +983,7 @@ var PaginatedIconGrid = new Lang.Class({
params.onComplete = () => { this.emit('space-opened'); }; params.onComplete = () => { this.emit('space-opened'); };
Tweener.addTween(children[i], params); Tweener.addTween(children[i], params);
} }
}, }
closeExtraSpace() { closeExtraSpace() {
if (!this._translatedChildren || !this._translatedChildren.length) { if (!this._translatedChildren || !this._translatedChildren.length) {

View File

@@ -2,7 +2,6 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -16,41 +15,39 @@ const APP_WHITELIST = ['gnome-control-center.desktop'];
var DialogResponse = Meta.InhibitShortcutsDialogResponse; var DialogResponse = Meta.InhibitShortcutsDialogResponse;
var InhibitShortcutsDialog = new Lang.Class({ var InhibitShortcutsDialog = GObject.registerClass({
Name: 'InhibitShortcutsDialog',
Extends: GObject.Object,
Implements: [Meta.InhibitShortcutsDialog], Implements: [Meta.InhibitShortcutsDialog],
Properties: { Properties: {
'window': GObject.ParamSpec.override('window', Meta.InhibitShortcutsDialog) 'window': GObject.ParamSpec.override('window', Meta.InhibitShortcutsDialog)
}, }
}, class InhibitShortcutsDialog extends GObject.Object {
_init(window) { _init(window) {
this.parent(); super._init();
this._window = window; this._window = window;
this._dialog = new ModalDialog.ModalDialog(); this._dialog = new ModalDialog.ModalDialog();
this._buildLayout(); this._buildLayout();
}, }
get window() { get window() {
return this._window; return this._window;
}, }
set window(window) { set window(window) {
this._window = window; this._window = window;
}, }
get _app() { get _app() {
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
return windowTracker.get_window_app(this._window); return windowTracker.get_window_app(this._window);
}, }
_getRestoreAccel() { _getRestoreAccel() {
let settings = new Gio.Settings({ schema_id: WAYLAND_KEYBINDINGS_SCHEMA }); let settings = new Gio.Settings({ schema_id: WAYLAND_KEYBINDINGS_SCHEMA });
let accel = settings.get_strv('restore-shortcuts')[0] || ''; let accel = settings.get_strv('restore-shortcuts')[0] || '';
return Gtk.accelerator_get_label.apply(null, return Gtk.accelerator_get_label.apply(null,
Gtk.accelerator_parse(accel)); Gtk.accelerator_parse(accel));
}, }
_buildLayout() { _buildLayout() {
let name = this._app ? this._app.get_name() : this._window.title; let name = this._app ? this._app.get_name() : this._window.title;
@@ -82,19 +79,19 @@ var InhibitShortcutsDialog = new Lang.Class({
this._emitResponse(DialogResponse.ALLOW); this._emitResponse(DialogResponse.ALLOW);
}, },
default: true }); default: true });
}, }
_emitResponse(response) { _emitResponse(response) {
this.emit('response', response); this.emit('response', response);
this._dialog.close(); this._dialog.close();
}, }
vfunc_show() { vfunc_show() {
if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1)
this._emitResponse(DialogResponse.ALLOW); this._emitResponse(DialogResponse.ALLOW);
else else
this._dialog.open(); this._dialog.open();
}, }
vfunc_hide() { vfunc_hide() {
this._dialog.close(); this._dialog.close();

View File

@@ -1,7 +1,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
@@ -9,17 +8,17 @@ const KEYBOARD_A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable'; const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable';
const KEY_SLOW_KEYS_ENABLED = 'slowkeys-enable'; const KEY_SLOW_KEYS_ENABLED = 'slowkeys-enable';
var KbdA11yDialog = new Lang.Class({ var KbdA11yDialog = new GObject.registerClass(
Name: 'KbdA11yDialog', class KbdA11yDialog extends GObject.Object {
Extends: GObject.Object,
_init() { _init() {
super._init();
this._a11ySettings = new Gio.Settings({ schema_id: KEYBOARD_A11Y_SCHEMA }); this._a11ySettings = new Gio.Settings({ schema_id: KEYBOARD_A11Y_SCHEMA });
let deviceManager = Clutter.DeviceManager.get_default(); let deviceManager = Clutter.DeviceManager.get_default();
deviceManager.connect('kbd-a11y-flags-changed', deviceManager.connect('kbd-a11y-flags-changed',
this._showKbdA11yDialog.bind(this)); this._showKbdA11yDialog.bind(this));
}, }
_showKbdA11yDialog(deviceManager, newFlags, whatChanged) { _showKbdA11yDialog(deviceManager, newFlags, whatChanged) {
let dialog = new ModalDialog.ModalDialog(); let dialog = new ModalDialog.ModalDialog();

View File

@@ -5,7 +5,7 @@ const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const GObject = imports.gi.GObject;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -55,15 +55,13 @@ const defaultKeysPost = [
[{ width: 1.5, action: 'languageMenu', extraClassName: 'layout-key' }, { width: 1.5, action: 'hide', extraClassName: 'hide-key' }] ], [{ width: 1.5, action: 'languageMenu', extraClassName: 'layout-key' }, { width: 1.5, action: 'hide', extraClassName: 'hide-key' }] ],
]; ];
var KeyContainer = new Lang.Class({ var KeyContainer = new GObject.registerClass(
Name: 'KeyContainer', class KeyContainer extends St.Widget {
Extends: St.Widget,
_init() { _init() {
let gridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.HORIZONTAL, let gridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.HORIZONTAL,
column_homogeneous: true, column_homogeneous: true,
row_homogeneous: true }); row_homogeneous: true });
this.parent({ layout_manager: gridLayout }); super._init({ layout_manager: gridLayout });
this._gridLayout = gridLayout; this._gridLayout = gridLayout;
this._currentRow = 0; this._currentRow = 0;
this._currentCol = 0; this._currentCol = 0;
@@ -71,7 +69,7 @@ var KeyContainer = new Lang.Class({
this._currentRow = null; this._currentRow = null;
this._rows = []; this._rows = [];
}, }
appendRow(length) { appendRow(length) {
this._currentRow++; this._currentRow++;
@@ -81,7 +79,7 @@ var KeyContainer = new Lang.Class({
row.keys = []; row.keys = [];
row.width = 0; row.width = 0;
this._rows.push(row); this._rows.push(row);
}, }
appendKey(key, width = 1, height = 1) { appendKey(key, width = 1, height = 1) {
let keyInfo = { let keyInfo = {
@@ -98,7 +96,7 @@ var KeyContainer = new Lang.Class({
this._currentCol += width; this._currentCol += width;
this._maxCols = Math.max(this._currentCol, this._maxCols); this._maxCols = Math.max(this._currentCol, this._maxCols);
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
if (box.get_width() > 0 && box.get_height() > 0 && this._maxCols > 0) { if (box.get_width() > 0 && box.get_height() > 0 && this._maxCols > 0) {
@@ -122,8 +120,8 @@ var KeyContainer = new Lang.Class({
} }
} }
this.parent (box, flags); super.vfunc_allocate(box, flags);
}, }
layoutButtons() { layoutButtons() {
let nCol = 0, nRow = 0; let nCol = 0, nRow = 0;
@@ -155,33 +153,28 @@ var KeyContainer = new Lang.Class({
} }
}); });
var Suggestions = new Lang.Class({ var Suggestions = class {
Name: 'Suggestions', constructor() {
_init() {
this.actor = new St.BoxLayout({ style_class: 'word-suggestions', this.actor = new St.BoxLayout({ style_class: 'word-suggestions',
vertical: false }); vertical: false });
this.actor.show(); this.actor.show();
}, }
add(word, callback) { add(word, callback) {
let button = new St.Button({ label: word }); let button = new St.Button({ label: word });
button.connect('clicked', callback); button.connect('clicked', callback);
this.actor.add(button); this.actor.add(button);
}, }
clear() { clear() {
this.actor.remove_all_children(); this.actor.remove_all_children();
}, }
}); };
Signals.addSignalMethods(Suggestions.prototype); Signals.addSignalMethods(Suggestions.prototype);
var LanguageSelectionPopup = new Lang.Class({ var LanguageSelectionPopup = class extends PopupMenu.PopupMenu {
Name: 'LanguageSelectionPopup', constructor(actor) {
Extends: PopupMenu.PopupMenu, super(actor, 0.5, St.Side.BOTTOM);
_init(actor) {
this.parent(actor, 0.5, St.Side.BOTTOM);
let inputSourceManager = InputSourceManager.getInputSourceManager(); let inputSourceManager = InputSourceManager.getInputSourceManager();
let inputSources = inputSourceManager.inputSources; let inputSources = inputSourceManager.inputSources;
@@ -195,19 +188,14 @@ var LanguageSelectionPopup = new Lang.Class({
} }
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addAction(_("Region & Language Settings"), this._launchSettings.bind(this)); this.addSettingsAction(_("Region & Language Settings"), 'gnome-region-panel.desktop');
this._capturedEventId = 0; this._capturedEventId = 0;
this._unmapId = actor.connect('notify::mapped', () => { this._unmapId = actor.connect('notify::mapped', () => {
if (!actor.is_mapped()) if (!actor.is_mapped())
this.close(true); this.close(true);
}); });
}, }
_launchSettings() {
Util.spawn(['gnome-control-center', 'region']);
this.close(true);
},
_onCapturedEvent(actor, event) { _onCapturedEvent(actor, event) {
if (event.get_source() == this.actor || if (event.get_source() == this.actor ||
@@ -218,35 +206,33 @@ var LanguageSelectionPopup = new Lang.Class({
this.close(true); this.close(true);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
open(animate) { open(animate) {
this.parent(animate); super.open(animate);
this._capturedEventId = global.stage.connect('captured-event', this._capturedEventId = global.stage.connect('captured-event',
this._onCapturedEvent.bind(this)); this._onCapturedEvent.bind(this));
}, }
close(animate) { close(animate) {
this.parent(animate); super.close(animate);
if (this._capturedEventId != 0) { if (this._capturedEventId != 0) {
global.stage.disconnect(this._capturedEventId); global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0; this._capturedEventId = 0;
} }
}, }
destroy() { destroy() {
if (this._capturedEventId != 0) if (this._capturedEventId != 0)
global.stage.disconnect(this._capturedEventId); global.stage.disconnect(this._capturedEventId);
if (this._unmapId != 0) if (this._unmapId != 0)
this.sourceActor.disconnect(this._unmapId); this.sourceActor.disconnect(this._unmapId);
this.parent(); super.destroy();
}, }
}); };
var Key = new Lang.Class({ var Key = class Key {
Name: 'Key', constructor(key) {
_init(key, extendedKeys) {
this.key = key || ""; this.key = key || "";
this.keyButton = this._makeKey(this.key); this.keyButton = this._makeKey(this.key);
@@ -265,14 +251,14 @@ var Key = new Lang.Class({
this._capturedEventId = 0; this._capturedEventId = 0;
this._unmapId = 0; this._unmapId = 0;
this._longPress = false; this._longPress = false;
}, }
_onDestroy() { _onDestroy() {
if (this._boxPointer) { if (this._boxPointer) {
this._boxPointer.destroy(); this._boxPointer.destroy();
this._boxPointer = null; this._boxPointer = null;
} }
}, }
_ensureExtendedKeysPopup() { _ensureExtendedKeysPopup() {
if (this._extended_keys.length == 0) if (this._extended_keys.length == 0)
@@ -290,12 +276,12 @@ var Key = new Lang.Class({
this._boxPointer.actor.add_style_class_name('keyboard-subkeys'); this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
this._getExtendedKeys(); this._getExtendedKeys();
this.keyButton._extended_keys = this._extended_keyboard; this.keyButton._extended_keys = this._extended_keyboard;
}, }
_getKeyval(key) { _getKeyval(key) {
let unicode = String.charCodeAt(key, 0); let unicode = String.charCodeAt(key, 0);
return Gdk.unicode_to_keyval(unicode); return Gdk.unicode_to_keyval(unicode);
}, }
_press(key) { _press(key) {
if (key != this.key || this._extended_keys.length == 0) { if (key != this.key || this._extended_keys.length == 0) {
@@ -322,7 +308,7 @@ var Key = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
} }
}, }
_release(key) { _release(key) {
if (this._pressTimeoutId != 0) { if (this._pressTimeoutId != 0) {
@@ -336,7 +322,7 @@ var Key = new Lang.Class({
this.emit('released', this._getKeyval(key), key); this.emit('released', this._getKeyval(key), key);
this._hideSubkeys(); this._hideSubkeys();
this._longPress = false; this._longPress = false;
}, }
_onCapturedEvent(actor, event) { _onCapturedEvent(actor, event) {
let type = event.type(); let type = event.type();
@@ -353,7 +339,7 @@ var Key = new Lang.Class({
this._hideSubkeys(); this._hideSubkeys();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_showSubkeys() { _showSubkeys() {
this._boxPointer.open(BoxPointer.PopupAnimation.FULL); this._boxPointer.open(BoxPointer.PopupAnimation.FULL);
@@ -363,7 +349,7 @@ var Key = new Lang.Class({
if (!this.keyButton.is_mapped()) if (!this.keyButton.is_mapped())
this._hideSubkeys(); this._hideSubkeys();
}); });
}, }
_hideSubkeys() { _hideSubkeys() {
if (this._boxPointer) if (this._boxPointer)
@@ -377,7 +363,7 @@ var Key = new Lang.Class({
this._unmapId = 0; this._unmapId = 0;
} }
this._capturedPress = false; this._capturedPress = false;
}, }
_makeKey(key) { _makeKey(key) {
let label = GLib.markup_escape_text(key, -1); let label = GLib.markup_escape_text(key, -1);
@@ -423,7 +409,7 @@ var Key = new Lang.Class({
}); });
return button; return button;
}, }
_getExtendedKeys() { _getExtendedKeys() {
this._extended_keyboard = new St.BoxLayout({ style_class: 'key-container', this._extended_keyboard = new St.BoxLayout({ style_class: 'key-container',
@@ -439,35 +425,33 @@ var Key = new Lang.Class({
key.height = this.keyButton.height; key.height = this.keyButton.height;
} }
this._boxPointer.bin.add_actor(this._extended_keyboard); this._boxPointer.bin.add_actor(this._extended_keyboard);
}, }
get subkeys() { get subkeys() {
return this._boxPointer; return this._boxPointer;
}, }
setWidth(width) { setWidth(width) {
this.keyButton.keyWidth = width; this.keyButton.keyWidth = width;
}, }
setLatched(latched) { setLatched(latched) {
if (latched) if (latched)
this.keyButton.add_style_pseudo_class('latched'); this.keyButton.add_style_pseudo_class('latched');
else else
this.keyButton.remove_style_pseudo_class('latched'); this.keyButton.remove_style_pseudo_class('latched');
}, }
}); };
Signals.addSignalMethods(Key.prototype); Signals.addSignalMethods(Key.prototype);
var KeyboardModel = new Lang.Class({ var KeyboardModel = class {
Name: 'KeyboardModel', constructor(groupName) {
_init(groupName) {
try { try {
this._model = this._loadModel(groupName); this._model = this._loadModel(groupName);
} catch (e) { } catch (e) {
this._model = this._loadModel('us'); this._model = this._loadModel('us');
} }
}, }
_loadModel(groupName) { _loadModel(groupName) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/osk-layouts/%s.json'.format(groupName)); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/osk-layouts/%s.json'.format(groupName));
@@ -476,21 +460,19 @@ var KeyboardModel = new Lang.Class({
contents = imports.byteArray.toString(contents); contents = imports.byteArray.toString(contents);
return JSON.parse(contents); return JSON.parse(contents);
}, }
getLevels() { getLevels() {
return this._model.levels; return this._model.levels;
}, }
getKeysForLevel(levelName) { getKeysForLevel(levelName) {
return this._model.levels.find(level => level == levelName); return this._model.levels.find(level => level == levelName);
} }
}); };
var FocusTracker = new Lang.Class({ var FocusTracker = class {
Name: 'FocusTracker', constructor() {
_init() {
this._currentWindow = null; this._currentWindow = null;
this._rect = null; this._rect = null;
@@ -525,15 +507,15 @@ var FocusTracker = new Lang.Class({
this._ibusManager.connect('focus-out', () => { this._ibusManager.connect('focus-out', () => {
this.emit('focus-changed', false); this.emit('focus-changed', false);
}); });
}, }
get currentWindow() { get currentWindow() {
return this._currentWindow; return this._currentWindow;
}, }
_setCurrentWindow(window) { _setCurrentWindow(window) {
this._currentWindow = window; this._currentWindow = window;
}, }
_setCurrentRect(rect) { _setCurrentRect(rect) {
if (this._currentWindow) { if (this._currentWindow) {
@@ -551,7 +533,7 @@ var FocusTracker = new Lang.Class({
this._rect = rect; this._rect = rect;
this.emit('position-changed'); this.emit('position-changed');
}, }
getCurrentRect() { getCurrentRect() {
let rect = { x: this._rect.x, y: this._rect.y, let rect = { x: this._rect.x, y: this._rect.y,
@@ -565,13 +547,11 @@ var FocusTracker = new Lang.Class({
return rect; return rect;
} }
}); };
Signals.addSignalMethods(FocusTracker.prototype); Signals.addSignalMethods(FocusTracker.prototype);
var Keyboard = new Lang.Class({ var Keyboard = class Keyboard {
Name: 'Keyboard', constructor() {
_init() {
this.actor = null; this.actor = null;
this._focusInExtendedKeys = false; this._focusInExtendedKeys = false;
@@ -629,16 +609,16 @@ var Keyboard = new Lang.Class({
this._keyboardRestingId = 0; this._keyboardRestingId = 0;
Main.layoutManager.connect('monitors-changed', this._relayout.bind(this)); Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
}, }
get visible() { get visible() {
return this._keyboardVisible; return this._keyboardVisible;
}, }
_onFocusPositionChanged(focusTracker) { _onFocusPositionChanged(focusTracker) {
let rect = focusTracker.getCurrentRect(); let rect = focusTracker.getCurrentRect();
this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height); this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height);
}, }
_lastDeviceIsTouchscreen() { _lastDeviceIsTouchscreen() {
if (!this._lastDeviceId) if (!this._lastDeviceId)
@@ -651,7 +631,7 @@ var Keyboard = new Lang.Class({
return false; return false;
return device.get_device_type() == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE; return device.get_device_type() == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE;
}, }
_syncEnabled() { _syncEnabled() {
let wasEnabled = this._enabled; let wasEnabled = this._enabled;
@@ -667,7 +647,7 @@ var Keyboard = new Lang.Class({
if (!this._enabled && wasEnabled) if (!this._enabled && wasEnabled)
Main.layoutManager.hideKeyboard(true); Main.layoutManager.hideKeyboard(true);
}, }
_destroyKeyboard() { _destroyKeyboard() {
if (this._keyboardNotifyId) if (this._keyboardNotifyId)
@@ -686,7 +666,7 @@ var Keyboard = new Lang.Class({
this._languagePopup.destroy(); this._languagePopup.destroy();
this._languagePopup = null; this._languagePopup = null;
} }
}, }
_setupKeyboard() { _setupKeyboard() {
this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true }); this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
@@ -720,7 +700,7 @@ var Keyboard = new Lang.Class({
this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this)); this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
this._relayout(); this._relayout();
}, }
_onKeyFocusChanged() { _onKeyFocusChanged() {
let focus = global.stage.key_focus; let focus = global.stage.key_focus;
@@ -744,7 +724,7 @@ var Keyboard = new Lang.Class({
}); });
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show'); GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
} }
}, }
_createLayersForGroup(groupName) { _createLayersForGroup(groupName) {
let keyboardModel = new KeyboardModel(groupName); let keyboardModel = new KeyboardModel(groupName);
@@ -769,12 +749,12 @@ var Keyboard = new Lang.Class({
layout.hide(); layout.hide();
} }
return layers; return layers;
}, }
_ensureKeysForGroup(group) { _ensureKeysForGroup(group) {
if (!this._groups[group]) if (!this._groups[group])
this._groups[group] = this._createLayersForGroup(group); this._groups[group] = this._createLayersForGroup(group);
}, }
_addRowKeys(keys, layout) { _addRowKeys(keys, layout) {
for (let i = 0; i < keys.length; ++i) { for (let i = 0; i < keys.length; ++i) {
@@ -807,7 +787,7 @@ var Keyboard = new Lang.Class({
layout.appendKey(button.actor, button.keyButton.keyWidth); layout.appendKey(button.actor, button.keyButton.keyWidth);
} }
}, }
_popupLanguageMenu(keyActor) { _popupLanguageMenu(keyActor) {
if (this._languagePopup) if (this._languagePopup)
@@ -816,7 +796,7 @@ var Keyboard = new Lang.Class({
this._languagePopup = new LanguageSelectionPopup(keyActor); this._languagePopup = new LanguageSelectionPopup(keyActor);
Main.layoutManager.addChrome(this._languagePopup.actor); Main.layoutManager.addChrome(this._languagePopup.actor);
this._languagePopup.open(true); this._languagePopup.open(true);
}, }
_loadDefaultKeys(keys, layout, numLevels, numKeys) { _loadDefaultKeys(keys, layout, numLevels, numKeys) {
let extraButton; let extraButton;
@@ -881,14 +861,14 @@ var Keyboard = new Lang.Class({
layout.appendKey(extraButton.actor, extraButton.keyButton.keyWidth); layout.appendKey(extraButton.actor, extraButton.keyButton.keyWidth);
} }
}, }
_setCurrentLevelLatched(layout, latched) { _setCurrentLevelLatched(layout, latched) {
for (let i = 0; layout.shiftKeys[i]; i++) { for (let i = 0; layout.shiftKeys[i]; i++) {
let key = layout.shiftKeys[i]; let key = layout.shiftKeys[i];
key.setLatched(latched); key.setLatched(latched);
} }
}, }
_getDefaultKeysForRow(row, numRows, level) { _getDefaultKeysForRow(row, numRows, level) {
let pre, post; let pre, post;
@@ -906,7 +886,7 @@ var Keyboard = new Lang.Class({
} else { } else {
return [null, null]; return [null, null];
} }
}, }
_mergeRowKeys(layout, pre, row, post, numLevels) { _mergeRowKeys(layout, pre, row, post, numLevels) {
if (pre != null) if (pre != null)
@@ -916,7 +896,7 @@ var Keyboard = new Lang.Class({
if (post != null) if (post != null)
this._loadDefaultKeys(post, layout, numLevels, row.length); this._loadDefaultKeys(post, layout, numLevels, row.length);
}, }
_loadRows(model, level, numLevels, layout) { _loadRows(model, level, numLevels, layout) {
let rows = model.rows; let rows = model.rows;
@@ -925,7 +905,7 @@ var Keyboard = new Lang.Class({
let [pre, post] = this._getDefaultKeysForRow(i, rows.length, level); let [pre, post] = this._getDefaultKeysForRow(i, rows.length, level);
this._mergeRowKeys (layout, pre, rows[i], post, numLevels); this._mergeRowKeys (layout, pre, rows[i], post, numLevels);
} }
}, }
_getGridSlots() { _getGridSlots() {
let numOfHorizSlots = 0, numOfVertSlots; let numOfHorizSlots = 0, numOfVertSlots;
@@ -940,7 +920,7 @@ var Keyboard = new Lang.Class({
} }
return [numOfHorizSlots, numOfVertSlots]; return [numOfHorizSlots, numOfVertSlots];
}, }
_relayout() { _relayout() {
let monitor = Main.layoutManager.keyboardMonitor; let monitor = Main.layoutManager.keyboardMonitor;
@@ -951,17 +931,17 @@ var Keyboard = new Lang.Class({
let maxHeight = monitor.height / 3; let maxHeight = monitor.height / 3;
this.actor.width = monitor.width; this.actor.width = monitor.width;
this.actor.height = maxHeight; this.actor.height = maxHeight;
}, }
_onGroupChanged() { _onGroupChanged() {
this._ensureKeysForGroup(this._keyboardController.getCurrentGroup()); this._ensureKeysForGroup(this._keyboardController.getCurrentGroup());
this._setActiveLayer(0); this._setActiveLayer(0);
}, }
_onKeyboardGroupsChanged(keyboard) { _onKeyboardGroupsChanged(keyboard) {
this._groups = []; this._groups = [];
this._onGroupChanged(); this._onGroupChanged();
}, }
_onKeyboardStateChanged(controller, state) { _onKeyboardStateChanged(controller, state) {
let enabled; let enabled;
@@ -978,7 +958,7 @@ var Keyboard = new Lang.Class({
this.show(Main.layoutManager.focusIndex); this.show(Main.layoutManager.focusIndex);
else else
this.hide(); this.hide();
}, }
_setActiveLayer(activeLevel) { _setActiveLayer(activeLevel) {
let activeGroupName = this._keyboardController.getCurrentGroup(); let activeGroupName = this._keyboardController.getCurrentGroup();
@@ -991,20 +971,20 @@ var Keyboard = new Lang.Class({
this._current_page = layers[activeLevel]; this._current_page = layers[activeLevel];
this._current_page.show(); this._current_page.show();
}, }
shouldTakeEvent(event) { shouldTakeEvent(event) {
let actor = event.get_source(); let actor = event.get_source();
return Main.layoutManager.keyboardBox.contains(actor) || return Main.layoutManager.keyboardBox.contains(actor) ||
!!actor._extended_keys || !!actor.extended_key; !!actor._extended_keys || !!actor.extended_key;
}, }
_clearKeyboardRestTimer() { _clearKeyboardRestTimer() {
if (!this._keyboardRestingId) if (!this._keyboardRestingId)
return; return;
GLib.source_remove(this._keyboardRestingId); GLib.source_remove(this._keyboardRestingId);
this._keyboardRestingId = 0; this._keyboardRestingId = 0;
}, }
show(monitor) { show(monitor) {
if (!this._enabled) if (!this._enabled)
@@ -1030,7 +1010,7 @@ var Keyboard = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer'); GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
}, }
_show(monitor) { _show(monitor) {
if (!this._keyboardRequested) if (!this._keyboardRequested)
@@ -1044,7 +1024,7 @@ var Keyboard = new Lang.Class({
this._setAnimationWindow(this._delayedAnimFocusWindow); this._setAnimationWindow(this._delayedAnimFocusWindow);
this._delayedAnimFocusWindow = null; this._delayedAnimFocusWindow = null;
} }
}, }
hide() { hide() {
if (!this._enabled) if (!this._enabled)
@@ -1065,7 +1045,7 @@ var Keyboard = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer'); GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
}, }
_hide() { _hide() {
if (this._keyboardRequested) if (this._keyboardRequested)
@@ -1073,7 +1053,7 @@ var Keyboard = new Lang.Class({
Main.layoutManager.hideKeyboard(); Main.layoutManager.hideKeyboard();
this.setCursorLocation(null); this.setCursorLocation(null);
}, }
_hideSubkeys() { _hideSubkeys() {
if (this._subkeysBoxPointer) { if (this._subkeysBoxPointer) {
@@ -1085,26 +1065,26 @@ var Keyboard = new Lang.Class({
this._capturedEventId = 0; this._capturedEventId = 0;
} }
this._capturedPress = false; this._capturedPress = false;
}, }
resetSuggestions() { resetSuggestions() {
if (this._suggestions) if (this._suggestions)
this._suggestions.clear(); this._suggestions.clear();
}, }
addSuggestion(text, callback) { addSuggestion(text, callback) {
if (!this._suggestions) if (!this._suggestions)
return; return;
this._suggestions.add(text, callback); this._suggestions.add(text, callback);
this._suggestions.actor.show(); this._suggestions.actor.show();
}, }
_clearShowIdle() { _clearShowIdle() {
if (!this._showIdleId) if (!this._showIdleId)
return; return;
GLib.source_remove(this._showIdleId); GLib.source_remove(this._showIdleId);
this._showIdleId = 0; this._showIdleId = 0;
}, }
_windowSlideAnimationComplete(window, delta) { _windowSlideAnimationComplete(window, delta) {
// Synchronize window and actor positions again. // Synchronize window and actor positions again.
@@ -1112,7 +1092,7 @@ var Keyboard = new Lang.Class({
let frameRect = window.get_frame_rect(); let frameRect = window.get_frame_rect();
frameRect.y += delta; frameRect.y += delta;
window.move_frame(true, frameRect.x, frameRect.y); window.move_frame(true, frameRect.x, frameRect.y);
}, }
_animateWindow(window, show) { _animateWindow(window, show) {
let windowActor = window.get_compositor_private(); let windowActor = window.get_compositor_private();
@@ -1135,7 +1115,7 @@ var Keyboard = new Lang.Class({
onComplete: this._windowSlideAnimationComplete, onComplete: this._windowSlideAnimationComplete,
onCompleteParams: [window, deltaY] }); onCompleteParams: [window, deltaY] });
} }
}, }
_setAnimationWindow(window) { _setAnimationWindow(window) {
if (this._animFocusedWindow == window) if (this._animFocusedWindow == window)
@@ -1147,7 +1127,7 @@ var Keyboard = new Lang.Class({
this._animateWindow(window, true); this._animateWindow(window, true);
this._animFocusedWindow = window; this._animFocusedWindow = window;
}, }
setCursorLocation(window, x, y , w, h) { setCursorLocation(window, x, y , w, h) {
let monitor = Main.layoutManager.keyboardMonitor; let monitor = Main.layoutManager.keyboardMonitor;
@@ -1170,14 +1150,11 @@ var Keyboard = new Lang.Class({
} }
this._oskFocusWindow = window; this._oskFocusWindow = window;
}, }
}); };
var KeyboardController = new Lang.Class({ var KeyboardController = class {
Name: 'KeyboardController', constructor() {
_init() {
this.parent();
let deviceManager = Clutter.DeviceManager.get_default(); let deviceManager = Clutter.DeviceManager.get_default();
this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
@@ -1195,24 +1172,24 @@ var KeyboardController = new Lang.Class({
Main.inputMethod.connect('input-panel-state', (o, state) => { Main.inputMethod.connect('input-panel-state', (o, state) => {
this.emit('panel-state', state); this.emit('panel-state', state);
}); });
}, }
_onSourcesModified() { _onSourcesModified() {
this.emit('groups-changed'); this.emit('groups-changed');
}, }
_onSourceChanged(inputSourceManager, oldSource) { _onSourceChanged(inputSourceManager, oldSource) {
let source = inputSourceManager.currentSource; let source = inputSourceManager.currentSource;
this._currentSource = source; this._currentSource = source;
this.emit('active-group', source.id); this.emit('active-group', source.id);
}, }
_onContentPurposeHintsChanged(method) { _onContentPurposeHintsChanged(method) {
let hints = method.content_hints; let hints = method.content_hints;
let purpose = method.content_purpose; let purpose = method.content_purpose;
// XXX: hook numeric/emoji/etc special keyboards // XXX: hook numeric/emoji/etc special keyboards
}, }
getGroups() { getGroups() {
let inputSources = this._inputSourceManager.inputSources; let inputSources = this._inputSourceManager.inputSources;
@@ -1224,11 +1201,11 @@ var KeyboardController = new Lang.Class({
} }
return groups; return groups;
}, }
getCurrentGroup() { getCurrentGroup() {
return this._currentSource.xkbId; return this._currentSource.xkbId;
}, }
commitString(string, fromKey) { commitString(string, fromKey) {
if (string == null) if (string == null)
@@ -1239,16 +1216,16 @@ var KeyboardController = new Lang.Class({
Main.inputMethod.commit(string); Main.inputMethod.commit(string);
return true; return true;
}, }
keyvalPress(keyval) { keyvalPress(keyval) {
this._virtualDevice.notify_keyval(Clutter.get_current_event_time(), this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
keyval, Clutter.KeyState.PRESSED); keyval, Clutter.KeyState.PRESSED);
}, }
keyvalRelease(keyval) { keyvalRelease(keyval) {
this._virtualDevice.notify_keyval(Clutter.get_current_event_time(), this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
keyval, Clutter.KeyState.RELEASED); keyval, Clutter.KeyState.RELEASED);
}, }
}); };
Signals.addSignalMethods(KeyboardController.prototype); Signals.addSignalMethods(KeyboardController.prototype);

View File

@@ -3,7 +3,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -36,9 +35,7 @@ function isPopupMetaWindow(actor) {
} }
} }
var MonitorConstraint = new Lang.Class({ var MonitorConstraint = GObject.registerClass({
Name: 'MonitorConstraint',
Extends: Clutter.Constraint,
Properties: {'primary': GObject.ParamSpec.boolean('primary', Properties: {'primary': GObject.ParamSpec.boolean('primary',
'Primary', 'Track primary monitor', 'Primary', 'Track primary monitor',
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
@@ -51,18 +48,18 @@ var MonitorConstraint = new Lang.Class({
'Work-area', 'Track monitor\'s work-area', 'Work-area', 'Track monitor\'s work-area',
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
false)}, false)},
}, class MonitorConstraint extends Clutter.Constraint {
_init(props) { _init(props) {
this._primary = false; this._primary = false;
this._index = -1; this._index = -1;
this._workArea = false; this._workArea = false;
this.parent(props); super._init(props);
}, }
get primary() { get primary() {
return this._primary; return this._primary;
}, }
set primary(v) { set primary(v) {
if (v) if (v)
@@ -71,11 +68,11 @@ var MonitorConstraint = new Lang.Class({
if (this.actor) if (this.actor)
this.actor.queue_relayout(); this.actor.queue_relayout();
this.notify('primary'); this.notify('primary');
}, }
get index() { get index() {
return this._index; return this._index;
}, }
set index(v) { set index(v) {
this._primary = false; this._primary = false;
@@ -83,11 +80,11 @@ var MonitorConstraint = new Lang.Class({
if (this.actor) if (this.actor)
this.actor.queue_relayout(); this.actor.queue_relayout();
this.notify('index'); this.notify('index');
}, }
get work_area() { get work_area() {
return this._workArea; return this._workArea;
}, }
set work_area(v) { set work_area(v) {
if (v == this._workArea) if (v == this._workArea)
@@ -96,7 +93,7 @@ var MonitorConstraint = new Lang.Class({
if (this.actor) if (this.actor)
this.actor.queue_relayout(); this.actor.queue_relayout();
this.notify('work-area'); this.notify('work-area');
}, }
vfunc_set_actor(actor) { vfunc_set_actor(actor) {
if (actor) { if (actor) {
@@ -124,8 +121,8 @@ var MonitorConstraint = new Lang.Class({
this._workareasChangedId = 0; this._workareasChangedId = 0;
} }
this.parent(actor); super.vfunc_set_actor(actor);
}, }
vfunc_update_allocation(actor, actorBox) { vfunc_update_allocation(actor, actorBox) {
if (!this._primary && this._index < 0) if (!this._primary && this._index < 0)
@@ -153,21 +150,19 @@ var MonitorConstraint = new Lang.Class({
} }
}); });
var Monitor = new Lang.Class({ var Monitor = class Monitor {
Name: 'Monitor', constructor(index, geometry) {
_init(index, geometry) {
this.index = index; this.index = index;
this.x = geometry.x; this.x = geometry.x;
this.y = geometry.y; this.y = geometry.y;
this.width = geometry.width; this.width = geometry.width;
this.height = geometry.height; this.height = geometry.height;
}, }
get inFullscreen() { get inFullscreen() {
return global.display.get_monitor_in_fullscreen(this.index); return global.display.get_monitor_in_fullscreen(this.index);
} }
}) };
const defaultParams = { const defaultParams = {
trackFullscreen: false, trackFullscreen: false,
@@ -175,17 +170,15 @@ const defaultParams = {
affectsInputRegion: true affectsInputRegion: true
}; };
var LayoutManager = new Lang.Class({ var LayoutManager = GObject.registerClass({
Name: 'LayoutManager',
Extends: GObject.Object,
Signals: { 'hot-corners-changed': {}, Signals: { 'hot-corners-changed': {},
'startup-complete': {}, 'startup-complete': {},
'startup-prepared': {}, 'startup-prepared': {},
'monitors-changed': {}, 'monitors-changed': {},
'keyboard-visible-changed': { param_types: [GObject.TYPE_BOOLEAN] } }, 'keyboard-visible-changed': { param_types: [GObject.TYPE_BOOLEAN] } },
}, class LayoutManager extends GObject.Object {
_init() { _init() {
this.parent(); super._init();
this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL); this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL);
this.monitors = []; this.monitors = [];
@@ -296,33 +289,33 @@ var LayoutManager = new Lang.Class({
Meta.Background.refresh_all(); Meta.Background.refresh_all();
}); });
} }
}, }
// This is called by Main after everything else is constructed // This is called by Main after everything else is constructed
init() { init() {
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
this._loadBackground(); this._loadBackground();
}, }
showOverview() { showOverview() {
this.overviewGroup.show(); this.overviewGroup.show();
this._inOverview = true; this._inOverview = true;
this._updateVisibility(); this._updateVisibility();
}, }
hideOverview() { hideOverview() {
this.overviewGroup.hide(); this.overviewGroup.hide();
this._inOverview = false; this._inOverview = false;
this._updateVisibility(); this._updateVisibility();
}, }
_sessionUpdated() { _sessionUpdated() {
this._updateVisibility(); this._updateVisibility();
this._queueUpdateRegions(); this._queueUpdateRegions();
}, }
_updateMonitors() { _updateMonitors() {
let display = global.display; let display = global.display;
@@ -360,7 +353,7 @@ var LayoutManager = new Lang.Class({
this.primaryMonitor = null; this.primaryMonitor = null;
this.bottomMonitor = null; this.bottomMonitor = null;
} }
}, }
_updateHotCorners() { _updateHotCorners() {
// destroy old hot corners // destroy old hot corners
@@ -419,11 +412,11 @@ var LayoutManager = new Lang.Class({
} }
this.emit('hot-corners-changed'); this.emit('hot-corners-changed');
}, }
_addBackgroundMenu(bgManager) { _addBackgroundMenu(bgManager) {
BackgroundMenu.addBackgroundMenu(bgManager.backgroundActor, this); BackgroundMenu.addBackgroundMenu(bgManager.backgroundActor, this);
}, }
_createBackgroundManager(monitorIndex) { _createBackgroundManager(monitorIndex) {
let bgManager = new Background.BackgroundManager({ container: this._backgroundGroup, let bgManager = new Background.BackgroundManager({ container: this._backgroundGroup,
@@ -434,7 +427,7 @@ var LayoutManager = new Lang.Class({
this._addBackgroundMenu(bgManager); this._addBackgroundMenu(bgManager);
return bgManager; return bgManager;
}, }
_showSecondaryBackgrounds() { _showSecondaryBackgrounds() {
for (let i = 0; i < this.monitors.length; i++) { for (let i = 0; i < this.monitors.length; i++) {
@@ -448,7 +441,7 @@ var LayoutManager = new Lang.Class({
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
} }
} }
}, }
_updateBackgrounds() { _updateBackgrounds() {
let i; let i;
@@ -467,13 +460,13 @@ var LayoutManager = new Lang.Class({
if (i != this.primaryIndex && this._startingUp) if (i != this.primaryIndex && this._startingUp)
bgManager.backgroundActor.hide(); bgManager.backgroundActor.hide();
} }
}, }
_updateKeyboardBox() { _updateKeyboardBox() {
this.keyboardBox.set_position(this.keyboardMonitor.x, this.keyboardBox.set_position(this.keyboardMonitor.x,
this.keyboardMonitor.y + this.keyboardMonitor.height); this.keyboardMonitor.y + this.keyboardMonitor.height);
this.keyboardBox.set_size(this.keyboardMonitor.width, -1); this.keyboardBox.set_size(this.keyboardMonitor.width, -1);
}, }
_updateBoxes() { _updateBoxes() {
this.screenShieldGroup.set_position(0, 0); this.screenShieldGroup.set_position(0, 0);
@@ -486,7 +479,7 @@ var LayoutManager = new Lang.Class({
this.panelBox.set_size(this.primaryMonitor.width, -1); this.panelBox.set_size(this.primaryMonitor.width, -1);
this.keyboardIndex = this.primaryIndex; this.keyboardIndex = this.primaryIndex;
}, }
_panelBoxChanged() { _panelBoxChanged() {
this._updatePanelBarrier(); this._updatePanelBarrier();
@@ -496,7 +489,7 @@ var LayoutManager = new Lang.Class({
if (corner) if (corner)
corner.setBarrierSize(size); corner.setBarrierSize(size);
}); });
}, }
_updatePanelBarrier() { _updatePanelBarrier() {
if (this._rightPanelBarrier) { if (this._rightPanelBarrier) {
@@ -515,7 +508,7 @@ var LayoutManager = new Lang.Class({
x2: primary.x + primary.width, y2: primary.y + this.panelBox.height, x2: primary.x + primary.width, y2: primary.y + this.panelBox.height,
directions: Meta.BarrierDirection.NEGATIVE_X }); directions: Meta.BarrierDirection.NEGATIVE_X });
} }
}, }
_monitorsChanged() { _monitorsChanged() {
this._updateMonitors(); this._updateMonitors();
@@ -527,7 +520,7 @@ var LayoutManager = new Lang.Class({
this._queueUpdateRegions(); this._queueUpdateRegions();
this.emit('monitors-changed'); this.emit('monitors-changed');
}, }
_isAboveOrBelowPrimary(monitor) { _isAboveOrBelowPrimary(monitor) {
let primary = this.monitors[this.primaryIndex]; let primary = this.monitors[this.primaryIndex];
@@ -541,16 +534,16 @@ var LayoutManager = new Lang.Class({
return true; return true;
return false; return false;
}, }
get currentMonitor() { get currentMonitor() {
let index = global.display.get_current_monitor(); let index = global.display.get_current_monitor();
return this.monitors[index]; return this.monitors[index];
}, }
get keyboardMonitor() { get keyboardMonitor() {
return this.monitors[this.keyboardIndex]; return this.monitors[this.keyboardIndex];
}, }
get focusIndex() { get focusIndex() {
let i = Main.layoutManager.primaryIndex; let i = Main.layoutManager.primaryIndex;
@@ -560,22 +553,22 @@ var LayoutManager = new Lang.Class({
else if (global.display.focus_window != null) else if (global.display.focus_window != null)
i = global.display.focus_window.get_monitor(); i = global.display.focus_window.get_monitor();
return i; return i;
}, }
get focusMonitor() { get focusMonitor() {
if (this.focusIndex < 0) if (this.focusIndex < 0)
return null; return null;
return this.monitors[this.focusIndex]; return this.monitors[this.focusIndex];
}, }
set keyboardIndex(v) { set keyboardIndex(v) {
this._keyboardIndex = v; this._keyboardIndex = v;
this._updateKeyboardBox(); this._updateKeyboardBox();
}, }
get keyboardIndex() { get keyboardIndex() {
return this._keyboardIndex; return this._keyboardIndex;
}, }
_loadBackground() { _loadBackground() {
if (!this.primaryMonitor) { if (!this.primaryMonitor) {
@@ -598,7 +591,7 @@ var LayoutManager = new Lang.Class({
this._prepareStartupAnimation(); this._prepareStartupAnimation();
}); });
}, }
// Startup Animations // Startup Animations
// //
@@ -664,7 +657,7 @@ var LayoutManager = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(id, '[gnome-shell] this._startupAnimation'); GLib.Source.set_name_by_id(id, '[gnome-shell] this._startupAnimation');
}, }
_startupAnimation() { _startupAnimation() {
if (Meta.is_restart()) if (Meta.is_restart())
@@ -673,7 +666,7 @@ var LayoutManager = new Lang.Class({
this._startupAnimationGreeter(); this._startupAnimationGreeter();
else else
this._startupAnimationSession(); this._startupAnimationSession();
}, }
_startupAnimationGreeter() { _startupAnimationGreeter() {
Tweener.addTween(this.panelBox, Tweener.addTween(this.panelBox,
@@ -682,7 +675,7 @@ var LayoutManager = new Lang.Class({
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: this._startupAnimationComplete, onComplete: this._startupAnimationComplete,
onCompleteScope: this }); onCompleteScope: this });
}, }
_startupAnimationSession() { _startupAnimationSession() {
Tweener.addTween(this.uiGroup, Tweener.addTween(this.uiGroup,
@@ -693,7 +686,7 @@ var LayoutManager = new Lang.Class({
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: this._startupAnimationComplete, onComplete: this._startupAnimationComplete,
onCompleteScope: this }); onCompleteScope: this });
}, }
_startupAnimationComplete() { _startupAnimationComplete() {
this._coverPane.destroy(); this._coverPane.destroy();
@@ -714,7 +707,7 @@ var LayoutManager = new Lang.Class({
this._queueUpdateRegions(); this._queueUpdateRegions();
this.emit('startup-complete'); this.emit('startup-complete');
}, }
showKeyboard() { showKeyboard() {
this.keyboardBox.show(); this.keyboardBox.show();
@@ -727,7 +720,7 @@ var LayoutManager = new Lang.Class({
onCompleteScope: this onCompleteScope: this
}); });
this.emit('keyboard-visible-changed', true); this.emit('keyboard-visible-changed', true);
}, }
_showKeyboardComplete() { _showKeyboardComplete() {
// Poke Chrome to update the input shape; it doesn't notice // Poke Chrome to update the input shape; it doesn't notice
@@ -737,7 +730,7 @@ var LayoutManager = new Lang.Class({
this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', () => { this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', () => {
this.keyboardBox.anchor_y = this.keyboardBox.height; this.keyboardBox.anchor_y = this.keyboardBox.height;
}); });
}, }
hideKeyboard(immediate) { hideKeyboard(immediate) {
if (this._keyboardHeightNotifyId) { if (this._keyboardHeightNotifyId) {
@@ -754,12 +747,12 @@ var LayoutManager = new Lang.Class({
}); });
this.emit('keyboard-visible-changed', false); this.emit('keyboard-visible-changed', false);
}, }
_hideKeyboardComplete() { _hideKeyboardComplete() {
this.keyboardBox.hide(); this.keyboardBox.hide();
this._updateRegions(); this._updateRegions();
}, }
// setDummyCursorGeometry: // setDummyCursorGeometry:
// //
@@ -774,7 +767,7 @@ var LayoutManager = new Lang.Class({
setDummyCursorGeometry(x, y, w, h) { setDummyCursorGeometry(x, y, w, h) {
this.dummyCursor.set_position(Math.round(x), Math.round(y)); this.dummyCursor.set_position(Math.round(x), Math.round(y));
this.dummyCursor.set_size(Math.round(w), Math.round(h)); this.dummyCursor.set_size(Math.round(w), Math.round(h));
}, }
// addChrome: // addChrome:
// @actor: an actor to add to the chrome // @actor: an actor to add to the chrome
@@ -800,7 +793,7 @@ var LayoutManager = new Lang.Class({
if (this.uiGroup.contains(global.top_window_group)) if (this.uiGroup.contains(global.top_window_group))
this.uiGroup.set_child_below_sibling(actor, global.top_window_group); this.uiGroup.set_child_below_sibling(actor, global.top_window_group);
this._trackActor(actor, params); this._trackActor(actor, params);
}, }
// trackChrome: // trackChrome:
// @actor: a descendant of the chrome to begin tracking // @actor: a descendant of the chrome to begin tracking
@@ -832,7 +825,7 @@ var LayoutManager = new Lang.Class({
} }
this._trackActor(actor, params); this._trackActor(actor, params);
}, }
// untrackChrome: // untrackChrome:
// @actor: an actor previously tracked via trackChrome() // @actor: an actor previously tracked via trackChrome()
@@ -840,7 +833,7 @@ var LayoutManager = new Lang.Class({
// Undoes the effect of trackChrome() // Undoes the effect of trackChrome()
untrackChrome(actor) { untrackChrome(actor) {
this._untrackActor(actor); this._untrackActor(actor);
}, }
// removeChrome: // removeChrome:
// @actor: a chrome actor // @actor: a chrome actor
@@ -849,7 +842,7 @@ var LayoutManager = new Lang.Class({
removeChrome(actor) { removeChrome(actor) {
this.uiGroup.remove_actor(actor); this.uiGroup.remove_actor(actor);
this._untrackActor(actor); this._untrackActor(actor);
}, }
_findActor(actor) { _findActor(actor) {
for (let i = 0; i < this._trackedActors.length; i++) { for (let i = 0; i < this._trackedActors.length; i++) {
@@ -858,7 +851,7 @@ var LayoutManager = new Lang.Class({
return i; return i;
} }
return -1; return -1;
}, }
_trackActor(actor, params) { _trackActor(actor, params) {
if (this._findActor(actor) != -1) if (this._findActor(actor) != -1)
@@ -878,7 +871,7 @@ var LayoutManager = new Lang.Class({
this._trackedActors.push(actorData); this._trackedActors.push(actorData);
this._updateActorVisibility(actorData); this._updateActorVisibility(actorData);
this._queueUpdateRegions(); this._queueUpdateRegions();
}, }
_untrackActor(actor) { _untrackActor(actor) {
let i = this._findActor(actor); let i = this._findActor(actor);
@@ -893,7 +886,7 @@ var LayoutManager = new Lang.Class({
actor.disconnect(actorData.destroyId); actor.disconnect(actorData.destroyId);
this._queueUpdateRegions(); this._queueUpdateRegions();
}, }
_updateActorVisibility(actorData) { _updateActorVisibility(actorData) {
if (!actorData.trackFullscreen) if (!actorData.trackFullscreen)
@@ -903,7 +896,7 @@ var LayoutManager = new Lang.Class({
actorData.actor.visible = !(global.window_group.visible && actorData.actor.visible = !(global.window_group.visible &&
monitor && monitor &&
monitor.inFullscreen); monitor.inFullscreen);
}, }
_updateVisibility() { _updateVisibility() {
let windowsVisible = Main.sessionMode.hasWindows && !this._inOverview; let windowsVisible = Main.sessionMode.hasWindows && !this._inOverview;
@@ -912,7 +905,7 @@ var LayoutManager = new Lang.Class({
global.top_window_group.visible = windowsVisible; global.top_window_group.visible = windowsVisible;
this._trackedActors.forEach(this._updateActorVisibility.bind(this)); this._trackedActors.forEach(this._updateActorVisibility.bind(this));
}, }
getWorkAreaForMonitor(monitorIndex) { getWorkAreaForMonitor(monitorIndex) {
// Assume that all workspaces will have the same // Assume that all workspaces will have the same
@@ -920,7 +913,7 @@ var LayoutManager = new Lang.Class({
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
let ws = workspaceManager.get_workspace_by_index(0); let ws = workspaceManager.get_workspace_by_index(0);
return ws.get_work_area_for_monitor(monitorIndex); return ws.get_work_area_for_monitor(monitorIndex);
}, }
// This call guarantees that we return some monitor to simplify usage of it // This call guarantees that we return some monitor to simplify usage of it
// In practice all tracked actors should be visible on some monitor anyway // In practice all tracked actors should be visible on some monitor anyway
@@ -929,14 +922,14 @@ var LayoutManager = new Lang.Class({
let [w, h] = actor.get_transformed_size(); let [w, h] = actor.get_transformed_size();
let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h }); let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h });
return global.display.get_monitor_index_for_rect(rect); return global.display.get_monitor_index_for_rect(rect);
}, }
findMonitorForActor(actor) { findMonitorForActor(actor) {
let index = this.findIndexForActor(actor); let index = this.findIndexForActor(actor);
if (index >= 0 && index < this.monitors.length) if (index >= 0 && index < this.monitors.length)
return this.monitors[index]; return this.monitors[index];
return null; return null;
}, }
_queueUpdateRegions() { _queueUpdateRegions() {
if (this._startingUp) if (this._startingUp)
@@ -945,19 +938,19 @@ var LayoutManager = new Lang.Class({
if (!this._updateRegionIdle) if (!this._updateRegionIdle)
this._updateRegionIdle = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, this._updateRegionIdle = Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
this._updateRegions.bind(this)); this._updateRegions.bind(this));
}, }
_getWindowActorsForWorkspace(workspace) { _getWindowActorsForWorkspace(workspace) {
return global.get_window_actors().filter(actor => { return global.get_window_actors().filter(actor => {
let win = actor.meta_window; let win = actor.meta_window;
return win.located_on_workspace(workspace); return win.located_on_workspace(workspace);
}); });
}, }
_updateFullscreen() { _updateFullscreen() {
this._updateVisibility(); this._updateVisibility();
this._queueUpdateRegions(); this._queueUpdateRegions();
}, }
_windowsRestacked() { _windowsRestacked() {
let changed = false; let changed = false;
@@ -969,7 +962,7 @@ var LayoutManager = new Lang.Class({
this._updateVisibility(); this._updateVisibility();
this._queueUpdateRegions(); this._queueUpdateRegions();
} }
}, }
_updateRegions() { _updateRegions() {
if (this._updateRegionIdle) { if (this._updateRegionIdle) {
@@ -1069,13 +1062,13 @@ var LayoutManager = new Lang.Class({
} }
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
modalEnded() { modalEnded() {
// We don't update the stage input region while in a modal, // We don't update the stage input region while in a modal,
// so queue an update now. // so queue an update now.
this._queueUpdateRegions(); this._queueUpdateRegions();
}, }
}); });
@@ -1083,10 +1076,8 @@ var LayoutManager = new Lang.Class({
// //
// This class manages a "hot corner" that can toggle switching to // This class manages a "hot corner" that can toggle switching to
// overview. // overview.
var HotCorner = new Lang.Class({ var HotCorner = class HotCorner {
Name: 'HotCorner', constructor(layoutManager, monitor, x, y) {
_init(layoutManager, monitor, x, y) {
// We use this flag to mark the case where the user has entered the // We use this flag to mark the case where the user has entered the
// hot corner and has not left both the hot corner and a surrounding // hot corner and has not left both the hot corner and a surrounding
// guard area (the "environs"). This avoids triggering the hot corner // guard area (the "environs"). This avoids triggering the hot corner
@@ -1114,7 +1105,7 @@ var HotCorner = new Lang.Class({
layoutManager.uiGroup.add_actor(this._ripple1); layoutManager.uiGroup.add_actor(this._ripple1);
layoutManager.uiGroup.add_actor(this._ripple2); layoutManager.uiGroup.add_actor(this._ripple2);
layoutManager.uiGroup.add_actor(this._ripple3); layoutManager.uiGroup.add_actor(this._ripple3);
}, }
setBarrierSize(size) { setBarrierSize(size) {
if (this._verticalBarrier) { if (this._verticalBarrier) {
@@ -1149,7 +1140,7 @@ var HotCorner = new Lang.Class({
this._pressureBarrier.addBarrier(this._verticalBarrier); this._pressureBarrier.addBarrier(this._verticalBarrier);
this._pressureBarrier.addBarrier(this._horizontalBarrier); this._pressureBarrier.addBarrier(this._horizontalBarrier);
} }
}, }
_setupFallbackCornerIfNeeded(layoutManager) { _setupFallbackCornerIfNeeded(layoutManager) {
if (!global.display.supports_extended_barriers()) { if (!global.display.supports_extended_barriers()) {
@@ -1184,7 +1175,7 @@ var HotCorner = new Lang.Class({
this._corner.connect('leave-event', this._corner.connect('leave-event',
this._onCornerLeft.bind(this)); this._onCornerLeft.bind(this));
} }
}, }
destroy() { destroy() {
this.setBarrierSize(0); this.setBarrierSize(0);
@@ -1193,7 +1184,7 @@ var HotCorner = new Lang.Class({
if (this.actor) if (this.actor)
this.actor.destroy(); this.actor.destroy();
}, }
_animRipple(ripple, delay, time, startScale, startOpacity, finalScale) { _animRipple(ripple, delay, time, startScale, startOpacity, finalScale) {
// We draw a ripple by using a source image and animating it scaling // We draw a ripple by using a source image and animating it scaling
@@ -1223,7 +1214,7 @@ var HotCorner = new Lang.Class({
transition: 'linear', transition: 'linear',
onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); }, onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
onComplete() { ripple.visible = false; } }); onComplete() { ripple.visible = false; } });
}, }
_rippleAnimation() { _rippleAnimation() {
// Show three concentric ripples expanding outwards; the exact // Show three concentric ripples expanding outwards; the exact
@@ -1234,7 +1225,7 @@ var HotCorner = new Lang.Class({
this._animRipple(this._ripple1, 0.0, 0.83, 0.25, 1.0, 1.5); this._animRipple(this._ripple1, 0.0, 0.83, 0.25, 1.0, 1.5);
this._animRipple(this._ripple2, 0.05, 1.0, 0.0, 0.7, 1.25); this._animRipple(this._ripple2, 0.05, 1.0, 0.0, 0.7, 1.25);
this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1); this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1);
}, }
_toggleOverview() { _toggleOverview() {
if (this._monitor.inFullscreen && !Main.overview.visible) if (this._monitor.inFullscreen && !Main.overview.visible)
@@ -1244,7 +1235,7 @@ var HotCorner = new Lang.Class({
this._rippleAnimation(); this._rippleAnimation();
Main.overview.toggle(); Main.overview.toggle();
} }
}, }
handleDragOver(source, actor, x, y, time) { handleDragOver(source, actor, x, y, time) {
if (source != Main.xdndHandler) if (source != Main.xdndHandler)
@@ -1253,7 +1244,7 @@ var HotCorner = new Lang.Class({
this._toggleOverview(); this._toggleOverview();
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;
}, }
_onCornerEntered() { _onCornerEntered() {
if (!this._entered) { if (!this._entered) {
@@ -1261,26 +1252,24 @@ var HotCorner = new Lang.Class({
this._toggleOverview(); this._toggleOverview();
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onCornerLeft(actor, event) { _onCornerLeft(actor, event) {
if (event.get_related() != this.actor) if (event.get_related() != this.actor)
this._entered = false; this._entered = false;
// Consume event, otherwise this will confuse onEnvironsLeft // Consume event, otherwise this will confuse onEnvironsLeft
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onEnvironsLeft(actor, event) { _onEnvironsLeft(actor, event) {
if (event.get_related() != this._corner) if (event.get_related() != this._corner)
this._entered = false; this._entered = false;
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
}); };
var PressureBarrier = new Lang.Class({ var PressureBarrier = class PressureBarrier {
Name: 'PressureBarrier', constructor(threshold, timeout, actionMode) {
_init(threshold, timeout, actionMode) {
this._threshold = threshold; this._threshold = threshold;
this._timeout = timeout; this._timeout = timeout;
this._actionMode = actionMode; this._actionMode = actionMode;
@@ -1289,57 +1278,57 @@ var PressureBarrier = new Lang.Class({
this._isTriggered = false; this._isTriggered = false;
this._reset(); this._reset();
}, }
addBarrier(barrier) { addBarrier(barrier) {
barrier._pressureHitId = barrier.connect('hit', this._onBarrierHit.bind(this)); barrier._pressureHitId = barrier.connect('hit', this._onBarrierHit.bind(this));
barrier._pressureLeftId = barrier.connect('left', this._onBarrierLeft.bind(this)); barrier._pressureLeftId = barrier.connect('left', this._onBarrierLeft.bind(this));
this._barriers.push(barrier); this._barriers.push(barrier);
}, }
_disconnectBarrier(barrier) { _disconnectBarrier(barrier) {
barrier.disconnect(barrier._pressureHitId); barrier.disconnect(barrier._pressureHitId);
barrier.disconnect(barrier._pressureLeftId); barrier.disconnect(barrier._pressureLeftId);
}, }
removeBarrier(barrier) { removeBarrier(barrier) {
this._disconnectBarrier(barrier); this._disconnectBarrier(barrier);
this._barriers.splice(this._barriers.indexOf(barrier), 1); this._barriers.splice(this._barriers.indexOf(barrier), 1);
}, }
destroy() { destroy() {
this._barriers.forEach(this._disconnectBarrier.bind(this)); this._barriers.forEach(this._disconnectBarrier.bind(this));
this._barriers = []; this._barriers = [];
}, }
setEventFilter(filter) { setEventFilter(filter) {
this._eventFilter = filter; this._eventFilter = filter;
}, }
_reset() { _reset() {
this._barrierEvents = []; this._barrierEvents = [];
this._currentPressure = 0; this._currentPressure = 0;
this._lastTime = 0; this._lastTime = 0;
}, }
_isHorizontal(barrier) { _isHorizontal(barrier) {
return barrier.y1 == barrier.y2; return barrier.y1 == barrier.y2;
}, }
_getDistanceAcrossBarrier(barrier, event) { _getDistanceAcrossBarrier(barrier, event) {
if (this._isHorizontal(barrier)) if (this._isHorizontal(barrier))
return Math.abs(event.dy); return Math.abs(event.dy);
else else
return Math.abs(event.dx); return Math.abs(event.dx);
}, }
_getDistanceAlongBarrier(barrier, event) { _getDistanceAlongBarrier(barrier, event) {
if (this._isHorizontal(barrier)) if (this._isHorizontal(barrier))
return Math.abs(event.dx); return Math.abs(event.dx);
else else
return Math.abs(event.dy); return Math.abs(event.dy);
}, }
_trimBarrierEvents() { _trimBarrierEvents() {
// Events are guaranteed to be sorted in time order from // Events are guaranteed to be sorted in time order from
@@ -1363,7 +1352,7 @@ var PressureBarrier = new Lang.Class({
} }
this._barrierEvents = this._barrierEvents.slice(firstNewEvent); this._barrierEvents = this._barrierEvents.slice(firstNewEvent);
}, }
_onBarrierLeft(barrier, event) { _onBarrierLeft(barrier, event) {
barrier._isHit = false; barrier._isHit = false;
@@ -1371,13 +1360,13 @@ var PressureBarrier = new Lang.Class({
this._reset(); this._reset();
this._isTriggered = false; this._isTriggered = false;
} }
}, }
_trigger() { _trigger() {
this._isTriggered = true; this._isTriggered = true;
this.emit('trigger'); this.emit('trigger');
this._reset(); this._reset();
}, }
_onBarrierHit(barrier, event) { _onBarrierHit(barrier, event) {
barrier._isHit = true; barrier._isHit = true;
@@ -1419,5 +1408,5 @@ var PressureBarrier = new Lang.Class({
if (this._currentPressure >= this._threshold) if (this._currentPressure >= this._threshold)
this._trigger(); this._trigger();
} }
}); };
Signals.addSignalMethods(PressureBarrier.prototype); Signals.addSignalMethods(PressureBarrier.prototype);

View File

@@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const GObject = imports.gi.GObject;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
@@ -27,38 +27,36 @@ t = clamp(t, 0.0, 1.0);\n\
float pixel_brightness = mix(1.0, 1.0 - vignette_sharpness, t);\n\ float pixel_brightness = mix(1.0, 1.0 - vignette_sharpness, t);\n\
cogl_color_out.a = cogl_color_out.a * (1 - pixel_brightness * brightness);'; cogl_color_out.a = cogl_color_out.a * (1 - pixel_brightness * brightness);';
var RadialShaderQuad = new Lang.Class({ var RadialShaderQuad = GObject.registerClass(
Name: 'RadialShaderQuad', class RadialShaderQuad extends Shell.GLSLQuad {
Extends: Shell.GLSLQuad,
_init(params) { _init(params) {
this.parent(params); super._init(params);
this._brightnessLocation = this.get_uniform_location('brightness'); this._brightnessLocation = this.get_uniform_location('brightness');
this._sharpnessLocation = this.get_uniform_location('vignette_sharpness'); this._sharpnessLocation = this.get_uniform_location('vignette_sharpness');
this.brightness = 1.0; this.brightness = 1.0;
this.vignetteSharpness = 0.0; this.vignetteSharpness = 0.0;
}, }
vfunc_build_pipeline() { vfunc_build_pipeline() {
this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT,
VIGNETTE_DECLARATIONS, VIGNETTE_CODE, true); VIGNETTE_DECLARATIONS, VIGNETTE_CODE, true);
}, }
get brightness() { get brightness() {
return this._brightness; return this._brightness;
}, }
set brightness(v) { set brightness(v) {
this._brightness = v; this._brightness = v;
this.set_uniform_float(this._brightnessLocation, this.set_uniform_float(this._brightnessLocation,
1, [this._brightness]); 1, [this._brightness]);
}, }
get vignetteSharpness() { get vignetteSharpness() {
return this._sharpness; return this._sharpness;
}, }
set vignetteSharpness(v) { set vignetteSharpness(v) {
this._sharpness = v; this._sharpness = v;
@@ -91,10 +89,8 @@ var RadialShaderQuad = new Lang.Class({
* @container and will track any changes in its size. You can override * @container and will track any changes in its size. You can override
* this by passing an explicit width and height in @params. * this by passing an explicit width and height in @params.
*/ */
var Lightbox = new Lang.Class({ var Lightbox = class Lightbox {
Name: 'Lightbox', constructor(container, params) {
_init(container, params) {
params = Params.parse(params, { inhibitEvents: false, params = Params.parse(params, { inhibitEvents: false,
width: null, width: null,
height: null, height: null,
@@ -137,7 +133,7 @@ var Lightbox = new Lang.Class({
this._actorRemovedSignalId = container.connect('actor-removed', this._actorRemoved.bind(this)); this._actorRemovedSignalId = container.connect('actor-removed', this._actorRemoved.bind(this));
this._highlighted = null; this._highlighted = null;
}, }
_actorAdded(container, newChild) { _actorAdded(container, newChild) {
let children = this._container.get_children(); let children = this._container.get_children();
@@ -159,7 +155,7 @@ var Lightbox = new Lang.Class({
if (prevChild != -1) // paranoia if (prevChild != -1) // paranoia
this._children.splice(prevChild + 1, 0, newChild); this._children.splice(prevChild + 1, 0, newChild);
} }
}, }
show(fadeInTime) { show(fadeInTime) {
fadeInTime = fadeInTime || 0; fadeInTime = fadeInTime || 0;
@@ -189,7 +185,7 @@ var Lightbox = new Lang.Class({
} }
this.actor.show(); this.actor.show();
}, }
hide(fadeOutTime) { hide(fadeOutTime) {
fadeOutTime = fadeOutTime || 0; fadeOutTime = fadeOutTime || 0;
@@ -217,7 +213,7 @@ var Lightbox = new Lang.Class({
} }
}); });
} }
}, }
_actorRemoved(container, child) { _actorRemoved(container, child) {
let index = this._children.indexOf(child); let index = this._children.indexOf(child);
@@ -226,7 +222,7 @@ var Lightbox = new Lang.Class({
if (child == this._highlighted) if (child == this._highlighted)
this._highlighted = null; this._highlighted = null;
}, }
/** /**
* highlight: * highlight:
@@ -257,7 +253,7 @@ var Lightbox = new Lang.Class({
} }
this._highlighted = window; this._highlighted = window;
}, }
/** /**
* destroy: * destroy:
@@ -266,7 +262,7 @@ var Lightbox = new Lang.Class({
*/ */
destroy() { destroy() {
this.actor.destroy(); this.actor.destroy();
}, }
/** /**
* _onDestroy: * _onDestroy:
@@ -280,5 +276,5 @@ var Lightbox = new Lang.Class({
this.highlight(null); this.highlight(null);
} }
}); };
Signals.addSignalMethods(Lightbox.prototype); Signals.addSignalMethods(Lightbox.prototype);

View File

@@ -11,7 +11,6 @@ const Pango = imports.gi.Pango;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const System = imports.system; const System = imports.system;
@@ -35,7 +34,6 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
'const Meta = imports.gi.Meta; ' + 'const Meta = imports.gi.Meta; ' +
'const Shell = imports.gi.Shell; ' + 'const Shell = imports.gi.Shell; ' +
'const Main = imports.ui.main; ' + 'const Main = imports.ui.main; ' +
'const Lang = imports.lang; ' +
'const Tweener = imports.ui.tweener; ' + 'const Tweener = imports.ui.tweener; ' +
/* Utility functions...we should probably be able to use these /* Utility functions...we should probably be able to use these
* in the shell core code too. */ * in the shell core code too. */
@@ -62,14 +60,12 @@ function _getAutoCompleteGlobalKeywords() {
return keywords.concat(windowProperties).concat(headerProperties); return keywords.concat(windowProperties).concat(headerProperties);
} }
var AutoComplete = new Lang.Class({ var AutoComplete = class AutoComplete {
Name: 'AutoComplete', constructor(entry) {
_init(entry) {
this._entry = entry; this._entry = entry;
this._entry.connect('key-press-event', this._entryKeyPressEvent.bind(this)); this._entry.connect('key-press-event', this._entryKeyPressEvent.bind(this));
this._lastTabTime = global.get_current_time(); this._lastTabTime = global.get_current_time();
}, }
_processCompletionRequest(event) { _processCompletionRequest(event) {
if (event.completions.length == 0) { if (event.completions.length == 0) {
@@ -91,7 +87,7 @@ var AutoComplete = new Lang.Class({
} else if (event.completions.length > 1 && event.tabType === 'double') { } else if (event.completions.length > 1 && event.tabType === 'double') {
this.emit('suggest', { completions: event.completions}); this.emit('suggest', { completions: event.completions});
} }
}, }
_entryKeyPressEvent(actor, event) { _entryKeyPressEvent(actor, event) {
let cursorPos = this._entry.clutter_text.get_cursor_position(); let cursorPos = this._entry.clutter_text.get_cursor_position();
@@ -114,7 +110,7 @@ var AutoComplete = new Lang.Class({
this._lastTabTime = currTime; this._lastTabTime = currTime;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
// Insert characters of text not already included in head at cursor position. i.e., if text="abc" and head="a", // Insert characters of text not already included in head at cursor position. i.e., if text="abc" and head="a",
// the string "bc" will be appended to this._entry // the string "bc" will be appended to this._entry
@@ -124,21 +120,19 @@ var AutoComplete = new Lang.Class({
this._entry.clutter_text.insert_text(additionalCompletionText, cursorPos); this._entry.clutter_text.insert_text(additionalCompletionText, cursorPos);
} }
}); };
Signals.addSignalMethods(AutoComplete.prototype); Signals.addSignalMethods(AutoComplete.prototype);
var Notebook = new Lang.Class({ var Notebook = class Notebook {
Name: 'Notebook', constructor() {
_init() {
this.actor = new St.BoxLayout({ vertical: true }); this.actor = new St.BoxLayout({ vertical: true });
this.tabControls = new St.BoxLayout({ style_class: 'labels' }); this.tabControls = new St.BoxLayout({ style_class: 'labels' });
this._selectedIndex = -1; this._selectedIndex = -1;
this._tabs = []; this._tabs = [];
}, }
appendPage(name, child) { appendPage(name, child) {
let labelBox = new St.BoxLayout({ style_class: 'notebook-tab', let labelBox = new St.BoxLayout({ style_class: 'notebook-tab',
@@ -171,7 +165,7 @@ var Notebook = new Lang.Class({
if (this._selectedIndex == -1) if (this._selectedIndex == -1)
this.selectIndex(0); this.selectIndex(0);
}, }
_unselect() { _unselect() {
if (this._selectedIndex < 0) if (this._selectedIndex < 0)
@@ -180,7 +174,7 @@ var Notebook = new Lang.Class({
tabData.labelBox.remove_style_pseudo_class('selected'); tabData.labelBox.remove_style_pseudo_class('selected');
tabData.scrollView.hide(); tabData.scrollView.hide();
this._selectedIndex = -1; this._selectedIndex = -1;
}, }
selectIndex(index) { selectIndex(index) {
if (index == this._selectedIndex) if (index == this._selectedIndex)
@@ -202,7 +196,7 @@ var Notebook = new Lang.Class({
tabData.scrollView.show(); tabData.scrollView.show();
this._selectedIndex = index; this._selectedIndex = index;
this.emit('selection', tabData.child); this.emit('selection', tabData.child);
}, }
selectChild(child) { selectChild(child) {
if (child == null) if (child == null)
@@ -216,26 +210,26 @@ var Notebook = new Lang.Class({
} }
} }
} }
}, }
scrollToBottom(index) { scrollToBottom(index) {
let tabData = this._tabs[index]; let tabData = this._tabs[index];
tabData._scrollToBottom = true; tabData._scrollToBottom = true;
}, }
_onAdjustValueChanged(tabData) { _onAdjustValueChanged(tabData) {
let vAdjust = tabData.scrollView.vscroll.adjustment; let vAdjust = tabData.scrollView.vscroll.adjustment;
if (vAdjust.value < (vAdjust.upper - vAdjust.lower - 0.5)) if (vAdjust.value < (vAdjust.upper - vAdjust.lower - 0.5))
tabData._scrolltoBottom = false; tabData._scrolltoBottom = false;
}, }
_onAdjustScopeChanged(tabData) { _onAdjustScopeChanged(tabData) {
if (!tabData._scrollToBottom) if (!tabData._scrollToBottom)
return; return;
let vAdjust = tabData.scrollView.vscroll.adjustment; let vAdjust = tabData.scrollView.vscroll.adjustment;
vAdjust.value = vAdjust.upper - vAdjust.page_size; vAdjust.value = vAdjust.upper - vAdjust.page_size;
}, }
nextTab() { nextTab() {
let nextIndex = this._selectedIndex; let nextIndex = this._selectedIndex;
@@ -244,7 +238,7 @@ var Notebook = new Lang.Class({
} }
this.selectIndex(nextIndex); this.selectIndex(nextIndex);
}, }
prevTab() { prevTab() {
let prevIndex = this._selectedIndex; let prevIndex = this._selectedIndex;
@@ -254,7 +248,7 @@ var Notebook = new Lang.Class({
this.selectIndex(prevIndex); this.selectIndex(prevIndex);
} }
}); };
Signals.addSignalMethods(Notebook.prototype); Signals.addSignalMethods(Notebook.prototype);
function objectToString(o) { function objectToString(o) {
@@ -266,10 +260,8 @@ function objectToString(o) {
} }
} }
var ObjLink = new Lang.Class({ var ObjLink = class ObjLink {
Name: 'ObjLink', constructor(lookingGlass, o, title) {
_init(lookingGlass, o, title) {
let text; let text;
if (title) if (title)
text = title; text = title;
@@ -286,17 +278,15 @@ var ObjLink = new Lang.Class({
this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('clicked', this._onClicked.bind(this));
this._lookingGlass = lookingGlass; this._lookingGlass = lookingGlass;
}, }
_onClicked(link) { _onClicked(link) {
this._lookingGlass.inspectObject(this._obj, this.actor); this._lookingGlass.inspectObject(this._obj, this.actor);
} }
}); };
var Result = new Lang.Class({ var Result = class Result {
Name: 'Result', constructor(lookingGlass, command, o, index) {
_init(lookingGlass, command, o, index) {
this.index = index; this.index = index;
this.o = o; this.o = o;
@@ -314,12 +304,10 @@ var Result = new Lang.Class({
let objLink = new ObjLink(this._lookingGlass, o); let objLink = new ObjLink(this._lookingGlass, o);
box.add(objLink.actor); box.add(objLink.actor);
} }
}); };
var WindowList = new Lang.Class({ var WindowList = class WindowList {
Name: 'WindowList', constructor(lookingGlass) {
_init(lookingGlass) {
this.actor = new St.BoxLayout({ name: 'Windows', vertical: true, style: 'spacing: 8px' }); this.actor = new St.BoxLayout({ name: 'Windows', vertical: true, style: 'spacing: 8px' });
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
this._updateId = Main.initializeDeferredWork(this.actor, this._updateWindowList.bind(this)); this._updateId = Main.initializeDeferredWork(this.actor, this._updateWindowList.bind(this));
@@ -327,7 +315,7 @@ var WindowList = new Lang.Class({
tracker.connect('tracked-windows-changed', this._updateWindowList.bind(this)); tracker.connect('tracked-windows-changed', this._updateWindowList.bind(this));
this._lookingGlass = lookingGlass; this._lookingGlass = lookingGlass;
}, }
_updateWindowList() { _updateWindowList() {
this.actor.destroy_all_children(); this.actor.destroy_all_children();
@@ -361,13 +349,11 @@ var WindowList = new Lang.Class({
} }
} }
} }
}); };
Signals.addSignalMethods(WindowList.prototype); Signals.addSignalMethods(WindowList.prototype);
var ObjInspector = new Lang.Class({ var ObjInspector = class ObjInspector {
Name: 'ObjInspector', constructor(lookingGlass) {
_init(lookingGlass) {
this._obj = null; this._obj = null;
this._previousObj = null; this._previousObj = null;
@@ -382,7 +368,7 @@ var ObjInspector = new Lang.Class({
this.actor.add_actor(this._container); this.actor.add_actor(this._container);
this._lookingGlass = lookingGlass; this._lookingGlass = lookingGlass;
}, }
selectObject(obj, skipPrevious) { selectObject(obj, skipPrevious) {
if (!skipPrevious) if (!skipPrevious)
@@ -436,7 +422,7 @@ var ObjInspector = new Lang.Class({
this._container.add_actor(hbox); this._container.add_actor(hbox);
} }
} }
}, }
open(sourceActor) { open(sourceActor) {
if (this._open) if (this._open)
@@ -452,7 +438,7 @@ var ObjInspector = new Lang.Class({
} else { } else {
this.actor.set_scale(1, 1); this.actor.set_scale(1, 1);
} }
}, }
close() { close() {
if (!this._open) if (!this._open)
@@ -461,23 +447,21 @@ var ObjInspector = new Lang.Class({
this.actor.hide(); this.actor.hide();
this._previousObj = null; this._previousObj = null;
this._obj = null; this._obj = null;
}, }
_onInsert() { _onInsert() {
let obj = this._obj; let obj = this._obj;
this.close(); this.close();
this._lookingGlass.insertObject(obj); this._lookingGlass.insertObject(obj);
}, }
_onBack() { _onBack() {
this.selectObject(this._previousObj, true); this.selectObject(this._previousObj, true);
} }
}); };
var RedBorderEffect = new Lang.Class({
Name: 'RedBorderEffect',
Extends: Clutter.Effect,
var RedBorderEffect = GObject.registerClass(
class RedBorderEffect extends Clutter.Effect {
vfunc_paint() { vfunc_paint() {
let actor = this.get_actor(); let actor = this.get_actor();
actor.continue_paint(); actor.continue_paint();
@@ -497,17 +481,15 @@ var RedBorderEffect = new Lang.Class({
geom.width - width, geom.height - width); geom.width - width, geom.height - width);
Cogl.rectangle(0, geom.height - width, Cogl.rectangle(0, geom.height - width,
width, width); width, width);
}, }
}); });
var Inspector = new Lang.Class({ var Inspector = GObject.registerClass({
Name: 'Inspector',
Extends: Clutter.Actor,
Signals: { 'closed': {}, Signals: { 'closed': {},
'target': { param_types: [Clutter.Actor.$gtype, GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] } }, 'target': { param_types: [Clutter.Actor.$gtype, GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] } },
}, class Inspector extends Clutter.Actor {
_init(lookingGlass) { _init(lookingGlass) {
this.parent({ width: 0, super._init({ width: 0,
height: 0 }); height: 0 });
Main.uiGroup.add_actor(this); Main.uiGroup.add_actor(this);
@@ -536,7 +518,7 @@ var Inspector = new Lang.Class({
this._pointerTarget = null; this._pointerTarget = null;
this._lookingGlass = lookingGlass; this._lookingGlass = lookingGlass;
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.set_allocation(box, flags); this.set_allocation(box, flags);
@@ -555,7 +537,7 @@ var Inspector = new Lang.Class({
childBox.y1 = primary.y + Math.floor((primary.height - natHeight) / 2); childBox.y1 = primary.y + Math.floor((primary.height - natHeight) / 2);
childBox.y2 = childBox.y1 + natHeight; childBox.y2 = childBox.y1 + natHeight;
this._eventHandler.allocate(childBox, flags); this._eventHandler.allocate(childBox, flags);
}, }
_close() { _close() {
Clutter.ungrab_pointer(); Clutter.ungrab_pointer();
@@ -563,13 +545,13 @@ var Inspector = new Lang.Class({
this._eventHandler.destroy(); this._eventHandler.destroy();
this._eventHandler = null; this._eventHandler = null;
this.emit('closed'); this.emit('closed');
}, }
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
if (event.get_key_symbol() == Clutter.Escape) if (event.get_key_symbol() == Clutter.Escape)
this._close(); this._close();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onButtonPressEvent(actor, event) { _onButtonPressEvent(actor, event) {
if (this._target) { if (this._target) {
@@ -578,7 +560,7 @@ var Inspector = new Lang.Class({
} }
this._close(); this._close();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onScrollEvent(actor, event) { _onScrollEvent(actor, event) {
switch (event.get_scroll_direction()) { switch (event.get_scroll_direction()) {
@@ -612,12 +594,12 @@ var Inspector = new Lang.Class({
break; break;
} }
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onMotionEvent(actor, event) { _onMotionEvent(actor, event) {
this._update(event); this._update(event);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_update(event) { _update(event) {
let [stageX, stageY] = event.get_coords(); let [stageX, stageY] = event.get_coords();
@@ -637,10 +619,8 @@ var Inspector = new Lang.Class({
} }
}); });
var Extensions = new Lang.Class({ var Extensions = class Extensions {
Name: 'Extensions', constructor(lookingGlass) {
_init(lookingGlass) {
this._lookingGlass = lookingGlass; this._lookingGlass = lookingGlass;
this.actor = new St.BoxLayout({ vertical: true, this.actor = new St.BoxLayout({ vertical: true,
name: 'lookingGlassExtensions' }); name: 'lookingGlassExtensions' });
@@ -657,7 +637,7 @@ var Extensions = new Lang.Class({
ExtensionSystem.connect('extension-loaded', ExtensionSystem.connect('extension-loaded',
this._loadExtension.bind(this)); this._loadExtension.bind(this));
}, }
_loadExtension(o, uuid) { _loadExtension(o, uuid) {
let extension = ExtensionUtils.extensions[uuid]; let extension = ExtensionUtils.extensions[uuid];
@@ -672,20 +652,20 @@ var Extensions = new Lang.Class({
this._numExtensions ++; this._numExtensions ++;
this._extensionsList.add(extensionDisplay); this._extensionsList.add(extensionDisplay);
}, }
_onViewSource(actor) { _onViewSource(actor) {
let extension = actor._extension; let extension = actor._extension;
let uri = extension.dir.get_uri(); let uri = extension.dir.get_uri();
Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context(0, -1)); Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context(0, -1));
this._lookingGlass.close(); this._lookingGlass.close();
}, }
_onWebPage(actor) { _onWebPage(actor) {
let extension = actor._extension; let extension = actor._extension;
Gio.app_info_launch_default_for_uri(extension.metadata.url, global.create_app_launch_context(0, -1)); Gio.app_info_launch_default_for_uri(extension.metadata.url, global.create_app_launch_context(0, -1));
this._lookingGlass.close(); this._lookingGlass.close();
}, }
_onViewErrors(actor) { _onViewErrors(actor) {
let extension = actor._extension; let extension = actor._extension;
@@ -713,7 +693,7 @@ var Extensions = new Lang.Class({
} }
actor._isShowing = shouldShow; actor._isShowing = shouldShow;
}, }
_stateToString(extensionState) { _stateToString(extensionState) {
switch (extensionState) { switch (extensionState) {
@@ -730,7 +710,7 @@ var Extensions = new Lang.Class({
return _("Downloading"); return _("Downloading");
} }
return 'Unknown'; // Not translated, shouldn't appear return 'Unknown'; // Not translated, shouldn't appear
}, }
_createExtensionDisplay(extension) { _createExtensionDisplay(extension) {
let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true }); let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true });
@@ -778,12 +758,10 @@ var Extensions = new Lang.Class({
return box; return box;
} }
}); };
var LookingGlass = new Lang.Class({ var LookingGlass = class LookingGlass {
Name: 'LookingGlass', constructor() {
_init() {
this._borderPaintTarget = null; this._borderPaintTarget = null;
this._redBorderEffect = new RedBorderEffect(); this._redBorderEffect = new RedBorderEffect();
@@ -917,7 +895,7 @@ var LookingGlass = new Lang.Class({
}); });
this._resize(); this._resize();
}, }
_updateFont() { _updateFont() {
let fontName = this._interfaceSettings.get_string('monospace-font-name'); let fontName = this._interfaceSettings.get_string('monospace-font-name');
@@ -927,7 +905,7 @@ var LookingGlass = new Lang.Class({
this.actor.style = this.actor.style =
'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + ';' 'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + ';'
+ 'font-family: "' + fontDesc.get_family() + '";'; + 'font-family: "' + fontDesc.get_family() + '";';
}, }
setBorderPaintTarget(obj) { setBorderPaintTarget(obj) {
if (this._borderPaintTarget != null) if (this._borderPaintTarget != null)
@@ -935,7 +913,7 @@ var LookingGlass = new Lang.Class({
this._borderPaintTarget = obj; this._borderPaintTarget = obj;
if (this._borderPaintTarget != null) if (this._borderPaintTarget != null)
this._borderPaintTarget.add_effect(this._redBorderEffect); this._borderPaintTarget.add_effect(this._redBorderEffect);
}, }
_pushResult(command, obj) { _pushResult(command, obj) {
let index = this._results.length + this._offset; let index = this._results.length + this._offset;
@@ -955,7 +933,7 @@ var LookingGlass = new Lang.Class({
// Scroll to bottom // Scroll to bottom
this._notebook.scrollToBottom(0); this._notebook.scrollToBottom(0);
}, }
_showCompletions(completions) { _showCompletions(completions) {
if (!this._completionActor) { if (!this._completionActor) {
@@ -984,7 +962,7 @@ var LookingGlass = new Lang.Class({
opacity: 255 opacity: 255
}); });
} }
}, }
_hideCompletions() { _hideCompletions() {
if (this._completionActor) { if (this._completionActor) {
@@ -998,46 +976,49 @@ var LookingGlass = new Lang.Class({
} }
}); });
} }
}, }
_evaluate(command) { _evaluate(command) {
this._history.addItem(command); this._history.addItem(command);
let fullCmd = commandHeader + command; let lines = command.split(';');
lines.push(`return ${lines.pop()}`);
let fullCmd = commandHeader + lines.join(';');
let resultObj; let resultObj;
try { try {
resultObj = eval(fullCmd); resultObj = Function(fullCmd)();
} catch (e) { } catch (e) {
resultObj = '<exception ' + e + '>'; resultObj = '<exception ' + e + '>';
} }
this._pushResult(command, resultObj); this._pushResult(command, resultObj);
this._entry.text = ''; this._entry.text = '';
}, }
inspect(x, y) { inspect(x, y) {
return global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); return global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
}, }
getIt() { getIt() {
return this._it; return this._it;
}, }
getResult(idx) { getResult(idx) {
return this._results[idx - this._offset].o; return this._results[idx - this._offset].o;
}, }
toggle() { toggle() {
if (this._open) if (this._open)
this.close(); this.close();
else else
this.open(); this.open();
}, }
_queueResize() { _queueResize() {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { this._resize(); }); Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { this._resize(); });
}, }
_resize() { _resize() {
let primary = Main.layoutManager.primaryMonitor; let primary = Main.layoutManager.primaryMonitor;
@@ -1053,16 +1034,16 @@ var LookingGlass = new Lang.Class({
this._objInspector.actor.set_size(Math.floor(myWidth * 0.8), Math.floor(myHeight * 0.8)); this._objInspector.actor.set_size(Math.floor(myWidth * 0.8), Math.floor(myHeight * 0.8));
this._objInspector.actor.set_position(this.actor.x + Math.floor(myWidth * 0.1), this._objInspector.actor.set_position(this.actor.x + Math.floor(myWidth * 0.1),
this._targetY + Math.floor(myHeight * 0.1)); this._targetY + Math.floor(myHeight * 0.1));
}, }
insertObject(obj) { insertObject(obj) {
this._pushResult('<insert>', obj); this._pushResult('<insert>', obj);
}, }
inspectObject(obj, sourceActor) { inspectObject(obj, sourceActor) {
this._objInspector.open(sourceActor); this._objInspector.open(sourceActor);
this._objInspector.selectObject(obj); this._objInspector.selectObject(obj);
}, }
// Handle key events which are relevant for all tabs of the LookingGlass // Handle key events which are relevant for all tabs of the LookingGlass
_globalKeyPressEvent(actor, event) { _globalKeyPressEvent(actor, event) {
@@ -1085,7 +1066,7 @@ var LookingGlass = new Lang.Class({
} }
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
open() { open() {
if (this._open) if (this._open)
@@ -1107,7 +1088,7 @@ var LookingGlass = new Lang.Class({
transition: 'easeOutQuad', transition: 'easeOutQuad',
y: this._targetY y: this._targetY
}); });
}, }
close() { close() {
if (!this._open) if (!this._open)
@@ -1130,5 +1111,5 @@ var LookingGlass = new Lang.Class({
} }
}); });
} }
}); };
Signals.addSignalMethods(LookingGlass.prototype); Signals.addSignalMethods(LookingGlass.prototype);

View File

@@ -7,7 +7,6 @@ const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Signals = imports.signals; const Signals = imports.signals;
@@ -53,10 +52,8 @@ const CROSS_HAIRS_CLIP_KEY = 'cross-hairs-clip';
let magDBusService = null; let magDBusService = null;
var Magnifier = new Lang.Class({ var Magnifier = class Magnifier {
Name: 'Magnifier', constructor() {
_init() {
// Magnifier is a manager of ZoomRegions. // Magnifier is a manager of ZoomRegions.
this._zoomRegions = []; this._zoomRegions = [];
@@ -84,7 +81,7 @@ var Magnifier = new Lang.Class({
// Export to dbus. // Export to dbus.
magDBusService = new MagnifierDBus.ShellMagnifier(); magDBusService = new MagnifierDBus.ShellMagnifier();
this.setActive(showAtLaunch); this.setActive(showAtLaunch);
}, }
/** /**
* showSystemCursor: * showSystemCursor:
@@ -92,7 +89,7 @@ var Magnifier = new Lang.Class({
*/ */
showSystemCursor() { showSystemCursor() {
this._cursorTracker.set_pointer_visible(true); this._cursorTracker.set_pointer_visible(true);
}, }
/** /**
* hideSystemCursor: * hideSystemCursor:
@@ -100,7 +97,7 @@ var Magnifier = new Lang.Class({
*/ */
hideSystemCursor() { hideSystemCursor() {
this._cursorTracker.set_pointer_visible(false); this._cursorTracker.set_pointer_visible(false);
}, }
/** /**
* setActive: * setActive:
@@ -131,7 +128,7 @@ var Magnifier = new Lang.Class({
// Notify interested parties of this change // Notify interested parties of this change
this.emit('active-changed', activate); this.emit('active-changed', activate);
}, }
/** /**
* isActive: * isActive:
@@ -144,7 +141,7 @@ var Magnifier = new Lang.Class({
return false; return false;
else else
return this._zoomRegions[0].isActive(); return this._zoomRegions[0].isActive();
}, }
/** /**
* startTrackingMouse: * startTrackingMouse:
@@ -155,7 +152,7 @@ var Magnifier = new Lang.Class({
let interval = 1000 / Clutter.get_default_frame_rate(); let interval = 1000 / Clutter.get_default_frame_rate();
this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, this.scrollToMousePos.bind(this)); this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, this.scrollToMousePos.bind(this));
} }
}, }
/** /**
* stopTrackingMouse: * stopTrackingMouse:
@@ -166,7 +163,7 @@ var Magnifier = new Lang.Class({
this._pointerWatch.remove(); this._pointerWatch.remove();
this._pointerWatch = null; this._pointerWatch = null;
}, }
/** /**
* isTrackingMouse: * isTrackingMouse:
@@ -174,7 +171,7 @@ var Magnifier = new Lang.Class({
*/ */
isTrackingMouse() { isTrackingMouse() {
return !!this._mouseTrackingId; return !!this._mouseTrackingId;
}, }
/** /**
* scrollToMousePos: * scrollToMousePos:
@@ -200,7 +197,7 @@ var Magnifier = new Lang.Class({
this.showSystemCursor(); this.showSystemCursor();
} }
return true; return true;
}, }
/** /**
* createZoomRegion: * createZoomRegion:
@@ -229,7 +226,7 @@ var Magnifier = new Lang.Class({
zoomRegion.addCrosshairs(this._crossHairs); zoomRegion.addCrosshairs(this._crossHairs);
return zoomRegion; return zoomRegion;
}, }
/** /**
* addZoomRegion: * addZoomRegion:
@@ -243,7 +240,7 @@ var Magnifier = new Lang.Class({
if (!this.isTrackingMouse()) if (!this.isTrackingMouse())
this.startTrackingMouse(); this.startTrackingMouse();
} }
}, }
/** /**
* getZoomRegions: * getZoomRegions:
@@ -252,7 +249,7 @@ var Magnifier = new Lang.Class({
*/ */
getZoomRegions() { getZoomRegions() {
return this._zoomRegions; return this._zoomRegions;
}, }
/** /**
* clearAllZoomRegions: * clearAllZoomRegions:
@@ -265,7 +262,7 @@ var Magnifier = new Lang.Class({
this._zoomRegions.length = 0; this._zoomRegions.length = 0;
this.stopTrackingMouse(); this.stopTrackingMouse();
this.showSystemCursor(); this.showSystemCursor();
}, }
/** /**
* addCrosshairs: * addCrosshairs:
@@ -291,7 +288,7 @@ var Magnifier = new Lang.Class({
this._zoomRegions.forEach ((zoomRegion, index, array) => { this._zoomRegions.forEach ((zoomRegion, index, array) => {
zoomRegion.addCrosshairs(theCrossHairs); zoomRegion.addCrosshairs(theCrossHairs);
}); });
}, }
/** /**
* setCrosshairsVisible: * setCrosshairsVisible:
@@ -308,7 +305,7 @@ var Magnifier = new Lang.Class({
if (this._crossHairs) if (this._crossHairs)
this._crossHairs.hide(); this._crossHairs.hide();
} }
}, }
/** /**
* setCrosshairsColor: * setCrosshairsColor:
@@ -320,7 +317,7 @@ var Magnifier = new Lang.Class({
let [res, clutterColor] = Clutter.Color.from_string(color); let [res, clutterColor] = Clutter.Color.from_string(color);
this._crossHairs.setColor(clutterColor); this._crossHairs.setColor(clutterColor);
} }
}, }
/** /**
* getCrosshairsColor: * getCrosshairsColor:
@@ -334,7 +331,7 @@ var Magnifier = new Lang.Class({
} }
else else
return '#00000000'; return '#00000000';
}, }
/** /**
* setCrosshairsThickness: * setCrosshairsThickness:
@@ -345,7 +342,7 @@ var Magnifier = new Lang.Class({
setCrosshairsThickness(thickness) { setCrosshairsThickness(thickness) {
if (this._crossHairs) if (this._crossHairs)
this._crossHairs.setThickness(thickness); this._crossHairs.setThickness(thickness);
}, }
/** /**
* getCrosshairsThickness: * getCrosshairsThickness:
@@ -358,7 +355,7 @@ var Magnifier = new Lang.Class({
return this._crossHairs.getThickness(); return this._crossHairs.getThickness();
else else
return 0; return 0;
}, }
/** /**
* setCrosshairsOpacity: * setCrosshairsOpacity:
@@ -367,7 +364,7 @@ var Magnifier = new Lang.Class({
setCrosshairsOpacity(opacity) { setCrosshairsOpacity(opacity) {
if (this._crossHairs) if (this._crossHairs)
this._crossHairs.setOpacity(opacity * 255); this._crossHairs.setOpacity(opacity * 255);
}, }
/** /**
* getCrosshairsOpacity: * getCrosshairsOpacity:
@@ -378,7 +375,7 @@ var Magnifier = new Lang.Class({
return this._crossHairs.getOpacity() / 255.0; return this._crossHairs.getOpacity() / 255.0;
else else
return 0.0; return 0.0;
}, }
/** /**
* setCrosshairsLength: * setCrosshairsLength:
@@ -389,7 +386,7 @@ var Magnifier = new Lang.Class({
setCrosshairsLength(length) { setCrosshairsLength(length) {
if (this._crossHairs) if (this._crossHairs)
this._crossHairs.setLength(length); this._crossHairs.setLength(length);
}, }
/** /**
* getCrosshairsLength: * getCrosshairsLength:
@@ -402,7 +399,7 @@ var Magnifier = new Lang.Class({
return this._crossHairs.getLength(); return this._crossHairs.getLength();
else else
return 0; return 0;
}, }
/** /**
* setCrosshairsClip: * setCrosshairsClip:
@@ -420,7 +417,7 @@ var Magnifier = new Lang.Class({
if (this._crossHairs) if (this._crossHairs)
this._crossHairs.setClip([0, 0]); this._crossHairs.setClip([0, 0]);
} }
}, }
/** /**
* getCrosshairsClip: * getCrosshairsClip:
@@ -434,7 +431,7 @@ var Magnifier = new Lang.Class({
} }
else else
return false; return false;
}, }
//// Private methods //// //// Private methods ////
@@ -442,7 +439,7 @@ var Magnifier = new Lang.Class({
Shell.util_cursor_tracker_to_clutter(this._cursorTracker, this._mouseSprite); Shell.util_cursor_tracker_to_clutter(this._cursorTracker, this._mouseSprite);
let [xHot, yHot] = this._cursorTracker.get_hot(); let [xHot, yHot] = this._cursorTracker.get_hot();
this._mouseSprite.set_anchor_point(xHot, yHot); this._mouseSprite.set_anchor_point(xHot, yHot);
}, }
_settingsInit(zoomRegion) { _settingsInit(zoomRegion) {
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA }); this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
@@ -560,7 +557,7 @@ var Magnifier = new Lang.Class({
this.setCrosshairsVisible(showCrosshairs); this.setCrosshairsVisible(showCrosshairs);
return this._appSettings.get_boolean(SHOW_KEY); return this._appSettings.get_boolean(SHOW_KEY);
}, }
_updateScreenPosition() { _updateScreenPosition() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -570,7 +567,7 @@ var Magnifier = new Lang.Class({
if (position != GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN) if (position != GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN)
this._updateLensMode(); this._updateLensMode();
} }
}, }
_updateMagFactor() { _updateMagFactor() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -579,14 +576,14 @@ var Magnifier = new Lang.Class({
let magFactor = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2)); let magFactor = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2));
this._zoomRegions[0].setMagFactor(magFactor, magFactor); this._zoomRegions[0].setMagFactor(magFactor, magFactor);
} }
}, }
_updateLensMode() { _updateLensMode() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
if (this._zoomRegions.length) { if (this._zoomRegions.length) {
this._zoomRegions[0].setLensMode(this._settings.get_boolean(LENS_MODE_KEY)); this._zoomRegions[0].setLensMode(this._settings.get_boolean(LENS_MODE_KEY));
} }
}, }
_updateClampMode() { _updateClampMode() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -595,7 +592,7 @@ var Magnifier = new Lang.Class({
!this._settings.get_boolean(CLAMP_MODE_KEY) !this._settings.get_boolean(CLAMP_MODE_KEY)
); );
} }
}, }
_updateMouseTrackingMode() { _updateMouseTrackingMode() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -604,7 +601,7 @@ var Magnifier = new Lang.Class({
this._settings.get_enum(MOUSE_TRACKING_KEY) this._settings.get_enum(MOUSE_TRACKING_KEY)
); );
} }
}, }
_updateFocusTrackingMode() { _updateFocusTrackingMode() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -613,7 +610,7 @@ var Magnifier = new Lang.Class({
this._settings.get_enum(FOCUS_TRACKING_KEY) this._settings.get_enum(FOCUS_TRACKING_KEY)
); );
} }
}, }
_updateCaretTrackingMode() { _updateCaretTrackingMode() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -622,7 +619,7 @@ var Magnifier = new Lang.Class({
this._settings.get_enum(CARET_TRACKING_KEY) this._settings.get_enum(CARET_TRACKING_KEY)
); );
} }
}, }
_updateInvertLightness() { _updateInvertLightness() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -631,7 +628,7 @@ var Magnifier = new Lang.Class({
this._settings.get_boolean(INVERT_LIGHTNESS_KEY) this._settings.get_boolean(INVERT_LIGHTNESS_KEY)
); );
} }
}, }
_updateColorSaturation() { _updateColorSaturation() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -640,7 +637,7 @@ var Magnifier = new Lang.Class({
this._settings.get_double(COLOR_SATURATION_KEY) this._settings.get_double(COLOR_SATURATION_KEY)
); );
} }
}, }
_updateBrightness() { _updateBrightness() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -651,7 +648,7 @@ var Magnifier = new Lang.Class({
brightness.b = this._settings.get_double(BRIGHT_BLUE_KEY); brightness.b = this._settings.get_double(BRIGHT_BLUE_KEY);
this._zoomRegions[0].setBrightness(brightness); this._zoomRegions[0].setBrightness(brightness);
} }
}, }
_updateContrast() { _updateContrast() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@@ -663,13 +660,11 @@ var Magnifier = new Lang.Class({
this._zoomRegions[0].setContrast(contrast); this._zoomRegions[0].setContrast(contrast);
} }
} }
}); };
Signals.addSignalMethods(Magnifier.prototype); Signals.addSignalMethods(Magnifier.prototype);
var ZoomRegion = new Lang.Class({ var ZoomRegion = class ZoomRegion {
Name: 'ZoomRegion', constructor(magnifier, mouseSourceActor) {
_init(magnifier, mouseSourceActor) {
this._magnifier = magnifier; this._magnifier = magnifier;
this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker(); this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
@@ -715,7 +710,7 @@ var ZoomRegion = new Lang.Class({
this._updateCaret.bind(this)); this._updateCaret.bind(this));
this._focusCaretTracker.connect('focus-changed', this._focusCaretTracker.connect('focus-changed',
this._updateFocus.bind(this)); this._updateFocus.bind(this));
}, }
_updateFocus(caller, event) { _updateFocus(caller, event) {
let component = event.source.get_component_iface(); let component = event.source.get_component_iface();
@@ -732,7 +727,7 @@ var ZoomRegion = new Lang.Class({
[this._xFocus, this._yFocus] = [extents.x + (extents.width / 2), [this._xFocus, this._yFocus] = [extents.x + (extents.width / 2),
extents.y + (extents.height / 2)]; extents.y + (extents.height / 2)];
this._centerFromFocusPosition(); this._centerFromFocusPosition();
}, }
_updateCaret(caller, event) { _updateCaret(caller, event) {
let text = event.source.get_text_iface(); let text = event.source.get_text_iface();
@@ -748,7 +743,7 @@ var ZoomRegion = new Lang.Class({
[this._xCaret, this._yCaret] = [extents.x, extents.y]; [this._xCaret, this._yCaret] = [extents.x, extents.y];
this._centerFromCaretPosition(); this._centerFromCaretPosition();
}, }
/** /**
* setActive: * setActive:
@@ -771,7 +766,7 @@ var ZoomRegion = new Lang.Class({
this._syncCaretTracking(); this._syncCaretTracking();
this._syncFocusTracking(); this._syncFocusTracking();
}, }
/** /**
* isActive: * isActive:
@@ -779,7 +774,7 @@ var ZoomRegion = new Lang.Class({
*/ */
isActive() { isActive() {
return this._magView != null; return this._magView != null;
}, }
/** /**
* setMagFactor: * setMagFactor:
@@ -793,7 +788,7 @@ var ZoomRegion = new Lang.Class({
this._changeROI({ xMagFactor: xMagFactor, this._changeROI({ xMagFactor: xMagFactor,
yMagFactor: yMagFactor, yMagFactor: yMagFactor,
redoCursorTracking: this._followingCursor }); redoCursorTracking: this._followingCursor });
}, }
/** /**
* getMagFactor: * getMagFactor:
@@ -804,7 +799,7 @@ var ZoomRegion = new Lang.Class({
*/ */
getMagFactor() { getMagFactor() {
return [this._xMagFactor, this._yMagFactor]; return [this._xMagFactor, this._yMagFactor];
}, }
/** /**
* setMouseTrackingMode * setMouseTrackingMode
@@ -814,7 +809,7 @@ var ZoomRegion = new Lang.Class({
if (mode >= GDesktopEnums.MagnifierMouseTrackingMode.NONE && if (mode >= GDesktopEnums.MagnifierMouseTrackingMode.NONE &&
mode <= GDesktopEnums.MagnifierMouseTrackingMode.PUSH) mode <= GDesktopEnums.MagnifierMouseTrackingMode.PUSH)
this._mouseTrackingMode = mode; this._mouseTrackingMode = mode;
}, }
/** /**
* getMouseTrackingMode * getMouseTrackingMode
@@ -822,7 +817,7 @@ var ZoomRegion = new Lang.Class({
*/ */
getMouseTrackingMode() { getMouseTrackingMode() {
return this._mouseTrackingMode; return this._mouseTrackingMode;
}, }
/** /**
* setFocusTrackingMode * setFocusTrackingMode
@@ -831,7 +826,7 @@ var ZoomRegion = new Lang.Class({
setFocusTrackingMode(mode) { setFocusTrackingMode(mode) {
this._focusTrackingMode = mode; this._focusTrackingMode = mode;
this._syncFocusTracking(); this._syncFocusTracking();
}, }
/** /**
* setCaretTrackingMode * setCaretTrackingMode
@@ -840,7 +835,7 @@ var ZoomRegion = new Lang.Class({
setCaretTrackingMode(mode) { setCaretTrackingMode(mode) {
this._caretTrackingMode = mode; this._caretTrackingMode = mode;
this._syncCaretTracking(); this._syncCaretTracking();
}, }
_syncFocusTracking() { _syncFocusTracking() {
let enabled = this._focusTrackingMode != GDesktopEnums.MagnifierFocusTrackingMode.NONE && let enabled = this._focusTrackingMode != GDesktopEnums.MagnifierFocusTrackingMode.NONE &&
@@ -850,7 +845,7 @@ var ZoomRegion = new Lang.Class({
this._focusCaretTracker.registerFocusListener(); this._focusCaretTracker.registerFocusListener();
else else
this._focusCaretTracker.deregisterFocusListener(); this._focusCaretTracker.deregisterFocusListener();
}, }
_syncCaretTracking() { _syncCaretTracking() {
let enabled = this._caretTrackingMode != GDesktopEnums.MagnifierCaretTrackingMode.NONE && let enabled = this._caretTrackingMode != GDesktopEnums.MagnifierCaretTrackingMode.NONE &&
@@ -860,7 +855,7 @@ var ZoomRegion = new Lang.Class({
this._focusCaretTracker.registerCaretListener(); this._focusCaretTracker.registerCaretListener();
else else
this._focusCaretTracker.deregisterCaretListener(); this._focusCaretTracker.deregisterCaretListener();
}, }
/** /**
* setViewPort * setViewPort
@@ -872,7 +867,7 @@ var ZoomRegion = new Lang.Class({
setViewPort(viewPort) { setViewPort(viewPort) {
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.NONE; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.NONE;
}, }
/** /**
* setROI * setROI
@@ -890,7 +885,7 @@ var ZoomRegion = new Lang.Class({
yMagFactor: this._viewPortHeight / roi.height, yMagFactor: this._viewPortHeight / roi.height,
xCenter: roi.x + roi.width / 2, xCenter: roi.x + roi.width / 2,
yCenter: roi.y + roi.height / 2 }); yCenter: roi.y + roi.height / 2 });
}, }
/** /**
* getROI: * getROI:
@@ -907,7 +902,7 @@ var ZoomRegion = new Lang.Class({
return [this._xCenter - roiWidth / 2, return [this._xCenter - roiWidth / 2,
this._yCenter - roiHeight / 2, this._yCenter - roiHeight / 2,
roiWidth, roiHeight]; roiWidth, roiHeight];
}, }
/** /**
* setLensMode: * setLensMode:
@@ -919,7 +914,7 @@ var ZoomRegion = new Lang.Class({
this._lensMode = lensMode; this._lensMode = lensMode;
if (!this._lensMode) if (!this._lensMode)
this.setScreenPosition (this._screenPosition); this.setScreenPosition (this._screenPosition);
}, }
/** /**
* isLensMode: * isLensMode:
@@ -928,7 +923,7 @@ var ZoomRegion = new Lang.Class({
*/ */
isLensMode() { isLensMode() {
return this._lensMode; return this._lensMode;
}, }
/** /**
* setClampScrollingAtEdges: * setClampScrollingAtEdges:
@@ -940,7 +935,7 @@ var ZoomRegion = new Lang.Class({
this._clampScrollingAtEdges = clamp; this._clampScrollingAtEdges = clamp;
if (clamp) if (clamp)
this._changeROI(); this._changeROI();
}, }
/** /**
* setTopHalf: * setTopHalf:
@@ -954,7 +949,7 @@ var ZoomRegion = new Lang.Class({
viewPort.height = global.screen_height/2; viewPort.height = global.screen_height/2;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF;
}, }
/** /**
* setBottomHalf: * setBottomHalf:
@@ -968,7 +963,7 @@ var ZoomRegion = new Lang.Class({
viewPort.height = global.screen_height/2; viewPort.height = global.screen_height/2;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF;
}, }
/** /**
* setLeftHalf: * setLeftHalf:
@@ -982,7 +977,7 @@ var ZoomRegion = new Lang.Class({
viewPort.height = global.screen_height; viewPort.height = global.screen_height;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF;
}, }
/** /**
* setRightHalf: * setRightHalf:
@@ -996,7 +991,7 @@ var ZoomRegion = new Lang.Class({
viewPort.height = global.screen_height; viewPort.height = global.screen_height;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF;
}, }
/** /**
* setFullScreenMode: * setFullScreenMode:
@@ -1012,7 +1007,7 @@ var ZoomRegion = new Lang.Class({
this.setViewPort(viewPort); this.setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN;
}, }
/** /**
* setScreenPosition: * setScreenPosition:
@@ -1040,7 +1035,7 @@ var ZoomRegion = new Lang.Class({
this.setRightHalf(); this.setRightHalf();
break; break;
} }
}, }
/** /**
* getScreenPosition: * getScreenPosition:
@@ -1050,7 +1045,7 @@ var ZoomRegion = new Lang.Class({
*/ */
getScreenPosition() { getScreenPosition() {
return this._screenPosition; return this._screenPosition;
}, }
/** /**
* scrollToMousePos: * scrollToMousePos:
@@ -1066,14 +1061,14 @@ var ZoomRegion = new Lang.Class({
// Determine whether the system mouse pointer is over this zoom region. // Determine whether the system mouse pointer is over this zoom region.
return this._isMouseOverRegion(); return this._isMouseOverRegion();
}, }
_clearScrollContentsTimer() { _clearScrollContentsTimer() {
if (this._scrollContentsTimerId != 0) { if (this._scrollContentsTimerId != 0) {
Mainloop.source_remove(this._scrollContentsTimerId); Mainloop.source_remove(this._scrollContentsTimerId);
this._scrollContentsTimerId = 0; this._scrollContentsTimerId = 0;
} }
}, }
_scrollContentsToDelayed(x, y) { _scrollContentsToDelayed(x, y) {
if (this._pointerIdleMonitor.get_idletime() >= POINTER_REST_TIME) { if (this._pointerIdleMonitor.get_idletime() >= POINTER_REST_TIME) {
@@ -1086,7 +1081,7 @@ var ZoomRegion = new Lang.Class({
this._scrollContentsToDelayed(x, y); this._scrollContentsToDelayed(x, y);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
}, }
/** /**
* scrollContentsTo: * scrollContentsTo:
@@ -1101,7 +1096,7 @@ var ZoomRegion = new Lang.Class({
this._followingCursor = false; this._followingCursor = false;
this._changeROI({ xCenter: x, this._changeROI({ xCenter: x,
yCenter: y }); yCenter: y });
}, }
/** /**
* addCrosshairs: * addCrosshairs:
@@ -1116,7 +1111,7 @@ var ZoomRegion = new Lang.Class({
if (crossHairs && this.isActive()) { if (crossHairs && this.isActive()) {
this._crossHairsActor = crossHairs.addToZoomRegion(this, this._mouseActor); this._crossHairsActor = crossHairs.addToZoomRegion(this, this._mouseActor);
} }
}, }
/** /**
* setInvertLightness: * setInvertLightness:
@@ -1127,7 +1122,7 @@ var ZoomRegion = new Lang.Class({
this._invertLightness = flag; this._invertLightness = flag;
if (this._magShaderEffects) if (this._magShaderEffects)
this._magShaderEffects.setInvertLightness(this._invertLightness); this._magShaderEffects.setInvertLightness(this._invertLightness);
}, }
/** /**
* getInvertLightness: * getInvertLightness:
@@ -1136,7 +1131,7 @@ var ZoomRegion = new Lang.Class({
*/ */
getInvertLightness() { getInvertLightness() {
return this._invertLightness; return this._invertLightness;
}, }
/** /**
* setColorSaturation: * setColorSaturation:
@@ -1149,7 +1144,7 @@ var ZoomRegion = new Lang.Class({
this._colorSaturation = saturation; this._colorSaturation = saturation;
if (this._magShaderEffects) if (this._magShaderEffects)
this._magShaderEffects.setColorSaturation(this._colorSaturation); this._magShaderEffects.setColorSaturation(this._colorSaturation);
}, }
/** /**
* getColorSaturation: * getColorSaturation:
@@ -1157,7 +1152,7 @@ var ZoomRegion = new Lang.Class({
*/ */
getColorSaturation() { getColorSaturation() {
return this._colorSaturation; return this._colorSaturation;
}, }
/** /**
* setBrightness: * setBrightness:
@@ -1173,7 +1168,7 @@ var ZoomRegion = new Lang.Class({
this._brightness.b = brightness.b; this._brightness.b = brightness.b;
if (this._magShaderEffects) if (this._magShaderEffects)
this._magShaderEffects.setBrightness(this._brightness); this._magShaderEffects.setBrightness(this._brightness);
}, }
/** /**
* setContrast: * setContrast:
@@ -1189,7 +1184,7 @@ var ZoomRegion = new Lang.Class({
this._contrast.b = contrast.b; this._contrast.b = contrast.b;
if (this._magShaderEffects) if (this._magShaderEffects)
this._magShaderEffects.setContrast(this._contrast); this._magShaderEffects.setContrast(this._contrast);
}, }
/** /**
* getContrast: * getContrast:
@@ -1203,7 +1198,7 @@ var ZoomRegion = new Lang.Class({
contrast.g = this._contrast.g; contrast.g = this._contrast.g;
contrast.b = this._contrast.b; contrast.b = this._contrast.b;
return contrast; return contrast;
}, }
//// Private methods //// //// Private methods ////
@@ -1249,7 +1244,7 @@ var ZoomRegion = new Lang.Class({
this._magShaderEffects.setInvertLightness(this._invertLightness); this._magShaderEffects.setInvertLightness(this._invertLightness);
this._magShaderEffects.setBrightness(this._brightness); this._magShaderEffects.setBrightness(this._brightness);
this._magShaderEffects.setContrast(this._contrast); this._magShaderEffects.setContrast(this._contrast);
}, }
_destroyActors() { _destroyActors() {
if (this._mouseActor == this._mouseSourceActor) if (this._mouseActor == this._mouseSourceActor)
@@ -1265,7 +1260,7 @@ var ZoomRegion = new Lang.Class({
this._uiGroupClone = null; this._uiGroupClone = null;
this._mouseActor = null; this._mouseActor = null;
this._crossHairsActor = null; this._crossHairsActor = null;
}, }
_setViewPort(viewPort, fromROIUpdate) { _setViewPort(viewPort, fromROIUpdate) {
// Sets the position of the zoom region on the screen // Sets the position of the zoom region on the screen
@@ -1290,7 +1285,7 @@ var ZoomRegion = new Lang.Class({
if (this.isActive() && this._isMouseOverRegion()) if (this.isActive() && this._isMouseOverRegion())
this._magnifier.hideSystemCursor(); this._magnifier.hideSystemCursor();
}, }
_changeROI(params) { _changeROI(params) {
// Updates the area we are viewing; the magnification factors // Updates the area we are viewing; the magnification factors
@@ -1341,7 +1336,7 @@ var ZoomRegion = new Lang.Class({
this._updateCloneGeometry(); this._updateCloneGeometry();
this._updateMousePosition(); this._updateMousePosition();
}, }
_isMouseOverRegion() { _isMouseOverRegion() {
// Return whether the system mouse sprite is over this ZoomRegion. If the // Return whether the system mouse sprite is over this ZoomRegion. If the
@@ -1357,7 +1352,7 @@ var ZoomRegion = new Lang.Class({
); );
} }
return mouseIsOver; return mouseIsOver;
}, }
_isFullScreen() { _isFullScreen() {
// Does the magnified view occupy the whole screen? Note that this // Does the magnified view occupy the whole screen? Note that this
@@ -1370,7 +1365,7 @@ var ZoomRegion = new Lang.Class({
this._viewPortHeight != global.screen_height) this._viewPortHeight != global.screen_height)
return false; return false;
return true; return true;
}, }
_centerFromMousePosition() { _centerFromMousePosition() {
// Determines where the center should be given the current cursor // Determines where the center should be given the current cursor
@@ -1390,7 +1385,7 @@ var ZoomRegion = new Lang.Class({
} }
return null; // Should never be hit return null; // Should never be hit
}, }
_centerFromCaretPosition() { _centerFromCaretPosition() {
let xCaret = this._xCaret; let xCaret = this._xCaret;
@@ -1404,7 +1399,7 @@ var ZoomRegion = new Lang.Class({
[xCaret, yCaret] = this._centerFromPointCentered(xCaret, yCaret); [xCaret, yCaret] = this._centerFromPointCentered(xCaret, yCaret);
this._scrollContentsToDelayed(xCaret, yCaret); this._scrollContentsToDelayed(xCaret, yCaret);
}, }
_centerFromFocusPosition() { _centerFromFocusPosition() {
let xFocus = this._xFocus; let xFocus = this._xFocus;
@@ -1418,7 +1413,7 @@ var ZoomRegion = new Lang.Class({
[xFocus, yFocus] = this._centerFromPointCentered(xFocus, yFocus); [xFocus, yFocus] = this._centerFromPointCentered(xFocus, yFocus);
this._scrollContentsToDelayed(xFocus, yFocus); this._scrollContentsToDelayed(xFocus, yFocus);
}, }
_centerFromPointPush(xPoint, yPoint) { _centerFromPointPush(xPoint, yPoint) {
let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI(); let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI();
@@ -1439,7 +1434,7 @@ var ZoomRegion = new Lang.Class({
yPos += (yPoint - yRoiBottom); yPos += (yPoint - yRoiBottom);
return [xPos, yPos]; return [xPos, yPos];
}, }
_centerFromPointProportional(xPoint, yPoint) { _centerFromPointProportional(xPoint, yPoint) {
let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI(); let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI();
@@ -1456,18 +1451,18 @@ var ZoomRegion = new Lang.Class({
let yPos = yPoint - yProportion * (heightRoi /2 - yPadding); let yPos = yPoint - yProportion * (heightRoi /2 - yPadding);
return [xPos, yPos]; return [xPos, yPos];
}, }
_centerFromPointCentered(xPoint, yPoint) { _centerFromPointCentered(xPoint, yPoint) {
return [xPoint, yPoint]; return [xPoint, yPoint];
}, }
_screenToViewPort(screenX, screenY) { _screenToViewPort(screenX, screenY) {
// Converts coordinates relative to the (unmagnified) screen to coordinates // Converts coordinates relative to the (unmagnified) screen to coordinates
// relative to the origin of this._magView // relative to the origin of this._magView
return [this._viewPortWidth / 2 + (screenX - this._xCenter) * this._xMagFactor, return [this._viewPortWidth / 2 + (screenX - this._xCenter) * this._xMagFactor,
this._viewPortHeight / 2 + (screenY - this._yCenter) * this._yMagFactor]; this._viewPortHeight / 2 + (screenY - this._yCenter) * this._yMagFactor];
}, }
_updateMagViewGeometry() { _updateMagViewGeometry() {
if (!this.isActive()) if (!this.isActive())
@@ -1480,7 +1475,7 @@ var ZoomRegion = new Lang.Class({
this._magView.set_size(this._viewPortWidth, this._viewPortHeight); this._magView.set_size(this._viewPortWidth, this._viewPortHeight);
this._magView.set_position(this._viewPortX, this._viewPortY); this._magView.set_position(this._viewPortX, this._viewPortY);
}, }
_updateCloneGeometry() { _updateCloneGeometry() {
if (!this.isActive()) if (!this.isActive())
@@ -1493,7 +1488,7 @@ var ZoomRegion = new Lang.Class({
this._uiGroupClone.set_position(Math.round(x), Math.round(y)); this._uiGroupClone.set_position(Math.round(x), Math.round(y));
this._updateMousePosition(); this._updateMousePosition();
}, }
_updateMousePosition() { _updateMousePosition() {
if (!this.isActive()) if (!this.isActive())
@@ -1512,7 +1507,7 @@ var ZoomRegion = new Lang.Class({
this._crossHairsActor.set_position(xMagMouse - groupWidth / 2, this._crossHairsActor.set_position(xMagMouse - groupWidth / 2,
yMagMouse - groupHeight / 2); yMagMouse - groupHeight / 2);
} }
}, }
_monitorsChanged() { _monitorsChanged() {
if (!this.isActive()) if (!this.isActive())
@@ -1528,12 +1523,10 @@ var ZoomRegion = new Lang.Class({
else else
this.setScreenPosition(this._screenPosition); this.setScreenPosition(this._screenPosition);
} }
}); };
var Crosshairs = new Lang.Class({ var Crosshairs = class Crosshairs {
Name: 'Crosshairs', constructor() {
_init() {
// Set the group containing the crosshairs to three times the desktop // Set the group containing the crosshairs to three times the desktop
// size in case the crosshairs need to appear to be infinite in // size in case the crosshairs need to appear to be infinite in
@@ -1560,12 +1553,12 @@ var Crosshairs = new Lang.Class({
Main.layoutManager.connect('monitors-changed', Main.layoutManager.connect('monitors-changed',
this._monitorsChanged.bind(this)); this._monitorsChanged.bind(this));
}, }
_monitorsChanged() { _monitorsChanged() {
this._actor.set_size(global.screen_width * 3, global.screen_height * 3); this._actor.set_size(global.screen_width * 3, global.screen_height * 3);
this.reCenter(); this.reCenter();
}, }
/** /**
* addToZoomRegion * addToZoomRegion
@@ -1599,7 +1592,7 @@ var Crosshairs = new Lang.Class({
} }
} }
return crosshairsActor; return crosshairsActor;
}, }
/** /**
* removeFromParent: * removeFromParent:
@@ -1612,7 +1605,7 @@ var Crosshairs = new Lang.Class({
childActor.get_parent().remove_actor(childActor); childActor.get_parent().remove_actor(childActor);
else else
childActor.destroy(); childActor.destroy();
}, }
/** /**
* setColor: * setColor:
@@ -1624,7 +1617,7 @@ var Crosshairs = new Lang.Class({
this._horizRightHair.background_color = clutterColor; this._horizRightHair.background_color = clutterColor;
this._vertTopHair.background_color = clutterColor; this._vertTopHair.background_color = clutterColor;
this._vertBottomHair.background_color = clutterColor; this._vertBottomHair.background_color = clutterColor;
}, }
/** /**
* getColor: * getColor:
@@ -1633,7 +1626,7 @@ var Crosshairs = new Lang.Class({
*/ */
getColor() { getColor() {
return this._horizLeftHair.get_color(); return this._horizLeftHair.get_color();
}, }
/** /**
* setThickness: * setThickness:
@@ -1646,7 +1639,7 @@ var Crosshairs = new Lang.Class({
this._vertTopHair.set_width(thickness); this._vertTopHair.set_width(thickness);
this._vertBottomHair.set_width(thickness); this._vertBottomHair.set_width(thickness);
this.reCenter(); this.reCenter();
}, }
/** /**
* getThickness: * getThickness:
@@ -1655,7 +1648,7 @@ var Crosshairs = new Lang.Class({
*/ */
getThickness() { getThickness() {
return this._horizLeftHair.get_height(); return this._horizLeftHair.get_height();
}, }
/** /**
* setOpacity: * setOpacity:
@@ -1674,7 +1667,7 @@ var Crosshairs = new Lang.Class({
this._horizRightHair.set_opacity(opacity); this._horizRightHair.set_opacity(opacity);
this._vertTopHair.set_opacity(opacity); this._vertTopHair.set_opacity(opacity);
this._vertBottomHair.set_opacity(opacity); this._vertBottomHair.set_opacity(opacity);
}, }
/** /**
* setLength: * setLength:
@@ -1687,7 +1680,7 @@ var Crosshairs = new Lang.Class({
this._vertTopHair.set_height(length); this._vertTopHair.set_height(length);
this._vertBottomHair.set_height(length); this._vertBottomHair.set_height(length);
this.reCenter(); this.reCenter();
}, }
/** /**
* getLength: * getLength:
@@ -1696,7 +1689,7 @@ var Crosshairs = new Lang.Class({
*/ */
getLength() { getLength() {
return this._horizLeftHair.get_width(); return this._horizLeftHair.get_width();
}, }
/** /**
* setClip: * setClip:
@@ -1717,7 +1710,7 @@ var Crosshairs = new Lang.Class({
this._clipSize = [0, 0]; this._clipSize = [0, 0];
this.reCenter(); this.reCenter();
} }
}, }
/** /**
* show: * show:
@@ -1728,7 +1721,7 @@ var Crosshairs = new Lang.Class({
// Clones don't share visibility. // Clones don't share visibility.
for (let i = 0; i < this._clones.length; i++) for (let i = 0; i < this._clones.length; i++)
this._clones[i].show(); this._clones[i].show();
}, }
/** /**
* hide: * hide:
@@ -1739,7 +1732,7 @@ var Crosshairs = new Lang.Class({
// Clones don't share visibility. // Clones don't share visibility.
for (let i = 0; i < this._clones.length; i++) for (let i = 0; i < this._clones.length; i++)
this._clones[i].hide(); this._clones[i].hide();
}, }
/** /**
* reCenter: * reCenter:
@@ -1773,12 +1766,10 @@ var Crosshairs = new Lang.Class({
this._vertTopHair.set_position((groupWidth - thickness) / 2, top); this._vertTopHair.set_position((groupWidth - thickness) / 2, top);
this._vertBottomHair.set_position((groupWidth - thickness) / 2, bottom); this._vertBottomHair.set_position((groupWidth - thickness) / 2, bottom);
} }
}); };
var MagShaderEffects = new Lang.Class({ var MagShaderEffects = class MagShaderEffects {
Name: 'MagShaderEffects', constructor(uiGroupClone) {
_init(uiGroupClone) {
this._inverse = new Shell.InvertLightnessEffect(); this._inverse = new Shell.InvertLightnessEffect();
this._brightnessContrast = new Clutter.BrightnessContrastEffect(); this._brightnessContrast = new Clutter.BrightnessContrastEffect();
this._colorDesaturation = new Clutter.DesaturateEffect(); this._colorDesaturation = new Clutter.DesaturateEffect();
@@ -1789,7 +1780,7 @@ var MagShaderEffects = new Lang.Class({
this._magView.add_effect(this._inverse); this._magView.add_effect(this._inverse);
this._magView.add_effect(this._brightnessContrast); this._magView.add_effect(this._brightnessContrast);
this._magView.add_effect(this._colorDesaturation); this._magView.add_effect(this._colorDesaturation);
}, }
/** /**
* destroyEffects: * destroyEffects:
@@ -1803,7 +1794,7 @@ var MagShaderEffects = new Lang.Class({
this._brightnessContrast = null; this._brightnessContrast = null;
this._inverse = null; this._inverse = null;
this._magView = null; this._magView = null;
}, }
/** /**
* setInvertLightness: * setInvertLightness:
@@ -1812,11 +1803,11 @@ var MagShaderEffects = new Lang.Class({
*/ */
setInvertLightness(invertFlag) { setInvertLightness(invertFlag) {
this._inverse.set_enabled(invertFlag); this._inverse.set_enabled(invertFlag);
}, }
setColorSaturation(factor) { setColorSaturation(factor) {
this._colorDesaturation.set_factor(1.0 - factor); this._colorDesaturation.set_factor(1.0 - factor);
}, }
/** /**
* setBrightness: * setBrightness:
@@ -1840,7 +1831,7 @@ var MagShaderEffects = new Lang.Class({
(bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE || (bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE ||
cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE) cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE)
); );
}, }
/** /**
* Set the contrast of the magnified view. * Set the contrast of the magnified view.
@@ -1865,5 +1856,5 @@ var MagShaderEffects = new Lang.Class({
cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE || cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
); );
}, }
}); };

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Main = imports.ui.main; const Main = imports.ui.main;
const { loadInterfaceXML } = imports.misc.fileUtils; const { loadInterfaceXML } = imports.misc.fileUtils;
@@ -22,15 +21,13 @@ const ZoomRegionIface = loadInterfaceXML('org.gnome.Magnifier.ZoomRegion');
// '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc. // '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc.
let _zoomRegionInstanceCount = 0; let _zoomRegionInstanceCount = 0;
var ShellMagnifier = new Lang.Class({ var ShellMagnifier = class ShellMagnifier {
Name: 'ShellMagnifier', constructor() {
_init() {
this._zoomers = {}; this._zoomers = {};
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this);
this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH); this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH);
}, }
/** /**
* setActive: * setActive:
@@ -38,7 +35,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
setActive(activate) { setActive(activate) {
Main.magnifier.setActive(activate); Main.magnifier.setActive(activate);
}, }
/** /**
* isActive: * isActive:
@@ -46,7 +43,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
isActive() { isActive() {
return Main.magnifier.isActive(); return Main.magnifier.isActive();
}, }
/** /**
* showCursor: * showCursor:
@@ -54,7 +51,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
showCursor() { showCursor() {
Main.magnifier.showSystemCursor(); Main.magnifier.showSystemCursor();
}, }
/** /**
* hideCursor: * hideCursor:
@@ -62,7 +59,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
hideCursor() { hideCursor() {
Main.magnifier.hideSystemCursor(); Main.magnifier.hideSystemCursor();
}, }
/** /**
* createZoomRegion: * createZoomRegion:
@@ -97,7 +94,7 @@ var ShellMagnifier = new Lang.Class({
proxyAndZoomRegion.zoomRegion = realZoomRegion; proxyAndZoomRegion.zoomRegion = realZoomRegion;
this._zoomers[objectPath] = proxyAndZoomRegion; this._zoomers[objectPath] = proxyAndZoomRegion;
return objectPath; return objectPath;
}, }
/** /**
* addZoomRegion: * addZoomRegion:
@@ -112,7 +109,7 @@ var ShellMagnifier = new Lang.Class({
} }
else else
return false; return false;
}, }
/** /**
* getZoomRegions: * getZoomRegions:
@@ -150,7 +147,7 @@ var ShellMagnifier = new Lang.Class({
} }
}); });
return objectPaths; return objectPaths;
}, }
/** /**
* clearAllZoomRegions: * clearAllZoomRegions:
@@ -166,7 +163,7 @@ var ShellMagnifier = new Lang.Class({
delete this._zoomers[objectPath]; delete this._zoomers[objectPath];
} }
this._zoomers = {}; this._zoomers = {};
}, }
/** /**
* fullScreenCapable: * fullScreenCapable:
@@ -175,7 +172,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
fullScreenCapable() { fullScreenCapable() {
return true; return true;
}, }
/** /**
* setCrosswireSize: * setCrosswireSize:
@@ -184,7 +181,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
setCrosswireSize(size) { setCrosswireSize(size) {
Main.magnifier.setCrosshairsThickness(size); Main.magnifier.setCrosshairsThickness(size);
}, }
/** /**
* getCrosswireSize: * getCrosswireSize:
@@ -193,7 +190,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
getCrosswireSize() { getCrosswireSize() {
return Main.magnifier.getCrosshairsThickness(); return Main.magnifier.getCrosshairsThickness();
}, }
/** /**
* setCrosswireLength: * setCrosswireLength:
@@ -202,7 +199,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
setCrosswireLength(length) { setCrosswireLength(length) {
Main.magnifier.setCrosshairsLength(length); Main.magnifier.setCrosshairsLength(length);
}, }
/** /**
* setCrosswireSize: * setCrosswireSize:
@@ -211,7 +208,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
getCrosswireLength() { getCrosswireLength() {
return Main.magnifier.getCrosshairsLength(); return Main.magnifier.getCrosshairsLength();
}, }
/** /**
* setCrosswireClip: * setCrosswireClip:
@@ -220,7 +217,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
setCrosswireClip(clip) { setCrosswireClip(clip) {
Main.magnifier.setCrosshairsClip(clip); Main.magnifier.setCrosshairsClip(clip);
}, }
/** /**
* getCrosswireClip: * getCrosswireClip:
@@ -229,7 +226,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
getCrosswireClip() { getCrosswireClip() {
return Main.magnifier.getCrosshairsClip(); return Main.magnifier.getCrosshairsClip();
}, }
/** /**
* setCrosswireColor: * setCrosswireColor:
@@ -238,7 +235,7 @@ var ShellMagnifier = new Lang.Class({
*/ */
setCrosswireColor(color) { setCrosswireColor(color) {
Main.magnifier.setCrosshairsColor('#%08x'.format(color)); Main.magnifier.setCrosshairsColor('#%08x'.format(color));
}, }
/** /**
* getCrosswireClip: * getCrosswireClip:
@@ -250,7 +247,7 @@ var ShellMagnifier = new Lang.Class({
// Drop the leading '#'. // Drop the leading '#'.
return parseInt(colorString.slice(1), 16); return parseInt(colorString.slice(1), 16);
} }
}); };
/** /**
* ShellMagnifierZoomRegion: * ShellMagnifierZoomRegion:
@@ -258,15 +255,13 @@ var ShellMagnifier = new Lang.Class({
* @zoomerObjectPath: String that is the path to a DBus ZoomRegion. * @zoomerObjectPath: String that is the path to a DBus ZoomRegion.
* @zoomRegion: The actual zoom region associated with the object path. * @zoomRegion: The actual zoom region associated with the object path.
*/ */
var ShellMagnifierZoomRegion = new Lang.Class({ var ShellMagnifierZoomRegion = class ShellMagnifierZoomRegion {
Name: 'ShellMagnifierZoomRegion', constructor(zoomerObjectPath, zoomRegion) {
_init(zoomerObjectPath, zoomRegion) {
this._zoomRegion = zoomRegion; this._zoomRegion = zoomRegion;
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this);
this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath); this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath);
}, }
/** /**
* setMagFactor: * setMagFactor:
@@ -278,7 +273,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
*/ */
setMagFactor(xMagFactor, yMagFactor) { setMagFactor(xMagFactor, yMagFactor) {
this._zoomRegion.setMagFactor(xMagFactor, yMagFactor); this._zoomRegion.setMagFactor(xMagFactor, yMagFactor);
}, }
/** /**
* getMagFactor: * getMagFactor:
@@ -289,7 +284,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
*/ */
getMagFactor() { getMagFactor() {
return this._zoomRegion.getMagFactor(); return this._zoomRegion.getMagFactor();
}, }
/** /**
* setRoi: * setRoi:
@@ -301,7 +296,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
setRoi(roi) { setRoi(roi) {
let roiObject = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] }; let roiObject = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] };
this._zoomRegion.setROI(roiObject); this._zoomRegion.setROI(roiObject);
}, }
/** /**
* getRoi: * getRoi:
@@ -316,7 +311,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
roi[2] += roi[0]; roi[2] += roi[0];
roi[3] += roi[1]; roi[3] += roi[1];
return roi; return roi;
}, }
/** /**
* Set the "region of interest" by centering the given screen coordinate * Set the "region of interest" by centering the given screen coordinate
@@ -329,7 +324,7 @@ var ShellMagnifierZoomRegion = new Lang.Class({
shiftContentsTo(x, y) { shiftContentsTo(x, y) {
this._zoomRegion.scrollContentsTo(x, y); this._zoomRegion.scrollContentsTo(x, y);
return true; return true;
}, }
/** /**
* moveResize * moveResize
@@ -340,9 +335,9 @@ var ShellMagnifierZoomRegion = new Lang.Class({
moveResize(viewPort) { moveResize(viewPort) {
let viewRect = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] }; let viewRect = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] };
this._zoomRegion.setViewPort(viewRect); this._zoomRegion.setViewPort(viewRect);
}, }
destroy() { destroy() {
this._dbusImpl.unexport(); this._dbusImpl.unexport();
} }
}); };

View File

@@ -5,7 +5,6 @@ const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -700,15 +699,12 @@ function queueDeferredWork(workId) {
} }
} }
var RestartMessage = new Lang.Class({ var RestartMessage = class extends ModalDialog.ModalDialog {
Name: 'RestartMessage', constructor(message) {
Extends: ModalDialog.ModalDialog, super({ shellReactive: true,
styleClass: 'restart-message headline',
_init(message) { shouldFadeIn: false,
this.parent({ shellReactive: true, destroyOnClose: true });
styleClass: 'restart-message headline',
shouldFadeIn: false,
destroyOnClose: true });
let label = new St.Label({ text: message }); let label = new St.Label({ text: message });
@@ -718,7 +714,7 @@ var RestartMessage = new Lang.Class({
y_align: St.Align.MIDDLE }); y_align: St.Align.MIDDLE });
this.buttonLayout.hide(); this.buttonLayout.hide();
} }
}); };
function showRestartMessage(message) { function showRestartMessage(message) {
let restartMessage = new RestartMessage(message); let restartMessage = new RestartMessage(message);

View File

@@ -3,7 +3,6 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
@@ -40,10 +39,8 @@ function _fixMarkup(text, allowMarkup) {
return GLib.markup_escape_text(text, -1); return GLib.markup_escape_text(text, -1);
} }
var URLHighlighter = new Lang.Class({ var URLHighlighter = class URLHighlighter {
Name: 'URLHighlighter', constructor(text, lineWrap, allowMarkup) {
_init(text, lineWrap, allowMarkup) {
if (!text) if (!text)
text = ''; text = '';
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter', this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter',
@@ -114,7 +111,7 @@ var URLHighlighter = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });
}, }
setMarkup(text, allowMarkup) { setMarkup(text, allowMarkup) {
text = text ? _fixMarkup(text, allowMarkup) : ''; text = text ? _fixMarkup(text, allowMarkup) : '';
@@ -124,7 +121,7 @@ var URLHighlighter = new Lang.Class({
/* clutter_text.text contain text without markup */ /* clutter_text.text contain text without markup */
this._urls = Util.findUrls(this.actor.clutter_text.text); this._urls = Util.findUrls(this.actor.clutter_text.text);
this._highlightUrls(); this._highlightUrls();
}, }
_highlightUrls() { _highlightUrls() {
// text here contain markup // text here contain markup
@@ -139,7 +136,7 @@ var URLHighlighter = new Lang.Class({
} }
markup += this._text.substr(pos); markup += this._text.substr(pos);
this.actor.clutter_text.set_markup(markup); this.actor.clutter_text.set_markup(markup);
}, }
_findUrlAtPos(event) { _findUrlAtPos(event) {
let success; let success;
@@ -160,16 +157,14 @@ var URLHighlighter = new Lang.Class({
} }
return -1; return -1;
} }
}); };
var ScaleLayout = new Lang.Class({
Name: 'ScaleLayout',
Extends: Clutter.BinLayout,
var ScaleLayout = new GObject.registerClass(
class ScaleLayout extends Clutter.BinLayout {
_init(params) { _init(params) {
this._container = null; this._container = null;
this.parent(params); super._init(params);
}, }
_connectContainer(container) { _connectContainer(container) {
if (this._container == container) if (this._container == container)
@@ -189,45 +184,43 @@ var ScaleLayout = new Lang.Class({
}); });
this._signals.push(id); this._signals.push(id);
} }
}, }
vfunc_get_preferred_width(container, forHeight) { vfunc_get_preferred_width(container, forHeight) {
this._connectContainer(container); this._connectContainer(container);
let [min, nat] = this.parent(container, forHeight); let [min, nat] = super.vfunc_get_preferred_width(container, forHeight);
return [Math.floor(min * container.scale_x), return [Math.floor(min * container.scale_x),
Math.floor(nat * container.scale_x)]; Math.floor(nat * container.scale_x)];
}, }
vfunc_get_preferred_height(container, forWidth) { vfunc_get_preferred_height(container, forWidth) {
this._connectContainer(container); this._connectContainer(container);
let [min, nat] = this.parent(container, forWidth); let [min, nat] = super.vfunc_get_preferred_height(container, forWidth);
return [Math.floor(min * container.scale_y), return [Math.floor(min * container.scale_y),
Math.floor(nat * container.scale_y)]; Math.floor(nat * container.scale_y)];
} }
}); });
var LabelExpanderLayout = new Lang.Class({ var LabelExpanderLayout = GObject.registerClass({
Name: 'LabelExpanderLayout',
Extends: Clutter.LayoutManager,
Properties: { 'expansion': GObject.ParamSpec.double('expansion', Properties: { 'expansion': GObject.ParamSpec.double('expansion',
'Expansion', 'Expansion',
'Expansion of the layout, between 0 (collapsed) ' + 'Expansion of the layout, between 0 (collapsed) ' +
'and 1 (fully expanded', 'and 1 (fully expanded',
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
0, 1, 0)}, 0, 1, 0)},
}, class LabelExpanderLayout extends Clutter.LayoutManager {
_init(params) { _init(params) {
this._expansion = 0; this._expansion = 0;
this._expandLines = DEFAULT_EXPAND_LINES; this._expandLines = DEFAULT_EXPAND_LINES;
this.parent(params); super._init(params);
}, }
get expansion() { get expansion() {
return this._expansion; return this._expansion;
}, }
set expansion(v) { set expansion(v) {
if (v == this._expansion) if (v == this._expansion)
@@ -240,7 +233,7 @@ var LabelExpanderLayout = new Lang.Class({
this._container.get_child_at_index(i).visible = (i == visibleIndex); this._container.get_child_at_index(i).visible = (i == visibleIndex);
this.layout_changed(); this.layout_changed();
}, }
set expandLines(v) { set expandLines(v) {
if (v == this._expandLines) if (v == this._expandLines)
@@ -248,11 +241,11 @@ var LabelExpanderLayout = new Lang.Class({
this._expandLines = v; this._expandLines = v;
if (this._expansion > 0) if (this._expansion > 0)
this.layout_changed(); this.layout_changed();
}, }
vfunc_set_container(container) { vfunc_set_container(container) {
this._container = container; this._container = container;
}, }
vfunc_get_preferred_width(container, forHeight) { vfunc_get_preferred_width(container, forHeight) {
let [min, nat] = [0, 0]; let [min, nat] = [0, 0];
@@ -267,7 +260,7 @@ var LabelExpanderLayout = new Lang.Class({
} }
return [min, nat]; return [min, nat];
}, }
vfunc_get_preferred_height(container, forWidth) { vfunc_get_preferred_height(container, forWidth) {
let [min, nat] = [0, 0]; let [min, nat] = [0, 0];
@@ -285,7 +278,7 @@ var LabelExpanderLayout = new Lang.Class({
} }
return [min, nat]; return [min, nat];
}, }
vfunc_allocate(container, box, flags) { vfunc_allocate(container, box, flags) {
for (let i = 0; i < container.get_n_children(); i++) { for (let i = 0; i < container.get_n_children(); i++) {
@@ -298,10 +291,8 @@ var LabelExpanderLayout = new Lang.Class({
} }
}); });
var Message = new Lang.Class({ var Message = class Message {
Name: 'Message', constructor(title, body) {
_init(title, body) {
this.expanded = false; this.expanded = false;
this._useBodyMarkup = false; this._useBodyMarkup = false;
@@ -368,25 +359,25 @@ var Message = new Lang.Class({
this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('clicked', this._onClicked.bind(this));
this.actor.connect('destroy', this._onDestroy.bind(this)); this.actor.connect('destroy', this._onDestroy.bind(this));
this._sync(); this._sync();
}, }
close() { close() {
this.emit('close'); this.emit('close');
}, }
setIcon(actor) { setIcon(actor) {
this._iconBin.child = actor; this._iconBin.child = actor;
this._iconBin.visible = (actor != null); this._iconBin.visible = (actor != null);
}, }
setSecondaryActor(actor) { setSecondaryActor(actor) {
this._secondaryBin.child = actor; this._secondaryBin.child = actor;
}, }
setTitle(text) { setTitle(text) {
let title = text ? _fixMarkup(text.replace(/\n/g, ' '), false) : ''; let title = text ? _fixMarkup(text.replace(/\n/g, ' '), false) : '';
this.titleLabel.clutter_text.set_markup(title); this.titleLabel.clutter_text.set_markup(title);
}, }
setBody(text) { setBody(text) {
this._bodyText = text; this._bodyText = text;
@@ -394,7 +385,7 @@ var Message = new Lang.Class({
this._useBodyMarkup); this._useBodyMarkup);
if (this._expandedLabel) if (this._expandedLabel)
this._expandedLabel.setMarkup(text, this._useBodyMarkup); this._expandedLabel.setMarkup(text, this._useBodyMarkup);
}, }
setUseBodyMarkup(enable) { setUseBodyMarkup(enable) {
if (this._useBodyMarkup === enable) if (this._useBodyMarkup === enable)
@@ -402,7 +393,7 @@ var Message = new Lang.Class({
this._useBodyMarkup = enable; this._useBodyMarkup = enable;
if (this.bodyLabel) if (this.bodyLabel)
this.setBody(this._bodyText); this.setBody(this._bodyText);
}, }
setActionArea(actor) { setActionArea(actor) {
if (actor == null) { if (actor == null) {
@@ -416,7 +407,7 @@ var Message = new Lang.Class({
this._actionBin.add_actor(actor); this._actionBin.add_actor(actor);
this._actionBin.visible = this.expanded; this._actionBin.visible = this.expanded;
}, }
addMediaControl(iconName, callback) { addMediaControl(iconName, callback) {
let icon = new St.Icon({ icon_name: iconName, icon_size: 16 }); let icon = new St.Icon({ icon_name: iconName, icon_size: 16 });
@@ -425,7 +416,7 @@ var Message = new Lang.Class({
button.connect('clicked', callback); button.connect('clicked', callback);
this._mediaControls.add_actor(button); this._mediaControls.add_actor(button);
return button; return button;
}, }
setExpandedBody(actor) { setExpandedBody(actor) {
if (actor == null) { if (actor == null) {
@@ -438,11 +429,11 @@ var Message = new Lang.Class({
throw new Error('Message already has an expanded body actor'); throw new Error('Message already has an expanded body actor');
this._bodyStack.insert_child_at_index(actor, 1); this._bodyStack.insert_child_at_index(actor, 1);
}, }
setExpandedLines(nLines) { setExpandedLines(nLines) {
this._bodyStack.layout_manager.expandLines = nLines; this._bodyStack.layout_manager.expandLines = nLines;
}, }
expand(animate) { expand(animate) {
this.expanded = true; this.expanded = true;
@@ -471,7 +462,7 @@ var Message = new Lang.Class({
} }
this.emit('expanded'); this.emit('expanded');
}, }
unexpand(animate) { unexpand(animate) {
if (animate) { if (animate) {
@@ -495,23 +486,23 @@ var Message = new Lang.Class({
} }
this.emit('unexpanded'); this.emit('unexpanded');
}, }
canClose() { canClose() {
return this._mediaControls.get_n_children() == 0; return false;
}, }
_sync() { _sync() {
let visible = this.actor.hover && this.canClose(); let visible = this.actor.hover && this.canClose();
this._closeButton.opacity = visible ? 255 : 0; this._closeButton.opacity = visible ? 255 : 0;
this._closeButton.reactive = visible; this._closeButton.reactive = visible;
}, }
_onClicked() { _onClicked() {
}, }
_onDestroy() { _onDestroy() {
}, }
_onKeyPressed(a, event) { _onKeyPressed(a, event) {
let keysym = event.get_key_symbol(); let keysym = event.get_key_symbol();
@@ -523,13 +514,11 @@ var Message = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
}); };
Signals.addSignalMethods(Message.prototype); Signals.addSignalMethods(Message.prototype);
var MessageListSection = new Lang.Class({ var MessageListSection = class MessageListSection {
Name: 'MessageListSection', constructor() {
_init() {
this.actor = new St.BoxLayout({ style_class: 'message-list-section', this.actor = new St.BoxLayout({ style_class: 'message-list-section',
clip_to_allocation: true, clip_to_allocation: true,
x_expand: true, vertical: true }); x_expand: true, vertical: true });
@@ -552,26 +541,26 @@ var MessageListSection = new Lang.Class({
this.empty = true; this.empty = true;
this.canClear = false; this.canClear = false;
this._sync(); this._sync();
}, }
_onKeyFocusIn(actor) { _onKeyFocusIn(actor) {
this.emit('key-focus-in', actor); this.emit('key-focus-in', actor);
}, }
get allowed() { get allowed() {
return true; return true;
}, }
setDate(date) { setDate(date) {
if (Calendar.sameDay(date, this._date)) if (Calendar.sameDay(date, this._date))
return; return;
this._date = date; this._date = date;
this._sync(); this._sync();
}, }
addMessage(message, animate) { addMessage(message, animate) {
this.addMessageAtIndex(message, -1, animate); this.addMessageAtIndex(message, -1, animate);
}, }
addMessageAtIndex(message, index, animate) { addMessageAtIndex(message, index, animate) {
let obj = { let obj = {
@@ -604,7 +593,7 @@ var MessageListSection = new Lang.Class({
scale_y: 1, scale_y: 1,
time: MESSAGE_ANIMATION_TIME, time: MESSAGE_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, }
moveMessage(message, index, animate) { moveMessage(message, index, animate) {
let obj = this._messages.get(message); let obj = this._messages.get(message);
@@ -626,7 +615,7 @@ var MessageListSection = new Lang.Class({
time: MESSAGE_ANIMATION_TIME, time: MESSAGE_ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: onComplete }); onComplete: onComplete });
}, }
removeMessage(message, animate) { removeMessage(message, animate) {
let obj = this._messages.get(message); let obj = this._messages.get(message);
@@ -649,7 +638,7 @@ var MessageListSection = new Lang.Class({
obj.container.destroy(); obj.container.destroy();
global.sync_pointer(); global.sync_pointer();
} }
}, }
clear() { clear() {
let messages = [...this._messages.keys()].filter(msg => msg.canClose()); let messages = [...this._messages.keys()].filter(msg => msg.canClose());
@@ -677,18 +666,18 @@ var MessageListSection = new Lang.Class({
}}); }});
} }
} }
}, }
_canClear() { _canClear() {
for (let message of this._messages.keys()) for (let message of this._messages.keys())
if (message.canClose()) if (message.canClose())
return true; return true;
return false; return false;
}, }
_shouldShow() { _shouldShow() {
return !this.empty; return !this.empty;
}, }
_sync() { _sync() {
let empty = this._list.get_n_children() == 0; let empty = this._list.get_n_children() == 0;
@@ -707,5 +696,5 @@ var MessageListSection = new Lang.Class({
this.actor.visible = this.allowed && this._shouldShow(); this.actor.visible = this.allowed && this._shouldShow();
} }
}); };
Signals.addSignalMethods(MessageListSection.prototype); Signals.addSignalMethods(MessageListSection.prototype);

View File

@@ -6,7 +6,6 @@ const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
@@ -72,15 +71,13 @@ var Urgency = {
CRITICAL: 3 CRITICAL: 3
}; };
var FocusGrabber = new Lang.Class({ var FocusGrabber = class FocusGrabber {
Name: 'FocusGrabber', constructor(actor) {
_init(actor) {
this._actor = actor; this._actor = actor;
this._prevKeyFocusActor = null; this._prevKeyFocusActor = null;
this._focusActorChangedId = 0; this._focusActorChangedId = 0;
this._focused = false; this._focused = false;
}, }
grabFocus() { grabFocus() {
if (this._focused) if (this._focused)
@@ -94,7 +91,7 @@ var FocusGrabber = new Lang.Class({
this._actor.grab_key_focus(); this._actor.grab_key_focus();
this._focused = true; this._focused = true;
}, }
_focusUngrabbed() { _focusUngrabbed() {
if (!this._focused) if (!this._focused)
@@ -107,13 +104,13 @@ var FocusGrabber = new Lang.Class({
this._focused = false; this._focused = false;
return true; return true;
}, }
_focusActorChanged() { _focusActorChanged() {
let focusedActor = global.stage.get_key_focus(); let focusedActor = global.stage.get_key_focus();
if (!focusedActor || !this._actor.contains(focusedActor)) if (!focusedActor || !this._actor.contains(focusedActor))
this._focusUngrabbed(); this._focusUngrabbed();
}, }
ungrabFocus() { ungrabFocus() {
if (!this._focusUngrabbed()) if (!this._focusUngrabbed())
@@ -128,17 +125,15 @@ var FocusGrabber = new Lang.Class({
global.stage.set_key_focus(null); global.stage.set_key_focus(null);
} }
} }
}); };
// NotificationPolicy: // NotificationPolicy:
// An object that holds all bits of configurable policy related to a notification // An object that holds all bits of configurable policy related to a notification
// source, such as whether to play sound or honour the critical bit. // source, such as whether to play sound or honour the critical bit.
// //
// A notification without a policy object will inherit the default one. // A notification without a policy object will inherit the default one.
var NotificationPolicy = new Lang.Class({ var NotificationPolicy = class NotificationPolicy {
Name: 'NotificationPolicy', constructor(params) {
_init(params) {
params = Params.parse(params, { enable: true, params = Params.parse(params, { enable: true,
enableSound: true, enableSound: true,
showBanners: true, showBanners: true,
@@ -146,72 +141,76 @@ var NotificationPolicy = new Lang.Class({
showInLockScreen: true, showInLockScreen: true,
detailsInLockScreen: false detailsInLockScreen: false
}); });
Lang.copyProperties(params, this); Object.getOwnPropertyNames(params).forEach(key => {
}, let desc = Object.getOwnPropertyDescriptor(params, key);
Object.defineProperty(this, `_${key}`, desc);
});
}
// Do nothing for the default policy. These methods are only useful for the // Do nothing for the default policy. These methods are only useful for the
// GSettings policy. // GSettings policy.
store() { }, store() { }
destroy() { } destroy() { }
});
get enable() {
return this._enable;
}
get enableSound() {
return this._enableSound;
}
get showBanners() {
return this._showBanners;
}
get forceExpanded() {
return this._forceExpanded;
}
get showInLockScreen() {
return this._showInLockScreen;
}
get detailsInLockScreen() {
return this._detailsInLockScreen;
}
};
Signals.addSignalMethods(NotificationPolicy.prototype); Signals.addSignalMethods(NotificationPolicy.prototype);
var NotificationGenericPolicy = new Lang.Class({ var NotificationGenericPolicy =
Name: 'NotificationGenericPolicy', class NotificationGenericPolicy extends NotificationPolicy {
Extends: NotificationPolicy, constructor() {
super();
_init() {
// Don't chain to parent, it would try setting
// our properties to the defaults
this.id = 'generic'; this.id = 'generic';
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' }); this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
this._masterSettings.connect('changed', this._changed.bind(this)); this._masterSettings.connect('changed', this._changed.bind(this));
}, }
store() { }, store() { }
destroy() { destroy() {
this._masterSettings.run_dispose(); this._masterSettings.run_dispose();
}, }
_changed(settings, key) { _changed(settings, key) {
this.emit('policy-changed', key); this.emit('policy-changed', key);
}, }
get enable() {
return true;
},
get enableSound() {
return true;
},
get showBanners() { get showBanners() {
return this._masterSettings.get_boolean('show-banners'); return this._masterSettings.get_boolean('show-banners');
}, }
get forceExpanded() {
return false;
},
get showInLockScreen() { get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen'); return this._masterSettings.get_boolean('show-in-lock-screen');
},
get detailsInLockScreen() {
return false;
} }
}); };
var NotificationApplicationPolicy = new Lang.Class({ var NotificationApplicationPolicy =
Name: 'NotificationApplicationPolicy', class NotificationApplicationPolicy extends NotificationPolicy {
Extends: NotificationPolicy, constructor(id) {
super();
_init(id) {
// Don't chain to parent, it would try setting
// our properties to the defaults
this.id = id; this.id = id;
this._canonicalId = this._canonicalizeId(id); this._canonicalId = this._canonicalizeId(id);
@@ -222,7 +221,7 @@ var NotificationApplicationPolicy = new Lang.Class({
this._masterSettings.connect('changed', this._changed.bind(this)); this._masterSettings.connect('changed', this._changed.bind(this));
this._settings.connect('changed', this._changed.bind(this)); this._settings.connect('changed', this._changed.bind(this));
}, }
store() { store() {
this._settings.set_string('application-id', this.id + '.desktop'); this._settings.set_string('application-id', this.id + '.desktop');
@@ -232,51 +231,51 @@ var NotificationApplicationPolicy = new Lang.Class({
apps.push(this._canonicalId); apps.push(this._canonicalId);
this._masterSettings.set_strv('application-children', apps); this._masterSettings.set_strv('application-children', apps);
} }
}, }
destroy() { destroy() {
this._masterSettings.run_dispose(); this._masterSettings.run_dispose();
this._settings.run_dispose(); this._settings.run_dispose();
}, }
_changed(settings, key) { _changed(settings, key) {
this.emit('policy-changed', key); this.emit('policy-changed', key);
if (key == 'enable') if (key == 'enable')
this.emit('enable-changed'); this.emit('enable-changed');
}, }
_canonicalizeId(id) { _canonicalizeId(id) {
// Keys are restricted to lowercase alphanumeric characters and dash, // Keys are restricted to lowercase alphanumeric characters and dash,
// and two dashes cannot be in succession // and two dashes cannot be in succession
return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-'); return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
}, }
get enable() { get enable() {
return this._settings.get_boolean('enable'); return this._settings.get_boolean('enable');
}, }
get enableSound() { get enableSound() {
return this._settings.get_boolean('enable-sound-alerts'); return this._settings.get_boolean('enable-sound-alerts');
}, }
get showBanners() { get showBanners() {
return this._masterSettings.get_boolean('show-banners') && return this._masterSettings.get_boolean('show-banners') &&
this._settings.get_boolean('show-banners'); this._settings.get_boolean('show-banners');
}, }
get forceExpanded() { get forceExpanded() {
return this._settings.get_boolean('force-expanded'); return this._settings.get_boolean('force-expanded');
}, }
get showInLockScreen() { get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen') && return this._masterSettings.get_boolean('show-in-lock-screen') &&
this._settings.get_boolean('show-in-lock-screen'); this._settings.get_boolean('show-in-lock-screen');
}, }
get detailsInLockScreen() { get detailsInLockScreen() {
return this._settings.get_boolean('details-in-lock-screen'); return this._settings.get_boolean('details-in-lock-screen');
} }
}); };
// Notification: // Notification:
// @source: the notification's Source // @source: the notification's Source
@@ -333,10 +332,8 @@ var NotificationApplicationPolicy = new Lang.Class({
// @source allows playing sounds). // @source allows playing sounds).
// //
// [1] https://developer.gnome.org/notification-spec/#markup // [1] https://developer.gnome.org/notification-spec/#markup
var Notification = new Lang.Class({ var Notification = class Notification {
Name: 'Notification', constructor(source, title, banner, params) {
_init(source, title, banner, params) {
this.source = source; this.source = source;
this.title = title; this.title = title;
this.urgency = Urgency.NORMAL; this.urgency = Urgency.NORMAL;
@@ -358,7 +355,7 @@ var Notification = new Lang.Class({
// for new and updated notifications // for new and updated notifications
if (arguments.length != 1) if (arguments.length != 1)
this.update(title, banner, params); this.update(title, banner, params);
}, }
// update: // update:
// @title: the new title // @title: the new title
@@ -403,41 +400,41 @@ var Notification = new Lang.Class({
} }
this.emit('updated', params.clear); this.emit('updated', params.clear);
}, }
// addAction: // addAction:
// @label: the label for the action's button // @label: the label for the action's button
// @callback: the callback for the action // @callback: the callback for the action
addAction(label, callback) { addAction(label, callback) {
this.actions.push({ label: label, callback: callback }); this.actions.push({ label: label, callback: callback });
}, }
get acknowledged() { get acknowledged() {
return this._acknowledged; return this._acknowledged;
}, }
set acknowledged(v) { set acknowledged(v) {
if (this._acknowledged == v) if (this._acknowledged == v)
return; return;
this._acknowledged = v; this._acknowledged = v;
this.emit('acknowledged-changed'); this.emit('acknowledged-changed');
}, }
setUrgency(urgency) { setUrgency(urgency) {
this.urgency = urgency; this.urgency = urgency;
}, }
setResident(resident) { setResident(resident) {
this.resident = resident; this.resident = resident;
}, }
setTransient(isTransient) { setTransient(isTransient) {
this.isTransient = isTransient; this.isTransient = isTransient;
}, }
setForFeedback(forFeedback) { setForFeedback(forFeedback) {
this.forFeedback = forFeedback; this.forFeedback = forFeedback;
}, }
playSound() { playSound() {
if (this._soundPlayed) if (this._soundPlayed)
@@ -453,7 +450,7 @@ var Notification = new Lang.Class({
player.play_from_theme(this._soundName, this.title, null); player.play_from_theme(this._soundName, this.title, null);
else if (this._soundFile) else if (this._soundFile)
player.play_from_file(this._soundFile, this.title, null); player.play_from_file(this._soundFile, this.title, null);
}, }
// Allow customizing the banner UI: // Allow customizing the banner UI:
// the default implementation defers the creation to // the default implementation defers the creation to
@@ -462,28 +459,26 @@ var Notification = new Lang.Class({
// Notification or Source // Notification or Source
createBanner() { createBanner() {
return this.source.createBanner(this); return this.source.createBanner(this);
}, }
activate() { activate() {
this.emit('activated'); this.emit('activated');
if (!this.resident) if (!this.resident)
this.destroy(); this.destroy();
}, }
destroy(reason) { destroy(reason) {
if (!reason) if (!reason)
reason = NotificationDestroyedReason.DISMISSED; reason = NotificationDestroyedReason.DISMISSED;
this.emit('destroy', reason); this.emit('destroy', reason);
} }
}); };
Signals.addSignalMethods(Notification.prototype); Signals.addSignalMethods(Notification.prototype);
var NotificationBanner = new Lang.Class({ var NotificationBanner =
Name: 'NotificationBanner', class NotificationBanner extends Calendar.NotificationMessage {
Extends: Calendar.NotificationMessage, constructor(notification) {
super(notification);
_init(notification) {
this.parent(notification);
this.actor.can_focus = false; this.actor.can_focus = false;
this.actor.add_style_class_name('notification-banner'); this.actor.add_style_class_name('notification-banner');
@@ -500,15 +495,15 @@ var NotificationBanner = new Lang.Class({
// attention switching to the window. // attention switching to the window.
this.emit('done-displaying'); this.emit('done-displaying');
}); });
}, }
_onDestroy() { _onDestroy() {
this.parent(); super._onDestroy();
this.notification.disconnect(this._activatedId); this.notification.disconnect(this._activatedId);
}, }
_onUpdated(n, clear) { _onUpdated(n, clear) {
this.parent(n, clear); super._onUpdated(n, clear);
if (clear) { if (clear) {
this.setSecondaryActor(null); this.setSecondaryActor(null);
@@ -518,13 +513,13 @@ var NotificationBanner = new Lang.Class({
this._addActions(); this._addActions();
this._addSecondaryIcon(); this._addSecondaryIcon();
}, }
_addActions() { _addActions() {
this.notification.actions.forEach(action => { this.notification.actions.forEach(action => {
this.addAction(action.label, action.callback); this.addAction(action.label, action.callback);
}); });
}, }
_addSecondaryIcon() { _addSecondaryIcon() {
if (this.notification.secondaryGIcon) { if (this.notification.secondaryGIcon) {
@@ -532,7 +527,7 @@ var NotificationBanner = new Lang.Class({
x_align: Clutter.ActorAlign.END }); x_align: Clutter.ActorAlign.END });
this.setSecondaryActor(icon); this.setSecondaryActor(icon);
} }
}, }
addButton(button, callback) { addButton(button, callback) {
if (!this._buttonBox) { if (!this._buttonBox) {
@@ -560,7 +555,7 @@ var NotificationBanner = new Lang.Class({
}); });
return button; return button;
}, }
addAction(label, callback) { addAction(label, callback) {
let button = new St.Button({ style_class: 'notification-button', let button = new St.Button({ style_class: 'notification-button',
@@ -570,14 +565,12 @@ var NotificationBanner = new Lang.Class({
return this.addButton(button, callback); return this.addButton(button, callback);
} }
}); };
var SourceActor = new Lang.Class({
Name: 'SourceActor',
Extends: St.Widget,
var SourceActor = GObject.registerClass(
class SourceActor extends St.Widget {
_init(source, size) { _init(source, size) {
this.parent(); super._init();
this._source = source; this._source = source;
this._size = size; this._size = size;
@@ -599,12 +592,12 @@ var SourceActor = new Lang.Class({
this._iconUpdatedId = this._source.connect('icon-updated', this._updateIcon.bind(this)); this._iconUpdatedId = this._source.connect('icon-updated', this._updateIcon.bind(this));
this._updateIcon(); this._updateIcon();
}, }
setIcon(icon) { setIcon(icon) {
this._iconBin.child = icon; this._iconBin.child = icon;
this._iconSet = true; this._iconSet = true;
}, }
_updateIcon() { _updateIcon() {
if (this._actorDestroyed) if (this._actorDestroyed)
@@ -615,12 +608,10 @@ var SourceActor = new Lang.Class({
} }
}); });
var SourceActorWithLabel = new Lang.Class({ var SourceActorWithLabel = GObject.registerClass(
Name: 'SourceActorWithLabel', class SourceActorWithLabel extends SourceActor {
Extends: SourceActor,
_init(source, size) { _init(source, size) {
this.parent(source, size); super._init(source, size);
this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER, this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
x_expand: true, x_expand: true,
@@ -646,10 +637,10 @@ var SourceActorWithLabel = new Lang.Class({
this.connect('destroy', () => { this.connect('destroy', () => {
this._source.disconnect(this._countUpdatedId); this._source.disconnect(this._countUpdatedId);
}); });
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.parent(box, flags); super.vfunc_allocate(box, flags);
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
@@ -670,7 +661,7 @@ var SourceActorWithLabel = new Lang.Class({
childBox.y2 = box.y2; childBox.y2 = box.y2;
this._counterBin.allocate(childBox, flags); this._counterBin.allocate(childBox, flags);
}, }
_updateCount() { _updateCount() {
if (this._actorDestroyed) if (this._actorDestroyed)
@@ -688,12 +679,10 @@ var SourceActorWithLabel = new Lang.Class({
} }
}); });
var Source = new Lang.Class({ var Source = class Source {
Name: 'MessageTraySource', constructor(title, iconName) {
this.SOURCE_ICON_SIZE = 48;
SOURCE_ICON_SIZE: 48,
_init(title, iconName) {
this.title = title; this.title = title;
this.iconName = iconName; this.iconName = iconName;
@@ -701,37 +690,43 @@ var Source = new Lang.Class({
this.notifications = []; this.notifications = [];
this.policy = this._createPolicy(); this._policy = null;
}, }
get policy() {
if (!this._policy)
this._policy = this._createPolicy();
return this._policy;
}
get count() { get count() {
return this.notifications.length; return this.notifications.length;
}, }
get unseenCount() { get unseenCount() {
return this.notifications.filter(n => !n.acknowledged).length; return this.notifications.filter(n => !n.acknowledged).length;
}, }
get countVisible() { get countVisible() {
return this.count > 1; return this.count > 1;
}, }
countUpdated() { countUpdated() {
this.emit('count-updated'); this.emit('count-updated');
}, }
_createPolicy() { _createPolicy() {
return new NotificationPolicy(); return new NotificationPolicy();
}, }
setTitle(newTitle) { setTitle(newTitle) {
this.title = newTitle; this.title = newTitle;
this.emit('title-changed'); this.emit('title-changed');
}, }
createBanner(notification) { createBanner(notification) {
return new NotificationBanner(notification); return new NotificationBanner(notification);
}, }
// Called to create a new icon actor. // Called to create a new icon actor.
// Provides a sane default implementation, override if you need // Provides a sane default implementation, override if you need
@@ -739,11 +734,11 @@ var Source = new Lang.Class({
createIcon(size) { createIcon(size) {
return new St.Icon({ gicon: this.getIcon(), return new St.Icon({ gicon: this.getIcon(),
icon_size: size }); icon_size: size });
}, }
getIcon() { getIcon() {
return new Gio.ThemedIcon({ name: this.iconName }); return new Gio.ThemedIcon({ name: this.iconName });
}, }
_onNotificationDestroy(notification) { _onNotificationDestroy(notification) {
let index = this.notifications.indexOf(notification); let index = this.notifications.indexOf(notification);
@@ -755,7 +750,7 @@ var Source = new Lang.Class({
this.destroy(); this.destroy();
this.countUpdated(); this.countUpdated();
}, }
pushNotification(notification) { pushNotification(notification) {
if (this.notifications.indexOf(notification) >= 0) if (this.notifications.indexOf(notification) >= 0)
@@ -770,7 +765,7 @@ var Source = new Lang.Class({
this.emit('notification-added', notification); this.emit('notification-added', notification);
this.countUpdated(); this.countUpdated();
}, }
notify(notification) { notify(notification) {
notification.acknowledged = false; notification.acknowledged = false;
@@ -781,7 +776,7 @@ var Source = new Lang.Class({
} else { } else {
notification.playSound(); notification.playSound();
} }
}, }
destroy(reason) { destroy(reason) {
this.policy.destroy(); this.policy.destroy();
@@ -793,15 +788,15 @@ var Source = new Lang.Class({
notifications[i].destroy(reason); notifications[i].destroy(reason);
this.emit('destroy', reason); this.emit('destroy', reason);
}, }
iconUpdated() { iconUpdated() {
this.emit('icon-updated'); this.emit('icon-updated');
}, }
// To be overridden by subclasses // To be overridden by subclasses
open() { open() {
}, }
destroyNonResidentNotifications() { destroyNonResidentNotifications() {
for (let i = this.notifications.length - 1; i >= 0; i--) for (let i = this.notifications.length - 1; i >= 0; i--)
@@ -810,13 +805,11 @@ var Source = new Lang.Class({
this.countUpdated(); this.countUpdated();
} }
}); };
Signals.addSignalMethods(Source.prototype); Signals.addSignalMethods(Source.prototype);
var MessageTray = new Lang.Class({ var MessageTray = class MessageTray {
Name: 'MessageTray', constructor() {
_init() {
this._presence = new GnomeSession.Presence((proxy, error) => { this._presence = new GnomeSession.Presence((proxy, error) => {
this._onStatusChanged(proxy.status); this._onStatusChanged(proxy.status);
}); });
@@ -923,27 +916,27 @@ var MessageTray = new Lang.Class({
this._sources = new Map(); this._sources = new Map();
this._sessionUpdated(); this._sessionUpdated();
}, }
_sessionUpdated() { _sessionUpdated() {
this._updateState(); this._updateState();
}, }
_onDragBegin() { _onDragBegin() {
Shell.util_set_hidden_from_pick(this.actor, true); Shell.util_set_hidden_from_pick(this.actor, true);
}, }
_onDragEnd() { _onDragEnd() {
Shell.util_set_hidden_from_pick(this.actor, false); Shell.util_set_hidden_from_pick(this.actor, false);
}, }
get bannerAlignment() { get bannerAlignment() {
return this._bannerBin.get_x_align(); return this._bannerBin.get_x_align();
}, }
set bannerAlignment(align) { set bannerAlignment(align) {
this._bannerBin.set_x_align(align); this._bannerBin.set_x_align(align);
}, }
_onNotificationKeyRelease(actor, event) { _onNotificationKeyRelease(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) { if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
@@ -952,27 +945,27 @@ var MessageTray = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_expireNotification() { _expireNotification() {
this._notificationExpired = true; this._notificationExpired = true;
this._updateState(); this._updateState();
}, }
get queueCount() { get queueCount() {
return this._notificationQueue.length; return this._notificationQueue.length;
}, }
set bannerBlocked(v) { set bannerBlocked(v) {
if (this._bannerBlocked == v) if (this._bannerBlocked == v)
return; return;
this._bannerBlocked = v; this._bannerBlocked = v;
this._updateState(); this._updateState();
}, }
contains(source) { contains(source) {
return this._sources.has(source); return this._sources.has(source);
}, }
add(source) { add(source) {
if (this.contains(source)) { if (this.contains(source)) {
@@ -988,7 +981,7 @@ var MessageTray = new Lang.Class({
}); });
source.policy.connect('policy-changed', this._updateState.bind(this)); source.policy.connect('policy-changed', this._updateState.bind(this));
this._onSourceEnableChanged(source.policy, source); this._onSourceEnableChanged(source.policy, source);
}, }
_addSource(source) { _addSource(source) {
let obj = { let obj = {
@@ -1003,7 +996,7 @@ var MessageTray = new Lang.Class({
obj.destroyId = source.connect('destroy', this._onSourceDestroy.bind(this)); obj.destroyId = source.connect('destroy', this._onSourceDestroy.bind(this));
this.emit('source-added', source); this.emit('source-added', source);
}, }
_removeSource(source) { _removeSource(source) {
let obj = this._sources.get(source); let obj = this._sources.get(source);
@@ -1013,11 +1006,11 @@ var MessageTray = new Lang.Class({
source.disconnect(obj.destroyId); source.disconnect(obj.destroyId);
this.emit('source-removed', source); this.emit('source-removed', source);
}, }
getSources() { getSources() {
return [...this._sources.keys()]; return [...this._sources.keys()];
}, }
_onSourceEnableChanged(policy, source) { _onSourceEnableChanged(policy, source) {
let wasEnabled = this.contains(source); let wasEnabled = this.contains(source);
@@ -1029,11 +1022,11 @@ var MessageTray = new Lang.Class({
else else
this._removeSource(source); this._removeSource(source);
} }
}, }
_onSourceDestroy(source) { _onSourceDestroy(source) {
this._removeSource(source); this._removeSource(source);
}, }
_onNotificationDestroy(notification) { _onNotificationDestroy(notification) {
if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) { if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) {
@@ -1048,7 +1041,7 @@ var MessageTray = new Lang.Class({
this._notificationQueue.splice(index, 1); this._notificationQueue.splice(index, 1);
this.emit('queue-changed'); this.emit('queue-changed');
} }
}, }
_onNotify(source, notification) { _onNotify(source, notification) {
if (this._notification == notification) { if (this._notification == notification) {
@@ -1074,7 +1067,7 @@ var MessageTray = new Lang.Class({
} }
} }
this._updateState(); this._updateState();
}, }
_resetNotificationLeftTimeout() { _resetNotificationLeftTimeout() {
this._useLongerNotificationLeftTimeout = false; this._useLongerNotificationLeftTimeout = false;
@@ -1084,7 +1077,7 @@ var MessageTray = new Lang.Class({
this._notificationLeftMouseX = -1; this._notificationLeftMouseX = -1;
this._notificationLeftMouseY = -1; this._notificationLeftMouseY = -1;
} }
}, }
_onNotificationHoverChanged() { _onNotificationHoverChanged() {
if (this._bannerBin.hover == this._notificationHovered) if (this._bannerBin.hover == this._notificationHovered)
@@ -1128,7 +1121,7 @@ var MessageTray = new Lang.Class({
this._notificationLeftTimeoutId = Mainloop.timeout_add(timeout, this._onNotificationLeftTimeout.bind(this)); this._notificationLeftTimeoutId = Mainloop.timeout_add(timeout, this._onNotificationLeftTimeout.bind(this));
GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout'); GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout');
} }
}, }
_onStatusChanged(status) { _onStatusChanged(status) {
if (status == GnomeSession.PresenceStatus.BUSY) { if (status == GnomeSession.PresenceStatus.BUSY) {
@@ -1143,7 +1136,7 @@ var MessageTray = new Lang.Class({
} }
this._updateState(); this._updateState();
}, }
_onNotificationLeftTimeout() { _onNotificationLeftTimeout() {
let [x, y, mods] = global.get_pointer(); let [x, y, mods] = global.get_pointer();
@@ -1165,13 +1158,13 @@ var MessageTray = new Lang.Class({
this._updateState(); this._updateState();
} }
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_escapeTray() { _escapeTray() {
this._pointerInNotification = false; this._pointerInNotification = false;
this._updateNotificationTimeout(0); this._updateNotificationTimeout(0);
this._updateState(); this._updateState();
}, }
// All of the logic for what happens when occurs here; the various // All of the logic for what happens when occurs here; the various
// event handlers merely update variables such as // event handlers merely update variables such as
@@ -1234,7 +1227,7 @@ var MessageTray = new Lang.Class({
// Clean transient variables that are used to communicate actions // Clean transient variables that are used to communicate actions
// to updateState() // to updateState()
this._notificationExpired = false; this._notificationExpired = false;
}, }
_tween(actor, statevar, value, params) { _tween(actor, statevar, value, params) {
let onComplete = params.onComplete; let onComplete = params.onComplete;
@@ -1251,24 +1244,24 @@ var MessageTray = new Lang.Class({
let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING; let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING;
this[statevar] = valuing; this[statevar] = valuing;
}, }
_tweenComplete(statevar, value, onComplete, onCompleteScope, onCompleteParams) { _tweenComplete(statevar, value, onComplete, onCompleteScope, onCompleteParams) {
this[statevar] = value; this[statevar] = value;
if (onComplete) if (onComplete)
onComplete.apply(onCompleteScope, onCompleteParams); onComplete.apply(onCompleteScope, onCompleteParams);
this._updateState(); this._updateState();
}, }
_clampOpacity() { _clampOpacity() {
this._bannerBin.opacity = Math.max(0, Math.min(this._bannerBin._opacity, 255)); this._bannerBin.opacity = Math.max(0, Math.min(this._bannerBin._opacity, 255));
}, }
_onIdleMonitorBecameActive() { _onIdleMonitorBecameActive() {
this._userActiveWhileNotificationShown = true; this._userActiveWhileNotificationShown = true;
this._updateNotificationTimeout(2000); this._updateNotificationTimeout(2000);
this._updateState(); this._updateState();
}, }
_showNotification() { _showNotification() {
this._notification = this._notificationQueue.shift(); this._notification = this._notificationQueue.shift();
@@ -1313,7 +1306,7 @@ var MessageTray = new Lang.Class({
this._lastSeenMouseY = y; this._lastSeenMouseY = y;
this._resetNotificationLeftTimeout(); this._resetNotificationLeftTimeout();
}, }
_updateShowingNotification() { _updateShowingNotification() {
this._notification.acknowledged = true; this._notification.acknowledged = true;
@@ -1347,12 +1340,12 @@ var MessageTray = new Lang.Class({
}; };
this._tween(this._bannerBin, '_notificationState', State.SHOWN, tweenParams); this._tween(this._bannerBin, '_notificationState', State.SHOWN, tweenParams);
}, }
_showNotificationCompleted() { _showNotificationCompleted() {
if (this._notification.urgency != Urgency.CRITICAL) if (this._notification.urgency != Urgency.CRITICAL)
this._updateNotificationTimeout(NOTIFICATION_TIMEOUT * 1000); this._updateNotificationTimeout(NOTIFICATION_TIMEOUT * 1000);
}, }
_updateNotificationTimeout(timeout) { _updateNotificationTimeout(timeout) {
if (this._notificationTimeoutId) { if (this._notificationTimeoutId) {
@@ -1365,7 +1358,7 @@ var MessageTray = new Lang.Class({
this._notificationTimeout.bind(this)); this._notificationTimeout.bind(this));
GLib.Source.set_name_by_id(this._notificationTimeoutId, '[gnome-shell] this._notificationTimeout'); GLib.Source.set_name_by_id(this._notificationTimeoutId, '[gnome-shell] this._notificationTimeout');
} }
}, }
_notificationTimeout() { _notificationTimeout() {
let [x, y, mods] = global.get_pointer(); let [x, y, mods] = global.get_pointer();
@@ -1389,7 +1382,7 @@ var MessageTray = new Lang.Class({
this._lastSeenMouseX = x; this._lastSeenMouseX = x;
this._lastSeenMouseY = y; this._lastSeenMouseY = y;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_hideNotification(animate) { _hideNotification(animate) {
this._notificationFocusGrabber.ungrabFocus(); this._notificationFocusGrabber.ungrabFocus();
@@ -1423,7 +1416,7 @@ var MessageTray = new Lang.Class({
this._notificationState = State.HIDDEN; this._notificationState = State.HIDDEN;
this._hideNotificationCompleted(); this._hideNotificationCompleted();
} }
}, }
_hideNotificationCompleted() { _hideNotificationCompleted() {
let notification = this._notification; let notification = this._notification;
@@ -1438,14 +1431,14 @@ var MessageTray = new Lang.Class({
this._banner.actor.destroy(); this._banner.actor.destroy();
this._banner = null; this._banner = null;
this.actor.hide(); this.actor.hide();
}, }
_expandActiveNotification() { _expandActiveNotification() {
if (!this._banner) if (!this._banner)
return; return;
this._expandBanner(false); this._expandBanner(false);
}, }
_expandBanner(autoExpanding) { _expandBanner(autoExpanding) {
// Don't animate changes in notifications that are auto-expanding. // Don't animate changes in notifications that are auto-expanding.
@@ -1454,23 +1447,20 @@ var MessageTray = new Lang.Class({
// Don't focus notifications that are auto-expanding. // Don't focus notifications that are auto-expanding.
if (!autoExpanding) if (!autoExpanding)
this._ensureBannerFocused(); this._ensureBannerFocused();
}, }
_ensureBannerFocused() { _ensureBannerFocused() {
this._notificationFocusGrabber.grabFocus(); this._notificationFocusGrabber.grabFocus();
} }
}); };
Signals.addSignalMethods(MessageTray.prototype); Signals.addSignalMethods(MessageTray.prototype);
var SystemNotificationSource = new Lang.Class({ var SystemNotificationSource = class SystemNotificationSource extends Source {
Name: 'SystemNotificationSource', constructor() {
Extends: Source, super(_("System Information"), 'dialog-information-symbolic');
}
_init() {
this.parent(_("System Information"), 'dialog-information-symbolic');
},
open() { open() {
this.destroy(); this.destroy();
} }
}); };

View File

@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const St = imports.gi.St; const St = imports.gi.St;
@@ -31,10 +30,8 @@ var State = {
FADED_OUT: 4 FADED_OUT: 4
}; };
var ModalDialog = new Lang.Class({ var ModalDialog = class {
Name: 'ModalDialog', constructor(params) {
_init(params) {
params = Params.parse(params, { shellReactive: false, params = Params.parse(params, { shellReactive: false,
styleClass: null, styleClass: null,
actionMode: Shell.ActionMode.SYSTEM_MODAL, actionMode: Shell.ActionMode.SYSTEM_MODAL,
@@ -87,30 +84,30 @@ var ModalDialog = new Lang.Class({
this._initialKeyFocus = null; this._initialKeyFocus = null;
this._initialKeyFocusDestroyId = 0; this._initialKeyFocusDestroyId = 0;
this._savedKeyFocus = null; this._savedKeyFocus = null;
}, }
destroy() { destroy() {
this._group.destroy(); this._group.destroy();
}, }
clearButtons() { clearButtons() {
this.dialogLayout.clearButtons(); this.dialogLayout.clearButtons();
}, }
setButtons(buttons) { setButtons(buttons) {
this.clearButtons(); this.clearButtons();
for (let buttonInfo of buttons) for (let buttonInfo of buttons)
this.addButton(buttonInfo); this.addButton(buttonInfo);
}, }
addButton(buttonInfo) { addButton(buttonInfo) {
return this.dialogLayout.addButton(buttonInfo); return this.dialogLayout.addButton(buttonInfo);
}, }
_onGroupDestroy() { _onGroupDestroy() {
this.emit('destroy'); this.emit('destroy');
}, }
_fadeOpen(onPrimary) { _fadeOpen(onPrimary) {
if (onPrimary) if (onPrimary)
@@ -134,7 +131,7 @@ var ModalDialog = new Lang.Class({
this.emit('opened'); this.emit('opened');
} }
}); });
}, }
setInitialKeyFocus(actor) { setInitialKeyFocus(actor) {
if (this._initialKeyFocusDestroyId) if (this._initialKeyFocusDestroyId)
@@ -146,7 +143,7 @@ var ModalDialog = new Lang.Class({
this._initialKeyFocus = null; this._initialKeyFocus = null;
this._initialKeyFocusDestroyId = 0; this._initialKeyFocusDestroyId = 0;
}); });
}, }
open(timestamp, onPrimary) { open(timestamp, onPrimary) {
if (this.state == State.OPENED || this.state == State.OPENING) if (this.state == State.OPENED || this.state == State.OPENING)
@@ -157,7 +154,7 @@ var ModalDialog = new Lang.Class({
this._fadeOpen(onPrimary); this._fadeOpen(onPrimary);
return true; return true;
}, }
_closeComplete() { _closeComplete() {
this.state = State.CLOSED; this.state = State.CLOSED;
@@ -166,7 +163,7 @@ var ModalDialog = new Lang.Class({
if (this._destroyOnClose) if (this._destroyOnClose)
this.destroy(); this.destroy();
}, }
close(timestamp) { close(timestamp) {
if (this.state == State.CLOSED || this.state == State.CLOSING) if (this.state == State.CLOSED || this.state == State.CLOSING)
@@ -185,7 +182,7 @@ var ModalDialog = new Lang.Class({
}) })
else else
this._closeComplete(); this._closeComplete();
}, }
// Drop modal status without closing the dialog; this makes the // Drop modal status without closing the dialog; this makes the
// dialog insensitive as well, so it needs to be followed shortly // dialog insensitive as well, so it needs to be followed shortly
@@ -205,7 +202,7 @@ var ModalDialog = new Lang.Class({
if (!this._shellReactive) if (!this._shellReactive)
this._eventBlocker.raise_top(); this._eventBlocker.raise_top();
}, }
pushModal(timestamp) { pushModal(timestamp) {
if (this._hasModal) if (this._hasModal)
@@ -229,7 +226,7 @@ var ModalDialog = new Lang.Class({
if (!this._shellReactive) if (!this._shellReactive)
this._eventBlocker.lower_bottom(); this._eventBlocker.lower_bottom();
return true; return true;
}, }
// This method is like close, but fades the dialog out much slower, // This method is like close, but fades the dialog out much slower,
// and leaves the lightbox in place. Once in the faded out state, // and leaves the lightbox in place. Once in the faded out state,
@@ -259,5 +256,5 @@ var ModalDialog = new Lang.Class({
} }
}); });
} }
}); };
Signals.addSignalMethods(ModalDialog.prototype); Signals.addSignalMethods(ModalDialog.prototype);

View File

@@ -1,5 +1,4 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -21,15 +20,12 @@ const MprisPlayerProxy = Gio.DBusProxy.makeProxyWrapper(MprisPlayerIface);
const MPRIS_PLAYER_PREFIX = 'org.mpris.MediaPlayer2.'; const MPRIS_PLAYER_PREFIX = 'org.mpris.MediaPlayer2.';
var MediaMessage = new Lang.Class({ var MediaMessage = class MediaMessage extends MessageList.Message {
Name: 'MediaMessage', constructor(player) {
Extends: MessageList.Message, super('', '');
_init(player) {
this._player = player; this._player = player;
this.parent('', '');
this._icon = new St.Icon({ style_class: 'media-message-cover-icon' }); this._icon = new St.Icon({ style_class: 'media-message-cover-icon' });
this.setIcon(this._icon); this.setIcon(this._icon);
@@ -51,16 +47,16 @@ var MediaMessage = new Lang.Class({
this._player.connect('changed', this._update.bind(this)); this._player.connect('changed', this._update.bind(this));
this._player.connect('closed', this.close.bind(this)); this._player.connect('closed', this.close.bind(this));
this._update(); this._update();
}, }
_onClicked() { _onClicked() {
this._player.raise(); this._player.raise();
Main.panel.closeCalendar(); Main.panel.closeCalendar();
}, }
_updateNavButton(button, sensitive) { _updateNavButton(button, sensitive) {
button.reactive = sensitive; button.reactive = sensitive;
}, }
_update() { _update() {
this.setTitle(this._player.trackArtists.join(', ')); this.setTitle(this._player.trackArtists.join(', '));
@@ -83,12 +79,10 @@ var MediaMessage = new Lang.Class({
this._updateNavButton(this._prevButton, this._player.canGoPrevious); this._updateNavButton(this._prevButton, this._player.canGoPrevious);
this._updateNavButton(this._nextButton, this._player.canGoNext); this._updateNavButton(this._nextButton, this._player.canGoNext);
} }
}); };
var MprisPlayer = new Lang.Class({ var MprisPlayer = class MprisPlayer {
Name: 'MprisPlayer', constructor(busName) {
_init(busName) {
this._mprisProxy = new MprisProxy(Gio.DBus.session, busName, this._mprisProxy = new MprisProxy(Gio.DBus.session, busName,
'/org/mpris/MediaPlayer2', '/org/mpris/MediaPlayer2',
this._onMprisProxyReady.bind(this)); this._onMprisProxyReady.bind(this));
@@ -100,43 +94,43 @@ var MprisPlayer = new Lang.Class({
this._trackArtists = []; this._trackArtists = [];
this._trackTitle = ''; this._trackTitle = '';
this._trackCoverUrl = ''; this._trackCoverUrl = '';
}, }
get status() { get status() {
return this._playerProxy.PlaybackStatus; return this._playerProxy.PlaybackStatus;
}, }
get trackArtists() { get trackArtists() {
return this._trackArtists; return this._trackArtists;
}, }
get trackTitle() { get trackTitle() {
return this._trackTitle; return this._trackTitle;
}, }
get trackCoverUrl() { get trackCoverUrl() {
return this._trackCoverUrl; return this._trackCoverUrl;
}, }
playPause() { playPause() {
this._playerProxy.PlayPauseRemote(); this._playerProxy.PlayPauseRemote();
}, }
get canGoNext() { get canGoNext() {
return this._playerProxy.CanGoNext; return this._playerProxy.CanGoNext;
}, }
next() { next() {
this._playerProxy.NextRemote(); this._playerProxy.NextRemote();
}, }
get canGoPrevious() { get canGoPrevious() {
return this._playerProxy.CanGoPrevious; return this._playerProxy.CanGoPrevious;
}, }
previous() { previous() {
this._playerProxy.PreviousRemote(); this._playerProxy.PreviousRemote();
}, }
raise() { raise() {
// The remote Raise() method may run into focus stealing prevention, // The remote Raise() method may run into focus stealing prevention,
@@ -151,7 +145,7 @@ var MprisPlayer = new Lang.Class({
app.activate(); app.activate();
else if (this._mprisProxy.CanRaise) else if (this._mprisProxy.CanRaise)
this._mprisProxy.RaiseRemote(); this._mprisProxy.RaiseRemote();
}, }
_close() { _close() {
this._mprisProxy.disconnect(this._ownerNotifyId); this._mprisProxy.disconnect(this._ownerNotifyId);
@@ -161,7 +155,7 @@ var MprisPlayer = new Lang.Class({
this._playerProxy = null; this._playerProxy = null;
this.emit('closed'); this.emit('closed');
}, }
_onMprisProxyReady() { _onMprisProxyReady() {
this._ownerNotifyId = this._mprisProxy.connect('notify::g-name-owner', this._ownerNotifyId = this._mprisProxy.connect('notify::g-name-owner',
@@ -169,13 +163,13 @@ var MprisPlayer = new Lang.Class({
if (!this._mprisProxy.g_name_owner) if (!this._mprisProxy.g_name_owner)
this._close(); this._close();
}); });
}, }
_onPlayerProxyReady() { _onPlayerProxyReady() {
this._propsChangedId = this._playerProxy.connect('g-properties-changed', this._propsChangedId = this._playerProxy.connect('g-properties-changed',
this._updateState.bind(this)); this._updateState.bind(this));
this._updateState(); this._updateState();
}, }
_updateState() { _updateState() {
let metadata = {}; let metadata = {};
@@ -197,15 +191,12 @@ var MprisPlayer = new Lang.Class({
this._close(); this._close();
} }
} }
}); };
Signals.addSignalMethods(MprisPlayer.prototype); Signals.addSignalMethods(MprisPlayer.prototype);
var MediaSection = new Lang.Class({ var MediaSection = class MediaSection extends MessageList.MessageListSection {
Name: 'MediaSection', constructor() {
Extends: MessageList.MessageListSection, super();
_init() {
this.parent();
this._players = new Map(); this._players = new Map();
@@ -213,11 +204,11 @@ var MediaSection = new Lang.Class({
'org.freedesktop.DBus', 'org.freedesktop.DBus',
'/org/freedesktop/DBus', '/org/freedesktop/DBus',
this._onProxyReady.bind(this)); this._onProxyReady.bind(this));
}, }
_shouldShow() { _shouldShow() {
return !this.empty && Calendar.isToday(this._date); return !this.empty && Calendar.isToday(this._date);
}, }
_addPlayer(busName) { _addPlayer(busName) {
if (this._players.get(busName)) if (this._players.get(busName))
@@ -234,7 +225,7 @@ var MediaSection = new Lang.Class({
this.addMessage(message, true); this.addMessage(message, true);
}); });
this._players.set(busName, player); this._players.set(busName, player);
}, }
_onProxyReady() { _onProxyReady() {
this._proxy.ListNamesRemote(([names]) => { this._proxy.ListNamesRemote(([names]) => {
@@ -247,7 +238,7 @@ var MediaSection = new Lang.Class({
}); });
this._proxy.connectSignal('NameOwnerChanged', this._proxy.connectSignal('NameOwnerChanged',
this._onNameOwnerChanged.bind(this)); this._onNameOwnerChanged.bind(this));
}, }
_onNameOwnerChanged(proxy, sender, [name, oldOwner, newOwner]) { _onNameOwnerChanged(proxy, sender, [name, oldOwner, newOwner]) {
if (!name.startsWith(MPRIS_PLAYER_PREFIX)) if (!name.startsWith(MPRIS_PLAYER_PREFIX))
@@ -256,4 +247,4 @@ var MediaSection = new Lang.Class({
if (newOwner && !oldOwner) if (newOwner && !oldOwner)
this._addPlayer(name); this._addPlayer(name);
} }
}); };

View File

@@ -5,7 +5,6 @@ const GdkPixbuf = imports.gi.GdkPixbuf;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const St = imports.gi.St; const St = imports.gi.St;
@@ -51,10 +50,8 @@ const rewriteRules = {
] ]
}; };
var FdoNotificationDaemon = new Lang.Class({ var FdoNotificationDaemon = class FdoNotificationDaemon {
Name: 'FdoNotificationDaemon', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(FdoNotificationsIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(FdoNotificationsIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications'); this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
@@ -69,7 +66,7 @@ var FdoNotificationDaemon = new Lang.Class({
this._onFocusAppChanged.bind(this)); this._onFocusAppChanged.bind(this));
Main.overview.connect('hidden', Main.overview.connect('hidden',
this._onFocusAppChanged.bind(this)); this._onFocusAppChanged.bind(this));
}, }
_imageForNotificationData(hints) { _imageForNotificationData(hints) {
if (hints['image-data']) { if (hints['image-data']) {
@@ -77,9 +74,11 @@ var FdoNotificationDaemon = new Lang.Class({
bitsPerSample, nChannels, data] = hints['image-data']; bitsPerSample, nChannels, data] = hints['image-data'];
return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha, return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha,
bitsPerSample, width, height, rowStride); bitsPerSample, width, height, rowStride);
} else if (hints['image-path']) {
return this._iconForNotificationData(hints['image-path']);
} }
return this._iconForNotificationData(hints['image-path']); return null;
}, }
_fallbackIconForNotificationData(hints) { _fallbackIconForNotificationData(hints) {
let stockIcon; let stockIcon;
@@ -93,7 +92,7 @@ var FdoNotificationDaemon = new Lang.Class({
break; break;
} }
return new Gio.ThemedIcon({ name: stockIcon }); return new Gio.ThemedIcon({ name: stockIcon });
}, }
_iconForNotificationData(icon) { _iconForNotificationData(icon) {
if (icon) { if (icon) {
@@ -105,7 +104,7 @@ var FdoNotificationDaemon = new Lang.Class({
return new Gio.ThemedIcon({ name: icon }); return new Gio.ThemedIcon({ name: icon });
} }
return null; return null;
}, }
_lookupSource(title, pid) { _lookupSource(title, pid) {
for (let i = 0; i < this._sources.length; i++) { for (let i = 0; i < this._sources.length; i++) {
@@ -114,7 +113,7 @@ var FdoNotificationDaemon = new Lang.Class({
return source; return source;
} }
return null; return null;
}, }
// Returns the source associated with ndata.notification if it is set. // Returns the source associated with ndata.notification if it is set.
// If the existing or requested source is associated with a tray icon // If the existing or requested source is associated with a tray icon
@@ -156,7 +155,7 @@ var FdoNotificationDaemon = new Lang.Class({
Main.messageTray.add(source); Main.messageTray.add(source);
return source; return source;
}, }
NotifyAsync(params, invocation) { NotifyAsync(params, invocation) {
let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params; let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params;
@@ -264,7 +263,7 @@ var FdoNotificationDaemon = new Lang.Class({
}); });
return invocation.return_value(GLib.Variant.new('(u)', [id])); return invocation.return_value(GLib.Variant.new('(u)', [id]));
}, }
_notifyForSource(source, ndata) { _notifyForSource(source, ndata) {
let [id, icon, summary, body, actions, hints, notification] = let [id, icon, summary, body, actions, hints, notification] =
@@ -355,7 +354,7 @@ var FdoNotificationDaemon = new Lang.Class({
let sourceGIcon = source.useNotificationIcon ? gicon : null; let sourceGIcon = source.useNotificationIcon ? gicon : null;
source.processNotification(notification, sourceGIcon); source.processNotification(notification, sourceGIcon);
}, }
CloseNotification(id) { CloseNotification(id) {
let ndata = this._notifications[id]; let ndata = this._notifications[id];
@@ -364,7 +363,7 @@ var FdoNotificationDaemon = new Lang.Class({
ndata.notification.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); ndata.notification.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
delete this._notifications[id]; delete this._notifications[id];
} }
}, }
GetCapabilities() { GetCapabilities() {
return [ return [
@@ -379,7 +378,7 @@ var FdoNotificationDaemon = new Lang.Class({
'persistence', 'persistence',
'sound', 'sound',
]; ];
}, }
GetServerInformation() { GetServerInformation() {
return [ return [
@@ -388,7 +387,7 @@ var FdoNotificationDaemon = new Lang.Class({
Config.PACKAGE_VERSION, Config.PACKAGE_VERSION,
'1.2' '1.2'
]; ];
}, }
_onFocusAppChanged() { _onFocusAppChanged() {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
@@ -402,31 +401,27 @@ var FdoNotificationDaemon = new Lang.Class({
return; return;
} }
} }
}, }
_emitNotificationClosed(id, reason) { _emitNotificationClosed(id, reason) {
this._dbusImpl.emit_signal('NotificationClosed', this._dbusImpl.emit_signal('NotificationClosed',
GLib.Variant.new('(uu)', [id, reason])); GLib.Variant.new('(uu)', [id, reason]));
}, }
_emitActionInvoked(id, action) { _emitActionInvoked(id, action) {
this._dbusImpl.emit_signal('ActionInvoked', this._dbusImpl.emit_signal('ActionInvoked',
GLib.Variant.new('(us)', [id, action])); GLib.Variant.new('(us)', [id, action]));
} }
}); };
var FdoNotificationDaemonSource = new Lang.Class({ var FdoNotificationDaemonSource =
Name: 'FdoNotificationDaemonSource', class FdoNotificationDaemonSource extends MessageTray.Source {
Extends: MessageTray.Source, constructor(title, pid, sender, appId) {
super(title);
_init(title, pid, sender, appId) {
// Need to set the app before chaining up, so
// methods called from the parent constructor can find it
this.pid = pid; this.pid = pid;
this.app = this._getApp(appId); this.app = this._getApp(appId);
this.parent(title);
this.initialTitle = title; this.initialTitle = title;
if (this.app) if (this.app)
@@ -441,7 +436,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
this._onNameVanished.bind(this)); this._onNameVanished.bind(this));
else else
this._nameWatcherId = 0; this._nameWatcherId = 0;
}, }
_createPolicy() { _createPolicy() {
if (this.app && this.app.get_app_info()) { if (this.app && this.app.get_app_info()) {
@@ -450,7 +445,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
} else { } else {
return new MessageTray.NotificationGenericPolicy(); return new MessageTray.NotificationGenericPolicy();
} }
}, }
_onNameVanished() { _onNameVanished() {
// Destroy the notification source when its sender is removed from DBus. // Destroy the notification source when its sender is removed from DBus.
@@ -460,7 +455,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
// so allow the code path that handles the tray icon being removed to handle that case. // so allow the code path that handles the tray icon being removed to handle that case.
if (this.app) if (this.app)
this.destroy(); this.destroy();
}, }
processNotification(notification, gicon) { processNotification(notification, gicon) {
if (gicon) if (gicon)
@@ -472,7 +467,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
this.pushNotification(notification); this.pushNotification(notification);
else else
this.notify(notification); this.notify(notification);
}, }
_getApp(appId) { _getApp(appId) {
let app; let app;
@@ -488,7 +483,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
} }
return null; return null;
}, }
setTitle(title) { setTitle(title) {
// Do nothing if .app is set, we don't want to override the // Do nothing if .app is set, we don't want to override the
@@ -497,13 +492,13 @@ var FdoNotificationDaemonSource = new Lang.Class({
if (this.app) if (this.app)
return; return;
this.parent(title); super.setTitle(title);
}, }
open() { open() {
this.openApp(); this.openApp();
this.destroyNonResidentNotifications(); this.destroyNonResidentNotifications();
}, }
openApp() { openApp() {
if (this.app == null) if (this.app == null)
@@ -512,7 +507,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
this.app.activate(); this.app.activate();
Main.overview.hide(); Main.overview.hide();
Main.panel.closeCalendar(); Main.panel.closeCalendar();
}, }
destroy() { destroy() {
if (this._nameWatcherId) { if (this._nameWatcherId) {
@@ -520,8 +515,8 @@ var FdoNotificationDaemonSource = new Lang.Class({
this._nameWatcherId = 0; this._nameWatcherId = 0;
} }
this.parent(); super.destroy();
}, }
createIcon(size) { createIcon(size) {
if (this.app) { if (this.app) {
@@ -533,7 +528,7 @@ var FdoNotificationDaemonSource = new Lang.Class({
return null; return null;
} }
} }
}); };
const PRIORITY_URGENCY_MAP = { const PRIORITY_URGENCY_MAP = {
low: MessageTray.Urgency.LOW, low: MessageTray.Urgency.LOW,
@@ -542,12 +537,10 @@ const PRIORITY_URGENCY_MAP = {
urgent: MessageTray.Urgency.CRITICAL urgent: MessageTray.Urgency.CRITICAL
}; };
var GtkNotificationDaemonNotification = new Lang.Class({ var GtkNotificationDaemonNotification =
Name: 'GtkNotificationDaemonNotification', class GtkNotificationDaemonNotification extends MessageTray.Notification {
Extends: MessageTray.Notification, constructor(source, notification) {
super(source);
_init(source, notification) {
this.parent(source);
this._serialized = GLib.Variant.new('a{sv}', notification); this._serialized = GLib.Variant.new('a{sv}', notification);
let { "title": title, let { "title": title,
@@ -584,7 +577,7 @@ var GtkNotificationDaemonNotification = new Lang.Class({
this.update(title.unpack(), body ? body.unpack() : null, this.update(title.unpack(), body ? body.unpack() : null,
{ gicon: gicon ? Gio.icon_deserialize(gicon) : null, { gicon: gicon ? Gio.icon_deserialize(gicon) : null,
datetime : time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null }); datetime : time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null });
}, }
_activateAction(namespacedActionId, target) { _activateAction(namespacedActionId, target) {
if (namespacedActionId) { if (namespacedActionId) {
@@ -595,22 +588,22 @@ var GtkNotificationDaemonNotification = new Lang.Class({
} else { } else {
this.source.open(); this.source.open();
} }
}, }
_onButtonClicked(button) { _onButtonClicked(button) {
let { 'action': action, 'target': actionTarget } = button; let { 'action': action, 'target': actionTarget } = button;
this._activateAction(action.unpack(), actionTarget); this._activateAction(action.unpack(), actionTarget);
}, }
activate() { activate() {
this._activateAction(this._defaultAction, this._defaultActionTarget); this._activateAction(this._defaultAction, this._defaultActionTarget);
this.parent(); super.activate();
}, }
serialize() { serialize() {
return this._serialized; return this._serialized;
}, }
}); };
const FdoApplicationIface = loadInterfaceXML('org.freedesktop.Application'); const FdoApplicationIface = loadInterfaceXML('org.freedesktop.Application');
const FdoApplicationProxy = Gio.DBusProxy.makeProxyWrapper(FdoApplicationIface); const FdoApplicationProxy = Gio.DBusProxy.makeProxyWrapper(FdoApplicationIface);
@@ -626,41 +619,42 @@ function getPlatformData() {
function InvalidAppError() {} function InvalidAppError() {}
var GtkNotificationDaemonAppSource = new Lang.Class({ var GtkNotificationDaemonAppSource =
Name: 'GtkNotificationDaemonAppSource', class GtkNotificationDaemonAppSource extends MessageTray.Source {
Extends: MessageTray.Source, constructor(appId) {
let objectPath = objectPathFromAppId(appId);
if (!GLib.Variant.is_object_path(objectPath))
throw new InvalidAppError();
let app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
if (!app)
throw new InvalidAppError();
super(app.get_name());
_init(appId) {
this._appId = appId; this._appId = appId;
this._objectPath = objectPathFromAppId(appId); this._app = app;
if (!GLib.Variant.is_object_path(this._objectPath)) this._objectPath = objectPath;
throw new InvalidAppError();
this._app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
if (!this._app)
throw new InvalidAppError();
this._notifications = {}; this._notifications = {};
this._notificationPending = false; this._notificationPending = false;
}
this.parent(this._app.get_name());
},
createIcon(size) { createIcon(size) {
return this._app.create_icon_texture(size); return this._app.create_icon_texture(size);
}, }
_createPolicy() { _createPolicy() {
return new MessageTray.NotificationApplicationPolicy(this._appId); return new MessageTray.NotificationApplicationPolicy(this._appId);
}, }
_createApp(callback) { _createApp(callback) {
return new FdoApplicationProxy(Gio.DBus.session, this._appId, this._objectPath, callback); return new FdoApplicationProxy(Gio.DBus.session, this._appId, this._objectPath, callback);
}, }
_createNotification(params) { _createNotification(params) {
return new GtkNotificationDaemonNotification(this, params); return new GtkNotificationDaemonNotification(this, params);
}, }
activateAction(actionId, target) { activateAction(actionId, target) {
this._createApp((app, error) => { this._createApp((app, error) => {
@@ -671,7 +665,7 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
}); });
Main.overview.hide(); Main.overview.hide();
Main.panel.closeCalendar(); Main.panel.closeCalendar();
}, }
open() { open() {
this._createApp((app, error) => { this._createApp((app, error) => {
@@ -682,7 +676,7 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
}); });
Main.overview.hide(); Main.overview.hide();
Main.panel.closeCalendar(); Main.panel.closeCalendar();
}, }
addNotification(notificationId, notificationParams, showBanner) { addNotification(notificationId, notificationParams, showBanner) {
this._notificationPending = true; this._notificationPending = true;
@@ -702,18 +696,18 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
this.pushNotification(notification); this.pushNotification(notification);
this._notificationPending = false; this._notificationPending = false;
}, }
destroy(reason) { destroy(reason) {
if (this._notificationPending) if (this._notificationPending)
return; return;
this.parent(reason); super.destroy(reason);
}, }
removeNotification(notificationId) { removeNotification(notificationId) {
if (this._notifications[notificationId]) if (this._notifications[notificationId])
this._notifications[notificationId].destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); this._notifications[notificationId].destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
}, }
serialize() { serialize() {
let notifications = []; let notifications = [];
@@ -722,15 +716,13 @@ var GtkNotificationDaemonAppSource = new Lang.Class({
notifications.push([notificationId, notification.serialize()]); notifications.push([notificationId, notification.serialize()]);
} }
return [this._appId, notifications]; return [this._appId, notifications];
}, }
}); };
const GtkNotificationsIface = loadInterfaceXML('org.gtk.Notifications'); const GtkNotificationsIface = loadInterfaceXML('org.gtk.Notifications');
var GtkNotificationDaemon = new Lang.Class({ var GtkNotificationDaemon = class GtkNotificationDaemon {
Name: 'GtkNotificationDaemon', constructor() {
_init() {
this._sources = {}; this._sources = {};
this._loadNotifications(); this._loadNotifications();
@@ -739,7 +731,7 @@ var GtkNotificationDaemon = new Lang.Class({
this._dbusImpl.export(Gio.DBus.session, '/org/gtk/Notifications'); this._dbusImpl.export(Gio.DBus.session, '/org/gtk/Notifications');
Gio.DBus.session.own_name('org.gtk.Notifications', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gtk.Notifications', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, }
_ensureAppSource(appId) { _ensureAppSource(appId) {
if (this._sources[appId]) if (this._sources[appId])
@@ -755,7 +747,7 @@ var GtkNotificationDaemon = new Lang.Class({
Main.messageTray.add(source); Main.messageTray.add(source);
this._sources[appId] = source; this._sources[appId] = source;
return source; return source;
}, }
_loadNotifications() { _loadNotifications() {
this._isLoading = true; this._isLoading = true;
@@ -783,7 +775,7 @@ var GtkNotificationDaemon = new Lang.Class({
} }
this._isLoading = false; this._isLoading = false;
}, }
_saveNotifications() { _saveNotifications() {
if (this._isLoading) if (this._isLoading)
@@ -796,7 +788,7 @@ var GtkNotificationDaemon = new Lang.Class({
} }
global.set_persistent_state('notifications', new GLib.Variant('a(sa(sv))', sources)); global.set_persistent_state('notifications', new GLib.Variant('a(sa(sv))', sources));
}, }
AddNotificationAsync(params, invocation) { AddNotificationAsync(params, invocation) {
let [appId, notificationId, notification] = params; let [appId, notificationId, notification] = params;
@@ -818,7 +810,7 @@ var GtkNotificationDaemon = new Lang.Class({
source.addNotification(notificationId, notification, true); source.addNotification(notificationId, notification, true);
invocation.return_value(null); invocation.return_value(null);
}, }
RemoveNotificationAsync(params, invocation) { RemoveNotificationAsync(params, invocation) {
let [appId, notificationId] = params; let [appId, notificationId] = params;
@@ -827,14 +819,12 @@ var GtkNotificationDaemon = new Lang.Class({
source.removeNotification(notificationId); source.removeNotification(notificationId);
invocation.return_value(null); invocation.return_value(null);
}, }
}); };
var NotificationDaemon = new Lang.Class({ var NotificationDaemon = class NotificationDaemon {
Name: 'NotificationDaemon', constructor() {
_init() {
this._fdoNotificationDaemon = new FdoNotificationDaemon(); this._fdoNotificationDaemon = new FdoNotificationDaemon();
this._gtkNotificationDaemon = new GtkNotificationDaemon(); this._gtkNotificationDaemon = new GtkNotificationDaemon();
}, }
}); };

View File

@@ -4,17 +4,14 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang;
const Main = imports.ui.main; const Main = imports.ui.main;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
var FADE_TIME = 0.1; var FADE_TIME = 0.1;
var OsdMonitorLabel = new Lang.Class({ var OsdMonitorLabel = class {
Name: 'OsdMonitorLabel', constructor(monitor, label) {
_init(monitor, label) {
this._actor = new St.Widget({ x_expand: true, this._actor = new St.Widget({ x_expand: true,
y_expand: true }); y_expand: true });
@@ -33,7 +30,7 @@ var OsdMonitorLabel = new Lang.Class({
this._position(); this._position();
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_display(global.display);
}, }
_position() { _position() {
let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor); let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor);
@@ -44,18 +41,16 @@ var OsdMonitorLabel = new Lang.Class({
this._box.x = workArea.x; this._box.x = workArea.x;
this._box.y = workArea.y; this._box.y = workArea.y;
}, }
destroy() { destroy() {
this._actor.destroy(); this._actor.destroy();
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_display(global.display);
} }
}); };
var OsdMonitorLabeler = new Lang.Class({ var OsdMonitorLabeler = class {
Name: 'OsdMonitorLabeler', constructor() {
_init() {
this._monitorManager = Meta.MonitorManager.get(); this._monitorManager = Meta.MonitorManager.get();
this._client = null; this._client = null;
this._clientWatchId = 0; this._clientWatchId = 0;
@@ -64,7 +59,7 @@ var OsdMonitorLabeler = new Lang.Class({
Main.layoutManager.connect('monitors-changed', Main.layoutManager.connect('monitors-changed',
this._reset.bind(this)); this._reset.bind(this));
this._reset(); this._reset();
}, }
_reset() { _reset() {
for (let i in this._osdLabels) for (let i in this._osdLabels)
@@ -74,7 +69,7 @@ var OsdMonitorLabeler = new Lang.Class({
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
for (let i in monitors) for (let i in monitors)
this._monitorLabels.set(monitors[i].index, []); this._monitorLabels.set(monitors[i].index, []);
}, }
_trackClient(client) { _trackClient(client) {
if (this._client) if (this._client)
@@ -86,7 +81,7 @@ var OsdMonitorLabeler = new Lang.Class({
this.hide(name); this.hide(name);
}); });
return true; return true;
}, }
_untrackClient(client) { _untrackClient(client) {
if (!this._client || this._client != client) if (!this._client || this._client != client)
@@ -96,7 +91,7 @@ var OsdMonitorLabeler = new Lang.Class({
this._clientWatchId = 0; this._clientWatchId = 0;
this._client = null; this._client = null;
return true; return true;
}, }
show(client, params) { show(client, params) {
if (!this._trackClient(client)) if (!this._trackClient(client))
@@ -118,7 +113,7 @@ var OsdMonitorLabeler = new Lang.Class({
labels.sort(); labels.sort();
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' '))); this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
} }
}, }
show2(client, params) { show2(client, params) {
if (!this._trackClient(client)) if (!this._trackClient(client))
@@ -137,7 +132,7 @@ var OsdMonitorLabeler = new Lang.Class({
labels.sort(); labels.sort();
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' '))); this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
} }
}, }
hide(client) { hide(client) {
if (!this._untrackClient(client)) if (!this._untrackClient(client))
@@ -145,4 +140,4 @@ var OsdMonitorLabeler = new Lang.Class({
this._reset(); this._reset();
} }
}); };

View File

@@ -2,10 +2,10 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const St = imports.gi.St; const St = imports.gi.St;
const BarLevel = imports.ui.barLevel; const BarLevel = imports.ui.barLevel;
const Lang = imports.lang;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
@@ -16,59 +16,51 @@ var HIDE_TIMEOUT = 1500;
var FADE_TIME = 0.1; var FADE_TIME = 0.1;
var LEVEL_ANIMATION_TIME = 0.1; var LEVEL_ANIMATION_TIME = 0.1;
var LevelBar = new Lang.Class({ var LevelBar = class extends BarLevel.BarLevel {
Name: 'LevelBar', constructor() {
Extends: BarLevel.BarLevel, super(0, { styleClass: 'level' });
_init() {
this._level = 0; this._level = 0;
this._maxLevel = 100; this._maxLevel = 100;
let params = {
styleClass: 'level',
}
this.parent(this._level, params);
this.actor.accessible_name = _("Volume"); this.actor.accessible_name = _("Volume");
this.actor.connect('notify::width', () => { this.level = this.level; }); this.actor.connect('notify::width', () => { this.level = this.level; });
}, }
get level() { get level() {
return this._level; return this._level;
}, }
set level(value) { set level(value) {
this._level = Math.max(0, Math.min(value, this._maxLevel)); this._level = Math.max(0, Math.min(value, this._maxLevel));
this.setValue(this._level / 100); this.setValue(this._level / 100);
}, }
get maxLevel() { get maxLevel() {
return this._maxLevel; return this._maxLevel;
}, }
set maxLevel(value) { set maxLevel(value) {
this._maxLevel = Math.max(100, value); this._maxLevel = Math.max(100, value);
this.setMaximumValue(this._maxLevel / 100); this.setMaximumValue(this._maxLevel / 100);
} }
}); };
var OsdWindowConstraint = new Lang.Class({
Name: 'OsdWindowConstraint',
Extends: Clutter.Constraint,
var OsdWindowConstraint = GObject.registerClass(
class OsdWindowConstraint extends Clutter.Constraint {
_init(props) { _init(props) {
this._minSize = 0; this._minSize = 0;
this.parent(props); super._init(props);
}, }
set minSize(v) { set minSize(v) {
this._minSize = v; this._minSize = v;
if (this.actor) if (this.actor)
this.actor.queue_relayout(); this.actor.queue_relayout();
}, }
vfunc_update_allocation(actor, actorBox) { vfunc_update_allocation(actor, actorBox) {
// Clutter will adjust the allocation for margins, // Clutter will adjust the allocation for margins,
@@ -87,10 +79,8 @@ var OsdWindowConstraint = new Lang.Class({
} }
}); });
var OsdWindow = new Lang.Class({ var OsdWindow = class {
Name: 'OsdWindow', constructor(monitorIndex) {
_init(monitorIndex) {
this.actor = new St.Widget({ x_expand: true, this.actor = new St.Widget({ x_expand: true,
y_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER,
@@ -129,7 +119,7 @@ var OsdWindow = new Lang.Class({
this._relayout.bind(this)); this._relayout.bind(this));
this._relayout(); this._relayout();
Main.uiGroup.add_child(this.actor); Main.uiGroup.add_child(this.actor);
}, }
_onDestroy() { _onDestroy() {
if (this._monitorsChangedId) if (this._monitorsChangedId)
@@ -140,17 +130,17 @@ var OsdWindow = new Lang.Class({
if (this._scaleChangedId) if (this._scaleChangedId)
themeContext.disconnect(this._scaleChangedId); themeContext.disconnect(this._scaleChangedId);
this._scaleChangedId = 0; this._scaleChangedId = 0;
}, }
setIcon(icon) { setIcon(icon) {
this._icon.gicon = icon; this._icon.gicon = icon;
}, }
setLabel(label) { setLabel(label) {
this._label.visible = (label != undefined); this._label.visible = (label != undefined);
if (label) if (label)
this._label.text = label; this._label.text = label;
}, }
setLevel(level) { setLevel(level) {
this._level.actor.visible = (level != undefined); this._level.actor.visible = (level != undefined);
@@ -163,13 +153,13 @@ var OsdWindow = new Lang.Class({
else else
this._level.level = level; this._level.level = level;
} }
}, }
setMaxLevel(maxLevel) { setMaxLevel(maxLevel) {
if (maxLevel === undefined) if (maxLevel === undefined)
maxLevel = 100; maxLevel = 100;
this._level.maxLevel = maxLevel; this._level.maxLevel = maxLevel;
}, }
show() { show() {
if (!this._icon.gicon) if (!this._icon.gicon)
@@ -192,7 +182,7 @@ var OsdWindow = new Lang.Class({
this._hideTimeoutId = Mainloop.timeout_add(HIDE_TIMEOUT, this._hideTimeoutId = Mainloop.timeout_add(HIDE_TIMEOUT,
this._hide.bind(this)); this._hide.bind(this));
GLib.Source.set_name_by_id(this._hideTimeoutId, '[gnome-shell] this._hide'); GLib.Source.set_name_by_id(this._hideTimeoutId, '[gnome-shell] this._hide');
}, }
cancel() { cancel() {
if (!this._hideTimeoutId) if (!this._hideTimeoutId)
@@ -200,7 +190,7 @@ var OsdWindow = new Lang.Class({
Mainloop.source_remove(this._hideTimeoutId); Mainloop.source_remove(this._hideTimeoutId);
this._hide(); this._hide();
}, }
_hide() { _hide() {
this._hideTimeoutId = 0; this._hideTimeoutId = 0;
@@ -214,14 +204,14 @@ var OsdWindow = new Lang.Class({
} }
}); });
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_reset() { _reset() {
this.actor.hide(); this.actor.hide();
this.setLabel(null); this.setLabel(null);
this.setMaxLevel(null); this.setMaxLevel(null);
this.setLevel(null); this.setLevel(null);
}, }
_relayout() { _relayout() {
/* assume 110x110 on a 640x480 display and scale from there */ /* assume 110x110 on a 640x480 display and scale from there */
@@ -239,17 +229,15 @@ var OsdWindow = new Lang.Class({
this._box.translation_y = Math.round(monitor.height / 4); this._box.translation_y = Math.round(monitor.height / 4);
this._boxConstraint.minSize = popupSize; this._boxConstraint.minSize = popupSize;
} }
}); };
var OsdWindowManager = new Lang.Class({ var OsdWindowManager = class {
Name: 'OsdWindowManager', constructor() {
_init() {
this._osdWindows = []; this._osdWindows = [];
Main.layoutManager.connect('monitors-changed', Main.layoutManager.connect('monitors-changed',
this._monitorsChanged.bind(this)); this._monitorsChanged.bind(this));
this._monitorsChanged(); this._monitorsChanged();
}, }
_monitorsChanged() { _monitorsChanged() {
for (let i = 0; i < Main.layoutManager.monitors.length; i++) { for (let i = 0; i < Main.layoutManager.monitors.length; i++) {
@@ -263,7 +251,7 @@ var OsdWindowManager = new Lang.Class({
} }
this._osdWindows.length = Main.layoutManager.monitors.length; this._osdWindows.length = Main.layoutManager.monitors.length;
}, }
_showOsdWindow(monitorIndex, icon, label, level, maxLevel) { _showOsdWindow(monitorIndex, icon, label, level, maxLevel) {
this._osdWindows[monitorIndex].setIcon(icon); this._osdWindows[monitorIndex].setIcon(icon);
@@ -271,7 +259,7 @@ var OsdWindowManager = new Lang.Class({
this._osdWindows[monitorIndex].setMaxLevel(maxLevel); this._osdWindows[monitorIndex].setMaxLevel(maxLevel);
this._osdWindows[monitorIndex].setLevel(level); this._osdWindows[monitorIndex].setLevel(level);
this._osdWindows[monitorIndex].show(); this._osdWindows[monitorIndex].show();
}, }
show(monitorIndex, icon, label, level, maxLevel) { show(monitorIndex, icon, label, level, maxLevel) {
if (monitorIndex != -1) { if (monitorIndex != -1) {
@@ -285,10 +273,10 @@ var OsdWindowManager = new Lang.Class({
for (let i = 0; i < this._osdWindows.length; i++) for (let i = 0; i < this._osdWindows.length; i++)
this._showOsdWindow(i, icon, label, level, maxLevel); this._showOsdWindow(i, icon, label, level, maxLevel);
} }
}, }
hideAll() { hideAll() {
for (let i = 0; i < this._osdWindows.length; i++) for (let i = 0; i < this._osdWindows.length; i++)
this._osdWindows[i].cancel(); this._osdWindows[i].cancel();
} }
}); };

View File

@@ -6,7 +6,6 @@ const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
@@ -35,13 +34,11 @@ var DND_WINDOW_SWITCH_TIMEOUT = 750;
var OVERVIEW_ACTIVATION_TIMEOUT = 0.5; var OVERVIEW_ACTIVATION_TIMEOUT = 0.5;
var ShellInfo = new Lang.Class({ var ShellInfo = class {
Name: 'ShellInfo', constructor() {
_init() {
this._source = null; this._source = null;
this._undoCallback = null; this._undoCallback = null;
}, }
_onUndoClicked() { _onUndoClicked() {
if (this._undoCallback) if (this._undoCallback)
@@ -50,7 +47,7 @@ var ShellInfo = new Lang.Class({
if (this._source) if (this._source)
this._source.destroy(); this._source.destroy();
}, }
setMessage(text, options) { setMessage(text, options) {
options = Params.parse(options, { undoCallback: null, options = Params.parse(options, { undoCallback: null,
@@ -84,18 +81,16 @@ var ShellInfo = new Lang.Class({
this._source.notify(notification); this._source.notify(notification);
} }
}); };
var Overview = new Lang.Class({ var Overview = class {
Name: 'Overview', constructor() {
_init() {
this._overviewCreated = false; this._overviewCreated = false;
this._initCalled = false; this._initCalled = false;
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
this._sessionUpdated(); this._sessionUpdated();
}, }
_createOverview() { _createOverview() {
if (this._overviewCreated) if (this._overviewCreated)
@@ -167,7 +162,7 @@ var Overview = new Lang.Class({
if (this._initCalled) if (this._initCalled)
this.init(); this.init();
}, }
_updateBackgrounds() { _updateBackgrounds() {
for (let i = 0; i < this._bgManagers.length; i++) for (let i = 0; i < this._bgManagers.length; i++)
@@ -181,7 +176,7 @@ var Overview = new Lang.Class({
vignette: true }); vignette: true });
this._bgManagers.push(bgManager); this._bgManagers.push(bgManager);
} }
}, }
_unshadeBackgrounds() { _unshadeBackgrounds() {
let backgrounds = this._backgroundGroup.get_children(); let backgrounds = this._backgroundGroup.get_children();
@@ -193,7 +188,7 @@ var Overview = new Lang.Class({
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
} }
}, }
_shadeBackgrounds() { _shadeBackgrounds() {
let backgrounds = this._backgroundGroup.get_children(); let backgrounds = this._backgroundGroup.get_children();
@@ -205,12 +200,12 @@ var Overview = new Lang.Class({
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
} }
}, }
_sessionUpdated() { _sessionUpdated() {
this.isDummy = !Main.sessionMode.hasOverview; this.isDummy = !Main.sessionMode.hasOverview;
this._createOverview(); this._createOverview();
}, }
// The members we construct that are implemented in JS might // The members we construct that are implemented in JS might
// want to access the overview as Main.overview to connect // want to access the overview as Main.overview to connect
@@ -259,15 +254,15 @@ var Overview = new Lang.Class({
Main.layoutManager.connect('monitors-changed', this._relayout.bind(this)); Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
this._relayout(); this._relayout();
}, }
addSearchProvider(provider) { addSearchProvider(provider) {
this.viewSelector.addSearchProvider(provider); this.viewSelector.addSearchProvider(provider);
}, }
removeSearchProvider(provider) { removeSearchProvider(provider) {
this.viewSelector.removeSearchProvider(provider); this.viewSelector.removeSearchProvider(provider);
}, }
// //
// options: // options:
@@ -279,7 +274,7 @@ var Overview = new Lang.Class({
return; return;
this._shellInfo.setMessage(text, options); this._shellInfo.setMessage(text, options);
}, }
_onDragBegin() { _onDragBegin() {
this._inXdndDrag = true; this._inXdndDrag = true;
@@ -288,7 +283,7 @@ var Overview = new Lang.Class({
// Remember the workspace we started from // Remember the workspace we started from
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._lastActiveWorkspaceIndex = workspaceManager.get_active_workspace_index(); this._lastActiveWorkspaceIndex = workspaceManager.get_active_workspace_index();
}, }
_onDragEnd(time) { _onDragEnd(time) {
this._inXdndDrag = false; this._inXdndDrag = false;
@@ -305,7 +300,7 @@ var Overview = new Lang.Class({
this._lastHoveredWindow = null; this._lastHoveredWindow = null;
DND.removeDragMonitor(this._dragMonitor); DND.removeDragMonitor(this._dragMonitor);
this.endItemDrag(); this.endItemDrag();
}, }
_resetWindowSwitchTimeout() { _resetWindowSwitchTimeout() {
if (this._windowSwitchTimeoutId != 0) { if (this._windowSwitchTimeoutId != 0) {
@@ -313,7 +308,7 @@ var Overview = new Lang.Class({
this._windowSwitchTimeoutId = 0; this._windowSwitchTimeoutId = 0;
this._needsFakePointerEvent = false; this._needsFakePointerEvent = false;
} }
}, }
_fakePointerEvent() { _fakePointerEvent() {
let display = Gdk.Display.get_default(); let display = Gdk.Display.get_default();
@@ -322,7 +317,7 @@ var Overview = new Lang.Class({
let [gdkScreen, pointerX, pointerY] = pointer.get_position(); let [gdkScreen, pointerX, pointerY] = pointer.get_position();
pointer.warp(gdkScreen, pointerX, pointerY); pointer.warp(gdkScreen, pointerX, pointerY);
}, }
_onDragMotion(dragEvent) { _onDragMotion(dragEvent) {
let targetIsWindow = dragEvent.targetActor && let targetIsWindow = dragEvent.targetActor &&
@@ -356,19 +351,19 @@ var Overview = new Lang.Class({
} }
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;
}, }
_onScrollEvent(actor, event) { _onScrollEvent(actor, event) {
this.emit('scroll-event', event); this.emit('scroll-event', event);
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
addAction(action) { addAction(action) {
if (this.isDummy) if (this.isDummy)
return; return;
this._backgroundGroup.add_action(action); this._backgroundGroup.add_action(action);
}, }
_getDesktopClone() { _getDesktopClone() {
let windows = global.get_window_actors().filter( let windows = global.get_window_actors().filter(
@@ -384,7 +379,7 @@ var Overview = new Lang.Class({
clone.destroy(); clone.destroy();
}); });
return clone; return clone;
}, }
_relayout() { _relayout() {
// To avoid updating the position and size of the workspaces // To avoid updating the position and size of the workspaces
@@ -399,7 +394,7 @@ var Overview = new Lang.Class({
this._coverPane.set_size(global.screen_width, global.screen_height); this._coverPane.set_size(global.screen_width, global.screen_height);
this._updateBackgrounds(); this._updateBackgrounds();
}, }
_onRestacked() { _onRestacked() {
let stack = global.get_window_actors(); let stack = global.get_window_actors();
@@ -411,44 +406,44 @@ var Overview = new Lang.Class({
} }
this.emit('windows-restacked', stackIndices); this.emit('windows-restacked', stackIndices);
}, }
beginItemDrag(source) { beginItemDrag(source) {
this.emit('item-drag-begin'); this.emit('item-drag-begin');
this._inItemDrag = true; this._inItemDrag = true;
}, }
cancelledItemDrag(source) { cancelledItemDrag(source) {
this.emit('item-drag-cancelled'); this.emit('item-drag-cancelled');
}, }
endItemDrag(source) { endItemDrag(source) {
if (!this._inItemDrag) if (!this._inItemDrag)
return; return;
this.emit('item-drag-end'); this.emit('item-drag-end');
this._inItemDrag = false; this._inItemDrag = false;
}, }
beginWindowDrag(window) { beginWindowDrag(window) {
this.emit('window-drag-begin', window); this.emit('window-drag-begin', window);
this._inWindowDrag = true; this._inWindowDrag = true;
}, }
cancelledWindowDrag(window) { cancelledWindowDrag(window) {
this.emit('window-drag-cancelled', window); this.emit('window-drag-cancelled', window);
}, }
endWindowDrag(window) { endWindowDrag(window) {
if (!this._inWindowDrag) if (!this._inWindowDrag)
return; return;
this.emit('window-drag-end', window); this.emit('window-drag-end', window);
this._inWindowDrag = false; this._inWindowDrag = false;
}, }
focusSearch() { focusSearch() {
this.show(); this.show();
this._searchEntry.grab_key_focus(); this._searchEntry.grab_key_focus();
}, }
fadeInDesktop() { fadeInDesktop() {
this._desktopFade.opacity = 0; this._desktopFade.opacity = 0;
@@ -457,7 +452,7 @@ var Overview = new Lang.Class({
{ opacity: 255, { opacity: 255,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, }
fadeOutDesktop() { fadeOutDesktop() {
if (!this._desktopFade.get_n_children()) { if (!this._desktopFade.get_n_children()) {
@@ -475,7 +470,7 @@ var Overview = new Lang.Class({
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
}, }
// Checks if the Activities button is currently sensitive to // Checks if the Activities button is currently sensitive to
// clicks. The first call to this function within the // clicks. The first call to this function within the
@@ -492,7 +487,7 @@ var Overview = new Lang.Class({
GLib.get_monotonic_time() / GLib.USEC_PER_SEC - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT) GLib.get_monotonic_time() / GLib.USEC_PER_SEC - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT)
return true; return true;
return false; return false;
}, }
_syncGrab() { _syncGrab() {
// We delay grab changes during animation so that when removing the // We delay grab changes during animation so that when removing the
@@ -521,7 +516,7 @@ var Overview = new Lang.Class({
} }
} }
return true; return true;
}, }
// show: // show:
// //
@@ -538,7 +533,7 @@ var Overview = new Lang.Class({
Main.layoutManager.showOverview(); Main.layoutManager.showOverview();
this._animateVisible(); this._animateVisible();
}, }
_animateVisible() { _animateVisible() {
@@ -566,7 +561,7 @@ var Overview = new Lang.Class({
this._coverPane.raise_top(); this._coverPane.raise_top();
this._coverPane.show(); this._coverPane.show();
this.emit('showing'); this.emit('showing');
}, }
_showDone() { _showDone() {
this.animationInProgress = false; this.animationInProgress = false;
@@ -580,7 +575,7 @@ var Overview = new Lang.Class({
this._syncGrab(); this._syncGrab();
global.sync_pointer(); global.sync_pointer();
}, }
// hide: // hide:
// //
@@ -606,8 +601,7 @@ var Overview = new Lang.Class({
this._animateNotVisible(); this._animateNotVisible();
this._syncGrab(); this._syncGrab();
}, }
_animateNotVisible() { _animateNotVisible() {
if (!this.visible || this.animationInProgress) if (!this.visible || this.animationInProgress)
@@ -631,7 +625,7 @@ var Overview = new Lang.Class({
this._coverPane.raise_top(); this._coverPane.raise_top();
this._coverPane.show(); this._coverPane.show();
this.emit('hiding'); this.emit('hiding');
}, }
_hideDone() { _hideDone() {
// Re-enable unredirection // Re-enable unredirection
@@ -658,7 +652,7 @@ var Overview = new Lang.Class({
this._fakePointerEvent(); this._fakePointerEvent();
this._needsFakePointerEvent = false; this._needsFakePointerEvent = false;
} }
}, }
toggle() { toggle() {
if (this.isDummy) if (this.isDummy)
@@ -668,10 +662,10 @@ var Overview = new Lang.Class({
this.hide(); this.hide();
else else
this.show(); this.show();
}, }
getShowAppsButton() { getShowAppsButton() {
return this._dash.showAppsButton; return this._dash.showAppsButton;
} }
}); };
Signals.addSignalMethods(Overview.prototype); Signals.addSignalMethods(Overview.prototype);

View File

@@ -2,7 +2,6 @@
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -30,17 +29,15 @@ var SlideDirection = {
RIGHT: 1 RIGHT: 1
}; };
var SlideLayout = new Lang.Class({ var SlideLayout = GObject.registerClass(
Name: 'SlideLayout', class SlideLayout extends Clutter.FixedLayout {
Extends: Clutter.FixedLayout,
_init(params) { _init(params) {
this._slideX = 1; this._slideX = 1;
this._translationX = undefined; this._translationX = undefined;
this._direction = SlideDirection.LEFT; this._direction = SlideDirection.LEFT;
this.parent(params); super._init(params);
}, }
vfunc_get_preferred_width(container, forHeight) { vfunc_get_preferred_width(container, forHeight) {
let child = container.get_first_child(); let child = container.get_first_child();
@@ -51,7 +48,7 @@ var SlideLayout = new Lang.Class({
natWidth *= this._slideX; natWidth *= this._slideX;
return [minWidth, natWidth]; return [minWidth, natWidth];
}, }
vfunc_allocate(container, box, flags) { vfunc_allocate(container, box, flags) {
let child = container.get_first_child(); let child = container.get_first_child();
@@ -74,40 +71,38 @@ var SlideLayout = new Lang.Class({
actorBox.y2 = actorBox.y1 + availHeight; actorBox.y2 = actorBox.y1 + availHeight;
child.allocate(actorBox, flags); child.allocate(actorBox, flags);
}, }
set slideX(value) { set slideX(value) {
this._slideX = value; this._slideX = value;
this.layout_changed(); this.layout_changed();
}, }
get slideX() { get slideX() {
return this._slideX; return this._slideX;
}, }
set slideDirection(direction) { set slideDirection(direction) {
this._direction = direction; this._direction = direction;
this.layout_changed(); this.layout_changed();
}, }
get slideDirection() { get slideDirection() {
return this._direction; return this._direction;
}, }
set translationX(value) { set translationX(value) {
this._translationX = value; this._translationX = value;
this.layout_changed(); this.layout_changed();
}, }
get translationX() { get translationX() {
return this._translationX; return this._translationX;
}, }
}); });
var SlidingControl = new Lang.Class({ var SlidingControl = class {
Name: 'SlidingControl', constructor(params) {
_init(params) {
params = Params.parse(params, { slideDirection: SlideDirection.LEFT }); params = Params.parse(params, { slideDirection: SlideDirection.LEFT });
this._visible = true; this._visible = true;
@@ -128,23 +123,23 @@ var SlidingControl = new Lang.Class({
Main.overview.connect('window-drag-begin', this._onWindowDragBegin.bind(this)); Main.overview.connect('window-drag-begin', this._onWindowDragBegin.bind(this));
Main.overview.connect('window-drag-cancelled', this._onWindowDragEnd.bind(this)); Main.overview.connect('window-drag-cancelled', this._onWindowDragEnd.bind(this));
Main.overview.connect('window-drag-end', this._onWindowDragEnd.bind(this)); Main.overview.connect('window-drag-end', this._onWindowDragEnd.bind(this));
}, }
_getSlide() { _getSlide() {
throw new Error('getSlide() must be overridden'); throw new Error('getSlide() must be overridden');
}, }
_updateSlide() { _updateSlide() {
Tweener.addTween(this.layout, { slideX: this._getSlide(), Tweener.addTween(this.layout, { slideX: this._getSlide(),
time: SIDE_CONTROLS_ANIMATION_TIME, time: SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, }
getVisibleWidth() { getVisibleWidth() {
let child = this.actor.get_first_child(); let child = this.actor.get_first_child();
let [, , natWidth, ] = child.get_preferred_size(); let [, , natWidth, ] = child.get_preferred_size();
return natWidth; return natWidth;
}, }
_getTranslation() { _getTranslation() {
let child = this.actor.get_first_child(); let child = this.actor.get_first_child();
@@ -155,7 +150,7 @@ var SlidingControl = new Lang.Class({
return - visibleWidth; return - visibleWidth;
else else
return visibleWidth; return visibleWidth;
}, }
_updateTranslation() { _updateTranslation() {
let translationStart = 0; let translationStart = 0;
@@ -176,57 +171,57 @@ var SlidingControl = new Lang.Class({
Tweener.addTween(this.layout, { translationX: translationEnd, Tweener.addTween(this.layout, { translationX: translationEnd,
time: SIDE_CONTROLS_ANIMATION_TIME, time: SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, }
_onOverviewHiding() { _onOverviewHiding() {
// We need to explicitly slideOut since showing pages // We need to explicitly slideOut since showing pages
// doesn't imply sliding out, instead, hiding the overview does. // doesn't imply sliding out, instead, hiding the overview does.
this.slideOut(); this.slideOut();
}, }
_onWindowDragBegin() { _onWindowDragBegin() {
this._onDragBegin(); this._onDragBegin();
}, }
_onWindowDragEnd() { _onWindowDragEnd() {
this._onDragEnd(); this._onDragEnd();
}, }
_onDragBegin() { _onDragBegin() {
this._inDrag = true; this._inDrag = true;
this._updateTranslation(); this._updateTranslation();
this._updateSlide(); this._updateSlide();
}, }
_onDragEnd() { _onDragEnd() {
this._inDrag = false; this._inDrag = false;
this._updateSlide(); this._updateSlide();
}, }
fadeIn() { fadeIn() {
Tweener.addTween(this.actor, { opacity: 255, Tweener.addTween(this.actor, { opacity: 255,
time: SIDE_CONTROLS_ANIMATION_TIME / 2, time: SIDE_CONTROLS_ANIMATION_TIME / 2,
transition: 'easeInQuad' transition: 'easeInQuad'
}); });
}, }
fadeHalf() { fadeHalf() {
Tweener.addTween(this.actor, { opacity: 128, Tweener.addTween(this.actor, { opacity: 128,
time: SIDE_CONTROLS_ANIMATION_TIME / 2, time: SIDE_CONTROLS_ANIMATION_TIME / 2,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
}, }
slideIn() { slideIn() {
this._visible = true; this._visible = true;
// we will update slideX and the translation from pageEmpty // we will update slideX and the translation from pageEmpty
}, }
slideOut() { slideOut() {
this._visible = false; this._visible = false;
this._updateTranslation(); this._updateTranslation();
// we will update slideX from pageEmpty // we will update slideX from pageEmpty
}, }
pageEmpty() { pageEmpty() {
// When pageEmpty is received, there's no visible view in the // When pageEmpty is received, there's no visible view in the
@@ -236,14 +231,11 @@ var SlidingControl = new Lang.Class({
this.layout.slideX = this._getSlide(); this.layout.slideX = this._getSlide();
this._updateTranslation(); this._updateTranslation();
} }
}); };
var ThumbnailsSlider = new Lang.Class({ var ThumbnailsSlider = class extends SlidingControl {
Name: 'ThumbnailsSlider', constructor(thumbnailsBox) {
Extends: SlidingControl, super({ slideDirection: SlideDirection.RIGHT });
_init(thumbnailsBox) {
this.parent({ slideDirection: SlideDirection.RIGHT });
this._thumbnailsBox = thumbnailsBox; this._thumbnailsBox = thumbnailsBox;
@@ -259,7 +251,7 @@ var ThumbnailsSlider = new Lang.Class({
this._updateSlide.bind(this)); this._updateSlide.bind(this));
this.actor.connect('notify::hover', this._updateSlide.bind(this)); this.actor.connect('notify::hover', this._updateSlide.bind(this));
this._thumbnailsBox.bind_property('visible', this.actor, 'visible', GObject.BindingFlags.SYNC_CREATE); this._thumbnailsBox.bind_property('visible', this.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
}, }
_getAlwaysZoomOut() { _getAlwaysZoomOut() {
// Always show the pager on hover, during a drag, or if workspaces are // Always show the pager on hover, during a drag, or if workspaces are
@@ -287,17 +279,17 @@ var ThumbnailsSlider = new Lang.Class({
} }
return alwaysZoomOut; return alwaysZoomOut;
}, }
getNonExpandedWidth() { getNonExpandedWidth() {
let child = this.actor.get_first_child(); let child = this.actor.get_first_child();
return child.get_theme_node().get_length('visible-width'); return child.get_theme_node().get_length('visible-width');
}, }
_onDragEnd() { _onDragEnd() {
this.actor.sync_hover(); this.actor.sync_hover();
this.parent(); super._onDragEnd();
}, }
_getSlide() { _getSlide() {
if (!this._visible) if (!this._visible)
@@ -312,23 +304,20 @@ var ThumbnailsSlider = new Lang.Class({
let expandedWidth = child.get_preferred_width(preferredHeight)[1]; let expandedWidth = child.get_preferred_width(preferredHeight)[1];
return this.getNonExpandedWidth() / expandedWidth; return this.getNonExpandedWidth() / expandedWidth;
}, }
getVisibleWidth() { getVisibleWidth() {
let alwaysZoomOut = this._getAlwaysZoomOut(); let alwaysZoomOut = this._getAlwaysZoomOut();
if (alwaysZoomOut) if (alwaysZoomOut)
return this.parent(); return super.getVisibleWidth();
else else
return this.getNonExpandedWidth(); return this.getNonExpandedWidth();
} }
}); };
var DashSlider = new Lang.Class({ var DashSlider = class extends SlidingControl {
Name: 'DashSlider', constructor(dash) {
Extends: SlidingControl, super({ slideDirection: SlideDirection.LEFT });
_init(dash) {
this.parent({ slideDirection: SlideDirection.LEFT });
this._dash = dash; this._dash = dash;
@@ -344,33 +333,31 @@ var DashSlider = new Lang.Class({
this.actor.add_actor(this._dash.actor); this.actor.add_actor(this._dash.actor);
this._dash.connect('icon-size-changed', this._updateSlide.bind(this)); this._dash.connect('icon-size-changed', this._updateSlide.bind(this));
}, }
_getSlide() { _getSlide() {
if (this._visible || this._inDrag) if (this._visible || this._inDrag)
return 1; return 1;
else else
return 0; return 0;
}, }
_onWindowDragBegin() { _onWindowDragBegin() {
this.fadeHalf(); this.fadeHalf();
}, }
_onWindowDragEnd() { _onWindowDragEnd() {
this.fadeIn(); this.fadeIn();
} }
}); };
var DashSpacer = new Lang.Class({
Name: 'DashSpacer',
Extends: St.Widget,
var DashSpacer = GObject.registerClass(
class DashSpacer extends St.Widget {
_init(params) { _init(params) {
this.parent(params); super._init(params);
this._bindConstraint = null; this._bindConstraint = null;
}, }
setDashActor(dashActor) { setDashActor(dashActor) {
if (this._bindConstraint) { if (this._bindConstraint) {
@@ -383,38 +370,34 @@ var DashSpacer = new Lang.Class({
coordinate: Clutter.BindCoordinate.SIZE }); coordinate: Clutter.BindCoordinate.SIZE });
this.add_constraint(this._bindConstraint); this.add_constraint(this._bindConstraint);
} }
}, }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
let box = this.get_allocation_box(); let box = this.get_allocation_box();
let minWidth = this.parent(forHeight)[0]; let minWidth = super.vfunc_get_preferred_width(forHeight)[0];
let natWidth = box.x2 - box.x1; let natWidth = box.x2 - box.x1;
return [minWidth, natWidth]; return [minWidth, natWidth];
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
let box = this.get_allocation_box(); let box = this.get_allocation_box();
let minHeight = this.parent(forWidth)[0]; let minHeight = super.vfunc_get_preferred_height(forWidth)[0];
let natHeight = box.y2 - box.y1; let natHeight = box.y2 - box.y1;
return [minHeight, natHeight]; return [minHeight, natHeight];
} }
}); });
var ControlsLayout = new Lang.Class({ var ControlsLayout = GObject.registerClass({
Name: 'ControlsLayout',
Extends: Clutter.BinLayout,
Signals: { 'allocation-changed': { flags: GObject.SignalFlags.RUN_LAST } }, Signals: { 'allocation-changed': { flags: GObject.SignalFlags.RUN_LAST } },
}, class ControlsLayout extends Clutter.BinLayout {
vfunc_allocate(container, box, flags) { vfunc_allocate(container, box, flags) {
this.parent(container, box, flags); super.vfunc_allocate(container, box, flags);
this.emit('allocation-changed'); this.emit('allocation-changed');
} }
}); });
var ControlsManager = new Lang.Class({ var ControlsManager = class {
Name: 'ControlsManager', constructor(searchEntry) {
_init(searchEntry) {
this.dash = new Dash.Dash(); this.dash = new Dash.Dash();
this._dashSlider = new DashSlider(this.dash); this._dashSlider = new DashSlider(this.dash);
this._dashSpacer = new DashSpacer(); this._dashSpacer = new DashSpacer();
@@ -457,7 +440,7 @@ var ControlsManager = new Lang.Class({
Main.overview.connect('item-drag-cancelled', () => { Main.overview.connect('item-drag-cancelled', () => {
this.viewSelector.fadeIn(); this.viewSelector.fadeIn();
}); });
}, }
_updateWorkspacesGeometry() { _updateWorkspacesGeometry() {
let [x, y] = this.actor.get_transformed_position(); let [x, y] = this.actor.get_transformed_position();
@@ -477,7 +460,7 @@ var ControlsManager = new Lang.Class({
geometry.x += thumbnailsWidth; geometry.x += thumbnailsWidth;
this.viewSelector.setWorkspacesFullGeometry(geometry); this.viewSelector.setWorkspacesFullGeometry(geometry);
}, }
_setVisibility() { _setVisibility() {
// Ignore the case when we're leaving the overview, since // Ignore the case when we're leaving the overview, since
@@ -502,7 +485,7 @@ var ControlsManager = new Lang.Class({
this._thumbnailsSlider.slideIn(); this._thumbnailsSlider.slideIn();
else else
this._thumbnailsSlider.slideOut(); this._thumbnailsSlider.slideOut();
}, }
_updateSpacerVisibility() { _updateSpacerVisibility() {
if (Main.overview.animationInProgress && !Main.overview.visibleTarget) if (Main.overview.animationInProgress && !Main.overview.visibleTarget)
@@ -510,7 +493,7 @@ var ControlsManager = new Lang.Class({
let activePage = this.viewSelector.getActivePage(); let activePage = this.viewSelector.getActivePage();
this._dashSpacer.visible = (activePage == ViewSelector.ViewPage.WINDOWS); this._dashSpacer.visible = (activePage == ViewSelector.ViewPage.WINDOWS);
}, }
_onPageEmpty() { _onPageEmpty() {
this._dashSlider.pageEmpty(); this._dashSlider.pageEmpty();
@@ -518,4 +501,4 @@ var ControlsManager = new Lang.Class({
this._updateSpacerVisibility(); this._updateSpacerVisibility();
} }
}); };

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
@@ -32,10 +31,8 @@ const CCW = 1;
const UP = 0; const UP = 0;
const DOWN = 1; const DOWN = 1;
var PadChooser = new Lang.Class({ var PadChooser = class {
Name: 'PadChooser', constructor(device, groupDevices) {
_init(device, groupDevices) {
this.actor = new St.Button({ style_class: 'pad-chooser-button', this.actor = new St.Button({ style_class: 'pad-chooser-button',
toggle_mode: true, toggle_mode: true,
x_fill: false, x_fill: false,
@@ -62,7 +59,7 @@ var PadChooser = new Lang.Class({
this._padChooserMenu.close(true); this._padChooserMenu.close(true);
} }
}); });
}, }
_ensureMenu(devices) { _ensureMenu(devices) {
this._padChooserMenu = new PopupMenu.PopupMenu(this.actor, 0.5, St.Side.TOP); this._padChooserMenu = new PopupMenu.PopupMenu(this.actor, 0.5, St.Side.TOP);
@@ -81,33 +78,31 @@ var PadChooser = new Lang.Class({
this.emit('pad-selected', device); this.emit('pad-selected', device);
}); });
} }
}, }
_onDestroy() { _onDestroy() {
this._padChooserMenu.destroy(); this._padChooserMenu.destroy();
}, }
update(devices) { update(devices) {
if (this._padChooserMenu) if (this._padChooserMenu)
this._padChooserMenu.actor.destroy(); this._padChooserMenu.actor.destroy();
this.actor.set_checked(false); this.actor.set_checked(false);
this._ensureMenu(devices); this._ensureMenu(devices);
}, }
destroy() { destroy() {
this.actor.destroy(); this.actor.destroy();
}, }
}); };
Signals.addSignalMethods(PadChooser.prototype); Signals.addSignalMethods(PadChooser.prototype);
var KeybindingEntry = new Lang.Class({ var KeybindingEntry = class {
Name: 'KeybindingEntry', constructor() {
_init() {
this.actor = new St.Entry({ hint_text: _("New shortcut…"), this.actor = new St.Entry({ hint_text: _("New shortcut…"),
style: 'width: 10em' }); style: 'width: 10em' });
this.actor.connect('captured-event', this._onCapturedEvent.bind(this)); this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
}, }
_onCapturedEvent(actor, event) { _onCapturedEvent(actor, event) {
if (event.type() != Clutter.EventType.KEY_PRESS) if (event.type() != Clutter.EventType.KEY_PRESS)
@@ -121,13 +116,11 @@ var KeybindingEntry = new Lang.Class({
this.emit('keybinding-edited', str); this.emit('keybinding-edited', str);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
}); };
Signals.addSignalMethods(KeybindingEntry.prototype); Signals.addSignalMethods(KeybindingEntry.prototype);
var ActionComboBox = new Lang.Class({ var ActionComboBox = class {
Name: 'ActionComboBox', constructor() {
_init() {
this.actor = new St.Button({ style_class: 'button' }); this.actor = new St.Button({ style_class: 'button' });
this.actor.connect('clicked', this._onButtonClicked.bind(this)); this.actor.connect('clicked', this._onButtonClicked.bind(this));
this.actor.set_toggle_mode(true); this.actor.set_toggle_mode(true);
@@ -175,43 +168,41 @@ var ActionComboBox = new Lang.Class({
} }
this.setAction(GDesktopEnums.PadButtonAction.NONE); this.setAction(GDesktopEnums.PadButtonAction.NONE);
}, }
_onActionSelected(action) { _onActionSelected(action) {
this.setAction(action); this.setAction(action);
this.popdown(); this.popdown();
this.emit('action-selected', action); this.emit('action-selected', action);
}, }
setAction(action) { setAction(action) {
this._label.set_text(this._actionLabels.get(action)); this._label.set_text(this._actionLabels.get(action));
}, }
popup() { popup() {
this._editMenu.open(true); this._editMenu.open(true);
}, }
popdown() { popdown() {
this._editMenu.close(true); this._editMenu.close(true);
}, }
_onButtonClicked() { _onButtonClicked() {
if (this.actor.get_checked()) if (this.actor.get_checked())
this.popup(); this.popup();
else else
this.popdown(); this.popdown();
}, }
setButtonActionsActive(active) { setButtonActionsActive(active) {
this._buttonItems.forEach(item => { item.setSensitive(active); }); this._buttonItems.forEach(item => { item.setSensitive(active); });
} }
}); };
Signals.addSignalMethods(ActionComboBox.prototype); Signals.addSignalMethods(ActionComboBox.prototype);
var ActionEditor = new Lang.Class({ var ActionEditor = class {
Name: 'ActionEditor', constructor() {
_init() {
let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL, let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL,
spacing: 12 }); spacing: 12 });
@@ -230,7 +221,7 @@ var ActionEditor = new Lang.Class({
x_expand: false}); x_expand: false});
this._doneButton.connect('clicked', this._onEditingDone.bind(this)); this._doneButton.connect('clicked', this._onEditingDone.bind(this));
this.actor.add_actor(this._doneButton); this.actor.add_actor(this._doneButton);
}, }
_updateKeybindingEntryState() { _updateKeybindingEntryState() {
if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING) { if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING) {
@@ -240,7 +231,7 @@ var ActionEditor = new Lang.Class({
} else { } else {
this._keybindingEdit.actor.hide(); this._keybindingEdit.actor.hide();
} }
}, }
setSettings(settings, action) { setSettings(settings, action) {
this._buttonSettings = settings; this._buttonSettings = settings;
@@ -252,21 +243,21 @@ var ActionEditor = new Lang.Class({
let isButton = (action == Meta.PadActionType.BUTTON); let isButton = (action == Meta.PadActionType.BUTTON);
this._actionComboBox.setButtonActionsActive(isButton); this._actionComboBox.setButtonActionsActive(isButton);
}, }
close() { close() {
this._actionComboBox.popdown(); this._actionComboBox.popdown();
this.actor.hide(); this.actor.hide();
}, }
_onKeybindingEdited(entry, keybinding) { _onKeybindingEdited(entry, keybinding) {
this._currentKeybinding = keybinding; this._currentKeybinding = keybinding;
}, }
_onActionSelected(menu, action) { _onActionSelected(menu, action) {
this._currentAction = action; this._currentAction = action;
this._updateKeybindingEntryState(); this._updateKeybindingEntryState();
}, }
_storeSettings() { _storeSettings() {
if (!this._buttonSettings) if (!this._buttonSettings)
@@ -283,19 +274,17 @@ var ActionEditor = new Lang.Class({
this._buttonSettings.set_string('keybinding', keybinding); this._buttonSettings.set_string('keybinding', keybinding);
else else
this._buttonSettings.reset('keybinding'); this._buttonSettings.reset('keybinding');
}, }
_onEditingDone() { _onEditingDone() {
this._storeSettings(); this._storeSettings();
this.close(); this.close();
this.emit('done'); this.emit('done');
} }
}); };
Signals.addSignalMethods(ActionEditor.prototype); Signals.addSignalMethods(ActionEditor.prototype);
var PadDiagram = new Lang.Class({ var PadDiagram = GObject.registerClass({
Name: 'PadDiagram',
Extends: St.DrawingArea,
Properties: { 'left-handed': GObject.ParamSpec.boolean('left-handed', Properties: { 'left-handed': GObject.ParamSpec.boolean('left-handed',
'left-handed', 'Left handed', 'left-handed', 'Left handed',
GObject.ParamFlags.READWRITE | GObject.ParamFlags.READWRITE |
@@ -311,7 +300,7 @@ var PadDiagram = new Lang.Class({
GObject.ParamFlags.READWRITE | GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT_ONLY, GObject.ParamFlags.CONSTRUCT_ONLY,
Clutter.Actor.$gtype) }, Clutter.Actor.$gtype) },
}, class PadDiagram extends St.DrawingArea {
_init(params) { _init(params) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css'); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
let [success, css, etag] = file.load_contents(null); let [success, css, etag] = file.load_contents(null);
@@ -322,20 +311,20 @@ var PadDiagram = new Lang.Class({
this._css = css; this._css = css;
this._labels = []; this._labels = [];
this._activeButtons = []; this._activeButtons = [];
this.parent(params); super._init(params);
}, }
get left_handed() { get left_handed() {
return this._leftHanded; return this._leftHanded;
}, }
set left_handed(leftHanded) { set left_handed(leftHanded) {
this._leftHanded = leftHanded; this._leftHanded = leftHanded;
}, }
get image() { get image() {
return this._imagePath; return this._imagePath;
}, }
set image(imagePath) { set image(imagePath) {
let originalHandle = Rsvg.Handle.new_from_file(imagePath); let originalHandle = Rsvg.Handle.new_from_file(imagePath);
@@ -345,17 +334,17 @@ var PadDiagram = new Lang.Class({
this._imagePath = imagePath; this._imagePath = imagePath;
this._handle = this._composeStyledDiagram(); this._handle = this._composeStyledDiagram();
}, }
get editor_actor() { get editor_actor() {
return this._editorActor; return this._editorActor;
}, }
set editor_actor(actor) { set editor_actor(actor) {
actor.hide(); actor.hide();
this._editorActor = actor; this._editorActor = actor;
this.add_actor(actor); this.add_actor(actor);
}, }
_wrappingSvgHeader() { _wrappingSvgHeader() {
return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
@@ -363,13 +352,13 @@ var PadDiagram = new Lang.Class({
'xmlns:xi="http://www.w3.org/2001/XInclude" ' + 'xmlns:xi="http://www.w3.org/2001/XInclude" ' +
'width="' + this._imageWidth + '" height="' + this._imageHeight + '"> ' + 'width="' + this._imageWidth + '" height="' + this._imageHeight + '"> ' +
'<style type="text/css">'); '<style type="text/css">');
}, }
_wrappingSvgFooter() { _wrappingSvgFooter() {
return ('</style>' + return ('</style>' +
'<xi:include href="' + this._imagePath + '" />' + '<xi:include href="' + this._imagePath + '" />' +
'</svg>'); '</svg>');
}, }
_cssString() { _cssString() {
let css = this._css; let css = this._css;
@@ -383,7 +372,7 @@ var PadDiagram = new Lang.Class({
} }
return css; return css;
}, }
_composeStyledDiagram() { _composeStyledDiagram() {
let svgData = ''; let svgData = '';
@@ -401,7 +390,7 @@ var PadDiagram = new Lang.Class({
handle.close(); handle.close();
return handle; return handle;
}, }
_updateDiagramScale() { _updateDiagramScale() {
if (this._handle == null) if (this._handle == null)
@@ -412,7 +401,7 @@ var PadDiagram = new Lang.Class({
let scaleX = this._actorWidth / dimensions.width; let scaleX = this._actorWidth / dimensions.width;
let scaleY = this._actorHeight / dimensions.height; let scaleY = this._actorHeight / dimensions.height;
this._scale = Math.min(scaleX, scaleY); this._scale = Math.min(scaleX, scaleY);
}, }
_allocateChild(child, x, y, direction) { _allocateChild(child, x, y, direction) {
let [prefHeight, natHeight] = child.get_preferred_height(-1); let [prefHeight, natHeight] = child.get_preferred_height(-1);
@@ -430,10 +419,10 @@ var PadDiagram = new Lang.Class({
childBox.y1 = y - natHeight / 2; childBox.y1 = y - natHeight / 2;
childBox.y2 = y + natHeight / 2; childBox.y2 = y + natHeight / 2;
child.allocate(childBox, 0); child.allocate(childBox, 0);
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.parent(box, flags); super.vfunc_allocate(box, flags);
this._updateDiagramScale(); this._updateDiagramScale();
for (let i = 0; i < this._labels.length; i++) { for (let i = 0; i < this._labels.length; i++) {
@@ -447,7 +436,7 @@ var PadDiagram = new Lang.Class({
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir); let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(this._editorActor, x, y, arrangement); this._allocateChild(this._editorActor, x, y, arrangement);
} }
}, }
vfunc_repaint() { vfunc_repaint() {
if (this._handle == null) if (this._handle == null)
@@ -469,7 +458,7 @@ var PadDiagram = new Lang.Class({
this._handle.render_cairo(cr); this._handle.render_cairo(cr);
cr.restore(); cr.restore();
cr.$dispose(); cr.$dispose();
}, }
_transformPoint(x, y) { _transformPoint(x, y) {
if (this._handle == null || this._scale == null) if (this._handle == null || this._scale == null)
@@ -480,7 +469,7 @@ var PadDiagram = new Lang.Class({
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale; x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;; y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;;
return [Math.round(x), Math.round(y)]; return [Math.round(x), Math.round(y)];
}, }
_getItemLabelCoords(labelName, leaderName) { _getItemLabelCoords(labelName, leaderName) {
if (this._handle == null) if (this._handle == null)
@@ -512,7 +501,7 @@ var PadDiagram = new Lang.Class({
let [x, y] = this._transformPoint(pos.x, pos.y) let [x, y] = this._transformPoint(pos.x, pos.y)
return [true, x, y, direction]; return [true, x, y, direction];
}, }
getButtonLabelCoords(button) { getButtonLabelCoords(button) {
let ch = String.fromCharCode('A'.charCodeAt() + button); let ch = String.fromCharCode('A'.charCodeAt() + button);
@@ -520,7 +509,7 @@ var PadDiagram = new Lang.Class({
let leaderName = 'Leader' + ch; let leaderName = 'Leader' + ch;
return this._getItemLabelCoords(labelName, leaderName); return this._getItemLabelCoords(labelName, leaderName);
}, }
getRingLabelCoords(number, dir) { getRingLabelCoords(number, dir) {
let numStr = number > 0 ? (number + 1).toString() : ''; let numStr = number > 0 ? (number + 1).toString() : '';
@@ -529,7 +518,7 @@ var PadDiagram = new Lang.Class({
let leaderName = 'LeaderRing' + numStr + dirStr; let leaderName = 'LeaderRing' + numStr + dirStr;
return this._getItemLabelCoords(labelName, leaderName); return this._getItemLabelCoords(labelName, leaderName);
}, }
getStripLabelCoords(number, dir) { getStripLabelCoords(number, dir) {
let numStr = number > 0 ? (number + 1).toString() : ''; let numStr = number > 0 ? (number + 1).toString() : '';
@@ -538,7 +527,7 @@ var PadDiagram = new Lang.Class({
let leaderName = 'LeaderStrip' + numStr + dirStr; let leaderName = 'LeaderStrip' + numStr + dirStr;
return this._getItemLabelCoords(labelName, leaderName); return this._getItemLabelCoords(labelName, leaderName);
}, }
getLabelCoords(action, idx, dir) { getLabelCoords(action, idx, dir) {
if (action == Meta.PadActionType.BUTTON) if (action == Meta.PadActionType.BUTTON)
@@ -549,19 +538,19 @@ var PadDiagram = new Lang.Class({
return this.getStripLabelCoords(idx, dir); return this.getStripLabelCoords(idx, dir);
return [false]; return [false];
}, }
_invalidateSvg() { _invalidateSvg() {
if (this._handle == null) if (this._handle == null)
return; return;
this._handle = this._composeStyledDiagram(); this._handle = this._composeStyledDiagram();
this.queue_repaint(); this.queue_repaint();
}, }
activateButton(button) { activateButton(button) {
this._activeButtons.push(button); this._activeButtons.push(button);
this._invalidateSvg(); this._invalidateSvg();
}, }
deactivateButton(button) { deactivateButton(button) {
for (let i = 0; i < this._activeButtons.length; i++) { for (let i = 0; i < this._activeButtons.length; i++) {
@@ -569,12 +558,12 @@ var PadDiagram = new Lang.Class({
this._activeButtons.splice(i, 1); this._activeButtons.splice(i, 1);
} }
this._invalidateSvg(); this._invalidateSvg();
}, }
addLabel(label, type, idx, dir) { addLabel(label, type, idx, dir) {
this._labels.push([label, type, idx, dir]); this._labels.push([label, type, idx, dir]);
this.add_actor(label); this.add_actor(label);
}, }
_applyLabel(label, action, idx, dir, str) { _applyLabel(label, action, idx, dir, str) {
if (str != null) { if (str != null) {
@@ -584,7 +573,7 @@ var PadDiagram = new Lang.Class({
this._allocateChild(label, x, y, arrangement); this._allocateChild(label, x, y, arrangement);
} }
label.show(); label.show();
}, }
stopEdition(continues, str) { stopEdition(continues, str) {
this._editorActor.hide(); this._editorActor.hide();
@@ -602,7 +591,7 @@ var PadDiagram = new Lang.Class({
this._prevEdited = this._curEdited; this._prevEdited = this._curEdited;
this._curEdited = null; this._curEdited = null;
} }
}, }
startEdition(action, idx, dir) { startEdition(action, idx, dir) {
let editedLabel; let editedLabel;
@@ -629,10 +618,8 @@ var PadDiagram = new Lang.Class({
} }
}); });
var PadOsd = new Lang.Class({ var PadOsd = class {
Name: 'PadOsd', constructor(padDevice, settings, imagePath, editionMode, monitorIndex) {
_init(padDevice, settings, imagePath, editionMode, monitorIndex) {
this.padDevice = padDevice; this.padDevice = padDevice;
this._groupPads = [ padDevice ]; this._groupPads = [ padDevice ];
this._settings = settings; this._settings = settings;
@@ -752,7 +739,7 @@ var PadOsd = new Lang.Class({
this._syncEditionMode(); this._syncEditionMode();
Main.pushModal(this.actor); Main.pushModal(this.actor);
}, }
_updatePadChooser() { _updatePadChooser() {
if (this._groupPads.length > 1) { if (this._groupPads.length > 1) {
@@ -769,7 +756,7 @@ var PadOsd = new Lang.Class({
this._padChooser.destroy(); this._padChooser.destroy();
this._padChooser = null; this._padChooser = null;
} }
}, }
_requestForOtherPad(pad) { _requestForOtherPad(pad) {
if (pad == this.padDevice || if (pad == this.padDevice ||
@@ -779,13 +766,13 @@ var PadOsd = new Lang.Class({
let editionMode = this._editionMode; let editionMode = this._editionMode;
this.destroy(); this.destroy();
global.display.request_pad_osd(pad, editionMode); global.display.request_pad_osd(pad, editionMode);
}, }
_createLabel(type, number, dir) { _createLabel(type, number, dir) {
let str = global.display.get_pad_action_label(this.padDevice, type, number); let str = global.display.get_pad_action_label(this.padDevice, type, number);
let label = new St.Label({ text: str ? str : _("None") }); let label = new St.Label({ text: str ? str : _("None") });
this._padDiagram.addLabel(label, type, number, dir); this._padDiagram.addLabel(label, type, number, dir);
}, }
_onCapturedEvent(actor, event) { _onCapturedEvent(actor, event) {
if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS && if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
@@ -830,7 +817,7 @@ var PadOsd = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_syncEditionMode() { _syncEditionMode() {
this._editButton.set_reactive(!this._editionMode); this._editButton.set_reactive(!this._editionMode);
@@ -850,7 +837,7 @@ var PadOsd = new Lang.Class({
} }
this._titleLabel.clutter_text.set_markup('<span size="larger"><b>' + title + '</b></span>'); this._titleLabel.clutter_text.set_markup('<span size="larger"><b>' + title + '</b></span>');
}, }
_isEditedAction(type, number, dir) { _isEditedAction(type, number, dir) {
if (!this._editedAction) if (!this._editedAction)
@@ -859,7 +846,7 @@ var PadOsd = new Lang.Class({
return (this._editedAction.type == type && return (this._editedAction.type == type &&
this._editedAction.number == number && this._editedAction.number == number &&
this._editedAction.dir == dir); this._editedAction.dir == dir);
}, }
_followUpActionEdition(str) { _followUpActionEdition(str) {
let { type, dir, number, mode } = this._editedAction; let { type, dir, number, mode } = this._editedAction;
@@ -876,7 +863,7 @@ var PadOsd = new Lang.Class({
this._startStripActionEdition(number, DOWN, mode); this._startStripActionEdition(number, DOWN, mode);
return true; return true;
}, }
_endActionEdition() { _endActionEdition() {
this._actionEditor.close(); this._actionEditor.close();
@@ -893,7 +880,7 @@ var PadOsd = new Lang.Class({
} }
this._editedActionSettings = null; this._editedActionSettings = null;
}, }
_startActionEdition(key, type, number, dir, mode) { _startActionEdition(key, type, number, dir, mode) {
if (this._isEditedAction(type, number, dir)) if (this._isEditedAction(type, number, dir))
@@ -907,25 +894,25 @@ var PadOsd = new Lang.Class({
settingsPath); settingsPath);
this._actionEditor.setSettings(this._editedActionSettings, type); this._actionEditor.setSettings(this._editedActionSettings, type);
this._padDiagram.startEdition(type, number, dir); this._padDiagram.startEdition(type, number, dir);
}, }
_startButtonActionEdition(button) { _startButtonActionEdition(button) {
let ch = String.fromCharCode('A'.charCodeAt() + button); let ch = String.fromCharCode('A'.charCodeAt() + button);
let key = 'button' + ch; let key = 'button' + ch;
this._startActionEdition(key, Meta.PadActionType.BUTTON, button); this._startActionEdition(key, Meta.PadActionType.BUTTON, button);
}, }
_startRingActionEdition(ring, dir, mode) { _startRingActionEdition(ring, dir, mode) {
let ch = String.fromCharCode('A'.charCodeAt() + ring); let ch = String.fromCharCode('A'.charCodeAt() + ring);
let key = 'ring%s-%s-mode-%d'.format(ch, dir == CCW ? 'ccw' : 'cw', mode); let key = 'ring%s-%s-mode-%d'.format(ch, dir == CCW ? 'ccw' : 'cw', mode);
this._startActionEdition(key, Meta.PadActionType.RING, ring, dir, mode); this._startActionEdition(key, Meta.PadActionType.RING, ring, dir, mode);
}, }
_startStripActionEdition(strip, dir, mode) { _startStripActionEdition(strip, dir, mode) {
let ch = String.fromCharCode('A'.charCodeAt() + strip); let ch = String.fromCharCode('A'.charCodeAt() + strip);
let key = 'strip%s-%s-mode-%d'.format(ch, dir == UP ? 'up' : 'down', mode); let key = 'strip%s-%s-mode-%d'.format(ch, dir == UP ? 'up' : 'down', mode);
this._startActionEdition(key, Meta.PadActionType.STRIP, strip, dir, mode); this._startActionEdition(key, Meta.PadActionType.STRIP, strip, dir, mode);
}, }
setEditionMode(editionMode) { setEditionMode(editionMode) {
if (this._editionMode == editionMode) if (this._editionMode == editionMode)
@@ -933,11 +920,11 @@ var PadOsd = new Lang.Class({
this._editionMode = editionMode; this._editionMode = editionMode;
this._syncEditionMode(); this._syncEditionMode();
}, }
destroy() { destroy() {
this.actor.destroy(); this.actor.destroy();
}, }
_onDestroy() { _onDestroy() {
Main.popModal(this.actor); Main.popModal(this.actor);
@@ -961,19 +948,17 @@ var PadOsd = new Lang.Class({
this.actor = null; this.actor = null;
this.emit('closed'); this.emit('closed');
} }
}); };
Signals.addSignalMethods(PadOsd.prototype); Signals.addSignalMethods(PadOsd.prototype);
const PadOsdIface = loadInterfaceXML('org.gnome.Shell.Wacom.PadOsd'); const PadOsdIface = loadInterfaceXML('org.gnome.Shell.Wacom.PadOsd');
var PadOsdService = new Lang.Class({ var PadOsdService = class {
Name: 'PadOsdService', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(PadOsdIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(PadOsdIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Wacom'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Wacom');
Gio.DBus.session.own_name('org.gnome.Shell.Wacom.PadOsd', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gnome.Shell.Wacom.PadOsd', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, }
ShowAsync(params, invocation) { ShowAsync(params, invocation) {
let [deviceNode, editionMode] = params; let [deviceNode, editionMode] = params;
@@ -997,5 +982,5 @@ var PadOsdService = new Lang.Class({
global.display.request_pad_osd(padDevice, editionMode); global.display.request_pad_osd(padDevice, editionMode);
invocation.return_value(null); invocation.return_value(null);
} }
}); };
Signals.addSignalMethods(PadOsdService.prototype); Signals.addSignalMethods(PadOsdService.prototype);

View File

@@ -2,36 +2,25 @@
const Cairo = imports.cairo; const Cairo = imports.cairo;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
const Signals = imports.signals;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Animation = imports.ui.animation;
const Config = imports.misc.config; const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const RemoteMenu = imports.ui.remoteMenu;
const Main = imports.ui.main; const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
var PANEL_ICON_SIZE = 16;
var APP_MENU_ICON_MARGIN = 0;
var BUTTON_DND_ACTIVATION_TIMEOUT = 250; var BUTTON_DND_ACTIVATION_TIMEOUT = 250;
var SPINNER_ANIMATION_TIME = 1.0;
// To make sure the panel corners blend nicely with the panel, // To make sure the panel corners blend nicely with the panel,
// we draw background and borders the same way, e.g. drawing // we draw background and borders the same way, e.g. drawing
// them as filled shapes from the outside inwards instead of // them as filled shapes from the outside inwards instead of
@@ -75,336 +64,10 @@ function _unpremultiply(color) {
blue: blue, alpha: color.alpha }); blue: blue, alpha: color.alpha });
}; };
/** var ActivitiesButton = GObject.registerClass(
* AppMenuButton: class ActivitiesButton extends PanelMenu.Button {
*
* This class manages the "application menu" component. It tracks the
* currently focused application. However, when an app is launched,
* this menu also handles startup notification for it. So when we
* have an active startup notification, we switch modes to display that.
*/
var AppMenuButton = new Lang.Class({
Name: 'AppMenuButton',
Extends: PanelMenu.Button,
Signals: {'changed': {}},
_init(panel) {
this.parent(0.0, null, true);
this.actor.accessible_role = Atk.Role.MENU;
this._startingApps = [];
this._menuManager = panel.menuManager;
this._gtkSettings = Gtk.Settings.get_default();
this._targetApp = null;
this._appMenuNotifyId = 0;
this._actionGroupNotifyId = 0;
this._busyNotifyId = 0;
let bin = new St.Bin({ name: 'appMenu' });
bin.connect('style-changed', this._onStyleChanged.bind(this));
this.actor.add_actor(bin);
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
this.actor.reactive = false;
this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
bin.set_child(this._container);
let textureCache = St.TextureCache.get_default();
textureCache.connect('icon-theme-changed',
this._onIconThemeChanged.bind(this));
this._iconBox = new St.Bin({ style_class: 'app-menu-icon' });
this._container.add_actor(this._iconBox);
this._label = new St.Label({ y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
this._container.add_actor(this._label);
this._arrow = PopupMenu.arrowIcon(St.Side.BOTTOM);
this._container.add_actor(this._arrow);
this._visible = this._gtkSettings.gtk_shell_shows_app_menu &&
!Main.overview.visible;
if (!this._visible)
this.hide();
this._overviewHidingId = Main.overview.connect('hiding', this._sync.bind(this));
this._overviewShowingId = Main.overview.connect('showing', this._sync.bind(this));
this._showsAppMenuId = this._gtkSettings.connect('notify::gtk-shell-shows-app-menu',
this._sync.bind(this));
this._stop = true;
this._spinner = null;
let tracker = Shell.WindowTracker.get_default();
let appSys = Shell.AppSystem.get_default();
this._focusAppNotifyId =
tracker.connect('notify::focus-app', this._focusAppChanged.bind(this));
this._appStateChangedSignalId =
appSys.connect('app-state-changed', this._onAppStateChanged.bind(this));
this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace', this._sync.bind(this));
this._sync();
},
fadeIn() {
if (this._visible)
return;
this._visible = true;
this.actor.reactive = true;
this.show();
Tweener.removeTweens(this.actor);
Tweener.addTween(this.actor,
{ opacity: 255,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' });
},
fadeOut() {
if (!this._visible)
return;
this._visible = false;
this.actor.reactive = false;
Tweener.removeTweens(this.actor);
Tweener.addTween(this.actor,
{ opacity: 0,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete() {
this.hide();
},
onCompleteScope: this });
},
_onStyleChanged(actor) {
let node = actor.get_theme_node();
let [success, icon] = node.lookup_url('spinner-image', false);
if (!success || (this._spinnerIcon && this._spinnerIcon.equal(icon)))
return;
this._spinnerIcon = icon;
this._spinner = new Animation.AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor);
this._spinner.actor.hide();
},
_syncIcon() {
if (!this._targetApp)
return;
let icon = this._targetApp.create_icon_texture(PANEL_ICON_SIZE - APP_MENU_ICON_MARGIN);
this._iconBox.set_child(icon);
},
_onIconThemeChanged() {
if (this._iconBox.child == null)
return;
this._syncIcon();
},
stopAnimation() {
if (this._stop)
return;
this._stop = true;
if (this._spinner == null)
return;
Tweener.addTween(this._spinner.actor,
{ opacity: 0,
time: SPINNER_ANIMATION_TIME,
transition: "easeOutQuad",
onCompleteScope: this,
onComplete() {
this._spinner.stop();
this._spinner.actor.opacity = 255;
this._spinner.actor.hide();
}
});
},
startAnimation() {
this._stop = false;
if (this._spinner == null)
return;
this._spinner.play();
this._spinner.actor.show();
},
_onAppStateChanged(appSys, app) {
let state = app.state;
if (state != Shell.AppState.STARTING)
this._startingApps = this._startingApps.filter(a => a != app);
else if (state == Shell.AppState.STARTING)
this._startingApps.push(app);
// For now just resync on all running state changes; this is mainly to handle
// cases where the focused window's application changes without the focus
// changing. An example case is how we map OpenOffice.org based on the window
// title which is a dynamic property.
this._sync();
},
_focusAppChanged() {
let tracker = Shell.WindowTracker.get_default();
let focusedApp = tracker.focus_app;
if (!focusedApp) {
// If the app has just lost focus to the panel, pretend
// nothing happened; otherwise you can't keynav to the
// app menu.
if (global.stage.key_focus != null)
return;
}
this._sync();
},
_findTargetApp() {
let workspaceManager = global.workspace_manager;
let workspace = workspaceManager.get_active_workspace();
let tracker = Shell.WindowTracker.get_default();
let focusedApp = tracker.focus_app;
if (focusedApp && focusedApp.is_on_workspace(workspace))
return focusedApp;
for (let i = 0; i < this._startingApps.length; i++)
if (this._startingApps[i].is_on_workspace(workspace))
return this._startingApps[i];
return null;
},
_sync() {
let targetApp = this._findTargetApp();
if (this._targetApp != targetApp) {
if (this._appMenuNotifyId) {
this._targetApp.disconnect(this._appMenuNotifyId);
this._appMenuNotifyId = 0;
}
if (this._actionGroupNotifyId) {
this._targetApp.disconnect(this._actionGroupNotifyId);
this._actionGroupNotifyId = 0;
}
if (this._busyNotifyId) {
this._targetApp.disconnect(this._busyNotifyId);
this._busyNotifyId = 0;
}
this._targetApp = targetApp;
if (this._targetApp) {
this._appMenuNotifyId = this._targetApp.connect('notify::menu', this._sync.bind(this));
this._actionGroupNotifyId = this._targetApp.connect('notify::action-group', this._sync.bind(this));
this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
this._label.set_text(this._targetApp.get_name());
this.actor.set_accessible_name(this._targetApp.get_name());
}
}
let shellShowsAppMenu = this._gtkSettings.gtk_shell_shows_app_menu;
Meta.prefs_set_show_fallback_app_menu(!shellShowsAppMenu);
let visible = (this._targetApp != null &&
shellShowsAppMenu &&
!Main.overview.visibleTarget);
if (visible)
this.fadeIn();
else
this.fadeOut();
let isBusy = (this._targetApp != null &&
(this._targetApp.get_state() == Shell.AppState.STARTING ||
this._targetApp.get_busy()));
if (isBusy)
this.startAnimation();
else
this.stopAnimation();
this.actor.reactive = (visible && !isBusy);
this._syncIcon();
this._maybeSetMenu();
this.emit('changed');
},
_maybeSetMenu() {
let menu;
if (this._targetApp == null) {
menu = null;
} else if (this._targetApp.action_group && this._targetApp.menu) {
if (this.menu instanceof RemoteMenu.RemoteMenu &&
this.menu.actionGroup == this._targetApp.action_group)
return;
menu = new RemoteMenu.RemoteMenu(this.actor, this._targetApp.menu, this._targetApp.action_group);
menu.connect('activate', () => {
let win = this._targetApp.get_windows()[0];
win.check_alive(global.get_current_time());
});
} else {
if (this.menu && this.menu.isDummyQuitMenu)
return;
// fallback to older menu
menu = new PopupMenu.PopupMenu(this.actor, 0.0, St.Side.TOP, 0);
menu.isDummyQuitMenu = true;
menu.addAction(_("Quit"), () => {
this._targetApp.request_quit();
});
}
this.setMenu(menu);
if (menu)
this._menuManager.addMenu(menu);
},
_onDestroy() {
if (this._appStateChangedSignalId > 0) {
let appSys = Shell.AppSystem.get_default();
appSys.disconnect(this._appStateChangedSignalId);
this._appStateChangedSignalId = 0;
}
if (this._focusAppNotifyId > 0) {
let tracker = Shell.WindowTracker.get_default();
tracker.disconnect(this._focusAppNotifyId);
this._focusAppNotifyId = 0;
}
if (this._overviewHidingId > 0) {
Main.overview.disconnect(this._overviewHidingId);
this._overviewHidingId = 0;
}
if (this._overviewShowingId > 0) {
Main.overview.disconnect(this._overviewShowingId);
this._overviewShowingId = 0;
}
if (this._showsAppMenuId > 0) {
this._gtkSettings.disconnect(this._showsAppMenuId);
this._showsAppMenuId = 0;
}
if (this._switchWorkspaceNotifyId > 0) {
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
this._switchWorkspaceNotifyId = 0;
}
this.parent();
}
});
var ActivitiesButton = new Lang.Class({
Name: 'ActivitiesButton',
Extends: PanelMenu.Button,
_init() { _init() {
this.parent(0.0, null, true); super._init(0.0, null, true);
this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON; this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
this.actor.name = 'panelActivities'; this.actor.name = 'panelActivities';
@@ -430,7 +93,7 @@ var ActivitiesButton = new Lang.Class({
}); });
this._xdndTimeOut = 0; this._xdndTimeOut = 0;
}, }
handleDragOver(source, actor, x, y, time) { handleDragOver(source, actor, x, y, time) {
if (source != Main.xdndHandler) if (source != Main.xdndHandler)
@@ -444,7 +107,7 @@ var ActivitiesButton = new Lang.Class({
GLib.Source.set_name_by_id(this._xdndTimeOut, '[gnome-shell] this._xdndToggleOverview'); GLib.Source.set_name_by_id(this._xdndTimeOut, '[gnome-shell] this._xdndToggleOverview');
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;
}, }
_onCapturedEvent(actor, event) { _onCapturedEvent(actor, event) {
if (event.type() == Clutter.EventType.BUTTON_PRESS || if (event.type() == Clutter.EventType.BUTTON_PRESS ||
@@ -453,10 +116,10 @@ var ActivitiesButton = new Lang.Class({
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onEvent(actor, event) { _onEvent(actor, event) {
this.parent(actor, event); super._onEvent(actor, event);
if (event.type() == Clutter.EventType.TOUCH_END || if (event.type() == Clutter.EventType.TOUCH_END ||
event.type() == Clutter.EventType.BUTTON_RELEASE) event.type() == Clutter.EventType.BUTTON_RELEASE)
@@ -464,7 +127,7 @@ var ActivitiesButton = new Lang.Class({
Main.overview.toggle(); Main.overview.toggle();
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onKeyRelease(actor, event) { _onKeyRelease(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
@@ -473,7 +136,7 @@ var ActivitiesButton = new Lang.Class({
Main.overview.toggle(); Main.overview.toggle();
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_xdndToggleOverview(actor) { _xdndToggleOverview(actor) {
let [x, y, mask] = global.get_pointer(); let [x, y, mask] = global.get_pointer();
@@ -488,16 +151,14 @@ var ActivitiesButton = new Lang.Class({
} }
}); });
var PanelCorner = new Lang.Class({ var PanelCorner = class {
Name: 'PanelCorner', constructor(side) {
_init(side) {
this._side = side; this._side = side;
this.actor = new St.DrawingArea({ style_class: 'panel-corner' }); this.actor = new St.DrawingArea({ style_class: 'panel-corner' });
this.actor.connect('style-changed', this._styleChanged.bind(this)); this.actor.connect('style-changed', this._styleChanged.bind(this));
this.actor.connect('repaint', this._repaint.bind(this)); this.actor.connect('repaint', this._repaint.bind(this));
}, }
_findRightmostButton(container) { _findRightmostButton(container) {
if (!container.get_children) if (!container.get_children)
@@ -522,7 +183,7 @@ var PanelCorner = new Lang.Class({
return this._findRightmostButton(children[index]); return this._findRightmostButton(children[index]);
return children[index]; return children[index];
}, }
_findLeftmostButton(container) { _findLeftmostButton(container) {
if (!container.get_children) if (!container.get_children)
@@ -547,7 +208,7 @@ var PanelCorner = new Lang.Class({
return this._findLeftmostButton(children[index]); return this._findLeftmostButton(children[index]);
return children[index]; return children[index];
}, }
setStyleParent(box) { setStyleParent(box) {
let side = this._side; let side = this._side;
@@ -593,7 +254,7 @@ var PanelCorner = new Lang.Class({
// the .panel-button default // the .panel-button default
button.style = 'transition-duration: 0ms'; button.style = 'transition-duration: 0ms';
} }
}, }
_repaint() { _repaint() {
let node = this.actor.get_theme_node(); let node = this.actor.get_theme_node();
@@ -641,7 +302,7 @@ var PanelCorner = new Lang.Class({
} }
cr.$dispose(); cr.$dispose();
}, }
_styleChanged() { _styleChanged() {
let node = this.actor.get_theme_node(); let node = this.actor.get_theme_node();
@@ -652,25 +313,23 @@ var PanelCorner = new Lang.Class({
this.actor.set_size(cornerRadius, borderWidth + cornerRadius); this.actor.set_size(cornerRadius, borderWidth + cornerRadius);
this.actor.set_anchor_point(0, borderWidth); this.actor.set_anchor_point(0, borderWidth);
} }
}); };
var AggregateLayout = new Lang.Class({
Name: 'AggregateLayout',
Extends: Clutter.BoxLayout,
var AggregateLayout = GObject.registerClass(
class AggregateLayout extends Clutter.BoxLayout {
_init(params) { _init(params) {
if (!params) if (!params)
params = {}; params = {};
params['orientation'] = Clutter.Orientation.VERTICAL; params['orientation'] = Clutter.Orientation.VERTICAL;
this.parent(params); super._init(params);
this._sizeChildren = []; this._sizeChildren = [];
}, }
addSizeChild(actor) { addSizeChild(actor) {
this._sizeChildren.push(actor); this._sizeChildren.push(actor);
this.layout_changed(); this.layout_changed();
}, }
vfunc_get_preferred_width(container, forHeight) { vfunc_get_preferred_width(container, forHeight) {
let themeNode = container.get_theme_node(); let themeNode = container.get_theme_node();
@@ -687,12 +346,10 @@ var AggregateLayout = new Lang.Class({
} }
}); });
var AggregateMenu = new Lang.Class({ var AggregateMenu = GObject.registerClass(
Name: 'AggregateMenu', class AggregateMenu extends PanelMenu.Button {
Extends: PanelMenu.Button,
_init() { _init() {
this.parent(0.0, C_("System menu in the top bar", "System"), false); super._init(0.0, C_("System menu in the top bar", "System"), false);
this.menu.actor.add_style_class_name('aggregate-menu'); this.menu.actor.add_style_class_name('aggregate-menu');
let menuLayout = new AggregateLayout(); let menuLayout = new AggregateLayout();
@@ -759,24 +416,21 @@ var AggregateMenu = new Lang.Class({
menuLayout.addSizeChild(this._rfkill.menu.actor); menuLayout.addSizeChild(this._rfkill.menu.actor);
menuLayout.addSizeChild(this._power.menu.actor); menuLayout.addSizeChild(this._power.menu.actor);
menuLayout.addSizeChild(this._system.menu.actor); menuLayout.addSizeChild(this._system.menu.actor);
}, }
}); });
const PANEL_ITEM_IMPLEMENTATIONS = { const PANEL_ITEM_IMPLEMENTATIONS = {
'activities': ActivitiesButton, 'activities': ActivitiesButton,
'aggregateMenu': AggregateMenu, 'aggregateMenu': AggregateMenu,
'appMenu': AppMenuButton,
'dateMenu': imports.ui.dateMenu.DateMenuButton, 'dateMenu': imports.ui.dateMenu.DateMenuButton,
'a11y': imports.ui.status.accessibility.ATIndicator, 'a11y': imports.ui.status.accessibility.ATIndicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator, 'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
}; };
var Panel = new Lang.Class({ var Panel = GObject.registerClass(
Name: 'Panel', class Panel extends St.Widget {
Extends: St.Widget,
_init() { _init() {
this.parent({ name: 'panel', super._init({ name: 'panel',
reactive: true }); reactive: true });
// For compatibility with extensions that still use the // For compatibility with extensions that still use the
@@ -786,6 +440,8 @@ var Panel = new Lang.Class({
this._sessionStyle = null; this._sessionStyle = null;
Meta.prefs_set_show_fallback_app_menu(true);
this.statusArea = {}; this.statusArea = {};
this.menuManager = new PopupMenu.PopupMenuManager(this); this.menuManager = new PopupMenu.PopupMenuManager(this);
@@ -829,7 +485,7 @@ var Panel = new Lang.Class({
global.display.connect('workareas-changed', () => { this.queue_relayout(); }); global.display.connect('workareas-changed', () => { this.queue_relayout(); });
this._updatePanel(); this._updatePanel();
}, }
_onWindowActorAdded(container, metaWindowActor) { _onWindowActorAdded(container, metaWindowActor) {
let signalIds = []; let signalIds = [];
@@ -837,7 +493,7 @@ var Panel = new Lang.Class({
signalIds.push(metaWindowActor.connect(s, this._updateSolidStyle.bind(this))); signalIds.push(metaWindowActor.connect(s, this._updateSolidStyle.bind(this)));
}); });
this._trackedWindows.set(metaWindowActor, signalIds); this._trackedWindows.set(metaWindowActor, signalIds);
}, }
_onWindowActorRemoved(container, metaWindowActor) { _onWindowActorRemoved(container, metaWindowActor) {
this._trackedWindows.get(metaWindowActor).forEach(id => { this._trackedWindows.get(metaWindowActor).forEach(id => {
@@ -845,7 +501,7 @@ var Panel = new Lang.Class({
}); });
this._trackedWindows.delete(metaWindowActor); this._trackedWindows.delete(metaWindowActor);
this._updateSolidStyle(); this._updateSolidStyle();
}, }
vfunc_get_preferred_width(actor, forHeight) { vfunc_get_preferred_width(actor, forHeight) {
let primaryMonitor = Main.layoutManager.primaryMonitor; let primaryMonitor = Main.layoutManager.primaryMonitor;
@@ -854,10 +510,10 @@ var Panel = new Lang.Class({
return [0, primaryMonitor.width]; return [0, primaryMonitor.width];
return [0, 0]; return [0, 0];
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.parent(box, flags); super.vfunc_allocate(box, flags);
let allocWidth = box.x2 - box.x1; let allocWidth = box.x2 - box.x1;
let allocHeight = box.y2 - box.y1; let allocHeight = box.y2 - box.y1;
@@ -933,7 +589,7 @@ var Panel = new Lang.Class({
childBox.y1 = allocHeight; childBox.y1 = allocHeight;
childBox.y2 = allocHeight + cornerHeight; childBox.y2 = allocHeight + cornerHeight;
this._rightCorner.actor.allocate(childBox, flags); this._rightCorner.actor.allocate(childBox, flags);
}, }
_onButtonPress(actor, event) { _onButtonPress(actor, event) {
if (Main.modalCount > 0) if (Main.modalCount > 0)
@@ -979,7 +635,7 @@ var Panel = new Lang.Class({
stageX, stageY); stageX, stageY);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onKeyPress(actor, event) { _onKeyPress(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
@@ -989,7 +645,7 @@ var Panel = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_toggleMenu(indicator) { _toggleMenu(indicator) {
if (!indicator) // menu not supported by current session mode if (!indicator) // menu not supported by current session mode
@@ -1002,15 +658,11 @@ var Panel = new Lang.Class({
menu.toggle(); menu.toggle();
if (menu.isOpen) if (menu.isOpen)
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}, }
toggleAppMenu() {
this._toggleMenu(this.statusArea.appMenu);
},
toggleCalendar() { toggleCalendar() {
this._toggleMenu(this.statusArea.dateMenu); this._toggleMenu(this.statusArea.dateMenu);
}, }
closeCalendar() { closeCalendar() {
let indicator = this.statusArea.dateMenu; let indicator = this.statusArea.dateMenu;
@@ -1022,7 +674,7 @@ var Panel = new Lang.Class({
return; return;
menu.close(); menu.close();
}, }
set boxOpacity(value) { set boxOpacity(value) {
let isReactive = value > 0; let isReactive = value > 0;
@@ -1033,11 +685,11 @@ var Panel = new Lang.Class({
this._centerBox.reactive = isReactive; this._centerBox.reactive = isReactive;
this._rightBox.opacity = value; this._rightBox.opacity = value;
this._rightBox.reactive = isReactive; this._rightBox.reactive = isReactive;
}, }
get boxOpacity() { get boxOpacity() {
return this._leftBox.opacity; return this._leftBox.opacity;
}, }
_updatePanel() { _updatePanel() {
let panel = Main.sessionMode.panel; let panel = Main.sessionMode.panel;
@@ -1070,7 +722,7 @@ var Panel = new Lang.Class({
this._leftCorner.setStyleParent(this._leftBox); this._leftCorner.setStyleParent(this._leftBox);
this._rightCorner.setStyleParent(this._rightBox); this._rightCorner.setStyleParent(this._rightBox);
} }
}, }
_updateSolidStyle() { _updateSolidStyle() {
if (this.has_style_pseudo_class('overview') || !Main.sessionMode.hasWindows) { if (this.has_style_pseudo_class('overview') || !Main.sessionMode.hasWindows) {
@@ -1105,7 +757,7 @@ var Panel = new Lang.Class({
else else
this._removeStyleClassName('solid'); this._removeStyleClassName('solid');
}, }
_hideIndicators() { _hideIndicators() {
for (let role in PANEL_ITEM_IMPLEMENTATIONS) { for (let role in PANEL_ITEM_IMPLEMENTATIONS) {
@@ -1114,7 +766,7 @@ var Panel = new Lang.Class({
continue; continue;
indicator.container.hide(); indicator.container.hide();
} }
}, }
_ensureIndicator(role) { _ensureIndicator(role) {
let indicator = this.statusArea[role]; let indicator = this.statusArea[role];
@@ -1128,7 +780,7 @@ var Panel = new Lang.Class({
this.statusArea[role] = indicator; this.statusArea[role] = indicator;
} }
return indicator; return indicator;
}, }
_updateBox(elements, box) { _updateBox(elements, box) {
let nChildren = box.get_n_children(); let nChildren = box.get_n_children();
@@ -1141,7 +793,7 @@ var Panel = new Lang.Class({
this._addToPanelBox(role, indicator, i + nChildren, box); this._addToPanelBox(role, indicator, i + nChildren, box);
} }
}, }
_addToPanelBox(role, indicator, position, box) { _addToPanelBox(role, indicator, position, box) {
let container = indicator.container; let container = indicator.container;
@@ -1162,7 +814,7 @@ var Panel = new Lang.Class({
}); });
indicator.connect('menu-set', this._onMenuSet.bind(this)); indicator.connect('menu-set', this._onMenuSet.bind(this));
this._onMenuSet(indicator); this._onMenuSet(indicator);
}, }
addToStatusArea(role, indicator, position, box) { addToStatusArea(role, indicator, position, box) {
if (this.statusArea[role]) if (this.statusArea[role])
@@ -1181,19 +833,19 @@ var Panel = new Lang.Class({
this.statusArea[role] = indicator; this.statusArea[role] = indicator;
this._addToPanelBox(role, indicator, position, boxContainer); this._addToPanelBox(role, indicator, position, boxContainer);
return indicator; return indicator;
}, }
_addStyleClassName(className) { _addStyleClassName(className) {
this.add_style_class_name(className); this.add_style_class_name(className);
this._rightCorner.actor.add_style_class_name(className); this._rightCorner.actor.add_style_class_name(className);
this._leftCorner.actor.add_style_class_name(className); this._leftCorner.actor.add_style_class_name(className);
}, }
_removeStyleClassName(className) { _removeStyleClassName(className) {
this.remove_style_class_name(className); this.remove_style_class_name(className);
this._rightCorner.actor.remove_style_class_name(className); this._rightCorner.actor.remove_style_class_name(className);
this._leftCorner.actor.remove_style_class_name(className); this._leftCorner.actor.remove_style_class_name(className);
}, }
_onMenuSet(indicator) { _onMenuSet(indicator) {
if (!indicator.menu || indicator.menu.hasOwnProperty('_openChangedId')) if (!indicator.menu || indicator.menu.hasOwnProperty('_openChangedId'))

View File

@@ -2,8 +2,8 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
@@ -13,14 +13,12 @@ const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
var ButtonBox = new Lang.Class({ var ButtonBox = GObject.registerClass(
Name: 'ButtonBox', class ButtonBox extends St.Widget {
Extends: St.Widget,
_init(params) { _init(params) {
params = Params.parse(params, { style_class: 'panel-button' }, true); params = Params.parse(params, { style_class: 'panel-button' }, true);
this.parent(params); super._init(params);
this.actor = this; this.actor = this;
this._delegate = this; this._delegate = this;
@@ -33,14 +31,14 @@ var ButtonBox = new Lang.Class({
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._minHPadding = this._natHPadding = 0.0; this._minHPadding = this._natHPadding = 0.0;
}, }
_onStyleChanged(actor) { _onStyleChanged(actor) {
let themeNode = actor.get_theme_node(); let themeNode = actor.get_theme_node();
this._minHPadding = themeNode.get_length('-minimum-hpadding'); this._minHPadding = themeNode.get_length('-minimum-hpadding');
this._natHPadding = themeNode.get_length('-natural-hpadding'); this._natHPadding = themeNode.get_length('-natural-hpadding');
}, }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
let child = this.get_first_child(); let child = this.get_first_child();
@@ -55,7 +53,7 @@ var ButtonBox = new Lang.Class({
naturalSize += 2 * this._natHPadding; naturalSize += 2 * this._natHPadding;
return [minimumSize, naturalSize]; return [minimumSize, naturalSize];
}, }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
let child = this.get_first_child(); let child = this.get_first_child();
@@ -64,7 +62,7 @@ var ButtonBox = new Lang.Class({
return child.get_preferred_height(-1); return child.get_preferred_height(-1);
return [0, 0]; return [0, 0];
}, }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
this.set_allocation(box, flags); this.set_allocation(box, flags);
@@ -91,21 +89,19 @@ var ButtonBox = new Lang.Class({
childBox.y2 = availHeight; childBox.y2 = availHeight;
child.allocate(childBox, flags); child.allocate(childBox, flags);
}, }
_onDestroy() { _onDestroy() {
this.container.child = null; this.container.child = null;
this.container.destroy(); this.container.destroy();
}, }
}); });
var Button = new Lang.Class({ var Button = GObject.registerClass({
Name: 'PanelMenuButton',
Extends: ButtonBox,
Signals: {'menu-set': {} }, Signals: {'menu-set': {} },
}, class PanelMenuButton extends ButtonBox {
_init(menuAlignment, nameText, dontCreateMenu) { _init(menuAlignment, nameText, dontCreateMenu) {
this.parent({ reactive: true, super._init({ reactive: true,
can_focus: true, can_focus: true,
track_hover: true, track_hover: true,
accessible_name: nameText ? nameText : "", accessible_name: nameText ? nameText : "",
@@ -118,13 +114,13 @@ var Button = new Lang.Class({
this.menu = new PopupMenu.PopupDummyMenu(this.actor); this.menu = new PopupMenu.PopupDummyMenu(this.actor);
else else
this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0)); this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
}, }
setSensitive(sensitive) { setSensitive(sensitive) {
this.reactive = sensitive; this.reactive = sensitive;
this.can_focus = sensitive; this.can_focus = sensitive;
this.track_hover = sensitive; this.track_hover = sensitive;
}, }
setMenu(menu) { setMenu(menu) {
if (this.menu) if (this.menu)
@@ -140,7 +136,7 @@ var Button = new Lang.Class({
this.menu.actor.hide(); this.menu.actor.hide();
} }
this.emit('menu-set'); this.emit('menu-set');
}, }
_onEvent(actor, event) { _onEvent(actor, event) {
if (this.menu && if (this.menu &&
@@ -149,7 +145,7 @@ var Button = new Lang.Class({
this.menu.toggle(); this.menu.toggle();
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onVisibilityChanged() { _onVisibilityChanged() {
if (!this.menu) if (!this.menu)
@@ -157,7 +153,7 @@ var Button = new Lang.Class({
if (!this.actor.visible) if (!this.actor.visible)
this.menu.close(); this.menu.close();
}, }
_onMenuKeyPress(actor, event) { _onMenuKeyPress(actor, event) {
if (global.focus_manager.navigate_from_event(event)) if (global.focus_manager.navigate_from_event(event))
@@ -173,7 +169,7 @@ var Button = new Lang.Class({
} }
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onOpenStateChanged(menu, open) { _onOpenStateChanged(menu, open) {
if (open) if (open)
@@ -193,10 +189,10 @@ var Button = new Lang.Class({
// factor when computing max-height // factor when computing max-height
let maxHeight = Math.round((workArea.height - verticalMargins) / scaleFactor); let maxHeight = Math.round((workArea.height - verticalMargins) / scaleFactor);
this.menu.actor.style = ('max-height: %spx;').format(maxHeight); this.menu.actor.style = ('max-height: %spx;').format(maxHeight);
}, }
_onDestroy() { _onDestroy() {
this.parent(); super._onDestroy();
if (this.menu) if (this.menu)
this.menu.destroy(); this.menu.destroy();
@@ -210,19 +206,17 @@ var Button = new Lang.Class({
* of an icon and a menu section, which will be composed into the * of an icon and a menu section, which will be composed into the
* aggregate menu. * aggregate menu.
*/ */
var SystemIndicator = new Lang.Class({ var SystemIndicator = class {
Name: 'SystemIndicator', constructor() {
_init() {
this.indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box', this.indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box',
reactive: true }); reactive: true });
this.indicators.hide(); this.indicators.hide();
this.menu = new PopupMenu.PopupMenuSection(); this.menu = new PopupMenu.PopupMenuSection();
}, }
_syncIndicatorsVisible() { _syncIndicatorsVisible() {
this.indicators.visible = this.indicators.get_children().some(a => a.visible); this.indicators.visible = this.indicators.get_children().some(a => a.visible);
}, }
_addIndicator() { _addIndicator() {
let icon = new St.Icon({ style_class: 'system-status-icon' }); let icon = new St.Icon({ style_class: 'system-status-icon' });
@@ -231,5 +225,5 @@ var SystemIndicator = new Lang.Class({
this._syncIndicatorsVisible(); this._syncIndicatorsVisible();
return icon; return icon;
} }
}); };
Signals.addSignalMethods(SystemIndicator.prototype); Signals.addSignalMethods(SystemIndicator.prototype);

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const GnomeDesktop = imports.gi.GnomeDesktop; const GnomeDesktop = imports.gi.GnomeDesktop;
@@ -22,14 +21,12 @@ function getPointerWatcher() {
return _pointerWatcher; return _pointerWatcher;
} }
var PointerWatch = new Lang.Class({ var PointerWatch = class {
Name: 'PointerWatch', constructor(watcher, interval, callback) {
_init(watcher, interval, callback) {
this.watcher = watcher; this.watcher = watcher;
this.interval = interval; this.interval = interval;
this.callback = callback; this.callback = callback;
}, }
// remove: // remove:
// remove this watch. This function may safely be called // remove this watch. This function may safely be called
@@ -37,19 +34,17 @@ var PointerWatch = new Lang.Class({
remove() { remove() {
this.watcher._removeWatch(this); this.watcher._removeWatch(this);
} }
}); };
var PointerWatcher = new Lang.Class({ var PointerWatcher = class {
Name: 'PointerWatcher', constructor() {
_init() {
this._idleMonitor = Meta.IdleMonitor.get_core(); this._idleMonitor = Meta.IdleMonitor.get_core();
this._idleMonitor.add_idle_watch(IDLE_TIME, this._onIdleMonitorBecameIdle.bind(this)); this._idleMonitor.add_idle_watch(IDLE_TIME, this._onIdleMonitorBecameIdle.bind(this));
this._idle = this._idleMonitor.get_idletime() > IDLE_TIME; this._idle = this._idleMonitor.get_idletime() > IDLE_TIME;
this._watches = []; this._watches = [];
this.pointerX = null; this.pointerX = null;
this.pointerY = null; this.pointerY = null;
}, }
// addWatch: // addWatch:
// @interval: hint as to the time resolution needed. When the user is // @interval: hint as to the time resolution needed. When the user is
@@ -68,7 +63,7 @@ var PointerWatcher = new Lang.Class({
this._watches.push(watch); this._watches.push(watch);
this._updateTimeout(); this._updateTimeout();
return watch; return watch;
}, }
_removeWatch(watch) { _removeWatch(watch) {
for (let i = 0; i < this._watches.length; i++) { for (let i = 0; i < this._watches.length; i++) {
@@ -78,19 +73,19 @@ var PointerWatcher = new Lang.Class({
return; return;
} }
} }
}, }
_onIdleMonitorBecameActive(monitor) { _onIdleMonitorBecameActive(monitor) {
this._idle = false; this._idle = false;
this._updatePointer(); this._updatePointer();
this._updateTimeout(); this._updateTimeout();
}, }
_onIdleMonitorBecameIdle(monitor) { _onIdleMonitorBecameIdle(monitor) {
this._idle = true; this._idle = true;
this._idleMonitor.add_user_active_watch(this._onIdleMonitorBecameActive.bind(this)); this._idleMonitor.add_user_active_watch(this._onIdleMonitorBecameActive.bind(this));
this._updateTimeout(); this._updateTimeout();
}, }
_updateTimeout() { _updateTimeout() {
if (this._timeoutId) { if (this._timeoutId) {
@@ -108,12 +103,12 @@ var PointerWatcher = new Lang.Class({
this._timeoutId = Mainloop.timeout_add(minInterval, this._timeoutId = Mainloop.timeout_add(minInterval,
this._onTimeout.bind(this)); this._onTimeout.bind(this));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout'); GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout');
}, }
_onTimeout() { _onTimeout() {
this._updatePointer(); this._updatePointer();
return GLib.SOURCE_CONTINUE; return GLib.SOURCE_CONTINUE;
}, }
_updatePointer() { _updatePointer() {
let [x, y, mods] = global.get_pointer(); let [x, y, mods] = global.get_pointer();
@@ -130,4 +125,4 @@ var PointerWatcher = new Lang.Class({
i++; i++;
} }
} }
}); };

View File

@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
@@ -58,10 +57,8 @@ function arrowIcon(side) {
return arrow; return arrow;
} }
var PopupBaseMenuItem = new Lang.Class({ var PopupBaseMenuItem = class {
Name: 'PopupBaseMenuItem', constructor(params) {
_init(params) {
params = Params.parse (params, { reactive: true, params = Params.parse (params, { reactive: true,
activate: true, activate: true,
hover: true, hover: true,
@@ -103,30 +100,30 @@ var PopupBaseMenuItem = new Lang.Class({
this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this)); this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this)); this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
this.actor.connect('destroy', this._onDestroy.bind(this)); this.actor.connect('destroy', this._onDestroy.bind(this));
}, }
_getTopMenu() { _getTopMenu() {
if (this._parent) if (this._parent)
return this._parent._getTopMenu(); return this._parent._getTopMenu();
else else
return this; return this;
}, }
_setParent(parent) { _setParent(parent) {
this._parent = parent; this._parent = parent;
}, }
_onButtonPressEvent(actor, event) { _onButtonPressEvent(actor, event) {
// This is the CSS active state // This is the CSS active state
this.actor.add_style_pseudo_class ('active'); this.actor.add_style_pseudo_class ('active');
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onButtonReleaseEvent(actor, event) { _onButtonReleaseEvent(actor, event) {
this.actor.remove_style_pseudo_class ('active'); this.actor.remove_style_pseudo_class ('active');
this.activate(event); this.activate(event);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onTouchEvent(actor, event) { _onTouchEvent(actor, event) {
if (event.type() == Clutter.EventType.TOUCH_END) { if (event.type() == Clutter.EventType.TOUCH_END) {
@@ -138,7 +135,7 @@ var PopupBaseMenuItem = new Lang.Class({
this.actor.add_style_pseudo_class ('active'); this.actor.add_style_pseudo_class ('active');
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
let state = event.get_state(); let state = event.get_state();
@@ -158,23 +155,23 @@ var PopupBaseMenuItem = new Lang.Class({
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onKeyFocusIn(actor) { _onKeyFocusIn(actor) {
this.setActive(true); this.setActive(true);
}, }
_onKeyFocusOut(actor) { _onKeyFocusOut(actor) {
this.setActive(false); this.setActive(false);
}, }
_onHoverChanged(actor) { _onHoverChanged(actor) {
this.setActive(actor.hover); this.setActive(actor.hover);
}, }
activate(event) { activate(event) {
this.emit('activate', event); this.emit('activate', event);
}, }
setActive(active) { setActive(active) {
let activeChanged = active != this.active; let activeChanged = active != this.active;
@@ -195,7 +192,7 @@ var PopupBaseMenuItem = new Lang.Class({
} }
this.emit('active-changed', active); this.emit('active-changed', active);
} }
}, }
syncSensitive() { syncSensitive() {
let sensitive = this.getSensitive(); let sensitive = this.getSensitive();
@@ -203,12 +200,12 @@ var PopupBaseMenuItem = new Lang.Class({
this.actor.can_focus = sensitive; this.actor.can_focus = sensitive;
this.emit('sensitive-changed'); this.emit('sensitive-changed');
return sensitive; return sensitive;
}, }
getSensitive() { getSensitive() {
let parentSensitive = this._parent ? this._parent.getSensitive() : true; let parentSensitive = this._parent ? this._parent.getSensitive() : true;
return this._activatable && this._sensitive && parentSensitive; return this._activatable && this._sensitive && parentSensitive;
}, }
setSensitive(sensitive) { setSensitive(sensitive) {
if (this._sensitive == sensitive) if (this._sensitive == sensitive)
@@ -216,15 +213,15 @@ var PopupBaseMenuItem = new Lang.Class({
this._sensitive = sensitive; this._sensitive = sensitive;
this.syncSensitive(); this.syncSensitive();
}, }
destroy() { destroy() {
this.actor.destroy(); this.actor.destroy();
}, }
_onDestroy() { _onDestroy() {
this.emit('destroy'); this.emit('destroy');
}, }
setOrnament(ornament) { setOrnament(ornament) {
if (ornament == this._ornament) if (ornament == this._ornament)
@@ -243,29 +240,23 @@ var PopupBaseMenuItem = new Lang.Class({
this.actor.remove_accessible_state(Atk.StateType.CHECKED); this.actor.remove_accessible_state(Atk.StateType.CHECKED);
} }
} }
}); };
Signals.addSignalMethods(PopupBaseMenuItem.prototype); Signals.addSignalMethods(PopupBaseMenuItem.prototype);
var PopupMenuItem = new Lang.Class({ var PopupMenuItem = class extends PopupBaseMenuItem {
Name: 'PopupMenuItem', constructor(text, params) {
Extends: PopupBaseMenuItem, super(params);
_init(text, params) {
this.parent(params);
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this.actor.add_child(this.label); this.actor.add_child(this.label);
this.actor.label_actor = this.label this.actor.label_actor = this.label
} }
}); };
var PopupSeparatorMenuItem = new Lang.Class({ var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
Name: 'PopupSeparatorMenuItem', constructor(text) {
Extends: PopupBaseMenuItem, super({ reactive: false,
can_focus: false});
_init(text) {
this.parent({ reactive: false,
can_focus: false});
this.label = new St.Label({ text: text || '' }); this.label = new St.Label({ text: text || '' });
this.actor.add(this.label); this.actor.add(this.label);
@@ -279,17 +270,15 @@ var PopupSeparatorMenuItem = new Lang.Class({
y_expand: true, y_expand: true,
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
this.actor.add(this._separator, { expand: true }); this.actor.add(this._separator, { expand: true });
}, }
_syncVisibility() { _syncVisibility() {
this.label.visible = this.label.text != ''; this.label.visible = this.label.text != '';
} }
}); };
var Switch = new Lang.Class({ var Switch = class {
Name: 'Switch', constructor(state) {
_init(state) {
this.actor = new St.Bin({ style_class: 'toggle-switch', this.actor = new St.Bin({ style_class: 'toggle-switch',
accessible_role: Atk.Role.CHECK_BOX, accessible_role: Atk.Role.CHECK_BOX,
can_focus: true }); can_focus: true });
@@ -300,7 +289,7 @@ var Switch = new Lang.Class({
// simply result in invisible toggle switches. // simply result in invisible toggle switches.
this.actor.add_style_class_name(_("toggle-switch-us")); this.actor.add_style_class_name(_("toggle-switch-us"));
this.setToggleState(state); this.setToggleState(state);
}, }
setToggleState(state) { setToggleState(state) {
if (state) if (state)
@@ -308,19 +297,16 @@ var Switch = new Lang.Class({
else else
this.actor.remove_style_pseudo_class('checked'); this.actor.remove_style_pseudo_class('checked');
this.state = state; this.state = state;
}, }
toggle() { toggle() {
this.setToggleState(!this.state); this.setToggleState(!this.state);
} }
}); };
var PopupSwitchMenuItem = new Lang.Class({ var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
Name: 'PopupSwitchMenuItem', constructor(text, active, params) {
Extends: PopupBaseMenuItem, super(params);
_init(text, active, params) {
this.parent(params);
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this._switch = new Switch(active); this._switch = new Switch(active);
@@ -338,7 +324,7 @@ var PopupSwitchMenuItem = new Lang.Class({
style_class: 'popup-status-menu-item' style_class: 'popup-status-menu-item'
}); });
this._statusBin.child = this._switch.actor; this._statusBin.child = this._switch.actor;
}, }
setStatus(text) { setStatus(text) {
if (text != null) { if (text != null) {
@@ -352,7 +338,7 @@ var PopupSwitchMenuItem = new Lang.Class({
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
} }
this.checkAccessibleState(); this.checkAccessibleState();
}, }
activate(event) { activate(event) {
if (this._switch.actor.mapped) { if (this._switch.actor.mapped) {
@@ -365,23 +351,23 @@ var PopupSwitchMenuItem = new Lang.Class({
event.get_key_symbol() == Clutter.KEY_space) event.get_key_symbol() == Clutter.KEY_space)
return; return;
this.parent(event); super.activate(event);
}, }
toggle() { toggle() {
this._switch.toggle(); this._switch.toggle();
this.emit('toggled', this._switch.state); this.emit('toggled', this._switch.state);
this.checkAccessibleState(); this.checkAccessibleState();
}, }
get state() { get state() {
return this._switch.state; return this._switch.state;
}, }
setToggleState(state) { setToggleState(state) {
this._switch.setToggleState(state); this._switch.setToggleState(state);
this.checkAccessibleState(); this.checkAccessibleState();
}, }
checkAccessibleState() { checkAccessibleState() {
switch (this.actor.accessible_role) { switch (this.actor.accessible_role) {
@@ -395,14 +381,11 @@ var PopupSwitchMenuItem = new Lang.Class({
this.actor.remove_accessible_state (Atk.StateType.CHECKED); this.actor.remove_accessible_state (Atk.StateType.CHECKED);
} }
} }
}); };
var PopupImageMenuItem = new Lang.Class({ var PopupImageMenuItem = class extends PopupBaseMenuItem {
Name: 'PopupImageMenuItem', constructor(text, icon, params) {
Extends: PopupBaseMenuItem, super(params);
_init(text, icon, params) {
this.parent(params);
this._icon = new St.Icon({ style_class: 'popup-menu-icon', this._icon = new St.Icon({ style_class: 'popup-menu-icon',
x_align: Clutter.ActorAlign.END }); x_align: Clutter.ActorAlign.END });
@@ -412,7 +395,7 @@ var PopupImageMenuItem = new Lang.Class({
this.actor.label_actor = this.label; this.actor.label_actor = this.label;
this.setIcon(icon); this.setIcon(icon);
}, }
setIcon(icon) { setIcon(icon) {
// The 'icon' parameter can be either a Gio.Icon or a string. // The 'icon' parameter can be either a Gio.Icon or a string.
@@ -421,13 +404,13 @@ var PopupImageMenuItem = new Lang.Class({
else else
this._icon.icon_name = icon; this._icon.icon_name = icon;
} }
}); };
var PopupMenuBase = new Lang.Class({ var PopupMenuBase = class {
Name: 'PopupMenuBase', constructor(sourceActor, styleClass) {
Abstract: true, if (new.target === PopupMenuBase)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
_init(sourceActor, styleClass) {
this.sourceActor = sourceActor; this.sourceActor = sourceActor;
this._parent = null; this._parent = null;
@@ -451,33 +434,33 @@ var PopupMenuBase = new Lang.Class({
this._sensitive = true; this._sensitive = true;
this._sessionUpdatedId = Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); this._sessionUpdatedId = Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
}, }
_getTopMenu() { _getTopMenu() {
if (this._parent) if (this._parent)
return this._parent._getTopMenu(); return this._parent._getTopMenu();
else else
return this; return this;
}, }
_setParent(parent) { _setParent(parent) {
this._parent = parent; this._parent = parent;
}, }
getSensitive() { getSensitive() {
let parentSensitive = this._parent ? this._parent.getSensitive() : true; let parentSensitive = this._parent ? this._parent.getSensitive() : true;
return this._sensitive && parentSensitive; return this._sensitive && parentSensitive;
}, }
setSensitive(sensitive) { setSensitive(sensitive) {
this._sensitive = sensitive; this._sensitive = sensitive;
this.emit('sensitive-changed'); this.emit('sensitive-changed');
}, }
_sessionUpdated() { _sessionUpdated() {
this._setSettingsVisibility(Main.sessionMode.allowSettings); this._setSettingsVisibility(Main.sessionMode.allowSettings);
this.close(); this.close();
}, }
addAction(title, callback, icon) { addAction(title, callback, icon) {
let menuItem; let menuItem;
@@ -492,7 +475,7 @@ var PopupMenuBase = new Lang.Class({
}); });
return menuItem; return menuItem;
}, }
addSettingsAction(title, desktopFile) { addSettingsAction(title, desktopFile) {
let menuItem = this.addAction(title, () => { let menuItem = this.addAction(title, () => {
@@ -511,14 +494,14 @@ var PopupMenuBase = new Lang.Class({
this._settingsActions[desktopFile] = menuItem; this._settingsActions[desktopFile] = menuItem;
return menuItem; return menuItem;
}, }
_setSettingsVisibility(visible) { _setSettingsVisibility(visible) {
for (let id in this._settingsActions) { for (let id in this._settingsActions) {
let item = this._settingsActions[id]; let item = this._settingsActions[id];
item.actor.visible = visible; item.actor.visible = visible;
} }
}, }
isEmpty() { isEmpty() {
let hasVisibleChildren = this.box.get_children().some(child => { let hasVisibleChildren = this.box.get_children().some(child => {
@@ -528,21 +511,21 @@ var PopupMenuBase = new Lang.Class({
}); });
return !hasVisibleChildren; return !hasVisibleChildren;
}, }
itemActivated(animate) { itemActivated(animate) {
if (animate == undefined) if (animate == undefined)
animate = BoxPointer.PopupAnimation.FULL; animate = BoxPointer.PopupAnimation.FULL;
this._getTopMenu().close(animate); this._getTopMenu().close(animate);
}, }
_subMenuActiveChanged(submenu, submenuItem) { _subMenuActiveChanged(submenu, submenuItem) {
if (this._activeMenuItem && this._activeMenuItem != submenuItem) if (this._activeMenuItem && this._activeMenuItem != submenuItem)
this._activeMenuItem.setActive(false); this._activeMenuItem.setActive(false);
this._activeMenuItem = submenuItem; this._activeMenuItem = submenuItem;
this.emit('active-changed', submenuItem); this.emit('active-changed', submenuItem);
}, }
_connectItemSignals(menuItem) { _connectItemSignals(menuItem) {
menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => { menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
@@ -590,7 +573,7 @@ var PopupMenuBase = new Lang.Class({
if (menuItem == this._activeMenuItem) if (menuItem == this._activeMenuItem)
this._activeMenuItem = null; this._activeMenuItem = null;
}); });
}, }
_updateSeparatorVisibility(menuItem) { _updateSeparatorVisibility(menuItem) {
if (menuItem.label.text) if (menuItem.label.text)
@@ -626,7 +609,7 @@ var PopupMenuBase = new Lang.Class({
} }
menuItem.actor.show(); menuItem.actor.show();
}, }
moveMenuItem(menuItem, position) { moveMenuItem(menuItem, position) {
let items = this._getMenuItems(); let items = this._getMenuItems();
@@ -644,7 +627,7 @@ var PopupMenuBase = new Lang.Class({
} else { } else {
this.box.set_child_above_sibling(menuItem.actor, null); this.box.set_child_above_sibling(menuItem.actor, null);
} }
}, }
addMenuItem(menuItem, position) { addMenuItem(menuItem, position) {
let before_item = null; let before_item = null;
@@ -721,13 +704,13 @@ var PopupMenuBase = new Lang.Class({
menuItem._setParent(this); menuItem._setParent(this);
this.length++; this.length++;
}, }
_getMenuItems() { _getMenuItems() {
return this.box.get_children().map(a => a._delegate).filter(item => { return this.box.get_children().map(a => a._delegate).filter(item => {
return item instanceof PopupBaseMenuItem || item instanceof PopupMenuSection; return item instanceof PopupBaseMenuItem || item instanceof PopupMenuSection;
}); });
}, }
get firstMenuItem() { get firstMenuItem() {
let items = this._getMenuItems(); let items = this._getMenuItems();
@@ -735,11 +718,11 @@ var PopupMenuBase = new Lang.Class({
return items[0]; return items[0];
else else
return null; return null;
}, }
get numMenuItems() { get numMenuItems() {
return this._getMenuItems().length; return this._getMenuItems().length;
}, }
removeAll() { removeAll() {
let children = this._getMenuItems(); let children = this._getMenuItems();
@@ -747,14 +730,14 @@ var PopupMenuBase = new Lang.Class({
let item = children[i]; let item = children[i];
item.destroy(); item.destroy();
} }
}, }
toggle() { toggle() {
if (this.isOpen) if (this.isOpen)
this.close(BoxPointer.PopupAnimation.FULL); this.close(BoxPointer.PopupAnimation.FULL);
else else
this.open(BoxPointer.PopupAnimation.FULL); this.open(BoxPointer.PopupAnimation.FULL);
}, }
destroy() { destroy() {
this.close(); this.close();
@@ -766,15 +749,12 @@ var PopupMenuBase = new Lang.Class({
Main.sessionMode.disconnect(this._sessionUpdatedId); Main.sessionMode.disconnect(this._sessionUpdatedId);
this._sessionUpdatedId = 0; this._sessionUpdatedId = 0;
} }
}); };
Signals.addSignalMethods(PopupMenuBase.prototype); Signals.addSignalMethods(PopupMenuBase.prototype);
var PopupMenu = new Lang.Class({ var PopupMenu = class extends PopupMenuBase {
Name: 'PopupMenu', constructor(sourceActor, arrowAlignment, arrowSide) {
Extends: PopupMenuBase, super(sourceActor, 'popup-menu-content');
_init(sourceActor, arrowAlignment, arrowSide) {
this.parent(sourceActor, 'popup-menu-content');
this._arrowAlignment = arrowAlignment; this._arrowAlignment = arrowAlignment;
this._arrowSide = arrowSide; this._arrowSide = arrowSide;
@@ -798,14 +778,14 @@ var PopupMenu = new Lang.Class({
this._onKeyPress.bind(this)); this._onKeyPress.bind(this));
this._openedSubMenu = null; this._openedSubMenu = null;
}, }
_setOpenedSubMenu(submenu) { _setOpenedSubMenu(submenu) {
if (this._openedSubMenu) if (this._openedSubMenu)
this._openedSubMenu.close(true); this._openedSubMenu.close(true);
this._openedSubMenu = submenu; this._openedSubMenu = submenu;
}, }
_onKeyPress(actor, event) { _onKeyPress(actor, event) {
// Disable toggling the menu by keyboard // Disable toggling the menu by keyboard
@@ -853,16 +833,15 @@ var PopupMenu = new Lang.Class({
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} else } else
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
setArrowOrigin(origin) { setArrowOrigin(origin) {
this._boxPointer.setArrowOrigin(origin); this._boxPointer.setArrowOrigin(origin);
}, }
setSourceAlignment(alignment) { setSourceAlignment(alignment) {
this._boxPointer.setSourceAlignment(alignment); this._boxPointer.setSourceAlignment(alignment);
}, }
open(animate) { open(animate) {
if (this.isOpen) if (this.isOpen)
@@ -879,7 +858,7 @@ var PopupMenu = new Lang.Class({
this.actor.raise_top(); this.actor.raise_top();
this.emit('open-state-changed', true); this.emit('open-state-changed', true);
}, }
close(animate) { close(animate) {
if (this._activeMenuItem) if (this._activeMenuItem)
@@ -896,43 +875,38 @@ var PopupMenu = new Lang.Class({
this.isOpen = false; this.isOpen = false;
this.emit('open-state-changed', false); this.emit('open-state-changed', false);
}, }
destroy() { destroy() {
if (this._keyPressId) if (this._keyPressId)
this.sourceActor.disconnect(this._keyPressId); this.sourceActor.disconnect(this._keyPressId);
this.parent(); super.destroy();
} }
}); };
var PopupDummyMenu = new Lang.Class({ var PopupDummyMenu = class {
Name: 'PopupDummyMenu', constructor(sourceActor) {
_init(sourceActor) {
this.sourceActor = sourceActor; this.sourceActor = sourceActor;
this.actor = sourceActor; this.actor = sourceActor;
this.actor._delegate = this; this.actor._delegate = this;
}, }
getSensitive() { getSensitive() {
return true; return true;
}, }
open() { this.emit('open-state-changed', true); }, open() { this.emit('open-state-changed', true); }
close() { this.emit('open-state-changed', false); }, close() { this.emit('open-state-changed', false); }
toggle() {}, toggle() {}
destroy() { destroy() {
this.emit('destroy'); this.emit('destroy');
}, }
}); };
Signals.addSignalMethods(PopupDummyMenu.prototype); Signals.addSignalMethods(PopupDummyMenu.prototype);
var PopupSubMenu = new Lang.Class({ var PopupSubMenu = class extends PopupMenuBase {
Name: 'PopupSubMenu', constructor(sourceActor, sourceArrow) {
Extends: PopupMenuBase, super(sourceActor);
_init(sourceActor, sourceArrow) {
this.parent(sourceActor);
this._arrow = sourceArrow; this._arrow = sourceArrow;
@@ -948,7 +922,7 @@ var PopupSubMenu = new Lang.Class({
this.actor.clip_to_allocation = true; this.actor.clip_to_allocation = true;
this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this)); this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
this.actor.hide(); this.actor.hide();
}, }
_needsScrollbar() { _needsScrollbar() {
let topMenu = this._getTopMenu(); let topMenu = this._getTopMenu();
@@ -957,11 +931,11 @@ var PopupSubMenu = new Lang.Class({
let topMaxHeight = topThemeNode.get_max_height(); let topMaxHeight = topThemeNode.get_max_height();
return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight; return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight;
}, }
getSensitive() { getSensitive() {
return this._sensitive && this.sourceActor._delegate.getSensitive(); return this._sensitive && this.sourceActor._delegate.getSensitive();
}, }
open(animate) { open(animate) {
if (this.isOpen) if (this.isOpen)
@@ -1017,7 +991,7 @@ var PopupSubMenu = new Lang.Class({
} else { } else {
this._arrow.rotation_angle_z = targetAngle; this._arrow.rotation_angle_z = targetAngle;
} }
}, }
close(animate) { close(animate) {
if (!this.isOpen) if (!this.isOpen)
@@ -1052,7 +1026,7 @@ var PopupSubMenu = new Lang.Class({
this._arrow.rotation_angle_z = 0; this._arrow.rotation_angle_z = 0;
this.actor.hide(); this.actor.hide();
} }
}, }
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
// Move focus back to parent menu if the user types Left. // Move focus back to parent menu if the user types Left.
@@ -1065,7 +1039,7 @@ var PopupSubMenu = new Lang.Class({
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
}); };
/** /**
* PopupMenuSection: * PopupMenuSection:
@@ -1075,30 +1049,24 @@ var PopupSubMenu = new Lang.Class({
* can add it to another menu), but is completely transparent * can add it to another menu), but is completely transparent
* to the user * to the user
*/ */
var PopupMenuSection = new Lang.Class({ var PopupMenuSection = class extends PopupMenuBase {
Name: 'PopupMenuSection', constructor() {
Extends: PopupMenuBase, super();
_init() {
this.parent();
this.actor = this.box; this.actor = this.box;
this.actor._delegate = this; this.actor._delegate = this;
this.isOpen = true; this.isOpen = true;
}, }
// deliberately ignore any attempt to open() or close(), but emit the // deliberately ignore any attempt to open() or close(), but emit the
// corresponding signal so children can still pick it up // corresponding signal so children can still pick it up
open() { this.emit('open-state-changed', true); }, open() { this.emit('open-state-changed', true); }
close() { this.emit('open-state-changed', false); }, close() { this.emit('open-state-changed', false); }
}); };
var PopupSubMenuMenuItem = new Lang.Class({ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
Name: 'PopupSubMenuMenuItem', constructor(text, wantIcon) {
Extends: PopupBaseMenuItem, super();
_init(text, wantIcon) {
this.parent();
this.actor.add_style_class_name('popup-submenu-menu-item'); this.actor.add_style_class_name('popup-submenu-menu-item');
@@ -1128,19 +1096,19 @@ var PopupSubMenuMenuItem = new Lang.Class({
this.menu = new PopupSubMenu(this.actor, this._triangle); this.menu = new PopupSubMenu(this.actor, this._triangle);
this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this)); this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
}, }
_setParent(parent) { _setParent(parent) {
this.parent(parent); super._setParent(parent);
this.menu._setParent(parent); this.menu._setParent(parent);
}, }
syncSensitive() { syncSensitive() {
let sensitive = this.parent(); let sensitive = super.syncSensitive();
this._triangle.visible = sensitive; this._triangle.visible = sensitive;
if (!sensitive) if (!sensitive)
this.menu.close(false); this.menu.close(false);
}, }
_subMenuOpenStateChanged(menu, open) { _subMenuOpenStateChanged(menu, open) {
if (open) { if (open) {
@@ -1154,28 +1122,28 @@ var PopupSubMenuMenuItem = new Lang.Class({
this.actor.remove_accessible_state (Atk.StateType.EXPANDED); this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
this.actor.remove_style_pseudo_class('checked'); this.actor.remove_style_pseudo_class('checked');
} }
}, }
destroy() { destroy() {
this.menu.destroy(); this.menu.destroy();
this.parent(); super.destroy();
}, }
setSubmenuShown(open) { setSubmenuShown(open) {
if (open) if (open)
this.menu.open(BoxPointer.PopupAnimation.FULL); this.menu.open(BoxPointer.PopupAnimation.FULL);
else else
this.menu.close(BoxPointer.PopupAnimation.FULL); this.menu.close(BoxPointer.PopupAnimation.FULL);
}, }
_setOpenState(open) { _setOpenState(open) {
this.setSubmenuShown(open); this.setSubmenuShown(open);
}, }
_getOpenState() { _getOpenState() {
return this.menu.isOpen; return this.menu.isOpen;
}, }
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
@@ -1189,12 +1157,12 @@ var PopupSubMenuMenuItem = new Lang.Class({
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
return this.parent(actor, event); return super._onKeyPressEvent(actor, event);
}, }
activate(event) { activate(event) {
this._setOpenState(true); this._setOpenState(true);
}, }
_onButtonReleaseEvent(actor) { _onButtonReleaseEvent(actor) {
// Since we override the parent, we need to manage what the parent does // Since we override the parent, we need to manage what the parent does
@@ -1202,7 +1170,7 @@ var PopupSubMenuMenuItem = new Lang.Class({
this.actor.remove_style_pseudo_class ('active'); this.actor.remove_style_pseudo_class ('active');
this._setOpenState(!this._getOpenState()); this._setOpenState(!this._getOpenState());
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onTouchEvent(actor, event) { _onTouchEvent(actor, event) {
if (event.type() == Clutter.EventType.TOUCH_END) { if (event.type() == Clutter.EventType.TOUCH_END) {
@@ -1213,21 +1181,19 @@ var PopupSubMenuMenuItem = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
}); };
/* Basic implementation of a menu manager. /* Basic implementation of a menu manager.
* Call addMenu to add menus * Call addMenu to add menus
*/ */
var PopupMenuManager = new Lang.Class({ var PopupMenuManager = class {
Name: 'PopupMenuManager', constructor(owner, grabParams) {
_init(owner, grabParams) {
grabParams = Params.parse(grabParams, grabParams = Params.parse(grabParams,
{ actionMode: Shell.ActionMode.POPUP }); { actionMode: Shell.ActionMode.POPUP });
this._owner = owner; this._owner = owner;
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams); this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
this._menus = []; this._menus = [];
}, }
addMenu(menu, position) { addMenu(menu, position) {
if (this._findMenu(menu) > -1) if (this._findMenu(menu) > -1)
@@ -1256,7 +1222,7 @@ var PopupMenuManager = new Lang.Class({
this._menus.push(menudata); this._menus.push(menudata);
else else
this._menus.splice(position, 0, menudata); this._menus.splice(position, 0, menudata);
}, }
removeMenu(menu) { removeMenu(menu) {
if (menu == this.activeMenu) if (menu == this.activeMenu)
@@ -1278,7 +1244,7 @@ var PopupMenuManager = new Lang.Class({
if (menu.sourceActor) if (menu.sourceActor)
this._grabHelper.removeActor(menu.sourceActor); this._grabHelper.removeActor(menu.sourceActor);
this._menus.splice(position, 1); this._menus.splice(position, 1);
}, }
get activeMenu() { get activeMenu() {
let firstGrab = this._grabHelper.grabStack[0]; let firstGrab = this._grabHelper.grabStack[0];
@@ -1286,11 +1252,11 @@ var PopupMenuManager = new Lang.Class({
return firstGrab.actor._delegate; return firstGrab.actor._delegate;
else else
return null; return null;
}, }
ignoreRelease() { ignoreRelease() {
return this._grabHelper.ignoreRelease(); return this._grabHelper.ignoreRelease();
}, }
_onMenuOpenState(menu, open) { _onMenuOpenState(menu, open) {
if (open) { if (open) {
@@ -1303,12 +1269,12 @@ var PopupMenuManager = new Lang.Class({
} else { } else {
this._grabHelper.ungrab({ actor: menu.actor }); this._grabHelper.ungrab({ actor: menu.actor });
} }
}, }
_changeMenu(newMenu) { _changeMenu(newMenu) {
newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE
: BoxPointer.PopupAnimation.FULL); : BoxPointer.PopupAnimation.FULL);
}, }
_onMenuSourceEnter(menu) { _onMenuSourceEnter(menu) {
if (!this._grabHelper.grabbed) if (!this._grabHelper.grabbed)
@@ -1319,11 +1285,11 @@ var PopupMenuManager = new Lang.Class({
this._changeMenu(menu); this._changeMenu(menu);
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onMenuDestroy(menu) { _onMenuDestroy(menu) {
this.removeMenu(menu); this.removeMenu(menu);
}, }
_findMenu(item) { _findMenu(item) {
for (let i = 0; i < this._menus.length; i++) { for (let i = 0; i < this._menus.length; i++) {
@@ -1332,7 +1298,7 @@ var PopupMenuManager = new Lang.Class({
return i; return i;
} }
return -1; return -1;
}, }
_closeMenu(isUser, menu) { _closeMenu(isUser, menu) {
// If this isn't a user action, we called close() // If this isn't a user action, we called close()
@@ -1341,4 +1307,4 @@ var PopupMenuManager = new Lang.Class({
if (isUser) if (isUser)
menu.close(BoxPointer.PopupAnimation.FULL); menu.close(BoxPointer.PopupAnimation.FULL);
} }
}); };

View File

@@ -1,213 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Atk = imports.gi.Atk;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const ShellMenu = imports.gi.ShellMenu;
const St = imports.gi.St;
const PopupMenu = imports.ui.popupMenu;
function stripMnemonics(label) {
if (!label)
return '';
// remove all underscores that are not followed by another underscore
return label.replace(/_([^_])/, '$1');
}
function _insertItem(menu, trackerItem, position) {
let mapper;
if (trackerItem.get_is_separator())
mapper = new RemoteMenuSeparatorItemMapper(trackerItem);
else if (trackerItem.get_has_submenu())
mapper = new RemoteMenuSubmenuItemMapper(trackerItem);
else
mapper = new RemoteMenuItemMapper(trackerItem);
let item = mapper.menuItem;
menu.addMenuItem(item, position);
}
function _removeItem(menu, position) {
let items = menu._getMenuItems();
items[position].destroy();
}
var RemoteMenuSeparatorItemMapper = new Lang.Class({
Name: 'RemoteMenuSeparatorItemMapper',
_init(trackerItem) {
this._trackerItem = trackerItem;
this.menuItem = new PopupMenu.PopupSeparatorMenuItem();
this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
this._updateLabel();
this.menuItem.connect('destroy', () => {
trackerItem.run_dispose();
});
},
_updateLabel() {
this.menuItem.label.text = stripMnemonics(this._trackerItem.label);
},
});
var RequestSubMenu = new Lang.Class({
Name: 'RequestSubMenu',
Extends: PopupMenu.PopupSubMenuMenuItem,
_init() {
this.parent('');
this._requestOpen = false;
},
_setOpenState(open) {
this.emit('request-open', open);
this._requestOpen = open;
},
_getOpenState() {
return this._requestOpen;
},
});
var RemoteMenuSubmenuItemMapper = new Lang.Class({
Name: 'RemoteMenuSubmenuItemMapper',
_init(trackerItem) {
this._trackerItem = trackerItem;
this.menuItem = new RequestSubMenu();
this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
this._updateLabel();
this._tracker = Shell.MenuTracker.new_for_item_submenu(this._trackerItem,
_insertItem.bind(null, this.menuItem.menu),
_removeItem.bind(null, this.menuItem.menu));
this.menuItem.connect('request-open', (menu, open) => {
this._trackerItem.request_submenu_shown(open);
});
this._trackerItem.connect('notify::submenu-shown', () => {
this.menuItem.setSubmenuShown(this._trackerItem.get_submenu_shown());
});
this.menuItem.connect('destroy', () => {
trackerItem.run_dispose();
});
},
destroy() {
this._tracker.destroy();
this.parent();
},
_updateLabel() {
this.menuItem.label.text = stripMnemonics(this._trackerItem.label);
},
});
var RemoteMenuItemMapper = new Lang.Class({
Name: 'RemoteMenuItemMapper',
_init(trackerItem) {
this._trackerItem = trackerItem;
this.menuItem = new PopupMenu.PopupBaseMenuItem();
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.menuItem.actor.add_child(this._icon);
this._label = new St.Label();
this.menuItem.actor.add_child(this._label);
this.menuItem.actor.label_actor = this._label;
this.menuItem.connect('activate', () => {
this._trackerItem.activated();
});
this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
this._trackerItem.connect('notify::icon', this._updateIcon.bind(this));
this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this));
this._trackerItem.connect('notify::role', this._updateRole.bind(this));
this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this));
this._updateIcon();
this._updateLabel();
this._updateSensitivity();
this._updateRole();
this.menuItem.connect('destroy', () => {
trackerItem.run_dispose();
});
},
_updateIcon() {
this._icon.gicon = this._trackerItem.icon;
this._icon.visible = (this._icon.gicon != null);
},
_updateLabel() {
this._label.text = stripMnemonics(this._trackerItem.label);
},
_updateSensitivity() {
this.menuItem.setSensitive(this._trackerItem.sensitive);
},
_updateDecoration() {
let ornamentForRole = {};
ornamentForRole[ShellMenu.MenuTrackerItemRole.RADIO] = PopupMenu.Ornament.DOT;
ornamentForRole[ShellMenu.MenuTrackerItemRole.CHECK] = PopupMenu.Ornament.CHECK;
let ornament = PopupMenu.Ornament.NONE;
if (this._trackerItem.toggled)
ornament = ornamentForRole[this._trackerItem.role];
this.menuItem.setOrnament(ornament);
},
_updateRole() {
let a11yRoles = {};
a11yRoles[ShellMenu.MenuTrackerItemRole.NORMAL] = Atk.Role.MENU_ITEM;
a11yRoles[ShellMenu.MenuTrackerItemRole.RADIO] = Atk.Role.RADIO_MENU_ITEM;
a11yRoles[ShellMenu.MenuTrackerItemRole.CHECK] = Atk.Role.CHECK_MENU_ITEM;
let a11yRole = a11yRoles[this._trackerItem.role];
this.menuItem.actor.accessible_role = a11yRole;
this._updateDecoration();
},
});
var RemoteMenu = new Lang.Class({
Name: 'RemoteMenu',
Extends: PopupMenu.PopupMenu,
_init(sourceActor, model, actionGroup) {
this.parent(sourceActor, 0.0, St.Side.TOP);
this._model = model;
this._actionGroup = actionGroup;
this._tracker = Shell.MenuTracker.new(this._actionGroup,
this._model,
null, /* action namespace */
_insertItem.bind(null, this),
_removeItem.bind(null, this));
},
get actionGroup() {
return this._actionGroup;
},
destroy() {
this._tracker.destroy();
this.parent();
},
});

View File

@@ -3,7 +3,6 @@
const GdkPixbuf = imports.gi.GdkPixbuf; const GdkPixbuf = imports.gi.GdkPixbuf;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -190,10 +189,8 @@ function loadRemoteSearchProviders(searchSettings, callback) {
callback(loadedProviders); callback(loadedProviders);
} }
var RemoteSearchProvider = new Lang.Class({ var RemoteSearchProvider = class {
Name: 'RemoteSearchProvider', constructor(appInfo, dbusName, dbusPath, autoStart, proxyInfo) {
_init(appInfo, dbusName, dbusPath, autoStart, proxyInfo) {
if (!proxyInfo) if (!proxyInfo)
proxyInfo = SearchProviderProxyInfo; proxyInfo = SearchProviderProxyInfo;
@@ -215,7 +212,7 @@ var RemoteSearchProvider = new Lang.Class({
this.id = appInfo.get_id(); this.id = appInfo.get_id();
this.isRemoteProvider = true; this.isRemoteProvider = true;
this.canLaunchSearch = false; this.canLaunchSearch = false;
}, }
createIcon(size, meta) { createIcon(size, meta) {
let gicon = null; let gicon = null;
@@ -236,7 +233,7 @@ var RemoteSearchProvider = new Lang.Class({
icon = new St.Icon({ gicon: gicon, icon = new St.Icon({ gicon: gicon,
icon_size: size }); icon_size: size });
return icon; return icon;
}, }
filterResults(results, maxNumber) { filterResults(results, maxNumber) {
if (results.length <= maxNumber) if (results.length <= maxNumber)
@@ -246,7 +243,7 @@ var RemoteSearchProvider = new Lang.Class({
let specialResults = results.filter(r => r.startsWith('special:')); let specialResults = results.filter(r => r.startsWith('special:'));
return regularResults.slice(0, maxNumber).concat(specialResults.slice(0, maxNumber)); return regularResults.slice(0, maxNumber).concat(specialResults.slice(0, maxNumber));
}, }
_getResultsFinished(results, error, callback) { _getResultsFinished(results, error, callback) {
if (error) { if (error) {
@@ -259,7 +256,7 @@ var RemoteSearchProvider = new Lang.Class({
} }
callback(results[0]); callback(results[0]);
}, }
getInitialResultSet(terms, callback, cancellable) { getInitialResultSet(terms, callback, cancellable) {
this.proxy.GetInitialResultSetRemote(terms, this.proxy.GetInitialResultSetRemote(terms,
@@ -267,7 +264,7 @@ var RemoteSearchProvider = new Lang.Class({
this._getResultsFinished(results, error, callback); this._getResultsFinished(results, error, callback);
}, },
cancellable); cancellable);
}, }
getSubsearchResultSet(previousResults, newTerms, callback, cancellable) { getSubsearchResultSet(previousResults, newTerms, callback, cancellable) {
this.proxy.GetSubsearchResultSetRemote(previousResults, newTerms, this.proxy.GetSubsearchResultSetRemote(previousResults, newTerms,
@@ -275,7 +272,7 @@ var RemoteSearchProvider = new Lang.Class({
this._getResultsFinished(results, error, callback); this._getResultsFinished(results, error, callback);
}, },
cancellable); cancellable);
}, }
_getResultMetasFinished(results, error, callback) { _getResultMetasFinished(results, error, callback) {
if (error) { if (error) {
@@ -302,7 +299,7 @@ var RemoteSearchProvider = new Lang.Class({
clipboardText: metas[i]['clipboardText'] }); clipboardText: metas[i]['clipboardText'] });
} }
callback(resultMetas); callback(resultMetas);
}, }
getResultMetas(ids, callback, cancellable) { getResultMetas(ids, callback, cancellable) {
this.proxy.GetResultMetasRemote(ids, this.proxy.GetResultMetasRemote(ids,
@@ -310,11 +307,11 @@ var RemoteSearchProvider = new Lang.Class({
this._getResultMetasFinished(results, error, callback); this._getResultMetasFinished(results, error, callback);
}, },
cancellable); cancellable);
}, }
activateResult(id) { activateResult(id) {
this.proxy.ActivateResultRemote(id); this.proxy.ActivateResultRemote(id);
}, }
launchSearch(terms) { launchSearch(terms) {
// the provider is not compatible with the new version of the interface, launch // the provider is not compatible with the new version of the interface, launch
@@ -322,23 +319,20 @@ var RemoteSearchProvider = new Lang.Class({
log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch'); log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch');
this.appInfo.launch([], global.create_app_launch_context(0, -1)); this.appInfo.launch([], global.create_app_launch_context(0, -1));
} }
}); };
var RemoteSearchProvider2 = new Lang.Class({ var RemoteSearchProvider2 = class extends RemoteSearchProvider {
Name: 'RemoteSearchProvider2', constructor(appInfo, dbusName, dbusPath, autoStart) {
Extends: RemoteSearchProvider, super(appInfo, dbusName, dbusPath, autoStart, SearchProvider2ProxyInfo);
_init(appInfo, dbusName, dbusPath, autoStart) {
this.parent(appInfo, dbusName, dbusPath, autoStart, SearchProvider2ProxyInfo);
this.canLaunchSearch = true; this.canLaunchSearch = true;
}, }
activateResult(id, terms) { activateResult(id, terms) {
this.proxy.ActivateResultRemote(id, terms, global.get_current_time()); this.proxy.ActivateResultRemote(id, terms, global.get_current_time());
}, }
launchSearch(terms) { launchSearch(terms) {
this.proxy.LaunchSearchRemote(terms, global.get_current_time()); this.proxy.LaunchSearchRemote(terms, global.get_current_time());
} }
}); };

View File

@@ -3,7 +3,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -30,13 +29,10 @@ const EXEC_ARG_KEY = 'exec-arg';
var DIALOG_GROW_TIME = 0.1; var DIALOG_GROW_TIME = 0.1;
var RunDialog = new Lang.Class({ var RunDialog = class extends ModalDialog.ModalDialog {
Name: 'RunDialog', constructor() {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'run-dialog',
destroyOnClose: false });
_init() {
this.parent({ styleClass: 'run-dialog',
destroyOnClose: false });
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA }); this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA });
@@ -144,7 +140,7 @@ var RunDialog = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });
}, }
_getCommandCompletion(text) { _getCommandCompletion(text) {
function _getCommon(s1, s2) { function _getCommon(s1, s2) {
@@ -189,7 +185,7 @@ var RunDialog = new Lang.Class({
let common = results.reduce(_getCommon, null); let common = results.reduce(_getCommon, null);
return common.substr(text.length); return common.substr(text.length);
}, }
_getCompletion(text) { _getCompletion(text) {
if (text.indexOf('/') != -1) { if (text.indexOf('/') != -1) {
@@ -197,7 +193,7 @@ var RunDialog = new Lang.Class({
} else { } else {
return this._getCommandCompletion(text); return this._getCommandCompletion(text);
} }
}, }
_run(input, inTerminal) { _run(input, inTerminal) {
let command = input; let command = input;
@@ -248,7 +244,7 @@ var RunDialog = new Lang.Class({
} }
} }
} }
}, }
_showError(message) { _showError(message) {
this._commandError = true; this._commandError = true;
@@ -269,7 +265,7 @@ var RunDialog = new Lang.Class({
} }
}); });
} }
}, }
_restart() { _restart() {
if (Meta.is_wayland_compositor()) { if (Meta.is_wayland_compositor()) {
@@ -279,7 +275,7 @@ var RunDialog = new Lang.Class({
this._shouldFadeOut = false; this._shouldFadeOut = false;
this.close(); this.close();
Meta.restart(_("Restarting…")); Meta.restart(_("Restarting…"));
}, }
open() { open() {
this._history.lastItem(); this._history.lastItem();
@@ -290,7 +286,7 @@ var RunDialog = new Lang.Class({
if (this._lockdownSettings.get_boolean(DISABLE_COMMAND_LINE_KEY)) if (this._lockdownSettings.get_boolean(DISABLE_COMMAND_LINE_KEY))
return; return;
this.parent(); super.open();
}, }
}); };
Signals.addSignalMethods(RunDialog.prototype); Signals.addSignalMethods(RunDialog.prototype);

View File

@@ -6,8 +6,8 @@ const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop; const GnomeDesktop = imports.gi.GnomeDesktop;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -60,10 +60,8 @@ var MANUAL_FADE_TIME = 0.3;
var BACKGROUND_FADE_TIME = 1.0; var BACKGROUND_FADE_TIME = 1.0;
var CURTAIN_SLIDE_TIME = 0.3; var CURTAIN_SLIDE_TIME = 0.3;
var Clock = new Lang.Class({ var Clock = class {
Name: 'ScreenShieldClock', constructor() {
_init() {
this.actor = new St.BoxLayout({ style_class: 'screen-shield-clock', this.actor = new St.BoxLayout({ style_class: 'screen-shield-clock',
vertical: true }); vertical: true });
@@ -77,7 +75,7 @@ var Clock = new Lang.Class({
this._wallClock.connect('notify::clock', this._updateClock.bind(this)); this._wallClock.connect('notify::clock', this._updateClock.bind(this));
this._updateClock(); this._updateClock();
}, }
_updateClock() { _updateClock() {
this._time.text = this._wallClock.clock; this._time.text = this._wallClock.clock;
@@ -87,18 +85,16 @@ var Clock = new Lang.Class({
long format */ long format */
let dateFormat = Shell.util_translate_time_string(N_("%A, %B %d")); let dateFormat = Shell.util_translate_time_string(N_("%A, %B %d"));
this._date.text = date.toLocaleFormat(dateFormat); this._date.text = date.toLocaleFormat(dateFormat);
}, }
destroy() { destroy() {
this.actor.destroy(); this.actor.destroy();
this._wallClock.run_dispose(); this._wallClock.run_dispose();
} }
}); };
var NotificationsBox = new Lang.Class({ var NotificationsBox = class {
Name: 'NotificationsBox', constructor() {
_init() {
this.actor = new St.BoxLayout({ vertical: true, this.actor = new St.BoxLayout({ vertical: true,
name: 'screenShieldNotifications', name: 'screenShieldNotifications',
style_class: 'screen-shield-notifications-container' }); style_class: 'screen-shield-notifications-container' });
@@ -118,7 +114,7 @@ var NotificationsBox = new Lang.Class({
this._updateVisibility(); this._updateVisibility();
this._sourceAddedId = Main.messageTray.connect('source-added', this._sourceAdded.bind(this)); this._sourceAddedId = Main.messageTray.connect('source-added', this._sourceAdded.bind(this));
}, }
destroy() { destroy() {
if (this._sourceAddedId) { if (this._sourceAddedId) {
@@ -132,21 +128,21 @@ var NotificationsBox = new Lang.Class({
} }
this.actor.destroy(); this.actor.destroy();
}, }
_updateVisibility() { _updateVisibility() {
this._notificationBox.visible = this._notificationBox.visible =
this._notificationBox.get_children().some(a => a.visible); this._notificationBox.get_children().some(a => a.visible);
this.actor.visible = this._notificationBox.visible; this.actor.visible = this._notificationBox.visible;
}, }
_makeNotificationCountText(count, isChat) { _makeNotificationCountText(count, isChat) {
if (isChat) if (isChat)
return ngettext("%d new message", "%d new messages", count).format(count); return ngettext("%d new message", "%d new messages", count).format(count);
else else
return ngettext("%d new notification", "%d new notifications", count).format(count); return ngettext("%d new notification", "%d new notifications", count).format(count);
}, }
_makeNotificationSource(source, box) { _makeNotificationSource(source, box) {
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE); let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
@@ -166,7 +162,7 @@ var NotificationsBox = new Lang.Class({
box.visible = count != 0; box.visible = count != 0;
return [title, countLabel]; return [title, countLabel];
}, }
_makeNotificationDetailedSource(source, box) { _makeNotificationDetailedSource(source, box) {
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE); let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
@@ -204,7 +200,7 @@ var NotificationsBox = new Lang.Class({
box.visible = visible; box.visible = visible;
return [title, null]; return [title, null];
}, }
_showSource(source, obj, box) { _showSource(source, obj, box) {
if (obj.detailed) { if (obj.detailed) {
@@ -214,7 +210,7 @@ var NotificationsBox = new Lang.Class({
} }
box.visible = obj.visible && (source.unseenCount > 0); box.visible = obj.visible && (source.unseenCount > 0);
}, }
_sourceAdded(tray, source, initial) { _sourceAdded(tray, source, initial) {
let obj = { let obj = {
@@ -276,11 +272,11 @@ var NotificationsBox = new Lang.Class({
if (obj.sourceBox.visible) if (obj.sourceBox.visible)
this.emit('wake-up-screen'); this.emit('wake-up-screen');
} }
}, }
_titleChanged(source, obj) { _titleChanged(source, obj) {
obj.titleLabel.text = source.title; obj.titleLabel.text = source.title;
}, }
_countChanged(source, obj) { _countChanged(source, obj) {
if (obj.detailed) { if (obj.detailed) {
@@ -300,7 +296,7 @@ var NotificationsBox = new Lang.Class({
this._updateVisibility(); this._updateVisibility();
if (obj.sourceBox.visible) if (obj.sourceBox.visible)
this.emit('wake-up-screen'); this.emit('wake-up-screen');
}, }
_visibleChanged(source, obj) { _visibleChanged(source, obj) {
if (obj.visible == source.policy.showInLockScreen) if (obj.visible == source.policy.showInLockScreen)
@@ -312,7 +308,7 @@ var NotificationsBox = new Lang.Class({
this._updateVisibility(); this._updateVisibility();
if (obj.sourceBox.visible) if (obj.sourceBox.visible)
this.emit('wake-up-screen'); this.emit('wake-up-screen');
}, }
_detailedChanged(source, obj) { _detailedChanged(source, obj) {
if (obj.detailed == source.policy.detailsInLockScreen) if (obj.detailed == source.policy.detailsInLockScreen)
@@ -323,12 +319,12 @@ var NotificationsBox = new Lang.Class({
obj.sourceBox.destroy_all_children(); obj.sourceBox.destroy_all_children();
obj.titleLabel = obj.countLabel = null; obj.titleLabel = obj.countLabel = null;
this._showSource(source, obj, obj.sourceBox); this._showSource(source, obj, obj.sourceBox);
}, }
_onSourceDestroy(source, obj) { _onSourceDestroy(source, obj) {
this._removeSource(source, obj); this._removeSource(source, obj);
this._updateVisibility(); this._updateVisibility();
}, }
_removeSource(source, obj) { _removeSource(source, obj) {
obj.sourceBox.destroy(); obj.sourceBox.destroy();
@@ -340,16 +336,14 @@ var NotificationsBox = new Lang.Class({
source.policy.disconnect(obj.policyChangedId); source.policy.disconnect(obj.policyChangedId);
this._sources.delete(source); this._sources.delete(source);
}, }
}); };
Signals.addSignalMethods(NotificationsBox.prototype); Signals.addSignalMethods(NotificationsBox.prototype);
var Arrow = new Lang.Class({ var Arrow = GObject.registerClass(
Name: 'Arrow', class ScreenShieldArrow extends St.Bin {
Extends: St.Bin,
_init(params) { _init(params) {
this.parent(params); super._init(params);
this.x_fill = this.y_fill = true; this.x_fill = this.y_fill = true;
this._drawingArea = new St.DrawingArea(); this._drawingArea = new St.DrawingArea();
@@ -358,7 +352,7 @@ var Arrow = new Lang.Class({
this._shadowHelper = null; this._shadowHelper = null;
this._shadowWidth = this._shadowHeight = 0; this._shadowWidth = this._shadowHeight = 0;
}, }
_drawArrow(arrow) { _drawArrow(arrow) {
let cr = arrow.get_context(); let cr = arrow.get_context();
@@ -376,10 +370,10 @@ var Arrow = new Lang.Class({
cr.lineTo(w - thickness / 2, h - thickness / 2); cr.lineTo(w - thickness / 2, h - thickness / 2);
cr.stroke(); cr.stroke();
cr.$dispose(); cr.$dispose();
}, }
vfunc_get_paint_volume(volume) { vfunc_get_paint_volume(volume) {
if (!this.parent(volume)) if (!super.vfunc_get_paint_volume(volume))
return false; return false;
if (!this._shadow) if (!this._shadow)
@@ -392,7 +386,7 @@ var Arrow = new Lang.Class({
volume.set_height(Math.max(shadow_box.y2 - shadow_box.y1, volume.get_height())); volume.set_height(Math.max(shadow_box.y2 - shadow_box.y1, volume.get_height()));
return true; return true;
}, }
vfunc_style_changed() { vfunc_style_changed() {
let node = this.get_theme_node(); let node = this.get_theme_node();
@@ -402,8 +396,8 @@ var Arrow = new Lang.Class({
else else
this._shadowHelper = null; this._shadowHelper = null;
this.parent(); super.vfunc_style_changed();
}, }
vfunc_paint() { vfunc_paint() {
if (this._shadowHelper) { if (this._shadowHelper) {
@@ -430,10 +424,8 @@ function clamp(value, min, max) {
* This will ensure that the screen blanks at the right time when it fades out. * This will ensure that the screen blanks at the right time when it fades out.
* https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependency. * https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependency.
*/ */
var ScreenShield = new Lang.Class({ var ScreenShield = class {
Name: 'ScreenShield', constructor() {
_init() {
this.actor = Main.layoutManager.screenShieldGroup; this.actor = Main.layoutManager.screenShieldGroup;
this._lockScreenState = MessageTray.State.HIDDEN; this._lockScreenState = MessageTray.State.HIDDEN;
@@ -573,7 +565,7 @@ var ScreenShield = new Lang.Class({
this._cursorTracker = Meta.CursorTracker.get_for_display(global.display); this._cursorTracker = Meta.CursorTracker.get_for_display(global.display);
this._syncInhibitor(); this._syncInhibitor();
}, }
_setActive(active) { _setActive(active) {
let prevIsActive = this._isActive; let prevIsActive = this._isActive;
@@ -586,7 +578,7 @@ var ScreenShield = new Lang.Class({
this._loginSession.SetLockedHintRemote(active); this._loginSession.SetLockedHintRemote(active);
this._syncInhibitor(); this._syncInhibitor();
}, }
_createBackground(monitorIndex) { _createBackground(monitorIndex) {
let monitor = Main.layoutManager.monitors[monitorIndex]; let monitor = Main.layoutManager.monitors[monitorIndex];
@@ -604,7 +596,7 @@ var ScreenShield = new Lang.Class({
this._bgManagers.push(bgManager); this._bgManagers.push(bgManager);
this._backgroundGroup.add_child(widget); this._backgroundGroup.add_child(widget);
}, }
_updateBackgrounds() { _updateBackgrounds() {
for (let i = 0; i < this._bgManagers.length; i++) for (let i = 0; i < this._bgManagers.length; i++)
@@ -615,7 +607,7 @@ var ScreenShield = new Lang.Class({
for (let i = 0; i < Main.layoutManager.monitors.length; i++) for (let i = 0; i < Main.layoutManager.monitors.length; i++)
this._createBackground(i); this._createBackground(i);
}, }
_liftShield(onPrimary, velocity) { _liftShield(onPrimary, velocity) {
if (this._isLocked) { if (this._isLocked) {
@@ -624,7 +616,7 @@ var ScreenShield = new Lang.Class({
} else { } else {
this.deactivate(true /* animate */); this.deactivate(true /* animate */);
} }
}, }
_maybeCancelDialog() { _maybeCancelDialog() {
if (!this._dialog) if (!this._dialog)
@@ -639,7 +631,7 @@ var ScreenShield = new Lang.Class({
} else { } else {
this._dialog = null; this._dialog = null;
} }
}, }
_becomeModal() { _becomeModal() {
if (this._isModal) if (this._isModal)
@@ -654,7 +646,7 @@ var ScreenShield = new Lang.Class({
this._isModal = Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED, this._isModal = Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED,
actionMode: Shell.ActionMode.LOCK_SCREEN }); actionMode: Shell.ActionMode.LOCK_SCREEN });
return this._isModal; return this._isModal;
}, }
_onLockScreenKeyPress(actor, event) { _onLockScreenKeyPress(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
@@ -684,7 +676,7 @@ var ScreenShield = new Lang.Class({
this._liftShield(true, 0); this._liftShield(true, 0);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onLockScreenScroll(actor, event) { _onLockScreenScroll(actor, event) {
if (this._lockScreenState != MessageTray.State.SHOWN) if (this._lockScreenState != MessageTray.State.SHOWN)
@@ -704,7 +696,7 @@ var ScreenShield = new Lang.Class({
} }
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_syncInhibitor() { _syncInhibitor() {
let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY); let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
@@ -723,7 +715,7 @@ var ScreenShield = new Lang.Class({
this._inhibitor.close(null); this._inhibitor.close(null);
this._inhibitor = null; this._inhibitor = null;
} }
}, }
_prepareForSleep(loginManager, aboutToSuspend) { _prepareForSleep(loginManager, aboutToSuspend) {
if (aboutToSuspend) { if (aboutToSuspend) {
@@ -732,7 +724,7 @@ var ScreenShield = new Lang.Class({
} else { } else {
this._wakeUpScreen(); this._wakeUpScreen();
} }
}, }
_animateArrows() { _animateArrows() {
let arrows = this._arrowContainer.get_children(); let arrows = this._arrowContainer.get_children();
@@ -754,7 +746,7 @@ var ScreenShield = new Lang.Class({
} }
return GLib.SOURCE_CONTINUE; return GLib.SOURCE_CONTINUE;
}, }
_onDragBegin() { _onDragBegin() {
Tweener.removeTweens(this._lockScreenGroup); Tweener.removeTweens(this._lockScreenGroup);
@@ -764,7 +756,7 @@ var ScreenShield = new Lang.Class({
this._ensureUnlockDialog(false, false); this._ensureUnlockDialog(false, false);
return true; return true;
}, }
_onDragMotion() { _onDragMotion() {
let [origX, origY] = this._dragAction.get_press_coords(0); let [origX, origY] = this._dragAction.get_press_coords(0);
@@ -776,7 +768,7 @@ var ScreenShield = new Lang.Class({
this._lockScreenGroup.y = newY; this._lockScreenGroup.y = newY;
return true; return true;
}, }
_onDragEnd(action, actor, eventX, eventY, modifiers) { _onDragEnd(action, actor, eventX, eventY, modifiers) {
if (this._lockScreenState != MessageTray.State.HIDING) if (this._lockScreenState != MessageTray.State.HIDING)
@@ -804,7 +796,7 @@ var ScreenShield = new Lang.Class({
this._maybeCancelDialog(); this._maybeCancelDialog();
} }
}, }
_onStatusChanged(status) { _onStatusChanged(status) {
if (status != GnomeSession.PresenceStatus.IDLE) if (status != GnomeSession.PresenceStatus.IDLE)
@@ -855,7 +847,7 @@ var ScreenShield = new Lang.Class({
} }
this._activateFade(this._longLightbox, STANDARD_FADE_TIME); this._activateFade(this._longLightbox, STANDARD_FADE_TIME);
}, }
_activateFade(lightbox, time) { _activateFade(lightbox, time) {
Main.uiGroup.set_child_above_sibling(lightbox.actor, null); Main.uiGroup.set_child_above_sibling(lightbox.actor, null);
@@ -863,7 +855,7 @@ var ScreenShield = new Lang.Class({
if (this._becameActiveId == 0) if (this._becameActiveId == 0)
this._becameActiveId = this.idleMonitor.add_user_active_watch(this._onUserBecameActive.bind(this)); this._becameActiveId = this.idleMonitor.add_user_active_watch(this._onUserBecameActive.bind(this));
}, }
_onUserBecameActive() { _onUserBecameActive() {
// This function gets called here when the user becomes active // This function gets called here when the user becomes active
@@ -893,15 +885,15 @@ var ScreenShield = new Lang.Class({
} else { } else {
this.deactivate(false); this.deactivate(false);
} }
}, }
_onLongLightboxShown() { _onLongLightboxShown() {
this.activate(false); this.activate(false);
}, }
_onShortLightboxShown() { _onShortLightboxShown() {
this._completeLockScreenShown(); this._completeLockScreenShown();
}, }
showDialog() { showDialog() {
if (!this._becomeModal()) { if (!this._becomeModal()) {
@@ -915,7 +907,7 @@ var ScreenShield = new Lang.Class({
this._isLocked = true; this._isLocked = true;
if (this._ensureUnlockDialog(true, true)) if (this._ensureUnlockDialog(true, true))
this._hideLockScreen(false, 0); this._hideLockScreen(false, 0);
}, }
_hideLockScreenComplete() { _hideLockScreenComplete() {
if (Main.sessionMode.currentMode == 'lock-screen') if (Main.sessionMode.currentMode == 'lock-screen')
@@ -928,7 +920,7 @@ var ScreenShield = new Lang.Class({
this._dialog.actor.grab_key_focus(); this._dialog.actor.grab_key_focus();
this._dialog.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); this._dialog.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
} }
}, }
_hideLockScreen(animate, velocity) { _hideLockScreen(animate, velocity) {
if (this._lockScreenState == MessageTray.State.HIDDEN) if (this._lockScreenState == MessageTray.State.HIDDEN)
@@ -961,7 +953,7 @@ var ScreenShield = new Lang.Class({
} }
this._cursorTracker.set_pointer_visible(true); this._cursorTracker.set_pointer_visible(true);
}, }
_ensureUnlockDialog(onPrimary, allowCancel) { _ensureUnlockDialog(onPrimary, allowCancel) {
if (!this._dialog) { if (!this._dialog) {
@@ -989,12 +981,12 @@ var ScreenShield = new Lang.Class({
this._dialog.allowCancel = allowCancel; this._dialog.allowCancel = allowCancel;
return true; return true;
}, }
_onUnlockFailed() { _onUnlockFailed() {
this._resetLockScreen({ animateLockScreen: true, this._resetLockScreen({ animateLockScreen: true,
fadeToBlack: false }); fadeToBlack: false });
}, }
_resetLockScreen(params) { _resetLockScreen(params) {
// Don't reset the lock screen unless it is completely hidden // Don't reset the lock screen unless it is completely hidden
@@ -1036,7 +1028,7 @@ var ScreenShield = new Lang.Class({
if (Main.sessionMode.currentMode != 'lock-screen') if (Main.sessionMode.currentMode != 'lock-screen')
Main.sessionMode.pushMode('lock-screen'); Main.sessionMode.pushMode('lock-screen');
}, }
_startArrowAnimation() { _startArrowAnimation() {
this._arrowActiveWatchId = 0; this._arrowActiveWatchId = 0;
@@ -1050,7 +1042,7 @@ var ScreenShield = new Lang.Class({
if (!this._arrowWatchId) if (!this._arrowWatchId)
this._arrowWatchId = this.idleMonitor.add_idle_watch(ARROW_IDLE_TIME, this._arrowWatchId = this.idleMonitor.add_idle_watch(ARROW_IDLE_TIME,
this._pauseArrowAnimation.bind(this)); this._pauseArrowAnimation.bind(this));
}, }
_pauseArrowAnimation() { _pauseArrowAnimation() {
if (this._arrowAnimationId) { if (this._arrowAnimationId) {
@@ -1060,7 +1052,7 @@ var ScreenShield = new Lang.Class({
if (!this._arrowActiveWatchId) if (!this._arrowActiveWatchId)
this._arrowActiveWatchId = this.idleMonitor.add_user_active_watch(this._startArrowAnimation.bind(this)); this._arrowActiveWatchId = this.idleMonitor.add_user_active_watch(this._startArrowAnimation.bind(this));
}, }
_stopArrowAnimation() { _stopArrowAnimation() {
if (this._arrowAnimationId) { if (this._arrowAnimationId) {
@@ -1075,7 +1067,7 @@ var ScreenShield = new Lang.Class({
this.idleMonitor.remove_watch(this._arrowWatchId); this.idleMonitor.remove_watch(this._arrowWatchId);
this._arrowWatchId = 0; this._arrowWatchId = 0;
} }
}, }
_checkArrowAnimation() { _checkArrowAnimation() {
let idleTime = this.idleMonitor.get_idletime(); let idleTime = this.idleMonitor.get_idletime();
@@ -1084,7 +1076,7 @@ var ScreenShield = new Lang.Class({
this._startArrowAnimation(); this._startArrowAnimation();
else else
this._pauseArrowAnimation(); this._pauseArrowAnimation();
}, }
_lockScreenShown(params) { _lockScreenShown(params) {
if (this._dialog && !this._isGreeter) { if (this._dialog && !this._isGreeter) {
@@ -1122,12 +1114,12 @@ var ScreenShield = new Lang.Class({
this._completeLockScreenShown(); this._completeLockScreenShown();
} }
}, }
_completeLockScreenShown() { _completeLockScreenShown() {
this._setActive(true); this._setActive(true);
this.emit('lock-screen-shown'); this.emit('lock-screen-shown');
}, }
// Some of the actors in the lock screen are heavy in // Some of the actors in the lock screen are heavy in
// resources, so we only create them when needed // resources, so we only create them when needed
@@ -1154,12 +1146,12 @@ var ScreenShield = new Lang.Class({
expand: true }); expand: true });
this._hasLockScreen = true; this._hasLockScreen = true;
}, }
_wakeUpScreen() { _wakeUpScreen() {
this._onUserBecameActive(); this._onUserBecameActive();
this.emit('wake-up-screen'); this.emit('wake-up-screen');
}, }
_clearLockScreen() { _clearLockScreen() {
this._clock.destroy(); this._clock.destroy();
@@ -1176,26 +1168,26 @@ var ScreenShield = new Lang.Class({
this._lockScreenContentsBox.destroy(); this._lockScreenContentsBox.destroy();
this._hasLockScreen = false; this._hasLockScreen = false;
}, }
get locked() { get locked() {
return this._isLocked; return this._isLocked;
}, }
get active() { get active() {
return this._isActive; return this._isActive;
}, }
get activationTime() { get activationTime() {
return this._activationTime; return this._activationTime;
}, }
deactivate(animate) { deactivate(animate) {
if (this._dialog) if (this._dialog)
this._dialog.finish(() => { this._continueDeactivate(animate); }); this._dialog.finish(() => { this._continueDeactivate(animate); });
else else
this._continueDeactivate(animate); this._continueDeactivate(animate);
}, }
_continueDeactivate(animate) { _continueDeactivate(animate) {
this._hideLockScreen(animate, 0); this._hideLockScreen(animate, 0);
@@ -1237,7 +1229,7 @@ var ScreenShield = new Lang.Class({
onComplete: this._completeDeactivate.bind(this), onComplete: this._completeDeactivate.bind(this),
onCompleteScope: this onCompleteScope: this
}); });
}, }
_completeDeactivate() { _completeDeactivate() {
if (this._dialog) { if (this._dialog) {
@@ -1264,7 +1256,7 @@ var ScreenShield = new Lang.Class({
this._isLocked = false; this._isLocked = false;
this.emit('locked-changed'); this.emit('locked-changed');
global.set_runtime_state(LOCKED_STATE_STR, null); global.set_runtime_state(LOCKED_STATE_STR, null);
}, }
activate(animate) { activate(animate) {
if (this._activationTime == 0) if (this._activationTime == 0)
@@ -1296,7 +1288,7 @@ var ScreenShield = new Lang.Class({
// blank during the animation. // blank during the animation.
// This is not a problem for the idle fade case, because we // This is not a problem for the idle fade case, because we
// activate without animation in that case. // activate without animation in that case.
}, }
lock(animate) { lock(animate) {
if (this._lockSettings.get_boolean(DISABLE_LOCK_KEY)) { if (this._lockSettings.get_boolean(DISABLE_LOCK_KEY)) {
@@ -1328,7 +1320,7 @@ var ScreenShield = new Lang.Class({
this.activate(animate); this.activate(animate);
this.emit('locked-changed'); this.emit('locked-changed');
}, }
// If the previous shell crashed, and gnome-session restarted us, then re-lock // If the previous shell crashed, and gnome-session restarted us, then re-lock
lockIfWasLocked() { lockIfWasLocked() {
@@ -1341,5 +1333,5 @@ var ScreenShield = new Lang.Class({
this.lock(false); this.lock(false);
}); });
} }
}); };
Signals.addSignalMethods(ScreenShield.prototype); Signals.addSignalMethods(ScreenShield.prototype);

View File

@@ -2,7 +2,6 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -12,10 +11,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast'); const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast');
var ScreencastService = new Lang.Class({ var ScreencastService = class {
Name: 'ScreencastService', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreencastIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreencastIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screencast'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screencast');
@@ -26,11 +23,11 @@ var ScreencastService = new Lang.Class({
this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' }); this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
}, }
get isRecording() { get isRecording() {
return this._recorders.size > 0; return this._recorders.size > 0;
}, }
_ensureRecorderForSender(sender) { _ensureRecorderForSender(sender) {
let recorder = this._recorders.get(sender); let recorder = this._recorders.get(sender);
@@ -44,7 +41,7 @@ var ScreencastService = new Lang.Class({
this.emit('updated'); this.emit('updated');
} }
return recorder; return recorder;
}, }
_sessionUpdated() { _sessionUpdated() {
if (Main.sessionMode.allowScreencast) if (Main.sessionMode.allowScreencast)
@@ -52,11 +49,11 @@ var ScreencastService = new Lang.Class({
for (let sender of this._recorders.keys()) for (let sender of this._recorders.keys())
this._stopRecordingForSender(sender); this._stopRecordingForSender(sender);
}, }
_onNameVanished(connection, name) { _onNameVanished(connection, name) {
this._stopRecordingForSender(name); this._stopRecordingForSender(name);
}, }
_stopRecordingForSender(sender) { _stopRecordingForSender(sender) {
let recorder = this._recorders.get(sender); let recorder = this._recorders.get(sender);
@@ -69,7 +66,7 @@ var ScreencastService = new Lang.Class({
this.emit('updated'); this.emit('updated');
return true; return true;
}, }
_applyOptionalParameters(recorder, options) { _applyOptionalParameters(recorder, options) {
for (let option in options) for (let option in options)
@@ -81,7 +78,7 @@ var ScreencastService = new Lang.Class({
recorder.set_framerate(options['framerate']); recorder.set_framerate(options['framerate']);
if ('draw-cursor' in options) if ('draw-cursor' in options)
recorder.set_draw_cursor(options['draw-cursor']); recorder.set_draw_cursor(options['draw-cursor']);
}, }
ScreencastAsync(params, invocation) { ScreencastAsync(params, invocation) {
let returnValue = [false, '']; let returnValue = [false, ''];
@@ -105,7 +102,7 @@ var ScreencastService = new Lang.Class({
} }
invocation.return_value(GLib.Variant.new('(bs)', returnValue)); invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}, }
ScreencastAreaAsync(params, invocation) { ScreencastAreaAsync(params, invocation) {
let returnValue = [false, '']; let returnValue = [false, ''];
@@ -141,11 +138,11 @@ var ScreencastService = new Lang.Class({
} }
invocation.return_value(GLib.Variant.new('(bs)', returnValue)); invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}, }
StopScreencastAsync(params, invocation) { StopScreencastAsync(params, invocation) {
let success = this._stopRecordingForSender(invocation.get_sender()); let success = this._stopRecordingForSender(invocation.get_sender());
invocation.return_value(GLib.Variant.new('(b)', [success])); invocation.return_value(GLib.Variant.new('(b)', [success]));
} }
}); };
Signals.addSignalMethods(ScreencastService.prototype); Signals.addSignalMethods(ScreencastService.prototype);

View File

@@ -5,7 +5,6 @@ const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -20,10 +19,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
const ScreenshotIface = loadInterfaceXML('org.gnome.Shell.Screenshot'); const ScreenshotIface = loadInterfaceXML('org.gnome.Shell.Screenshot');
var ScreenshotService = new Lang.Class({ var ScreenshotService = class {
Name: 'ScreenshotService', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot');
@@ -32,7 +29,7 @@ var ScreenshotService = new Lang.Class({
this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' }); this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, }
_createScreenshot(invocation, needsDisk=true) { _createScreenshot(invocation, needsDisk=true) {
let lockedDown = false; let lockedDown = false;
@@ -53,11 +50,11 @@ var ScreenshotService = new Lang.Class({
this._screenShooter.set(sender, shooter); this._screenShooter.set(sender, shooter);
return shooter; return shooter;
}, }
_onNameVanished(connection, name) { _onNameVanished(connection, name) {
this._removeShooterForSender(name); this._removeShooterForSender(name);
}, }
_removeShooterForSender(sender) { _removeShooterForSender(sender) {
let shooter = this._screenShooter.get(sender); let shooter = this._screenShooter.get(sender);
@@ -66,14 +63,14 @@ var ScreenshotService = new Lang.Class({
Gio.bus_unwatch_name(shooter._watchNameId); Gio.bus_unwatch_name(shooter._watchNameId);
this._screenShooter.delete(sender); this._screenShooter.delete(sender);
}, }
_checkArea(x, y, width, height) { _checkArea(x, y, width, height) {
return x >= 0 && y >= 0 && return x >= 0 && y >= 0 &&
width > 0 && height > 0 && width > 0 && height > 0 &&
x + width <= global.screen_width && x + width <= global.screen_width &&
y + height <= global.screen_height; y + height <= global.screen_height;
}, }
_onScreenshotComplete(result, area, filenameUsed, flash, invocation) { _onScreenshotComplete(result, area, filenameUsed, flash, invocation) {
if (result) { if (result) {
@@ -89,7 +86,7 @@ var ScreenshotService = new Lang.Class({
let retval = GLib.Variant.new('(bs)', [result, filenameUsed]); let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
invocation.return_value(retval); invocation.return_value(retval);
}, }
_scaleArea(x, y, width, height) { _scaleArea(x, y, width, height) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
@@ -98,7 +95,7 @@ var ScreenshotService = new Lang.Class({
width *= scaleFactor; width *= scaleFactor;
height *= scaleFactor; height *= scaleFactor;
return [x, y, width, height]; return [x, y, width, height];
}, }
_unscaleArea(x, y, width, height) { _unscaleArea(x, y, width, height) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
@@ -107,7 +104,7 @@ var ScreenshotService = new Lang.Class({
width /= scaleFactor; width /= scaleFactor;
height /= scaleFactor; height /= scaleFactor;
return [x, y, width, height]; return [x, y, width, height];
}, }
ScreenshotAreaAsync(params, invocation) { ScreenshotAreaAsync(params, invocation) {
let [x, y, width, height, flash, filename, callback] = params; let [x, y, width, height, flash, filename, callback] = params;
@@ -132,7 +129,7 @@ var ScreenshotService = new Lang.Class({
invocation.return_gerror (e); invocation.return_gerror (e);
} }
}); });
}, }
ScreenshotWindowAsync(params, invocation) { ScreenshotWindowAsync(params, invocation) {
let [include_frame, include_cursor, flash, filename] = params; let [include_frame, include_cursor, flash, filename] = params;
@@ -150,7 +147,7 @@ var ScreenshotService = new Lang.Class({
invocation.return_gerror (e); invocation.return_gerror (e);
} }
}); });
}, }
ScreenshotAsync(params, invocation) { ScreenshotAsync(params, invocation) {
let [include_cursor, flash, filename] = params; let [include_cursor, flash, filename] = params;
@@ -168,7 +165,7 @@ var ScreenshotService = new Lang.Class({
invocation.return_gerror (e); invocation.return_gerror (e);
} }
}); });
}, }
SelectAreaAsync(params, invocation) { SelectAreaAsync(params, invocation) {
let selectArea = new SelectArea(); let selectArea = new SelectArea();
@@ -184,7 +181,7 @@ var ScreenshotService = new Lang.Class({
"Operation was cancelled"); "Operation was cancelled");
} }
}); });
}, }
FlashAreaAsync(params, invocation) { FlashAreaAsync(params, invocation) {
let [x, y, width, height] = params; let [x, y, width, height] = params;
@@ -198,7 +195,7 @@ var ScreenshotService = new Lang.Class({
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height}); let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
flashspot.fire(); flashspot.fire();
invocation.return_value(null); invocation.return_value(null);
}, }
PickColorAsync(params, invocation) { PickColorAsync(params, invocation) {
let pickPixel = new PickPixel(); let pickPixel = new PickPixel();
@@ -227,12 +224,10 @@ var ScreenshotService = new Lang.Class({
} }
}); });
} }
}); };
var SelectArea = new Lang.Class({ var SelectArea = class {
Name: 'SelectArea', constructor() {
_init() {
this._startX = -1; this._startX = -1;
this._startY = -1; this._startY = -1;
this._lastX = 0; this._lastX = 0;
@@ -265,7 +260,7 @@ var SelectArea = new Lang.Class({
border_width: 1, border_width: 1,
border_color: this._border }); border_color: this._border });
this._group.add_actor(this._rubberband); this._group.add_actor(this._rubberband);
}, }
show() { show() {
if (!this._grabHelper.grab({ actor: this._group, if (!this._grabHelper.grab({ actor: this._group,
@@ -275,7 +270,7 @@ var SelectArea = new Lang.Class({
global.display.set_cursor(Meta.Cursor.CROSSHAIR); global.display.set_cursor(Meta.Cursor.CROSSHAIR);
Main.uiGroup.set_child_above_sibling(this._group, null); Main.uiGroup.set_child_above_sibling(this._group, null);
this._group.visible = true; this._group.visible = true;
}, }
_initRubberbandColors() { _initRubberbandColors() {
function colorFromRGBA(rgba) { function colorFromRGBA(rgba) {
@@ -294,14 +289,14 @@ var SelectArea = new Lang.Class({
this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL)); this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL)); this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
}, }
_getGeometry() { _getGeometry() {
return { x: Math.min(this._startX, this._lastX), return { x: Math.min(this._startX, this._lastX),
y: Math.min(this._startY, this._lastY), y: Math.min(this._startY, this._lastY),
width: Math.abs(this._startX - this._lastX) + 1, width: Math.abs(this._startX - this._lastX) + 1,
height: Math.abs(this._startY - this._lastY) + 1 }; height: Math.abs(this._startY - this._lastY) + 1 };
}, }
_onMotionEvent(actor, event) { _onMotionEvent(actor, event) {
if (this._startX == -1 || this._startY == -1) if (this._startX == -1 || this._startY == -1)
@@ -316,7 +311,7 @@ var SelectArea = new Lang.Class({
this._rubberband.set_size(geometry.width, geometry.height); this._rubberband.set_size(geometry.width, geometry.height);
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onButtonPress(actor, event) { _onButtonPress(actor, event) {
[this._startX, this._startY] = event.get_coords(); [this._startX, this._startY] = event.get_coords();
@@ -325,7 +320,7 @@ var SelectArea = new Lang.Class({
this._rubberband.set_position(this._startX, this._startY); this._rubberband.set_position(this._startX, this._startY);
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onButtonRelease(actor, event) { _onButtonRelease(actor, event) {
this._result = this._getGeometry(); this._result = this._getGeometry();
@@ -338,7 +333,7 @@ var SelectArea = new Lang.Class({
} }
}); });
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onUngrab() { _onUngrab() {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.display.set_cursor(Meta.Cursor.DEFAULT);
@@ -349,13 +344,11 @@ var SelectArea = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
} }
}); };
Signals.addSignalMethods(SelectArea.prototype); Signals.addSignalMethods(SelectArea.prototype);
var PickPixel = new Lang.Class({ var PickPixel = class {
Name: 'PickPixel', constructor() {
_init() {
this._result = null; this._result = null;
this._group = new St.Widget({ visible: false, this._group = new St.Widget({ visible: false,
@@ -370,7 +363,7 @@ var PickPixel = new Lang.Class({
let constraint = new Clutter.BindConstraint({ source: global.stage, let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL }); coordinate: Clutter.BindCoordinate.ALL });
this._group.add_constraint(constraint); this._group.add_constraint(constraint);
}, }
show() { show() {
if (!this._grabHelper.grab({ actor: this._group, if (!this._grabHelper.grab({ actor: this._group,
@@ -380,13 +373,13 @@ var PickPixel = new Lang.Class({
global.display.set_cursor(Meta.Cursor.CROSSHAIR); global.display.set_cursor(Meta.Cursor.CROSSHAIR);
Main.uiGroup.set_child_above_sibling(this._group, null); Main.uiGroup.set_child_above_sibling(this._group, null);
this._group.visible = true; this._group.visible = true;
}, }
_onButtonRelease(actor, event) { _onButtonRelease(actor, event) {
this._result = event.get_coords(); this._result = event.get_coords();
this._grabHelper.ungrab(); this._grabHelper.ungrab();
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_onUngrab() { _onUngrab() {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.display.set_cursor(Meta.Cursor.DEFAULT);
@@ -397,23 +390,20 @@ var PickPixel = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
} }
}); };
Signals.addSignalMethods(PickPixel.prototype); Signals.addSignalMethods(PickPixel.prototype);
var FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds var FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds
var Flashspot = new Lang.Class({ var Flashspot = class extends Lightbox.Lightbox {
Name: 'Flashspot', constructor(area) {
Extends: Lightbox.Lightbox, super(Main.uiGroup, { inhibitEvents: true,
width: area.width,
_init(area) { height: area.height });
this.parent(Main.uiGroup, { inhibitEvents: true,
width: area.width,
height: area.height });
this.actor.style_class = 'flashspot'; this.actor.style_class = 'flashspot';
this.actor.set_position(area.x, area.y); this.actor.set_position(area.x, area.y);
}, }
fire(doneCallback) { fire(doneCallback) {
this.actor.show(); this.actor.show();
@@ -429,4 +419,4 @@ var Flashspot = new Lang.Class({
} }
}); });
} }
}); };

View File

@@ -1,9 +1,9 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Signals = imports.signals; const Signals = imports.signals;
@@ -24,10 +24,8 @@ const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
var MAX_LIST_SEARCH_RESULTS_ROWS = 5; var MAX_LIST_SEARCH_RESULTS_ROWS = 5;
var MAX_GRID_SEARCH_RESULTS_ROWS = 1; var MAX_GRID_SEARCH_RESULTS_ROWS = 1;
var MaxWidthBin = new Lang.Class({ var MaxWidthBin = GObject.registerClass(
Name: 'MaxWidthBin', class MaxWidthBin extends St.Bin {
Extends: St.Bin,
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let maxWidth = themeNode.get_max_width(); let maxWidth = themeNode.get_max_width();
@@ -40,14 +38,12 @@ var MaxWidthBin = new Lang.Class({
adjustedBox.x2 -= Math.floor(excessWidth / 2); adjustedBox.x2 -= Math.floor(excessWidth / 2);
} }
this.parent(adjustedBox, flags); super.vfunc_allocate(adjustedBox, flags);
} }
}); });
var SearchResult = new Lang.Class({ var SearchResult = class {
Name: 'SearchResult', constructor(provider, metaInfo, resultsView) {
_init(provider, metaInfo, resultsView) {
this.provider = provider; this.provider = provider;
this.metaInfo = metaInfo; this.metaInfo = metaInfo;
this._resultsView = resultsView; this._resultsView = resultsView;
@@ -60,22 +56,18 @@ var SearchResult = new Lang.Class({
this.actor._delegate = this; this.actor._delegate = this;
this.actor.connect('clicked', this.activate.bind(this)); this.actor.connect('clicked', this.activate.bind(this));
}, }
activate() { activate() {
this.emit('activate', this.metaInfo.id); this.emit('activate', this.metaInfo.id);
} }
}); };
Signals.addSignalMethods(SearchResult.prototype); Signals.addSignalMethods(SearchResult.prototype);
var ListSearchResult = new Lang.Class({ var ListSearchResult = class extends SearchResult {
Name: 'ListSearchResult',
Extends: SearchResult,
ICON_SIZE: 24, constructor(provider, metaInfo, resultsView) {
super(provider, metaInfo, resultsView);
_init(provider, metaInfo, resultsView) {
this.parent(provider, metaInfo, resultsView);
this.actor.style_class = 'list-search-result'; this.actor.style_class = 'list-search-result';
this.actor.x_fill = true; this.actor.x_fill = true;
@@ -122,26 +114,27 @@ var ListSearchResult = new Lang.Class({
} }
this.actor.connect('destroy', this._onDestroy.bind(this)); this.actor.connect('destroy', this._onDestroy.bind(this));
}, }
get ICON_SIZE() {
return 24;
}
_highlightTerms() { _highlightTerms() {
let markup = this._resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]); let markup = this._resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]);
this._descriptionLabel.clutter_text.set_markup(markup); this._descriptionLabel.clutter_text.set_markup(markup);
}, }
_onDestroy() { _onDestroy() {
if (this._termsChangedId) if (this._termsChangedId)
this._resultsView.disconnect(this._termsChangedId); this._resultsView.disconnect(this._termsChangedId);
this._termsChangedId = 0; this._termsChangedId = 0;
} }
}); };
var GridSearchResult = new Lang.Class({ var GridSearchResult = class extends SearchResult {
Name: 'GridSearchResult', constructor(provider, metaInfo, resultsView) {
Extends: SearchResult, super(provider, metaInfo, resultsView);
_init(provider, metaInfo, resultsView) {
this.parent(provider, metaInfo, resultsView);
this.actor.style_class = 'grid-search-result'; this.actor.style_class = 'grid-search-result';
@@ -151,12 +144,10 @@ var GridSearchResult = new Lang.Class({
this.actor.set_child(content); this.actor.set_child(content);
this.actor.label_actor = this.icon.label; this.actor.label_actor = this.icon.label;
} }
}); };
var SearchResultsBase = new Lang.Class({ var SearchResultsBase = class {
Name: 'SearchResultsBase', constructor(provider, resultsView) {
_init(provider, resultsView) {
this.provider = provider; this.provider = provider;
this._resultsView = resultsView; this._resultsView = resultsView;
@@ -177,19 +168,19 @@ var SearchResultsBase = new Lang.Class({
this._clipboard = St.Clipboard.get_default(); this._clipboard = St.Clipboard.get_default();
this._cancellable = new Gio.Cancellable(); this._cancellable = new Gio.Cancellable();
}, }
destroy() { destroy() {
this.actor.destroy(); this.actor.destroy();
this._terms = []; this._terms = [];
}, }
_createResultDisplay(meta) { _createResultDisplay(meta) {
if (this.provider.createResultObject) if (this.provider.createResultObject)
return this.provider.createResultObject(meta, this._resultsView); return this.provider.createResultObject(meta, this._resultsView);
return null; return null;
}, }
clear() { clear() {
this._cancellable.cancel(); this._cancellable.cancel();
@@ -198,21 +189,21 @@ var SearchResultsBase = new Lang.Class({
this._resultDisplays = {}; this._resultDisplays = {};
this._clearResultDisplay(); this._clearResultDisplay();
this.actor.hide(); this.actor.hide();
}, }
_keyFocusIn(actor) { _keyFocusIn(actor) {
this.emit('key-focus-in', actor); this.emit('key-focus-in', actor);
}, }
_activateResult(result, id) { _activateResult(result, id) {
this.provider.activateResult(id, this._terms); this.provider.activateResult(id, this._terms);
if (result.metaInfo.clipboardText) if (result.metaInfo.clipboardText)
this._clipboard.set_text(St.ClipboardType.CLIPBOARD, result.metaInfo.clipboardText); this._clipboard.set_text(St.ClipboardType.CLIPBOARD, result.metaInfo.clipboardText);
Main.overview.toggle(); Main.overview.toggle();
}, }
_setMoreCount(count) { _setMoreCount(count) {
}, }
_ensureResultActors(results, callback) { _ensureResultActors(results, callback) {
let metasNeeded = results.filter( let metasNeeded = results.filter(
@@ -254,7 +245,7 @@ var SearchResultsBase = new Lang.Class({
callback(true); callback(true);
}, this._cancellable); }, this._cancellable);
} }
}, }
updateSearch(providerResults, terms, callback) { updateSearch(providerResults, terms, callback) {
this._terms = terms; this._terms = terms;
@@ -288,14 +279,11 @@ var SearchResultsBase = new Lang.Class({
}); });
} }
} }
}); };
var ListSearchResults = new Lang.Class({ var ListSearchResults = class extends SearchResultsBase {
Name: 'ListSearchResults', constructor(provider, resultsView) {
Extends: SearchResultsBase, super(provider, resultsView);
_init(provider, resultsView) {
this.parent(provider, resultsView);
this._container = new St.BoxLayout({ style_class: 'search-section-content' }); this._container = new St.BoxLayout({ style_class: 'search-section-content' });
this.providerInfo = new ProviderInfo(provider); this.providerInfo = new ProviderInfo(provider);
@@ -316,28 +304,28 @@ var ListSearchResults = new Lang.Class({
this._container.add(this._content, { expand: true }); this._container.add(this._content, { expand: true });
this._resultDisplayBin.set_child(this._container); this._resultDisplayBin.set_child(this._container);
}, }
_setMoreCount(count) { _setMoreCount(count) {
this.providerInfo.setMoreCount(count); this.providerInfo.setMoreCount(count);
}, }
_getMaxDisplayedResults() { _getMaxDisplayedResults() {
return MAX_LIST_SEARCH_RESULTS_ROWS; return MAX_LIST_SEARCH_RESULTS_ROWS;
}, }
_clearResultDisplay() { _clearResultDisplay() {
this._content.remove_all_children(); this._content.remove_all_children();
}, }
_createResultDisplay(meta) { _createResultDisplay(meta) {
return this.parent(meta, this._resultsView) || return super._createResultDisplay(meta, this._resultsView) ||
new ListSearchResult(this.provider, meta, this._resultsView); new ListSearchResult(this.provider, meta, this._resultsView);
}, }
_addItem(display) { _addItem(display) {
this._content.add_actor(display.actor); this._content.add_actor(display.actor);
}, }
getFirstResult() { getFirstResult() {
if (this._content.get_n_children() > 0) if (this._content.get_n_children() > 0)
@@ -345,15 +333,12 @@ var ListSearchResults = new Lang.Class({
else else
return null; return null;
} }
}); };
Signals.addSignalMethods(ListSearchResults.prototype); Signals.addSignalMethods(ListSearchResults.prototype);
var GridSearchResults = new Lang.Class({ var GridSearchResults = class extends SearchResultsBase {
Name: 'GridSearchResults', constructor(provider, resultsView) {
Extends: SearchResultsBase, super(provider, resultsView);
_init(provider, resultsView) {
this.parent(provider, resultsView);
// We need to use the parent container to know how much results we can show. // We need to use the parent container to know how much results we can show.
// None of the actors in this class can be used for that, since the main actor // None of the actors in this class can be used for that, since the main actor
// goes hidden when no results are displayed, and then it lost its allocation. // goes hidden when no results are displayed, and then it lost its allocation.
@@ -368,26 +353,26 @@ var GridSearchResults = new Lang.Class({
this._bin.set_child(this._grid); this._bin.set_child(this._grid);
this._resultDisplayBin.set_child(this._bin); this._resultDisplayBin.set_child(this._bin);
}, }
_getMaxDisplayedResults() { _getMaxDisplayedResults() {
let parentThemeNode = this._parentContainer.get_theme_node(); let parentThemeNode = this._parentContainer.get_theme_node();
let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width); let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width);
return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit(); return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit();
}, }
_clearResultDisplay() { _clearResultDisplay() {
this._grid.removeAll(); this._grid.removeAll();
}, }
_createResultDisplay(meta) { _createResultDisplay(meta) {
return this.parent(meta, this._resultsView) || return super._createResultDisplay(meta, this._resultsView) ||
new GridSearchResult(this.provider, meta, this._resultsView); new GridSearchResult(this.provider, meta, this._resultsView);
}, }
_addItem(display) { _addItem(display) {
this._grid.addItem(display); this._grid.addItem(display);
}, }
getFirstResult() { getFirstResult() {
if (this._grid.visibleItemsCount() > 0) if (this._grid.visibleItemsCount() > 0)
@@ -395,13 +380,11 @@ var GridSearchResults = new Lang.Class({
else else
return null; return null;
} }
}); };
Signals.addSignalMethods(GridSearchResults.prototype); Signals.addSignalMethods(GridSearchResults.prototype);
var SearchResults = new Lang.Class({ var SearchResults = class {
Name: 'SearchResults', constructor() {
_init() {
this.actor = new St.BoxLayout({ name: 'searchResults', this.actor = new St.BoxLayout({ name: 'searchResults',
vertical: true }); vertical: true });
@@ -459,7 +442,7 @@ var SearchResults = new Lang.Class({
this._registerProvider(new AppDisplay.AppSearchProvider()); this._registerProvider(new AppDisplay.AppSearchProvider());
this._reloadRemoteProviders(); this._reloadRemoteProviders();
}, }
_reloadRemoteProviders() { _reloadRemoteProviders() {
let remoteProviders = this._providers.filter(p => p.isRemoteProvider); let remoteProviders = this._providers.filter(p => p.isRemoteProvider);
@@ -470,12 +453,13 @@ var SearchResults = new Lang.Class({
RemoteSearch.loadRemoteSearchProviders(this._searchSettings, providers => { RemoteSearch.loadRemoteSearchProviders(this._searchSettings, providers => {
providers.forEach(this._registerProvider.bind(this)); providers.forEach(this._registerProvider.bind(this));
}); });
}, }
_registerProvider(provider) { _registerProvider(provider) {
provider.searchInProgress = false;
this._providers.push(provider); this._providers.push(provider);
this._ensureProviderDisplay(provider); this._ensureProviderDisplay(provider);
}, }
_unregisterProvider(provider) { _unregisterProvider(provider) {
let index = this._providers.indexOf(provider); let index = this._providers.indexOf(provider);
@@ -483,19 +467,19 @@ var SearchResults = new Lang.Class({
if (provider.display) if (provider.display)
provider.display.destroy(); provider.display.destroy();
}, }
_gotResults(results, provider) { _gotResults(results, provider) {
this._results[provider.id] = results; this._results[provider.id] = results;
this._updateResults(provider, results); this._updateResults(provider, results);
}, }
_clearSearchTimeout() { _clearSearchTimeout() {
if (this._searchTimeoutId > 0) { if (this._searchTimeoutId > 0) {
GLib.source_remove(this._searchTimeoutId); GLib.source_remove(this._searchTimeoutId);
this._searchTimeoutId = 0; this._searchTimeoutId = 0;
} }
}, }
_reset() { _reset() {
this._terms = []; this._terms = [];
@@ -506,7 +490,7 @@ var SearchResults = new Lang.Class({
this._startingSearch = false; this._startingSearch = false;
this._updateSearchProgress(); this._updateSearchProgress();
}, }
_doSearch() { _doSearch() {
this._startingSearch = false; this._startingSearch = false;
@@ -536,13 +520,13 @@ var SearchResults = new Lang.Class({
this._updateSearchProgress(); this._updateSearchProgress();
this._clearSearchTimeout(); this._clearSearchTimeout();
}, }
_onSearchTimeout() { _onSearchTimeout() {
this._searchTimeoutId = 0; this._searchTimeoutId = 0;
this._doSearch(); this._doSearch();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
setTerms(terms) { setTerms(terms) {
// Check for the case of making a duplicate previous search before // Check for the case of making a duplicate previous search before
@@ -579,18 +563,18 @@ var SearchResults = new Lang.Class({
this._highlightRegex = new RegExp(`(${escapedTerms.join('|')})`, 'gi'); this._highlightRegex = new RegExp(`(${escapedTerms.join('|')})`, 'gi');
this.emit('terms-changed'); this.emit('terms-changed');
}, }
_onPan(action) { _onPan(action) {
let [dist, dx, dy] = action.get_motion_delta(0); let [dist, dx, dy] = action.get_motion_delta(0);
let adjustment = this._scrollView.vscroll.adjustment; let adjustment = this._scrollView.vscroll.adjustment;
adjustment.value -= (dy / this.actor.height) * adjustment.page_size; adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
return false; return false;
}, }
_keyFocusIn(provider, actor) { _keyFocusIn(provider, actor) {
Util.ensureActorVisibleInScrollView(this._scrollView, actor); Util.ensureActorVisibleInScrollView(this._scrollView, actor);
}, }
_ensureProviderDisplay(provider) { _ensureProviderDisplay(provider) {
if (provider.display) if (provider.display)
@@ -606,13 +590,13 @@ var SearchResults = new Lang.Class({
providerDisplay.actor.hide(); providerDisplay.actor.hide();
this._content.add(providerDisplay.actor); this._content.add(providerDisplay.actor);
provider.display = providerDisplay; provider.display = providerDisplay;
}, }
_clearDisplay() { _clearDisplay() {
this._providers.forEach(provider => { this._providers.forEach(provider => {
provider.display.clear(); provider.display.clear();
}); });
}, }
_maybeSetInitialSelection() { _maybeSetInitialSelection() {
let newDefaultResult = null; let newDefaultResult = null;
@@ -638,14 +622,14 @@ var SearchResults = new Lang.Class({
this._defaultResult = newDefaultResult; this._defaultResult = newDefaultResult;
} }
}, }
get searchInProgress() { get searchInProgress() {
if (this._startingSearch) if (this._startingSearch)
return true; return true;
return this._providers.some(p => p.searchInProgress); return this._providers.some(p => p.searchInProgress);
}, }
_updateSearchProgress() { _updateSearchProgress() {
let haveResults = this._providers.some(provider => { let haveResults = this._providers.some(provider => {
@@ -663,7 +647,7 @@ var SearchResults = new Lang.Class({
this._statusText.set_text(_("No results.")); this._statusText.set_text(_("No results."));
} }
} }
}, }
_updateResults(provider, results) { _updateResults(provider, results) {
let terms = this._terms; let terms = this._terms;
@@ -675,7 +659,7 @@ var SearchResults = new Lang.Class({
this._maybeSetInitialSelection(); this._maybeSetInitialSelection();
this._updateSearchProgress(); this._updateSearchProgress();
}); });
}, }
activateDefault() { activateDefault() {
// If we have a search queued up, force the search now. // If we have a search queued up, force the search now.
@@ -684,12 +668,12 @@ var SearchResults = new Lang.Class({
if (this._defaultResult) if (this._defaultResult)
this._defaultResult.activate(); this._defaultResult.activate();
}, }
highlightDefault(highlight) { highlightDefault(highlight) {
this._highlightDefault = highlight; this._highlightDefault = highlight;
this._setSelected(this._defaultResult, highlight); this._setSelected(this._defaultResult, highlight);
}, }
popupMenuDefault() { popupMenuDefault() {
// If we have a search queued up, force the search now. // If we have a search queued up, force the search now.
@@ -698,7 +682,7 @@ var SearchResults = new Lang.Class({
if (this._defaultResult) if (this._defaultResult)
this._defaultResult.actor.popup_menu(); this._defaultResult.actor.popup_menu();
}, }
navigateFocus(direction) { navigateFocus(direction) {
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL; let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
@@ -712,7 +696,7 @@ var SearchResults = new Lang.Class({
let from = this._defaultResult ? this._defaultResult.actor : null; let from = this._defaultResult ? this._defaultResult.actor : null;
this.actor.navigate_focus(from, direction, false); this.actor.navigate_focus(from, direction, false);
}, }
_setSelected(result, selected) { _setSelected(result, selected) {
if (!result) if (!result)
@@ -724,7 +708,7 @@ var SearchResults = new Lang.Class({
} else { } else {
result.actor.remove_style_pseudo_class('selected'); result.actor.remove_style_pseudo_class('selected');
} }
}, }
highlightTerms(description) { highlightTerms(description) {
if (!description) if (!description)
@@ -735,18 +719,14 @@ var SearchResults = new Lang.Class({
return description.replace(this._highlightRegex, '<b>$1</b>'); return description.replace(this._highlightRegex, '<b>$1</b>');
} }
}); };
Signals.addSignalMethods(SearchResults.prototype); Signals.addSignalMethods(SearchResults.prototype);
var ProviderInfo = new Lang.Class({ var ProviderInfo = GObject.registerClass(
Name: 'ProviderInfo', class ProviderInfo extends St.Button {
Extends: St.Button,
PROVIDER_ICON_SIZE: 32,
_init(provider) { _init(provider) {
this.provider = provider; this.provider = provider;
this.parent({ style_class: 'search-provider-icon', super._init({ style_class: 'search-provider-icon',
reactive: true, reactive: true,
can_focus: true, can_focus: true,
accessible_name: provider.appInfo.get_name(), accessible_name: provider.appInfo.get_name(),
@@ -774,14 +754,18 @@ var ProviderInfo = new Lang.Class({
this._content.add_actor(icon); this._content.add_actor(icon);
this._content.add_actor(detailsBox); this._content.add_actor(detailsBox);
}, }
get PROVIDER_ICON_SIZE() {
return 32;
}
animateLaunch() { animateLaunch() {
let appSys = Shell.AppSystem.get_default(); let appSys = Shell.AppSystem.get_default();
let app = appSys.lookup_app(this.provider.appInfo.get_id()); let app = appSys.lookup_app(this.provider.appInfo.get_id());
if (app.state == Shell.AppState.STOPPED) if (app.state == Shell.AppState.STOPPED)
IconGrid.zoomOutActor(this._content); IconGrid.zoomOutActor(this._content);
}, }
setMoreCount(count) { setMoreCount(count) {
this._moreLabel.text = ngettext("%d more", "%d more", count).format(count); this._moreLabel.text = ngettext("%d more", "%d more", count).format(count);

View File

@@ -2,7 +2,6 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
@@ -99,7 +98,7 @@ const _modes = {
'keyring', 'autorunManager', 'automountManager'], 'keyring', 'autorunManager', 'automountManager'],
panel: { panel: {
left: ['activities', 'appMenu'], left: ['activities'],
center: ['dateMenu'], center: ['dateMenu'],
right: ['a11y', 'keyboard', 'aggregateMenu'] right: ['a11y', 'keyboard', 'aggregateMenu']
} }
@@ -151,40 +150,38 @@ function listModes() {
Mainloop.run('listModes'); Mainloop.run('listModes');
} }
var SessionMode = new Lang.Class({ var SessionMode = class {
Name: 'SessionMode', constructor() {
_init() {
_loadModes(); _loadModes();
let isPrimary = (_modes[global.session_mode] && let isPrimary = (_modes[global.session_mode] &&
_modes[global.session_mode].isPrimary); _modes[global.session_mode].isPrimary);
let mode = isPrimary ? global.session_mode : 'user'; let mode = isPrimary ? global.session_mode : 'user';
this._modeStack = [mode]; this._modeStack = [mode];
this._sync(); this._sync();
}, }
pushMode(mode) { pushMode(mode) {
this._modeStack.push(mode); this._modeStack.push(mode);
this._sync(); this._sync();
}, }
popMode(mode) { popMode(mode) {
if (this.currentMode != mode || this._modeStack.length === 1) if (this.currentMode != mode || this._modeStack.length === 1)
throw new Error("Invalid SessionMode.popMode"); throw new Error("Invalid SessionMode.popMode");
this._modeStack.pop(); this._modeStack.pop();
this._sync(); this._sync();
}, }
switchMode(to) { switchMode(to) {
if (this.currentMode == to) if (this.currentMode == to)
return; return;
this._modeStack[this._modeStack.length - 1] = to; this._modeStack[this._modeStack.length - 1] = to;
this._sync(); this._sync();
}, }
get currentMode() { get currentMode() {
return this._modeStack[this._modeStack.length - 1]; return this._modeStack[this._modeStack.length - 1];
}, }
_sync() { _sync() {
let params = _modes[this.currentMode]; let params = _modes[this.currentMode];
@@ -205,5 +202,5 @@ var SessionMode = new Lang.Class({
this.emit('updated'); this.emit('updated');
} }
}); };
Signals.addSignalMethods(SessionMode.prototype); Signals.addSignalMethods(SessionMode.prototype);

View File

@@ -19,10 +19,8 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
const GnomeShellIface = loadInterfaceXML('org.gnome.Shell'); const GnomeShellIface = loadInterfaceXML('org.gnome.Shell');
const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver'); const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver');
var GnomeShell = new Lang.Class({ var GnomeShell = class {
Name: 'GnomeShellDBus', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
@@ -42,7 +40,7 @@ var GnomeShell = new Lang.Class({
this._checkOverviewVisibleChanged.bind(this)); this._checkOverviewVisibleChanged.bind(this));
Main.overview.connect('hidden', Main.overview.connect('hidden',
this._checkOverviewVisibleChanged.bind(this)); this._checkOverviewVisibleChanged.bind(this));
}, }
/** /**
* Eval: * Eval:
@@ -75,11 +73,11 @@ var GnomeShell = new Lang.Class({
success = false; success = false;
} }
return [success, returnValue]; return [success, returnValue];
}, }
FocusSearch() { FocusSearch() {
Main.overview.focusSearch(); Main.overview.focusSearch();
}, }
ShowOSD(params) { ShowOSD(params) {
for (let param in params) for (let param in params)
@@ -99,23 +97,23 @@ var GnomeShell = new Lang.Class({
icon = Gio.Icon.new_for_string(serializedIcon); icon = Gio.Icon.new_for_string(serializedIcon);
Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel); Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel);
}, }
FocusApp(id) { FocusApp(id) {
this.ShowApplications(); this.ShowApplications();
Main.overview.viewSelector.appDisplay.selectApp(id); Main.overview.viewSelector.appDisplay.selectApp(id);
}, }
ShowApplications() { ShowApplications() {
Main.overview.viewSelector.showApps(); Main.overview.viewSelector.showApps();
}, }
GrabAcceleratorAsync(params, invocation) { GrabAcceleratorAsync(params, invocation) {
let [accel, flags] = params; let [accel, flags] = params;
let sender = invocation.get_sender(); let sender = invocation.get_sender();
let bindingAction = this._grabAcceleratorForSender(accel, flags, sender); let bindingAction = this._grabAcceleratorForSender(accel, flags, sender);
return invocation.return_value(GLib.Variant.new('(u)', [bindingAction])); return invocation.return_value(GLib.Variant.new('(u)', [bindingAction]));
}, }
GrabAcceleratorsAsync(params, invocation) { GrabAcceleratorsAsync(params, invocation) {
let [accels] = params; let [accels] = params;
@@ -126,7 +124,7 @@ var GnomeShell = new Lang.Class({
bindingActions.push(this._grabAcceleratorForSender(accel, flags, sender)); bindingActions.push(this._grabAcceleratorForSender(accel, flags, sender));
} }
return invocation.return_value(GLib.Variant.new('(au)', [bindingActions])); return invocation.return_value(GLib.Variant.new('(au)', [bindingActions]));
}, }
UngrabAcceleratorAsync(params, invocation) { UngrabAcceleratorAsync(params, invocation) {
let [action] = params; let [action] = params;
@@ -138,7 +136,7 @@ var GnomeShell = new Lang.Class({
if (ungrabSucceeded) if (ungrabSucceeded)
this._grabbedAccelerators.delete(action); this._grabbedAccelerators.delete(action);
return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded])); return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
}, }
_emitAcceleratorActivated(action, deviceid, timestamp) { _emitAcceleratorActivated(action, deviceid, timestamp) {
let destination = this._grabbedAccelerators.get(action); let destination = this._grabbedAccelerators.get(action);
@@ -155,7 +153,7 @@ var GnomeShell = new Lang.Class({
info ? info.name : null, info ? info.name : null,
'AcceleratorActivated', 'AcceleratorActivated',
GLib.Variant.new('(ua{sv})', [action, params])); GLib.Variant.new('(ua{sv})', [action, params]));
}, }
_grabAcceleratorForSender(accelerator, flags, sender) { _grabAcceleratorForSender(accelerator, flags, sender) {
let bindingAction = global.display.grab_accelerator(accelerator); let bindingAction = global.display.grab_accelerator(accelerator);
@@ -174,13 +172,13 @@ var GnomeShell = new Lang.Class({
} }
return bindingAction; return bindingAction;
}, }
_ungrabAccelerator(action) { _ungrabAccelerator(action) {
let ungrabSucceeded = global.display.ungrab_accelerator(action); let ungrabSucceeded = global.display.ungrab_accelerator(action);
if (ungrabSucceeded) if (ungrabSucceeded)
this._grabbedAccelerators.delete(action); this._grabbedAccelerators.delete(action);
}, }
_onGrabberBusNameVanished(connection, name) { _onGrabberBusNameVanished(connection, name) {
let grabs = this._grabbedAccelerators.entries(); let grabs = this._grabbedAccelerators.entries();
@@ -190,61 +188,61 @@ var GnomeShell = new Lang.Class({
} }
Gio.bus_unwatch_name(this._grabbers.get(name)); Gio.bus_unwatch_name(this._grabbers.get(name));
this._grabbers.delete(name); this._grabbers.delete(name);
}, }
ShowMonitorLabelsAsync(params, invocation) { ShowMonitorLabelsAsync(params, invocation) {
let sender = invocation.get_sender(); let sender = invocation.get_sender();
let [dict] = params; let [dict] = params;
Main.osdMonitorLabeler.show(sender, dict); Main.osdMonitorLabeler.show(sender, dict);
}, }
ShowMonitorLabels2Async(params, invocation) { ShowMonitorLabels2Async(params, invocation) {
let sender = invocation.get_sender(); let sender = invocation.get_sender();
let [dict] = params; let [dict] = params;
Main.osdMonitorLabeler.show2(sender, dict); Main.osdMonitorLabeler.show2(sender, dict);
}, }
HideMonitorLabelsAsync(params, invocation) { HideMonitorLabelsAsync(params, invocation) {
let sender = invocation.get_sender(); let sender = invocation.get_sender();
Main.osdMonitorLabeler.hide(sender); Main.osdMonitorLabeler.hide(sender);
}, }
Mode: global.session_mode,
_checkOverviewVisibleChanged() { _checkOverviewVisibleChanged() {
if (Main.overview.visible !== this._cachedOverviewVisible) { if (Main.overview.visible !== this._cachedOverviewVisible) {
this._cachedOverviewVisible = Main.overview.visible; this._cachedOverviewVisible = Main.overview.visible;
this._dbusImpl.emit_property_changed('OverviewActive', new GLib.Variant('b', this._cachedOverviewVisible)); this._dbusImpl.emit_property_changed('OverviewActive', new GLib.Variant('b', this._cachedOverviewVisible));
} }
}, }
get Mode() {
return global.session_mode;
}
get OverviewActive() { get OverviewActive() {
return this._cachedOverviewVisible; return this._cachedOverviewVisible;
}, }
set OverviewActive(visible) { set OverviewActive(visible) {
if (visible) if (visible)
Main.overview.show(); Main.overview.show();
else else
Main.overview.hide(); Main.overview.hide();
}, }
ShellVersion: Config.PACKAGE_VERSION get ShellVersion() {
}); return Config.PACKAGE_VERSION;
}
};
const GnomeShellExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions'); const GnomeShellExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions');
var GnomeShellExtensions = new Lang.Class({ var GnomeShellExtensions = class {
Name: 'GnomeShellExtensionsDBus', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
ExtensionSystem.connect('extension-state-changed', ExtensionSystem.connect('extension-state-changed',
this._extensionStateChanged.bind(this)); this._extensionStateChanged.bind(this));
}, }
ListExtensions() { ListExtensions() {
let out = {}; let out = {};
@@ -253,7 +251,7 @@ var GnomeShellExtensions = new Lang.Class({
out[uuid] = dbusObj; out[uuid] = dbusObj;
} }
return out; return out;
}, }
GetExtensionInfo(uuid) { GetExtensionInfo(uuid) {
let extension = ExtensionUtils.extensions[uuid]; let extension = ExtensionUtils.extensions[uuid];
@@ -291,7 +289,7 @@ var GnomeShellExtensions = new Lang.Class({
} }
return out; return out;
}, }
GetExtensionErrors(uuid) { GetExtensionErrors(uuid) {
let extension = ExtensionUtils.extensions[uuid]; let extension = ExtensionUtils.extensions[uuid];
@@ -302,15 +300,15 @@ var GnomeShellExtensions = new Lang.Class({
return []; return [];
return extension.errors; return extension.errors;
}, }
InstallRemoteExtensionAsync([uuid], invocation) { InstallRemoteExtensionAsync([uuid], invocation) {
return ExtensionDownloader.installExtension(uuid, invocation); return ExtensionDownloader.installExtension(uuid, invocation);
}, }
UninstallExtension(uuid) { UninstallExtension(uuid) {
return ExtensionDownloader.uninstallExtension(uuid); return ExtensionDownloader.uninstallExtension(uuid);
}, }
LaunchExtensionPrefs(uuid) { LaunchExtensionPrefs(uuid) {
let appSys = Shell.AppSystem.get_default(); let appSys = Shell.AppSystem.get_default();
@@ -319,7 +317,7 @@ var GnomeShellExtensions = new Lang.Class({
let timestamp = global.display.get_current_time_roundtrip(); let timestamp = global.display.get_current_time_roundtrip();
info.launch_uris(['extension:///' + uuid], info.launch_uris(['extension:///' + uuid],
global.create_app_launch_context(timestamp, -1)); global.create_app_launch_context(timestamp, -1));
}, }
ReloadExtension(uuid) { ReloadExtension(uuid) {
let extension = ExtensionUtils.extensions[uuid]; let extension = ExtensionUtils.extensions[uuid];
@@ -327,26 +325,24 @@ var GnomeShellExtensions = new Lang.Class({
return; return;
ExtensionSystem.reloadExtension(extension); ExtensionSystem.reloadExtension(extension);
}, }
CheckForUpdates() { CheckForUpdates() {
ExtensionDownloader.checkForUpdates(); ExtensionDownloader.checkForUpdates();
}, }
ShellVersion: Config.PACKAGE_VERSION, get ShellVersion() {
return Config.PACKAGE_VERSION;
}
_extensionStateChanged(_, newState) { _extensionStateChanged(_, newState) {
this._dbusImpl.emit_signal('ExtensionStatusChanged', this._dbusImpl.emit_signal('ExtensionStatusChanged',
GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error])); GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error]));
} }
}); };
var ScreenSaverDBus = new Lang.Class({
Name: 'ScreenSaverDBus',
_init(screenShield) {
this.parent();
var ScreenSaverDBus = class {
constructor(screenShield) {
this._screenShield = screenShield; this._screenShield = screenShield;
screenShield.connect('active-changed', shield => { screenShield.connect('active-changed', shield => {
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active])); this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active]));
@@ -359,7 +355,7 @@ var ScreenSaverDBus = new Lang.Class({
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, }
LockAsync(parameters, invocation) { LockAsync(parameters, invocation) {
let tmpId = this._screenShield.connect('lock-screen-shown', () => { let tmpId = this._screenShield.connect('lock-screen-shown', () => {
@@ -369,18 +365,18 @@ var ScreenSaverDBus = new Lang.Class({
}); });
this._screenShield.lock(true); this._screenShield.lock(true);
}, }
SetActive(active) { SetActive(active) {
if (active) if (active)
this._screenShield.activate(true); this._screenShield.activate(true);
else else
this._screenShield.deactivate(false); this._screenShield.deactivate(false);
}, }
GetActive() { GetActive() {
return this._screenShield.active; return this._screenShield.active;
}, }
GetActiveTime() { GetActiveTime() {
let started = this._screenShield.activationTime; let started = this._screenShield.activationTime;
@@ -388,5 +384,5 @@ var ScreenSaverDBus = new Lang.Class({
return Math.floor((GLib.get_monotonic_time() - started) / 1000000); return Math.floor((GLib.get_monotonic_time() - started) / 1000000);
else else
return 0; return 0;
}, }
}); };

View File

@@ -2,7 +2,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
@@ -10,12 +9,9 @@ const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
var EntryMenu = new Lang.Class({ var EntryMenu = class extends PopupMenu.PopupMenu {
Name: 'ShellEntryMenu', constructor(entry) {
Extends: PopupMenu.PopupMenu, super(entry, 0, St.Side.TOP);
_init(entry) {
this.parent(entry, 0, St.Side.TOP);
this._entry = entry; this._entry = entry;
this._clipboard = St.Clipboard.get_default(); this._clipboard = St.Clipboard.get_default();
@@ -36,18 +32,18 @@ var EntryMenu = new Lang.Class({
Main.uiGroup.add_actor(this.actor); Main.uiGroup.add_actor(this.actor);
this.actor.hide(); this.actor.hide();
}, }
_makePasswordItem() { _makePasswordItem() {
let item = new PopupMenu.PopupMenuItem(''); let item = new PopupMenu.PopupMenuItem('');
item.connect('activate', this._onPasswordActivated.bind(this)); item.connect('activate', this._onPasswordActivated.bind(this));
this.addMenuItem(item); this.addMenuItem(item);
this._passwordItem = item; this._passwordItem = item;
}, }
get isPassword() { get isPassword() {
return this._passwordItem != null; return this._passwordItem != null;
}, }
set isPassword(v) { set isPassword(v) {
if (v == this.isPassword) if (v == this.isPassword)
@@ -61,7 +57,7 @@ var EntryMenu = new Lang.Class({
this._passwordItem = null; this._passwordItem = null;
this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL; this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
} }
}, }
open(animate) { open(animate) {
this._updatePasteItem(); this._updatePasteItem();
@@ -69,26 +65,26 @@ var EntryMenu = new Lang.Class({
if (this._passwordItem) if (this._passwordItem)
this._updatePasswordItem(); this._updatePasswordItem();
this.parent(animate); super.open(animate);
this._entry.add_style_pseudo_class('focus'); this._entry.add_style_pseudo_class('focus');
let direction = Gtk.DirectionType.TAB_FORWARD; let direction = Gtk.DirectionType.TAB_FORWARD;
if (!this.actor.navigate_focus(null, direction, false)) if (!this.actor.navigate_focus(null, direction, false))
this.actor.grab_key_focus(); this.actor.grab_key_focus();
}, }
_updateCopyItem() { _updateCopyItem() {
let selection = this._entry.clutter_text.get_selection(); let selection = this._entry.clutter_text.get_selection();
this._copyItem.setSensitive(!this._entry.clutter_text.password_char && this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
selection && selection != ''); selection && selection != '');
}, }
_updatePasteItem() { _updatePasteItem() {
this._clipboard.get_text(St.ClipboardType.CLIPBOARD, this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
(clipboard, text) => { (clipboard, text) => {
this._pasteItem.setSensitive(text && text != ''); this._pasteItem.setSensitive(text && text != '');
}); });
}, }
_updatePasswordItem() { _updatePasswordItem() {
let textHidden = (this._entry.clutter_text.password_char); let textHidden = (this._entry.clutter_text.password_char);
@@ -96,12 +92,12 @@ var EntryMenu = new Lang.Class({
this._passwordItem.label.set_text(_("Show Text")); this._passwordItem.label.set_text(_("Show Text"));
else else
this._passwordItem.label.set_text(_("Hide Text")); this._passwordItem.label.set_text(_("Hide Text"));
}, }
_onCopyActivated() { _onCopyActivated() {
let selection = this._entry.clutter_text.get_selection(); let selection = this._entry.clutter_text.get_selection();
this._clipboard.set_text(St.ClipboardType.CLIPBOARD, selection); this._clipboard.set_text(St.ClipboardType.CLIPBOARD, selection);
}, }
_onPasteActivated() { _onPasteActivated() {
this._clipboard.get_text(St.ClipboardType.CLIPBOARD, this._clipboard.get_text(St.ClipboardType.CLIPBOARD,
@@ -112,13 +108,13 @@ var EntryMenu = new Lang.Class({
let pos = this._entry.clutter_text.get_cursor_position(); let pos = this._entry.clutter_text.get_cursor_position();
this._entry.clutter_text.insert_text(text, pos); this._entry.clutter_text.insert_text(text, pos);
}); });
}, }
_onPasswordActivated() { _onPasswordActivated() {
let visible = !!(this._entry.clutter_text.password_char); let visible = !!(this._entry.clutter_text.password_char);
this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf'); this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf');
} }
}); };
function _setMenuAlignment(entry, stageX) { function _setMenuAlignment(entry, stageX) {
let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0); let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0);

View File

@@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
@@ -62,10 +61,8 @@ function _createIcon(gicon) {
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
var ListItem = new Lang.Class({ var ListItem = class {
Name: 'ListItem', constructor(app) {
_init(app) {
this._app = app; this._app = app;
let layout = new St.BoxLayout({ vertical: false}); let layout = new St.BoxLayout({ vertical: false});
@@ -90,19 +87,17 @@ var ListItem = new Lang.Class({
layout.add(labelBin); layout.add(labelBin);
this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('clicked', this._onClicked.bind(this));
}, }
_onClicked() { _onClicked() {
this.emit('activate'); this.emit('activate');
this._app.activate(); this._app.activate();
} }
}); };
Signals.addSignalMethods(ListItem.prototype); Signals.addSignalMethods(ListItem.prototype);
var ShellMountOperation = new Lang.Class({ var ShellMountOperation = class {
Name: 'ShellMountOperation', constructor(source, params) {
_init(source, params) {
params = Params.parse(params, { existingDialog: null }); params = Params.parse(params, { existingDialog: null });
this._dialog = null; this._dialog = null;
@@ -124,7 +119,7 @@ var ShellMountOperation = new Lang.Class({
this._onShowUnmountProgress.bind(this)); this._onShowUnmountProgress.bind(this));
this._gicon = source.get_icon(); this._gicon = source.get_icon();
}, }
_closeExistingDialog() { _closeExistingDialog() {
if (!this._existingDialog) if (!this._existingDialog)
@@ -132,7 +127,7 @@ var ShellMountOperation = new Lang.Class({
this._existingDialog.close(); this._existingDialog.close();
this._existingDialog = null; this._existingDialog = null;
}, }
_onAskQuestion(op, message, choices) { _onAskQuestion(op, message, choices) {
this._closeExistingDialog(); this._closeExistingDialog();
@@ -148,7 +143,7 @@ var ShellMountOperation = new Lang.Class({
this._dialog.update(message, choices); this._dialog.update(message, choices);
this._dialog.open(); this._dialog.open();
}, }
_onAskPassword(op, message, defaultUser, defaultDomain, flags) { _onAskPassword(op, message, defaultUser, defaultDomain, flags) {
if (this._existingDialog) { if (this._existingDialog) {
@@ -173,7 +168,7 @@ var ShellMountOperation = new Lang.Class({
} }
}); });
this._dialog.open(); this._dialog.open();
}, }
close(op) { close(op) {
this._closeExistingDialog(); this._closeExistingDialog();
@@ -188,7 +183,7 @@ var ShellMountOperation = new Lang.Class({
this._notifier.done(); this._notifier.done();
this._notifier = null; this._notifier = null;
} }
}, }
_onShowProcesses2(op) { _onShowProcesses2(op) {
this._closeExistingDialog(); this._closeExistingDialog();
@@ -216,7 +211,7 @@ var ShellMountOperation = new Lang.Class({
} }
this._processesDialog.update(message, processes, choices); this._processesDialog.update(message, processes, choices);
}, }
_onShowUnmountProgress(op, message, timeLeft, bytesLeft) { _onShowUnmountProgress(op, message, timeLeft, bytesLeft) {
if (!this._notifier) if (!this._notifier)
@@ -226,7 +221,7 @@ var ShellMountOperation = new Lang.Class({
this._notifier.done(message); this._notifier.done(message);
else else
this._notifier.show(message); this._notifier.show(message);
}, }
borrowDialog() { borrowDialog() {
if (this._dialogId != 0) { if (this._dialogId != 0) {
@@ -236,18 +231,15 @@ var ShellMountOperation = new Lang.Class({
return this._dialog; return this._dialog;
} }
}); };
var ShellUnmountNotifier = new Lang.Class({ var ShellUnmountNotifier = class extends MessageTray.Source {
Name: 'ShellUnmountNotifier', constructor() {
Extends: MessageTray.Source, super('', 'media-removable');
_init() {
this.parent('', 'media-removable');
this._notification = null; this._notification = null;
Main.messageTray.add(this); Main.messageTray.add(this);
}, }
show(message) { show(message) {
let [header, text] = message.split('\n', 2); let [header, text] = message.split('\n', 2);
@@ -261,7 +253,7 @@ var ShellUnmountNotifier = new Lang.Class({
} }
this.notify(this._notification); this.notify(this._notification);
}, }
done(message) { done(message) {
if (this._notification) { if (this._notification) {
@@ -276,35 +268,29 @@ var ShellUnmountNotifier = new Lang.Class({
this.notify(notification); this.notify(notification);
} }
} }
}); };
var ShellMountQuestionDialog = new Lang.Class({ var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog {
Name: 'ShellMountQuestionDialog', constructor(icon) {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'mount-dialog' });
_init(icon) {
this.parent({ styleClass: 'mount-dialog' });
this._content = new Dialog.MessageDialogContent({ icon }); this._content = new Dialog.MessageDialogContent({ icon });
this.contentLayout.add(this._content, { x_fill: true, y_fill: false }); this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
}, }
update(message, choices) { update(message, choices) {
_setLabelsForMessage(this._content, message); _setLabelsForMessage(this._content, message);
_setButtonsForChoices(this, choices); _setButtonsForChoices(this, choices);
} }
}); };
Signals.addSignalMethods(ShellMountQuestionDialog.prototype); Signals.addSignalMethods(ShellMountQuestionDialog.prototype);
var ShellMountPasswordDialog = new Lang.Class({ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
Name: 'ShellMountPasswordDialog', constructor(message, icon, flags) {
Extends: ModalDialog.ModalDialog,
_init(message, icon, flags) {
let strings = message.split('\n'); let strings = message.split('\n');
let title = strings.shift() || null; let title = strings.shift() || null;
let body = strings.shift() || null; let body = strings.shift() || null;
this.parent({ styleClass: 'prompt-dialog' }); super({ styleClass: 'prompt-dialog' });
let content = new Dialog.MessageDialogContent({ icon, title, body }); let content = new Dialog.MessageDialogContent({ icon, title, body });
this.contentLayout.add_actor(content); this.contentLayout.add_actor(content);
@@ -352,20 +338,20 @@ var ShellMountPasswordDialog = new Lang.Class({
}]; }];
this.setButtons(buttons); this.setButtons(buttons);
}, }
reaskPassword() { reaskPassword() {
this._passwordEntry.set_text(''); this._passwordEntry.set_text('');
this._errorMessageLabel.show(); this._errorMessageLabel.show();
}, }
_onCancelButton() { _onCancelButton() {
this.emit('response', -1, '', false); this.emit('response', -1, '', false);
}, }
_onUnlockButton() { _onUnlockButton() {
this._onEntryActivate(); this._onEntryActivate();
}, }
_onEntryActivate() { _onEntryActivate() {
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY, global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
@@ -375,14 +361,11 @@ var ShellMountPasswordDialog = new Lang.Class({
this._rememberChoice && this._rememberChoice &&
this._rememberChoice.actor.checked); this._rememberChoice.actor.checked);
} }
}); };
var ShellProcessesDialog = new Lang.Class({ var ShellProcessesDialog = class extends ModalDialog.ModalDialog {
Name: 'ShellProcessesDialog', constructor(icon) {
Extends: ModalDialog.ModalDialog, super({ styleClass: 'mount-dialog' });
_init(icon) {
this.parent({ styleClass: 'mount-dialog' });
this._content = new Dialog.MessageDialogContent({ icon }); this._content = new Dialog.MessageDialogContent({ icon });
this.contentLayout.add(this._content, { x_fill: true, y_fill: false }); this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
@@ -407,7 +390,7 @@ var ShellProcessesDialog = new Lang.Class({
if (this._applicationList.get_n_children() == 0) if (this._applicationList.get_n_children() == 0)
scrollView.hide(); scrollView.hide();
}); });
}, }
_setAppsForPids(pids) { _setAppsForPids(pids) {
// remove all the items // remove all the items
@@ -428,14 +411,14 @@ var ShellProcessesDialog = new Lang.Class({
this.emit('response', -1); this.emit('response', -1);
}); });
}); });
}, }
update(message, processes, choices) { update(message, processes, choices) {
this._setAppsForPids(processes); this._setAppsForPids(processes);
_setLabelsForMessage(this._content, message); _setLabelsForMessage(this._content, message);
_setButtonsForChoices(this, choices); _setButtonsForChoices(this, choices);
} }
}); };
Signals.addSignalMethods(ShellProcessesDialog.prototype); Signals.addSignalMethods(ShellProcessesDialog.prototype);
const GnomeShellMountOpIface = loadInterfaceXML('org.Gtk.MountOperationHandler'); const GnomeShellMountOpIface = loadInterfaceXML('org.Gtk.MountOperationHandler');
@@ -447,10 +430,8 @@ var ShellMountOperationType = {
SHOW_PROCESSES: 3 SHOW_PROCESSES: 3
}; };
var GnomeShellMountOpHandler = new Lang.Class({ var GnomeShellMountOpHandler = class {
Name: 'GnomeShellMountOpHandler', constructor() {
_init() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler'); this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler', Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler',
@@ -460,13 +441,13 @@ var GnomeShellMountOpHandler = new Lang.Class({
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();
this._ensureEmptyRequest(); this._ensureEmptyRequest();
}, }
_ensureEmptyRequest() { _ensureEmptyRequest() {
this._currentId = null; this._currentId = null;
this._currentInvocation = null; this._currentInvocation = null;
this._currentType = ShellMountOperationType.NONE; this._currentType = ShellMountOperationType.NONE;
}, }
_clearCurrentRequest(response, details) { _clearCurrentRequest(response, details) {
if (this._currentInvocation) { if (this._currentInvocation) {
@@ -475,7 +456,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
} }
this._ensureEmptyRequest(); this._ensureEmptyRequest();
}, }
_setCurrentRequest(invocation, id, type) { _setCurrentRequest(invocation, id, type) {
let oldId = this._currentId; let oldId = this._currentId;
@@ -492,20 +473,20 @@ var GnomeShellMountOpHandler = new Lang.Class({
return true; return true;
return false; return false;
}, }
_closeDialog() { _closeDialog() {
if (this._dialog) { if (this._dialog) {
this._dialog.close(); this._dialog.close();
this._dialog = null; this._dialog = null;
} }
}, }
_createGIcon(iconName) { _createGIcon(iconName) {
let realIconName = iconName ? iconName : 'drive-harddisk'; let realIconName = iconName ? iconName : 'drive-harddisk';
return new Gio.ThemedIcon({ name: realIconName, return new Gio.ThemedIcon({ name: realIconName,
use_default_fallbacks: true }); use_default_fallbacks: true });
}, }
/** /**
* AskPassword: * AskPassword:
@@ -557,7 +538,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
this._clearCurrentRequest(response, details); this._clearCurrentRequest(response, details);
}); });
this._dialog.open(); this._dialog.open();
}, }
/** /**
* AskQuestion: * AskQuestion:
@@ -595,7 +576,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
this._dialog.update(message, choices); this._dialog.update(message, choices);
this._dialog.open(); this._dialog.open();
}, }
/** /**
* ShowProcesses: * ShowProcesses:
@@ -643,7 +624,7 @@ var GnomeShellMountOpHandler = new Lang.Class({
this._dialog.update(message, applicationPids, choices); this._dialog.update(message, applicationPids, choices);
this._dialog.open(); this._dialog.open();
}, }
/** /**
* Close: * Close:
@@ -655,4 +636,4 @@ var GnomeShellMountOpHandler = new Lang.Class({
this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {}); this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {});
this._closeDialog(); this._closeDialog();
} }
}); };

View File

@@ -3,7 +3,6 @@
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Cairo = imports.cairo; const Cairo = imports.cairo;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
@@ -11,18 +10,15 @@ const BarLevel = imports.ui.barLevel;
var SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */ var SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */
var Slider = new Lang.Class({ var Slider = class extends BarLevel.BarLevel {
Name: "Slider", constructor(value) {
Extends: BarLevel.BarLevel,
_init(value) {
let params = { let params = {
styleClass: 'slider', styleClass: 'slider',
canFocus: true, canFocus: true,
reactive: true, reactive: true,
accessibleRole: Atk.Role.SLIDER, accessibleRole: Atk.Role.SLIDER,
} }
this.parent(value, params) super(value, params)
this.actor.connect('button-press-event', this._startDragging.bind(this)); this.actor.connect('button-press-event', this._startDragging.bind(this));
this.actor.connect('touch-event', this._touchDragging.bind(this)); this.actor.connect('touch-event', this._touchDragging.bind(this));
@@ -33,10 +29,10 @@ var Slider = new Lang.Class({
this._dragging = false; this._dragging = false;
this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this)); this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this));
}, }
_barLevelRepaint(area) { _barLevelRepaint(area) {
this.parent(area); super._barLevelRepaint(area);
// Add handle // Add handle
let cr = area.get_context(); let cr = area.get_context();
@@ -64,11 +60,11 @@ var Slider = new Lang.Class({
cr.stroke(); cr.stroke();
} }
cr.$dispose(); cr.$dispose();
}, }
_startDragging(actor, event) { _startDragging(actor, event) {
return this.startDragging(event); return this.startDragging(event);
}, }
startDragging(event) { startDragging(event) {
if (this._dragging) if (this._dragging)
@@ -100,7 +96,7 @@ var Slider = new Lang.Class({
[absX, absY] = event.get_coords(); [absX, absY] = event.get_coords();
this._moveHandle(absX, absY); this._moveHandle(absX, absY);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_endDragging() { _endDragging() {
if (this._dragging) { if (this._dragging) {
@@ -121,7 +117,7 @@ var Slider = new Lang.Class({
this.emit('drag-end'); this.emit('drag-end');
} }
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_touchDragging(actor, event) { _touchDragging(actor, event) {
let device = event.get_device(); let device = event.get_device();
@@ -139,7 +135,7 @@ var Slider = new Lang.Class({
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
scroll(event) { scroll(event) {
let direction = event.get_scroll_direction(); let direction = event.get_scroll_direction();
@@ -164,18 +160,18 @@ var Slider = new Lang.Class({
this.actor.queue_repaint(); this.actor.queue_repaint();
this.emit('value-changed', this._value); this.emit('value-changed', this._value);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
_onScrollEvent(actor, event) { _onScrollEvent(actor, event) {
return this.scroll(event); return this.scroll(event);
}, }
_motionEvent(actor, event) { _motionEvent(actor, event) {
let absX, absY; let absX, absY;
[absX, absY] = event.get_coords(); [absX, absY] = event.get_coords();
this._moveHandle(absX, absY); this._moveHandle(absX, absY);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, }
onKeyPressEvent(actor, event) { onKeyPressEvent(actor, event) {
let key = event.get_key_symbol(); let key = event.get_key_symbol();
@@ -189,7 +185,7 @@ var Slider = new Lang.Class({
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, }
_moveHandle(absX, absY) { _moveHandle(absX, absY) {
let relX, relY, sliderX, sliderY; let relX, relY, sliderX, sliderY;
@@ -210,11 +206,10 @@ var Slider = new Lang.Class({
this._value = newvalue * this._maxValue; this._value = newvalue * this._maxValue;
this.actor.queue_repaint(); this.actor.queue_repaint();
this.emit('value-changed', this._value); this.emit('value-changed', this._value);
}, }
_getMinimumIncrement(actor) { _getMinimumIncrement(actor) {
return 0.1; return 0.1;
}, }
}); };
Signals.addSignalMethods(Slider.prototype); Signals.addSignalMethods(Slider.prototype);

View File

@@ -3,7 +3,7 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const GObject = imports.gi.GObject;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const St = imports.gi.St; const St = imports.gi.St;
@@ -34,12 +34,10 @@ const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor';
const HIGH_CONTRAST_THEME = 'HighContrast'; const HIGH_CONTRAST_THEME = 'HighContrast';
var ATIndicator = new Lang.Class({ var ATIndicator = GObject.registerClass(
Name: 'ATIndicator', class ATIndicator extends PanelMenu.Button {
Extends: PanelMenu.Button,
_init() { _init() {
this.parent(0.0, _("Accessibility")); super._init(0.0, _("Accessibility"));
this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
this._hbox.add_child(new St.Icon({ style_class: 'system-status-icon', this._hbox.add_child(new St.Icon({ style_class: 'system-status-icon',
@@ -85,7 +83,7 @@ var ATIndicator = new Lang.Class({
this.menu.addMenuItem(mouseKeys); this.menu.addMenuItem(mouseKeys);
this._syncMenuVisibility(); this._syncMenuVisibility();
}, }
_syncMenuVisibility() { _syncMenuVisibility() {
this._syncMenuVisibilityIdle = 0; this._syncMenuVisibilityIdle = 0;
@@ -96,7 +94,7 @@ var ATIndicator = new Lang.Class({
this.actor.visible = alwaysShow || items.some(f => !!f.state); this.actor.visible = alwaysShow || items.some(f => !!f.state);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, }
_queueSyncMenuVisibility() { _queueSyncMenuVisibility() {
if (this._syncMenuVisibilityIdle) if (this._syncMenuVisibilityIdle)
@@ -104,7 +102,7 @@ var ATIndicator = new Lang.Class({
this._syncMenuVisibilityIdle = Mainloop.idle_add(this._syncMenuVisibility.bind(this)); this._syncMenuVisibilityIdle = Mainloop.idle_add(this._syncMenuVisibility.bind(this));
GLib.Source.set_name_by_id(this._syncMenuVisibilityIdle, '[gnome-shell] this._syncMenuVisibility'); GLib.Source.set_name_by_id(this._syncMenuVisibilityIdle, '[gnome-shell] this._syncMenuVisibility');
}, }
_buildItemExtended(string, initial_value, writable, on_set) { _buildItemExtended(string, initial_value, writable, on_set) {
let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value); let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value);
@@ -115,7 +113,7 @@ var ATIndicator = new Lang.Class({
on_set(item.state); on_set(item.state);
}); });
return widget; return widget;
}, }
_buildItem(string, schema, key) { _buildItem(string, schema, key) {
let settings = new Gio.Settings({ schema_id: schema }); let settings = new Gio.Settings({ schema_id: schema });
@@ -130,7 +128,7 @@ var ATIndicator = new Lang.Class({
settings.is_writable(key), settings.is_writable(key),
enabled => settings.set_boolean(key, enabled)); enabled => settings.set_boolean(key, enabled));
return widget; return widget;
}, }
_buildHCItem() { _buildHCItem() {
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
@@ -183,7 +181,7 @@ var ATIndicator = new Lang.Class({
} }
}); });
return highContrast; return highContrast;
}, }
_buildFontItem() { _buildFontItem() {
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });

View File

@@ -2,7 +2,6 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GnomeBluetooth = imports.gi.GnomeBluetooth; const GnomeBluetooth = imports.gi.GnomeBluetooth;
const Lang = imports.lang;
const Main = imports.ui.main; const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
@@ -18,12 +17,9 @@ const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface
const HAD_BLUETOOTH_DEVICES_SETUP = 'had-bluetooth-devices-setup'; const HAD_BLUETOOTH_DEVICES_SETUP = 'had-bluetooth-devices-setup';
var Indicator = new Lang.Class({ var Indicator = class extends PanelMenu.SystemIndicator {
Name: 'BTIndicator', constructor() {
Extends: PanelMenu.SystemIndicator, super();
_init() {
this.parent();
this._indicator = this._addIndicator(); this._indicator = this._addIndicator();
this._indicator.icon_name = 'bluetooth-active-symbolic'; this._indicator.icon_name = 'bluetooth-active-symbolic';
@@ -59,7 +55,7 @@ var Indicator = new Lang.Class({
this._model.connect('row-inserted', this._sync.bind(this)); this._model.connect('row-inserted', this._sync.bind(this));
Main.sessionMode.connect('updated', this._sync.bind(this)); Main.sessionMode.connect('updated', this._sync.bind(this));
this._sync(); this._sync();
}, }
_getDefaultAdapter() { _getDefaultAdapter() {
let [ret, iter] = this._model.get_iter_first(); let [ret, iter] = this._model.get_iter_first();
@@ -73,7 +69,7 @@ var Indicator = new Lang.Class({
ret = this._model.iter_next(iter); ret = this._model.iter_next(iter);
} }
return null; return null;
}, }
// nDevices is the number of devices setup for the current default // nDevices is the number of devices setup for the current default
// adapter if one exists and is powered. If unpowered or unavailable, // adapter if one exists and is powered. If unpowered or unavailable,
@@ -111,7 +107,7 @@ var Indicator = new Lang.Class({
} }
return [ nDevices, nConnectedDevices]; return [ nDevices, nConnectedDevices];
}, }
_sync() { _sync() {
let [ nDevices, nConnectedDevices ] = this._getNDevices(); let [ nDevices, nConnectedDevices ] = this._getNDevices();
@@ -136,5 +132,5 @@ var Indicator = new Lang.Class({
this._item.label.text = _("On"); this._item.label.text = _("On");
this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off"); this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off");
}, }
}); };

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const St = imports.gi.St; const St = imports.gi.St;
@@ -16,12 +15,9 @@ const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power';
const BrightnessInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Power.Screen'); const BrightnessInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Power.Screen');
const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface); const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface);
var Indicator = new Lang.Class({ var Indicator = class extends PanelMenu.SystemIndicator {
Name: 'BrightnessIndicator', constructor() {
Extends: PanelMenu.SystemIndicator, super('display-brightness-symbolic');
_init() {
this.parent('display-brightness-symbolic');
this._proxy = new BrightnessProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, this._proxy = new BrightnessProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
(proxy, error) => { (proxy, error) => {
if (error) { if (error) {
@@ -51,17 +47,17 @@ var Indicator = new Lang.Class({
return this._slider.onKeyPressEvent(actor, event); return this._slider.onKeyPressEvent(actor, event);
}); });
}, }
_sliderChanged(slider, value) { _sliderChanged(slider, value) {
let percent = value * 100; let percent = value * 100;
this._proxy.Brightness = percent; this._proxy.Brightness = percent;
}, }
_sync() { _sync() {
let visible = this._proxy.Brightness >= 0; let visible = this._proxy.Brightness >= 0;
this._item.actor.visible = visible; this._item.actor.visible = visible;
if (visible) if (visible)
this._slider.setValue(this._proxy.Brightness / 100.0); this._slider.setValue(this._proxy.Brightness / 100.0);
}, }
}); };

Some files were not shown because too many files have changed in this diff Show More