Compare commits
	
		
			192 Commits
		
	
	
		
			3.27.92
			...
			wip/fmuell
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 38c05d91a8 | ||
|   | eeda54f24d | ||
|   | b8b5da1e95 | ||
|   | 3a9ad5c577 | ||
|   | d57dc94d9e | ||
|   | 393d7246cc | ||
|   | 6217c3b88d | ||
|   | ddd4fd9c24 | ||
|   | d2a97e7f1d | ||
|   | aa75e89216 | ||
|   | 3f756dc608 | ||
|   | ed8e89bc19 | ||
|   | c90a4e4849 | ||
|   | f433b12d6e | ||
|   | 7ca418a79a | ||
|   | a9ad91c831 | ||
|   | bd1c7774ee | ||
|   | 91da3789bc | ||
|   | 2991f9f102 | ||
|   | 49d8ff38e7 | ||
|   | 4b522a02c3 | ||
|   | ebe6f59d7e | ||
|   | e5c95b910d | ||
|   | 2f76951658 | ||
|   | 3efd296fc3 | ||
|   | 6688610c23 | ||
|   | d2c75801ea | ||
|   | be84a00022 | ||
|   | da537cda43 | ||
|   | 304c667bca | ||
|   | 879a81abeb | ||
|   | e68ca5adbd | ||
|   | cf69fe4b18 | ||
|   | 8f848925f6 | ||
|   | d21657fe61 | ||
|   | ce3555382b | ||
|   | 837a00c3f0 | ||
|   | 132c8e0cf8 | ||
|   | 9c62522419 | ||
|   | 0d5bae3844 | ||
|   | 97f6a35b46 | ||
|   | 43e8dfacb4 | ||
|   | 0221099e7e | ||
|   | 374caade47 | ||
|   | a5937d1d6d | ||
|   | e36ba874a8 | ||
|   | 22392d1328 | ||
|   | 0dee82fb9f | ||
|   | 68f00f397f | ||
|   | 905801b178 | ||
|   | 4a7082bb0f | ||
|   | 2e90c5fa4b | ||
|   | 50e849a186 | ||
|   | e7f2e92410 | ||
|   | b1b455ff1a | ||
|   | ab4c72d758 | ||
|   | 86a520b880 | ||
|   | 4bf033a885 | ||
|   | e3ebc8d0c6 | ||
|   | fc5ab44704 | ||
|   | d5e8f174d4 | ||
|   | d9a1434ae9 | ||
|   | d0bdea3178 | ||
|   | ccadf6aca1 | ||
|   | 266b0e9dd0 | ||
|   | f7355f593d | ||
|   | a301820258 | ||
|   | 47ea10b7c9 | ||
|   | 2c0376c150 | ||
|   | ac58c4280b | ||
|   | e39d7152f2 | ||
|   | e522e2e804 | ||
|   | 2ba26407f1 | ||
|   | 996dd74157 | ||
|   | 878946962d | ||
|   | 84d2d3feb3 | ||
|   | 19e864ed3b | ||
|   | c9bf72c5c4 | ||
|   | 5fe349d5ba | ||
|   | 1f03599d1c | ||
|   | a24999b7a3 | ||
|   | 8237a1f6e0 | ||
|   | f9dec475a1 | ||
|   | 68b01a8f56 | ||
|   | f56ba0877a | ||
|   | 5ac6201d91 | ||
|   | a21a22fdb5 | ||
|   | a0fa50ac31 | ||
|   | b1dd746443 | ||
|   | c15e163eb1 | ||
|   | 7a3927c168 | ||
|   | 6eed4e31d7 | ||
|   | f0557ea05c | ||
|   | 44894262f4 | ||
|   | b03bcc85aa | ||
|   | 70057c6a55 | ||
|   | 86bd5b281d | ||
|   | ad3e9ab205 | ||
|   | 02bbf409ea | ||
|   | f56e4e177e | ||
|   | fc26559f2c | ||
|   | fdaddbd1e0 | ||
|   | 04f61567ba | ||
|   | a0785cdbc1 | ||
|   | 94101e8bb8 | ||
|   | f13dbf2f26 | ||
|   | bae6f06e4e | ||
|   | d8b9e23502 | ||
|   | 7d59eaa67e | ||
|   | c0a453f64f | ||
|   | 5336175736 | ||
|   | 2997e4950b | ||
|   | a49fb90d86 | ||
|   | ffc0eb1de2 | ||
|   | 853c81eb62 | ||
|   | 594cc7cbef | ||
|   | 0932324d39 | ||
|   | 2d6cf236c4 | ||
|   | 642107a28f | ||
|   | 581b38ecf4 | ||
|   | fbc03cc262 | ||
|   | a6ff195893 | ||
|   | f411724064 | ||
|   | 39f43a4cd4 | ||
|   | c82cb918ae | ||
|   | 38cdaa6c20 | ||
|   | 0327069e83 | ||
|   | 7601b029c8 | ||
|   | fb509dfc25 | ||
|   | 874a91968f | ||
|   | 0963ccddba | ||
|   | c4e0f6df08 | ||
|   | 58aafe9520 | ||
|   | a46df7f8ec | ||
|   | 1dd16618d1 | ||
|   | a4190f83ac | ||
|   | a8e17f73ec | ||
|   | 86a741c1ee | ||
|   | 5cc6fef689 | ||
|   | 522a5fe480 | ||
|   | b1239b1257 | ||
|   | 58063d9ee1 | ||
|   | d7aba2dece | ||
|   | 35fced27df | ||
|   | be76b19300 | ||
|   | 376d696b8b | ||
|   | 695d61968d | ||
|   | d6d09fd3c8 | ||
|   | f1b1501f9b | ||
|   | cdbc99e992 | ||
|   | 69afe7785d | ||
|   | b99e304f1e | ||
|   | c29bd46e7a | ||
|   | 5fcf40b973 | ||
|   | a198dfe3d8 | ||
|   | 5b10d157fe | ||
|   | 5cc42b18b0 | ||
|   | cb4252e888 | ||
|   | 09d3cdb023 | ||
|   | 71515a8a11 | ||
|   | 11ca8dd54f | ||
|   | e00f22ebe6 | ||
|   | 13390543b0 | ||
|   | de95ced92c | ||
|   | f6a08472a0 | ||
|   | 9f7b101437 | ||
|   | 9c0707d4dc | ||
|   | 78a92fb6be | ||
|   | 01509cf1a5 | ||
|   | 61e9f51274 | ||
|   | 201bd9d42e | ||
|   | 8a78f08f6c | ||
|   | a5e54f9712 | ||
|   | 526834e39b | ||
|   | bdde2476d2 | ||
|   | 3171f9debe | ||
|   | 0e2aeac5f9 | ||
|   | 788fb5547c | ||
|   | c4d2c0ee64 | ||
|   | 977686a77a | ||
|   | 44b29f210c | ||
|   | 36c7d65ccf | ||
|   | b81d24fdb4 | ||
|   | bfdbee8115 | ||
|   | 4a17c8f4a9 | ||
|   | d4f67a7d42 | ||
|   | d5769ae409 | ||
|   | f356b61e5a | ||
|   | 398768dcbd | ||
|   | 272d5b6e4a | ||
|   | a479aa2594 | ||
|   | f48d620ac5 | 
| @@ -1,19 +1,16 @@ | |||||||
| Coding guide | # Coding guide | ||||||
| ============ |  | ||||||
| 
 | 
 | ||||||
| Our goal is to have all JavaScript code in GNOME follow a consistent style. In | Our goal is to have all JavaScript code in GNOME follow a consistent style. In | ||||||
| a dynamic language like JavaScript, it is essential to be rigorous about style | a dynamic language like JavaScript, it is essential to be rigorous about style | ||||||
| (and unit tests), or you rapidly end up with a spaghetti-code mess. | (and unit tests), or you rapidly end up with a spaghetti-code mess. | ||||||
| 
 | 
 | ||||||
| A quick note | ## A quick note | ||||||
| ------------ |  | ||||||
| 
 | 
 | ||||||
| Life isn't fun if you can't break the rules. If a rule seems unnecessarily | Life isn't fun if you can't break the rules. If a rule seems unnecessarily | ||||||
| restrictive while you're coding, ignore it, and let the patch reviewer decide | restrictive while you're coding, ignore it, and let the patch reviewer decide | ||||||
| what to do. | what to do. | ||||||
| 
 | 
 | ||||||
| Indentation and whitespace | ## Indentation and whitespace | ||||||
| -------------------------- |  | ||||||
| 
 | 
 | ||||||
| Use four-space indents. Braces are on the same line as their associated | Use four-space indents. Braces are on the same line as their associated | ||||||
| statements.  You should only omit braces if *both* sides of the statement are | statements.  You should only omit braces if *both* sides of the statement are | ||||||
| @@ -22,7 +19,7 @@ on one line. | |||||||
| * One space after the `function` keyword.  No space between the function name | * One space after the `function` keyword.  No space between the function name | ||||||
| * in a declaration or a call.  One space before the parens in the `if` | * in a declaration or a call.  One space before the parens in the `if` | ||||||
| * statements, or `while`, or `for` loops. | * statements, or `while`, or `for` loops. | ||||||
| 
 | ```javascript | ||||||
|     function foo(a, b) { |     function foo(a, b) { | ||||||
|         let bar; |         let bar; | ||||||
| 
 | 
 | ||||||
| @@ -39,22 +36,20 @@ on one line. | |||||||
|             print(20); |             print(20); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| Semicolons | ## Semicolons | ||||||
| ---------- |  | ||||||
| 
 | 
 | ||||||
| JavaScript allows omitting semicolons at the end of lines, but don't. Always | JavaScript allows omitting semicolons at the end of lines, but don't. Always | ||||||
| end statements with a semicolon. | end statements with a semicolon. | ||||||
| 
 | 
 | ||||||
| js2-mode | ## js2-mode | ||||||
| -------- |  | ||||||
| 
 | 
 | ||||||
| If using Emacs, do not use js2-mode. It is outdated and hasn't worked for a | If using Emacs, do not use js2-mode. It is outdated and hasn't worked for a | ||||||
| while. emacs now has a built-in JavaScript mode, js-mode, based on | while. emacs now has a built-in JavaScript mode, js-mode, based on | ||||||
| espresso-mode. It is the de facto emacs mode for JavaScript. | espresso-mode. It is the de facto emacs mode for JavaScript. | ||||||
| 
 | 
 | ||||||
| File naming and creation | ## File naming and creation | ||||||
| ------------------------ |  | ||||||
| 
 | 
 | ||||||
| For JavaScript files, use lowerCamelCase-style names, with a `.js` extension. | For JavaScript files, use lowerCamelCase-style names, with a `.js` extension. | ||||||
| 
 | 
 | ||||||
| @@ -67,14 +62,13 @@ library name followed by a dash, e.g. `shell-app-system.c`. Create a | |||||||
| `-private.h` header when you want to share code internally in the | `-private.h` header when you want to share code internally in the | ||||||
| library. These headers are not installed, distributed or introspected. | library. These headers are not installed, distributed or introspected. | ||||||
| 
 | 
 | ||||||
| Imports | ## Imports | ||||||
| ------- |  | ||||||
| 
 | 
 | ||||||
| Use UpperCamelCase when importing modules to distinguish them from ordinary | Use UpperCamelCase when importing modules to distinguish them from ordinary | ||||||
| variables, e.g. | variables, e.g. | ||||||
| 
 | ```javascript | ||||||
|     const GLib = imports.gi.GLib; |     const GLib = imports.gi.GLib; | ||||||
| 
 | ``` | ||||||
| Imports should be categorized into one of two places. The top-most import block | Imports should be categorized into one of two places. The top-most import block | ||||||
| should contain only "environment imports". These are either modules from | should contain only "environment imports". These are either modules from | ||||||
| gobject-introspection or modules added by gjs itself. | gobject-introspection or modules added by gjs itself. | ||||||
| @@ -85,7 +79,7 @@ e.g. `imports.ui.popupMenu`. | |||||||
| 
 | 
 | ||||||
| Each import block should be sorted alphabetically. Don't import modules you | Each import block should be sorted alphabetically. Don't import modules you | ||||||
| don't use. | don't use. | ||||||
| 
 | ```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 Lang = imports.lang; | ||||||
| @@ -95,23 +89,22 @@ don't use. | |||||||
|     const Params = imports.misc.params; |     const Params = imports.misc.params; | ||||||
|     const Tweener = imports.ui.tweener; |     const Tweener = imports.ui.tweener; | ||||||
|     const Util = imports.misc.util; |     const Util = imports.misc.util; | ||||||
| 
 | ``` | ||||||
| The alphabetical ordering should be done independently of the location of the | The alphabetical ordering should be done independently of the location of the | ||||||
| location. Never reference `imports` in actual code. | location. Never reference `imports` in actual code. | ||||||
| 
 | 
 | ||||||
| Constants | ## Constants | ||||||
| --------- |  | ||||||
| 
 | 
 | ||||||
| We use CONSTANTS_CASE to define constants. All constants should be directly | We use CONSTANTS_CASE to define constants. All constants should be directly | ||||||
| under the imports: | under the imports: | ||||||
| 
 | ```javascript | ||||||
|     const MY_DBUS_INTERFACE = 'org.my.Interface'; |     const MY_DBUS_INTERFACE = 'org.my.Interface'; | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| Variable declaration | ## Variable declaration | ||||||
| -------------------- |  | ||||||
| 
 | 
 | ||||||
| Always use either `const` or `let` when defining a variable. | Always use either `const` or `let` when defining a variable. | ||||||
| 
 | ```javascript | ||||||
|     // Iterating over an array |     // Iterating over an array | ||||||
|     for (let i = 0; i < arr.length; ++i) { |     for (let i = 0; i < arr.length; ++i) { | ||||||
|         let item = arr[i]; |         let item = arr[i]; | ||||||
| @@ -121,17 +114,17 @@ Always use either `const` or `let` when defining a variable. | |||||||
|     for (let prop in someobj) { |     for (let prop in someobj) { | ||||||
|         ... |         ... | ||||||
|     } |     } | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| If you use "var" then the variable is added to function scope, not block scope. | If you use "var" then the variable is added to function scope, not block scope. | ||||||
| See [What's new in JavaScript 1.7](https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7#Block_scope_with_let_%28Merge_into_let_Statement%29) | See [What's new in JavaScript 1.7](https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7#Block_scope_with_let_%28Merge_into_let_Statement%29) | ||||||
| 
 | 
 | ||||||
| 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 our own class framework | ||||||
| (sigh), which is built in gjs. The advantage is that it supports inheriting from | (sigh), which is built in gjs. The advantage is that it supports inheriting from | ||||||
| GObjects, although this feature isn't used very often in the Shell itself. | GObjects, although this feature isn't used very often in the Shell itself. | ||||||
| 
 | ```javascript | ||||||
|     var IconLabelMenuItem = new Lang.Class({ |     var IconLabelMenuItem = new Lang.Class({ | ||||||
|         Name: 'IconLabelMenuItem', |         Name: 'IconLabelMenuItem', | ||||||
|         Extends: PopupMenu.PopupMenuBaseItem, |         Extends: PopupMenu.PopupMenuBaseItem, | ||||||
| @@ -146,6 +139,7 @@ GObjects, although this feature isn't used very often in the Shell itself. | |||||||
|             log("menu opened!"); |             log("menu opened!"); | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| * 'Name' is required. 'Extends' is optional. If you leave it out, you will | * 'Name' is required. 'Extends' is optional. If you leave it out, you will | ||||||
|   automatically inherit from Object. |   automatically inherit from Object. | ||||||
| @@ -162,13 +156,12 @@ GObjects, although this feature isn't used very often in the Shell itself. | |||||||
|   still a giant function call, even though it may resemble a more |   still a giant function call, even though it may resemble a more | ||||||
|   conventional syntax. |   conventional syntax. | ||||||
| 
 | 
 | ||||||
| GObject Introspection | ## GObject Introspection | ||||||
| --------------------- |  | ||||||
| 
 | 
 | ||||||
| GObject Introspection is a powerful feature that allows us to have native | 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 | ||||||
|     var MyClutterActor = new Lang.Class({ |     var MyClutterActor = new Lang.Class({ | ||||||
|         Name: 'MyClutterActor', |         Name: 'MyClutterActor', | ||||||
|         Extends: Clutter.Actor, |         Extends: Clutter.Actor, | ||||||
| @@ -188,9 +181,9 @@ you to inherit from a type to use it, you can do so: | |||||||
|                             alloc.x2, alloc.y2); |                             alloc.x2, alloc.y2); | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| Translatable strings, `environment.js` | ## Translatable strings, `environment.js` | ||||||
| -------------------------------------- |  | ||||||
| 
 | 
 | ||||||
| We use gettext to translate the GNOME Shell into all the languages that GNOME | We use gettext to translate the GNOME Shell into all the languages that GNOME | ||||||
| supports. The `gettext` function is aliased globally as `_`, you do not need to | supports. The `gettext` function is aliased globally as `_`, you do not need to | ||||||
| @@ -204,8 +197,7 @@ and "double quotes" for strings that the user may see. This allows us to | |||||||
| quickly find untranslated or mistranslated strings by grepping through the | quickly find untranslated or mistranslated strings by grepping through the | ||||||
| sources for double quotes without a gettext call around them. | sources for double quotes without a gettext call around them. | ||||||
| 
 | 
 | ||||||
| `actor` and `_delegate` | ## `actor` and `_delegate` | ||||||
| ----------------------- |  | ||||||
| 
 | 
 | ||||||
| gjs allows us to set so-called "expando properties" on introspected objects, | gjs allows us to set so-called "expando properties" on introspected objects, | ||||||
| allowing us to treat them like any other. Because the Shell was built before | allowing us to treat them like any other. Because the Shell was built before | ||||||
| @@ -214,7 +206,7 @@ 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 | ||||||
|     var MyClass = new Lang.Class({ |     var MyClass = new Lang.Class({ | ||||||
|         Name: 'MyClass', |         Name: 'MyClass', | ||||||
| 
 | 
 | ||||||
| @@ -229,6 +221,7 @@ the actor itself: | |||||||
|             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 | ||||||
| delegate object from an associated actor. For instance, the drag and drop | delegate object from an associated actor. For instance, the drag and drop | ||||||
| @@ -236,16 +229,14 @@ system calls the `handleDragOver` function on the delegate of a "drop target" | |||||||
| when the user drags an item over it. If you do not set the `_delegate` | when the user drags an item over it. If you do not set the `_delegate` | ||||||
| property, your actor will not be able to be dropped onto. | property, your actor will not be able to be dropped onto. | ||||||
| 
 | 
 | ||||||
| Functional style | ## Functional style | ||||||
| ---------------- |  | ||||||
| 
 | 
 | ||||||
| JavaScript Array objects offer a lot of common functional programming | JavaScript Array objects offer a lot of common functional programming | ||||||
| capabilities such as forEach, map, filter and so on. You can use these when | capabilities such as forEach, map, filter and so on. You can use these when | ||||||
| they make sense, but please don't have a spaghetti mess of function programming | they make sense, but please don't have a spaghetti mess of function programming | ||||||
| messed in a procedural style. Use your best judgment. | messed in a procedural style. Use your best judgment. | ||||||
| 
 | 
 | ||||||
| Closures | ## Closures | ||||||
| -------- |  | ||||||
| 
 | 
 | ||||||
| `this` will not be captured in a closure, it is relative to how the closure is | `this` will not be captured in a closure, it is relative to how the closure is | ||||||
| invoked, not to the value of this where the closure is created, because "this" | invoked, not to the value of this where the closure is created, because "this" | ||||||
| @@ -254,15 +245,16 @@ 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 | ||||||
|     const Lang = imports.lang; |     const Lang = imports.lang; | ||||||
| 
 | 
 | ||||||
|     let closure1 = () => { this._fnorbate(); }; |     let closure1 = () => { this._fnorbate(); }; | ||||||
|     let closure2 = this._fnorbate.bind(this); |     let closure2 = this._fnorbate.bind(this); | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| 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 | ||||||
|     const Lang = imports.lang; |     const Lang = imports.lang; | ||||||
|     const FnorbLib = imports.fborbLib; |     const FnorbLib = imports.fborbLib; | ||||||
| 
 | 
 | ||||||
| @@ -276,19 +268,21 @@ prototype: | |||||||
|             this._updateFnorb(); |             this._updateFnorb(); | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| Object literal syntax | ## Object literal syntax | ||||||
| --------------------- |  | ||||||
| 
 | 
 | ||||||
| In JavaScript, these are equivalent: | In JavaScript, these are equivalent: | ||||||
| 
 | ```javascript | ||||||
|     foo = { 'bar': 42 }; |     foo = { 'bar': 42 }; | ||||||
|     foo = { bar: 42 }; |     foo = { bar: 42 }; | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| and so are these: | and so are these: | ||||||
| 
 | ```javascript | ||||||
|     var b = foo['bar']; |     var b = foo['bar']; | ||||||
|     var b = foo.bar; |     var b = foo.bar; | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| If your usage of an object is like an object, then you're defining "member | If your usage of an object is like an object, then you're defining "member | ||||||
| variables." For member variables, use the no-quotes no-brackets syntax: `{ bar: | variables." For member variables, use the no-quotes no-brackets syntax: `{ bar: | ||||||
| @@ -298,14 +292,13 @@ If your usage of an object is like a hash table (and thus conceptually the keys | |||||||
| can have special chars in them), don't use quotes, but use brackets: `{ bar: 42 | can have special chars in them), don't use quotes, but use brackets: `{ bar: 42 | ||||||
| }`, `foo['bar']`. | }`, `foo['bar']`. | ||||||
| 
 | 
 | ||||||
| Getters, setters, and Tweener | ## Getters, setters, and Tweener | ||||||
| ----------------------------- |  | ||||||
| 
 | 
 | ||||||
| Getters and setters should be used when you are dealing with an API that is | Getters and setters should be used when you are dealing with an API that is | ||||||
| designed around setting properties, like Tweener. If you want to animate an | designed around setting properties, like Tweener. If you want to animate an | ||||||
| arbitrary property, create a getter and setter, and use Tweener to animate the | arbitrary property, create a getter and setter, and use Tweener to animate the | ||||||
| property. | property. | ||||||
| 
 | ```javascript | ||||||
|     var ANIMATION_TIME = 2000; |     var ANIMATION_TIME = 2000; | ||||||
| 
 | 
 | ||||||
|     var MyClass = new Lang.Class({ |     var MyClass = new Lang.Class({ | ||||||
| @@ -331,3 +324,4 @@ property. | |||||||
|                      { position: 100, |                      { position: 100, | ||||||
|                        time: ANIMATION_TIME, |                        time: ANIMATION_TIME, | ||||||
|                        transition: 'easeOutQuad' }); |                        transition: 'easeOutQuad' }); | ||||||
|  | ``` | ||||||
| @@ -1,7 +0,0 @@ | |||||||
| Owen Taylor |  | ||||||
| E-mail: otaylor@redhat.com |  | ||||||
| Userid: otaylor |  | ||||||
|  |  | ||||||
| Colin Walters |  | ||||||
| E-mail: walters@verbum.org |  | ||||||
| Userid: walters |  | ||||||
							
								
								
									
										107
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,3 +1,110 @@ | |||||||
|  | 3.29.90 | ||||||
|  | ======= | ||||||
|  | * Add remote access indication on wayland [Jonas; !160] | ||||||
|  | * Fix wrong window positions in overview on wayland [Marco; #776588] | ||||||
|  | * Add gesture to unfullscreen a window [Jan-Michael; !123] | ||||||
|  | * Add PickColor method to screenshot D-Bus interface [Florian; #286] | ||||||
|  | * Consider "new-window" action when opening new windows [Florian; #756844] | ||||||
|  | * Make workspace switching gestures follow motion [Carlos; #788994] | ||||||
|  | * Support audio volumes above 100% [Didier; #790280] | ||||||
|  | * Misc. bug fixes [Florian, Daniel; #424, !132, !182, #433, !179, #786496] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   Jonas Ådahl, Jan-Michael Brummer, Piotr Drąg, Daniel Drake, Carlos Garnacho, | ||||||
|  |   Florian Müllner, Georges Basile Stavracas Neto, Didier Roche, Jakub Steiner, | ||||||
|  |   Marco Trevisan (Treviño) | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   Charles Monzat [fr], Daniel Mustieles [es] | ||||||
|  |  | ||||||
|  | 3.29.4 | ||||||
|  | ====== | ||||||
|  | * Fix "Clear All" for calendar events [Florian; #325] | ||||||
|  | * Allow cancelling direct switch operations [Xavier; #315] | ||||||
|  | * Support being started by systemd --user [Iain; !137, !138] | ||||||
|  | * Support key event forwarding required by some input methods [Carlos; #275] | ||||||
|  | * Misc. bug fixes and cleanups [Jasper, Andrea, Florian; #663461, #372, !112, | ||||||
|  |   #414, !151] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   Andrea Azzarone, Carlos Garnacho, Xavier Johnson, Iain Lane, Florian Müllner, | ||||||
|  |   Jasper St. Pierre | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   Stas Solovey [ru] | ||||||
|  |  | ||||||
|  | 3.29.3 | ||||||
|  | ====== | ||||||
|  | * Save creation time in screenshot metadata [Florian; #790481] | ||||||
|  | * Improve consistency between ctrl- and middle-click on app icons [Xavier; #316] | ||||||
|  | * Add support for font-feature-settings CSS property [Ryan; #34] | ||||||
|  | * Adjust to MetaScreen removal [Jonas; #759538] | ||||||
|  | * Misc. bug fixes [Florian, Marco, Sam; #298, #788931, #26, #76, !54, #788882, | ||||||
|  |   #791233] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   Jonas Ådahl, Ryan Hendrickson, Xavier Johnson, Florian Müllner, Joe Rabinoff, | ||||||
|  |   Sam Spilsbury, Marco Trevisan (Treviño) | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   Gun Chleoc [gd], Yi-Jyun Pan [zh_TW], Cédric Valmary [oc], Jordi Mas [ca] | ||||||
|  |  | ||||||
|  | 3.29.2 | ||||||
|  | ====== | ||||||
|  | * Guard against untimely keyboard map changes [Carlos; #240] | ||||||
|  | * Fix icons in search provider results [Florian; #249] | ||||||
|  | * Fix blurriness of OSD under some resolutions [Silvère; #782011] | ||||||
|  | * Fix lagging pointer when zoomed [Daniel; #682013] | ||||||
|  | * Misc. bug fixes [Milan, Xiaoguang, Florian, Mario, Ole; #244, #787871, | ||||||
|  |   #781471, #136, #214, #294] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   Ole Jørgen Brønner, Milan Crha, Carlos Garnacho, Yussuf Khalil, | ||||||
|  |   Silvère Latchurié, Florian Müllner, Mario Sanchez Prada, Ray Strode, | ||||||
|  |   Daniel van Vugt, Xiaoguang Wang | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   Rafael Fontenelle [pt_BR], Kukuh Syafaat [id], Marcos Lans [gl], | ||||||
|  |   Anders Jonsson [sv], Mingcong Bai [zh_CN] | ||||||
|  |  | ||||||
|  | 3.29.1 | ||||||
|  | ====== | ||||||
|  | * Support icons in app-menu [Florian; #760985] | ||||||
|  | * Misc. bug fixes [Marco, Florian, Lubomir; #792687, #221, !63] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   Piotr Drąg, Takao Fujiwara, Christian Kellner, Florian Müllner, | ||||||
|  |   Mario Sanchez Prada, Lubomir Rintel, Didier Roche, Marco Trevisan (Treviño), | ||||||
|  |   verdre | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   gogo [hr], Stas Solovey [ru], Matej Urbančič [sl], Daniel Șerbănescu [ro], | ||||||
|  |   Fabio Tomat [fur], Marek Cernocky [cs], Daniel Mustieles [es] | ||||||
|  |  | ||||||
|  | 3.28.1 | ||||||
|  | ====== | ||||||
|  | * Fix compose characters in shell entries [Carlos; #115] | ||||||
|  | * Don't show authentication dialogs on lock screen [Florian; #179, #166] | ||||||
|  | * Fix handling of UTC timezone in world clock [Florian; #150] | ||||||
|  | * Fix keyboard navigation in overview when hovering windows [Florian; #50] | ||||||
|  | * Misc. bug fixes [Florian; #127, #788908, #763886, !39] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   Jeremy Bicha, Carlos Garnacho, Andy Holmes, Florian Müllner, Bastien Nocera | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   Stas Solovey [ru], Daniel Șerbănescu [ro], Dušan Kazik [sk], | ||||||
|  |   Rafael Fontenelle [pt_BR], Nathan Follens [nl], Dz Chen [zh_CN], | ||||||
|  |   Matej Urbančič [sl], Hannie Dumoleyn [nl], Khaled Hosny [ar], | ||||||
|  |   Guillaume Bernard [fr] | ||||||
|  |  | ||||||
|  | 3.28.0 | ||||||
|  | ====== | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   A S Alam [pa], gogo [hr], Chao-Hsiung Liao [zh_TW], Jordi Mas [ca], | ||||||
|  |   Anders Jonsson [sv], Balázs Úr [hu] | ||||||
|  |  | ||||||
| 3.27.92 | 3.27.92 | ||||||
| ======= | ======= | ||||||
| * Misc. bug fixes [Florian; #64, #66, #72] | * Misc. bug fixes [Florian; #64, #66, #72] | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | # GNOME Shell | ||||||
| GNOME Shell provides core user interface functions for the GNOME 3 desktop, | GNOME Shell provides core user interface functions for the GNOME 3 desktop, | ||||||
| like switching to windows and launching applications. GNOME Shell takes | like switching to windows and launching applications. GNOME Shell takes | ||||||
| advantage of the capabilities of modern graphics hardware and introduces | advantage of the capabilities of modern graphics hardware and introduces | ||||||
| @@ -6,15 +7,14 @@ easy to use experience. | |||||||
| 
 | 
 | ||||||
| For more information about GNOME Shell, including instructions on how | For more information about GNOME Shell, including instructions on how | ||||||
| to build GNOME Shell from source and how to get involved with the project, | to build GNOME Shell from source and how to get involved with the project, | ||||||
| see: | see the [project wiki][wiki] | ||||||
| 
 | 
 | ||||||
|  https://wiki.gnome.org/Projects/GnomeShell | Bugs should be reported to the GNOME [bug tracking system][bug-tracker]. | ||||||
| 
 | 
 | ||||||
| Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell' | ## License | ||||||
| product. |  | ||||||
| 
 |  | ||||||
| License |  | ||||||
| ======= |  | ||||||
| GNOME Shell is distributed under the terms of the GNU General Public License, | GNOME Shell is distributed under the terms of the GNU General Public License, | ||||||
| version 2 or later. See the COPYING file for details. | version 2 or later. See the [COPYING][license] file for details. | ||||||
| 
 | 
 | ||||||
|  | [project-wiki]: https://wiki.gnome.org/Projects/GnomeShell | ||||||
|  | [bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues | ||||||
|  | [license]: COPYING | ||||||
| @@ -4,14 +4,14 @@ the extensions repository to provide good integration, letting the website | |||||||
| know which extensions are enabled and disabled, and allowing the website to | know which extensions are enabled and disabled, and allowing the website to | ||||||
| enable, disable and install them. | enable, disable and install them. | ||||||
| 
 | 
 | ||||||
| Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell' | Bugs should be reported to the GNOME [bug tracking system][bug-tracker]. | ||||||
| product. |  | ||||||
| 
 | 
 | ||||||
| License | ## License | ||||||
| ======= |  | ||||||
| The GNOME Shell Browser Plugin, like GNOME Shell itself is distributed under | The GNOME Shell Browser Plugin, like GNOME Shell itself is distributed under | ||||||
| the GNU General Public License, version 2 or later. The plugin also contains | the GNU General Public License, version 2 or later. The plugin also contains | ||||||
| header files from the "NPAPI SDK" project, tri-licensed under MPL 1.1, GPL 2.0 | header files from the "NPAPI SDK" project, tri-licensed under MPL 1.1, GPL 2.0 | ||||||
| and LGPL 2.1. These headers are third-party sources and can be retrieved from: | and LGPL 2.1. These headers are third-party sources and can be retrieved from: | ||||||
| 
 | 
 | ||||||
|   http://code.google.com/p/npapi-sdk/ |   http://code.google.com/p/npapi-sdk/ | ||||||
|  | 
 | ||||||
|  | [bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues | ||||||
| @@ -24,3 +24,9 @@ | |||||||
|  |  | ||||||
| /* Define if _NL_TIME_FIRST_WEEKDATE is available */ | /* Define if _NL_TIME_FIRST_WEEKDATE is available */ | ||||||
| #mesondefine HAVE__NL_TIME_FIRST_WEEKDAY | #mesondefine HAVE__NL_TIME_FIRST_WEEKDAY | ||||||
|  |  | ||||||
|  | /* Define if you have the `g_desktop_app_info_launch_uris_as_manager_with_fds` function */ | ||||||
|  | #mesondefine HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS | ||||||
|  |  | ||||||
|  | /* Define if fdwalk is available in libc */ | ||||||
|  | #mesondefine HAVE_FDWALK | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								data/00_org.gnome.shell.gschema.override
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								data/00_org.gnome.shell.gschema.override
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | [org.gnome.mutter:GNOME] | ||||||
|  | attach-modal-dialogs=true | ||||||
|  | edge-tiling=true | ||||||
|  | dynamic-workspaces=true | ||||||
|  | workspaces-only-on-primary=true | ||||||
|  | focus-change-on-pointer-rest=true | ||||||
							
								
								
									
										5
									
								
								data/gnome-shell-overrides-migration.desktop.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								data/gnome-shell-overrides-migration.desktop.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | [Desktop Entry] | ||||||
|  | Type=Application | ||||||
|  | Name=GNOME settings overrides migration | ||||||
|  | NoDisplay=True | ||||||
|  | Exec=@libexecdir@/gnome-shell-overrides-migration.sh | ||||||
							
								
								
									
										5
									
								
								data/gnome-shell-wayland.target
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								data/gnome-shell-wayland.target
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=GNOME Shell (wayland sync point) | ||||||
|  | After=gnome-shell.service | ||||||
|  | BindsTo=gnome-shell.service | ||||||
|  | Conflicts=gnome-shell-x11.target | ||||||
							
								
								
									
										5
									
								
								data/gnome-shell-x11.target
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								data/gnome-shell-x11.target
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=GNOME Shell (x11 sync point) | ||||||
|  | After=gnome-shell.service | ||||||
|  | BindsTo=gnome-shell.service | ||||||
|  | Conflicts=gnome-shell-wayland.target | ||||||
							
								
								
									
										11
									
								
								data/gnome-shell.service.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								data/gnome-shell.service.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=GNOME Shell | ||||||
|  | Wants=gnome-session.service | ||||||
|  | After=graphical-session-pre.target gnome-session-bus.target | ||||||
|  | PartOf=graphical-session.target | ||||||
|  |  | ||||||
|  | [Service] | ||||||
|  | Type=dbus | ||||||
|  | ExecStart=@bindir@/gnome-shell | ||||||
|  | Restart=on-failure | ||||||
|  | BusName=org.gnome.Shell | ||||||
| @@ -92,6 +92,33 @@ schema = configure_file( | |||||||
|   configuration: schemaconf, |   configuration: schemaconf, | ||||||
|   install_dir: schemadir |   install_dir: schemadir | ||||||
| ) | ) | ||||||
|  | install_data('00_org.gnome.shell.gschema.override', install_dir: schemadir) | ||||||
|  |  | ||||||
|  | overrides_migration_conf = configuration_data() | ||||||
|  | overrides_migration_conf.set('libexecdir', libexecdir) | ||||||
|  | overrides_migration = configure_file( | ||||||
|  |   input: 'gnome-shell-overrides-migration.desktop.in', | ||||||
|  |   output: 'gnome-shell-overrides-migration.desktop', | ||||||
|  |   configuration: overrides_migration_conf, | ||||||
|  |   install_dir: autostartdir | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | if have_systemd | ||||||
|  |   unitconf = configuration_data() | ||||||
|  |   unitconf.set('bindir', bindir) | ||||||
|  |  | ||||||
|  |   unit = configure_file( | ||||||
|  |     input: 'gnome-shell.service.in', | ||||||
|  |     output: 'gnome-shell.service', | ||||||
|  |     configuration: unitconf, | ||||||
|  |     install_dir: systemduserunitdir | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   units = files('gnome-shell-wayland.target', | ||||||
|  |                 'gnome-shell-x11.target') | ||||||
|  |  | ||||||
|  |   install_data(units, install_dir: systemduserunitdir) | ||||||
|  | endif | ||||||
|  |  | ||||||
| # for unit tests - gnome.compile_schemas() only looks in srcdir | # for unit tests - gnome.compile_schemas() only looks in srcdir | ||||||
| custom_target('compile-schemas', | custom_target('compile-schemas', | ||||||
|   | |||||||
| @@ -91,6 +91,23 @@ | |||||||
|       <arg type="s" direction="out" name="filename_used"/> |       <arg type="s" direction="out" name="filename_used"/> | ||||||
|     </method> |     </method> | ||||||
|  |  | ||||||
|  |     <!-- | ||||||
|  |         PickColor: | ||||||
|  |  | ||||||
|  |         Picks a color and returns the result. | ||||||
|  |  | ||||||
|  |         The @result vardict contains: | ||||||
|  |         <variablelist> | ||||||
|  |           <varlistentry> | ||||||
|  |             <term>color (ddd)</term> | ||||||
|  |             <listitem><para>The color, RGB values in the range [0,1].</para></listitem> | ||||||
|  |           </varlistentry> | ||||||
|  |         </variablelist> | ||||||
|  |     --> | ||||||
|  |     <method name="PickColor"> | ||||||
|  |       <arg type="a{sv}" direction="out" name="result"/> | ||||||
|  |     </method> | ||||||
|  |  | ||||||
|     <!-- |     <!-- | ||||||
|         FlashArea: |         FlashArea: | ||||||
|         @x: the X coordinate of the area to flash |         @x: the X coordinate of the area to flash | ||||||
|   | |||||||
| @@ -190,6 +190,7 @@ | |||||||
|     </key> |     </key> | ||||||
|   </schema> |   </schema> | ||||||
|  |  | ||||||
|  |   <!-- unused, change 00_org.gnome.shell.gschema.override instead --!> | ||||||
|   <schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/" |   <schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/" | ||||||
| 	  gettext-domain="@GETTEXT_PACKAGE@"> | 	  gettext-domain="@GETTEXT_PACKAGE@"> | ||||||
|     <key name="attach-modal-dialogs" type="b"> |     <key name="attach-modal-dialogs" type="b"> | ||||||
|   | |||||||
| @@ -1,3 +0,0 @@ | |||||||
| To generate the css files, from the project directory: |  | ||||||
|  |  | ||||||
| sass --sourcemap=none --update . |  | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| Summary |  | ||||||
| ------- |  | ||||||
|  |  | ||||||
| * Do not edit the CSS directly, edit the source SCSS files and the CSS files will be generated |  | ||||||
|   automatically when building with meson + ninja and left inside the build directory to be |  | ||||||
|   incorporated into the gresource XML (you'll need to have sassc installed). |  | ||||||
|  |  | ||||||
| How to tweak the theme |  | ||||||
| ---------------------- |  | ||||||
|  |  | ||||||
| Adwaita is a complex theme, so to keep it maintainable it's written and processed in SASS, the |  | ||||||
| generated CSS is then transformed into a gresource file during gtk build and used at runtime in a  |  | ||||||
| non-legible or editable form. |  | ||||||
|  |  | ||||||
| It is very likely your change will happen in the _common.scss file. That's where all the widget  |  | ||||||
| selectors are defined. Here's a rundown of the "supporting" stylesheets, that are unlikely to be the  |  | ||||||
| right place for a drive by stylesheet fix: |  | ||||||
|  |  | ||||||
| _colors.scss        - global color definitions. We keep the number of defined colors to a necessary minimum,  |  | ||||||
|                       most colors are derived from a handful of basics. It is an exact copy of the gtk+  |  | ||||||
|                       counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell  |  | ||||||
|                       default. |  | ||||||
|  |  | ||||||
| _drawing.scss       - drawing helper mixings/functions to allow easier definition of widget drawing under |  | ||||||
|                       specific context. This is why Adwaita isn't 15000 LOC. |  | ||||||
|  |  | ||||||
| _common.scss        - actual definitions of style for each widget. This is where you are likely to add/remove |  | ||||||
|                       your changes. |  | ||||||
|                        |  | ||||||
| You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the |  | ||||||
| _common.scss file, you can run ninja to generate the final CSS files. |  | ||||||
							
								
								
									
										32
									
								
								data/theme/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								data/theme/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | ## Summary | ||||||
|  |  | ||||||
|  | Do not edit the CSS directly, edit the source SCSS files and the CSS files | ||||||
|  | will be generated automatically when building with meson + ninja and left | ||||||
|  | inside the build directory to be incorporated into the gresource XML (you'll | ||||||
|  | need to have sassc installed). | ||||||
|  |  | ||||||
|  | ## How to tweak the theme | ||||||
|  |  | ||||||
|  | Adwaita is a complex theme, so to keep it maintainable it's written and | ||||||
|  | processed in SASS, the generated CSS is then transformed into a gresource | ||||||
|  | file during gtk build and used at runtime in a non-legible or editable form. | ||||||
|  |  | ||||||
|  | It is very likely your change will happen in the [_common.scss][common] file. | ||||||
|  | That's where all the widget selectors are defined. Here's a rundown of | ||||||
|  | the "supporting" stylesheets, that are unlikely to be the right place | ||||||
|  | for a drive by stylesheet fix: | ||||||
|  |  | ||||||
|  | | File                     | Description       | | ||||||
|  | | ------------------------ | ----------------- | | ||||||
|  | | [_colors.scss][colors]   | global color definitions. We keep the number of defined colors to a necessary minimum,  most colors are derived from a handful of basics. It is an exact copy of the gtk+ counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell default. | | ||||||
|  | | [_drawing.scss][drawing] | drawing helper mixings/functions to allow easier definition of widget drawing under specific context. This is why Adwaita isn't 15000 LOC. | | ||||||
|  | | [_common.scss][common]   | actual definitions of style for each widget. This is where you are likely to add/remove your changes. | | ||||||
|  |  | ||||||
|  | You can read about SASS on its [web page][sass-web]. Once you make your | ||||||
|  | changes to the [_common.scss][common] file, you can run ninja to generate the | ||||||
|  | final CSS files. | ||||||
|  |  | ||||||
|  | [common]: data/theme/gnome-shell-sass/_common.scss | ||||||
|  | [colors]: data/theme/gnome-shell-sass/_colors.scss | ||||||
|  | [drawing]: data/theme/gnome-shell-sass/_drawing.scss | ||||||
|  | [sass-web]: http://sass-lang.com/documentation/ | ||||||
| @@ -1,6 +0,0 @@ | |||||||
| --- Generating the css file --- |  | ||||||
|  |  | ||||||
| You need sass to generate the css file. |  | ||||||
|  |  | ||||||
| To generate them run from a command line in the project directory: |  | ||||||
| sass --sourcemap=none --update ./ |  | ||||||
| @@ -1,7 +0,0 @@ | |||||||
| GNOME Shell Sass is a project intended to allow the sharing of the theme sources in sass between gnome-shell and other projects like gnome-shell-extensions. |  | ||||||
|  |  | ||||||
| License |  | ||||||
| ======= |  | ||||||
| GNOME Shell Sass is distributed under the terms of the GNU General Public License, |  | ||||||
| version 2 or later. See the COPYING file for details. |  | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								data/theme/gnome-shell-sass/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								data/theme/gnome-shell-sass/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | # GNOME Shell Sass | ||||||
|  | GNOME Shell Sass is a project intended to allow the sharing of the | ||||||
|  | theme sources in sass between gnome-shell and other projects like | ||||||
|  | gnome-shell-extensions. | ||||||
|  |  | ||||||
|  | Any changes should be done in the [GNOME Shell subtree][shell-subtree] | ||||||
|  | and not the stand-alone [gnome-shell-sass repository][sass-repo]. They | ||||||
|  | will then be synchronized periodically before releases. | ||||||
|  |  | ||||||
|  | ## License | ||||||
|  | GNOME Shell Sass is distributed under the terms of the GNU General Public | ||||||
|  | License, version 2 or later. See the [COPYING][license] file for details. | ||||||
|  |  | ||||||
|  | [shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass | ||||||
|  | [sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass | ||||||
|  | [license]: COPYING | ||||||
| @@ -128,12 +128,15 @@ StScrollBar { | |||||||
|  |  | ||||||
| .slider { | .slider { | ||||||
|   height: 1em; |   height: 1em; | ||||||
|   -slider-height: 0.3em; |   -barlevel-height: 0.3em; | ||||||
|   -slider-background-color: $insensitive_bg_color; //background of the trough |   -barlevel-background-color: $insensitive_bg_color; //background of the trough | ||||||
|   -slider-border-color: $borders_color; //trough border color |   -barlevel-border-color: $borders_color; //trough border color | ||||||
|   -slider-active-background-color: $selected_bg_color; //active trough fill |   -barlevel-active-background-color: $selected_bg_color; //active trough fill | ||||||
|   -slider-active-border-color: darken($selected_bg_color,10%); //active trough border |   -barlevel-active-border-color: darken($selected_bg_color,10%); //active trough border | ||||||
|   -slider-border-width: 1px; |   -barlevel-overdrive-color: $destructive_color; | ||||||
|  |   -barlevel-overdrive-border-color: darken($destructive_color,10%); | ||||||
|  |   -barlevel-overdrive-separator-width: 0.2em; | ||||||
|  |   -barlevel-border-width: 1px; | ||||||
|   -slider-handle-radius: 6px; |   -slider-handle-radius: 6px; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -585,13 +588,11 @@ StScrollBar { | |||||||
|   .osd-monitor-label { font-size: 3em; } |   .osd-monitor-label { font-size: 3em; } | ||||||
|   .level { |   .level { | ||||||
|     height: 0.6em; |     height: 0.6em; | ||||||
|     border-radius: 0.3em; |     -barlevel-height: 0.6em; | ||||||
|     background-color: transparentize(darken($osd_bg_color,15%),0.5); |     -barlevel-background-color: transparentize(darken($osd_bg_color,15%),0.5); | ||||||
|     color: $osd_fg_color; |     -barlevel-active-background-color: $osd_fg_color; | ||||||
|   } |     -barlevel-overdrive-color: $destructive_color; | ||||||
|   .level-bar { |     -barlevel-overdrive-separator-width: 0.2em; | ||||||
|     background-color: $osd_fg_color; |  | ||||||
|     border-radius: 0.3em; |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -733,6 +734,7 @@ StScrollBar { | |||||||
|   transition-duration: 500ms; |   transition-duration: 500ms; | ||||||
|   font-weight: bold; |   font-weight: bold; | ||||||
|   height: 1.86em; |   height: 1.86em; | ||||||
|  |   font-feature-settings: "tnum"; | ||||||
|  |  | ||||||
|   &.unlock-screen, |   &.unlock-screen, | ||||||
|   &.login-screen, |   &.login-screen, | ||||||
| @@ -824,6 +826,8 @@ StScrollBar { | |||||||
|  |  | ||||||
|   .screencast-indicator { color: $warning_color; } |   .screencast-indicator { color: $warning_color; } | ||||||
|  |  | ||||||
|  |   .remote-access-indicator { color: $warning_color; } | ||||||
|  |  | ||||||
|   &.solid { |   &.solid { | ||||||
|     background-color: black; |     background-color: black; | ||||||
|     /* transition from transparent to solid */ |     /* transition from transparent to solid */ | ||||||
| @@ -958,6 +962,7 @@ StScrollBar { | |||||||
|       padding: 0.1em; |       padding: 0.1em; | ||||||
|       margin: 2px; |       margin: 2px; | ||||||
|       border-radius: 1.4em; |       border-radius: 1.4em; | ||||||
|  |       font-feature-settings: "tnum"; | ||||||
|       &:hover,&:focus { background-color: lighten($bg_color,5%); } |       &:hover,&:focus { background-color: lighten($bg_color,5%); } | ||||||
|       &:active,&:selected { |       &:active,&:selected { | ||||||
|         color: lighten($selected_fg_color,5%); |         color: lighten($selected_fg_color,5%); | ||||||
| @@ -1111,7 +1116,7 @@ StScrollBar { | |||||||
|   .aggregate-menu { |   .aggregate-menu { | ||||||
|     min-width: 21em; |     min-width: 21em; | ||||||
|     .popup-menu-icon { padding: 0 4px; } |     .popup-menu-icon { padding: 0 4px; } | ||||||
|     .popup-sub-menu .popup-menu-item :first-child { |     .popup-sub-menu .popup-menu-item > :first-child { | ||||||
|       &:ltr { /* 12px spacing + 2*4px padding */ |       &:ltr { /* 12px spacing + 2*4px padding */ | ||||||
|               padding-left: 20px; margin-left: 1.09em; } |               padding-left: 20px; margin-left: 1.09em; } | ||||||
|       &:rtl { /* 12px spacing + 2*4px padding */ |       &:rtl { /* 12px spacing + 2*4px padding */ | ||||||
| @@ -1120,6 +1125,7 @@ StScrollBar { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   .system-menu-action { |   .system-menu-action { | ||||||
|  |     -st-icon-style: symbolic; | ||||||
|     color: $fg_color; |     color: $fg_color; | ||||||
|     border-radius: 32px; /* wish we could do 50% */ |     border-radius: 32px; /* wish we could do 50% */ | ||||||
|     padding: 13px; |     padding: 13px; | ||||||
| @@ -1788,20 +1794,19 @@ StScrollBar { | |||||||
|   .login-dialog-user-list-view { -st-vfade-offset: 1em; } |   .login-dialog-user-list-view { -st-vfade-offset: 1em; } | ||||||
|   .login-dialog-user-list { |   .login-dialog-user-list { | ||||||
|     spacing: 12px; |     spacing: 12px; | ||||||
|     padding: .2em; |  | ||||||
|     width: 23em; |     width: 23em; | ||||||
|     &:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; } |     &:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; } | ||||||
|     &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; } |     &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; } | ||||||
|   } |   } | ||||||
|   .login-dialog-user-list-item { |   .login-dialog-user-list-item { | ||||||
|     border-radius: 5px; |     border-radius: 5px; | ||||||
|     padding: .2em; |     padding: 6px; | ||||||
|     color: darken($osd_fg_color,30%); |     color: darken($osd_fg_color,30%); | ||||||
|     &:ltr { padding-right: 1em; } |     &:ltr .user-widget { padding-right: 1em; } | ||||||
|     &:rtl { padding-left: 1em; } |     &:rtl .user-widget { padding-left: 1em; } | ||||||
|     .login-dialog-timed-login-indicator { |     .login-dialog-timed-login-indicator { | ||||||
|       height: 2px; |       height: 2px; | ||||||
|       margin: 2px 0 0 0; |       margin-top: 6px; | ||||||
|       background-color: $osd_fg_color; |       background-color: $osd_fg_color; | ||||||
|     } |     } | ||||||
|     &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; } |     &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; } | ||||||
| @@ -1816,8 +1821,8 @@ StScrollBar { | |||||||
|     padding-left: 15px; |     padding-left: 15px; | ||||||
|   } |   } | ||||||
|     .user-widget-label { |     .user-widget-label { | ||||||
|       &:ltr { padding-left: 18px; } |       &:ltr { padding-left: 14px; } | ||||||
|       &:rtl { padding-right: 18px; } |       &:rtl { padding-right: 14px; } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   .login-dialog-prompt-layout { |   .login-dialog-prompt-layout { | ||||||
| @@ -1868,6 +1873,7 @@ StScrollBar { | |||||||
| .screen-shield-clock-time { | .screen-shield-clock-time { | ||||||
|   font-size: 72pt; |   font-size: 72pt; | ||||||
|   text-shadow: 0px 2px 2px rgba(0,0,0,0.4); |   text-shadow: 0px 2px 2px rgba(0,0,0,0.4); | ||||||
|  |   font-feature-settings: "tnum"; | ||||||
| } | } | ||||||
|  |  | ||||||
| .screen-shield-clock-date {  | .screen-shield-clock-date {  | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ | |||||||
|    id="svg7384" |    id="svg7384" | ||||||
|    height="32" |    height="32" | ||||||
|    sodipodi:docname="key-layout.svg" |    sodipodi:docname="key-layout.svg" | ||||||
|    inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> |    inkscape:version="0.92.3 (2405546, 2018-03-11)"> | ||||||
|   <sodipodi:namedview |   <sodipodi:namedview | ||||||
|      pagecolor="#ffffff" |      pagecolor="#ffffff" | ||||||
|      bordercolor="#666666" |      bordercolor="#666666" | ||||||
| @@ -24,17 +24,21 @@ | |||||||
|      guidetolerance="10" |      guidetolerance="10" | ||||||
|      inkscape:pageopacity="0" |      inkscape:pageopacity="0" | ||||||
|      inkscape:pageshadow="2" |      inkscape:pageshadow="2" | ||||||
|      inkscape:window-width="1919" |      inkscape:window-width="3440" | ||||||
|      inkscape:window-height="1011" |      inkscape:window-height="1376" | ||||||
|      id="namedview19" |      id="namedview19" | ||||||
|      showgrid="false" |      showgrid="false" | ||||||
|      inkscape:zoom="14.75" |      inkscape:zoom="1" | ||||||
|      inkscape:cx="1.220339" |      inkscape:cx="46.246852" | ||||||
|      inkscape:cy="11.842802" |      inkscape:cy="17.474578" | ||||||
|      inkscape:window-x="0" |      inkscape:window-x="0" | ||||||
|      inkscape:window-y="55" |      inkscape:window-y="27" | ||||||
|      inkscape:window-maximized="0" |      inkscape:window-maximized="1" | ||||||
|      inkscape:current-layer="svg7384" /> |      inkscape:current-layer="svg7384"> | ||||||
|  |     <inkscape:grid | ||||||
|  |        type="xygrid" | ||||||
|  |        id="grid861" /> | ||||||
|  |   </sodipodi:namedview> | ||||||
|   <metadata |   <metadata | ||||||
|      id="metadata90"> |      id="metadata90"> | ||||||
|     <rdf:RDF> |     <rdf:RDF> | ||||||
| @@ -92,23 +96,34 @@ | |||||||
|      style="display:inline" |      style="display:inline" | ||||||
|      id="g4953" /> |      id="g4953" /> | ||||||
|   <g |   <g | ||||||
|  |      style="stroke-width:0.5;enable-background:new" | ||||||
|  |      id="g3561" | ||||||
|      inkscape:label="preferences-desktop-locale" |      inkscape:label="preferences-desktop-locale" | ||||||
|      id="g11728" |      transform="matrix(2,0,0,2,135.99464,-895.9793)"> | ||||||
|      transform="matrix(2,0,0,2,-522.0004,-1086)" |  | ||||||
|      style="display:inline;stroke-width:1"> |  | ||||||
|     <rect |  | ||||||
|        style="fill:none;stroke:none;stroke-width:1" |  | ||||||
|        id="rect11724" |  | ||||||
|        width="16" |  | ||||||
|        height="16" |  | ||||||
|        x="20" |  | ||||||
|        y="326" |  | ||||||
|        transform="translate(241.0002,217)" /> |  | ||||||
|     <path |     <path | ||||||
|        style="fill:#e5e5e5;fill-opacity:1;stroke:none;stroke-width:1" |        sodipodi:nodetypes="cc" | ||||||
|        d="m 265.69612,545.23396 c -3.58218,0 -4.66582,1.39975 -4.66582,1.39975 v 10.04946 c 0,0 1.08364,-1.07673 4.66582,-1.07673 2.9161,0 4.47225,1.07673 7.17818,1.07673 2.08923,0 3.19429,-1.39975 3.19429,-1.39975 v -10.04946 c 0,0 -1.14095,1.04084 -3.23018,1.04084 -3.3734,0 -3.97619,-1.04084 -7.14229,-1.04084 z m 2.93145,2.77148 c 1.32876,0 2.375,1.08037 2.375,2.4375 0,1.35713 -1.04624,2.46875 -2.375,2.46875 -1.32876,0 -2.40625,-1.11162 -2.40625,-2.46875 0,-1.35713 1.07749,-2.4375 2.40625,-2.4375 z m -4.5625,0.96875 0.96875,1.03125 -0.9375,-0.0312 0.9375,1 -0.96875,-0.0312 0.96875,1.03125 -1,-0.0312 0.0312,-1 h -0.0312 l 0.0312,-0.9688 h -0.0312 z m 4.5625,0 c -0.794,0 -1.46875,0.6578 -1.46875,1.46875 0,0.81095 0.67475,1.46875 1.46875,1.46875 0.79399,0 1.4375,-0.6578 1.4375,-1.46875 0,-0.81095 -0.64351,-1.46875 -1.4375,-1.46875 z m 4.375,0 v 1 l 0.0312,0.96875 h -0.0312 l 0.0312,1 -1,0.0312 0.96875,-1.03125 -0.96875,0.0312 0.9375,-1 -0.9375,0.0312 z m -7.9375,2.96875 0.96875,1.03125 -1,-0.0312 z m 6.9375,0 0.0312,1 -1,0.0312 z m -5.9375,1 0.96875,1.03125 -1,-0.0312 z m 4.9375,0 0.0312,1 -1,0.0312 z" |  | ||||||
|        id="path11726" |  | ||||||
|        inkscape:connector-curvature="0" |        inkscape:connector-curvature="0" | ||||||
|        sodipodi:nodetypes="sccssccsssssssccccccccccccsssssccccccccccccccccccccccccccc" /> |        id="path3535" | ||||||
|  |        d="m -65,450 v 12" | ||||||
|  |        style="fill:#e5e5e5;fill-opacity:1;fill-rule:evenodd;stroke:#e5e5e5;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> | ||||||
|  |     <path | ||||||
|  |        sodipodi:nodetypes="ccccccccc" | ||||||
|  |        inkscape:connector-curvature="0" | ||||||
|  |        id="path3537" | ||||||
|  |        d="m -65,456 h 4 l 1,2 h 5 v -6 h -4 l -1,-2 h -5 z" | ||||||
|  |        style="fill:none;fill-rule:evenodd;stroke:#e5e5e5;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> | ||||||
|  |     <path | ||||||
|  |        style="opacity:1;vector-effect:none;fill:#e5e5e5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||||
|  |        d="m -65,456 h 4 l 1,2 h 5 v -6 h -4 l -1,-2 h -5 z" | ||||||
|  |        id="path3539" | ||||||
|  |        inkscape:connector-curvature="0" | ||||||
|  |        sodipodi:nodetypes="ccccccccc" /> | ||||||
|  |     <rect | ||||||
|  |        style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0.89050001;marker:none;enable-background:new" | ||||||
|  |        id="rect3543" | ||||||
|  |        y="448" | ||||||
|  |        x="-68" | ||||||
|  |        height="16" | ||||||
|  |        width="16" /> | ||||||
|   </g> |   </g> | ||||||
| </svg> | </svg> | ||||||
|   | |||||||
| Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.2 KiB | 
| @@ -13,10 +13,102 @@ | |||||||
|    height="64px" |    height="64px" | ||||||
|    id="svg3393" |    id="svg3393" | ||||||
|    version="1.1" |    version="1.1" | ||||||
|    inkscape:version="0.48.5 r10040" |    inkscape:version="0.92.3 (2405546, 2018-03-11)" | ||||||
|    sodipodi:docname="New document 2"> |    sodipodi:docname="no-notifications.svg"> | ||||||
|   <defs |   <defs | ||||||
|      id="defs3395" /> |      id="defs3395"> | ||||||
|  |     <clipPath | ||||||
|  |        id="clipPath6262-0" | ||||||
|  |        clipPathUnits="userSpaceOnUse"> | ||||||
|  |       <rect | ||||||
|  |          style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none" | ||||||
|  |          id="rect6264-6" | ||||||
|  |          width="3.8250003" | ||||||
|  |          height="6.3750005" | ||||||
|  |          x="26.849981" | ||||||
|  |          y="220.75" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <clipPath | ||||||
|  |        id="clipPath6258-0" | ||||||
|  |        clipPathUnits="userSpaceOnUse"> | ||||||
|  |       <rect | ||||||
|  |          style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none" | ||||||
|  |          id="rect6260-6" | ||||||
|  |          width="2.8977275" | ||||||
|  |          height="5.3129687" | ||||||
|  |          x="26.965673" | ||||||
|  |          y="221.28162" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <clipPath | ||||||
|  |        id="clipPath6254-6" | ||||||
|  |        clipPathUnits="userSpaceOnUse"> | ||||||
|  |       <rect | ||||||
|  |          style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none" | ||||||
|  |          id="rect6256-6" | ||||||
|  |          width="1.876245" | ||||||
|  |          height="4.8783236" | ||||||
|  |          x="26.998718" | ||||||
|  |          y="221.50153" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <clipPath | ||||||
|  |        id="clipPath8028-3" | ||||||
|  |        clipPathUnits="userSpaceOnUse"> | ||||||
|  |       <path | ||||||
|  |          style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||||
|  |          d="m -73,-30 -7,-7 v -4.5 h 16.5 v 4.5 l -7.5,7 z" | ||||||
|  |          id="path8030-6" | ||||||
|  |          inkscape:connector-curvature="0" | ||||||
|  |          sodipodi:nodetypes="ccccccc" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <clipPath | ||||||
|  |        clipPathUnits="userSpaceOnUse" | ||||||
|  |        id="clipPath6810-7-87-7"> | ||||||
|  |       <rect | ||||||
|  |          style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" | ||||||
|  |          id="rect6812-2-4-5" | ||||||
|  |          width="14" | ||||||
|  |          height="11" | ||||||
|  |          x="21" | ||||||
|  |          y="281" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <clipPath | ||||||
|  |        id="clipPath6262" | ||||||
|  |        clipPathUnits="userSpaceOnUse"> | ||||||
|  |       <rect | ||||||
|  |          style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none" | ||||||
|  |          id="rect6264" | ||||||
|  |          width="3.8250003" | ||||||
|  |          height="6.3750005" | ||||||
|  |          x="26.849981" | ||||||
|  |          y="220.75" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <clipPath | ||||||
|  |        id="clipPath6258" | ||||||
|  |        clipPathUnits="userSpaceOnUse"> | ||||||
|  |       <rect | ||||||
|  |          style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none" | ||||||
|  |          id="rect6260" | ||||||
|  |          width="2.8977275" | ||||||
|  |          height="5.3129687" | ||||||
|  |          x="26.965673" | ||||||
|  |          y="221.28162" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <clipPath | ||||||
|  |        id="clipPath6254" | ||||||
|  |        clipPathUnits="userSpaceOnUse"> | ||||||
|  |       <rect | ||||||
|  |          style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none" | ||||||
|  |          id="rect6256" | ||||||
|  |          width="1.876245" | ||||||
|  |          height="4.8783236" | ||||||
|  |          x="26.998718" | ||||||
|  |          y="221.50153" /> | ||||||
|  |     </clipPath> | ||||||
|  |     <inkscape:path-effect | ||||||
|  |        effect="spiro" | ||||||
|  |        id="path-effect3951" | ||||||
|  |        is_visible="true" /> | ||||||
|  |   </defs> | ||||||
|   <sodipodi:namedview |   <sodipodi:namedview | ||||||
|      id="base" |      id="base" | ||||||
|      pagecolor="#ffffff" |      pagecolor="#ffffff" | ||||||
| @@ -24,17 +116,17 @@ | |||||||
|      borderopacity="1.0" |      borderopacity="1.0" | ||||||
|      inkscape:pageopacity="0.0" |      inkscape:pageopacity="0.0" | ||||||
|      inkscape:pageshadow="2" |      inkscape:pageshadow="2" | ||||||
|      inkscape:zoom="5.5" |      inkscape:zoom="1" | ||||||
|      inkscape:cx="32" |      inkscape:cx="125.08157" | ||||||
|      inkscape:cy="32" |      inkscape:cy="-13.805087" | ||||||
|      inkscape:current-layer="layer1" |      inkscape:current-layer="layer1" | ||||||
|      showgrid="true" |      showgrid="true" | ||||||
|      inkscape:document-units="px" |      inkscape:document-units="px" | ||||||
|      inkscape:grid-bbox="true" |      inkscape:grid-bbox="true" | ||||||
|      inkscape:window-width="697" |      inkscape:window-width="1664" | ||||||
|      inkscape:window-height="613" |      inkscape:window-height="1034" | ||||||
|      inkscape:window-x="100" |      inkscape:window-x="1479" | ||||||
|      inkscape:window-y="77" |      inkscape:window-y="252" | ||||||
|      inkscape:window-maximized="0" /> |      inkscape:window-maximized="0" /> | ||||||
|   <metadata |   <metadata | ||||||
|      id="metadata3398"> |      id="metadata3398"> | ||||||
| @@ -54,7 +146,7 @@ | |||||||
|      inkscape:groupmode="layer"> |      inkscape:groupmode="layer"> | ||||||
|     <g |     <g | ||||||
|        style="display:inline" |        style="display:inline" | ||||||
|        transform="matrix(4,0,0,4,0.29733827,-0.35415646)" |        transform="matrix(4,0,0,4,-79.702662,-0.35415646)" | ||||||
|        id="g19245"> |        id="g19245"> | ||||||
|       <g |       <g | ||||||
|          id="g19247" |          id="g19247" | ||||||
| @@ -71,15 +163,15 @@ | |||||||
|          transform="translate(-323.02908,-649.02581)"> |          transform="translate(-323.02908,-649.02581)"> | ||||||
|         <path |         <path | ||||||
|            inkscape:connector-curvature="0" |            inkscape:connector-curvature="0" | ||||||
|            d="m 331.9377,653 c 0.0187,0.16677 0.0625,0.32822 0.0625,0.5 0,2.48528 -2.01472,4.5 -4.5,4.5 -0.11769,0 -0.22834,-0.0224 -0.34375,-0.0312 l 0,2.21875 c 0,1.00412 0.80838,1.8125 1.8125,1.8125 l 1.54511,-5e-5 2,2.04688 2.0625,-2.04688 1.61114,0 c 1.00413,0 1.8125,-0.80838 1.8125,-1.8125 l 0,-5.375 c 0,-1.00412 -0.80837,-1.8125 -1.8125,-1.8125 z" |            d="m 331.9377,653 c 0.0187,0.16677 0.0625,0.32822 0.0625,0.5 0,2.48528 -2.01472,4.5 -4.5,4.5 -0.11769,0 -0.22834,-0.0224 -0.34375,-0.0312 v 2.21875 c 0,1.00412 0.80838,1.8125 1.8125,1.8125 l 1.54511,-5e-5 2,2.04688 2.0625,-2.04688 h 1.61114 c 1.00413,0 1.8125,-0.80838 1.8125,-1.8125 v -5.375 c 0,-1.00412 -0.80837,-1.8125 -1.8125,-1.8125 z" | ||||||
|            id="path19253" |            id="path19253" | ||||||
|            sodipodi:nodetypes="csscsscccssssc" |            sodipodi:nodetypes="csscsscccssssc" | ||||||
|            style="opacity:0.5;color:#000000;fill:#c3c3c3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> |            style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#c3c3c3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" /> | ||||||
|         <path |         <path | ||||||
|            inkscape:connector-curvature="0" |            inkscape:connector-curvature="0" | ||||||
|            d="m 327.5002,650 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.53125,1 1.03125,0 -0.0625,1.375 a 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.125,0.125 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 l 1.15625,-0.75 0.5,0.90625 -1.21875,0.625 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0.0937 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0625 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0312 l 1.25,0.625 -0.53125,0.90625 -1.15625,-0.781 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,0 0.19951718,0.19951718 0 0 0 -0.125,0.0937 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0,0.0625 l 0.0625,1.3751 -1.03125,0 0.0937,-1.375 a 0.19951718,0.19951718 0 0 0 -0.0312,-0.0937 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0937,0.0312 l -1.1875,0.78125 -0.5,-0.90625 1.25,-0.625 a 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0312,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 l -1.25,-0.625 0.5,-0.90625 1.1875,0.75 a 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 L 326.96895,651 z" |            d="m 327.5002,650 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.53125,1 h 1.03125 l -0.0625,1.375 a 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.125,0.125 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 l 1.15625,-0.75 0.5,0.90625 -1.21875,0.625 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0.0937 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0625 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0312 l 1.25,0.625 -0.53125,0.90625 -1.15625,-0.781 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,0 0.19951718,0.19951718 0 0 0 -0.125,0.0937 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0,0.0625 L 328.0002,656 h -1.03125 l 0.0937,-1.375 a 0.19951718,0.19951718 0 0 0 -0.0312,-0.0937 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0937,0.0312 l -1.1875,0.78125 -0.5,-0.90625 1.25,-0.625 a 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0312,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 l -1.25,-0.625 0.5,-0.90625 1.1875,0.75 a 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 z" | ||||||
|            id="path19255" |            id="path19255" | ||||||
|            style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> |            style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate" /> | ||||||
|       </g> |       </g> | ||||||
|       <g |       <g | ||||||
|          id="g19257" |          id="g19257" | ||||||
| @@ -110,5 +202,22 @@ | |||||||
|          style="display:inline" |          style="display:inline" | ||||||
|          transform="translate(-323.02908,-649.02581)" /> |          transform="translate(-323.02908,-649.02581)" /> | ||||||
|     </g> |     </g> | ||||||
|  |     <g | ||||||
|  |        style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" | ||||||
|  |        inkscape:label="preferences-system-notifications" | ||||||
|  |        id="g13967" | ||||||
|  |        transform="matrix(4,0,0,4,-1044.0008,-2172)"> | ||||||
|  |       <path | ||||||
|  |          inkscape:connector-curvature="0" | ||||||
|  |          d="m 268.94244,544.94838 c -2.20914,0 -3.33013,1.5 -4,4 l -1,5 c -0.10831,0.54156 -0.44772,1 -1,1 v 1 h 12 v -1 c -0.55229,0 -0.89169,-0.45844 -1,-1 l -1,-5 c -0.53033,-2.5 -1.79086,-4 -4,-4 z" | ||||||
|  |          id="path40220" | ||||||
|  |          sodipodi:nodetypes="ccsccccscc" | ||||||
|  |          style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal" /> | ||||||
|  |       <path | ||||||
|  |          inkscape:connector-curvature="0" | ||||||
|  |          d="m 269.11822,556.94838 a 1.5,1.5 0 0 0 1.41211,1 1.5,1.5 0 0 0 1.41211,-1 z" | ||||||
|  |          id="path40774" | ||||||
|  |          style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal" /> | ||||||
|  |     </g> | ||||||
|   </g> |   </g> | ||||||
| </svg> | </svg> | ||||||
|   | |||||||
| Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 11 KiB | 
| @@ -242,11 +242,11 @@ var AuthPrompt = new Lang.Class({ | |||||||
|         this.emit('prompted'); |         this.emit('prompted'); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onVerificationFailed() { |     _onVerificationFailed(userVerifier, canRetry) { | ||||||
|         this._queryingService = null; |         this._queryingService = null; | ||||||
|         this.clear(); |         this.clear(); | ||||||
|  |  | ||||||
|         this.updateSensitivity(true); |         this.updateSensitivity(canRetry); | ||||||
|         this.setActorInDefaultButtonWell(null); |         this.setActorInDefaultButtonWell(null); | ||||||
|         this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; |         this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; | ||||||
|     }, |     }, | ||||||
| @@ -439,6 +439,7 @@ var AuthPrompt = new Lang.Class({ | |||||||
|         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; |         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; | ||||||
|         this.cancelButton.reactive = true; |         this.cancelButton.reactive = true; | ||||||
|         this.nextButton.label = _("Next"); |         this.nextButton.label = _("Next"); | ||||||
|  |         this._preemptiveAnswer = null; | ||||||
|  |  | ||||||
|         if (this._userVerifier) |         if (this._userVerifier) | ||||||
|             this._userVerifier.cancel(); |             this._userVerifier.cancel(); | ||||||
|   | |||||||
| @@ -25,7 +25,6 @@ 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 Lang = imports.lang; | ||||||
| const Mainloop = imports.mainloop; |  | ||||||
| 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; | ||||||
| @@ -86,7 +85,8 @@ var UserListItem = new Lang.Class({ | |||||||
|                                              GObject.BindingFlags.SYNC_CREATE); |                                              GObject.BindingFlags.SYNC_CREATE); | ||||||
|  |  | ||||||
|         this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator', |         this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator', | ||||||
|                                                  scale_x: 0 }); |                                                  scale_x: 0, | ||||||
|  |                                                  visible: false }); | ||||||
|         layout.add(this._timedLoginIndicator); |         layout.add(this._timedLoginIndicator); | ||||||
|  |  | ||||||
|         this.actor.connect('clicked', this._onClicked.bind(this)); |         this.actor.connect('clicked', this._onClicked.bind(this)); | ||||||
| @@ -126,6 +126,8 @@ var UserListItem = new Lang.Class({ | |||||||
|  |  | ||||||
|         this.hideTimedLoginIndicator(); |         this.hideTimedLoginIndicator(); | ||||||
|  |  | ||||||
|  |         this._timedLoginIndicator.visible = true; | ||||||
|  |  | ||||||
|         let startTime = GLib.get_monotonic_time(); |         let startTime = GLib.get_monotonic_time(); | ||||||
|  |  | ||||||
|         this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33, |         this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33, | ||||||
| @@ -152,6 +154,8 @@ var UserListItem = new Lang.Class({ | |||||||
|             GLib.source_remove(this._timedLoginTimeoutId); |             GLib.source_remove(this._timedLoginTimeoutId); | ||||||
|             this._timedLoginTimeoutId = 0; |             this._timedLoginTimeoutId = 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         this._timedLoginIndicator.visible = false; | ||||||
|         this._timedLoginIndicator.scale_x = 0.; |         this._timedLoginIndicator.scale_x = 0.; | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| @@ -991,59 +995,81 @@ var LoginDialog = new Lang.Class({ | |||||||
|         return hold; |         return hold; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _showTimedLoginAnimation() { |  | ||||||
|         this._timedLoginItem.actor.grab_key_focus(); |  | ||||||
|         return this._timedLoginItem.showTimedLoginIndicator(this._timedLoginAnimationTime); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _blockTimedLoginUntilIdle() { |     _blockTimedLoginUntilIdle() { | ||||||
|         // This blocks timed login from starting until a few |  | ||||||
|         // seconds after the user stops interacting with the |  | ||||||
|         // login screen. |  | ||||||
|         // |  | ||||||
|         // We skip this step if the timed login delay is very |  | ||||||
|         // short. |  | ||||||
|         if ((this._timedLoginDelay - _TIMED_LOGIN_IDLE_THRESHOLD) <= 0) |  | ||||||
|           return null; |  | ||||||
|  |  | ||||||
|         let hold = new Batch.Hold(); |         let hold = new Batch.Hold(); | ||||||
|  |  | ||||||
|         this._timedLoginIdleTimeOutId = Mainloop.timeout_add_seconds(_TIMED_LOGIN_IDLE_THRESHOLD, |         this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD, | ||||||
|             () => { |             () => { | ||||||
|                 this._timedLoginAnimationTime -= _TIMED_LOGIN_IDLE_THRESHOLD; |                 this._timedLoginIdleTimeOutId = 0; | ||||||
|                 hold.release(); |                 hold.release(); | ||||||
|                 return GLib.SOURCE_REMOVE; |                 return GLib.SOURCE_REMOVE; | ||||||
|             }); |             }); | ||||||
|         GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime'); |         GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId'); | ||||||
|         return hold; |         return hold; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _startTimedLogin(userName, delay) { |     _startTimedLogin(userName, delay) { | ||||||
|         this._timedLoginItem = null; |         let firstRun = true; | ||||||
|         this._timedLoginDelay = delay; |  | ||||||
|         this._timedLoginAnimationTime = delay; |         // Cancel execution of old batch | ||||||
|  |         if (this._timedLoginBatch) { | ||||||
|  |             this._timedLoginBatch.cancel(); | ||||||
|  |             this._timedLoginBatch = null; | ||||||
|  |             firstRun = false; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Reset previous idle-timeout | ||||||
|  |         if (this._timedLoginIdleTimeOutId) { | ||||||
|  |             GLib.source_remove(this._timedLoginIdleTimeOutId); | ||||||
|  |             this._timedLoginIdleTimeOutId = 0; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         let loginItem = null; | ||||||
|  |         let animationTime; | ||||||
|  |  | ||||||
|         let tasks = [() => this._waitForItemForUser(userName), |         let tasks = [() => this._waitForItemForUser(userName), | ||||||
|  |  | ||||||
|                      () => { |                      () => { | ||||||
|                          this._timedLoginItem = this._userList.getItemFromUserName(userName); |                          loginItem = this._userList.getItemFromUserName(userName); | ||||||
|  |  | ||||||
|  |                          // If there is an animation running on the item, reset it. | ||||||
|  |                          loginItem.hideTimedLoginIndicator(); | ||||||
|                      }, |                      }, | ||||||
|  |  | ||||||
|                      () => { |                      () => { | ||||||
|                          // If we're just starting out, start on the right |                          // If we're just starting out, start on the right item. | ||||||
|                          // item. |  | ||||||
|                          if (!this._userManager.is_loaded) { |                          if (!this._userManager.is_loaded) { | ||||||
|                              this._userList.jumpToItem(this._timedLoginItem); |                              this._userList.jumpToItem(loginItem); | ||||||
|                          } |                          } | ||||||
|                      }, |                      }, | ||||||
|  |  | ||||||
|                      this._blockTimedLoginUntilIdle, |  | ||||||
|  |  | ||||||
|                      () => { |                      () => { | ||||||
|                          this._userList.scrollToItem(this._timedLoginItem); |                          // This blocks the timed login animation until a few | ||||||
|  |                          // seconds after the user stops interacting with the | ||||||
|  |                          // login screen. | ||||||
|  |  | ||||||
|  |                          // We skip this step if the timed login delay is very short. | ||||||
|  |                          if (delay > _TIMED_LOGIN_IDLE_THRESHOLD) { | ||||||
|  |                              animationTime = delay - _TIMED_LOGIN_IDLE_THRESHOLD; | ||||||
|  |                              return this._blockTimedLoginUntilIdle(); | ||||||
|  |                          } else { | ||||||
|  |                              animationTime = delay; | ||||||
|  |                          } | ||||||
|                      }, |                      }, | ||||||
|  |  | ||||||
|                      this._showTimedLoginAnimation, |                      () => { | ||||||
|  |                          // If idle timeout is done, make sure the timed login indicator is shown | ||||||
|  |                          if (delay > _TIMED_LOGIN_IDLE_THRESHOLD && | ||||||
|  |                              this._authPrompt.actor.visible) | ||||||
|  |                              this._authPrompt.cancel(); | ||||||
|  |  | ||||||
|  |                          if (delay > _TIMED_LOGIN_IDLE_THRESHOLD || firstRun) { | ||||||
|  |                              this._userList.scrollToItem(loginItem); | ||||||
|  |                              loginItem.actor.grab_key_focus(); | ||||||
|  |                          } | ||||||
|  |                      }, | ||||||
|  |  | ||||||
|  |                      () => loginItem.showTimedLoginIndicator(animationTime), | ||||||
|  |  | ||||||
|                      () => { |                      () => { | ||||||
|                          this._timedLoginBatch = null; |                          this._timedLoginBatch = null; | ||||||
| @@ -1055,37 +1081,17 @@ var LoginDialog = new Lang.Class({ | |||||||
|         return this._timedLoginBatch.run(); |         return this._timedLoginBatch.run(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _resetTimedLogin() { |  | ||||||
|         if (this._timedLoginBatch) { |  | ||||||
|             this._timedLoginBatch.cancel(); |  | ||||||
|             this._timedLoginBatch = null; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (this._timedLoginItem) |  | ||||||
|             this._timedLoginItem.hideTimedLoginIndicator(); |  | ||||||
|  |  | ||||||
|         let userName = this._timedLoginItem.user.get_user_name(); |  | ||||||
|  |  | ||||||
|         if (userName) |  | ||||||
|             this._startTimedLogin(userName, this._timedLoginDelay); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _onTimedLoginRequested(client, userName, seconds) { |     _onTimedLoginRequested(client, userName, seconds) { | ||||||
|  |         if (this._timedLoginBatch) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|         this._startTimedLogin(userName, seconds); |         this._startTimedLogin(userName, seconds); | ||||||
|  |  | ||||||
|  |         // Restart timed login on user interaction | ||||||
|         global.stage.connect('captured-event', (actor, event) => { |         global.stage.connect('captured-event', (actor, event) => { | ||||||
|            if (this._timedLoginDelay == undefined) |  | ||||||
|                return Clutter.EVENT_PROPAGATE; |  | ||||||
|  |  | ||||||
|            if (event.type() == Clutter.EventType.KEY_PRESS || |            if (event.type() == Clutter.EventType.KEY_PRESS || | ||||||
|                event.type() == Clutter.EventType.BUTTON_PRESS) { |                event.type() == Clutter.EventType.BUTTON_PRESS) { | ||||||
|                if (this._timedLoginBatch) { |                this._startTimedLogin(userName, seconds); | ||||||
|                    this._timedLoginBatch.cancel(); |  | ||||||
|                    this._timedLoginBatch = null; |  | ||||||
|                } |  | ||||||
|            } else if (event.type() == Clutter.EventType.KEY_RELEASE || |  | ||||||
|                       event.type() == Clutter.EventType.BUTTON_RELEASE) { |  | ||||||
|                this._resetTimedLogin(); |  | ||||||
|            } |            } | ||||||
|  |  | ||||||
|            return Clutter.EVENT_PROPAGATE; |            return Clutter.EVENT_PROPAGATE; | ||||||
|   | |||||||
| @@ -350,16 +350,19 @@ var ShellUserVerifier = new Lang.Class({ | |||||||
|         try { |         try { | ||||||
|             this._clearUserVerifier(); |             this._clearUserVerifier(); | ||||||
|             this._userVerifier = client.open_reauthentication_channel_finish(result); |             this._userVerifier = client.open_reauthentication_channel_finish(result); | ||||||
|         } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { |  | ||||||
|             return; |  | ||||||
|         } catch(e if e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) && |  | ||||||
|                 !this._reauthOnly) { |  | ||||||
|             // Gdm emits org.freedesktop.DBus.Error.AccessDenied when there is |  | ||||||
|             // no session to reauthenticate. Fall back to performing verification |  | ||||||
|             // from this login session |  | ||||||
|             client.get_user_verifier(this._cancellable, this._userVerifierGot.bind(this)); |  | ||||||
|             return; |  | ||||||
|         } catch(e) { |         } catch(e) { | ||||||
|  |             if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) | ||||||
|  |                 return; | ||||||
|  |             if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) && | ||||||
|  |                 !this._reauthOnly) { | ||||||
|  |                 // Gdm emits org.freedesktop.DBus.Error.AccessDenied when there | ||||||
|  |                 // is no session to reauthenticate. Fall back to performing | ||||||
|  |                 // verification from this login session | ||||||
|  |                 client.get_user_verifier(this._cancellable, | ||||||
|  |                                          this._userVerifierGot.bind(this)); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             this._reportInitError('Failed to open reauthentication channel', e); |             this._reportInitError('Failed to open reauthentication channel', e); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @@ -374,9 +377,9 @@ var ShellUserVerifier = new Lang.Class({ | |||||||
|         try { |         try { | ||||||
|             this._clearUserVerifier(); |             this._clearUserVerifier(); | ||||||
|             this._userVerifier = client.get_user_verifier_finish(result); |             this._userVerifier = client.get_user_verifier_finish(result); | ||||||
|         } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { |  | ||||||
|             return; |  | ||||||
|         } catch(e) { |         } catch(e) { | ||||||
|  |             if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) | ||||||
|  |                 return; | ||||||
|             this._reportInitError('Failed to obtain user verifier', e); |             this._reportInitError('Failed to obtain user verifier', e); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @@ -434,9 +437,9 @@ var ShellUserVerifier = new Lang.Class({ | |||||||
|                                                                (obj, result) => { |                                                                (obj, result) => { | ||||||
|                try { |                try { | ||||||
|                    obj.call_begin_verification_for_user_finish(result); |                    obj.call_begin_verification_for_user_finish(result); | ||||||
|                } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { |  | ||||||
|                    return; |  | ||||||
|                } catch(e) { |                } catch(e) { | ||||||
|  |                    if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) | ||||||
|  |                        return; | ||||||
|                    this._reportInitError('Failed to start verification for user', e); |                    this._reportInitError('Failed to start verification for user', e); | ||||||
|                    return; |                    return; | ||||||
|                } |                } | ||||||
| @@ -449,9 +452,9 @@ var ShellUserVerifier = new Lang.Class({ | |||||||
|                                                       (obj, result) => { |                                                       (obj, result) => { | ||||||
|                try { |                try { | ||||||
|                    obj.call_begin_verification_finish(result); |                    obj.call_begin_verification_finish(result); | ||||||
|                } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { |  | ||||||
|                    return; |  | ||||||
|                } catch(e) { |                } catch(e) { | ||||||
|  |                    if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) | ||||||
|  |                        return; | ||||||
|                    this._reportInitError('Failed to start verification', e); |                    this._reportInitError('Failed to start verification', e); | ||||||
|                    return; |                    return; | ||||||
|                } |                } | ||||||
| @@ -534,12 +537,13 @@ var ShellUserVerifier = new Lang.Class({ | |||||||
|     _verificationFailed(retry) { |     _verificationFailed(retry) { | ||||||
|         // For Not Listed / enterprise logins, immediately reset |         // For Not Listed / enterprise logins, immediately reset | ||||||
|         // the dialog |         // the dialog | ||||||
|         // Otherwise, we allow ALLOWED_FAILURES attempts. After that, we |         // Otherwise, when in login mode we allow ALLOWED_FAILURES attempts. | ||||||
|         // go back to the welcome screen. |         // After that, we go back to the welcome screen. | ||||||
|  |  | ||||||
|         this._failCounter++; |         this._failCounter++; | ||||||
|         let canRetry = retry && this._userName && |         let canRetry = retry && this._userName && | ||||||
|             this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); |             (this._reauthOnly || | ||||||
|  |              this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY)); | ||||||
|  |  | ||||||
|         if (canRetry) { |         if (canRetry) { | ||||||
|             if (!this.hasPendingMessages) { |             if (!this.hasPendingMessages) { | ||||||
| @@ -562,7 +566,7 @@ var ShellUserVerifier = new Lang.Class({ | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this.emit('verification-failed'); |         this.emit('verification-failed', canRetry); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onConversationStopped(client, serviceName) { |     _onConversationStopped(client, serviceName) { | ||||||
|   | |||||||
| @@ -43,6 +43,7 @@ | |||||||
|     <file>ui/audioDeviceSelection.js</file> |     <file>ui/audioDeviceSelection.js</file> | ||||||
|     <file>ui/backgroundMenu.js</file> |     <file>ui/backgroundMenu.js</file> | ||||||
|     <file>ui/background.js</file> |     <file>ui/background.js</file> | ||||||
|  |     <file>ui/barLevel.js</file> | ||||||
|     <file>ui/boxpointer.js</file> |     <file>ui/boxpointer.js</file> | ||||||
|     <file>ui/calendar.js</file> |     <file>ui/calendar.js</file> | ||||||
|     <file>ui/checkBox.js</file> |     <file>ui/checkBox.js</file> | ||||||
| @@ -130,6 +131,7 @@ | |||||||
|     <file>ui/status/rfkill.js</file> |     <file>ui/status/rfkill.js</file> | ||||||
|     <file>ui/status/volume.js</file> |     <file>ui/status/volume.js</file> | ||||||
|     <file>ui/status/bluetooth.js</file> |     <file>ui/status/bluetooth.js</file> | ||||||
|  |     <file>ui/status/remoteAccess.js</file> | ||||||
|     <file>ui/status/screencast.js</file> |     <file>ui/status/screencast.js</file> | ||||||
|     <file>ui/status/system.js</file> |     <file>ui/status/system.js</file> | ||||||
|     <file>ui/status/thunderbolt.js</file> |     <file>ui/status/thunderbolt.js</file> | ||||||
|   | |||||||
| @@ -112,6 +112,8 @@ function createExtensionObject(uuid, dir, type) { | |||||||
|     let metadataContents, success, tag; |     let metadataContents, success, tag; | ||||||
|     try { |     try { | ||||||
|         [success, metadataContents, tag] = metadataFile.load_contents(null); |         [success, metadataContents, tag] = metadataFile.load_contents(null); | ||||||
|  |         if (metadataContents instanceof Uint8Array) | ||||||
|  |             metadataContents = imports.byteArray.toString(metadataContents); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|         throw new Error('Failed to load metadata.json: ' + e); |         throw new Error('Failed to load metadata.json: ' + e); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -115,6 +115,11 @@ var IBusManager = new Lang.Class({ | |||||||
|                                                          object_path: IBus.PATH_PANEL }); |                                                          object_path: IBus.PATH_PANEL }); | ||||||
|             this._candidatePopup.setPanelService(this._panelService); |             this._candidatePopup.setPanelService(this._panelService); | ||||||
|             this._panelService.connect('update-property', this._updateProperty.bind(this)); |             this._panelService.connect('update-property', this._updateProperty.bind(this)); | ||||||
|  |             this._panelService.connect('set-cursor-location', (ps, x, y, w, h) => { | ||||||
|  |                 let cursorLocation = { x, y, width: w, height: h }; | ||||||
|  |                 this.emit('set-cursor-location', cursorLocation); | ||||||
|  |             }); | ||||||
|  |  | ||||||
|             try { |             try { | ||||||
|                 // IBus versions older than 1.5.10 have a bug which |                 // IBus versions older than 1.5.10 have a bug which | ||||||
|                 // causes spurious set-content-type emissions when |                 // causes spurious set-content-type emissions when | ||||||
|   | |||||||
| @@ -15,6 +15,8 @@ var InputMethod = new Lang.Class({ | |||||||
|         this._purpose = 0; |         this._purpose = 0; | ||||||
|         this._enabled = true; |         this._enabled = true; | ||||||
|         this._currentFocus = null; |         this._currentFocus = null; | ||||||
|  |         this._currentEvent = null; | ||||||
|  |         this._doForwardEvent = false; | ||||||
|         this._ibus = IBus.Bus.new_async(); |         this._ibus = IBus.Bus.new_async(); | ||||||
|         this._ibus.connect('connected', this._onConnected.bind(this)); |         this._ibus.connect('connected', this._onConnected.bind(this)); | ||||||
|         this._ibus.connect('disconnected', this._clear.bind(this)); |         this._ibus.connect('disconnected', this._clear.bind(this)); | ||||||
| @@ -25,6 +27,9 @@ var InputMethod = new Lang.Class({ | |||||||
|                                                                  this._onSourceChanged.bind(this)); |                                                                  this._onSourceChanged.bind(this)); | ||||||
|         this._currentSource = this._inputSourceManager.currentSource; |         this._currentSource = this._inputSourceManager.currentSource; | ||||||
|  |  | ||||||
|  |         let deviceManager = Clutter.DeviceManager.get_default(); | ||||||
|  |         this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); | ||||||
|  |  | ||||||
|         if (this._ibus.is_connected()) |         if (this._ibus.is_connected()) | ||||||
|             this._onConnected(); |             this._onConnected(); | ||||||
|     }, |     }, | ||||||
| @@ -64,6 +69,7 @@ var InputMethod = new Lang.Class({ | |||||||
|         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)); | ||||||
|  |         this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this)); | ||||||
|  |  | ||||||
|         this._updateCapabilities(); |         this._updateCapabilities(); | ||||||
|     }, |     }, | ||||||
| @@ -96,6 +102,24 @@ var InputMethod = new Lang.Class({ | |||||||
|         this.set_preedit_text(str, pos); |         this.set_preedit_text(str, pos); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _onForwardKeyEvent(context, keyval, keycode, state) { | ||||||
|  |         let press = (state & IBus.ModifierType.RELEASE_MASK) == 0; | ||||||
|  |  | ||||||
|  |         if (this._currentEvent) { | ||||||
|  |             // If we are handling this same event in filter_key_press(), | ||||||
|  |             // just let it go through, sending the same event again will | ||||||
|  |             // be silenced away because the key counts as pressed. | ||||||
|  |             if (this._currentEvent.get_key_symbol() == keyval && | ||||||
|  |                 (this._currentEvent.type() == Clutter.EventType.KEY_PRESS) == press) { | ||||||
|  |                 this._doForwardEvent = true; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this._virtualDevice.notify_key(Clutter.get_current_event_time(), keycode, | ||||||
|  |                                        press ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     vfunc_focus_in(focus) { |     vfunc_focus_in(focus) { | ||||||
|         this._currentFocus = focus; |         this._currentFocus = focus; | ||||||
|         if (this._context) { |         if (this._context) { | ||||||
| @@ -188,8 +212,7 @@ var InputMethod = new Lang.Class({ | |||||||
|     vfunc_filter_key_event(event) { |     vfunc_filter_key_event(event) { | ||||||
|         if (!this._context || !this._enabled) |         if (!this._context || !this._enabled) | ||||||
|             return false; |             return false; | ||||||
|         if (!this._currentSource || |         if (!this._currentSource) | ||||||
|             this._currentSource.type == Keyboard.INPUT_SOURCE_TYPE_XKB) |  | ||||||
|             return false; |             return false; | ||||||
|  |  | ||||||
|         let state = event.get_state(); |         let state = event.get_state(); | ||||||
| @@ -198,13 +221,23 @@ var InputMethod = new Lang.Class({ | |||||||
|  |  | ||||||
|         if (event.type() == Clutter.EventType.KEY_RELEASE) |         if (event.type() == Clutter.EventType.KEY_RELEASE) | ||||||
|             state |= IBus.ModifierType.RELEASE_MASK; |             state |= IBus.ModifierType.RELEASE_MASK; | ||||||
|  |  | ||||||
|  |         this._currentEvent = event; | ||||||
|  |         this._doForwardEvent = false; | ||||||
|  |  | ||||||
|         this._context.process_key_event_async(event.get_key_symbol(), |         this._context.process_key_event_async(event.get_key_symbol(), | ||||||
|                                               event.get_key_code() - 8, // Convert XKB keycodes to evcodes |                                               event.get_key_code() - 8, // Convert XKB keycodes to evcodes | ||||||
|                                               state, -1, null, |                                               state, -1, null, | ||||||
|                                               (context, res) => { |                                               (context, res) => { | ||||||
|                                                   try { |                                                   try { | ||||||
|                                                       let retval = context.process_key_event_async_finish(res); |                                                       let retval = context.process_key_event_async_finish(res); | ||||||
|  |  | ||||||
|  |                                                       if (this._doForwardEvent) | ||||||
|  |                                                           retval = false; | ||||||
|  |  | ||||||
|                                                       this.notify_key_event(event, retval); |                                                       this.notify_key_event(event, retval); | ||||||
|  |                                                       this._doForwardEvent = false; | ||||||
|  |                                                       this._currentEvent = null; | ||||||
|                                                   } catch (e) { |                                                   } catch (e) { | ||||||
|                                                       log('Error processing key on IM: ' + e.message); |                                                       log('Error processing key on IM: ' + e.message); | ||||||
|                                                   } |                                                   } | ||||||
|   | |||||||
| @@ -89,6 +89,8 @@ var KeyboardManager = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     setUserLayouts(ids) { |     setUserLayouts(ids) { | ||||||
|  |         let currentId = this._current ? this._current.id : null; | ||||||
|  |         let currentGroupIndex = this._current ? this._current.groupIndex : null; | ||||||
|         this._current = null; |         this._current = null; | ||||||
|         this._layoutInfos = {}; |         this._layoutInfos = {}; | ||||||
|  |  | ||||||
| @@ -115,6 +117,9 @@ var KeyboardManager = new Lang.Class({ | |||||||
|             info.group = group; |             info.group = group; | ||||||
|             info.groupIndex = groupIndex; |             info.groupIndex = groupIndex; | ||||||
|  |  | ||||||
|  |             if (currentId == id && currentGroupIndex == groupIndex) | ||||||
|  |                 this._current = info; | ||||||
|  |  | ||||||
|             i += 1; |             i += 1; | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -40,14 +40,24 @@ const SystemdLoginSessionIface = '<node> \ | |||||||
| <signal name="Lock" /> \ | <signal name="Lock" /> \ | ||||||
| <signal name="Unlock" /> \ | <signal name="Unlock" /> \ | ||||||
| <property name="Active" type="b" access="read" /> \ | <property name="Active" type="b" access="read" /> \ | ||||||
|  | <property name="Class" type="s" access="read" /> \ | ||||||
|  | <property name="Id" type="s" access="read" /> \ | ||||||
| <method name="SetLockedHint"> \ | <method name="SetLockedHint"> \ | ||||||
|     <arg type="b" direction="in"/> \ |     <arg type="b" direction="in"/> \ | ||||||
| </method> \ | </method> \ | ||||||
| </interface> \ | </interface> \ | ||||||
| </node>'; | </node>'; | ||||||
|  |  | ||||||
|  | const SystemdLoginUserIface = '<node> \ | ||||||
|  | <interface name="org.freedesktop.login1.User"> \ | ||||||
|  | <property name="Display" type="(so)" access="read" /> \ | ||||||
|  | <property name="Sessions" type="a(so)" access="read" /> \ | ||||||
|  | </interface> \ | ||||||
|  | </node>'; | ||||||
|  |  | ||||||
| const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); | const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); | ||||||
| const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); | const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); | ||||||
|  | const SystemdLoginUser = Gio.DBusProxy.makeProxyWrapper(SystemdLoginUserIface); | ||||||
|  |  | ||||||
| function haveSystemd() { | function haveSystemd() { | ||||||
|     return GLib.access("/run/systemd/seats", 0) >= 0; |     return GLib.access("/run/systemd/seats", 0) >= 0; | ||||||
| @@ -109,6 +119,9 @@ var LoginManagerSystemd = new Lang.Class({ | |||||||
|         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'); | ||||||
|  |         this._userProxy = new SystemdLoginUser(Gio.DBus.system, | ||||||
|  |                                                'org.freedesktop.login1', | ||||||
|  |                                                '/org/freedesktop/login1/user/self'); | ||||||
|         this._proxy.connectSignal('PrepareForSleep', |         this._proxy.connectSignal('PrepareForSleep', | ||||||
|                                   this._prepareForSleep.bind(this)); |                                   this._prepareForSleep.bind(this)); | ||||||
|     }, |     }, | ||||||
| @@ -121,8 +134,31 @@ var LoginManagerSystemd = new Lang.Class({ | |||||||
|  |  | ||||||
|         let sessionId = GLib.getenv('XDG_SESSION_ID'); |         let sessionId = GLib.getenv('XDG_SESSION_ID'); | ||||||
|         if (!sessionId) { |         if (!sessionId) { | ||||||
|             log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session.'); |             log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session. Asking logind directly.'); | ||||||
|             return; |             let [session, objectPath] = this._userProxy.Display; | ||||||
|  |             if (session) { | ||||||
|  |                 log(`Will monitor session ${session}`); | ||||||
|  |                 sessionId = session; | ||||||
|  |             } else { | ||||||
|  |                 log('Failed to find "Display" session; are we the greeter?'); | ||||||
|  |  | ||||||
|  |                 for (let [session, objectPath] of this._userProxy.Sessions) { | ||||||
|  |                     let sessionProxy = new SystemdLoginSession(Gio.DBus.system, | ||||||
|  |                                                                'org.freedesktop.login1', | ||||||
|  |                                                                objectPath); | ||||||
|  |                     log(`Considering ${session}, class=${sessionProxy.Class}`); | ||||||
|  |                     if (sessionProxy.Class == 'greeter') { | ||||||
|  |                         log(`Yes, will monitor session ${session}`); | ||||||
|  |                         sessionId = session; | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (!sessionId) { | ||||||
|  |                     log('No, failed to get session from logind.'); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._proxy.GetSessionRemote(sessionId, (result, error) => { |         this._proxy.GetSessionRemote(sessionId, (result, error) => { | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ const Params = imports.misc.params; | |||||||
| var SCROLL_TIME = 0.1; | var SCROLL_TIME = 0.1; | ||||||
|  |  | ||||||
| // http://daringfireball.net/2010/07/improved_regex_for_matching_urls | // http://daringfireball.net/2010/07/improved_regex_for_matching_urls | ||||||
| const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)'; | const _balancedParens = '\\([^\\s()<>]+\\)'; | ||||||
| const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]'; | const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]'; | ||||||
| const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]'; | const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]'; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -136,8 +136,7 @@ function run() { | |||||||
|     global.frame_finish_timestamp = true; |     global.frame_finish_timestamp = true; | ||||||
|  |  | ||||||
|     for (let k = 0; k < 5; k++) |     for (let k = 0; k < 5; k++) | ||||||
|         yield Scripting.createTestWindow(640, 480, |         yield Scripting.createTestWindow({ maximized: true }); | ||||||
|                                          { maximized: true }); |  | ||||||
|     yield Scripting.waitTestWindows(); |     yield Scripting.waitTestWindows(); | ||||||
|  |  | ||||||
|     yield Scripting.sleep(1000); |     yield Scripting.sleep(1000); | ||||||
| @@ -158,8 +157,7 @@ function run() { | |||||||
|     yield Scripting.destroyTestWindows(); |     yield Scripting.destroyTestWindows(); | ||||||
|     Main.overview.hide(); |     Main.overview.hide(); | ||||||
|  |  | ||||||
|     yield Scripting.createTestWindow(640, 480, |     yield Scripting.createTestWindow({ maximized: true, | ||||||
|                                      { maximized: true, |  | ||||||
|                                        redraws: true}); |                                        redraws: true}); | ||||||
|     yield Scripting.waitTestWindows(); |     yield Scripting.waitTestWindows(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -502,7 +502,8 @@ var CyclerPopup = new Lang.Class({ | |||||||
|     _finish() { |     _finish() { | ||||||
|         let window = this._items[this._selectedIndex]; |         let window = this._items[this._selectedIndex]; | ||||||
|         let ws = window.get_workspace(); |         let ws = window.get_workspace(); | ||||||
|         let activeWs = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWs = workspaceManager.get_active_workspace(); | ||||||
|  |  | ||||||
|         if (window.minimized) { |         if (window.minimized) { | ||||||
|             Main.wm.skipNextEffect(window.get_compositor_private()); |             Main.wm.skipNextEffect(window.get_compositor_private()); | ||||||
| @@ -572,7 +573,14 @@ var WindowSwitcherPopup = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _getWindowList() { |     _getWindowList() { | ||||||
|         let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null; |         let workspace = null; | ||||||
|  |  | ||||||
|  |         if (this._settings.get_boolean('current-workspace-only')) { | ||||||
|  |             let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|  |             workspace = workspaceManager.get_active_workspace(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         return getWindows(workspace); |         return getWindows(workspace); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -620,7 +628,14 @@ var WindowCyclerPopup = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _getWindows() { |     _getWindows() { | ||||||
|         let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null; |         let workspace = null; | ||||||
|  |  | ||||||
|  |         if (this._settings.get_boolean('current-workspace-only')) { | ||||||
|  |             let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|  |             workspace = workspaceManager.get_active_workspace(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         return getWindows(workspace); |         return getWindows(workspace); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -669,8 +684,14 @@ var AppSwitcher = new Lang.Class({ | |||||||
|  |  | ||||||
|         let windowTracker = Shell.WindowTracker.get_default(); |         let windowTracker = Shell.WindowTracker.get_default(); | ||||||
|         let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' }); |         let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' }); | ||||||
|         let workspace = settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() |  | ||||||
|                                                                        : null; |         let workspace = null; | ||||||
|  |         if (settings.get_boolean('current-workspace-only')) { | ||||||
|  |             let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|  |             workspace = workspaceManager.get_active_workspace(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); |         let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); | ||||||
|  |  | ||||||
|         // Construct the AppIcons, add to the popup |         // Construct the AppIcons, add to the popup | ||||||
|   | |||||||
| @@ -1778,10 +1778,11 @@ var AppIcon = new Lang.Class({ | |||||||
|     activate(button) { |     activate(button) { | ||||||
|         let event = Clutter.get_current_event(); |         let event = Clutter.get_current_event(); | ||||||
|         let modifiers = event ? event.get_state() : 0; |         let modifiers = event ? event.get_state() : 0; | ||||||
|         let openNewWindow = this.app.can_open_new_window () && |         let isMiddleButton = button && button == Clutter.BUTTON_MIDDLE; | ||||||
|                             modifiers & Clutter.ModifierType.CONTROL_MASK && |         let isCtrlPressed = (modifiers & Clutter.ModifierType.CONTROL_MASK) != 0; | ||||||
|                             this.app.state == Shell.AppState.RUNNING || |         let openNewWindow = this.app.can_open_new_window() && | ||||||
|                             button && button == 2; |                             this.app.state == Shell.AppState.RUNNING && | ||||||
|  |                             (isCtrlPressed || isMiddleButton); | ||||||
|  |  | ||||||
|         if (this.app.state == Shell.AppState.STOPPED || openNewWindow) |         if (this.app.state == Shell.AppState.STOPPED || openNewWindow) | ||||||
|             this.animateLaunch(); |             this.animateLaunch(); | ||||||
| @@ -1861,7 +1862,8 @@ var AppIconMenu = new Lang.Class({ | |||||||
|  |  | ||||||
|         // Display the app windows menu items and the separator between windows |         // Display the app windows menu items and the separator between windows | ||||||
|         // of the current desktop and other windows. |         // of the current desktop and other windows. | ||||||
|         let activeWorkspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|         let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace; |         let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace; | ||||||
|  |  | ||||||
|         for (let i = 0; i < windows.length; i++) { |         for (let i = 0; i < windows.length; i++) { | ||||||
| @@ -1870,7 +1872,9 @@ var AppIconMenu = new Lang.Class({ | |||||||
|                 this._appendSeparator(); |                 this._appendSeparator(); | ||||||
|                 separatorShown = true; |                 separatorShown = true; | ||||||
|             } |             } | ||||||
|             let item = this._appendMenuItem(window.title); |             let title = window.title ? window.title | ||||||
|  |                                      : this._source.app.get_name(); | ||||||
|  |             let item = this._appendMenuItem(title); | ||||||
|             item.connect('activate', () => { |             item.connect('activate', () => { | ||||||
|                 this.emit('activate-window', window); |                 this.emit('activate-window', window); | ||||||
|             }); |             }); | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ const RENAMED_DESKTOP_IDS = { | |||||||
|     'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop', |     'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop', | ||||||
|     'empathy.desktop': 'org.gnome.Empathy.desktop', |     'empathy.desktop': 'org.gnome.Empathy.desktop', | ||||||
|     'epiphany.desktop': 'org.gnome.Epiphany.desktop', |     'epiphany.desktop': 'org.gnome.Epiphany.desktop', | ||||||
|  |     'evolution.desktop': 'org.gnome.Evolution.desktop', | ||||||
|     'file-roller.desktop': 'org.gnome.FileRoller.desktop', |     'file-roller.desktop': 'org.gnome.FileRoller.desktop', | ||||||
|     'gcalctool.desktop': 'org.gnome.Calculator.desktop', |     'gcalctool.desktop': 'org.gnome.Calculator.desktop', | ||||||
|     'geary.desktop': 'org.gnome.Geary.desktop', |     'geary.desktop': 'org.gnome.Geary.desktop', | ||||||
| @@ -34,6 +35,7 @@ const RENAMED_DESKTOP_IDS = { | |||||||
|     'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', |     'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', | ||||||
|     'gnome-software.desktop': 'org.gnome.Software.desktop', |     'gnome-software.desktop': 'org.gnome.Software.desktop', | ||||||
|     'gnome-terminal.desktop': 'org.gnome.Terminal.desktop', |     'gnome-terminal.desktop': 'org.gnome.Terminal.desktop', | ||||||
|  |     'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop', | ||||||
|     'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop', |     'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop', | ||||||
|     'gnomine.desktop': 'gnome-mines.desktop', |     'gnomine.desktop': 'gnome-mines.desktop', | ||||||
|     'gnotravex.desktop': 'gnome-tetravex.desktop', |     'gnotravex.desktop': 'gnome-tetravex.desktop', | ||||||
|   | |||||||
| @@ -240,7 +240,7 @@ var Background = new Lang.Class({ | |||||||
|                                         file: null, |                                         file: null, | ||||||
|                                         style: null }); |                                         style: null }); | ||||||
|  |  | ||||||
|         this.background = new Meta.Background({ meta_screen: global.screen }); |         this.background = new Meta.Background({ meta_display: global.display }); | ||||||
|         this.background._delegate = this; |         this.background._delegate = this; | ||||||
|  |  | ||||||
|         this._settings = params.settings; |         this._settings = params.settings; | ||||||
| @@ -499,12 +499,12 @@ var SystemBackground = new Lang.Class({ | |||||||
|         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) { | ||||||
|             _systemBackground = new Meta.Background({ meta_screen: global.screen }); |             _systemBackground = new Meta.Background({ meta_display: global.display }); | ||||||
|             _systemBackground.set_color(DEFAULT_BACKGROUND_COLOR); |             _systemBackground.set_color(DEFAULT_BACKGROUND_COLOR); | ||||||
|             _systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER); |             _systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this.actor = new Meta.BackgroundActor({ meta_screen: global.screen, |         this.actor = new Meta.BackgroundActor({ meta_display: global.display, | ||||||
|                                                 monitor: 0, |                                                 monitor: 0, | ||||||
|                                                 background: _systemBackground }); |                                                 background: _systemBackground }); | ||||||
|  |  | ||||||
| @@ -538,8 +538,10 @@ var BackgroundSource = new Lang.Class({ | |||||||
|         this._settings = new Gio.Settings({ schema_id: settingsSchema }); |         this._settings = new Gio.Settings({ schema_id: settingsSchema }); | ||||||
|         this._backgrounds = []; |         this._backgrounds = []; | ||||||
|  |  | ||||||
|         this._monitorsChangedId = global.screen.connect('monitors-changed', |         let monitorManager = Meta.MonitorManager.get(); | ||||||
|                                                         this._onMonitorsChanged.bind(this)); |         this._monitorsChangedId = | ||||||
|  |             monitorManager.connect('monitors-changed', | ||||||
|  |                                    this._onMonitorsChanged.bind(this)); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onMonitorsChanged() { |     _onMonitorsChanged() { | ||||||
| @@ -604,7 +606,8 @@ var BackgroundSource = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     destroy() { |     destroy() { | ||||||
|         global.screen.disconnect(this._monitorsChangedId); |         let monitorManager = Meta.MonitorManager.get(); | ||||||
|  |         monitorManager.disconnect(this._monitorsChangedId); | ||||||
|  |  | ||||||
|         for (let monitorIndex in this._backgrounds) { |         for (let monitorIndex in this._backgrounds) { | ||||||
|             let background = this._backgrounds[monitorIndex]; |             let background = this._backgrounds[monitorIndex]; | ||||||
| @@ -751,7 +754,7 @@ var BackgroundManager = new Lang.Class({ | |||||||
|  |  | ||||||
|     _createBackgroundActor() { |     _createBackgroundActor() { | ||||||
|         let background = this._backgroundSource.getBackground(this._monitorIndex); |         let background = this._backgroundSource.getBackground(this._monitorIndex); | ||||||
|         let backgroundActor = new Meta.BackgroundActor({ meta_screen: global.screen, |         let backgroundActor = new Meta.BackgroundActor({ meta_display: global.display, | ||||||
|                                                          monitor: this._monitorIndex, |                                                          monitor: this._monitorIndex, | ||||||
|                                                          background: background.background, |                                                          background: background.background, | ||||||
|                                                          vignette: this._vignette, |                                                          vignette: this._vignette, | ||||||
|   | |||||||
							
								
								
									
										210
									
								
								js/ui/barLevel.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								js/ui/barLevel.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | |||||||
|  | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ | ||||||
|  |  | ||||||
|  | const Atk = imports.gi.Atk; | ||||||
|  | const Cairo = imports.cairo; | ||||||
|  | const Clutter = imports.gi.Clutter; | ||||||
|  | const Lang = imports.lang; | ||||||
|  | const St = imports.gi.St; | ||||||
|  | const Signals = imports.signals; | ||||||
|  |  | ||||||
|  | var BarLevel = new Lang.Class({ | ||||||
|  |     Name: "BarLevel", | ||||||
|  |  | ||||||
|  |     _init(value, params) { | ||||||
|  |         if (isNaN(value)) | ||||||
|  |             // Avoid spreading NaNs around | ||||||
|  |             throw TypeError('The bar level value must be a number'); | ||||||
|  |         this._maxValue = 1; | ||||||
|  |         this._value = Math.max(Math.min(value, this._maxValue), 0); | ||||||
|  |         this._overdriveStart = 1; | ||||||
|  |         this._barLevelWidth = 0; | ||||||
|  |  | ||||||
|  |         if (params == undefined) | ||||||
|  |             params = {} | ||||||
|  |  | ||||||
|  |         this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel', | ||||||
|  |                                           can_focus: params['canFocus'] || false, | ||||||
|  |                                           reactive: params['reactive'] || false, | ||||||
|  |                                           accessible_role: params['accessibleRole'] || Atk.Role.LEVEL_BAR }); | ||||||
|  |         this.actor.connect('repaint', this._barLevelRepaint.bind(this)); | ||||||
|  |         this.actor.connect('allocation-changed', (actor, box) => { | ||||||
|  |             this._barLevelWidth = box.get_width(); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         this._customAccessible = St.GenericAccessible.new_for_actor(this.actor); | ||||||
|  |         this.actor.set_accessible(this._customAccessible); | ||||||
|  |  | ||||||
|  |         this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this)); | ||||||
|  |         this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this)); | ||||||
|  |         this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this)); | ||||||
|  |         this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this)); | ||||||
|  |  | ||||||
|  |         this.connect('value-changed', this._valueChanged.bind(this)); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     setValue(value) { | ||||||
|  |         if (isNaN(value)) | ||||||
|  |             throw TypeError('The bar level value must be a number'); | ||||||
|  |  | ||||||
|  |         this._value = Math.max(Math.min(value, this._maxValue), 0); | ||||||
|  |         this.actor.queue_repaint(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     setMaximumValue(value) { | ||||||
|  |         if (isNaN(value)) | ||||||
|  |             throw TypeError('The bar level max value must be a number'); | ||||||
|  |  | ||||||
|  |         this._maxValue = Math.max(value, 1); | ||||||
|  |         this._overdriveStart = Math.min(this._overdriveStart, this._maxValue); | ||||||
|  |         this.actor.queue_repaint(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     setOverdriveStart(value) { | ||||||
|  |         if (isNaN(value)) | ||||||
|  |             throw TypeError('The overdrive limit value must be a number'); | ||||||
|  |         if (value > this._maxValue) | ||||||
|  |             throw new Error(`Tried to set overdrive value to ${value}, ` + | ||||||
|  |                 `which is a number greater than the maximum allowed value ${this._maxValue}`); | ||||||
|  |  | ||||||
|  |         this._overdriveStart = value; | ||||||
|  |         this._value = Math.max(Math.min(value, this._maxValue), 0); | ||||||
|  |         this.actor.queue_repaint(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _barLevelRepaint(area) { | ||||||
|  |         let cr = area.get_context(); | ||||||
|  |         let themeNode = area.get_theme_node(); | ||||||
|  |         let [width, height] = area.get_surface_size(); | ||||||
|  |  | ||||||
|  |         let barLevelHeight = themeNode.get_length('-barlevel-height'); | ||||||
|  |         let barLevelBorderRadius = Math.min(width, barLevelHeight) / 2; | ||||||
|  |         let fgColor = themeNode.get_foreground_color(); | ||||||
|  |  | ||||||
|  |         let barLevelColor = themeNode.get_color('-barlevel-background-color'); | ||||||
|  |         let barLevelActiveColor = themeNode.get_color('-barlevel-active-background-color'); | ||||||
|  |         let barLevelOverdriveColor = themeNode.get_color('-barlevel-overdrive-color'); | ||||||
|  |  | ||||||
|  |         let barLevelBorderWidth = Math.min(themeNode.get_length('-barlevel-border-width'), 1); | ||||||
|  |         let [hasBorderColor, barLevelBorderColor] = | ||||||
|  |             themeNode.lookup_color('-barlevel-border-color', false); | ||||||
|  |         if (!hasBorderColor) | ||||||
|  |             barLevelBorderColor = barLevelColor; | ||||||
|  |         let [hasActiveBorderColor, barLevelActiveBorderColor] = | ||||||
|  |             themeNode.lookup_color('-barlevel-active-border-color', false); | ||||||
|  |         if (!hasActiveBorderColor) | ||||||
|  |             barLevelActiveBorderColor = barLevelActiveColor; | ||||||
|  |         let [hasOverdriveBorderColor, barLevelOverdriveBorderColor] = | ||||||
|  |             themeNode.lookup_color('-barlevel-overdrive-border-color', false); | ||||||
|  |         if (!hasOverdriveBorderColor) | ||||||
|  |             barLevelOverdriveBorderColor = barLevelOverdriveColor; | ||||||
|  |  | ||||||
|  |         const TAU = Math.PI * 2; | ||||||
|  |  | ||||||
|  |         let endX = 0; | ||||||
|  |         if (this._maxValue > 0) | ||||||
|  |             endX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._value / this._maxValue; | ||||||
|  |  | ||||||
|  |         let overdriveSeparatorX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._overdriveStart / this._maxValue; | ||||||
|  |         let overdriveActive = this._overdriveStart !== this._maxValue; | ||||||
|  |         let overdriveSeparatorWidth = 0; | ||||||
|  |         if (overdriveActive) | ||||||
|  |             overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width'); | ||||||
|  |  | ||||||
|  |         /* background bar */ | ||||||
|  |         cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4); | ||||||
|  |         cr.lineTo(endX, (height + barLevelHeight) / 2); | ||||||
|  |         cr.lineTo(endX, (height - barLevelHeight) / 2); | ||||||
|  |         cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2); | ||||||
|  |         Clutter.cairo_set_source_color(cr, barLevelColor); | ||||||
|  |         cr.fillPreserve(); | ||||||
|  |         Clutter.cairo_set_source_color(cr, barLevelBorderColor); | ||||||
|  |         cr.setLineWidth(barLevelBorderWidth); | ||||||
|  |         cr.stroke(); | ||||||
|  |  | ||||||
|  |         /* normal progress bar */ | ||||||
|  |         let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2); | ||||||
|  |         cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 1 / 4, TAU * 3 / 4); | ||||||
|  |         cr.lineTo(x, (height - barLevelHeight) / 2); | ||||||
|  |         cr.lineTo(x, (height + barLevelHeight) / 2); | ||||||
|  |         cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2); | ||||||
|  |         Clutter.cairo_set_source_color(cr, barLevelActiveColor); | ||||||
|  |         cr.fillPreserve(); | ||||||
|  |         Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor); | ||||||
|  |         cr.setLineWidth(barLevelBorderWidth); | ||||||
|  |         cr.stroke(); | ||||||
|  |  | ||||||
|  |         /* overdrive progress barLevel */ | ||||||
|  |         x = Math.min(endX, overdriveSeparatorX) + overdriveSeparatorWidth / 2; | ||||||
|  |         if (this._value > this._overdriveStart) { | ||||||
|  |             cr.moveTo(x, (height - barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(endX, (height - barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(endX, (height + barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(x, (height + barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(x, (height - barLevelHeight) / 2); | ||||||
|  |             Clutter.cairo_set_source_color(cr, barLevelOverdriveColor); | ||||||
|  |             cr.fillPreserve(); | ||||||
|  |             Clutter.cairo_set_source_color(cr, barLevelOverdriveBorderColor); | ||||||
|  |             cr.setLineWidth(barLevelBorderWidth); | ||||||
|  |             cr.stroke(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* end progress bar arc */ | ||||||
|  |         if (this._value <= this._overdriveStart) | ||||||
|  |             Clutter.cairo_set_source_color(cr, barLevelActiveColor); | ||||||
|  |         else | ||||||
|  |             Clutter.cairo_set_source_color(cr, barLevelOverdriveColor); | ||||||
|  |         cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4); | ||||||
|  |         cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2); | ||||||
|  |         cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2); | ||||||
|  |         cr.lineTo(endX, (height - barLevelHeight) / 2); | ||||||
|  |         cr.fillPreserve(); | ||||||
|  |         cr.setLineWidth(barLevelBorderWidth); | ||||||
|  |         cr.stroke(); | ||||||
|  |  | ||||||
|  |         /* draw overdrive separator */ | ||||||
|  |         if (overdriveActive) { | ||||||
|  |             cr.moveTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(overdriveSeparatorX + overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(overdriveSeparatorX + overdriveSeparatorWidth / 2, (height + barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height + barLevelHeight) / 2); | ||||||
|  |             cr.lineTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2); | ||||||
|  |             if (this._value <= this._overdriveStart) | ||||||
|  |                 Clutter.cairo_set_source_color(cr, fgColor); | ||||||
|  |             else | ||||||
|  |                 Clutter.cairo_set_source_color(cr, barLevelColor); | ||||||
|  |             cr.fill(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         cr.$dispose(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _getCurrentValue(actor) { | ||||||
|  |         return this._value; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _getOverdriveStart(actor) { | ||||||
|  |         return this._overdriveStart; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _getMinimumValue(actor) { | ||||||
|  |         return 0; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _getMaximumValue(actor) { | ||||||
|  |         return this._maxValue; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _setCurrentValue(actor, value) { | ||||||
|  |         this._value = value; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _valueChanged(barLevel, value, property) { | ||||||
|  |         this._customAccessible.notify("accessible-value"); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     get value() { | ||||||
|  |         return this._value; | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | Signals.addSignalMethods(BarLevel.prototype); | ||||||
| @@ -821,6 +821,8 @@ var EventsSection = new Lang.Class({ | |||||||
|         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.parent(); |         this.parent(); | ||||||
|  |  | ||||||
|         this._title = new St.Button({ style_class: 'events-section-title', |         this._title = new St.Button({ style_class: 'events-section-title', | ||||||
| @@ -875,20 +877,32 @@ var EventsSection = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._reloading = true; |         this._reloading = true; | ||||||
|  |  | ||||||
|         this._list.destroy_all_children(); |  | ||||||
|  |  | ||||||
|         let periodBegin = _getBeginningOfDay(this._date); |         let periodBegin = _getBeginningOfDay(this._date); | ||||||
|         let periodEnd = _getEndOfDay(this._date); |         let periodEnd = _getEndOfDay(this._date); | ||||||
|         let events = this._eventSource.getEvents(periodBegin, periodEnd); |         let events = this._eventSource.getEvents(periodBegin, periodEnd); | ||||||
|  |  | ||||||
|  |         let ids = events.map(e => e.id); | ||||||
|  |         this._messageById.forEach((message, id) => { | ||||||
|  |             if (ids.includes(id)) | ||||||
|  |                 return; | ||||||
|  |             this._messageById.delete(id); | ||||||
|  |             this.removeMessage(message); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|         for (let i = 0; i < events.length; i++) { |         for (let i = 0; i < events.length; i++) { | ||||||
|             let event = events[i]; |             let event = events[i]; | ||||||
|  |  | ||||||
|             let message = new EventMessage(event, this._date); |             let message = this._messageById.get(event.id); | ||||||
|             message.connect('close', () => { |             if (!message) { | ||||||
|                 this._ignoreEvent(event); |                 message = new EventMessage(event, this._date); | ||||||
|             }); |                 message.connect('close', () => { | ||||||
|             this.addMessage(message, false); |                     this._ignoreEvent(event); | ||||||
|  |                 }); | ||||||
|  |                 this._messageById.set(event.id, message); | ||||||
|  |                 this.addMessage(message, false); | ||||||
|  |             } else { | ||||||
|  |                 this.moveMessage(message, i, false); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._reloading = false; |         this._reloading = false; | ||||||
|   | |||||||
| @@ -2,6 +2,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 GObject = imports.gi.GObject; | const GObject = imports.gi.GObject; | ||||||
| const Lang = imports.lang; | const Lang = imports.lang; | ||||||
| const Meta = imports.gi.Meta; | const Meta = imports.gi.Meta; | ||||||
| @@ -13,6 +14,7 @@ const Tweener = imports.ui.tweener; | |||||||
|  |  | ||||||
| var FROZEN_WINDOW_BRIGHTNESS = -0.3 | var FROZEN_WINDOW_BRIGHTNESS = -0.3 | ||||||
| var DIALOG_TRANSITION_TIME = 0.15 | var DIALOG_TRANSITION_TIME = 0.15 | ||||||
|  | var ALIVE_TIMEOUT = 5000; | ||||||
|  |  | ||||||
| var CloseDialog = new Lang.Class({ | var CloseDialog = new Lang.Class({ | ||||||
|     Name: 'CloseDialog', |     Name: 'CloseDialog', | ||||||
| @@ -26,6 +28,7 @@ var CloseDialog = new Lang.Class({ | |||||||
|         this.parent(); |         this.parent(); | ||||||
|         this._window = window; |         this._window = window; | ||||||
|         this._dialog = null; |         this._dialog = null; | ||||||
|  |         this._timeoutId = 0; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     get window() { |     get window() { | ||||||
| @@ -97,6 +100,14 @@ var CloseDialog = new Lang.Class({ | |||||||
|         if (this._dialog != null) |         if (this._dialog != null) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|  |         Meta.disable_unredirect_for_display(global.display); | ||||||
|  |  | ||||||
|  |         this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ALIVE_TIMEOUT, | ||||||
|  |             () => { | ||||||
|  |                 this._window.check_alive(global.display.get_current_time_roundtrip()); | ||||||
|  |                 return GLib.SOURCE_CONTINUE; | ||||||
|  |             }); | ||||||
|  |  | ||||||
|         this._addWindowEffect(); |         this._addWindowEffect(); | ||||||
|         this._initDialog(); |         this._initDialog(); | ||||||
|  |  | ||||||
| @@ -117,6 +128,11 @@ var CloseDialog = new Lang.Class({ | |||||||
|         if (this._dialog == null) |         if (this._dialog == null) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|  |         Meta.enable_unredirect_for_display(global.display); | ||||||
|  |  | ||||||
|  |         GLib.source_remove(this._timeoutId); | ||||||
|  |         this._timeoutId = 0; | ||||||
|  |  | ||||||
|         let dialog = this._dialog; |         let dialog = this._dialog; | ||||||
|         this._dialog = null; |         this._dialog = null; | ||||||
|         this._removeWindowEffect(); |         this._removeWindowEffect(); | ||||||
|   | |||||||
| @@ -604,12 +604,17 @@ var NetworkAgent = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._native.connect('new-request', this._newRequest.bind(this)); |         this._native.connect('new-request', this._newRequest.bind(this)); | ||||||
|         this._native.connect('cancel-request', this._cancelRequest.bind(this)); |         this._native.connect('cancel-request', this._cancelRequest.bind(this)); | ||||||
|         try { |  | ||||||
|             this._native.init(null); |         this._initialized = false; | ||||||
|         } catch(e) { |         this._native.init_async(GLib.PRIORITY_DEFAULT, null, (o, res) => { | ||||||
|             this._native = null; |             try { | ||||||
|             logError(e, 'error initializing the NetworkManager Agent'); |                 this._native.init_finish(res); | ||||||
|         } |                 this._initialized = true; | ||||||
|  |             } catch(e) { | ||||||
|  |                 this._native = null; | ||||||
|  |                 logError(e, 'error initializing the NetworkManager Agent'); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     enable() { |     enable() { | ||||||
| @@ -617,7 +622,7 @@ var NetworkAgent = new Lang.Class({ | |||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._native.auto_register = true; |         this._native.auto_register = true; | ||||||
|         if (!this._native.registered) |         if (this._initialized && !this._native.registered) | ||||||
|             this._native.register_async(null, null); |             this._native.register_async(null, null); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -640,7 +645,7 @@ var NetworkAgent = new Lang.Class({ | |||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._native.auto_register = false; |         this._native.auto_register = false; | ||||||
|         if (this._native.registered) |         if (this._initialized && this._native.registered) | ||||||
|             this._native.unregister_async(null, null); |             this._native.unregister_async(null, null); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -655,7 +660,7 @@ var NetworkAgent = new Lang.Class({ | |||||||
|         switch (connectionType) { |         switch (connectionType) { | ||||||
|         case '802-11-wireless': |         case '802-11-wireless': | ||||||
|             let wirelessSetting = connection.get_setting_wireless(); |             let wirelessSetting = connection.get_setting_wireless(); | ||||||
|             let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid()); |             let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data()); | ||||||
|             title = _("Authentication required by wireless network"); |             title = _("Authentication required by wireless network"); | ||||||
|             body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid); |             body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid); | ||||||
|             break; |             break; | ||||||
| @@ -765,57 +770,29 @@ var NetworkAgent = new Lang.Class({ | |||||||
|         this._vpnCacheBuilt = true; |         this._vpnCacheBuilt = true; | ||||||
|         this._vpnBinaries = { }; |         this._vpnBinaries = { }; | ||||||
|  |  | ||||||
|         try { |         NM.VpnPluginInfo.list_load().forEach(plugin => { | ||||||
|             let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null); |             let service = plugin.get_service(); | ||||||
|             let info; |             let fileName = plugin.get_auth_dialog(); | ||||||
|  |             let supportsHints = plugin.supports_hints(); | ||||||
|  |             let externalUIMode = false; | ||||||
|  |  | ||||||
|             while ((info = fileEnum.next_file(null))) { |             let prop = plugin.lookup_property('GNOME', 'supports-external-ui-mode'); | ||||||
|                 let name = info.get_name(); |             if (prop) { | ||||||
|                 if (name.substr(-5) != '.name') |                 prop = prop.trim().toLowerCase(); | ||||||
|                     continue; |                 externalUIMode = ['true', 'yes', 'on', '1'].includes(prop); | ||||||
|  |  | ||||||
|                 try { |  | ||||||
|                     let keyfile = new GLib.KeyFile(); |  | ||||||
|                     keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE); |  | ||||||
|                     let service = keyfile.get_string('VPN Connection', 'service'); |  | ||||||
|                     let binary = keyfile.get_string('GNOME', 'auth-dialog'); |  | ||||||
|                     let externalUIMode = false; |  | ||||||
|                     let hints = false; |  | ||||||
|  |  | ||||||
|                     try { |  | ||||||
|                         externalUIMode = keyfile.get_boolean('GNOME', 'supports-external-ui-mode'); |  | ||||||
|                     } catch(e) { } // ignore errors if key does not exist |  | ||||||
|  |  | ||||||
|                     try { |  | ||||||
|                         hints = keyfile.get_boolean('GNOME', 'supports-hints'); |  | ||||||
|                     } catch(e) { } // ignore errors if key does not exist |  | ||||||
|  |  | ||||||
|                     let path = binary; |  | ||||||
|                     if (!GLib.path_is_absolute(path)) { |  | ||||||
|                         path = GLib.build_filenamev([Config.LIBEXECDIR, path]); |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE)) { |  | ||||||
|                         this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints }; |  | ||||||
|                         try { |  | ||||||
|                             let aliases = keyfile.get_string_list('VPN Connection', 'aliases'); |  | ||||||
|  |  | ||||||
|                             for (let alias of aliases) { |  | ||||||
|                                 this._vpnBinaries[alias] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints }; |  | ||||||
|                             } |  | ||||||
|                         } catch(e) { } // ignore errors if key does not exist |  | ||||||
|                     } else { |  | ||||||
|                         throw new Error('VPN plugin at %s is not executable'.format(path)); |  | ||||||
|                     } |  | ||||||
|                 } catch(e) { |  | ||||||
|                     log('Error \'%s\' while processing VPN keyfile \'%s\''. |  | ||||||
|                         format(e.message, this._pluginDir.get_child(name).get_path())); |  | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|         } catch(e) { |  | ||||||
|             logError(e, 'error while enumerating VPN auth helpers'); |             if (GLib.file_test(fileName, GLib.FileTest.IS_EXECUTABLE)) { | ||||||
|         } |                 let binary = { fileName, externalUIMode, supportsHints }; | ||||||
|  |                 this._vpnBinaries[service] = binary; | ||||||
|  |  | ||||||
|  |                 plugin.get_aliases().forEach(alias => { | ||||||
|  |                     this._vpnBinaries[alias] = binary; | ||||||
|  |                 }); | ||||||
|  |             } else { | ||||||
|  |                 log('VPN plugin at %s is not executable'.format(fileName)); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| var Component = NetworkAgent; | var Component = NetworkAgent; | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ const PolkitAgent = imports.gi.PolkitAgent; | |||||||
| const Animation = imports.ui.animation; | const Animation = imports.ui.animation; | ||||||
| const Components = imports.ui.components; | const Components = imports.ui.components; | ||||||
| const Dialog = imports.ui.dialog; | const Dialog = imports.ui.dialog; | ||||||
|  | const Main = imports.ui.main; | ||||||
| const ModalDialog = imports.ui.modalDialog; | const ModalDialog = imports.ui.modalDialog; | ||||||
| const ShellEntry = imports.ui.shellEntry; | const ShellEntry = imports.ui.shellEntry; | ||||||
| const UserWidget = imports.ui.userWidget; | const UserWidget = imports.ui.userWidget; | ||||||
| @@ -39,6 +40,10 @@ var AuthenticationDialog = new Lang.Class({ | |||||||
|         this.userNames = userNames; |         this.userNames = userNames; | ||||||
|         this._wasDismissed = false; |         this._wasDismissed = false; | ||||||
|  |  | ||||||
|  |         this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { | ||||||
|  |             this._group.visible = !Main.sessionMode.isLocked; | ||||||
|  |         }); | ||||||
|  |  | ||||||
|         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"); | ||||||
|  |  | ||||||
| @@ -193,6 +198,14 @@ var AuthenticationDialog = new Lang.Class({ | |||||||
|         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 | ||||||
|         // already open - it just returns true without side-effects |         // already open - it just returns true without side-effects | ||||||
| @@ -348,6 +361,7 @@ var AuthenticationAgent = new Lang.Class({ | |||||||
|         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; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     enable() { |     enable() { | ||||||
| @@ -367,6 +381,17 @@ var AuthenticationAgent = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) { |     _onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) { | ||||||
|  |         // Don't pop up a dialog while locked | ||||||
|  |         if (Main.sessionMode.isLocked) { | ||||||
|  |             this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { | ||||||
|  |                 Main.sessionMode.disconnect(this._sessionUpdatedId); | ||||||
|  |                 this._sessionUpdatedId = 0; | ||||||
|  |  | ||||||
|  |                 this._onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames); | ||||||
|  |             }); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         this._currentDialog = new AuthenticationDialog(actionId, message, cookie, userNames); |         this._currentDialog = new AuthenticationDialog(actionId, message, cookie, userNames); | ||||||
|  |  | ||||||
|         // We actually don't want to open the dialog until we know for |         // We actually don't want to open the dialog until we know for | ||||||
| @@ -396,6 +421,10 @@ var AuthenticationAgent = new Lang.Class({ | |||||||
|         this._currentDialog.destroySession(); |         this._currentDialog.destroySession(); | ||||||
|         this._currentDialog = null; |         this._currentDialog = null; | ||||||
|  |  | ||||||
|  |         if (this._sessionUpdatedId) | ||||||
|  |             Main.sessionMode.disconnect(this._sessionUpdatedId); | ||||||
|  |         this._sessionUpdatedId = 0; | ||||||
|  |  | ||||||
|         this._native.complete(dismissed); |         this._native.complete(dismissed); | ||||||
|     }, |     }, | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -85,9 +85,11 @@ var CtrlAltTabManager = new Lang.Class({ | |||||||
|  |  | ||||||
|         // And add the windows metacity would show in its Ctrl-Alt-Tab list |         // And add the windows metacity would show in its Ctrl-Alt-Tab list | ||||||
|         if (Main.sessionMode.hasWindows && !Main.overview.visible) { |         if (Main.sessionMode.hasWindows && !Main.overview.visible) { | ||||||
|             let screen = global.screen; |             let display = global.display; | ||||||
|             let display = screen.get_display(); |             let workspaceManager = global.workspace_manager; | ||||||
|             let windows = display.get_tab_list(Meta.TabList.DOCKS, screen.get_active_workspace ()); |             let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |             let windows = display.get_tab_list(Meta.TabList.DOCKS, | ||||||
|  |                                                activeWorkspace); | ||||||
|             let windowTracker = Shell.WindowTracker.get_default(); |             let windowTracker = Shell.WindowTracker.get_default(); | ||||||
|             let textureCache = St.TextureCache.get_default(); |             let textureCache = St.TextureCache.get_default(); | ||||||
|             for (let i = 0; i < windows.length; i++) { |             for (let i = 0; i < windows.length; i++) { | ||||||
| @@ -131,7 +133,7 @@ var CtrlAltTabManager = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _focusWindows(timestamp) { |     _focusWindows(timestamp) { | ||||||
|         global.screen.focus_default_window(timestamp); |         global.display.focus_default_window(timestamp); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -153,8 +153,10 @@ var WorldClocksSection = new Lang.Class({ | |||||||
|         for (let i = 0; i < this._locations.length; i++) { |         for (let i = 0; i < this._locations.length; i++) { | ||||||
|             let l = this._locations[i].location; |             let l = this._locations[i].location; | ||||||
|  |  | ||||||
|  |             let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name() | ||||||
|  |                                                                               : l.get_city_name(); | ||||||
|             let label = new St.Label({ style_class: 'world-clocks-city', |             let label = new St.Label({ style_class: 'world-clocks-city', | ||||||
|                                        text: l.get_city_name(), |                                        text: name, | ||||||
|                                        x_align: Clutter.ActorAlign.START, |                                        x_align: Clutter.ActorAlign.START, | ||||||
|                                        x_expand: true }); |                                        x_expand: true }); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								js/ui/dnd.js
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								js/ui/dnd.js
									
									
									
									
									
								
							| @@ -280,7 +280,7 @@ var _Draggable = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._touchSequence = sequence; |         this._touchSequence = sequence; | ||||||
|         this._grabEvents(); |         this._grabEvents(); | ||||||
|         global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG); |         global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); | ||||||
|  |  | ||||||
|         this._dragX = this._dragStartX = stageX; |         this._dragX = this._dragStartX = stageX; | ||||||
|         this._dragY = this._dragStartY = stageY; |         this._dragY = this._dragStartY = stageY; | ||||||
| @@ -412,7 +412,7 @@ var _Draggable = new Lang.Class({ | |||||||
|             if (motionFunc) { |             if (motionFunc) { | ||||||
|                 let result = motionFunc(dragEvent); |                 let result = motionFunc(dragEvent); | ||||||
|                 if (result != DragMotionResult.CONTINUE) { |                 if (result != DragMotionResult.CONTINUE) { | ||||||
|                     global.screen.set_cursor(DRAG_CURSOR_MAP[result]); |                     global.display.set_cursor(DRAG_CURSOR_MAP[result]); | ||||||
|                     return GLib.SOURCE_REMOVE; |                     return GLib.SOURCE_REMOVE; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -430,13 +430,13 @@ var _Draggable = new Lang.Class({ | |||||||
|                                                              targY, |                                                              targY, | ||||||
|                                                              0); |                                                              0); | ||||||
|                 if (result != DragMotionResult.CONTINUE) { |                 if (result != DragMotionResult.CONTINUE) { | ||||||
|                     global.screen.set_cursor(DRAG_CURSOR_MAP[result]); |                     global.display.set_cursor(DRAG_CURSOR_MAP[result]); | ||||||
|                     return GLib.SOURCE_REMOVE; |                     return GLib.SOURCE_REMOVE; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             target = target.get_parent(); |             target = target.get_parent(); | ||||||
|         } |         } | ||||||
|         global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG); |         global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); | ||||||
|         return GLib.SOURCE_REMOVE; |         return GLib.SOURCE_REMOVE; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -509,7 +509,7 @@ var _Draggable = new Lang.Class({ | |||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     this._dragInProgress = false; |                     this._dragInProgress = false; | ||||||
|                     global.screen.set_cursor(Meta.Cursor.DEFAULT); |                     global.display.set_cursor(Meta.Cursor.DEFAULT); | ||||||
|                     this.emit('drag-end', event.get_time(), true); |                     this.emit('drag-end', event.get_time(), true); | ||||||
|                     this._dragComplete(); |                     this._dragComplete(); | ||||||
|                     return true; |                     return true; | ||||||
| @@ -561,7 +561,7 @@ var _Draggable = new Lang.Class({ | |||||||
|         let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); |         let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); | ||||||
|  |  | ||||||
|         if (this._actorDestroyed) { |         if (this._actorDestroyed) { | ||||||
|             global.screen.set_cursor(Meta.Cursor.DEFAULT); |             global.display.set_cursor(Meta.Cursor.DEFAULT); | ||||||
|             if (!this._buttonDown) |             if (!this._buttonDown) | ||||||
|                 this._dragComplete(); |                 this._dragComplete(); | ||||||
|             this.emit('drag-end', eventTime, false); |             this.emit('drag-end', eventTime, false); | ||||||
| @@ -620,7 +620,7 @@ var _Draggable = new Lang.Class({ | |||||||
|         if (!this._buttonDown) |         if (!this._buttonDown) | ||||||
|             this._dragComplete(); |             this._dragComplete(); | ||||||
|  |  | ||||||
|         global.screen.set_cursor(Meta.Cursor.DEFAULT); |         global.display.set_cursor(Meta.Cursor.DEFAULT); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onAnimationComplete(dragActor, eventTime) { |     _onAnimationComplete(dragActor, eventTime) { | ||||||
|   | |||||||
| @@ -27,9 +27,9 @@ var EdgeDragAction = new Lang.Class({ | |||||||
|  |  | ||||||
|     _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.screen.get_monitor_index_for_rect(rect); |         let monitorIndex = global.display.get_monitor_index_for_rect(rect); | ||||||
|  |  | ||||||
|         return global.screen.get_monitor_geometry(monitorIndex); |         return global.display.get_monitor_geometry(monitorIndex); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     vfunc_gesture_prepare(action, actor) { |     vfunc_gesture_prepare(action, actor) { | ||||||
|   | |||||||
| @@ -697,7 +697,14 @@ var EndSessionDialog = new Lang.Class({ | |||||||
|                 if (proxy.State == 'closing') |                 if (proxy.State == 'closing') | ||||||
|                     continue; |                     continue; | ||||||
|  |  | ||||||
|                 if (proxy.Id == GLib.getenv('XDG_SESSION_ID')) |                 let sessionId = GLib.getenv('XDG_SESSION_ID'); | ||||||
|  |                 if (!sessionId) | ||||||
|  |                     this._loginManager.getCurrentSessionProxy(currentSessionProxy => { | ||||||
|  |                         sessionId = currentSessionProxy.Id; | ||||||
|  |                         log(`endSessionDialog: No XDG_SESSION_ID, fetched from logind: ${sessionId}`); | ||||||
|  |                     }); | ||||||
|  |  | ||||||
|  |                 if (proxy.Id == sessionId) | ||||||
|                     continue; |                     continue; | ||||||
|  |  | ||||||
|                 let session = { user: this._userManager.get_user(userName), |                 let session = { user: this._userManager.get_user(userName), | ||||||
|   | |||||||
| @@ -166,7 +166,7 @@ var CandidatePopup = new Lang.Class({ | |||||||
|             this._panelService.cursor_down(); |             this._panelService.cursor_down(); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         this._candidateArea.connect('candidate-clicked', () => { |         this._candidateArea.connect('candidate-clicked', (area, index, button, state) => { | ||||||
|             this._panelService.candidate_clicked(index, button, state); |             this._panelService.candidate_clicked(index, button, state); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 FocusCaretTracker = imports.ui.focusCaretTracker; |  | ||||||
| const Atspi = imports.gi.Atspi; | const Atspi = imports.gi.Atspi; | ||||||
| const Clutter = imports.gi.Clutter; | const Clutter = imports.gi.Clutter; | ||||||
| const Gdk = imports.gi.Gdk; | const Gdk = imports.gi.Gdk; | ||||||
| @@ -13,6 +12,7 @@ const Signals = imports.signals; | |||||||
| const St = imports.gi.St; | const St = imports.gi.St; | ||||||
| const InputSourceManager = imports.ui.status.keyboard; | const InputSourceManager = imports.ui.status.keyboard; | ||||||
|  |  | ||||||
|  | const IBusManager = imports.misc.ibusManager; | ||||||
| const BoxPointer = imports.ui.boxpointer; | const BoxPointer = imports.ui.boxpointer; | ||||||
| const Layout = imports.ui.layout; | const Layout = imports.ui.layout; | ||||||
| const Main = imports.ui.main; | const Main = imports.ui.main; | ||||||
| @@ -261,6 +261,7 @@ var Key = new Lang.Class({ | |||||||
|         this._extended_keyboard = null; |         this._extended_keyboard = null; | ||||||
|         this._pressTimeoutId = 0; |         this._pressTimeoutId = 0; | ||||||
|         this._capturedPress = false; |         this._capturedPress = false; | ||||||
|  |  | ||||||
|         this._capturedEventId = 0; |         this._capturedEventId = 0; | ||||||
|         this._unmapId = 0; |         this._unmapId = 0; | ||||||
|         this._longPress = false; |         this._longPress = false; | ||||||
| @@ -471,6 +472,8 @@ var KeyboardModel = new Lang.Class({ | |||||||
|     _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)); | ||||||
|         let [success, contents] = file.load_contents(null); |         let [success, contents] = file.load_contents(null); | ||||||
|  |         if (contents instanceof Uint8Array) | ||||||
|  |             contents = imports.byteArray.toString(contents); | ||||||
|  |  | ||||||
|         return JSON.parse(contents); |         return JSON.parse(contents); | ||||||
|     }, |     }, | ||||||
| @@ -484,6 +487,79 @@ var KeyboardModel = new Lang.Class({ | |||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | var FocusTracker = new Lang.Class({ | ||||||
|  |     Name: 'FocusTracker', | ||||||
|  |  | ||||||
|  |     _init() { | ||||||
|  |         this._currentWindow = null; | ||||||
|  |         this._currentWindowPositionId = 0; | ||||||
|  |  | ||||||
|  |         global.display.connect('notify::focus-window', () => { | ||||||
|  |             this._setCurrentWindow(global.display.focus_window); | ||||||
|  |             this.emit('window-changed', this._currentWindow); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         /* Valid for wayland clients */ | ||||||
|  |         Main.inputMethod.connect('cursor-location-changed', (o, rect) => { | ||||||
|  |             let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() }; | ||||||
|  |             this._setCurrentRect(newRect); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         this._ibusManager = IBusManager.getIBusManager(); | ||||||
|  |         this._ibusManager.connect('set-cursor-location', (manager, rect) => { | ||||||
|  |             /* Valid for X11 clients only */ | ||||||
|  |             if (Main.inputMethod.currentFocus) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             this._setCurrentRect(rect); | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     get currentWindow() { | ||||||
|  |         return this._currentWindow; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _setCurrentWindow(window) { | ||||||
|  |         if (this._currentWindow) | ||||||
|  |             this._currentWindow.disconnect(this._currentWindowPositionId); | ||||||
|  |  | ||||||
|  |         this._currentWindow = window; | ||||||
|  |         if (window) { | ||||||
|  |             this._currentWindowPositionId = this._currentWindow.connect('position-changed', () => { | ||||||
|  |                 if (global.display.get_grab_op() == Meta.GrabOp.NONE) | ||||||
|  |                     this.emit('position-changed'); | ||||||
|  |                 else | ||||||
|  |                     this.emit('reset'); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _setCurrentRect(rect) { | ||||||
|  |         if (this._currentWindow) { | ||||||
|  |             let frameRect = this._currentWindow.get_frame_rect(); | ||||||
|  |             rect.x -= frameRect.x; | ||||||
|  |             rect.y -= frameRect.y; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this._rect = rect; | ||||||
|  |         this.emit('position-changed'); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     getCurrentRect() { | ||||||
|  |         let rect = { x: this._rect.x, y: this._rect.y, | ||||||
|  |                      width: this._rect.width, height: this._rect.height }; | ||||||
|  |  | ||||||
|  |         if (this._currentWindow) { | ||||||
|  |             let frameRect = this._currentWindow.get_frame_rect(); | ||||||
|  |             rect.x += frameRect.x; | ||||||
|  |             rect.y += frameRect.y; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return rect; | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  | Signals.addSignalMethods(FocusTracker.prototype); | ||||||
|  |  | ||||||
| var Keyboard = new Lang.Class({ | var Keyboard = new Lang.Class({ | ||||||
|     Name: 'Keyboard', |     Name: 'Keyboard', | ||||||
|  |  | ||||||
| @@ -491,15 +567,10 @@ var Keyboard = new Lang.Class({ | |||||||
|         this.actor = null; |         this.actor = null; | ||||||
|         this._focusInExtendedKeys = false; |         this._focusInExtendedKeys = false; | ||||||
|  |  | ||||||
|         this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker(); |  | ||||||
|         this._focusCaretTracker.connect('focus-changed', this._onFocusChanged.bind(this)); |  | ||||||
|         this._focusCaretTracker.connect('caret-moved', this._onCaretMoved.bind(this)); |  | ||||||
|         this._languagePopup = null; |         this._languagePopup = null; | ||||||
|         this._currentAccessible = null; |  | ||||||
|         this._caretTrackingEnabled = false; |  | ||||||
|         this._updateCaretPositionId = 0; |  | ||||||
|         this._currentFocusWindow = null; |         this._currentFocusWindow = null; | ||||||
|         this._originalWindowY = null; |         this._animFocusedWindow = null; | ||||||
|  |         this._delayedAnimFocusWindow = null; | ||||||
|  |  | ||||||
|         this._enableKeyboard = false; // a11y settings value |         this._enableKeyboard = false; // a11y settings value | ||||||
|         this._enabled = false; // enabled state (by setting or device type) |         this._enabled = false; // enabled state (by setting or device type) | ||||||
| @@ -510,6 +581,14 @@ var Keyboard = new Lang.Class({ | |||||||
|         this._lastDeviceId = null; |         this._lastDeviceId = null; | ||||||
|         this._suggestions = null; |         this._suggestions = null; | ||||||
|  |  | ||||||
|  |         this._focusTracker = new FocusTracker(); | ||||||
|  |         this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this)); | ||||||
|  |         this._focusTracker.connect('reset', () => { | ||||||
|  |             this._delayedAnimFocusWindow = null; | ||||||
|  |             this._animFocusedWindow = null; | ||||||
|  |             this._oskFocusWindow = null; | ||||||
|  |         }); | ||||||
|  |  | ||||||
|         Meta.get_backend().connect('last-device-changed',  |         Meta.get_backend().connect('last-device-changed',  | ||||||
|             (backend, deviceId) => { |             (backend, deviceId) => { | ||||||
|                 let manager = Clutter.DeviceManager.get_default(); |                 let manager = Clutter.DeviceManager.get_default(); | ||||||
| @@ -532,102 +611,15 @@ 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)); | ||||||
|         //Main.inputMethod.connect('cursor-location-changed', (o, rect) => { |  | ||||||
|         //    if (this._keyboardVisible) { |  | ||||||
|         //        let currentWindow = global.screen.get_display().focus_window; |  | ||||||
|         //        this.setCursorLocation(currentWindow, rect.get_x(), rect.get_y(), |  | ||||||
|         //                               rect.get_width(), rect.get_height()); |  | ||||||
|         //    } |  | ||||||
|         //}); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     get visible() { |     get visible() { | ||||||
|         return this._keyboardVisible; |         return this._keyboardVisible; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _setCaretTrackerEnabled(enabled) { |     _onFocusPositionChanged(focusTracker) { | ||||||
|         if (this._caretTrackingEnabled == enabled) |         let rect = focusTracker.getCurrentRect(); | ||||||
|             return; |         this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height); | ||||||
|  |  | ||||||
|         this._caretTrackingEnabled = enabled; |  | ||||||
|  |  | ||||||
|         if (enabled) { |  | ||||||
|             this._focusCaretTracker.registerFocusListener(); |  | ||||||
|             this._focusCaretTracker.registerCaretListener(); |  | ||||||
|         } else { |  | ||||||
|             this._focusCaretTracker.deregisterFocusListener(); |  | ||||||
|             this._focusCaretTracker.deregisterCaretListener(); |  | ||||||
|         } |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _updateCaretPosition(accessible) { |  | ||||||
|         if (this._updateCaretPositionId) |  | ||||||
|             GLib.source_remove(this._updateCaretPositionId); |  | ||||||
|         if (!this._keyboardRequested) |  | ||||||
|             return; |  | ||||||
|         this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { |  | ||||||
|             this._updateCaretPositionId = 0; |  | ||||||
|  |  | ||||||
|             let currentWindow = global.screen.get_display().focus_window; |  | ||||||
|             if (!currentWindow) { |  | ||||||
|                 this.setCursorLocation(null); |  | ||||||
|                 return GLib.SOURCE_REMOVE; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             let windowRect = currentWindow.get_frame_rect(); |  | ||||||
|             let text = accessible.get_text_iface(); |  | ||||||
|             let component = accessible.get_component_iface(); |  | ||||||
|  |  | ||||||
|             try { |  | ||||||
|                 let caretOffset = text.get_caret_offset(); |  | ||||||
|                 let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW); |  | ||||||
|                 let focusRect = component.get_extents(Atspi.CoordType.WINDOW); |  | ||||||
|  |  | ||||||
|                 if (caretRect.width == 0 && caretRect.height == 0) |  | ||||||
|                     caretRect = focusRect; |  | ||||||
|  |  | ||||||
|                 this.setCursorLocation(currentWindow, caretRect.x, caretRect.y, caretRect.width, caretRect.height); |  | ||||||
|             } catch (e) { |  | ||||||
|                 log('Error updating caret position for OSK: ' + e.message); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             return GLib.SOURCE_REMOVE; |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition'); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _focusIsTextEntry(accessible) { |  | ||||||
|         try { |  | ||||||
|             let role = accessible.get_role(); |  | ||||||
|             let stateSet = accessible.get_state_set(); |  | ||||||
|             return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL; |  | ||||||
|         } catch (e) { |  | ||||||
|             log('Error determining accessible role: ' + e.message); |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _onFocusChanged(caretTracker, event) { |  | ||||||
|         let accessible = event.source; |  | ||||||
|         if (!this._focusIsTextEntry(accessible)) |  | ||||||
|             return; |  | ||||||
|  |  | ||||||
|         let focused = event.detail1 != 0; |  | ||||||
|         if (focused) { |  | ||||||
|             this._currentAccessible = accessible; |  | ||||||
|             this._updateCaretPosition(accessible); |  | ||||||
|             this.show(Main.layoutManager.focusIndex); |  | ||||||
|         } else if (this._currentAccessible == accessible) { |  | ||||||
|             this._currentAccessible = null; |  | ||||||
|             this.hide(); |  | ||||||
|         } |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _onCaretMoved(caretTracker, event) { |  | ||||||
|         let accessible = event.source; |  | ||||||
|         if (this._currentAccessible == accessible) |  | ||||||
|             this._updateCaretPosition(accessible); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _lastDeviceIsTouchscreen() { |     _lastDeviceIsTouchscreen() { | ||||||
| @@ -650,8 +642,6 @@ var Keyboard = new Lang.Class({ | |||||||
|         if (!this._enabled && !this._keyboardController) |         if (!this._enabled && !this._keyboardController) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._setCaretTrackerEnabled(this._enabled); |  | ||||||
|  |  | ||||||
|         if (this._enabled && !this._keyboardController) |         if (this._enabled && !this._keyboardController) | ||||||
|             this._setupKeyboard(); |             this._setupKeyboard(); | ||||||
|         else if (!this._enabled) |         else if (!this._enabled) | ||||||
| @@ -936,9 +926,11 @@ var Keyboard = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _relayout() { |     _relayout() { | ||||||
|         if (this.actor == null) |  | ||||||
|             return; |  | ||||||
|         let monitor = Main.layoutManager.keyboardMonitor; |         let monitor = Main.layoutManager.keyboardMonitor; | ||||||
|  |  | ||||||
|  |         if (this.actor == null || monitor == null) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|         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; | ||||||
| @@ -1027,11 +1019,14 @@ var Keyboard = new Lang.Class({ | |||||||
|         if (!this._keyboardRequested) |         if (!this._keyboardRequested) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (this._currentAccessible) |  | ||||||
|             this._updateCaretPosition(this._currentAccessible); |  | ||||||
|         Main.layoutManager.keyboardIndex = monitor; |         Main.layoutManager.keyboardIndex = monitor; | ||||||
|         this._relayout(); |         this._relayout(); | ||||||
|         Main.layoutManager.showKeyboard(); |         Main.layoutManager.showKeyboard(); | ||||||
|  |  | ||||||
|  |         if (this._delayedAnimFocusWindow) { | ||||||
|  |             this._setAnimationWindow(this._delayedAnimFocusWindow); | ||||||
|  |             this._delayedAnimFocusWindow = null; | ||||||
|  |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     hide() { |     hide() { | ||||||
| @@ -1102,8 +1097,9 @@ var Keyboard = new Lang.Class({ | |||||||
|         window.move_frame(true, frameRect.x, frameRect.y); |         window.move_frame(true, frameRect.x, frameRect.y); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _animateWindow(window, show, deltaY) { |     _animateWindow(window, show) { | ||||||
|         let windowActor = window.get_compositor_private(); |         let windowActor = window.get_compositor_private(); | ||||||
|  |         let deltaY = Main.layoutManager.keyboardBox.height; | ||||||
|         if (!windowActor) |         if (!windowActor) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
| @@ -1124,35 +1120,39 @@ var Keyboard = new Lang.Class({ | |||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     setCursorLocation(window, x, y , w, h) { |     _setAnimationWindow(window) { | ||||||
|         if (window == this._oskFocusWindow) |         if (this._animFocusedWindow == window) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (this._oskFocusWindow) { |         if (this._animFocusedWindow) | ||||||
|             let display = global.screen.get_display(); |             this._animateWindow(this._animFocusedWindow, false); | ||||||
|  |         if (window) | ||||||
|  |             this._animateWindow(window, true); | ||||||
|  |  | ||||||
|             if (display.get_grab_op() == Meta.GrabOp.NONE || |         this._animFocusedWindow = window; | ||||||
|                 display.get_focus_window() != this._oskFocusWindow) |     }, | ||||||
|                 this._animateWindow(this._oskFocusWindow, false, this._oskFocusWindowDelta); |  | ||||||
|  |  | ||||||
|             this._oskFocusWindow = null; |     setCursorLocation(window, x, y , w, h) { | ||||||
|             this._oskFocusWindowDelta = null; |         let monitor = Main.layoutManager.keyboardMonitor; | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (window) { |         if (window && monitor) { | ||||||
|             let monitor = Main.layoutManager.keyboardMonitor; |  | ||||||
|             let keyboardHeight = Main.layoutManager.keyboardBox.height; |             let keyboardHeight = Main.layoutManager.keyboardBox.height; | ||||||
|             let frameRect = window.get_frame_rect(); |             let focusObscured = false; | ||||||
|             let windowActor = window.get_compositor_private(); |  | ||||||
|             let delta = 0; |  | ||||||
|  |  | ||||||
|             if (frameRect.y + y + h >= monitor.height - keyboardHeight) |             if (y + h >= monitor.y + monitor.height - keyboardHeight) { | ||||||
|                 delta = keyboardHeight; |                 if (this._keyboardVisible) | ||||||
|  |                     this._setAnimationWindow(window); | ||||||
|             this._animateWindow(window, true, delta); |                 else | ||||||
|             this._oskFocusWindow = window; |                     this._delayedAnimFocusWindow = window; | ||||||
|             this._oskFocusWindowDelta = delta; |             } else if (y < keyboardHeight) { | ||||||
|  |                 this._delayedAnimFocusWindow = null; | ||||||
|  |                 this._setAnimationWindow(null); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             this._setAnimationWindow(null); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         this._oskFocusWindow = window; | ||||||
|     }, |     }, | ||||||
| }); | }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -109,7 +109,7 @@ var MonitorConstraint = new Lang.Class({ | |||||||
|  |  | ||||||
|             if (!this._workareasChangedId) { |             if (!this._workareasChangedId) { | ||||||
|                 this._workareasChangedId = |                 this._workareasChangedId = | ||||||
|                     global.screen.connect('workareas-changed', () => { |                     global.display.connect('workareas-changed', () => { | ||||||
|                         if (this._workArea) |                         if (this._workArea) | ||||||
|                             this.actor.queue_relayout(); |                             this.actor.queue_relayout(); | ||||||
|                     }); |                     }); | ||||||
| @@ -120,7 +120,7 @@ var MonitorConstraint = new Lang.Class({ | |||||||
|             this._monitorsChangedId = 0; |             this._monitorsChangedId = 0; | ||||||
|  |  | ||||||
|             if (this._workareasChangedId) |             if (this._workareasChangedId) | ||||||
|                 global.screen.disconnect(this._workareasChangedId); |                 global.display.disconnect(this._workareasChangedId); | ||||||
|             this._workareasChangedId = 0; |             this._workareasChangedId = 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -142,7 +142,8 @@ var MonitorConstraint = new Lang.Class({ | |||||||
|  |  | ||||||
|         let rect; |         let rect; | ||||||
|         if (this._workArea) { |         if (this._workArea) { | ||||||
|             let ws = global.screen.get_workspace_by_index(0); |             let workspaceManager = global.workspace_manager; | ||||||
|  |             let ws = workspaceManager.get_workspace_by_index(0); | ||||||
|             rect = ws.get_work_area_for_monitor(index); |             rect = ws.get_work_area_for_monitor(index); | ||||||
|         } else { |         } else { | ||||||
|             rect = Main.layoutManager.monitors[index]; |             rect = Main.layoutManager.monitors[index]; | ||||||
| @@ -164,7 +165,7 @@ var Monitor = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     get inFullscreen() { |     get inFullscreen() { | ||||||
|         return global.screen.get_monitor_in_fullscreen(this.index); |         return global.display.get_monitor_in_fullscreen(this.index); | ||||||
|     } |     } | ||||||
| }) | }) | ||||||
|  |  | ||||||
| @@ -259,7 +260,7 @@ var LayoutManager = new Lang.Class({ | |||||||
|         global.stage.remove_actor(global.top_window_group); |         global.stage.remove_actor(global.top_window_group); | ||||||
|         this.uiGroup.add_actor(global.top_window_group); |         this.uiGroup.add_actor(global.top_window_group); | ||||||
|  |  | ||||||
|         let feedbackGroup = Meta.get_feedback_group_for_screen(global.screen); |         let feedbackGroup = Meta.get_feedback_group_for_display(global.display); | ||||||
|         global.stage.remove_actor(feedbackGroup); |         global.stage.remove_actor(feedbackGroup); | ||||||
|         this.uiGroup.add_actor(feedbackGroup); |         this.uiGroup.add_actor(feedbackGroup); | ||||||
|  |  | ||||||
| @@ -269,14 +270,19 @@ var LayoutManager = new Lang.Class({ | |||||||
|         this._bgManagers = []; |         this._bgManagers = []; | ||||||
|  |  | ||||||
|         // Need to update struts on new workspaces when they are added |         // Need to update struts on new workspaces when they are added | ||||||
|         global.screen.connect('notify::n-workspaces', |         let workspaceManager = global.workspace_manager; | ||||||
|                               this._queueUpdateRegions.bind(this)); |         workspaceManager.connect('notify::n-workspaces', | ||||||
|         global.screen.connect('restacked', |                                  this._queueUpdateRegions.bind(this)); | ||||||
|                               this._windowsRestacked.bind(this)); |  | ||||||
|         global.screen.connect('monitors-changed', |         let display = global.display; | ||||||
|                               this._monitorsChanged.bind(this)); |         display.connect('restacked', | ||||||
|         global.screen.connect('in-fullscreen-changed', |                         this._windowsRestacked.bind(this)); | ||||||
|                               this._updateFullscreen.bind(this)); |         display.connect('in-fullscreen-changed', | ||||||
|  |                         this._updateFullscreen.bind(this)); | ||||||
|  |  | ||||||
|  |         let monitorManager = Meta.MonitorManager.get(); | ||||||
|  |         monitorManager.connect('monitors-changed', | ||||||
|  |                                this._monitorsChanged.bind(this)); | ||||||
|         this._monitorsChanged(); |         this._monitorsChanged(); | ||||||
|  |  | ||||||
|         // NVIDIA drivers don't preserve FBO contents across |         // NVIDIA drivers don't preserve FBO contents across | ||||||
| @@ -319,12 +325,12 @@ var LayoutManager = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _updateMonitors() { |     _updateMonitors() { | ||||||
|         let screen = global.screen; |         let display = global.display; | ||||||
|  |  | ||||||
|         this.monitors = []; |         this.monitors = []; | ||||||
|         let nMonitors = screen.get_n_monitors(); |         let nMonitors = display.get_n_monitors(); | ||||||
|         for (let i = 0; i < nMonitors; i++) |         for (let i = 0; i < nMonitors; i++) | ||||||
|             this.monitors.push(new Monitor(i, screen.get_monitor_geometry(i))); |             this.monitors.push(new Monitor(i, display.get_monitor_geometry(i))); | ||||||
|  |  | ||||||
|         if (nMonitors == 0) { |         if (nMonitors == 0) { | ||||||
|             this.primaryIndex = this.bottomIndex = -1; |             this.primaryIndex = this.bottomIndex = -1; | ||||||
| @@ -333,7 +339,7 @@ var LayoutManager = new Lang.Class({ | |||||||
|         } else { |         } else { | ||||||
|             // If there are monitors below the primary, then we need |             // If there are monitors below the primary, then we need | ||||||
|             // to split primary from bottom. |             // to split primary from bottom. | ||||||
|             this.primaryIndex = this.bottomIndex = screen.get_primary_monitor(); |             this.primaryIndex = this.bottomIndex = display.get_primary_monitor(); | ||||||
|             for (let i = 0; i < this.monitors.length; i++) { |             for (let i = 0; i < this.monitors.length; i++) { | ||||||
|                 let monitor = this.monitors[i]; |                 let monitor = this.monitors[i]; | ||||||
|                 if (this._isAboveOrBelowPrimary(monitor)) { |                 if (this._isAboveOrBelowPrimary(monitor)) { | ||||||
| @@ -538,7 +544,7 @@ var LayoutManager = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     get currentMonitor() { |     get currentMonitor() { | ||||||
|         let index = global.screen.get_current_monitor(); |         let index = global.display.get_current_monitor(); | ||||||
|         return this.monitors[index]; |         return this.monitors[index]; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -557,6 +563,8 @@ var LayoutManager = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     get focusMonitor() { |     get focusMonitor() { | ||||||
|  |         if (this.focusIndex < 0) | ||||||
|  |             return null; | ||||||
|         return this.monitors[this.focusIndex]; |         return this.monitors[this.focusIndex]; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -909,7 +917,8 @@ var LayoutManager = new Lang.Class({ | |||||||
|     getWorkAreaForMonitor(monitorIndex) { |     getWorkAreaForMonitor(monitorIndex) { | ||||||
|         // Assume that all workspaces will have the same |         // Assume that all workspaces will have the same | ||||||
|         // struts and pick the first one. |         // struts and pick the first one. | ||||||
|         let ws = global.screen.get_workspace_by_index(0); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let ws = workspaceManager.get_workspace_by_index(0); | ||||||
|         return ws.get_work_area_for_monitor(monitorIndex); |         return ws.get_work_area_for_monitor(monitorIndex); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -919,7 +928,7 @@ var LayoutManager = new Lang.Class({ | |||||||
|         let [x, y] = actor.get_transformed_position(); |         let [x, y] = actor.get_transformed_position(); | ||||||
|         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.screen.get_monitor_index_for_rect(rect); |         return global.display.get_monitor_index_for_rect(rect); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     findMonitorForActor(actor) { |     findMonitorForActor(actor) { | ||||||
| @@ -1052,9 +1061,9 @@ var LayoutManager = new Lang.Class({ | |||||||
|         global.set_stage_input_region(rects); |         global.set_stage_input_region(rects); | ||||||
|         this._isPopupWindowVisible = isPopupMenuVisible; |         this._isPopupWindowVisible = isPopupMenuVisible; | ||||||
|  |  | ||||||
|         let screen = global.screen; |         let workspaceManager = global.workspace_manager; | ||||||
|         for (let w = 0; w < screen.n_workspaces; w++) { |         for (let w = 0; w < workspaceManager.n_workspaces; w++) { | ||||||
|             let workspace = screen.get_workspace_by_index(w); |             let workspace = workspaceManager.get_workspace_by_index(w); | ||||||
|             workspace.set_builtin_struts(struts); |             workspace.set_builtin_struts(struts); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,7 +19,6 @@ const MagnifierDBus = imports.ui.magnifierDBus; | |||||||
| const Params = imports.misc.params; | const Params = imports.misc.params; | ||||||
| const PointerWatcher = imports.ui.pointerWatcher; | const PointerWatcher = imports.ui.pointerWatcher; | ||||||
|  |  | ||||||
| var MOUSE_POLL_FREQUENCY = 50; |  | ||||||
| var CROSSHAIRS_CLIP_SIZE = [100, 100]; | var CROSSHAIRS_CLIP_SIZE = [100, 100]; | ||||||
| var NO_CHANGE = 0.0; | var NO_CHANGE = 0.0; | ||||||
|  |  | ||||||
| @@ -62,7 +61,7 @@ var Magnifier = new Lang.Class({ | |||||||
|         this._zoomRegions = []; |         this._zoomRegions = []; | ||||||
|  |  | ||||||
|         // Create small clutter tree for the magnified mouse. |         // Create small clutter tree for the magnified mouse. | ||||||
|         let cursorTracker = Meta.CursorTracker.get_for_screen(global.screen); |         let cursorTracker = Meta.CursorTracker.get_for_display(global.display); | ||||||
|         this._mouseSprite = new Clutter.Texture(); |         this._mouseSprite = new Clutter.Texture(); | ||||||
|         Shell.util_cursor_tracker_to_clutter(cursorTracker, this._mouseSprite); |         Shell.util_cursor_tracker_to_clutter(cursorTracker, this._mouseSprite); | ||||||
|         this._cursorRoot = new Clutter.Actor(); |         this._cursorRoot = new Clutter.Actor(); | ||||||
| @@ -117,10 +116,10 @@ var Magnifier = new Lang.Class({ | |||||||
|  |  | ||||||
|         if (isActive != activate) { |         if (isActive != activate) { | ||||||
|             if (activate) { |             if (activate) { | ||||||
|                 Meta.disable_unredirect_for_screen(global.screen); |                 Meta.disable_unredirect_for_display(global.display); | ||||||
|                 this.startTrackingMouse(); |                 this.startTrackingMouse(); | ||||||
|             } else { |             } else { | ||||||
|                 Meta.enable_unredirect_for_screen(global.screen); |                 Meta.enable_unredirect_for_display(global.display); | ||||||
|                 this.stopTrackingMouse(); |                 this.stopTrackingMouse(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -152,8 +151,10 @@ var Magnifier = new Lang.Class({ | |||||||
|      * Turn on mouse tracking, if not already doing so. |      * Turn on mouse tracking, if not already doing so. | ||||||
|      */ |      */ | ||||||
|     startTrackingMouse() { |     startTrackingMouse() { | ||||||
|         if (!this._pointerWatch) |         if (!this._pointerWatch) { | ||||||
|             this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(MOUSE_POLL_FREQUENCY, this.scrollToMousePos.bind(this)); |             let interval = 1000 / Clutter.get_default_frame_rate(); | ||||||
|  |             this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, this.scrollToMousePos.bind(this)); | ||||||
|  |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -256,6 +256,14 @@ function _getStylesheet(name) { | |||||||
|     if (stylesheet.query_exists(null)) |     if (stylesheet.query_exists(null)) | ||||||
|         return stylesheet; |         return stylesheet; | ||||||
|  |  | ||||||
|  |     let dataDirs = GLib.get_system_data_dirs(); | ||||||
|  |     for (let i = 0; i < dataDirs.length; i++) { | ||||||
|  |         let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]); | ||||||
|  |         let stylesheet = Gio.file_new_for_path(path); | ||||||
|  |         if (stylesheet.query_exists(null)) | ||||||
|  |             return stylesheet; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name); |     stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name); | ||||||
|     if (stylesheet.query_exists(null)) |     if (stylesheet.query_exists(null)) | ||||||
|         return stylesheet; |         return stylesheet; | ||||||
| @@ -421,7 +429,7 @@ function pushModal(actor, params) { | |||||||
|             log('pushModal: invocation of begin_modal failed'); |             log('pushModal: invocation of begin_modal failed'); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|         Meta.disable_unredirect_for_screen(global.screen); |         Meta.disable_unredirect_for_display(global.display); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     modalCount += 1; |     modalCount += 1; | ||||||
| @@ -520,7 +528,7 @@ function popModal(actor, timestamp) { | |||||||
|  |  | ||||||
|     layoutManager.modalEnded(); |     layoutManager.modalEnded(); | ||||||
|     global.end_modal(timestamp); |     global.end_modal(timestamp); | ||||||
|     Meta.enable_unredirect_for_screen(global.screen); |     Meta.enable_unredirect_for_display(global.display); | ||||||
|     actionMode = Shell.ActionMode.NORMAL; |     actionMode = Shell.ActionMode.NORMAL; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -548,14 +556,15 @@ function openRunDialog() { | |||||||
|  * and switching out of the overview if it's currently active |  * and switching out of the overview if it's currently active | ||||||
|  */ |  */ | ||||||
| function activateWindow(window, time, workspaceNum) { | function activateWindow(window, time, workspaceNum) { | ||||||
|     let activeWorkspaceNum = global.screen.get_active_workspace_index(); |     let workspaceManager = global.workspace_manager; | ||||||
|  |     let activeWorkspaceNum = workspaceManager.get_active_workspace_index(); | ||||||
|     let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index(); |     let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index(); | ||||||
|  |  | ||||||
|     if (!time) |     if (!time) | ||||||
|         time = global.get_current_time(); |         time = global.get_current_time(); | ||||||
|  |  | ||||||
|     if (windowWorkspaceNum != activeWorkspaceNum) { |     if (windowWorkspaceNum != activeWorkspaceNum) { | ||||||
|         let workspace = global.screen.get_workspace_by_index(windowWorkspaceNum); |         let workspace = workspaceManager.get_workspace_by_index(windowWorkspaceNum); | ||||||
|         workspace.activate_with_focus(window, time); |         workspace.activate_with_focus(window, time); | ||||||
|     } else { |     } else { | ||||||
|         window.activate(time); |         window.activate(time); | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ function _fixMarkup(text, allowMarkup) { | |||||||
|  |  | ||||||
|         // Support <b>, <i>, and <u>, escape anything else |         // Support <b>, <i>, and <u>, escape anything else | ||||||
|         // so it displays as raw markup. |         // so it displays as raw markup. | ||||||
|  |         // Ref: https://developer.gnome.org/notification-spec/#markup | ||||||
|         _text = _text.replace(/<(?!\/?[biu]>)/g, '<'); |         _text = _text.replace(/<(?!\/?[biu]>)/g, '<'); | ||||||
|  |  | ||||||
|         try { |         try { | ||||||
| @@ -95,10 +96,10 @@ var URLHighlighter = new Lang.Class({ | |||||||
|  |  | ||||||
|             let urlId = this._findUrlAtPos(event); |             let urlId = this._findUrlAtPos(event); | ||||||
|             if (urlId != -1 && !this._cursorChanged) { |             if (urlId != -1 && !this._cursorChanged) { | ||||||
|                 global.screen.set_cursor(Meta.Cursor.POINTING_HAND); |                 global.display.set_cursor(Meta.Cursor.POINTING_HAND); | ||||||
|                 this._cursorChanged = true; |                 this._cursorChanged = true; | ||||||
|             } else if (urlId == -1) { |             } else if (urlId == -1) { | ||||||
|                 global.screen.set_cursor(Meta.Cursor.DEFAULT); |                 global.display.set_cursor(Meta.Cursor.DEFAULT); | ||||||
|                 this._cursorChanged = false; |                 this._cursorChanged = false; | ||||||
|             } |             } | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
| @@ -109,7 +110,7 @@ var URLHighlighter = new Lang.Class({ | |||||||
|  |  | ||||||
|             if (this._cursorChanged) { |             if (this._cursorChanged) { | ||||||
|                 this._cursorChanged = false; |                 this._cursorChanged = false; | ||||||
|                 global.screen.set_cursor(Meta.Cursor.DEFAULT); |                 global.display.set_cursor(Meta.Cursor.DEFAULT); | ||||||
|             } |             } | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|         }); |         }); | ||||||
|   | |||||||
| @@ -315,10 +315,10 @@ var NotificationApplicationPolicy = new Lang.Class({ | |||||||
| // You can add a secondary icon to the banner with 'secondaryGIcon'. There | // You can add a secondary icon to the banner with 'secondaryGIcon'. There | ||||||
| // is no fallback for this icon. | // is no fallback for this icon. | ||||||
| // | // | ||||||
| // If @params contains 'bannerMarkup', with the value %true, then | // If @params contains 'bannerMarkup', with the value %true, a subset (<b>, | ||||||
| // the corresponding element is assumed to use pango markup. If the | // <i> and <u>) of the markup in [1] will be interpreted within @banner. If | ||||||
| // parameter is not present for an element, then anything that looks | // the parameter is not present, then anything that looks like markup | ||||||
| // like markup in that element will appear literally in the output. | // in @banner will appear literally in the output. | ||||||
| // | // | ||||||
| // If @params contains a 'clear' parameter with the value %true, then | // If @params contains a 'clear' parameter with the value %true, then | ||||||
| // the content and the action area of the notification will be cleared. | // the content and the action area of the notification will be cleared. | ||||||
| @@ -328,6 +328,8 @@ var NotificationApplicationPolicy = new Lang.Class({ | |||||||
| // If @params contains 'soundName' or 'soundFile', the corresponding | // If @params contains 'soundName' or 'soundFile', the corresponding | ||||||
| // event sound is played when the notification is shown (if the policy for | // event sound is played when the notification is shown (if the policy for | ||||||
| // @source allows playing sounds). | // @source allows playing sounds). | ||||||
|  | // | ||||||
|  | // [1] https://developer.gnome.org/notification-spec/#markup  | ||||||
| var Notification = new Lang.Class({ | var Notification = new Lang.Class({ | ||||||
|     Name: 'Notification', |     Name: 'Notification', | ||||||
|  |  | ||||||
| @@ -915,7 +917,7 @@ var MessageTray = new Lang.Class({ | |||||||
|         Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false }); |         Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false }); | ||||||
|         Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true }); |         Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true }); | ||||||
|  |  | ||||||
|         global.screen.connect('in-fullscreen-changed', this._updateState.bind(this)); |         global.display.connect('in-fullscreen-changed', this._updateState.bind(this)); | ||||||
|  |  | ||||||
|         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); |         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -100,21 +100,8 @@ var ModalDialog = new Lang.Class({ | |||||||
|     setButtons(buttons) { |     setButtons(buttons) { | ||||||
|         this.clearButtons(); |         this.clearButtons(); | ||||||
|  |  | ||||||
|         for (let i = 0; i < buttons.length; i++) { |         for (let buttonInfo of buttons) | ||||||
|             let buttonInfo = buttons[i]; |  | ||||||
|  |  | ||||||
|             let x_alignment; |  | ||||||
|             if (buttons.length == 1) |  | ||||||
|                 x_alignment = St.Align.END; |  | ||||||
|             else if (i == 0) |  | ||||||
|                 x_alignment = St.Align.START; |  | ||||||
|             else if (i == buttons.length - 1) |  | ||||||
|                 x_alignment = St.Align.END; |  | ||||||
|             else |  | ||||||
|                 x_alignment = St.Align.MIDDLE; |  | ||||||
|  |  | ||||||
|             this.addButton(buttonInfo); |             this.addButton(buttonInfo); | ||||||
|         } |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     addButton(buttonInfo) { |     addButton(buttonInfo) { | ||||||
| @@ -129,7 +116,7 @@ var ModalDialog = new Lang.Class({ | |||||||
|         if (onPrimary) |         if (onPrimary) | ||||||
|             this._monitorConstraint.primary = true; |             this._monitorConstraint.primary = true; | ||||||
|         else |         else | ||||||
|             this._monitorConstraint.index = global.screen.get_current_monitor(); |             this._monitorConstraint.index = global.display.get_current_monitor(); | ||||||
|  |  | ||||||
|         this.state = State.OPENING; |         this.state = State.OPENING; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -831,8 +831,10 @@ var GtkNotificationDaemon = new Lang.Class({ | |||||||
|                 let source; |                 let source; | ||||||
|                 try { |                 try { | ||||||
|                     source = this._ensureAppSource(appId); |                     source = this._ensureAppSource(appId); | ||||||
|                 } catch(e if e instanceof InvalidAppError) { |                 } catch(e) { | ||||||
|                     return; |                     if (e instanceof InvalidAppError) | ||||||
|  |                         return; | ||||||
|  |                     throw e; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 notifications.forEach(([notificationId, notification]) => { |                 notifications.forEach(([notificationId, notification]) => { | ||||||
| @@ -863,9 +865,12 @@ var GtkNotificationDaemon = new Lang.Class({ | |||||||
|         let source; |         let source; | ||||||
|         try { |         try { | ||||||
|             source = this._ensureAppSource(appId); |             source = this._ensureAppSource(appId); | ||||||
|         } catch(e if e instanceof InvalidAppError) { |         } catch(e) { | ||||||
|             invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId)); |             if (e instanceof InvalidAppError) { | ||||||
|             return; |                 invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId)); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             throw e; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         let timestamp = GLib.DateTime.new_now_local().to_unix(); |         let timestamp = GLib.DateTime.new_now_local().to_unix(); | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ var OsdMonitorLabel = new Lang.Class({ | |||||||
|         Main.uiGroup.set_child_above_sibling(this._actor, null); |         Main.uiGroup.set_child_above_sibling(this._actor, null); | ||||||
|         this._position(); |         this._position(); | ||||||
|  |  | ||||||
|         Meta.disable_unredirect_for_screen(global.screen); |         Meta.disable_unredirect_for_display(global.display); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _position() { |     _position() { | ||||||
| @@ -48,7 +48,7 @@ var OsdMonitorLabel = new Lang.Class({ | |||||||
|  |  | ||||||
|     destroy() { |     destroy() { | ||||||
|         this._actor.destroy(); |         this._actor.destroy(); | ||||||
|         Meta.enable_unredirect_for_screen(global.screen); |         Meta.enable_unredirect_for_display(global.display); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ const Clutter = imports.gi.Clutter; | |||||||
| const GLib = imports.gi.GLib; | const GLib = imports.gi.GLib; | ||||||
| const St = imports.gi.St; | const St = imports.gi.St; | ||||||
|  |  | ||||||
|  | const BarLevel = imports.ui.barLevel; | ||||||
| const Lang = imports.lang; | const Lang = imports.lang; | ||||||
| const Layout = imports.ui.layout; | const Layout = imports.ui.layout; | ||||||
| const Main = imports.ui.main; | const Main = imports.ui.main; | ||||||
| @@ -17,16 +18,18 @@ var LEVEL_ANIMATION_TIME = 0.1; | |||||||
|  |  | ||||||
| var LevelBar = new Lang.Class({ | var LevelBar = new Lang.Class({ | ||||||
|     Name: 'LevelBar', |     Name: 'LevelBar', | ||||||
|  |     Extends: BarLevel.BarLevel, | ||||||
|  |  | ||||||
|     _init() { |     _init() { | ||||||
|         this._level = 0; |         this._level = 0; | ||||||
|  |         this._maxLevel = 100; | ||||||
|  |  | ||||||
|         this.actor = new St.Bin({ style_class: 'level', |         let params = { | ||||||
|                                   x_align: St.Align.START, |             styleClass: 'level', | ||||||
|                                   y_fill: true }); |         } | ||||||
|         this._bar = new St.Widget({ style_class: 'level-bar' }); |         this.parent(this._level, params); | ||||||
|  |  | ||||||
|         this.actor.set_child(this._bar); |         this.actor.accessible_name = _("Volume"); | ||||||
|  |  | ||||||
|         this.actor.connect('notify::width', () => { this.level = this.level; }); |         this.actor.connect('notify::width', () => { this.level = this.level; }); | ||||||
|     }, |     }, | ||||||
| @@ -36,12 +39,19 @@ var LevelBar = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     set level(value) { |     set level(value) { | ||||||
|         this._level = Math.max(0, Math.min(value, 100)); |         this._level = Math.max(0, Math.min(value, this._maxLevel)); | ||||||
|  |  | ||||||
|         let alloc = this.actor.get_allocation_box(); |         this.setValue(this._level / 100); | ||||||
|         let newWidth = Math.round((alloc.x2 - alloc.x1) * this._level / 100); |     }, | ||||||
|         if (newWidth != this._bar.width) |  | ||||||
|             this._bar.width = newWidth; |     get maxLevel() { | ||||||
|  |         return this._maxLevel; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     set maxLevel(value) { | ||||||
|  |         this._maxLevel = Math.max(100, value); | ||||||
|  |  | ||||||
|  |         this.setMaximumValue(this._maxLevel / 100); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
| @@ -140,12 +150,18 @@ var OsdWindow = new Lang.Class({ | |||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     setMaxLevel(maxLevel) { | ||||||
|  |         if (maxLevel === undefined) | ||||||
|  |             maxLevel = 100; | ||||||
|  |         this._level.maxLevel = maxLevel; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     show() { |     show() { | ||||||
|         if (!this._icon.gicon) |         if (!this._icon.gicon) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (!this.actor.visible) { |         if (!this.actor.visible) { | ||||||
|             Meta.disable_unredirect_for_screen(global.screen); |             Meta.disable_unredirect_for_display(global.display); | ||||||
|             this.actor.show(); |             this.actor.show(); | ||||||
|             this.actor.opacity = 0; |             this.actor.opacity = 0; | ||||||
|             this.actor.get_parent().set_child_above_sibling(this.actor, null); |             this.actor.get_parent().set_child_above_sibling(this.actor, null); | ||||||
| @@ -179,7 +195,7 @@ var OsdWindow = new Lang.Class({ | |||||||
|                            transition: 'easeOutQuad', |                            transition: 'easeOutQuad', | ||||||
|                            onComplete: () => { |                            onComplete: () => { | ||||||
|                               this._reset(); |                               this._reset(); | ||||||
|                               Meta.enable_unredirect_for_screen(global.screen); |                               Meta.enable_unredirect_for_display(global.display); | ||||||
|                            } |                            } | ||||||
|                          }); |                          }); | ||||||
|         return GLib.SOURCE_REMOVE; |         return GLib.SOURCE_REMOVE; | ||||||
| @@ -189,6 +205,7 @@ var OsdWindow = new Lang.Class({ | |||||||
|         this.actor.hide(); |         this.actor.hide(); | ||||||
|         this.setLabel(null); |         this.setLabel(null); | ||||||
|         this.setLevel(null); |         this.setLevel(null); | ||||||
|  |         this.setMaxLevel(null); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _relayout() { |     _relayout() { | ||||||
| @@ -204,7 +221,7 @@ var OsdWindow = new Lang.Class({ | |||||||
|  |  | ||||||
|         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; |         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; | ||||||
|         this._icon.icon_size = popupSize / (2 * scaleFactor); |         this._icon.icon_size = popupSize / (2 * scaleFactor); | ||||||
|         this._box.translation_y = monitor.height / 4; |         this._box.translation_y = Math.round(monitor.height / 4); | ||||||
|         this._boxConstraint.minSize = popupSize; |         this._boxConstraint.minSize = popupSize; | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| @@ -233,24 +250,25 @@ var OsdWindowManager = new Lang.Class({ | |||||||
|         this._osdWindows.length = Main.layoutManager.monitors.length; |         this._osdWindows.length = Main.layoutManager.monitors.length; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _showOsdWindow(monitorIndex, icon, label, level) { |     _showOsdWindow(monitorIndex, icon, label, level, maxLevel) { | ||||||
|         this._osdWindows[monitorIndex].setIcon(icon); |         this._osdWindows[monitorIndex].setIcon(icon); | ||||||
|         this._osdWindows[monitorIndex].setLabel(label); |         this._osdWindows[monitorIndex].setLabel(label); | ||||||
|         this._osdWindows[monitorIndex].setLevel(level); |         this._osdWindows[monitorIndex].setLevel(level); | ||||||
|  |         this._osdWindows[monitorIndex].setMaxLevel(maxLevel); | ||||||
|         this._osdWindows[monitorIndex].show(); |         this._osdWindows[monitorIndex].show(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     show(monitorIndex, icon, label, level) { |     show(monitorIndex, icon, label, level, maxLevel) { | ||||||
|         if (monitorIndex != -1) { |         if (monitorIndex != -1) { | ||||||
|             for (let i = 0; i < this._osdWindows.length; i++) { |             for (let i = 0; i < this._osdWindows.length; i++) { | ||||||
|                 if (i == monitorIndex) |                 if (i == monitorIndex) | ||||||
|                     this._showOsdWindow(i, icon, label, level); |                     this._showOsdWindow(i, icon, label, level, maxLevel); | ||||||
|                 else |                 else | ||||||
|                     this._osdWindows[i].cancel(); |                     this._osdWindows[i].cancel(); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             for (let i = 0; i < this._osdWindows.length; i++) |             for (let i = 0; i < this._osdWindows.length; i++) | ||||||
|                 this._showOsdWindow(i, icon, label, level); |                 this._showOsdWindow(i, icon, label, level, maxLevel); | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|   | |||||||
| @@ -157,7 +157,7 @@ var Overview = new Lang.Class({ | |||||||
|         Main.xdndHandler.connect('drag-begin', this._onDragBegin.bind(this)); |         Main.xdndHandler.connect('drag-begin', this._onDragBegin.bind(this)); | ||||||
|         Main.xdndHandler.connect('drag-end', this._onDragEnd.bind(this)); |         Main.xdndHandler.connect('drag-end', this._onDragEnd.bind(this)); | ||||||
|  |  | ||||||
|         global.screen.connect('restacked', this._onRestacked.bind(this)); |         global.display.connect('restacked', this._onRestacked.bind(this)); | ||||||
|  |  | ||||||
|         this._windowSwitchTimeoutId = 0; |         this._windowSwitchTimeoutId = 0; | ||||||
|         this._windowSwitchTimestamp = 0; |         this._windowSwitchTimestamp = 0; | ||||||
| @@ -286,7 +286,8 @@ var Overview = new Lang.Class({ | |||||||
|  |  | ||||||
|         DND.addDragMonitor(this._dragMonitor); |         DND.addDragMonitor(this._dragMonitor); | ||||||
|         // Remember the workspace we started from |         // Remember the workspace we started from | ||||||
|         this._lastActiveWorkspaceIndex = global.screen.get_active_workspace_index(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         this._lastActiveWorkspaceIndex = workspaceManager.get_active_workspace_index(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onDragEnd(time) { |     _onDragEnd(time) { | ||||||
| @@ -296,7 +297,8 @@ var Overview = new Lang.Class({ | |||||||
|         // we have to go back to where we started and hide |         // we have to go back to where we started and hide | ||||||
|         // the overview |         // the overview | ||||||
|         if (this._shown) { |         if (this._shown) { | ||||||
|             global.screen.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time); |             let workspaceManager = global.workspace_manager; | ||||||
|  |             workspaceManager.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time); | ||||||
|             this.hide(); |             this.hide(); | ||||||
|         } |         } | ||||||
|         this._resetWindowSwitchTimeout(); |         this._resetWindowSwitchTimeout(); | ||||||
| @@ -317,9 +319,9 @@ var Overview = new Lang.Class({ | |||||||
|         let display = Gdk.Display.get_default(); |         let display = Gdk.Display.get_default(); | ||||||
|         let deviceManager = display.get_device_manager(); |         let deviceManager = display.get_device_manager(); | ||||||
|         let pointer = deviceManager.get_client_pointer(); |         let pointer = deviceManager.get_client_pointer(); | ||||||
|         let [screen, pointerX, pointerY] = pointer.get_position(); |         let [gdkScreen, pointerX, pointerY] = pointer.get_position(); | ||||||
|  |  | ||||||
|         pointer.warp(screen, pointerX, pointerY); |         pointer.warp(gdkScreen, pointerX, pointerY); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onDragMotion(dragEvent) { |     _onDragMotion(dragEvent) { | ||||||
| @@ -488,7 +490,8 @@ var Overview = new Lang.Class({ | |||||||
|             return false; |             return false; | ||||||
|         if (this._inItemDrag || this._inWindowDrag) |         if (this._inItemDrag || this._inWindowDrag) | ||||||
|             return false; |             return false; | ||||||
|         if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT) |         if (this._activationTime == 0 || | ||||||
|  |             GLib.get_monotonic_time() / GLib.USEC_PER_SEC - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT) | ||||||
|             return true; |             return true; | ||||||
|         return false; |         return false; | ||||||
|     }, |     }, | ||||||
| @@ -547,9 +550,9 @@ var Overview = new Lang.Class({ | |||||||
|         this.visible = true; |         this.visible = true; | ||||||
|         this.animationInProgress = true; |         this.animationInProgress = true; | ||||||
|         this.visibleTarget = true; |         this.visibleTarget = true; | ||||||
|         this._activationTime = Date.now() / 1000; |         this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC; | ||||||
|  |  | ||||||
|         Meta.disable_unredirect_for_screen(global.screen); |         Meta.disable_unredirect_for_display(global.display); | ||||||
|         this.viewSelector.show(); |         this.viewSelector.show(); | ||||||
|  |  | ||||||
|         this._overview.opacity = 0; |         this._overview.opacity = 0; | ||||||
| @@ -634,7 +637,7 @@ var Overview = new Lang.Class({ | |||||||
|  |  | ||||||
|     _hideDone() { |     _hideDone() { | ||||||
|         // Re-enable unredirection |         // Re-enable unredirection | ||||||
|         Meta.enable_unredirect_for_screen(global.screen); |         Meta.enable_unredirect_for_display(global.display); | ||||||
|  |  | ||||||
|         this.viewSelector.hide(); |         this.viewSelector.hide(); | ||||||
|         this._desktopFade.hide(); |         this._desktopFade.hide(); | ||||||
|   | |||||||
| @@ -313,6 +313,8 @@ var PadDiagram = new Lang.Class({ | |||||||
|     _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); | ||||||
|  |         if (css instanceof Uint8Array) | ||||||
|  |             css = imports.byteArray.toString(css); | ||||||
|         this._curEdited = null; |         this._curEdited = null; | ||||||
|         this._prevEdited = null; |         this._prevEdited = null; | ||||||
|         this._css = css; |         this._css = css; | ||||||
|   | |||||||
| @@ -265,7 +265,8 @@ var AppMenuButton = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _findTargetApp() { |     _findTargetApp() { | ||||||
|         let workspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let workspace = workspaceManager.get_active_workspace(); | ||||||
|         let tracker = Shell.WindowTracker.get_default(); |         let tracker = Shell.WindowTracker.get_default(); | ||||||
|         let focusedApp = tracker.focus_app; |         let focusedApp = tracker.focus_app; | ||||||
|         if (focusedApp && focusedApp.is_on_workspace(workspace)) |         if (focusedApp && focusedApp.is_on_workspace(workspace)) | ||||||
| @@ -709,6 +710,7 @@ var AggregateMenu = new Lang.Class({ | |||||||
|             this._bluetooth = null; |             this._bluetooth = null; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet(); | ||||||
|         this._power = new imports.ui.status.power.Indicator(); |         this._power = new imports.ui.status.power.Indicator(); | ||||||
|         this._rfkill = new imports.ui.status.rfkill.Indicator(); |         this._rfkill = new imports.ui.status.rfkill.Indicator(); | ||||||
|         this._volume = new imports.ui.status.volume.Indicator(); |         this._volume = new imports.ui.status.volume.Indicator(); | ||||||
| @@ -729,6 +731,7 @@ var AggregateMenu = new Lang.Class({ | |||||||
|         if (this._bluetooth) { |         if (this._bluetooth) { | ||||||
|             this._indicators.add_child(this._bluetooth.indicators); |             this._indicators.add_child(this._bluetooth.indicators); | ||||||
|         } |         } | ||||||
|  |         this._indicators.add_child(this._remoteAccess.indicators); | ||||||
|         this._indicators.add_child(this._rfkill.indicators); |         this._indicators.add_child(this._rfkill.indicators); | ||||||
|         this._indicators.add_child(this._volume.indicators); |         this._indicators.add_child(this._volume.indicators); | ||||||
|         this._indicators.add_child(this._power.indicators); |         this._indicators.add_child(this._power.indicators); | ||||||
| @@ -743,6 +746,7 @@ var AggregateMenu = new Lang.Class({ | |||||||
|         if (this._bluetooth) { |         if (this._bluetooth) { | ||||||
|             this.menu.addMenuItem(this._bluetooth.menu); |             this.menu.addMenuItem(this._bluetooth.menu); | ||||||
|         } |         } | ||||||
|  |         this.menu.addMenuItem(this._remoteAccess.menu); | ||||||
|         this.menu.addMenuItem(this._location.menu); |         this.menu.addMenuItem(this._location.menu); | ||||||
|         this.menu.addMenuItem(this._rfkill.menu); |         this.menu.addMenuItem(this._rfkill.menu); | ||||||
|         this.menu.addMenuItem(this._power.menu); |         this.menu.addMenuItem(this._power.menu); | ||||||
| @@ -796,6 +800,7 @@ var Panel = new Lang.Class({ | |||||||
|         this.actor.connect('get-preferred-height', this._getPreferredHeight.bind(this)); |         this.actor.connect('get-preferred-height', this._getPreferredHeight.bind(this)); | ||||||
|         this.actor.connect('allocate', this._allocate.bind(this)); |         this.actor.connect('allocate', this._allocate.bind(this)); | ||||||
|         this.actor.connect('button-press-event', this._onButtonPress.bind(this)); |         this.actor.connect('button-press-event', this._onButtonPress.bind(this)); | ||||||
|  |         this.actor.connect('touch-event', this._onButtonPress.bind(this)); | ||||||
|         this.actor.connect('key-press-event', this._onKeyPress.bind(this)); |         this.actor.connect('key-press-event', this._onKeyPress.bind(this)); | ||||||
|  |  | ||||||
|         Main.overview.connect('showing', () => { |         Main.overview.connect('showing', () => { | ||||||
| @@ -818,7 +823,7 @@ var Panel = new Lang.Class({ | |||||||
|         global.window_group.connect('actor-removed', this._onWindowActorRemoved.bind(this)); |         global.window_group.connect('actor-removed', this._onWindowActorRemoved.bind(this)); | ||||||
|         global.window_manager.connect('switch-workspace', this._updateSolidStyle.bind(this)); |         global.window_manager.connect('switch-workspace', this._updateSolidStyle.bind(this)); | ||||||
|  |  | ||||||
|         global.screen.connect('workareas-changed', () => { this.actor.queue_relayout(); }); |         global.display.connect('workareas-changed', () => { this.actor.queue_relayout(); }); | ||||||
|         this._updatePanel(); |         this._updatePanel(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -939,8 +944,13 @@ var Panel = new Lang.Class({ | |||||||
|         if (event.get_source() != actor) |         if (event.get_source() != actor) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         let button = event.get_button(); |         let type = event.type(); | ||||||
|         if (button != 1) |         let isPress = type == Clutter.EventType.BUTTON_PRESS; | ||||||
|  |         if (!isPress && type != Clutter.EventType.TOUCH_BEGIN) | ||||||
|  |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|  |         let button = isPress ? event.get_button() : -1; | ||||||
|  |         if (isPress && button != 1) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         let focusWindow = global.display.focus_window; |         let focusWindow = global.display.focus_window; | ||||||
| @@ -961,8 +971,7 @@ var Panel = new Lang.Class({ | |||||||
|         if (!allowDrag) |         if (!allowDrag) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         global.display.begin_grab_op(global.screen, |         global.display.begin_grab_op(dragWindow, | ||||||
|                                      dragWindow, |  | ||||||
|                                      Meta.GrabOp.MOVING, |                                      Meta.GrabOp.MOVING, | ||||||
|                                      false, /* pointer grab */ |                                      false, /* pointer grab */ | ||||||
|                                      true, /* frame action */ |                                      true, /* frame action */ | ||||||
| @@ -977,7 +986,7 @@ var Panel = new Lang.Class({ | |||||||
|     _onKeyPress(actor, event) { |     _onKeyPress(actor, event) { | ||||||
|         let symbol = event.get_key_symbol(); |         let symbol = event.get_key_symbol(); | ||||||
|         if (symbol == Clutter.KEY_Escape) { |         if (symbol == Clutter.KEY_Escape) { | ||||||
|             global.screen.focus_default_window(event.get_time()); |             global.display.focus_default_window(event.get_time()); | ||||||
|             return Clutter.EVENT_STOP; |             return Clutter.EVENT_STOP; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -1075,7 +1084,8 @@ var Panel = new Lang.Class({ | |||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         /* Get all the windows in the active workspace that are in the primary monitor and visible */ |         /* Get all the windows in the active workspace that are in the primary monitor and visible */ | ||||||
|         let activeWorkspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|         let windows = activeWorkspace.list_windows().filter(metaWindow => { |         let windows = activeWorkspace.list_windows().filter(metaWindow => { | ||||||
|             return metaWindow.is_on_primary_monitor() && |             return metaWindow.is_on_primary_monitor() && | ||||||
|                    metaWindow.showing_on_its_workspace() && |                    metaWindow.showing_on_its_workspace() && | ||||||
|   | |||||||
| @@ -141,8 +141,17 @@ var PopupBaseMenuItem = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onKeyPressEvent(actor, event) { |     _onKeyPressEvent(actor, event) { | ||||||
|         let symbol = event.get_key_symbol(); |         let state = event.get_state(); | ||||||
|  |  | ||||||
|  |         // if user has a modifier down (except capslock) | ||||||
|  |         // then don't handle the key press here | ||||||
|  |         state &= ~Clutter.ModifierType.LOCK_MASK; | ||||||
|  |         state &= Clutter.ModifierType.MODIFIER_MASK; | ||||||
|  |  | ||||||
|  |         if (state) | ||||||
|  |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|  |         let symbol = event.get_key_symbol(); | ||||||
|         if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { |         if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { | ||||||
|             this.activate(event); |             this.activate(event); | ||||||
|             return Clutter.EVENT_STOP; |             return Clutter.EVENT_STOP; | ||||||
| @@ -394,8 +403,9 @@ var PopupImageMenuItem = new Lang.Class({ | |||||||
|     _init(text, icon, params) { |     _init(text, icon, params) { | ||||||
|         this.parent(params); |         this.parent(params); | ||||||
|  |  | ||||||
|         this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); |         this._icon = new St.Icon({ style_class: 'popup-menu-icon', | ||||||
|         this.actor.add_child(this._icon, { align: St.Align.END }); |                                    x_align: Clutter.ActorAlign.END }); | ||||||
|  |         this.actor.add_child(this._icon); | ||||||
|         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; | ||||||
|   | |||||||
| @@ -119,6 +119,9 @@ var RemoteMenuItemMapper = new Lang.Class({ | |||||||
|         this._trackerItem = trackerItem; |         this._trackerItem = trackerItem; | ||||||
|  |  | ||||||
|         this.menuItem = new PopupMenu.PopupBaseMenuItem(); |         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._label = new St.Label(); | ||||||
|         this.menuItem.actor.add_child(this._label); |         this.menuItem.actor.add_child(this._label); | ||||||
|         this.menuItem.actor.label_actor = this._label; |         this.menuItem.actor.label_actor = this._label; | ||||||
| @@ -129,11 +132,13 @@ var RemoteMenuItemMapper = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE); |         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::label', this._updateLabel.bind(this)); | ||||||
|         this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this)); |         this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this)); | ||||||
|         this._trackerItem.connect('notify::role', this._updateRole.bind(this)); |         this._trackerItem.connect('notify::role', this._updateRole.bind(this)); | ||||||
|         this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this)); |         this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this)); | ||||||
|  |  | ||||||
|  |         this._updateIcon(); | ||||||
|         this._updateLabel(); |         this._updateLabel(); | ||||||
|         this._updateSensitivity(); |         this._updateSensitivity(); | ||||||
|         this._updateRole(); |         this._updateRole(); | ||||||
| @@ -143,6 +148,11 @@ var RemoteMenuItemMapper = new Lang.Class({ | |||||||
|         }); |         }); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _updateIcon() { | ||||||
|  |         this._icon.gicon = this._trackerItem.icon; | ||||||
|  |         this._icon.visible = (this._icon.gicon != null); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _updateLabel() { |     _updateLabel() { | ||||||
|         this._label.text = stripMnemonics(this._trackerItem.label); |         this._label.text = stripMnemonics(this._trackerItem.label); | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -295,7 +295,7 @@ var RemoteSearchProvider = new Lang.Class({ | |||||||
|                                name: metas[i]['name'], |                                name: metas[i]['name'], | ||||||
|                                description: metas[i]['description'], |                                description: metas[i]['description'], | ||||||
|                                createIcon: size => { |                                createIcon: size => { | ||||||
|                                    this.createIcon(size, metas[i]); |                                    return this.createIcon(size, metas[i]); | ||||||
|                                }, |                                }, | ||||||
|                                clipboardText: metas[i]['clipboardText'] }); |                                clipboardText: metas[i]['clipboardText'] }); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -62,7 +62,11 @@ var RunDialog = new Lang.Class({ | |||||||
|                                    'rt': () => { |                                    'rt': () => { | ||||||
|                                        Main.reloadThemeResource(); |                                        Main.reloadThemeResource(); | ||||||
|                                        Main.loadTheme(); |                                        Main.loadTheme(); | ||||||
|                                    } |                                    }, | ||||||
|  |  | ||||||
|  |                                    'check_cloexec_fds': () => { | ||||||
|  |                                        Shell.util_check_cloexec_fds(); | ||||||
|  |                                    }, | ||||||
|                                  }; |                                  }; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -172,9 +176,10 @@ var RunDialog = new Lang.Class({ | |||||||
|                     if (name.slice(0, text.length) == text) |                     if (name.slice(0, text.length) == text) | ||||||
|                         results.push(name); |                         results.push(name); | ||||||
|                 } |                 } | ||||||
|             } catch (e if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND) && |             } catch (e) { | ||||||
|                            !e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_DIRECTORY))) { |                 if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND) && | ||||||
|                 log(e); |                     !e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_DIRECTORY)) | ||||||
|  |                     log(e); | ||||||
|             } finally { |             } finally { | ||||||
|                 return results; |                 return results; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -570,7 +570,7 @@ var ScreenShield = new Lang.Class({ | |||||||
|         this._shortLightbox.connect('shown', this._onShortLightboxShown.bind(this)); |         this._shortLightbox.connect('shown', this._onShortLightboxShown.bind(this)); | ||||||
|  |  | ||||||
|         this.idleMonitor = Meta.IdleMonitor.get_core(); |         this.idleMonitor = Meta.IdleMonitor.get_core(); | ||||||
|         this._cursorTracker = Meta.CursorTracker.get_for_screen(global.screen); |         this._cursorTracker = Meta.CursorTracker.get_for_display(global.display); | ||||||
|  |  | ||||||
|         this._syncInhibitor(); |         this._syncInhibitor(); | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -56,7 +56,7 @@ var ScreencastService = new Lang.Class({ | |||||||
|         let recorder = this._recorders.get(sender); |         let recorder = this._recorders.get(sender); | ||||||
|         if (!recorder) { |         if (!recorder) { | ||||||
|             recorder = new Shell.Recorder({ stage: global.stage, |             recorder = new Shell.Recorder({ stage: global.stage, | ||||||
|                                             screen: global.screen }); |                                             display: global.display }); | ||||||
|             recorder._watchNameId = |             recorder._watchNameId = | ||||||
|                 Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, |                 Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, | ||||||
|                                    this._onNameVanished.bind(this)); |                                    this._onNameVanished.bind(this)); | ||||||
|   | |||||||
| @@ -55,6 +55,9 @@ const ScreenshotIface = '<node> \ | |||||||
|     <arg type="i" direction="in" name="width"/> \ |     <arg type="i" direction="in" name="width"/> \ | ||||||
|     <arg type="i" direction="in" name="height"/> \ |     <arg type="i" direction="in" name="height"/> \ | ||||||
| </method> \ | </method> \ | ||||||
|  | <method name="PickColor"> \ | ||||||
|  |     <arg type="a{sv}" direction="out" name="result"/> \ | ||||||
|  | </method> \ | ||||||
| </interface> \ | </interface> \ | ||||||
| </node>'; | </node>'; | ||||||
|  |  | ||||||
| @@ -72,10 +75,13 @@ var ScreenshotService = new Lang.Class({ | |||||||
|         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) { |     _createScreenshot(invocation, needsDisk=true) { | ||||||
|  |         let lockedDown = false; | ||||||
|  |         if (needsDisk) | ||||||
|  |             lockedDown = this._lockdownSettings.get_boolean('disable-save-to-disk') | ||||||
|  |  | ||||||
|         let sender = invocation.get_sender(); |         let sender = invocation.get_sender(); | ||||||
|         if (this._screenShooter.has(sender) || |         if (this._screenShooter.has(sender) || lockedDown) { | ||||||
|             this._lockdownSettings.get_boolean('disable-save-to-disk')) { |  | ||||||
|             invocation.return_value(GLib.Variant.new('(bs)', [false, ''])); |             invocation.return_value(GLib.Variant.new('(bs)', [false, ''])); | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
| @@ -110,7 +116,7 @@ var ScreenshotService = new Lang.Class({ | |||||||
|                y + height <= global.screen_height; |                y + height <= global.screen_height; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onScreenshotComplete(obj, result, area, filenameUsed, flash, invocation) { |     _onScreenshotComplete(result, area, filenameUsed, flash, invocation) { | ||||||
|         if (result) { |         if (result) { | ||||||
|             if (flash) { |             if (flash) { | ||||||
|                 let flashspot = new Flashspot(area); |                 let flashspot = new Flashspot(area); | ||||||
| @@ -157,9 +163,15 @@ var ScreenshotService = new Lang.Class({ | |||||||
|         if (!screenshot) |         if (!screenshot) | ||||||
|             return; |             return; | ||||||
|         screenshot.screenshot_area (x, y, width, height, filename, |         screenshot.screenshot_area (x, y, width, height, filename, | ||||||
|             (obj, result, area, filenameUsed) => { |             (o, res) => { | ||||||
|                 this._onScreenshotComplete(obj, result, area, filenameUsed, |                 try { | ||||||
|                                            flash, invocation); |                     let [result, area, filenameUsed] = | ||||||
|  |                         screenshot.screenshot_area_finish(res); | ||||||
|  |                     this._onScreenshotComplete(result, area, filenameUsed, | ||||||
|  |                                                flash, invocation); | ||||||
|  |                 } catch (e) { | ||||||
|  |                     invocation.return_gerror (e); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -169,9 +181,15 @@ var ScreenshotService = new Lang.Class({ | |||||||
|         if (!screenshot) |         if (!screenshot) | ||||||
|             return; |             return; | ||||||
|         screenshot.screenshot_window (include_frame, include_cursor, filename, |         screenshot.screenshot_window (include_frame, include_cursor, filename, | ||||||
|             (obj, result, area, filenameUsed) => { |             (o, res) => { | ||||||
|                 this._onScreenshotComplete(obj, result, area, filenameUsed, |                 try { | ||||||
|                                            flash, invocation); |                     let [result, area, filenameUsed] = | ||||||
|  |                         screenshot.screenshot_window_finish(res); | ||||||
|  |                     this._onScreenshotComplete(result, area, filenameUsed, | ||||||
|  |                                                flash, invocation); | ||||||
|  |                 } catch (e) { | ||||||
|  |                     invocation.return_gerror (e); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -181,9 +199,15 @@ var ScreenshotService = new Lang.Class({ | |||||||
|         if (!screenshot) |         if (!screenshot) | ||||||
|             return; |             return; | ||||||
|         screenshot.screenshot(include_cursor, filename, |         screenshot.screenshot(include_cursor, filename, | ||||||
|             (obj, result, area, filenameUsed) => { |             (o, res) => { | ||||||
|                 this._onScreenshotComplete(obj, result, area, filenameUsed, |                 try { | ||||||
|                                            flash, invocation); |                     let [result, area, filenameUsed] = | ||||||
|  |                         screenshot.screenshot_finish(res); | ||||||
|  |                     this._onScreenshotComplete(result, area, filenameUsed, | ||||||
|  |                                                flash, invocation); | ||||||
|  |                 } catch (e) { | ||||||
|  |                     invocation.return_gerror (e); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -215,6 +239,34 @@ 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) { | ||||||
|  |         let pickPixel = new PickPixel(); | ||||||
|  |         pickPixel.show(); | ||||||
|  |         pickPixel.connect('finished', (pickPixel, coords) => { | ||||||
|  |             if (coords) { | ||||||
|  |                 let screenshot = this._createScreenshot(invocation, false); | ||||||
|  |                 if (!screenshot) | ||||||
|  |                     return; | ||||||
|  |                 screenshot.pick_color(...coords, (o, res) => { | ||||||
|  |                     let [success, color] = screenshot.pick_color_finish(res); | ||||||
|  |                     let { red, green, blue } = color; | ||||||
|  |                     let retval = GLib.Variant.new('(a{sv})', [{ | ||||||
|  |                         color: GLib.Variant.new('(ddd)', [ | ||||||
|  |                             red / 255.0, | ||||||
|  |                             green / 255.0, | ||||||
|  |                             blue / 255.0 | ||||||
|  |                         ]) | ||||||
|  |                     }]); | ||||||
|  |                     this._removeShooterForSender(invocation.get_sender()); | ||||||
|  |                     invocation.return_value(retval); | ||||||
|  |                 }); | ||||||
|  |             } else { | ||||||
|  |                 invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, | ||||||
|  |                     "Operation was cancelled"); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
| @@ -261,7 +313,7 @@ var SelectArea = new Lang.Class({ | |||||||
|                                      onUngrab: this._onUngrab.bind(this) })) |                                      onUngrab: this._onUngrab.bind(this) })) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         global.screen.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; | ||||||
|     }, |     }, | ||||||
| @@ -330,7 +382,7 @@ var SelectArea = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onUngrab() { |     _onUngrab() { | ||||||
|         global.screen.set_cursor(Meta.Cursor.DEFAULT); |         global.display.set_cursor(Meta.Cursor.DEFAULT); | ||||||
|         this.emit('finished', this._result); |         this.emit('finished', this._result); | ||||||
|  |  | ||||||
|         GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { |         GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { | ||||||
| @@ -341,6 +393,54 @@ var SelectArea = new Lang.Class({ | |||||||
| }); | }); | ||||||
| Signals.addSignalMethods(SelectArea.prototype); | Signals.addSignalMethods(SelectArea.prototype); | ||||||
|  |  | ||||||
|  | var PickPixel = new Lang.Class({ | ||||||
|  |     Name: 'PickPixel', | ||||||
|  |  | ||||||
|  |     _init() { | ||||||
|  |         this._result = null; | ||||||
|  |  | ||||||
|  |         this._group = new St.Widget({ visible: false, | ||||||
|  |                                       reactive: true }); | ||||||
|  |         Main.uiGroup.add_actor(this._group); | ||||||
|  |  | ||||||
|  |         this._grabHelper = new GrabHelper.GrabHelper(this._group); | ||||||
|  |  | ||||||
|  |         this._group.connect('button-release-event', | ||||||
|  |                             this._onButtonRelease.bind(this)); | ||||||
|  |  | ||||||
|  |         let constraint = new Clutter.BindConstraint({ source: global.stage, | ||||||
|  |                                                       coordinate: Clutter.BindCoordinate.ALL }); | ||||||
|  |         this._group.add_constraint(constraint); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     show() { | ||||||
|  |         if (!this._grabHelper.grab({ actor: this._group, | ||||||
|  |                                      onUngrab: this._onUngrab.bind(this) })) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         global.display.set_cursor(Meta.Cursor.CROSSHAIR); | ||||||
|  |         Main.uiGroup.set_child_above_sibling(this._group, null); | ||||||
|  |         this._group.visible = true; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _onButtonRelease(actor, event) { | ||||||
|  |         this._result = event.get_coords(); | ||||||
|  |         this._grabHelper.ungrab(); | ||||||
|  |         return Clutter.EVENT_PROPAGATE; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _onUngrab() { | ||||||
|  |         global.display.set_cursor(Meta.Cursor.DEFAULT); | ||||||
|  |         this.emit('finished', this._result); | ||||||
|  |  | ||||||
|  |         GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { | ||||||
|  |             this._group.destroy(); | ||||||
|  |             return GLib.SOURCE_REMOVE; | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  | 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 = new Lang.Class({ | ||||||
|   | |||||||
| @@ -133,7 +133,7 @@ function _callRemote(obj, method, ...args) { | |||||||
|  * because of the normal X asynchronous mapping process, to actually wait |  * because of the normal X asynchronous mapping process, to actually wait | ||||||
|  * until the window has been mapped and exposed, use waitTestWindows(). |  * until the window has been mapped and exposed, use waitTestWindows(). | ||||||
|  */ |  */ | ||||||
| function createTestWindow(width, height, params) { | function createTestWindow(params) { | ||||||
|     params = Params.parse(params, { width: 640, |     params = Params.parse(params, { width: 640, | ||||||
|                                     height: 480, |                                     height: 480, | ||||||
|                                     alpha: false, |                                     alpha: false, | ||||||
| @@ -216,12 +216,14 @@ function _step(g, finish, onError) { | |||||||
|                          if (onError) |                          if (onError) | ||||||
|                              onError(err); |                              onError(err); | ||||||
|                      }); |                      }); | ||||||
|     } catch (err if err instanceof StopIteration) { |  | ||||||
|         if (finish) |  | ||||||
|             finish(); |  | ||||||
|     } catch (err) { |     } catch (err) { | ||||||
|         if (onError) |         if (err instanceof StopIteration) { | ||||||
|             onError(err); |             if (finish) | ||||||
|  |                 finish(); | ||||||
|  |         } else { | ||||||
|  |             if (onError) | ||||||
|  |                 onError(err); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -117,6 +117,8 @@ function _loadMode(file, info) { | |||||||
|     let fileContent, success, tag, newMode; |     let fileContent, success, tag, newMode; | ||||||
|     try { |     try { | ||||||
|         [success, fileContent, tag] = file.load_contents(null); |         [success, fileContent, tag] = file.load_contents(null); | ||||||
|  |         if (fileContent instanceof Uint8Array) | ||||||
|  |             fileContent = imports.byteArray.toString(fileContent); | ||||||
|         newMode = JSON.parse(fileContent); |         newMode = JSON.parse(fileContent); | ||||||
|     } catch(e) { |     } catch(e) { | ||||||
|         return; |         return; | ||||||
|   | |||||||
| @@ -148,12 +148,13 @@ var GnomeShell = new Lang.Class({ | |||||||
|         let monitorIndex = params['monitor'] || -1; |         let monitorIndex = params['monitor'] || -1; | ||||||
|         let label = params['label'] || undefined; |         let label = params['label'] || undefined; | ||||||
|         let level = params['level'] || undefined; |         let level = params['level'] || undefined; | ||||||
|  |         let maxLevel = params['max_level'] || undefined; | ||||||
|  |  | ||||||
|         let icon = null; |         let icon = null; | ||||||
|         if (params['icon']) |         if (params['icon']) | ||||||
|             icon = Gio.Icon.new_for_string(params['icon']); |             icon = Gio.Icon.new_for_string(params['icon']); | ||||||
|  |  | ||||||
|         Main.osdWindowManager.show(monitorIndex, icon, label, level); |         Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     FocusApp(id) { |     FocusApp(id) { | ||||||
|   | |||||||
| @@ -55,11 +55,11 @@ var EntryMenu = new Lang.Class({ | |||||||
|  |  | ||||||
|         if (v) { |         if (v) { | ||||||
|             this._makePasswordItem(); |             this._makePasswordItem(); | ||||||
|             this._entry.input_purpose = Gtk.InputPurpose.PASSWORD; |             this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD; | ||||||
|         } else { |         } else { | ||||||
|             this._passwordItem.destroy(); |             this._passwordItem.destroy(); | ||||||
|             this._passwordItem = null; |             this._passwordItem = null; | ||||||
|             this._entry.input_purpose = Gtk.InputPurpose.FREE_FORM; |             this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL; | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										109
									
								
								js/ui/slider.js
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								js/ui/slider.js
									
									
									
									
									
								
							| @@ -7,55 +7,38 @@ const Lang = imports.lang; | |||||||
| const St = imports.gi.St; | const St = imports.gi.St; | ||||||
| const Signals = imports.signals; | const Signals = imports.signals; | ||||||
|  |  | ||||||
|  | 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 = new Lang.Class({ | ||||||
|     Name: "Slider", |     Name: "Slider", | ||||||
|  |     Extends: BarLevel.BarLevel, | ||||||
|  |  | ||||||
|     _init(value) { |     _init(value) { | ||||||
|         if (isNaN(value)) |         let params = { | ||||||
|             // Avoid spreading NaNs around |             styleClass: 'slider', | ||||||
|             throw TypeError('The slider value must be a number'); |             canFocus: true, | ||||||
|         this._value = Math.max(Math.min(value, 1), 0); |             reactive: true, | ||||||
|         this._sliderWidth = 0; |             accessibleRole: Atk.Role.SLIDER, | ||||||
|  |         } | ||||||
|  |         this.parent(value, params) | ||||||
|  |  | ||||||
|         this.actor = new St.DrawingArea({ style_class: 'slider', |  | ||||||
|                                           can_focus: true, |  | ||||||
|                                           reactive: true, |  | ||||||
|                                           accessible_role: Atk.Role.SLIDER }); |  | ||||||
|         this.actor.connect('repaint', this._sliderRepaint.bind(this)); |  | ||||||
|         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)); | ||||||
|         this.actor.connect('scroll-event', this._onScrollEvent.bind(this)); |         this.actor.connect('scroll-event', this._onScrollEvent.bind(this)); | ||||||
|         this.actor.connect('key-press-event', this.onKeyPressEvent.bind(this)); |         this.actor.connect('key-press-event', this.onKeyPressEvent.bind(this)); | ||||||
|         this.actor.connect('allocation-changed', (actor, box) => { |  | ||||||
|             this._sliderWidth = box.get_width(); |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         this._releaseId = this._motionId = 0; |         this._releaseId = this._motionId = 0; | ||||||
|         this._dragging = false; |         this._dragging = false; | ||||||
|  |  | ||||||
|         this._customAccessible = St.GenericAccessible.new_for_actor(this.actor); |  | ||||||
|         this.actor.set_accessible(this._customAccessible); |  | ||||||
|  |  | ||||||
|         this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this)); |  | ||||||
|         this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this)); |  | ||||||
|         this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this)); |  | ||||||
|         this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this)); |         this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this)); | ||||||
|         this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this)); |  | ||||||
|  |  | ||||||
|         this.connect('value-changed', this._valueChanged.bind(this)); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     setValue(value) { |     _barLevelRepaint(area) { | ||||||
|         if (isNaN(value)) |         this.parent(area); | ||||||
|             throw TypeError('The slider value must be a number'); |  | ||||||
|  |  | ||||||
|         this._value = Math.max(Math.min(value, 1), 0); |         // Add handle | ||||||
|         this.actor.queue_repaint(); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _sliderRepaint(area) { |  | ||||||
|         let cr = area.get_context(); |         let cr = area.get_context(); | ||||||
|         let themeNode = area.get_theme_node(); |         let themeNode = area.get_theme_node(); | ||||||
|         let [width, height] = area.get_surface_size(); |         let [width, height] = area.get_surface_size(); | ||||||
| @@ -66,41 +49,9 @@ var Slider = new Lang.Class({ | |||||||
|         let [hasHandleColor, handleBorderColor] = |         let [hasHandleColor, handleBorderColor] = | ||||||
|             themeNode.lookup_color('-slider-handle-border-color', false); |             themeNode.lookup_color('-slider-handle-border-color', false); | ||||||
|  |  | ||||||
|         let sliderHeight = themeNode.get_length('-slider-height'); |  | ||||||
|  |  | ||||||
|         let sliderBorderWidth = themeNode.get_length('-slider-border-width'); |  | ||||||
|         let sliderBorderRadius = Math.min(width, sliderHeight) / 2; |  | ||||||
|  |  | ||||||
|         let sliderBorderColor = themeNode.get_color('-slider-border-color'); |  | ||||||
|         let sliderColor = themeNode.get_color('-slider-background-color'); |  | ||||||
|  |  | ||||||
|         let sliderActiveBorderColor = themeNode.get_color('-slider-active-border-color'); |  | ||||||
|         let sliderActiveColor = themeNode.get_color('-slider-active-background-color'); |  | ||||||
|  |  | ||||||
|         const TAU = Math.PI * 2; |         const TAU = Math.PI * 2; | ||||||
|  |  | ||||||
|         let handleX = handleRadius + (width - 2 * handleRadius) * this._value; |         let handleX = handleRadius + (width - 2 * handleRadius) * this._value / this._maxValue; | ||||||
|  |  | ||||||
|         cr.arc(sliderBorderRadius + sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 1/4, TAU * 3/4); |  | ||||||
|         cr.lineTo(handleX, (height - sliderHeight) / 2); |  | ||||||
|         cr.lineTo(handleX, (height + sliderHeight) / 2); |  | ||||||
|         cr.lineTo(sliderBorderRadius + sliderBorderWidth, (height + sliderHeight) / 2); |  | ||||||
|         Clutter.cairo_set_source_color(cr, sliderActiveColor); |  | ||||||
|         cr.fillPreserve(); |  | ||||||
|         Clutter.cairo_set_source_color(cr, sliderActiveBorderColor); |  | ||||||
|         cr.setLineWidth(sliderBorderWidth); |  | ||||||
|         cr.stroke(); |  | ||||||
|  |  | ||||||
|         cr.arc(width - sliderBorderRadius - sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 3/4, TAU * 1/4); |  | ||||||
|         cr.lineTo(handleX, (height + sliderHeight) / 2); |  | ||||||
|         cr.lineTo(handleX, (height - sliderHeight) / 2); |  | ||||||
|         cr.lineTo(width - sliderBorderRadius - sliderBorderWidth, (height - sliderHeight) / 2); |  | ||||||
|         Clutter.cairo_set_source_color(cr, sliderColor); |  | ||||||
|         cr.fillPreserve(); |  | ||||||
|         Clutter.cairo_set_source_color(cr, sliderBorderColor); |  | ||||||
|         cr.setLineWidth(sliderBorderWidth); |  | ||||||
|         cr.stroke(); |  | ||||||
|  |  | ||||||
|         let handleY = height / 2; |         let handleY = height / 2; | ||||||
|  |  | ||||||
|         let color = themeNode.get_foreground_color(); |         let color = themeNode.get_foreground_color(); | ||||||
| @@ -208,7 +159,7 @@ var Slider = new Lang.Class({ | |||||||
|             delta = -dy * SLIDER_SCROLL_STEP; |             delta = -dy * SLIDER_SCROLL_STEP; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._value = Math.min(Math.max(0, this._value + delta), 1); |         this._value = Math.min(Math.max(0, this._value + delta), this._maxValue); | ||||||
|  |  | ||||||
|         this.actor.queue_repaint(); |         this.actor.queue_repaint(); | ||||||
|         this.emit('value-changed', this._value); |         this.emit('value-changed', this._value); | ||||||
| @@ -230,7 +181,7 @@ var Slider = new Lang.Class({ | |||||||
|         let key = event.get_key_symbol(); |         let key = event.get_key_symbol(); | ||||||
|         if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) { |         if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) { | ||||||
|             let delta = key == Clutter.KEY_Right ? 0.1 : -0.1; |             let delta = key == Clutter.KEY_Right ? 0.1 : -0.1; | ||||||
|             this._value = Math.max(0, Math.min(this._value + delta, 1)); |             this._value = Math.max(0, Math.min(this._value + delta, this._maxValue)); | ||||||
|             this.actor.queue_repaint(); |             this.actor.queue_repaint(); | ||||||
|             this.emit('drag-begin'); |             this.emit('drag-begin'); | ||||||
|             this.emit('value-changed', this._value); |             this.emit('value-changed', this._value); | ||||||
| @@ -246,7 +197,7 @@ var Slider = new Lang.Class({ | |||||||
|         relX = absX - sliderX; |         relX = absX - sliderX; | ||||||
|         relY = absY - sliderY; |         relY = absY - sliderY; | ||||||
|  |  | ||||||
|         let width = this._sliderWidth; |         let width = this._barLevelWidth; | ||||||
|         let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius'); |         let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius'); | ||||||
|  |  | ||||||
|         let newvalue; |         let newvalue; | ||||||
| @@ -256,38 +207,14 @@ var Slider = new Lang.Class({ | |||||||
|             newvalue = 1; |             newvalue = 1; | ||||||
|         else |         else | ||||||
|             newvalue = (relX - handleRadius) / (width - 2 * handleRadius); |             newvalue = (relX - handleRadius) / (width - 2 * handleRadius); | ||||||
|         this._value = newvalue; |         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); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _getCurrentValue(actor) { |  | ||||||
|         return this._value; |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _getMinimumValue(actor) { |  | ||||||
|         return 0; |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _getMaximumValue(actor) { |  | ||||||
|         return 1; |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _getMinimumIncrement(actor) { |     _getMinimumIncrement(actor) { | ||||||
|         return 0.1; |         return 0.1; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _setCurrentValue(actor, value) { |  | ||||||
|         this._value = value; |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _valueChanged(slider, value, property) { |  | ||||||
|         this._customAccessible.notify ("accessible-value"); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     get value() { |  | ||||||
|         return this._value; |  | ||||||
|     } |  | ||||||
| }); | }); | ||||||
|  |  | ||||||
| Signals.addSignalMethods(Slider.prototype); | Signals.addSignalMethods(Slider.prototype); | ||||||
|   | |||||||
| @@ -398,7 +398,7 @@ var InputSourceManager = new Lang.Class({ | |||||||
|         return true; |         return true; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _switchInputSource(display, screen, window, binding) { |     _switchInputSource(display, window, binding) { | ||||||
|         if (this._mruSources.length < 2) |         if (this._mruSources.length < 2) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -995,8 +995,16 @@ var NMWirelessDialog = new Lang.Class({ | |||||||
|         else if (!oneHasConnection && twoHasConnection) |         else if (!oneHasConnection && twoHasConnection) | ||||||
|             return 1; |             return 1; | ||||||
|  |  | ||||||
|         let oneStrength = one.accessPoints[0].strength; |         let oneAp = one.accessPoints[0] || null; | ||||||
|         let twoStrength = two.accessPoints[0].strength; |         let twoAp = two.accessPoints[0] || null; | ||||||
|  |  | ||||||
|  |         if (oneAp != null && twoAp == null) | ||||||
|  |             return -1; | ||||||
|  |         else if (oneAp == null && twoAp != null) | ||||||
|  |             return 1; | ||||||
|  |  | ||||||
|  |         let oneStrength = oneAp.strength; | ||||||
|  |         let twoStrength = twoAp.strength; | ||||||
|  |  | ||||||
|         // place stronger connections first |         // place stronger connections first | ||||||
|         if (oneStrength != twoStrength) |         if (oneStrength != twoStrength) | ||||||
| @@ -1156,6 +1164,11 @@ var NMWirelessDialog = new Lang.Class({ | |||||||
|             Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor); |             Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor); | ||||||
|             this._selectNetwork(network); |             this._selectNetwork(network); | ||||||
|         }); |         }); | ||||||
|  |         network.item.actor.connect('destroy', () => { | ||||||
|  |             let keyFocus = global.stage.key_focus; | ||||||
|  |             if (keyFocus && keyFocus.contains(network.item.actor)) | ||||||
|  |                 this._itemBox.grab_key_focus(); | ||||||
|  |         }); | ||||||
|     }, |     }, | ||||||
| }); | }); | ||||||
|  |  | ||||||
| @@ -1944,6 +1957,7 @@ var NMApplet = new Lang.Class({ | |||||||
|         this.indicators.visible = this._client.nm_running; |         this.indicators.visible = this._client.nm_running; | ||||||
|         this.menu.actor.visible = this._client.networking_enabled; |         this.menu.actor.visible = this._client.networking_enabled; | ||||||
|  |  | ||||||
|  |         this._updateIcon(); | ||||||
|         this._syncConnectivity(); |         this._syncConnectivity(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										81
									
								
								js/ui/status/remoteAccess.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								js/ui/status/remoteAccess.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||||
|  |  | ||||||
|  | const Lang = imports.lang; | ||||||
|  | const Meta = imports.gi.Meta; | ||||||
|  |  | ||||||
|  | const PanelMenu = imports.ui.panelMenu; | ||||||
|  | const PopupMenu = imports.ui.popupMenu; | ||||||
|  |  | ||||||
|  | var RemoteAccessApplet = new Lang.Class({ | ||||||
|  |     Name: 'RemoteAccessApplet', | ||||||
|  |     Extends: PanelMenu.SystemIndicator, | ||||||
|  |  | ||||||
|  |     _init() { | ||||||
|  |         this.parent(); | ||||||
|  |  | ||||||
|  |         let backend = Meta.get_backend(); | ||||||
|  |         let controller = backend.get_remote_access_controller(); | ||||||
|  |  | ||||||
|  |         if (!controller) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         // We can't possibly know about all types of screen sharing on X11, so | ||||||
|  |         // showing these controls on X11 might give a false sense of security. | ||||||
|  |         // Thus, only enable these controls when using Wayland, where we are | ||||||
|  |         // in control of sharing. | ||||||
|  |         if (!Meta.is_wayland_compositor()) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         this._handles = new Set(); | ||||||
|  |         this._indicator = null; | ||||||
|  |         this._menuSection = null; | ||||||
|  |  | ||||||
|  |         controller.connect('new-handle', (controller, handle) => { | ||||||
|  |             this._onNewHandle(handle); | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _ensureControls() { | ||||||
|  |         if (this._indicator) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         this._indicator = this._addIndicator(); | ||||||
|  |         this._indicator.icon_name = 'screen-shared-symbolic'; | ||||||
|  |         this._indicator.add_style_class_name('remote-access-indicator'); | ||||||
|  |         this._item = | ||||||
|  |             new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"), | ||||||
|  |                                                true); | ||||||
|  |         this._item.menu.addAction(_("Turn off"), | ||||||
|  |                                   () => { | ||||||
|  |                                       for (let handle of this._handles) | ||||||
|  |                                             handle.stop(); | ||||||
|  |                                   }); | ||||||
|  |         this._item.icon.icon_name = 'screen-shared-symbolic'; | ||||||
|  |         this.menu.addMenuItem(this._item); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _sync() { | ||||||
|  |         if (this._handles.size == 0) { | ||||||
|  |             this._indicator.visible = false; | ||||||
|  |             this._item.actor.visible = false; | ||||||
|  |         } else { | ||||||
|  |             this._indicator.visible = true; | ||||||
|  |             this._item.actor.visible = true; | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _onStopped(handle) { | ||||||
|  |         this._handles.delete(handle); | ||||||
|  |         this._sync(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _onNewHandle(handle) { | ||||||
|  |         this._handles.add(handle); | ||||||
|  |         handle.connect('stopped', this._onStopped.bind(this)); | ||||||
|  |  | ||||||
|  |         if (this._handles.size == 1) { | ||||||
|  |             this._ensureControls(); | ||||||
|  |             this._sync(); | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | }); | ||||||
| @@ -261,8 +261,19 @@ var Indicator = new Lang.Class({ | |||||||
|         item = new PopupMenu.PopupBaseMenuItem({ reactive: false, |         item = new PopupMenu.PopupBaseMenuItem({ reactive: false, | ||||||
|                                                  can_focus: false }); |                                                  can_focus: false }); | ||||||
|  |  | ||||||
|         this._settingsAction = this._createActionButton('preferences-system-symbolic', _("Settings")); |         let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( | ||||||
|         this._settingsAction.connect('clicked', () => { this._onSettingsClicked(); }); |             'gnome-control-center.desktop' | ||||||
|  |         ); | ||||||
|  |         if (app) { | ||||||
|  |             let [icon, name] = [app.app_info.get_icon().names[0], | ||||||
|  |                                 app.get_name()]; | ||||||
|  |             this._settingsAction = this._createActionButton(icon, name); | ||||||
|  |             this._settingsAction.connect('clicked', | ||||||
|  |                                          this._onSettingsClicked.bind(this)); | ||||||
|  |         } else { | ||||||
|  |             log('Missing required core component Settings, expect trouble…'); | ||||||
|  |             this._settingsAction = new St.Widget(); | ||||||
|  |         } | ||||||
|         item.actor.add(this._settingsAction, { expand: true, x_fill: false }); |         item.actor.add(this._settingsAction, { expand: true, x_fill: false }); | ||||||
|  |  | ||||||
|         this._orientationLockAction = this._createActionButton('', _("Orientation Lock")); |         this._orientationLockAction = this._createActionButton('', _("Orientation Lock")); | ||||||
| @@ -280,7 +291,7 @@ var Indicator = new Lang.Class({ | |||||||
|                                           'icon-name', |                                           'icon-name', | ||||||
|                                           bindFlags); |                                           bindFlags); | ||||||
|  |  | ||||||
|         this._lockScreenAction = this._createActionButton('changes-prevent-symbolic', _("Lock")); |         this._lockScreenAction = this._createActionButton('changes-prevent', _("Lock")); | ||||||
|         this._lockScreenAction.connect('clicked', () => { |         this._lockScreenAction.connect('clicked', () => { | ||||||
|             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); |             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); | ||||||
|             this._systemActions.activateLockScreen(); |             this._systemActions.activateLockScreen(); | ||||||
| @@ -291,7 +302,7 @@ var Indicator = new Lang.Class({ | |||||||
|                                           'visible', |                                           'visible', | ||||||
|                                           bindFlags); |                                           bindFlags); | ||||||
|  |  | ||||||
|         this._suspendAction = this._createActionButton('media-playback-pause-symbolic', _("Suspend")); |         this._suspendAction = this._createActionButton('media-playback-pause', _("Suspend")); | ||||||
|         this._suspendAction.connect('clicked', () => { |         this._suspendAction.connect('clicked', () => { | ||||||
|             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); |             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); | ||||||
|             this._systemActions.activateSuspend(); |             this._systemActions.activateSuspend(); | ||||||
| @@ -301,7 +312,7 @@ var Indicator = new Lang.Class({ | |||||||
|                                           'visible', |                                           'visible', | ||||||
|                                           bindFlags); |                                           bindFlags); | ||||||
|  |  | ||||||
|         this._powerOffAction = this._createActionButton('system-shutdown-symbolic', _("Power Off")); |         this._powerOffAction = this._createActionButton('system-shutdown', _("Power Off")); | ||||||
|         this._powerOffAction.connect('clicked', () => { |         this._powerOffAction.connect('clicked', () => { | ||||||
|             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); |             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); | ||||||
|             this._systemActions.activatePowerOff(); |             this._systemActions.activatePowerOff(); | ||||||
| @@ -330,8 +341,7 @@ var Indicator = new Lang.Class({ | |||||||
|  |  | ||||||
|     _onSettingsClicked() { |     _onSettingsClicked() { | ||||||
|         this.menu.itemActivated(); |         this.menu.itemActivated(); | ||||||
|         let app = Shell.AppSystem.get_default().lookup_app('gnome-control-center.desktop'); |  | ||||||
|         Main.overview.hide(); |         Main.overview.hide(); | ||||||
|         app.activate(); |         this._settingsApp.activate(); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -49,19 +49,17 @@ const BoltDeviceInterface = '<node> \ | |||||||
|   </interface> \ |   </interface> \ | ||||||
| </node>'; | </node>'; | ||||||
|  |  | ||||||
| const BoltClientProxy = Gio.DBusProxy.makeProxyWrapper(BoltClientInterface); |  | ||||||
| const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface); | const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface); | ||||||
|  |  | ||||||
| /*  */ | /*  */ | ||||||
|  |  | ||||||
| var Status = { | var Status = { | ||||||
|     DISCONNECTED: 'disconnected', |     DISCONNECTED: 'disconnected', | ||||||
|  |     CONNECTING: 'connecting', | ||||||
|     CONNECTED: 'connected', |     CONNECTED: 'connected', | ||||||
|     AUTHORIZING: 'authorizing', |     AUTHORIZING: 'authorizing', | ||||||
|     AUTH_ERROR: 'auth-error', |     AUTH_ERROR: 'auth-error', | ||||||
|     AUTHORIZED: 'authorized', |     AUTHORIZED: 'authorized' | ||||||
|     AUTHORIZED_SECURE: 'authorized-secure', |  | ||||||
|     AUTHORIZED_NEWKEY: 'authorized-newkey' |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| var Policy = { | var Policy = { | ||||||
| @@ -70,7 +68,7 @@ var Policy = { | |||||||
|     AUTO: 'auto' |     AUTO: 'auto' | ||||||
| }; | }; | ||||||
|  |  | ||||||
| var AuthFlags = { | var AuthCtrl = { | ||||||
|     NONE: 'none', |     NONE: 'none', | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -79,6 +77,7 @@ var AuthMode = { | |||||||
|     ENABLED: 'enabled' |     ENABLED: 'enabled' | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | const BOLT_DBUS_CLIENT_IFACE = 'org.freedesktop.bolt1.Manager'; | ||||||
| const BOLT_DBUS_NAME = 'org.freedesktop.bolt'; | const BOLT_DBUS_NAME = 'org.freedesktop.bolt'; | ||||||
| const BOLT_DBUS_PATH = '/org/freedesktop/bolt'; | const BOLT_DBUS_PATH = '/org/freedesktop/bolt'; | ||||||
|  |  | ||||||
| @@ -88,22 +87,26 @@ var Client = new Lang.Class({ | |||||||
|     _init() { |     _init() { | ||||||
|  |  | ||||||
| 	this._proxy = null; | 	this._proxy = null; | ||||||
|         new BoltClientProxy( |         let nodeInfo = Gio.DBusNodeInfo.new_for_xml(BoltClientInterface); | ||||||
| 	    Gio.DBus.system, |         Gio.DBusProxy.new(Gio.DBus.system, | ||||||
| 	    BOLT_DBUS_NAME, |                           Gio.DBusProxyFlags.DO_NOT_AUTO_START, | ||||||
| 	    BOLT_DBUS_PATH, |                           nodeInfo.lookup_interface(BOLT_DBUS_CLIENT_IFACE), | ||||||
| 	    this._onProxyReady.bind(this) |                           BOLT_DBUS_NAME, | ||||||
| 	); |                           BOLT_DBUS_PATH, | ||||||
|  |                           BOLT_DBUS_CLIENT_IFACE, | ||||||
|  |                           null, | ||||||
|  |                           this._onProxyReady.bind(this)); | ||||||
|  |  | ||||||
| 	this.probing = false; | 	this.probing = false; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onProxyReady(proxy, error) { |     _onProxyReady(o, res) { | ||||||
| 	if (error !== null) { |         try { | ||||||
| 	    log('error creating bolt proxy: %s'.format(error.message)); | 	    this._proxy = Gio.DBusProxy.new_finish(res); | ||||||
| 	    return; |         } catch(e) { | ||||||
| 	} | 	    log('error creating bolt proxy: %s'.format(e.message)); | ||||||
| 	this._proxy = proxy; |             return; | ||||||
|  |         } | ||||||
| 	this._propsChangedId = this._proxy.connect('g-properties-changed', this._onPropertiesChanged.bind(this)); | 	this._propsChangedId = this._proxy.connect('g-properties-changed', this._onPropertiesChanged.bind(this)); | ||||||
| 	this._deviceAddedId = this._proxy.connectSignal('DeviceAdded', this._onDeviceAdded.bind(this)); | 	this._deviceAddedId = this._proxy.connectSignal('DeviceAdded', this._onDeviceAdded.bind(this)); | ||||||
|  |  | ||||||
| @@ -141,9 +144,10 @@ var Client = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     enrollDevice(id, policy, callback) { |     enrollDevice(id, policy, callback) { | ||||||
| 	this._proxy.EnrollDeviceRemote(id, policy, AuthFlags.NONE, | 	this._proxy.EnrollDeviceRemote(id, policy, AuthCtrl.NONE, | ||||||
|                                        (res, error) => { |                                        (res, error) => { | ||||||
| 	    if (error) { | 	    if (error) { | ||||||
|  | 		Gio.DBusError.strip_remote_error(error); | ||||||
| 		callback(null, error); | 		callback(null, error); | ||||||
| 		return; | 		return; | ||||||
| 	    } | 	    } | ||||||
| @@ -228,7 +232,7 @@ var AuthRobot = new Lang.Class({ | |||||||
|  |  | ||||||
|     _onEnrollDone(device, error) { |     _onEnrollDone(device, error) { | ||||||
| 	if (error) | 	if (error) | ||||||
| 	    this.emit('enroll-failed', error, device); | 	    this.emit('enroll-failed', device, error); | ||||||
|  |  | ||||||
| 	/* TODO: scan the list of devices to be authorized for children | 	/* TODO: scan the list of devices to be authorized for children | ||||||
| 	 *  of this device and remove them (and their children and | 	 *  of this device and remove them (and their children and | ||||||
| @@ -354,7 +358,7 @@ var Indicator = new Lang.Class({ | |||||||
|  |  | ||||||
|     _onEnrollFailed(obj, device, error) { |     _onEnrollFailed(obj, device, error) { | ||||||
| 	const title = _('Thunderbolt authorization error'); | 	const title = _('Thunderbolt authorization error'); | ||||||
| 	const body = _('Could not authorize the thunderbolt device: %s'.format(error.message)); | 	const body = _('Could not authorize the Thunderbolt device: %s'.format(error.message)); | ||||||
| 	this._notify(title, body); | 	this._notify(title, body); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,6 +12,8 @@ const PanelMenu = imports.ui.panelMenu; | |||||||
| const PopupMenu = imports.ui.popupMenu; | const PopupMenu = imports.ui.popupMenu; | ||||||
| const Slider = imports.ui.slider; | const Slider = imports.ui.slider; | ||||||
|  |  | ||||||
|  | const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent'; | ||||||
|  |  | ||||||
| var VOLUME_NOTIFY_ID = 1; | var VOLUME_NOTIFY_ID = 1; | ||||||
|  |  | ||||||
| // Each Gvc.MixerControl is a connection to PulseAudio, | // Each Gvc.MixerControl is a connection to PulseAudio, | ||||||
| @@ -36,6 +38,11 @@ var StreamSlider = new Lang.Class({ | |||||||
|         this.item = new PopupMenu.PopupBaseMenuItem({ activate: false }); |         this.item = new PopupMenu.PopupBaseMenuItem({ activate: false }); | ||||||
|  |  | ||||||
|         this._slider = new Slider.Slider(0); |         this._slider = new Slider.Slider(0); | ||||||
|  |  | ||||||
|  |         this._soundSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.sound' }); | ||||||
|  |         this._soundSettings.connect('changed::' + ALLOW_AMPLIFIED_VOLUME_KEY, this._amplifySettingsChanged.bind(this)); | ||||||
|  |         this._amplifySettingsChanged(); | ||||||
|  |  | ||||||
|         this._slider.connect('value-changed', this._sliderChanged.bind(this)); |         this._slider.connect('value-changed', this._sliderChanged.bind(this)); | ||||||
|         this._slider.connect('drag-end', this._notifyVolumeChange.bind(this)); |         this._slider.connect('drag-end', this._notifyVolumeChange.bind(this)); | ||||||
|  |  | ||||||
| @@ -135,21 +142,40 @@ var StreamSlider = new Lang.Class({ | |||||||
|         this.emit('stream-updated'); |         this.emit('stream-updated'); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _amplifySettingsChanged() { | ||||||
|  |         this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY); | ||||||
|  |  | ||||||
|  |         if (this._allowAmplified) | ||||||
|  |             this._slider.setMaximumValue(this.getMaxLevel() / 100); | ||||||
|  |         else | ||||||
|  |             this._slider.setMaximumValue(1); | ||||||
|  |  | ||||||
|  |         if (this._stream) | ||||||
|  |             this._updateVolume(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     getIcon() { |     getIcon() { | ||||||
|         if (!this._stream) |         if (!this._stream) | ||||||
|             return null; |             return null; | ||||||
|  |  | ||||||
|  |         let icons = ["audio-volume-muted-symbolic", | ||||||
|  |                      "audio-volume-low-symbolic", | ||||||
|  |                      "audio-volume-medium-symbolic", | ||||||
|  |                      "audio-volume-high-symbolic", | ||||||
|  |                      "audio-volume-overamplified-symbolic"]; | ||||||
|  |  | ||||||
|         let volume = this._stream.volume; |         let volume = this._stream.volume; | ||||||
|  |         let n; | ||||||
|         if (this._stream.is_muted || volume <= 0) { |         if (this._stream.is_muted || volume <= 0) { | ||||||
|             return 'audio-volume-muted-symbolic'; |             n = 0; | ||||||
|         } else { |         } else { | ||||||
|             let n = Math.floor(3 * volume / this._control.get_vol_max_norm()) + 1; |             n = Math.ceil(3 * volume / this._control.get_vol_max_norm()); | ||||||
|             if (n < 2) |             if (n < 1) | ||||||
|                 return 'audio-volume-low-symbolic'; |                 n = 1; | ||||||
|             if (n >= 3) |             else if (n > 3) | ||||||
|                 return 'audio-volume-high-symbolic'; |                 n = 4; | ||||||
|             return 'audio-volume-medium-symbolic'; |  | ||||||
|         } |         } | ||||||
|  |         return icons[n]; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     getLevel() { |     getLevel() { | ||||||
| @@ -157,6 +183,14 @@ var StreamSlider = new Lang.Class({ | |||||||
|             return null; |             return null; | ||||||
|  |  | ||||||
|         return 100 * this._stream.volume / this._control.get_vol_max_norm(); |         return 100 * this._stream.volume / this._control.get_vol_max_norm(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     getMaxLevel() { | ||||||
|  |         let maxVolume = this._control.get_vol_max_norm(); | ||||||
|  |         if (this._allowAmplified) | ||||||
|  |             maxVolume = this._control.get_vol_max_amplified(); | ||||||
|  |  | ||||||
|  |         return 100 * maxVolume / this._control.get_vol_max_norm(); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| Signals.addSignalMethods(StreamSlider.prototype); | Signals.addSignalMethods(StreamSlider.prototype); | ||||||
| @@ -310,6 +344,10 @@ var VolumeMenu = new Lang.Class({ | |||||||
|  |  | ||||||
|     getLevel() { |     getLevel() { | ||||||
|         return this._output.getLevel(); |         return this._output.getLevel(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     getMaxLevel() { | ||||||
|  |         return this._output.getMaxLevel(); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
| @@ -346,8 +384,9 @@ var Indicator = new Lang.Class({ | |||||||
|             return result; |             return result; | ||||||
|  |  | ||||||
|         let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() }); |         let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() }); | ||||||
|         let level = this._volumeMenu.getLevel(); |         let level = parseInt(this._volumeMenu.getLevel()); | ||||||
|         Main.osdWindowManager.show(-1, gicon, null, level); |         let maxLevel = parseInt(this._volumeMenu.getMaxLevel()); | ||||||
|  |         Main.osdWindowManager.show(-1, gicon, null, level, maxLevel); | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -192,7 +192,9 @@ var SwitcherPopup = new Lang.Class({ | |||||||
|         if (this._keyPressHandler(keysym, action) != Clutter.EVENT_PROPAGATE) |         if (this._keyPressHandler(keysym, action) != Clutter.EVENT_PROPAGATE) | ||||||
|             return Clutter.EVENT_STOP; |             return Clutter.EVENT_STOP; | ||||||
|  |  | ||||||
|         if (keysym == Clutter.Escape) |         // Note: pressing one of the below keys will destroy the popup only if | ||||||
|  |         // that key is not used by the active popup's keyboard shortcut | ||||||
|  |         if (keysym == Clutter.Escape || keysym == Clutter.Tab) | ||||||
|             this.destroy(); |             this.destroy(); | ||||||
|  |  | ||||||
|         return Clutter.EVENT_STOP; |         return Clutter.EVENT_STOP; | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| 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; | ||||||
|  | const GObject = imports.gi.GObject; | ||||||
| const Lang = imports.lang; | const Lang = imports.lang; | ||||||
| const Mainloop = imports.mainloop; | const Mainloop = imports.mainloop; | ||||||
| const Meta = imports.gi.Meta; | const Meta = imports.gi.Meta; | ||||||
| @@ -24,7 +25,7 @@ const EdgeDragAction = imports.ui.edgeDragAction; | |||||||
| const CloseDialog = imports.ui.closeDialog; | const CloseDialog = imports.ui.closeDialog; | ||||||
| const SwitchMonitor = imports.ui.switchMonitor; | const SwitchMonitor = imports.ui.switchMonitor; | ||||||
|  |  | ||||||
| const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; | var SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; | ||||||
| var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2; | var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2; | ||||||
| var SHOW_WINDOW_ANIMATION_TIME = 0.15; | var SHOW_WINDOW_ANIMATION_TIME = 0.15; | ||||||
| var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1; | var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1; | ||||||
| @@ -34,6 +35,7 @@ var WINDOW_ANIMATION_TIME = 0.25; | |||||||
| var DIM_BRIGHTNESS = -0.3; | var DIM_BRIGHTNESS = -0.3; | ||||||
| var DIM_TIME = 0.500; | var DIM_TIME = 0.500; | ||||||
| var UNDIM_TIME = 0.250; | var UNDIM_TIME = 0.250; | ||||||
|  | var MOTION_THRESHOLD = 100; | ||||||
|  |  | ||||||
| var ONE_SECOND = 1000; // in ms | var ONE_SECOND = 1000; // in ms | ||||||
|  |  | ||||||
| @@ -200,27 +202,25 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|         let tracker = Shell.WindowTracker.get_default(); |         let tracker = Shell.WindowTracker.get_default(); | ||||||
|         tracker.connect('startup-sequence-changed', this._queueCheckWorkspaces.bind(this)); |         tracker.connect('startup-sequence-changed', this._queueCheckWorkspaces.bind(this)); | ||||||
|  |  | ||||||
|         global.screen.connect('notify::n-workspaces', this._nWorkspacesChanged.bind(this)); |         let workspaceManager = global.workspace_manager; | ||||||
|         global.window_manager.connect('switch-workspace', this._queueCheckWorkspaces.bind(this)); |         workspaceManager.connect('notify::n-workspaces', | ||||||
|  |                                  this._nWorkspacesChanged.bind(this)); | ||||||
|  |         global.window_manager.connect('switch-workspace', | ||||||
|  |                                       this._queueCheckWorkspaces.bind(this)); | ||||||
|  |  | ||||||
|         global.screen.connect('window-entered-monitor', this._windowEnteredMonitor.bind(this)); |         global.display.connect('window-entered-monitor', | ||||||
|         global.screen.connect('window-left-monitor', this._windowLeftMonitor.bind(this)); |                                this._windowEnteredMonitor.bind(this)); | ||||||
|         global.screen.connect('restacked', this._windowsRestacked.bind(this)); |         global.display.connect('window-left-monitor', | ||||||
|  |                                this._windowLeftMonitor.bind(this)); | ||||||
|  |         global.display.connect('restacked', | ||||||
|  |                                this._windowsRestacked.bind(this)); | ||||||
|  |  | ||||||
|         this._workspaceSettings = this._getWorkspaceSettings(); |         this._workspaceSettings = new Gio.Settings({ schema_id: 'org.gnome.mutter' }); | ||||||
|         this._workspaceSettings.connect('changed::dynamic-workspaces', this._queueCheckWorkspaces.bind(this)); |         this._workspaceSettings.connect('changed::dynamic-workspaces', this._queueCheckWorkspaces.bind(this)); | ||||||
|  |  | ||||||
|         this._nWorkspacesChanged(); |         this._nWorkspacesChanged(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _getWorkspaceSettings() { |  | ||||||
|         let settings = global.get_overrides_settings(); |  | ||||||
|         if (settings && |  | ||||||
|             settings.settings_schema.list_keys().indexOf('dynamic-workspaces') > -1) |  | ||||||
|             return settings; |  | ||||||
|         return new Gio.Settings({ schema_id: 'org.gnome.mutter' }); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     blockUpdates() { |     blockUpdates() { | ||||||
|         this._pauseWorkspaceCheck = true; |         this._pauseWorkspaceCheck = true; | ||||||
|     }, |     }, | ||||||
| @@ -230,6 +230,7 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _checkWorkspaces() { |     _checkWorkspaces() { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|         let i; |         let i; | ||||||
|         let emptyWorkspaces = []; |         let emptyWorkspaces = []; | ||||||
|  |  | ||||||
| @@ -257,7 +258,7 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|         let sequences = Shell.WindowTracker.get_default().get_startup_sequences(); |         let sequences = Shell.WindowTracker.get_default().get_startup_sequences(); | ||||||
|         for (i = 0; i < sequences.length; i++) { |         for (i = 0; i < sequences.length; i++) { | ||||||
|             let index = sequences[i].get_workspace(); |             let index = sequences[i].get_workspace(); | ||||||
|             if (index >= 0 && index <= global.screen.n_workspaces) |             if (index >= 0 && index <= workspaceManager.n_workspaces) | ||||||
|                 emptyWorkspaces[index] = false; |                 emptyWorkspaces[index] = false; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -275,17 +276,17 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|  |  | ||||||
|         // If we don't have an empty workspace at the end, add one |         // If we don't have an empty workspace at the end, add one | ||||||
|         if (!emptyWorkspaces[emptyWorkspaces.length -1]) { |         if (!emptyWorkspaces[emptyWorkspaces.length -1]) { | ||||||
|             global.screen.append_new_workspace(false, global.get_current_time()); |             workspaceManager.append_new_workspace(false, global.get_current_time()); | ||||||
|             emptyWorkspaces.push(false); |             emptyWorkspaces.push(false); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         let activeWorkspaceIndex = global.screen.get_active_workspace_index(); |         let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); | ||||||
|         emptyWorkspaces[activeWorkspaceIndex] = false; |         emptyWorkspaces[activeWorkspaceIndex] = false; | ||||||
|  |  | ||||||
|         // Delete other empty workspaces; do it from the end to avoid index changes |         // Delete other empty workspaces; do it from the end to avoid index changes | ||||||
|         for (i = emptyWorkspaces.length - 2; i >= 0; i--) { |         for (i = emptyWorkspaces.length - 2; i >= 0; i--) { | ||||||
|             if (emptyWorkspaces[i]) |             if (emptyWorkspaces[i]) | ||||||
|                 global.screen.remove_workspace(this._workspaces[i], global.get_current_time()); |                 workspaceManager.remove_workspace(this._workspaces[i], global.get_current_time()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._checkWorkspacesId = 0; |         this._checkWorkspacesId = 0; | ||||||
| @@ -317,14 +318,14 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|         GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces'); |         GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces'); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _windowLeftMonitor(metaScreen, monitorIndex, metaWin) { |     _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { | ||||||
|         // If the window left the primary monitor, that |         // If the window left the primary monitor, that | ||||||
|         // might make that workspace empty |         // might make that workspace empty | ||||||
|         if (monitorIndex == Main.layoutManager.primaryIndex) |         if (monitorIndex == Main.layoutManager.primaryIndex) | ||||||
|             this._queueCheckWorkspaces(); |             this._queueCheckWorkspaces(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) { |     _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { | ||||||
|         // If the window entered the primary monitor, that |         // If the window entered the primary monitor, that | ||||||
|         // might make that workspace non-empty |         // might make that workspace non-empty | ||||||
|         if (monitorIndex == Main.layoutManager.primaryIndex) |         if (monitorIndex == Main.layoutManager.primaryIndex) | ||||||
| @@ -344,8 +345,9 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _nWorkspacesChanged() { |     _nWorkspacesChanged() { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|         let oldNumWorkspaces = this._workspaces.length; |         let oldNumWorkspaces = this._workspaces.length; | ||||||
|         let newNumWorkspaces = global.screen.n_workspaces; |         let newNumWorkspaces = workspaceManager.n_workspaces; | ||||||
|  |  | ||||||
|         if (oldNumWorkspaces == newNumWorkspaces) |         if (oldNumWorkspaces == newNumWorkspaces) | ||||||
|             return false; |             return false; | ||||||
| @@ -356,7 +358,7 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|  |  | ||||||
|             // Assume workspaces are only added at the end |             // Assume workspaces are only added at the end | ||||||
|             for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) |             for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) | ||||||
|                 this._workspaces[w] = global.screen.get_workspace_by_index(w); |                 this._workspaces[w] = workspaceManager.get_workspace_by_index(w); | ||||||
|  |  | ||||||
|             for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) { |             for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) { | ||||||
|                 let workspace = this._workspaces[w]; |                 let workspace = this._workspaces[w]; | ||||||
| @@ -370,7 +372,7 @@ var WorkspaceTracker = new Lang.Class({ | |||||||
|             let removedIndex; |             let removedIndex; | ||||||
|             let removedNum = oldNumWorkspaces - newNumWorkspaces; |             let removedNum = oldNumWorkspaces - newNumWorkspaces; | ||||||
|             for (let w = 0; w < oldNumWorkspaces; w++) { |             for (let w = 0; w < oldNumWorkspaces; w++) { | ||||||
|                 let workspace = global.screen.get_workspace_by_index(w); |                 let workspace = workspaceManager.get_workspace_by_index(w); | ||||||
|                 if (this._workspaces[w] != workspace) { |                 if (this._workspaces[w] != workspace) { | ||||||
|                     removedIndex = w; |                     removedIndex = w; | ||||||
|                     break; |                     break; | ||||||
| @@ -487,13 +489,8 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _checkActivated() { |     _checkActivated() { | ||||||
|         const MOTION_THRESHOLD = 50; |  | ||||||
|         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; |  | ||||||
|         let dir; |         let dir; | ||||||
|  |  | ||||||
|         if ((allowedModes & Main.actionMode) == 0) |  | ||||||
|             return; |  | ||||||
|  |  | ||||||
|         if (this._dy < -MOTION_THRESHOLD) |         if (this._dy < -MOTION_THRESHOLD) | ||||||
|             dir = Meta.MotionDirection.DOWN; |             dir = Meta.MotionDirection.DOWN; | ||||||
|         else if (this._dy > MOTION_THRESHOLD) |         else if (this._dy > MOTION_THRESHOLD) | ||||||
| @@ -503,26 +500,35 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({ | |||||||
|         else if (this._dx > MOTION_THRESHOLD) |         else if (this._dx > MOTION_THRESHOLD) | ||||||
|             dir = Meta.MotionDirection.LEFT; |             dir = Meta.MotionDirection.LEFT; | ||||||
|         else |         else | ||||||
|             return; |             return false; | ||||||
|  |  | ||||||
|         this.emit('activated', dir); |         this.emit('activated', dir); | ||||||
|  |         return true; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _handleEvent(actor, event) { |     _handleEvent(actor, event) { | ||||||
|  |         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; | ||||||
|  |  | ||||||
|         if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) |         if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         if (event.get_touchpad_gesture_finger_count() != 4) |         if (event.get_touchpad_gesture_finger_count() != 4) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|  |         if ((allowedModes & Main.actionMode) == 0) | ||||||
|  |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { |         if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { | ||||||
|             let [dx, dy] = event.get_gesture_motion_delta(); |             let [dx, dy] = event.get_gesture_motion_delta(); | ||||||
|  |  | ||||||
|             this._dx += dx; |             // Scale deltas up a bit to make it feel snappier | ||||||
|             this._dy += dy; |             this._dx += dx * 2; | ||||||
|  |             this._dy += dy * 2; | ||||||
|  |             this.emit('motion', this._dx, this._dy); | ||||||
|         } else { |         } else { | ||||||
|             if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END) |             if ((event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END && ! this._checkActivated()) || | ||||||
|                 this._checkActivated(); |                 event.get_gesture_phase() == Clutter.TouchpadGesturePhase.CANCEL) | ||||||
|  |                 this.emit('cancel'); | ||||||
|  |  | ||||||
|             this._dx = 0; |             this._dx = 0; | ||||||
|             this._dy = 0; |             this._dy = 0; | ||||||
| @@ -536,14 +542,14 @@ Signals.addSignalMethods(TouchpadWorkspaceSwitchAction.prototype); | |||||||
| var WorkspaceSwitchAction = new Lang.Class({ | var WorkspaceSwitchAction = new Lang.Class({ | ||||||
|     Name: 'WorkspaceSwitchAction', |     Name: 'WorkspaceSwitchAction', | ||||||
|     Extends: Clutter.SwipeAction, |     Extends: Clutter.SwipeAction, | ||||||
|     Signals: { 'activated': { param_types: [Meta.MotionDirection.$gtype] } }, |     Signals: { 'activated': { param_types: [Meta.MotionDirection.$gtype] }, | ||||||
|  |                'motion':    { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] }, | ||||||
|  |                'cancel':    { param_types: [] }}, | ||||||
|  |  | ||||||
|     _init() { |     _init() { | ||||||
|         const MOTION_THRESHOLD = 50; |  | ||||||
|  |  | ||||||
|         this.parent(); |         this.parent(); | ||||||
|         this.set_n_touch_points(4); |         this.set_n_touch_points(4); | ||||||
|         this.set_threshold_trigger_distance(MOTION_THRESHOLD, MOTION_THRESHOLD); |         this._swept = false; | ||||||
|  |  | ||||||
|         global.display.connect('grab-op-begin', () => { |         global.display.connect('grab-op-begin', () => { | ||||||
|             this.cancel(); |             this.cancel(); | ||||||
| @@ -553,13 +559,35 @@ var WorkspaceSwitchAction = new Lang.Class({ | |||||||
|     vfunc_gesture_prepare(actor) { |     vfunc_gesture_prepare(actor) { | ||||||
|         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; |         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; | ||||||
|  |  | ||||||
|  |         this._swept = false; | ||||||
|  |  | ||||||
|         if (!this.parent(actor)) |         if (!this.parent(actor)) | ||||||
|             return false; |             return false; | ||||||
|  |  | ||||||
|         return (allowedModes & Main.actionMode); |         return (allowedModes & Main.actionMode); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     vfunc_swept(actor, direction) { |     vfunc_gesture_progress(actor) { | ||||||
|  |         let [x, y] = this.get_motion_coords(0); | ||||||
|  |         let [xPress, yPress] = this.get_press_coords(0); | ||||||
|  |         this.emit('motion', x - xPress, y - yPress); | ||||||
|  |         return true; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     vfunc_gesture_cancel(actor) { | ||||||
|  |         if (!this._swept) | ||||||
|  |             this.emit('cancel'); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     vfunc_swipe(actor, direction) { | ||||||
|  |         let [x, y] = this.get_motion_coords(0); | ||||||
|  |         let [xPress, yPress] = this.get_press_coords(0); | ||||||
|  |         if (Math.abs(x - xPress) < MOTION_THRESHOLD && | ||||||
|  |             Math.abs(y - yPress) < MOTION_THRESHOLD) { | ||||||
|  |             this.emit('cancel'); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         let dir; |         let dir; | ||||||
|  |  | ||||||
|         if (direction & Clutter.SwipeDirection.UP) |         if (direction & Clutter.SwipeDirection.UP) | ||||||
| @@ -571,6 +599,7 @@ var WorkspaceSwitchAction = new Lang.Class({ | |||||||
|         else if (direction & Clutter.SwipeDirection.RIGHT) |         else if (direction & Clutter.SwipeDirection.RIGHT) | ||||||
|             dir = Meta.MotionDirection.LEFT; |             dir = Meta.MotionDirection.LEFT; | ||||||
|  |  | ||||||
|  |         this._swept = true; | ||||||
|         this.emit('activated', dir); |         this.emit('activated', dir); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| @@ -627,8 +656,8 @@ var AppSwitchAction = new Lang.Class({ | |||||||
|  |  | ||||||
|         if (this.get_n_current_points() == 3) { |         if (this.get_n_current_points() == 3) { | ||||||
|             for (let i = 0; i < this.get_n_current_points(); i++) { |             for (let i = 0; i < this.get_n_current_points(); i++) { | ||||||
|                 [startX, startY] = this.get_press_coords(i); |                 let [startX, startY] = this.get_press_coords(i); | ||||||
|                 [x, y] = this.get_motion_coords(i); |                 let [x, y] = this.get_motion_coords(i); | ||||||
|  |  | ||||||
|                 if (Math.abs(x - startX) > MOTION_THRESHOLD || |                 if (Math.abs(x - startX) > MOTION_THRESHOLD || | ||||||
|                     Math.abs(y - startY) > MOTION_THRESHOLD) |                     Math.abs(y - startY) > MOTION_THRESHOLD) | ||||||
| @@ -692,7 +721,14 @@ var WindowManager = new Lang.Class({ | |||||||
|         this._isWorkspacePrepended = false; |         this._isWorkspacePrepended = false; | ||||||
|  |  | ||||||
|         this._switchData = null; |         this._switchData = null; | ||||||
|         this._shellwm.connect('kill-switch-workspace', this._switchWorkspaceDone.bind(this)); |         this._shellwm.connect('kill-switch-workspace', (shellwm) => { | ||||||
|  |             if (this._switchData) { | ||||||
|  |                 if (this._switchData.inProgress) | ||||||
|  |                     this._switchWorkspaceDone(shellwm); | ||||||
|  |                 else if (!this._switchData.gestureActivated) | ||||||
|  |                     this._finishWorkspaceSwitch(this._switchData); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|         this._shellwm.connect('kill-window-effects', (shellwm, actor) => { |         this._shellwm.connect('kill-window-effects', (shellwm, actor) => { | ||||||
|             this._minimizeWindowDone(shellwm, actor); |             this._minimizeWindowDone(shellwm, actor); | ||||||
|             this._mapWindowDone(shellwm, actor); |             this._mapWindowDone(shellwm, actor); | ||||||
| @@ -714,7 +750,7 @@ var WindowManager = new Lang.Class({ | |||||||
|         this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this)); |         this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this)); | ||||||
|         this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this)); |         this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this)); | ||||||
|         this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this)); |         this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this)); | ||||||
|         global.screen.connect('restacked', this._syncStacking.bind(this)); |         global.display.connect('restacked', this._syncStacking.bind(this)); | ||||||
|  |  | ||||||
|         this._workspaceSwitcherPopup = null; |         this._workspaceSwitcherPopup = null; | ||||||
|         this._tilePreview = null; |         this._tilePreview = null; | ||||||
| @@ -970,16 +1006,20 @@ var WindowManager = new Lang.Class({ | |||||||
|         if (Main.sessionMode.hasWorkspaces) |         if (Main.sessionMode.hasWorkspaces) | ||||||
|             this._workspaceTracker = new WorkspaceTracker(this); |             this._workspaceTracker = new WorkspaceTracker(this); | ||||||
|  |  | ||||||
|         global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT, |         global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, | ||||||
|                                                 false, -1, 1); |                                                            false, -1, 1); | ||||||
|  |  | ||||||
|         let gesture = new WorkspaceSwitchAction(); |         let gesture = new WorkspaceSwitchAction(); | ||||||
|  |         gesture.connect('motion', this._switchWorkspaceMotion.bind(this)); | ||||||
|         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); |         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); | ||||||
|  |         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); | ||||||
|         global.stage.add_action(gesture); |         global.stage.add_action(gesture); | ||||||
|  |  | ||||||
|         // This is not a normal Clutter.GestureAction, doesn't need add_action() |         // This is not a normal Clutter.GestureAction, doesn't need add_action() | ||||||
|         gesture = new TouchpadWorkspaceSwitchAction(global.stage); |         gesture = new TouchpadWorkspaceSwitchAction(global.stage); | ||||||
|  |         gesture.connect('motion', this._switchWorkspaceMotion.bind(this)); | ||||||
|         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); |         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); | ||||||
|  |         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); | ||||||
|  |  | ||||||
|         gesture = new AppSwitchAction(); |         gesture = new AppSwitchAction(); | ||||||
|         gesture.connect('activated', this._switchApp.bind(this)); |         gesture.connect('activated', this._switchApp.bind(this)); | ||||||
| @@ -991,6 +1031,14 @@ var WindowManager = new Lang.Class({ | |||||||
|             Main.keyboard.show(Main.layoutManager.bottomIndex); |             Main.keyboard.show(Main.layoutManager.bottomIndex); | ||||||
|         }); |         }); | ||||||
|         global.stage.add_action(gesture); |         global.stage.add_action(gesture); | ||||||
|  |  | ||||||
|  |         gesture = new EdgeDragAction.EdgeDragAction(St.Side.TOP, mode); | ||||||
|  |         gesture.connect('activated',  () => { | ||||||
|  |             let currentWindow = global.display.focus_window; | ||||||
|  |             if (currentWindow) | ||||||
|  |                 currentWindow.unmake_fullscreen(); | ||||||
|  |         }); | ||||||
|  |         global.stage.add_action(gesture); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) { |     _showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) { | ||||||
| @@ -1000,9 +1048,52 @@ var WindowManager = new Lang.Class({ | |||||||
|         return this._currentPadOsd.actor; |         return this._currentPadOsd.actor; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _switchWorkspaceMotion(action, xRel, yRel) { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |  | ||||||
|  |         if (!this._switchData) | ||||||
|  |             this._prepareWorkspaceSwitch(activeWorkspace.index(), -1); | ||||||
|  |  | ||||||
|  |         if (yRel < 0 && !this._switchData.surroundings[Meta.MotionDirection.DOWN]) | ||||||
|  |             yRel = 0; | ||||||
|  |         if (yRel > 0 && !this._switchData.surroundings[Meta.MotionDirection.UP]) | ||||||
|  |             yRel = 0; | ||||||
|  |         if (xRel < 0 && !this._switchData.surroundings[Meta.MotionDirection.RIGHT]) | ||||||
|  |             xRel = 0; | ||||||
|  |         if (xRel > 0 && !this._switchData.surroundings[Meta.MotionDirection.LEFT]) | ||||||
|  |             xRel = 0; | ||||||
|  |  | ||||||
|  |         this._switchData.container.set_position(xRel, yRel); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _switchWorkspaceCancel() { | ||||||
|  |         if (!this._switchData || this._switchData.inProgress) | ||||||
|  |             return; | ||||||
|  |         let switchData = this._switchData; | ||||||
|  |         this._switchData = null; | ||||||
|  |         Tweener.addTween(switchData.container, | ||||||
|  |                          { x: 0, | ||||||
|  |                            y: 0, | ||||||
|  |                            time: WINDOW_ANIMATION_TIME, | ||||||
|  |                            transition: 'easeOutQuad', | ||||||
|  |                            onComplete: this._finishWorkspaceSwitch, | ||||||
|  |                            onCompleteScope: this, | ||||||
|  |                            onCompleteParams: [switchData], | ||||||
|  |                          }); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _actionSwitchWorkspace(action, direction) { |     _actionSwitchWorkspace(action, direction) { | ||||||
|             let newWs = global.screen.get_active_workspace().get_neighbor(direction); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |         let newWs = activeWorkspace.get_neighbor(direction); | ||||||
|  |  | ||||||
|  |         if (newWs == activeWorkspace) { | ||||||
|  |             this._switchWorkspaceCancel(); | ||||||
|  |         } else { | ||||||
|  |             this._switchData.gestureActivated = true; | ||||||
|             this.actionMoveWorkspace(newWs); |             this.actionMoveWorkspace(newWs); | ||||||
|  |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _lookupIndex(windows, metaWindow) { |     _lookupIndex(windows, metaWindow) { | ||||||
| @@ -1017,8 +1108,10 @@ var WindowManager = new Lang.Class({ | |||||||
|     _switchApp() { |     _switchApp() { | ||||||
|         let windows = global.get_window_actors().filter(actor => { |         let windows = global.get_window_actors().filter(actor => { | ||||||
|             let win = actor.metaWindow; |             let win = actor.metaWindow; | ||||||
|  |             let workspaceManager = global.workspace_manager; | ||||||
|  |             let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|             return (!win.is_override_redirect() && |             return (!win.is_override_redirect() && | ||||||
|                     win.located_on_workspace(global.screen.get_active_workspace())); |                     win.located_on_workspace(activeWorkspace)); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         if (windows.length == 0) |         if (windows.length == 0) | ||||||
| @@ -1042,10 +1135,12 @@ var WindowManager = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     insertWorkspace(pos) { |     insertWorkspace(pos) { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|         if (!Meta.prefs_get_dynamic_workspaces()) |         if (!Meta.prefs_get_dynamic_workspaces()) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         global.screen.append_new_workspace(false, global.get_current_time()); |         workspaceManager.append_new_workspace(false, global.get_current_time()); | ||||||
|  |  | ||||||
|         let windows = global.get_window_actors().map(a => a.meta_window); |         let windows = global.get_window_actors().map(a => a.meta_window); | ||||||
|  |  | ||||||
| @@ -1069,9 +1164,9 @@ var WindowManager = new Lang.Class({ | |||||||
|  |  | ||||||
|         // If the new workspace was inserted before the active workspace, |         // If the new workspace was inserted before the active workspace, | ||||||
|         // activate the workspace to which its windows went |         // activate the workspace to which its windows went | ||||||
|         let activeIndex = global.screen.get_active_workspace_index(); |         let activeIndex = workspaceManager.get_active_workspace_index(); | ||||||
|         if (activeIndex >= pos) { |         if (activeIndex >= pos) { | ||||||
|             let newWs = global.screen.get_workspace_by_index(activeIndex + 1); |             let newWs = workspaceManager.get_workspace_by_index(activeIndex + 1); | ||||||
|             this._blockAnimations = true; |             this._blockAnimations = true; | ||||||
|             newWs.activate(global.get_current_time()); |             newWs.activate(global.get_current_time()); | ||||||
|             this._blockAnimations = false; |             this._blockAnimations = false; | ||||||
| @@ -1173,6 +1268,10 @@ var WindowManager = new Lang.Class({ | |||||||
|                 yScale = geom.height / actor.height; |                 yScale = geom.height / actor.height; | ||||||
|             } else { |             } else { | ||||||
|                 let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; |                 let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; | ||||||
|  |                 if (!monitor) { | ||||||
|  |                     this._minimizeWindowDone(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|                 xDest = monitor.x; |                 xDest = monitor.x; | ||||||
|                 yDest = monitor.y; |                 yDest = monitor.y; | ||||||
|                 if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) |                 if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) | ||||||
| @@ -1248,6 +1347,11 @@ var WindowManager = new Lang.Class({ | |||||||
|                                 geom.height / actor.height); |                                 geom.height / actor.height); | ||||||
|             } else { |             } else { | ||||||
|                 let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; |                 let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; | ||||||
|  |                 if (!monitor) { | ||||||
|  |                     actor.show(); | ||||||
|  |                     this._unminimizeWindowDone(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|                 actor.set_position(monitor.x, monitor.y); |                 actor.set_position(monitor.x, monitor.y); | ||||||
|                 if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) |                 if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) | ||||||
|                     actor.x += monitor.width; |                     actor.x += monitor.width; | ||||||
| @@ -1669,63 +1773,104 @@ var WindowManager = new Lang.Class({ | |||||||
|         if (this._switchData == null) |         if (this._switchData == null) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         // Update stacking of windows in inGroup (aka the workspace we are |  | ||||||
|         // switching to). Windows in outGroup are about to be hidden anyway, |  | ||||||
|         // so we just ignore them here. |  | ||||||
|         let windows = global.get_window_actors(); |         let windows = global.get_window_actors(); | ||||||
|         let sibling = null; |         let lastCurSibling = null; | ||||||
|  |         let lastDirSibling = []; | ||||||
|         for (let i = 0; i < windows.length; i++) { |         for (let i = 0; i < windows.length; i++) { | ||||||
|             if (windows[i].get_parent() != this._switchData.inGroup) |             if (windows[i].get_parent() == this._switchData.curGroup) { | ||||||
|                 continue; |                 this._switchData.curGroup.set_child_above_sibling(windows[i], lastCurSibling); | ||||||
|  |                 lastCurSibling = windows[i]; | ||||||
|  |             } else { | ||||||
|  |                 for (let dir of Object.values(Meta.MotionDirection)) { | ||||||
|  |                     let info = this._switchData.surroundings[dir]; | ||||||
|  |                     if (!info || windows[i].get_parent() != info.actor) | ||||||
|  |                         continue; | ||||||
|  |  | ||||||
|             this._switchData.inGroup.set_child_above_sibling(windows[i], sibling); |                     let sibling = lastDirSibling[dir]; | ||||||
|             sibling = windows[i]; |                     if (sibling == undefined) | ||||||
|  |                         sibling = null; | ||||||
|  |  | ||||||
|  |                     info.actor.set_child_above_sibling(windows[i], sibling); | ||||||
|  |                     lastDirSibling[dir] = windows[i]; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _switchWorkspace(shellwm, from, to, direction) { |     _getPositionForDirection(direction) { | ||||||
|         if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) { |  | ||||||
|             shellwm.completed_switch_workspace(); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         let windows = global.get_window_actors(); |  | ||||||
|  |  | ||||||
|         /* @direction is the direction that the "camera" moves, so the |  | ||||||
|          * screen contents have to move one screen's worth in the |  | ||||||
|          * opposite direction. |  | ||||||
|          */ |  | ||||||
|         let xDest = 0, yDest = 0; |         let xDest = 0, yDest = 0; | ||||||
|  |  | ||||||
|         if (direction == Meta.MotionDirection.UP || |         if (direction == Meta.MotionDirection.UP || | ||||||
|             direction == Meta.MotionDirection.UP_LEFT || |             direction == Meta.MotionDirection.UP_LEFT || | ||||||
|             direction == Meta.MotionDirection.UP_RIGHT) |             direction == Meta.MotionDirection.UP_RIGHT) | ||||||
|                 yDest = global.screen_height - Main.panel.actor.height; |             yDest = -global.screen_height + Main.panel.actor.height; | ||||||
|         else if (direction == Meta.MotionDirection.DOWN || |         else if (direction == Meta.MotionDirection.DOWN || | ||||||
|             direction == Meta.MotionDirection.DOWN_LEFT || |             direction == Meta.MotionDirection.DOWN_LEFT || | ||||||
|             direction == Meta.MotionDirection.DOWN_RIGHT) |             direction == Meta.MotionDirection.DOWN_RIGHT) | ||||||
|                 yDest = -global.screen_height + Main.panel.actor.height; |             yDest = global.screen_height - Main.panel.actor.height; | ||||||
|  |  | ||||||
|         if (direction == Meta.MotionDirection.LEFT || |         if (direction == Meta.MotionDirection.LEFT || | ||||||
|             direction == Meta.MotionDirection.UP_LEFT || |             direction == Meta.MotionDirection.UP_LEFT || | ||||||
|             direction == Meta.MotionDirection.DOWN_LEFT) |             direction == Meta.MotionDirection.DOWN_LEFT) | ||||||
|                 xDest = global.screen_width; |             xDest = -global.screen_width; | ||||||
|         else if (direction == Meta.MotionDirection.RIGHT || |         else if (direction == Meta.MotionDirection.RIGHT || | ||||||
|                  direction == Meta.MotionDirection.UP_RIGHT || |                  direction == Meta.MotionDirection.UP_RIGHT || | ||||||
|                  direction == Meta.MotionDirection.DOWN_RIGHT) |                  direction == Meta.MotionDirection.DOWN_RIGHT) | ||||||
|                 xDest = -global.screen_width; |             xDest = global.screen_width; | ||||||
|  |  | ||||||
|         let switchData = {}; |         return [xDest, yDest]; | ||||||
|         this._switchData = switchData; |     }, | ||||||
|         switchData.inGroup = new Clutter.Actor(); |  | ||||||
|         switchData.outGroup = new Clutter.Actor(); |     _prepareWorkspaceSwitch(from, to, direction) { | ||||||
|         switchData.movingWindowBin = new Clutter.Actor(); |         if (this._switchData) | ||||||
|         switchData.windows = []; |             return; | ||||||
|  |  | ||||||
|         let wgroup = global.window_group; |         let wgroup = global.window_group; | ||||||
|         wgroup.add_actor(switchData.inGroup); |         let windows = global.get_window_actors(); | ||||||
|         wgroup.add_actor(switchData.outGroup); |         let switchData = {}; | ||||||
|  |  | ||||||
|  |         this._switchData = switchData; | ||||||
|  |         switchData.curGroup = new Clutter.Actor(); | ||||||
|  |         switchData.movingWindowBin = new Clutter.Actor(); | ||||||
|  |         switchData.windows = []; | ||||||
|  |         switchData.surroundings = {}; | ||||||
|  |         switchData.gestureActivated = false; | ||||||
|  |         switchData.inProgress = false; | ||||||
|  |  | ||||||
|  |         switchData.container = new Clutter.Actor(); | ||||||
|  |         switchData.container.add_actor(switchData.curGroup); | ||||||
|  |  | ||||||
|         wgroup.add_actor(switchData.movingWindowBin); |         wgroup.add_actor(switchData.movingWindowBin); | ||||||
|  |         wgroup.add_actor(switchData.container); | ||||||
|  |  | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let curWs = workspaceManager.get_workspace_by_index (from); | ||||||
|  |  | ||||||
|  |         for (let dir of Object.values(Meta.MotionDirection)) { | ||||||
|  |             let ws = null; | ||||||
|  |  | ||||||
|  |             if (to < 0) | ||||||
|  |                 ws = curWs.get_neighbor(dir); | ||||||
|  |             else if (dir == direction) | ||||||
|  |                 ws = workspaceManager.get_workspace_by_index(to); | ||||||
|  |  | ||||||
|  |             if (ws == null || ws == curWs) { | ||||||
|  |                 switchData.surroundings[dir] = null; | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             let info = { index: ws.index(), | ||||||
|  |                          actor: new Clutter.Actor() }; | ||||||
|  |             switchData.surroundings[dir] = info; | ||||||
|  |             switchData.container.add_actor(info.actor); | ||||||
|  |             info.actor.raise_top(); | ||||||
|  |  | ||||||
|  |             let [x, y] = this._getPositionForDirection(dir); | ||||||
|  |             info.actor.set_position(x, y); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         switchData.movingWindowBin.raise_top(); | ||||||
|  |  | ||||||
|         for (let i = 0; i < windows.length; i++) { |         for (let i = 0; i < windows.length; i++) { | ||||||
|             let actor = windows[i]; |             let actor = windows[i]; | ||||||
| @@ -1746,20 +1891,70 @@ var WindowManager = new Lang.Class({ | |||||||
|                 actor.reparent(switchData.movingWindowBin); |                 actor.reparent(switchData.movingWindowBin); | ||||||
|             } else if (window.get_workspace().index() == from) { |             } else if (window.get_workspace().index() == from) { | ||||||
|                 switchData.windows.push(record); |                 switchData.windows.push(record); | ||||||
|                 actor.reparent(switchData.outGroup); |                 actor.reparent(switchData.curGroup); | ||||||
|             } else if (window.get_workspace().index() == to) { |             } else { | ||||||
|                 switchData.windows.push(record); |                 let visible = false; | ||||||
|                 actor.reparent(switchData.inGroup); |                 for (let dir of Object.values(Meta.MotionDirection)) { | ||||||
|                 actor.show(); |                     let info = switchData.surroundings[dir]; | ||||||
|  |  | ||||||
|  |                     if (!info || info.index != window.get_workspace().index()) | ||||||
|  |                         continue; | ||||||
|  |  | ||||||
|  |                     switchData.windows.push(record); | ||||||
|  |                     actor.reparent(info.actor); | ||||||
|  |                     visible = true; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 actor.visible = visible; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|         switchData.inGroup.set_position(-xDest, -yDest); |     _finishWorkspaceSwitch(switchData) { | ||||||
|         switchData.inGroup.raise_top(); |         this._switchData = null; | ||||||
|  |  | ||||||
|         switchData.movingWindowBin.raise_top(); |         for (let i = 0; i < switchData.windows.length; i++) { | ||||||
|  |             let w = switchData.windows[i]; | ||||||
|  |             if (w.window.is_destroyed()) // Window gone | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|         Tweener.addTween(switchData.outGroup, |             w.window.reparent(w.parent); | ||||||
|  |  | ||||||
|  |             if (w.window.get_meta_window().get_workspace() != | ||||||
|  |                 global.workspace_manager.get_active_workspace()) | ||||||
|  |                 w.window.hide(); | ||||||
|  |         } | ||||||
|  |         Tweener.removeTweens(switchData.container); | ||||||
|  |         switchData.container.destroy(); | ||||||
|  |         switchData.movingWindowBin.destroy(); | ||||||
|  |  | ||||||
|  |         this._movingWindow = null; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _switchWorkspace(shellwm, from, to, direction) { | ||||||
|  |         if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) { | ||||||
|  |             shellwm.completed_switch_workspace(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // If we come from a gesture, switchData will already be set, | ||||||
|  |         // and we don't want to overwrite it. | ||||||
|  |         if (!this._switchData) | ||||||
|  |             this._prepareWorkspaceSwitch(from, to, direction); | ||||||
|  |  | ||||||
|  |         this._switchData.inProgress = true; | ||||||
|  |  | ||||||
|  |         let [xDest, yDest] = this._getPositionForDirection(direction); | ||||||
|  |  | ||||||
|  |         /* @direction is the direction that the "camera" moves, so the | ||||||
|  |          * screen contents have to move one screen's worth in the | ||||||
|  |          * opposite direction. | ||||||
|  |          */ | ||||||
|  |         xDest = -xDest; | ||||||
|  |         yDest = -yDest; | ||||||
|  |  | ||||||
|  |         Tweener.addTween(this._switchData.container, | ||||||
|                          { x: xDest, |                          { x: xDest, | ||||||
|                            y: yDest, |                            y: yDest, | ||||||
|                            time: WINDOW_ANIMATION_TIME, |                            time: WINDOW_ANIMATION_TIME, | ||||||
| @@ -1768,39 +1963,10 @@ var WindowManager = new Lang.Class({ | |||||||
|                            onCompleteScope: this, |                            onCompleteScope: this, | ||||||
|                            onCompleteParams: [shellwm] |                            onCompleteParams: [shellwm] | ||||||
|                          }); |                          }); | ||||||
|         Tweener.addTween(switchData.inGroup, |  | ||||||
|                          { x: 0, |  | ||||||
|                            y: 0, |  | ||||||
|                            time: WINDOW_ANIMATION_TIME, |  | ||||||
|                            transition: 'easeOutQuad' |  | ||||||
|                          }); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _switchWorkspaceDone(shellwm) { |     _switchWorkspaceDone(shellwm) { | ||||||
|         let switchData = this._switchData; |         this._finishWorkspaceSwitch(this._switchData); | ||||||
|         if (!switchData) |  | ||||||
|             return; |  | ||||||
|         this._switchData = null; |  | ||||||
|  |  | ||||||
|         for (let i = 0; i < switchData.windows.length; i++) { |  | ||||||
|                 let w = switchData.windows[i]; |  | ||||||
|                 if (w.window.is_destroyed()) // Window gone |  | ||||||
|                     continue; |  | ||||||
|                 if (w.window.get_parent() == switchData.outGroup) { |  | ||||||
|                     w.window.reparent(w.parent); |  | ||||||
|                     w.window.hide(); |  | ||||||
|                 } else |  | ||||||
|                     w.window.reparent(w.parent); |  | ||||||
|         } |  | ||||||
|         Tweener.removeTweens(switchData.inGroup); |  | ||||||
|         Tweener.removeTweens(switchData.outGroup); |  | ||||||
|         switchData.inGroup.destroy(); |  | ||||||
|         switchData.outGroup.destroy(); |  | ||||||
|         switchData.movingWindowBin.destroy(); |  | ||||||
|  |  | ||||||
|         if (this._movingWindow) |  | ||||||
|             this._movingWindow = null; |  | ||||||
|  |  | ||||||
|         shellwm.completed_switch_workspace(); |         shellwm.completed_switch_workspace(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -1820,7 +1986,7 @@ var WindowManager = new Lang.Class({ | |||||||
|         this._windowMenuManager.showWindowMenuForWindow(window, menu, rect); |         this._windowMenuManager.showWindowMenuForWindow(window, menu, rect); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _startSwitcher(display, screen, window, binding) { |     _startSwitcher(display, window, binding) { | ||||||
|         let constructor = null; |         let constructor = null; | ||||||
|         switch (binding.get_name()) { |         switch (binding.get_name()) { | ||||||
|             case 'switch-applications': |             case 'switch-applications': | ||||||
| @@ -1859,15 +2025,15 @@ var WindowManager = new Lang.Class({ | |||||||
|             tabPopup.destroy(); |             tabPopup.destroy(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _startA11ySwitcher(display, screen, window, binding) { |     _startA11ySwitcher(display, window, binding) { | ||||||
|         Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask()); |         Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask()); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _toggleAppMenu(display, screen, window, event, binding) { |     _toggleAppMenu(display, window, event, binding) { | ||||||
|         Main.panel.toggleAppMenu(); |         Main.panel.toggleAppMenu(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _toggleCalendar(display, screen, window, event, binding) { |     _toggleCalendar(display, window, event, binding) { | ||||||
|         Main.panel.toggleCalendar(); |         Main.panel.toggleCalendar(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -1880,11 +2046,13 @@ var WindowManager = new Lang.Class({ | |||||||
|             OrigTweener.resumeAllTweens(); |             OrigTweener.resumeAllTweens(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _showWorkspaceSwitcher(display, screen, window, binding) { |     _showWorkspaceSwitcher(display, window, binding) { | ||||||
|  |         let workspaceManager = display.get_workspace_manager(); | ||||||
|  |  | ||||||
|         if (!Main.sessionMode.hasWorkspaces) |         if (!Main.sessionMode.hasWorkspaces) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (screen.n_workspaces == 1) |         if (workspaceManager.n_workspaces == 1) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         let [action,,,target] = binding.get_name().split('-'); |         let [action,,,target] = binding.get_name().split('-'); | ||||||
| @@ -1903,22 +2071,22 @@ var WindowManager = new Lang.Class({ | |||||||
|  |  | ||||||
|         if (target == 'last') { |         if (target == 'last') { | ||||||
|             direction = Meta.MotionDirection.DOWN; |             direction = Meta.MotionDirection.DOWN; | ||||||
|             newWs = screen.get_workspace_by_index(screen.n_workspaces - 1); |             newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1); | ||||||
|         } else if (isNaN(target)) { |         } else if (isNaN(target)) { | ||||||
|             // Prepend a new workspace dynamically |             // Prepend a new workspace dynamically | ||||||
|             if (screen.get_active_workspace_index() == 0 && |             if (workspaceManager.get_active_workspace_index() == 0 && | ||||||
|                 action == 'move' && target == 'up' && this._isWorkspacePrepended == false) { |                 action == 'move' && target == 'up' && this._isWorkspacePrepended == false) { | ||||||
|                 this.insertWorkspace(0); |                 this.insertWorkspace(0); | ||||||
|                 this._isWorkspacePrepended = true; |                 this._isWorkspacePrepended = true; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             direction = Meta.MotionDirection[target.toUpperCase()]; |             direction = Meta.MotionDirection[target.toUpperCase()]; | ||||||
|             newWs = screen.get_active_workspace().get_neighbor(direction); |             newWs = workspaceManager.get_active_workspace().get_neighbor(direction); | ||||||
|         } else if (target > 0) { |         } else if (target > 0) { | ||||||
|             target--; |             target--; | ||||||
|             newWs = screen.get_workspace_by_index(target); |             newWs = workspaceManager.get_workspace_by_index(target); | ||||||
|  |  | ||||||
|             if (screen.get_active_workspace().index() > target) |             if (workspaceManager.get_active_workspace().index() > target) | ||||||
|                 direction = Meta.MotionDirection.UP; |                 direction = Meta.MotionDirection.UP; | ||||||
|             else |             else | ||||||
|                 direction = Meta.MotionDirection.DOWN; |                 direction = Meta.MotionDirection.DOWN; | ||||||
| @@ -1951,7 +2119,8 @@ var WindowManager = new Lang.Class({ | |||||||
|         if (!Main.sessionMode.hasWorkspaces) |         if (!Main.sessionMode.hasWorkspaces) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         let activeWorkspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |  | ||||||
|         if (activeWorkspace != workspace) |         if (activeWorkspace != workspace) | ||||||
|             workspace.activate(global.get_current_time()); |             workspace.activate(global.get_current_time()); | ||||||
| @@ -1961,7 +2130,8 @@ var WindowManager = new Lang.Class({ | |||||||
|         if (!Main.sessionMode.hasWorkspaces) |         if (!Main.sessionMode.hasWorkspaces) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         let activeWorkspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |  | ||||||
|         if (activeWorkspace != workspace) { |         if (activeWorkspace != workspace) { | ||||||
|             // This won't have any effect for "always sticky" windows |             // This won't have any effect for "always sticky" windows | ||||||
|   | |||||||
| @@ -126,16 +126,15 @@ var WindowMenu = new Lang.Class({ | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         let screen = global.screen; |         let display = global.display; | ||||||
|         let nMonitors = screen.get_n_monitors(); |         let nMonitors = display.get_n_monitors(); | ||||||
|         if (nMonitors > 1) { |         let monitorIndex = window.get_monitor(); | ||||||
|  |         if (nMonitors > 1 && monitorIndex >= 0) { | ||||||
|             this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); |             this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); | ||||||
|  |  | ||||||
|             let monitorIndex = window.get_monitor(); |  | ||||||
|  |  | ||||||
|             let dir = Meta.ScreenDirection.UP; |             let dir = Meta.ScreenDirection.UP; | ||||||
|             let upMonitorIndex = |             let upMonitorIndex = | ||||||
|                 screen.get_monitor_neighbor_index(monitorIndex, dir); |                 display.get_monitor_neighbor_index(monitorIndex, dir); | ||||||
|             if (upMonitorIndex != -1) { |             if (upMonitorIndex != -1) { | ||||||
|                 this.addAction(_("Move to Monitor Up"), () => { |                 this.addAction(_("Move to Monitor Up"), () => { | ||||||
|                     window.move_to_monitor(upMonitorIndex); |                     window.move_to_monitor(upMonitorIndex); | ||||||
| @@ -144,7 +143,7 @@ var WindowMenu = new Lang.Class({ | |||||||
|  |  | ||||||
|             dir = Meta.ScreenDirection.DOWN; |             dir = Meta.ScreenDirection.DOWN; | ||||||
|             let downMonitorIndex = |             let downMonitorIndex = | ||||||
|                 screen.get_monitor_neighbor_index(monitorIndex, dir); |                 display.get_monitor_neighbor_index(monitorIndex, dir); | ||||||
|             if (downMonitorIndex != -1) { |             if (downMonitorIndex != -1) { | ||||||
|                 this.addAction(_("Move to Monitor Down"), () => { |                 this.addAction(_("Move to Monitor Down"), () => { | ||||||
|                     window.move_to_monitor(downMonitorIndex); |                     window.move_to_monitor(downMonitorIndex); | ||||||
| @@ -153,7 +152,7 @@ var WindowMenu = new Lang.Class({ | |||||||
|  |  | ||||||
|             dir = Meta.ScreenDirection.LEFT; |             dir = Meta.ScreenDirection.LEFT; | ||||||
|             let leftMonitorIndex = |             let leftMonitorIndex = | ||||||
|                 screen.get_monitor_neighbor_index(monitorIndex, dir); |                 display.get_monitor_neighbor_index(monitorIndex, dir); | ||||||
|             if (leftMonitorIndex != -1) { |             if (leftMonitorIndex != -1) { | ||||||
|                 this.addAction(_("Move to Monitor Left"), () => { |                 this.addAction(_("Move to Monitor Left"), () => { | ||||||
|                     window.move_to_monitor(leftMonitorIndex); |                     window.move_to_monitor(leftMonitorIndex); | ||||||
| @@ -162,7 +161,7 @@ var WindowMenu = new Lang.Class({ | |||||||
|  |  | ||||||
|             dir = Meta.ScreenDirection.RIGHT; |             dir = Meta.ScreenDirection.RIGHT; | ||||||
|             let rightMonitorIndex = |             let rightMonitorIndex = | ||||||
|                 screen.get_monitor_neighbor_index(monitorIndex, dir); |                 display.get_monitor_neighbor_index(monitorIndex, dir); | ||||||
|             if (rightMonitorIndex != -1) { |             if (rightMonitorIndex != -1) { | ||||||
|                 this.addAction(_("Move to Monitor Right"), () => { |                 this.addAction(_("Move to Monitor Right"), () => { | ||||||
|                     window.move_to_monitor(rightMonitorIndex); |                     window.move_to_monitor(rightMonitorIndex); | ||||||
|   | |||||||
| @@ -137,8 +137,10 @@ var WindowClone = new Lang.Class({ | |||||||
|         this._dragSlot = [0, 0, 0, 0]; |         this._dragSlot = [0, 0, 0, 0]; | ||||||
|         this._stackAbove = null; |         this._stackAbove = null; | ||||||
|  |  | ||||||
|         this._windowClone._updateId = this.metaWindow.connect('size-changed', |         this._windowClone._sizeChangedId = this.metaWindow.connect('size-changed', | ||||||
|             this._onRealWindowSizeChanged.bind(this)); |             this._onMetaWindowSizeChanged.bind(this)); | ||||||
|  |         this._windowClone._posChangedId = this.metaWindow.connect('position-changed', | ||||||
|  |             this._computeBoundingBox.bind(this)); | ||||||
|         this._windowClone._destroyId = |         this._windowClone._destroyId = | ||||||
|             this.realWindow.connect('destroy', () => { |             this.realWindow.connect('destroy', () => { | ||||||
|                 // First destroy the clone and then destroy everything |                 // First destroy the clone and then destroy everything | ||||||
| @@ -206,8 +208,7 @@ var WindowClone = new Lang.Class({ | |||||||
|  |  | ||||||
|     addAttachedDialog(win) { |     addAttachedDialog(win) { | ||||||
|         this._doAddAttachedDialog(win, win.get_compositor_private()); |         this._doAddAttachedDialog(win, win.get_compositor_private()); | ||||||
|         this._computeBoundingBox(); |         this._onMetaWindowSizeChanged(); | ||||||
|         this.emit('size-changed'); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     hasAttachedDialogs() { |     hasAttachedDialogs() { | ||||||
| @@ -216,15 +217,14 @@ var WindowClone = new Lang.Class({ | |||||||
|  |  | ||||||
|     _doAddAttachedDialog(metaWin, realWin) { |     _doAddAttachedDialog(metaWin, realWin) { | ||||||
|         let clone = new Clutter.Clone({ source: realWin }); |         let clone = new Clutter.Clone({ source: realWin }); | ||||||
|         clone._updateId = metaWin.connect('size-changed', () => { |         clone._sizeChangedId = metaWin.connect('size-changed', | ||||||
|             this._computeBoundingBox(); |             this._onMetaWindowSizeChanged.bind(this)); | ||||||
|             this.emit('size-changed'); |         clone._posChangedId = metaWin.connect('position-changed', | ||||||
|         }); |             this._onMetaWindowSizeChanged.bind(this)); | ||||||
|         clone._destroyId = realWin.connect('destroy', () => { |         clone._destroyId = realWin.connect('destroy', () => { | ||||||
|             clone.destroy(); |             clone.destroy(); | ||||||
|  |  | ||||||
|             this._computeBoundingBox(); |             this._onMetaWindowSizeChanged(); | ||||||
|             this.emit('size-changed'); |  | ||||||
|         }); |         }); | ||||||
|         this.actor.add_child(clone); |         this.actor.add_child(clone); | ||||||
|     }, |     }, | ||||||
| @@ -321,12 +321,13 @@ var WindowClone = new Lang.Class({ | |||||||
|             else |             else | ||||||
|                 realWindow = child.source; |                 realWindow = child.source; | ||||||
|  |  | ||||||
|             realWindow.meta_window.disconnect(child._updateId); |             realWindow.meta_window.disconnect(child._sizeChangedId); | ||||||
|  |             realWindow.meta_window.disconnect(child._posChangedId); | ||||||
|             realWindow.disconnect(child._destroyId); |             realWindow.disconnect(child._destroyId); | ||||||
|         }); |         }); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onRealWindowSizeChanged() { |     _onMetaWindowSizeChanged() { | ||||||
|         this._computeBoundingBox(); |         this._computeBoundingBox(); | ||||||
|         this.emit('size-changed'); |         this.emit('size-changed'); | ||||||
|     }, |     }, | ||||||
| @@ -447,12 +448,13 @@ var WindowOverlay = new Lang.Class({ | |||||||
|         this.border = new St.Bin({ style_class: 'window-clone-border' }); |         this.border = new St.Bin({ style_class: 'window-clone-border' }); | ||||||
|  |  | ||||||
|         let title = new St.Label({ style_class: 'window-caption', |         let title = new St.Label({ style_class: 'window-caption', | ||||||
|                                    text: metaWindow.title }); |                                    text: this._getCaption() }); | ||||||
|         title.clutter_text.ellipsize = Pango.EllipsizeMode.END; |         title.clutter_text.ellipsize = Pango.EllipsizeMode.END; | ||||||
|         windowClone.actor.label_actor = title; |         windowClone.actor.label_actor = title; | ||||||
|  |  | ||||||
|         this._updateCaptionId = metaWindow.connect('notify::title', w => { |         this._updateCaptionId = metaWindow.connect('notify::title', w => { | ||||||
|             this.title.text = w.title; |             this.title.text = w.title; | ||||||
|  |             this.title.text = this._getCaption(); | ||||||
|             this.relayout(false); |             this.relayout(false); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
| @@ -565,6 +567,16 @@ var WindowOverlay = new Lang.Class({ | |||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _getCaption() { | ||||||
|  |         let metaWindow = this._windowClone.metaWindow; | ||||||
|  |         if (metaWindow.title) | ||||||
|  |             return metaWindow.title; | ||||||
|  |  | ||||||
|  |         let tracker = Shell.WindowTracker.get_default(); | ||||||
|  |         let app = tracker.get_window_app(metaWindow); | ||||||
|  |         return app.get_name(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _animateOverlayActor(actor, x, y, width, height) { |     _animateOverlayActor(actor, x, y, width, height) { | ||||||
|         let params = { x: x, |         let params = { x: x, | ||||||
|                        y: y, |                        y: y, | ||||||
| @@ -660,7 +672,6 @@ var WindowOverlay = new Lang.Class({ | |||||||
|         if (this._hidden) |         if (this._hidden) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._windowClone.actor.grab_key_focus(); |  | ||||||
|         this._animateVisible(); |         this._animateVisible(); | ||||||
|         this.emit('show-close-button'); |         this.emit('show-close-button'); | ||||||
|     }, |     }, | ||||||
| @@ -1146,10 +1157,10 @@ var Workspace = new Lang.Class({ | |||||||
|             this._windowRemovedId = this.metaWorkspace.connect('window-removed', |             this._windowRemovedId = this.metaWorkspace.connect('window-removed', | ||||||
|                                                                this._windowRemoved.bind(this)); |                                                                this._windowRemoved.bind(this)); | ||||||
|         } |         } | ||||||
|         this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor', |         this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', | ||||||
|                                                              this._windowEnteredMonitor.bind(this)); |                                                               this._windowEnteredMonitor.bind(this)); | ||||||
|         this._windowLeftMonitorId = global.screen.connect('window-left-monitor', |         this._windowLeftMonitorId = global.display.connect('window-left-monitor', | ||||||
|                                                           this._windowLeftMonitor.bind(this)); |                                                            this._windowLeftMonitor.bind(this)); | ||||||
|         this._repositionWindowsId = 0; |         this._repositionWindowsId = 0; | ||||||
|  |  | ||||||
|         this.leavingOverview = false; |         this.leavingOverview = false; | ||||||
| @@ -1295,7 +1306,8 @@ var Workspace = new Lang.Class({ | |||||||
|         let area = padArea(this._actualGeometry, padding); |         let area = padArea(this._actualGeometry, padding); | ||||||
|         let slots = strategy.computeWindowSlots(layout, area); |         let slots = strategy.computeWindowSlots(layout, area); | ||||||
|  |  | ||||||
|         let currentWorkspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let currentWorkspace = workspaceManager.get_active_workspace(); | ||||||
|         let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace; |         let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace; | ||||||
|  |  | ||||||
|         for (let i = 0; i < slots.length; i++) { |         for (let i = 0; i < slots.length; i++) { | ||||||
| @@ -1432,34 +1444,26 @@ var Workspace = new Lang.Class({ | |||||||
|     _doRemoveWindow(metaWin) { |     _doRemoveWindow(metaWin) { | ||||||
|         let win = metaWin.get_compositor_private(); |         let win = metaWin.get_compositor_private(); | ||||||
|  |  | ||||||
|         // find the position of the window in our list |         let clone = this._removeWindowClone(metaWin); | ||||||
|         let index = this._lookupIndex (metaWin); |  | ||||||
|  |  | ||||||
|         if (index == -1) |         if (clone) { | ||||||
|             return; |             // If metaWin.get_compositor_private() returned non-NULL, that | ||||||
|  |             // means the window still exists (and is just being moved to | ||||||
|         let clone = this._windows[index]; |             // another workspace or something), so set its overviewHint | ||||||
|  |             // accordingly. (If it returned NULL, then the window is being | ||||||
|         this._windows.splice(index, 1); |             // destroyed; we'd like to animate this, but it's too late at | ||||||
|         this._windowOverlays.splice(index, 1); |             // this point.) | ||||||
|  |             if (win) { | ||||||
|         // If metaWin.get_compositor_private() returned non-NULL, that |                 let [stageX, stageY] = clone.actor.get_transformed_position(); | ||||||
|         // means the window still exists (and is just being moved to |                 let [stageWidth, stageHeight] = clone.actor.get_transformed_size(); | ||||||
|         // another workspace or something), so set its overviewHint |                 win._overviewHint = { | ||||||
|         // accordingly. (If it returned NULL, then the window is being |                     x: stageX, | ||||||
|         // destroyed; we'd like to animate this, but it's too late at |                     y: stageY, | ||||||
|         // this point.) |                     scale: stageWidth / clone.actor.width | ||||||
|         if (win) { |                 }; | ||||||
|             let [stageX, stageY] = clone.actor.get_transformed_position(); |             } | ||||||
|             let [stageWidth, stageHeight] = clone.actor.get_transformed_size(); |             clone.destroy(); | ||||||
|             win._overviewHint = { |  | ||||||
|                 x: stageX, |  | ||||||
|                 y: stageY, |  | ||||||
|                 scale: stageWidth / clone.actor.width |  | ||||||
|             }; |  | ||||||
|         } |         } | ||||||
|         clone.destroy(); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         // We need to reposition the windows; to avoid shuffling windows |         // We need to reposition the windows; to avoid shuffling windows | ||||||
|         // around while the user is interacting with the workspace, we delay |         // around while the user is interacting with the workspace, we delay | ||||||
| @@ -1558,13 +1562,13 @@ var Workspace = new Lang.Class({ | |||||||
|         this._doRemoveWindow(metaWin); |         this._doRemoveWindow(metaWin); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) { |     _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { | ||||||
|         if (monitorIndex == this.monitorIndex) { |         if (monitorIndex == this.monitorIndex) { | ||||||
|             this._doAddWindow(metaWin); |             this._doAddWindow(metaWin); | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _windowLeftMonitor(metaScreen, monitorIndex, metaWin) { |     _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { | ||||||
|         if (monitorIndex == this.monitorIndex) { |         if (monitorIndex == this.monitorIndex) { | ||||||
|             this._doRemoveWindow(metaWin); |             this._doRemoveWindow(metaWin); | ||||||
|         } |         } | ||||||
| @@ -1589,7 +1593,9 @@ var Workspace = new Lang.Class({ | |||||||
|         if (this._windows.length == 0) |         if (this._windows.length == 0) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace()) |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |         if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         // Special case maximized windows, since it doesn't make sense |         // Special case maximized windows, since it doesn't make sense | ||||||
| @@ -1645,7 +1651,9 @@ var Workspace = new Lang.Class({ | |||||||
|             this._repositionWindowsId = 0; |             this._repositionWindowsId = 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace()) |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |         if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         // Special case maximized windows, since it doesn't make sense |         // Special case maximized windows, since it doesn't make sense | ||||||
| @@ -1715,7 +1723,8 @@ var Workspace = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     zoomFromOverview() { |     zoomFromOverview() { | ||||||
|         let currentWorkspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let currentWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |  | ||||||
|         this.leavingOverview = true; |         this.leavingOverview = true; | ||||||
|  |  | ||||||
| @@ -1783,8 +1792,8 @@ var Workspace = new Lang.Class({ | |||||||
|             this.metaWorkspace.disconnect(this._windowAddedId); |             this.metaWorkspace.disconnect(this._windowAddedId); | ||||||
|             this.metaWorkspace.disconnect(this._windowRemovedId); |             this.metaWorkspace.disconnect(this._windowRemovedId); | ||||||
|         } |         } | ||||||
|         global.screen.disconnect(this._windowEnteredMonitorId); |         global.display.disconnect(this._windowEnteredMonitorId); | ||||||
|         global.screen.disconnect(this._windowLeftMonitorId); |         global.display.disconnect(this._windowLeftMonitorId); | ||||||
|  |  | ||||||
|         if (this._repositionWindowsId > 0) { |         if (this._repositionWindowsId > 0) { | ||||||
|             Mainloop.source_remove(this._repositionWindowsId); |             Mainloop.source_remove(this._repositionWindowsId); | ||||||
| @@ -1849,10 +1858,18 @@ var Workspace = new Lang.Class({ | |||||||
|         clone.connect('size-changed', () => { |         clone.connect('size-changed', () => { | ||||||
|             this._recalculateWindowPositions(WindowPositionFlags.NONE); |             this._recalculateWindowPositions(WindowPositionFlags.NONE); | ||||||
|         }); |         }); | ||||||
|  |         clone.actor.connect('destroy', () => { | ||||||
|  |             this._removeWindowClone(clone.metaWindow); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|         this.actor.add_actor(clone.actor); |         this.actor.add_actor(clone.actor); | ||||||
|  |  | ||||||
|         overlay.connect('show-close-button', this._onShowOverlayClose.bind(this)); |         overlay.connect('show-close-button', () => { | ||||||
|  |             let focus = global.stage.key_focus; | ||||||
|  |             if (focus == null || this.actor.contains(focus)) | ||||||
|  |                 clone.actor.grab_key_focus(); | ||||||
|  |             this._onShowOverlayClose(overlay); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|         if (this._windows.length == 0) |         if (this._windows.length == 0) | ||||||
|             clone.setStackAbove(null); |             clone.setStackAbove(null); | ||||||
| @@ -1865,6 +1882,17 @@ var Workspace = new Lang.Class({ | |||||||
|         return [clone, overlay]; |         return [clone, overlay]; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _removeWindowClone(metaWin) { | ||||||
|  |         // find the position of the window in our list | ||||||
|  |         let index = this._lookupIndex (metaWin); | ||||||
|  |  | ||||||
|  |         if (index == -1) | ||||||
|  |             return null; | ||||||
|  |  | ||||||
|  |         this._windowOverlays.splice(index, 1); | ||||||
|  |         return this._windows.splice(index, 1).pop(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _onShowOverlayClose(windowOverlay) { |     _onShowOverlayClose(windowOverlay) { | ||||||
|         for (let i = 0; i < this._windowOverlays.length; i++) { |         for (let i = 0; i < this._windowOverlays.length; i++) { | ||||||
|             let overlay = this._windowOverlays[i]; |             let overlay = this._windowOverlays[i]; | ||||||
| @@ -2000,7 +2028,8 @@ var Workspace = new Lang.Class({ | |||||||
|             if (metaWindow.get_monitor() != this.monitorIndex) |             if (metaWindow.get_monitor() != this.monitorIndex) | ||||||
|                 metaWindow.move_to_monitor(this.monitorIndex); |                 metaWindow.move_to_monitor(this.monitorIndex); | ||||||
|  |  | ||||||
|             let index = this.metaWorkspace ? this.metaWorkspace.index() : global.screen.get_active_workspace_index(); |             let workspaceManager = global.workspace_manager; | ||||||
|  |             let index = this.metaWorkspace ? this.metaWorkspace.index() : workspaceManager.get_active_workspace_index(); | ||||||
|             metaWindow.change_workspace_by_index(index, false); |             metaWindow.change_workspace_by_index(index, false); | ||||||
|             return true; |             return true; | ||||||
|         } else if (source.shellWorkspaceLaunch) { |         } else if (source.shellWorkspaceLaunch) { | ||||||
|   | |||||||
| @@ -47,9 +47,12 @@ var WorkspaceSwitcherPopup = new Lang.Class({ | |||||||
|  |  | ||||||
|         this.actor.hide(); |         this.actor.hide(); | ||||||
|  |  | ||||||
|         this._globalSignals = []; |         let workspaceManager = global.workspace_manager; | ||||||
|         this._globalSignals.push(global.screen.connect('workspace-added', this._redisplay.bind(this))); |         this._workspaceManagerSignals = []; | ||||||
|         this._globalSignals.push(global.screen.connect('workspace-removed', this._redisplay.bind(this))); |         this._workspaceManagerSignals.push(workspaceManager.connect('workspace-added', | ||||||
|  |                                                                     this._redisplay.bind(this))); | ||||||
|  |         this._workspaceManagerSignals.push(workspaceManager.connect('workspace-removed', | ||||||
|  |                                                                     this._redisplay.bind(this))); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _getPreferredHeight(actor, forWidth, alloc) { |     _getPreferredHeight(actor, forWidth, alloc) { | ||||||
| @@ -68,11 +71,12 @@ var WorkspaceSwitcherPopup = new Lang.Class({ | |||||||
|             height += childNaturalHeight * workArea.width / workArea.height; |             height += childNaturalHeight * workArea.width / workArea.height; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         let spacing = this._itemSpacing * (global.screen.n_workspaces - 1); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let spacing = this._itemSpacing * (workspaceManager.n_workspaces - 1); | ||||||
|         height += spacing; |         height += spacing; | ||||||
|         height = Math.min(height, availHeight); |         height = Math.min(height, availHeight); | ||||||
|  |  | ||||||
|         this._childHeight = (height - spacing) / global.screen.n_workspaces; |         this._childHeight = (height - spacing) / workspaceManager.n_workspaces; | ||||||
|  |  | ||||||
|         alloc.min_size = height; |         alloc.min_size = height; | ||||||
|         alloc.natural_size = height; |         alloc.natural_size = height; | ||||||
| @@ -104,9 +108,11 @@ var WorkspaceSwitcherPopup = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _redisplay() { |     _redisplay() { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|         this._list.destroy_all_children(); |         this._list.destroy_all_children(); | ||||||
|  |  | ||||||
|         for (let i = 0; i < global.screen.n_workspaces; i++) { |         for (let i = 0; i < workspaceManager.n_workspaces; i++) { | ||||||
|             let indicator = null; |             let indicator = null; | ||||||
|  |  | ||||||
|            if (i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.UP) |            if (i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.UP) | ||||||
| @@ -164,8 +170,9 @@ var WorkspaceSwitcherPopup = new Lang.Class({ | |||||||
|             Mainloop.source_remove(this._timeoutId); |             Mainloop.source_remove(this._timeoutId); | ||||||
|         this._timeoutId = 0; |         this._timeoutId = 0; | ||||||
|  |  | ||||||
|         for (let i = 0; i < this._globalSignals.length; i++) |         let workspaceManager = global.workspace_manager; | ||||||
|             global.screen.disconnect(this._globalSignals[i]); |         for (let i = 0; i < this._workspaceManagerSignals.length; i++) | ||||||
|  |             workspaceManager.disconnect(this._workspaceManagerSignals[i]); | ||||||
|  |  | ||||||
|         this.actor.destroy(); |         this.actor.destroy(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ var WORKSPACE_CUT_SIZE = 10; | |||||||
|  |  | ||||||
| var WORKSPACE_KEEP_ALIVE_TIME = 100; | var WORKSPACE_KEEP_ALIVE_TIME = 100; | ||||||
|  |  | ||||||
| const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides'; | var OVERRIDE_SCHEMA = 'org.gnome.shell.overrides'; | ||||||
|  |  | ||||||
| /* A layout manager that requests size only for primary_actor, but then allocates | /* A layout manager that requests size only for primary_actor, but then allocates | ||||||
|    all using a fixed layout */ |    all using a fixed layout */ | ||||||
| @@ -68,7 +68,7 @@ var WindowClone = new Lang.Class({ | |||||||
|         this.realWindow = realWindow; |         this.realWindow = realWindow; | ||||||
|         this.metaWindow = realWindow.meta_window; |         this.metaWindow = realWindow.meta_window; | ||||||
|  |  | ||||||
|         this.clone._updateId = this.metaWindow.connect('position-changed', |         this.clone._updateId = this.realWindow.connect('notify::position', | ||||||
|                                                        this._onPositionChanged.bind(this)); |                                                        this._onPositionChanged.bind(this)); | ||||||
|         this.clone._destroyId = this.realWindow.connect('destroy', () => { |         this.clone._destroyId = this.realWindow.connect('destroy', () => { | ||||||
|             // First destroy the clone and then destroy everything |             // First destroy the clone and then destroy everything | ||||||
| @@ -153,7 +153,7 @@ var WindowClone = new Lang.Class({ | |||||||
|         let clone = new Clutter.Clone({ source: realDialog }); |         let clone = new Clutter.Clone({ source: realDialog }); | ||||||
|         this._updateDialogPosition(realDialog, clone); |         this._updateDialogPosition(realDialog, clone); | ||||||
|  |  | ||||||
|         clone._updateId = metaDialog.connect('position-changed', dialog => { |         clone._updateId = realDialog.connect('notify::position', dialog => { | ||||||
|             this._updateDialogPosition(dialog, clone); |             this._updateDialogPosition(dialog, clone); | ||||||
|         }); |         }); | ||||||
|         clone._destroyId = realDialog.connect('destroy', () => { |         clone._destroyId = realDialog.connect('destroy', () => { | ||||||
| @@ -171,7 +171,6 @@ var WindowClone = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onPositionChanged() { |     _onPositionChanged() { | ||||||
|         let rect = this.metaWindow.get_frame_rect(); |  | ||||||
|         this.actor.set_position(this.realWindow.x, this.realWindow.y); |         this.actor.set_position(this.realWindow.x, this.realWindow.y); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -179,7 +178,7 @@ var WindowClone = new Lang.Class({ | |||||||
|         this.actor.get_children().forEach(child => { |         this.actor.get_children().forEach(child => { | ||||||
|             let realWindow = child.source; |             let realWindow = child.source; | ||||||
|  |  | ||||||
|             realWindow.meta_window.disconnect(child._updateId); |             realWindow.disconnect(child._updateId); | ||||||
|             realWindow.disconnect(child._destroyId); |             realWindow.disconnect(child._destroyId); | ||||||
|         }); |         }); | ||||||
|     }, |     }, | ||||||
| @@ -241,7 +240,7 @@ var WindowClone = new Lang.Class({ | |||||||
| Signals.addSignalMethods(WindowClone.prototype); | Signals.addSignalMethods(WindowClone.prototype); | ||||||
|  |  | ||||||
|  |  | ||||||
| const ThumbnailState = { | var ThumbnailState = { | ||||||
|     NEW   :         0, |     NEW   :         0, | ||||||
|     ANIMATING_IN :  1, |     ANIMATING_IN :  1, | ||||||
|     NORMAL:         2, |     NORMAL:         2, | ||||||
| @@ -275,8 +274,8 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._createBackground(); |         this._createBackground(); | ||||||
|  |  | ||||||
|         let monitor = Main.layoutManager.primaryMonitor; |         let workArea = Main.layoutManager.getWorkAreaForMonitor(this.monitorIndex); | ||||||
|         this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height); |         this.setPorthole(workArea.x, workArea.y, workArea.width, workArea.height); | ||||||
|  |  | ||||||
|         let windows = global.get_window_actors().filter(actor => { |         let windows = global.get_window_actors().filter(actor => { | ||||||
|             let win = actor.meta_window; |             let win = actor.meta_window; | ||||||
| @@ -304,9 +303,9 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|                                                           this._windowAdded.bind(this)); |                                                           this._windowAdded.bind(this)); | ||||||
|         this._windowRemovedId = this.metaWorkspace.connect('window-removed', |         this._windowRemovedId = this.metaWorkspace.connect('window-removed', | ||||||
|                                                            this._windowRemoved.bind(this)); |                                                            this._windowRemoved.bind(this)); | ||||||
|         this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor', |         this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', | ||||||
|                                                            this._windowEnteredMonitor.bind(this)); |                                                               this._windowEnteredMonitor.bind(this)); | ||||||
|         this._windowLeftMonitorId = global.screen.connect('window-left-monitor', |         this._windowLeftMonitorId = global.display.connect('window-left-monitor', | ||||||
|                                                            this._windowLeftMonitor.bind(this)); |                                                            this._windowLeftMonitor.bind(this)); | ||||||
|  |  | ||||||
|         this.state = ThumbnailState.NORMAL; |         this.state = ThumbnailState.NORMAL; | ||||||
| @@ -321,8 +320,6 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     setPorthole(x, y, width, height) { |     setPorthole(x, y, width, height) { | ||||||
|         this._portholeX = x; |  | ||||||
|         this._portholeY = y; |  | ||||||
|         this.actor.set_size(width, height); |         this.actor.set_size(width, height); | ||||||
|         this._contents.set_position(-x, -y); |         this._contents.set_position(-x, -y); | ||||||
|     }, |     }, | ||||||
| @@ -374,18 +371,9 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _doRemoveWindow(metaWin) { |     _doRemoveWindow(metaWin) { | ||||||
|         let win = metaWin.get_compositor_private(); |         let clone = this._removeWindowClone(metaWin); | ||||||
|  |         if (clone) | ||||||
|         // find the position of the window in our list |             clone.destroy(); | ||||||
|         let index = this._lookupIndex (metaWin); |  | ||||||
|  |  | ||||||
|         if (index == -1) |  | ||||||
|             return; |  | ||||||
|  |  | ||||||
|         let clone = this._windows[index]; |  | ||||||
|         this._windows.splice(index, 1); |  | ||||||
|  |  | ||||||
|         clone.destroy(); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _doAddWindow(metaWin) { |     _doAddWindow(metaWin) { | ||||||
| @@ -457,13 +445,13 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|         this._doRemoveWindow(metaWin); |         this._doRemoveWindow(metaWin); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) { |     _windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { | ||||||
|         if (monitorIndex == this.monitorIndex) { |         if (monitorIndex == this.monitorIndex) { | ||||||
|             this._doAddWindow(metaWin); |             this._doAddWindow(metaWin); | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _windowLeftMonitor(metaScreen, monitorIndex, metaWin) { |     _windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { | ||||||
|         if (monitorIndex == this.monitorIndex) { |         if (monitorIndex == this.monitorIndex) { | ||||||
|             this._doRemoveWindow(metaWin); |             this._doRemoveWindow(metaWin); | ||||||
|         } |         } | ||||||
| @@ -489,8 +477,8 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|  |  | ||||||
|         this.metaWorkspace.disconnect(this._windowAddedId); |         this.metaWorkspace.disconnect(this._windowAddedId); | ||||||
|         this.metaWorkspace.disconnect(this._windowRemovedId); |         this.metaWorkspace.disconnect(this._windowRemovedId); | ||||||
|         global.screen.disconnect(this._windowEnteredMonitorId); |         global.display.disconnect(this._windowEnteredMonitorId); | ||||||
|         global.screen.disconnect(this._windowLeftMonitorId); |         global.display.disconnect(this._windowLeftMonitorId); | ||||||
|  |  | ||||||
|         for (let i = 0; i < this._allWindows.length; i++) |         for (let i = 0; i < this._allWindows.length; i++) | ||||||
|             this._allWindows[i].disconnect(this._minimizedChangedIds[i]); |             this._allWindows[i].disconnect(this._minimizedChangedIds[i]); | ||||||
| @@ -537,6 +525,9 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|         clone.connect('drag-end', () => { |         clone.connect('drag-end', () => { | ||||||
|             Main.overview.endWindowDrag(clone.metaWindow); |             Main.overview.endWindowDrag(clone.metaWindow); | ||||||
|         }); |         }); | ||||||
|  |         clone.actor.connect('destroy', () => { | ||||||
|  |             this._removeWindowClone(clone.metaWindow); | ||||||
|  |         }); | ||||||
|         this._contents.add_actor(clone.actor); |         this._contents.add_actor(clone.actor); | ||||||
|  |  | ||||||
|         if (this._windows.length == 0) |         if (this._windows.length == 0) | ||||||
| @@ -549,12 +540,24 @@ var WorkspaceThumbnail = new Lang.Class({ | |||||||
|         return clone; |         return clone; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _removeWindowClone(metaWin) { | ||||||
|  |         // find the position of the window in our list | ||||||
|  |         let index = this._lookupIndex (metaWin); | ||||||
|  |  | ||||||
|  |         if (index == -1) | ||||||
|  |             return null; | ||||||
|  |  | ||||||
|  |         return this._windows.splice(index, 1).pop(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     activate(time) { |     activate(time) { | ||||||
|         if (this.state > ThumbnailState.NORMAL) |         if (this.state > ThumbnailState.NORMAL) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         // a click on the already current workspace should go back to the main view |         // a click on the already current workspace should go back to the main view | ||||||
|         if (this.metaWorkspace == global.screen.get_active_workspace()) |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |         if (this.metaWorkspace == activeWorkspace) | ||||||
|             Main.overview.hide(); |             Main.overview.hide(); | ||||||
|         else |         else | ||||||
|             this.metaWorkspace.activate(time); |             this.metaWorkspace.activate(time); | ||||||
| @@ -675,17 +678,20 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|         this._settings.connect('changed::dynamic-workspaces', |         this._settings.connect('changed::dynamic-workspaces', | ||||||
|             this._updateSwitcherVisibility.bind(this)); |             this._updateSwitcherVisibility.bind(this)); | ||||||
|  |  | ||||||
|         Main.layoutManager.connect('monitors-changed', () => { |         Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this)); | ||||||
|             this._destroyThumbnails(); |  | ||||||
|             if (Main.overview.visible) |         this._switchWorkspaceNotifyId = 0; | ||||||
|                 this._createThumbnails(); |         this._nWorkspacesNotifyId = 0; | ||||||
|         }); |         this._syncStackingId = 0; | ||||||
|  |         this._workareasChangedId = 0; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _updateSwitcherVisibility() { |     _updateSwitcherVisibility() { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|         this.actor.visible = |         this.actor.visible = | ||||||
|             this._settings.get_boolean('dynamic-workspaces') || |             this._settings.get_boolean('dynamic-workspaces') || | ||||||
|                 global.screen.n_workspaces > 1; |                 workspaceManager.n_workspaces > 1; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _activateThumbnailAtPoint(stageX, stageY, time) { |     _activateThumbnailAtPoint(stageX, stageY, time) { | ||||||
| @@ -843,7 +849,8 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|                 // to open its first window within some time, as tracked by Shell.WindowTracker. |                 // to open its first window within some time, as tracked by Shell.WindowTracker. | ||||||
|                 // Here, we only add a very brief timeout to avoid the _immediate_ removal of the |                 // Here, we only add a very brief timeout to avoid the _immediate_ removal of the | ||||||
|                 // workspace while we wait for the startup sequence to load. |                 // workspace while we wait for the startup sequence to load. | ||||||
|                 Main.wm.keepWorkspaceAlive(global.screen.get_workspace_by_index(newWorkspaceIndex), |                 let workspaceManager = global.workspace_manager; | ||||||
|  |                 Main.wm.keepWorkspaceAlive(workspaceManager.get_workspace_by_index(newWorkspaceIndex), | ||||||
|                                            WORKSPACE_KEEP_ALIVE_TIME); |                                            WORKSPACE_KEEP_ALIVE_TIME); | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -862,16 +869,22 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _createThumbnails() { |     _createThumbnails() { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|         this._switchWorkspaceNotifyId = |         this._switchWorkspaceNotifyId = | ||||||
|             global.window_manager.connect('switch-workspace', |             global.window_manager.connect('switch-workspace', | ||||||
|                                           this._activeWorkspaceChanged.bind(this)); |                                           this._activeWorkspaceChanged.bind(this)); | ||||||
|         this._nWorkspacesNotifyId = |         this._nWorkspacesNotifyId = | ||||||
|             global.screen.connect('notify::n-workspaces', |             workspaceManager.connect('notify::n-workspaces', | ||||||
|                                   this._workspacesChanged.bind(this)); |                                      this._workspacesChanged.bind(this)); | ||||||
|         this._syncStackingId = |         this._syncStackingId = | ||||||
|             Main.overview.connect('windows-restacked', |             Main.overview.connect('windows-restacked', | ||||||
|                                   this._syncStacking.bind(this)); |                                   this._syncStacking.bind(this)); | ||||||
|  |  | ||||||
|  |         this._workareasChangedId = | ||||||
|  |             global.display.connect('workareas-changed', | ||||||
|  |                                    this._rebuildThumbnails.bind(this)); | ||||||
|  |  | ||||||
|         this._targetScale = 0; |         this._targetScale = 0; | ||||||
|         this._scale = 0; |         this._scale = 0; | ||||||
|         this._pendingScaleUpdate = false; |         this._pendingScaleUpdate = false; | ||||||
| @@ -881,18 +894,22 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|         for (let key in ThumbnailState) |         for (let key in ThumbnailState) | ||||||
|             this._stateCounts[ThumbnailState[key]] = 0; |             this._stateCounts[ThumbnailState[key]] = 0; | ||||||
|  |  | ||||||
|         this.addThumbnails(0, global.screen.n_workspaces); |         this.addThumbnails(0, workspaceManager.n_workspaces); | ||||||
|  |  | ||||||
|         this._updateSwitcherVisibility(); |         this._updateSwitcherVisibility(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _destroyThumbnails() { |     _destroyThumbnails() { | ||||||
|  |         if (this._thumbnails.length == 0) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|         if (this._switchWorkspaceNotifyId > 0) { |         if (this._switchWorkspaceNotifyId > 0) { | ||||||
|             global.window_manager.disconnect(this._switchWorkspaceNotifyId); |             global.window_manager.disconnect(this._switchWorkspaceNotifyId); | ||||||
|             this._switchWorkspaceNotifyId = 0; |             this._switchWorkspaceNotifyId = 0; | ||||||
|         } |         } | ||||||
|         if (this._nWorkspacesNotifyId > 0) { |         if (this._nWorkspacesNotifyId > 0) { | ||||||
|             global.screen.disconnect(this._nWorkspacesNotifyId); |             let workspaceManager = global.workspace_manager; | ||||||
|  |             workspaceManager.disconnect(this._nWorkspacesNotifyId); | ||||||
|             this._nWorkspacesNotifyId = 0; |             this._nWorkspacesNotifyId = 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -901,18 +918,31 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|             this._syncStackingId = 0; |             this._syncStackingId = 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (this._workareasChangedId > 0) { | ||||||
|  |             global.display.disconnect(this._workareasChangedId); | ||||||
|  |             this._workareasChangedId = 0; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         for (let w = 0; w < this._thumbnails.length; w++) |         for (let w = 0; w < this._thumbnails.length; w++) | ||||||
|             this._thumbnails[w].destroy(); |             this._thumbnails[w].destroy(); | ||||||
|         this._thumbnails = []; |         this._thumbnails = []; | ||||||
|         this._porthole = null; |         this._porthole = null; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _rebuildThumbnails() { | ||||||
|  |         this._destroyThumbnails(); | ||||||
|  |  | ||||||
|  |         if (Main.overview.visible) | ||||||
|  |             this._createThumbnails(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _workspacesChanged() { |     _workspacesChanged() { | ||||||
|         let validThumbnails = |         let validThumbnails = | ||||||
|             this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL); |             this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL); | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|         let oldNumWorkspaces = validThumbnails.length; |         let oldNumWorkspaces = validThumbnails.length; | ||||||
|         let newNumWorkspaces = global.screen.n_workspaces; |         let newNumWorkspaces = workspaceManager.n_workspaces; | ||||||
|         let active = global.screen.get_active_workspace_index(); |         let active = workspaceManager.get_active_workspace_index(); | ||||||
|  |  | ||||||
|         if (newNumWorkspaces > oldNumWorkspaces) { |         if (newNumWorkspaces > oldNumWorkspaces) { | ||||||
|             this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces); |             this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces); | ||||||
| @@ -920,7 +950,7 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|             let removedIndex; |             let removedIndex; | ||||||
|             let removedNum = oldNumWorkspaces - newNumWorkspaces; |             let removedNum = oldNumWorkspaces - newNumWorkspaces; | ||||||
|             for (let w = 0; w < oldNumWorkspaces; w++) { |             for (let w = 0; w < oldNumWorkspaces; w++) { | ||||||
|                 let metaWorkspace = global.screen.get_workspace_by_index(w); |                 let metaWorkspace = workspaceManager.get_workspace_by_index(w); | ||||||
|                 if (this._thumbnails[w].metaWorkspace != metaWorkspace) { |                 if (this._thumbnails[w].metaWorkspace != metaWorkspace) { | ||||||
|                     removedIndex = w; |                     removedIndex = w; | ||||||
|                     break; |                     break; | ||||||
| @@ -934,10 +964,12 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     addThumbnails(start, count) { |     addThumbnails(start, count) { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|         if (!this._ensurePorthole()) |         if (!this._ensurePorthole()) | ||||||
|             return; |             return; | ||||||
|         for (let k = start; k < start + count; k++) { |         for (let k = start; k < start + count; k++) { | ||||||
|             let metaWorkspace = global.screen.get_workspace_by_index(k); |             let metaWorkspace = workspaceManager.get_workspace_by_index(k); | ||||||
|             let thumbnail = new WorkspaceThumbnail(metaWorkspace); |             let thumbnail = new WorkspaceThumbnail(metaWorkspace); | ||||||
|             thumbnail.setPorthole(this._porthole.x, this._porthole.y, |             thumbnail.setPorthole(this._porthole.x, this._porthole.y, | ||||||
|                                   this._porthole.width, this._porthole.height); |                                   this._porthole.width, this._porthole.height); | ||||||
| @@ -1123,10 +1155,11 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|         let themeNode = this.actor.get_theme_node(); |         let themeNode = this.actor.get_theme_node(); | ||||||
|  |  | ||||||
|         let spacing = themeNode.get_length('spacing'); |         let spacing = themeNode.get_length('spacing'); | ||||||
|         let nWorkspaces = global.screen.n_workspaces; |         let nWorkspaces = workspaceManager.n_workspaces; | ||||||
|         let totalSpacing = (nWorkspaces - 1) * spacing; |         let totalSpacing = (nWorkspaces - 1) * spacing; | ||||||
|  |  | ||||||
|         alloc.min_size = totalSpacing; |         alloc.min_size = totalSpacing; | ||||||
| @@ -1140,10 +1173,11 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|         let themeNode = this.actor.get_theme_node(); |         let themeNode = this.actor.get_theme_node(); | ||||||
|  |  | ||||||
|         let spacing = this.actor.get_theme_node().get_length('spacing'); |         let spacing = this.actor.get_theme_node().get_length('spacing'); | ||||||
|         let nWorkspaces = global.screen.n_workspaces; |         let nWorkspaces = workspaceManager.n_workspaces; | ||||||
|         let totalSpacing = (nWorkspaces - 1) * spacing; |         let totalSpacing = (nWorkspaces - 1) * spacing; | ||||||
|  |  | ||||||
|         let avail = forHeight - totalSpacing; |         let avail = forHeight - totalSpacing; | ||||||
| @@ -1159,7 +1193,7 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|     // The "porthole" is the portion of the screen that we show in the |     // The "porthole" is the portion of the screen that we show in the | ||||||
|     // workspaces |     // workspaces | ||||||
|     _ensurePorthole() { |     _ensurePorthole() { | ||||||
|         if (!Main.layoutManager.primaryMonitor) |         if (!Main.layoutManager.primaryMonitor || !Main.overview.visible) | ||||||
|             return false; |             return false; | ||||||
|  |  | ||||||
|         if (!this._porthole) |         if (!this._porthole) | ||||||
| @@ -1174,6 +1208,7 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|         if (this._thumbnails.length == 0) // not visible |         if (this._thumbnails.length == 0) // not visible | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|         let themeNode = this.actor.get_theme_node(); |         let themeNode = this.actor.get_theme_node(); | ||||||
|  |  | ||||||
|         let portholeWidth = this._porthole.width; |         let portholeWidth = this._porthole.width; | ||||||
| @@ -1181,7 +1216,7 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|         let spacing = themeNode.get_length('spacing'); |         let spacing = themeNode.get_length('spacing'); | ||||||
|  |  | ||||||
|         // Compute the scale we'll need once everything is updated |         // Compute the scale we'll need once everything is updated | ||||||
|         let nWorkspaces = global.screen.n_workspaces; |         let nWorkspaces = workspaceManager.n_workspaces; | ||||||
|         let totalSpacing = (nWorkspaces - 1) * spacing; |         let totalSpacing = (nWorkspaces - 1) * spacing; | ||||||
|         let avail = (box.y2 - box.y1) - totalSpacing; |         let avail = (box.y2 - box.y1) - totalSpacing; | ||||||
|  |  | ||||||
| @@ -1215,7 +1250,8 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|         let indicatorY1 = this._indicatorY; |         let indicatorY1 = this._indicatorY; | ||||||
|         let indicatorY2; |         let indicatorY2; | ||||||
|         // when not animating, the workspace position overrides this._indicatorY |         // when not animating, the workspace position overrides this._indicatorY | ||||||
|         let indicatorWorkspace = !this._animatingIndicator ? global.screen.get_active_workspace() : null; |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|  |         let indicatorWorkspace = !this._animatingIndicator ? activeWorkspace : null; | ||||||
|         let indicatorThemeNode = this._indicator.get_theme_node(); |         let indicatorThemeNode = this._indicator.get_theme_node(); | ||||||
|  |  | ||||||
|         let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP); |         let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP); | ||||||
| @@ -1306,7 +1342,8 @@ var ThumbnailsBox = new Lang.Class({ | |||||||
|  |  | ||||||
|     _activeWorkspaceChanged(wm, from, to, direction) { |     _activeWorkspaceChanged(wm, from, to, direction) { | ||||||
|         let thumbnail; |         let thumbnail; | ||||||
|         let activeWorkspace = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||||
|         for (let i = 0; i < this._thumbnails.length; i++) { |         for (let i = 0; i < this._thumbnails.length; i++) { | ||||||
|             if (this._thumbnails[i].metaWorkspace == activeWorkspace) { |             if (this._thumbnails[i].metaWorkspace == activeWorkspace) { | ||||||
|                 thumbnail = this._thumbnails[i]; |                 thumbnail = this._thumbnails[i]; | ||||||
|   | |||||||
| @@ -33,7 +33,6 @@ var WorkspacesViewBase = new Lang.Class({ | |||||||
|         this.actor = new St.Widget({ style_class: 'workspaces-view', |         this.actor = new St.Widget({ style_class: 'workspaces-view', | ||||||
|                                      reactive: true }); |                                      reactive: true }); | ||||||
|         this.actor.connect('destroy', this._onDestroy.bind(this)); |         this.actor.connect('destroy', this._onDestroy.bind(this)); | ||||||
|         global.focus_manager.add_group(this.actor); |  | ||||||
|  |  | ||||||
|         // The actor itself isn't a drop target, so we don't want to pick on its area |         // The actor itself isn't a drop target, so we don't want to pick on its area | ||||||
|         this.actor.set_size(0, 0); |         this.actor.set_size(0, 0); | ||||||
| @@ -91,25 +90,29 @@ var WorkspacesView = new Lang.Class({ | |||||||
|     Extends: WorkspacesViewBase, |     Extends: WorkspacesViewBase, | ||||||
|  |  | ||||||
|     _init(monitorIndex) { |     _init(monitorIndex) { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |  | ||||||
|         this.parent(monitorIndex); |         this.parent(monitorIndex); | ||||||
|  |  | ||||||
|         this._animating = false; // tweening |         this._animating = false; // tweening | ||||||
|         this._scrolling = false; // swipe-scrolling |         this._scrolling = false; // swipe-scrolling | ||||||
|         this._animatingScroll = false; // programatically updating the adjustment |         this._animatingScroll = false; // programatically updating the adjustment | ||||||
|  |  | ||||||
|         let activeWorkspaceIndex = global.screen.get_active_workspace_index(); |         let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); | ||||||
|         this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, |         this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, | ||||||
|                                                     lower: 0, |                                                     lower: 0, | ||||||
|                                                     page_increment: 1, |                                                     page_increment: 1, | ||||||
|                                                     page_size: 1, |                                                     page_size: 1, | ||||||
|                                                     step_increment: 0, |                                                     step_increment: 0, | ||||||
|                                                     upper: global.screen.n_workspaces }); |                                                     upper: workspaceManager.n_workspaces }); | ||||||
|         this.scrollAdjustment.connect('notify::value', |         this.scrollAdjustment.connect('notify::value', | ||||||
|                                       this._onScroll.bind(this)); |                                       this._onScroll.bind(this)); | ||||||
|  |  | ||||||
|         this._workspaces = []; |         this._workspaces = []; | ||||||
|         this._updateWorkspaces(); |         this._updateWorkspaces(); | ||||||
|         this._updateWorkspacesId = global.screen.connect('notify::n-workspaces', this._updateWorkspaces.bind(this)); |         this._updateWorkspacesId = | ||||||
|  |             workspaceManager.connect('notify::n-workspaces', | ||||||
|  |                                      this._updateWorkspaces.bind(this)); | ||||||
|  |  | ||||||
|         this._overviewShownId = |         this._overviewShownId = | ||||||
|             Main.overview.connect('shown', () => { |             Main.overview.connect('shown', () => { | ||||||
| @@ -138,7 +141,8 @@ var WorkspacesView = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     getActiveWorkspace() { |     getActiveWorkspace() { | ||||||
|         let active = global.screen.get_active_workspace_index(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let active = workspaceManager.get_active_workspace_index(); | ||||||
|         return this._workspaces[active]; |         return this._workspaces[active]; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -169,7 +173,8 @@ var WorkspacesView = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _scrollToActive() { |     _scrollToActive() { | ||||||
|         let active = global.screen.get_active_workspace_index(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let active = workspaceManager.get_active_workspace_index(); | ||||||
|  |  | ||||||
|         this._updateWorkspaceActors(true); |         this._updateWorkspaceActors(true); | ||||||
|         this._updateScrollAdjustment(active); |         this._updateScrollAdjustment(active); | ||||||
| @@ -178,7 +183,8 @@ var WorkspacesView = new Lang.Class({ | |||||||
|     // Update workspace actors parameters |     // Update workspace actors parameters | ||||||
|     // @showAnimation: iff %true, transition between states |     // @showAnimation: iff %true, transition between states | ||||||
|     _updateWorkspaceActors(showAnimation) { |     _updateWorkspaceActors(showAnimation) { | ||||||
|         let active = global.screen.get_active_workspace_index(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let active = workspaceManager.get_active_workspace_index(); | ||||||
|  |  | ||||||
|         this._animating = showAnimation; |         this._animating = showAnimation; | ||||||
|  |  | ||||||
| @@ -214,7 +220,8 @@ var WorkspacesView = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _updateVisibility() { |     _updateVisibility() { | ||||||
|         let active = global.screen.get_active_workspace_index(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let active = workspaceManager.get_active_workspace_index(); | ||||||
|  |  | ||||||
|         for (let w = 0; w < this._workspaces.length; w++) { |         for (let w = 0; w < this._workspaces.length; w++) { | ||||||
|             let workspace = this._workspaces[w]; |             let workspace = this._workspaces[w]; | ||||||
| @@ -246,13 +253,14 @@ var WorkspacesView = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _updateWorkspaces() { |     _updateWorkspaces() { | ||||||
|         let newNumWorkspaces = global.screen.n_workspaces; |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let newNumWorkspaces = workspaceManager.n_workspaces; | ||||||
|  |  | ||||||
|         this.scrollAdjustment.upper = newNumWorkspaces; |         this.scrollAdjustment.upper = newNumWorkspaces; | ||||||
|  |  | ||||||
|         let needsUpdate = false; |         let needsUpdate = false; | ||||||
|         for (let j = 0; j < newNumWorkspaces; j++) { |         for (let j = 0; j < newNumWorkspaces; j++) { | ||||||
|             let metaWorkspace = global.screen.get_workspace_by_index(j); |             let metaWorkspace = workspaceManager.get_workspace_by_index(j); | ||||||
|             let workspace; |             let workspace; | ||||||
|  |  | ||||||
|             if (j >= this._workspaces.length) { /* added */ |             if (j >= this._workspaces.length) { /* added */ | ||||||
| @@ -290,7 +298,8 @@ var WorkspacesView = new Lang.Class({ | |||||||
|         this.scrollAdjustment.run_dispose(); |         this.scrollAdjustment.run_dispose(); | ||||||
|         Main.overview.disconnect(this._overviewShownId); |         Main.overview.disconnect(this._overviewShownId); | ||||||
|         global.window_manager.disconnect(this._switchWorkspaceNotifyId); |         global.window_manager.disconnect(this._switchWorkspaceNotifyId); | ||||||
|         global.screen.disconnect(this._updateWorkspacesId); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         workspaceManager.disconnect(this._updateWorkspacesId); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     startSwipeScroll() { |     startSwipeScroll() { | ||||||
| @@ -311,7 +320,8 @@ var WorkspacesView = new Lang.Class({ | |||||||
|         if (this._animatingScroll) |         if (this._animatingScroll) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         let active = global.screen.get_active_workspace_index(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let active = workspaceManager.get_active_workspace_index(); | ||||||
|         let current = Math.round(adj.value); |         let current = Math.round(adj.value); | ||||||
|  |  | ||||||
|         if (active != current) { |         if (active != current) { | ||||||
| @@ -417,6 +427,10 @@ var WorkspacesDisplay = new Lang.Class({ | |||||||
|         this.actor.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this)); |         this.actor.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this)); | ||||||
|         this.actor.connect('parent-set', this._parentSet.bind(this)); |         this.actor.connect('parent-set', this._parentSet.bind(this)); | ||||||
|  |  | ||||||
|  |         this._viewsContainer = new St.Widget(); | ||||||
|  |         Main.layoutManager.overviewGroup.add_actor(this._viewsContainer); | ||||||
|  |         global.focus_manager.add_group(this._viewsContainer); | ||||||
|  |  | ||||||
|         let clickAction = new Clutter.ClickAction(); |         let clickAction = new Clutter.ClickAction(); | ||||||
|         clickAction.connect('clicked', action => { |         clickAction.connect('clicked', action => { | ||||||
|             // Only switch to the workspace when there's no application |             // Only switch to the workspace when there's no application | ||||||
| @@ -568,7 +582,7 @@ var WorkspacesDisplay = new Lang.Class({ | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             this._workspacesViews.push(view); |             this._workspacesViews.push(view); | ||||||
|             Main.layoutManager.overviewGroup.add_actor(view.actor); |             this._viewsContainer.add_actor(view.actor); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._updateWorkspacesFullGeometry(); |         this._updateWorkspacesFullGeometry(); | ||||||
| @@ -593,7 +607,7 @@ var WorkspacesDisplay = new Lang.Class({ | |||||||
|     _getMonitorIndexForEvent(event) { |     _getMonitorIndexForEvent(event) { | ||||||
|         let [x, y] = event.get_coords(); |         let [x, y] = event.get_coords(); | ||||||
|         let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 }); |         let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 }); | ||||||
|         return global.screen.get_monitor_index_for_rect(rect); |         return global.display.get_monitor_index_for_rect(rect); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _getPrimaryView() { |     _getPrimaryView() { | ||||||
| @@ -679,7 +693,8 @@ var WorkspacesDisplay = new Lang.Class({ | |||||||
|             this._getMonitorIndexForEvent(event) != this._primaryIndex) |             this._getMonitorIndexForEvent(event) != this._primaryIndex) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         let activeWs = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWs = workspaceManager.get_active_workspace(); | ||||||
|         let ws; |         let ws; | ||||||
|         switch (event.get_scroll_direction()) { |         switch (event.get_scroll_direction()) { | ||||||
|         case Clutter.ScrollDirection.UP: |         case Clutter.ScrollDirection.UP: | ||||||
| @@ -698,7 +713,8 @@ var WorkspacesDisplay = new Lang.Class({ | |||||||
|     _onKeyPressEvent(actor, event) { |     _onKeyPressEvent(actor, event) { | ||||||
|         if (!this.actor.mapped) |         if (!this.actor.mapped) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|         let activeWs = global.screen.get_active_workspace(); |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let activeWs = workspaceManager.get_active_workspace(); | ||||||
|         let ws; |         let ws; | ||||||
|         switch (event.get_key_symbol()) { |         switch (event.get_key_symbol()) { | ||||||
|         case Clutter.KEY_Page_Up: |         case Clutter.KEY_Page_Up: | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								meson.build
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								meson.build
									
									
									
									
									
								
							| @@ -1,12 +1,12 @@ | |||||||
| project('gnome-shell', 'c', | project('gnome-shell', 'c', | ||||||
|   version: '3.27.92', |   version: '3.29.90', | ||||||
|   meson_version: '>= 0.42.0', |   meson_version: '>= 0.42.0', | ||||||
|   license: 'GPLv2+' |   license: 'GPLv2+' | ||||||
| ) | ) | ||||||
|  |  | ||||||
| # We depend on a specific version of the libmutter API. The mutter variants of | # We depend on a specific version of the libmutter API. The mutter variants of | ||||||
| # the Cogl and Clutter libraries also use this API version. | # the Cogl and Clutter libraries also use this API version. | ||||||
| mutter_api_version = '2' | mutter_api_version = '3' | ||||||
|  |  | ||||||
| clutter_pc = 'mutter-clutter-' + mutter_api_version | clutter_pc = 'mutter-clutter-' + mutter_api_version | ||||||
| cogl_pc = 'mutter-cogl-' + mutter_api_version | cogl_pc = 'mutter-cogl-' + mutter_api_version | ||||||
| @@ -18,20 +18,20 @@ ecal_req = '>= 3.5.3' | |||||||
| eds_req = '>= 3.17.2' | eds_req = '>= 3.17.2' | ||||||
| gcr_req = '>= 3.7.5' | gcr_req = '>= 3.7.5' | ||||||
| gdesktop_req = '>= 3.7.90' | gdesktop_req = '>= 3.7.90' | ||||||
| gio_req = '>= 2.53.0' | gio_req = '>= 2.56.0' | ||||||
| gi_req = '>= 1.49.1' | gi_req = '>= 1.49.1' | ||||||
| gjs_req = '>= 1.47.0' | gjs_req = '>= 1.47.0' | ||||||
| gtk_req = '>= 3.15.0' | gtk_req = '>= 3.15.0' | ||||||
| json_glib_req = '>= 0.13.2' | json_glib_req = '>= 0.13.2' | ||||||
| mutter_req = '>= 3.27.91' | mutter_req = '>= 3.29.90' | ||||||
| polkit_req = '>= 0.100' | polkit_req = '>= 0.100' | ||||||
| schemas_req = '>= 3.21.3' | schemas_req = '>= 3.27.90' | ||||||
| startup_req = '>= 0.11' | startup_req = '>= 0.11' | ||||||
| ibus_req = '>= 1.5.2' | ibus_req = '>= 1.5.2' | ||||||
|  |  | ||||||
| bt_req = '>= 3.9.0' | bt_req = '>= 3.9.0' | ||||||
| gst_req = '>= 0.11.92' | gst_req = '>= 0.11.92' | ||||||
| nm_req = '>= 0.9.8' | nm_req = '>= 1.10.4' | ||||||
| secret_req = '>= 0.18' | secret_req = '>= 0.18' | ||||||
|  |  | ||||||
| gnome = import('gnome') | gnome = import('gnome') | ||||||
| @@ -44,10 +44,12 @@ datadir = join_paths(prefix, get_option('datadir')) | |||||||
| libdir = join_paths(prefix, get_option('libdir')) | libdir = join_paths(prefix, get_option('libdir')) | ||||||
| libexecdir = join_paths(prefix, get_option('libexecdir')) | libexecdir = join_paths(prefix, get_option('libexecdir')) | ||||||
| mandir = join_paths(prefix, get_option('mandir')) | mandir = join_paths(prefix, get_option('mandir')) | ||||||
|  | sysconfdir = join_paths(prefix, get_option('sysconfdir')) | ||||||
|  |  | ||||||
| pkgdatadir = join_paths(datadir, meson.project_name()) | pkgdatadir = join_paths(datadir, meson.project_name()) | ||||||
| pkglibdir = join_paths(libdir, meson.project_name()) | pkglibdir = join_paths(libdir, meson.project_name()) | ||||||
|  |  | ||||||
|  | autostartdir = join_paths(sysconfdir, 'xdg', 'autostart') | ||||||
| convertdir = join_paths(datadir, 'GConf', 'gsettings') | convertdir = join_paths(datadir, 'GConf', 'gsettings') | ||||||
| desktopdir = join_paths(datadir, 'applications') | desktopdir = join_paths(datadir, 'applications') | ||||||
| ifacedir = join_paths(datadir, 'dbus-1', 'interfaces') | ifacedir = join_paths(datadir, 'dbus-1', 'interfaces') | ||||||
| @@ -59,6 +61,13 @@ servicedir = join_paths(datadir, 'dbus-1', 'services') | |||||||
|  |  | ||||||
| plugindir = get_variable('BROWSER_PLUGIN_DIR', mozplugindir) | plugindir = get_variable('BROWSER_PLUGIN_DIR', mozplugindir) | ||||||
|  |  | ||||||
|  | # XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can | ||||||
|  | # depend on this version, replace with something like: | ||||||
|  | # systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir', | ||||||
|  | #                                                         define_variable: ['prefix', prefix]) | ||||||
|  | # and uncomment systemd_dep below | ||||||
|  | systemduserunitdir = join_paths(prefix, 'lib', 'systemd', 'user') | ||||||
|  |  | ||||||
| keybindings_dep = dependency('gnome-keybindings', required: false) | keybindings_dep = dependency('gnome-keybindings', required: false) | ||||||
| if keybindings_dep.found() | if keybindings_dep.found() | ||||||
|   keysdir = keybindings_dep.get_pkgconfig_variable('keysdir') |   keysdir = keybindings_dep.get_pkgconfig_variable('keysdir') | ||||||
| @@ -117,10 +126,12 @@ else | |||||||
| endif | endif | ||||||
|  |  | ||||||
| if get_option('systemd') | if get_option('systemd') | ||||||
|   systemd_dep = dependency('libsystemd') |   libsystemd_dep = dependency('libsystemd') | ||||||
|   have_systemd = systemd_dep.found() |   # XXX: see systemduserunitdir | ||||||
|  |   # systemd_dep = dependency('systemd') | ||||||
|  |   have_systemd = true | ||||||
| else | else | ||||||
|   systemd_dep = [] |   libsystemd_dep = [] | ||||||
|   have_systemd = false |   have_systemd = false | ||||||
| endif | endif | ||||||
|  |  | ||||||
| @@ -152,6 +163,11 @@ cdata.set_quoted('PACKAGE_VERSION', meson.project_version()) | |||||||
| cdata.set('HAVE_NETWORKMANAGER', have_networkmanager) | cdata.set('HAVE_NETWORKMANAGER', have_networkmanager) | ||||||
| cdata.set('HAVE_SYSTEMD', have_systemd) | cdata.set('HAVE_SYSTEMD', have_systemd) | ||||||
|  |  | ||||||
|  | # New API added in glib-2.57.2 | ||||||
|  | cdata.set('HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS', | ||||||
|  |           cc.has_function('g_desktop_app_info_launch_uris_as_manager_with_fds', | ||||||
|  |                           dependencies : gio_dep) | ||||||
|  | ) | ||||||
| cdata.set('HAVE_FDWALK', cc.has_function('fdwalk')) | cdata.set('HAVE_FDWALK', cc.has_function('fdwalk')) | ||||||
| cdata.set('HAVE_MALLINFO', cc.has_function('mallinfo')) | cdata.set('HAVE_MALLINFO', cc.has_function('mallinfo')) | ||||||
| cdata.set('HAVE_SYS_RESOURCE_H', cc.has_header('sys/resource.h')) | cdata.set('HAVE_SYS_RESOURCE_H', cc.has_header('sys/resource.h')) | ||||||
| @@ -159,6 +175,10 @@ cdata.set('HAVE__NL_TIME_FIRST_WEEKDAY', | |||||||
|   cc.has_header_symbol('langinfo.h', '_NL_TIME_FIRST_WEEKDAY') |   cc.has_header_symbol('langinfo.h', '_NL_TIME_FIRST_WEEKDAY') | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | cdata.set('HAVE_FDWALK', | ||||||
|  |           cc.has_function('fdwalk') | ||||||
|  | ) | ||||||
|  |  | ||||||
| config_h = configure_file( | config_h = configure_file( | ||||||
|   input: 'config.h.meson', |   input: 'config.h.meson', | ||||||
|   output: 'config.h', |   output: 'config.h', | ||||||
| @@ -185,7 +205,10 @@ subdir('src') | |||||||
| subdir('po') | subdir('po') | ||||||
| subdir('data') | subdir('data') | ||||||
| subdir('tests') | subdir('tests') | ||||||
|  | subdir('tools') | ||||||
|  |  | ||||||
| if get_option('gtk_doc') | if get_option('gtk_doc') | ||||||
|   subdir('docs/reference') |   subdir('docs/reference') | ||||||
| endif | endif | ||||||
|  |  | ||||||
|  | meson.add_install_script('meson/meson-postinstall.sh') | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								meson/meson-postinstall.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								meson/meson-postinstall.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | # Package managers set this so we don't need to run | ||||||
|  | if [ -z "$DESTDIR" ]; then | ||||||
|  |   echo Compiling GSettings schemas... | ||||||
|  |   glib-compile-schemas ${MESON_INSTALL_PREFIX}/share/glib-2.0/schemas | ||||||
|  |  | ||||||
|  |   echo Updating desktop database... | ||||||
|  |   update-desktop-database -q ${MESON_INSTALL_PREFIX}/share/applications | ||||||
|  | fi | ||||||
| @@ -40,6 +40,7 @@ js/ui/messageList.js | |||||||
| js/ui/messageTray.js | js/ui/messageTray.js | ||||||
| js/ui/mpris.js | js/ui/mpris.js | ||||||
| js/ui/notificationDaemon.js | js/ui/notificationDaemon.js | ||||||
|  | js/ui/osdWindow.js | ||||||
| js/ui/overviewControls.js | js/ui/overviewControls.js | ||||||
| js/ui/overview.js | js/ui/overview.js | ||||||
| js/ui/padOsd.js | js/ui/padOsd.js | ||||||
| @@ -58,6 +59,7 @@ js/ui/status/location.js | |||||||
| js/ui/status/network.js | js/ui/status/network.js | ||||||
| js/ui/status/nightLight.js | js/ui/status/nightLight.js | ||||||
| js/ui/status/power.js | js/ui/status/power.js | ||||||
|  | js/ui/status/remoteAccess.js | ||||||
| js/ui/status/rfkill.js | js/ui/status/rfkill.js | ||||||
| js/ui/status/system.js | js/ui/status/system.js | ||||||
| js/ui/status/thunderbolt.js | js/ui/status/thunderbolt.js | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								po/cs.po
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								po/cs.po
									
									
									
									
									
								
							| @@ -11,8 +11,8 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: gnome-shell\n" | "Project-Id-Version: gnome-shell\n" | ||||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||||
| "POT-Creation-Date: 2018-02-26 12:57+0000\n" | "POT-Creation-Date: 2018-04-13 19:54+0000\n" | ||||||
| "PO-Revision-Date: 2018-02-26 17:57+0100\n" | "PO-Revision-Date: 2018-04-24 17:32+0200\n" | ||||||
| "Last-Translator: Marek Černocký <marek@manet.cz>\n" | "Last-Translator: Marek Černocký <marek@manet.cz>\n" | ||||||
| "Language-Team: čeština <gnome-cs-list@gnome.org>\n" | "Language-Team: čeština <gnome-cs-list@gnome.org>\n" | ||||||
| "Language: cs\n" | "Language: cs\n" | ||||||
| @@ -332,7 +332,7 @@ msgstr "" | |||||||
| "Nastala chyba při načítání dialogového okna předvoleb pro rozšíření %s:" | "Nastala chyba při načítání dialogového okna předvoleb pro rozšíření %s:" | ||||||
|  |  | ||||||
| #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 | #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 | ||||||
| #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148 | #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 | ||||||
| #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 | #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 | ||||||
| #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 | #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 | ||||||
| msgid "Cancel" | msgid "Cancel" | ||||||
| @@ -667,12 +667,12 @@ msgstr "Přidat mezi oblíbené" | |||||||
| msgid "Show Details" | msgid "Show Details" | ||||||
| msgstr "Zobrazit podrobnosti" | msgstr "Zobrazit podrobnosti" | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:138 | #: js/ui/appFavorites.js:140 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been added to your favorites." | msgid "%s has been added to your favorites." | ||||||
| msgstr "%s byl přidán mezi oblíbené." | msgstr "%s byl přidán mezi oblíbené." | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:172 | #: js/ui/appFavorites.js:174 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been removed from your favorites." | msgid "%s has been removed from your favorites." | ||||||
| msgstr "%s byl odstraněn z oblíbených." | msgstr "%s byl odstraněn z oblíbených." | ||||||
| @@ -867,7 +867,7 @@ msgstr "Externí svazek odpojen" | |||||||
| msgid "Open with %s" | msgid "Open with %s" | ||||||
| msgstr "Otevřít pomocí %s" | msgstr "Otevřít pomocí %s" | ||||||
|  |  | ||||||
| #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 | #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 | ||||||
| msgid "Password:" | msgid "Password:" | ||||||
| msgstr "Heslo:" | msgstr "Heslo:" | ||||||
|  |  | ||||||
| @@ -955,15 +955,15 @@ msgstr "Pro připojení k „%s“ je vyžadováno heslo." | |||||||
| msgid "Network Manager" | msgid "Network Manager" | ||||||
| msgstr "Network Manager" | msgstr "Network Manager" | ||||||
|  |  | ||||||
| #: js/ui/components/polkitAgent.js:43 | #: js/ui/components/polkitAgent.js:48 | ||||||
| msgid "Authentication Required" | msgid "Authentication Required" | ||||||
| msgstr "Je vyžadováno ověření" | msgstr "Je vyžadováno ověření" | ||||||
|  |  | ||||||
| #: js/ui/components/polkitAgent.js:71 | #: js/ui/components/polkitAgent.js:76 | ||||||
| msgid "Administrator" | msgid "Administrator" | ||||||
| msgstr "Správce" | msgstr "Správce" | ||||||
|  |  | ||||||
| #: js/ui/components/polkitAgent.js:151 | #: js/ui/components/polkitAgent.js:156 | ||||||
| msgid "Authenticate" | msgid "Authenticate" | ||||||
| msgstr "Ověřit" | msgstr "Ověřit" | ||||||
|  |  | ||||||
| @@ -971,7 +971,7 @@ msgstr "Ověřit" | |||||||
| #. * requested authentication was not gained; this can happen | #. * requested authentication was not gained; this can happen | ||||||
| #. * because of an authentication error (like invalid password), | #. * because of an authentication error (like invalid password), | ||||||
| #. * for instance. | #. * for instance. | ||||||
| #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327 | #: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 | ||||||
| msgid "Sorry, that didn’t work. Please try again." | msgid "Sorry, that didn’t work. Please try again." | ||||||
| msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu." | msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu." | ||||||
|  |  | ||||||
| @@ -1021,7 +1021,7 @@ msgstr "Přidat světový čas…" | |||||||
| msgid "World Clocks" | msgid "World Clocks" | ||||||
| msgstr "Světové hodiny" | msgstr "Světové hodiny" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:225 | #: js/ui/dateMenu.js:227 | ||||||
| msgid "Weather" | msgid "Weather" | ||||||
| msgstr "Počasí" | msgstr "Počasí" | ||||||
|  |  | ||||||
| @@ -1029,7 +1029,7 @@ msgstr "Počasí" | |||||||
| #. libgweather for the possible condition strings. If at all | #. libgweather for the possible condition strings. If at all | ||||||
| #. possible, the sentence should match the grammatical case etc. of | #. possible, the sentence should match the grammatical case etc. of | ||||||
| #. the inserted conditions. | #. the inserted conditions. | ||||||
| #: js/ui/dateMenu.js:289 | #: js/ui/dateMenu.js:291 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s all day." | msgid "%s all day." | ||||||
| msgstr "%s celý den." | msgstr "%s celý den." | ||||||
| @@ -1038,7 +1038,7 @@ msgstr "%s celý den." | |||||||
| #. libgweather for the possible condition strings. If at all | #. libgweather for the possible condition strings. If at all | ||||||
| #. possible, the sentence should match the grammatical case etc. of | #. possible, the sentence should match the grammatical case etc. of | ||||||
| #. the inserted conditions. | #. the inserted conditions. | ||||||
| #: js/ui/dateMenu.js:295 | #: js/ui/dateMenu.js:297 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s, then %s later." | msgid "%s, then %s later." | ||||||
| msgstr "%s, později %s." | msgstr "%s, později %s." | ||||||
| @@ -1047,30 +1047,30 @@ msgstr "%s, později %s." | |||||||
| #. libgweather for the possible condition strings. If at all | #. libgweather for the possible condition strings. If at all | ||||||
| #. possible, the sentence should match the grammatical case etc. of | #. possible, the sentence should match the grammatical case etc. of | ||||||
| #. the inserted conditions. | #. the inserted conditions. | ||||||
| #: js/ui/dateMenu.js:301 | #: js/ui/dateMenu.js:303 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s, then %s, followed by %s later." | msgid "%s, then %s, followed by %s later." | ||||||
| msgstr "%s, pak %s a později %s." | msgstr "%s, pak %s a později %s." | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:312 | #: js/ui/dateMenu.js:314 | ||||||
| msgid "Select a location…" | msgid "Select a location…" | ||||||
| msgstr "Vybrat místo…" | msgstr "Vybrat místo…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:315 | #: js/ui/dateMenu.js:317 | ||||||
| msgid "Loading…" | msgid "Loading…" | ||||||
| msgstr "Načítá se…" | msgstr "Načítá se…" | ||||||
|  |  | ||||||
| #. Translators: %s is a temperature with unit, e.g. "23℃" | #. Translators: %s is a temperature with unit, e.g. "23℃" | ||||||
| #: js/ui/dateMenu.js:321 | #: js/ui/dateMenu.js:323 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "Feels like %s." | msgid "Feels like %s." | ||||||
| msgstr "Pocitově jako %s." | msgstr "Pocitově jako %s." | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:324 | #: js/ui/dateMenu.js:326 | ||||||
| msgid "Go online for weather information" | msgid "Go online for weather information" | ||||||
| msgstr "Připojit se kvůli informacím o počasí" | msgstr "Připojit se kvůli informacím o počasí" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:326 | #: js/ui/dateMenu.js:328 | ||||||
| msgid "Weather information is currently unavailable" | msgid "Weather information is currently unavailable" | ||||||
| msgstr "Informace o počasí nejsou nyní dostupné" | msgstr "Informace o počasí nejsou nyní dostupné" | ||||||
|  |  | ||||||
| @@ -1986,16 +1986,16 @@ msgstr "Uspat do paměti" | |||||||
| msgid "Power Off" | msgid "Power Off" | ||||||
| msgstr "Vypnout" | msgstr "Vypnout" | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:272 | #: js/ui/status/thunderbolt.js:294 | ||||||
| msgid "Thunderbolt" | msgid "Thunderbolt" | ||||||
| msgstr "Thunderbolt" | msgstr "Thunderbolt" | ||||||
|  |  | ||||||
| #. we are done | #. we are done | ||||||
| #: js/ui/status/thunderbolt.js:328 | #: js/ui/status/thunderbolt.js:350 | ||||||
| msgid "Unknown Thunderbolt device" | msgid "Unknown Thunderbolt device" | ||||||
| msgstr "Neznámé zařízení Thunderbolt" | msgstr "Neznámé zařízení Thunderbolt" | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:329 | #: js/ui/status/thunderbolt.js:351 | ||||||
| msgid "" | msgid "" | ||||||
| "New device has been detected while you were away. Please disconnect and " | "New device has been detected while you were away. Please disconnect and " | ||||||
| "reconnect the device to start using it." | "reconnect the device to start using it." | ||||||
| @@ -2003,13 +2003,13 @@ msgstr "" | |||||||
| "Zatímco jste byli pryč, bylo nalezeno nové zařízení. Odpojte jej prosím a " | "Zatímco jste byli pryč, bylo nalezeno nové zařízení. Odpojte jej prosím a " | ||||||
| "znovu připojte, abyste jej mohli používat." | "znovu připojte, abyste jej mohli používat." | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:334 | #: js/ui/status/thunderbolt.js:356 | ||||||
| msgid "Thunderbolt authorization error" | msgid "Thunderbolt authorization error" | ||||||
| msgstr "Chyba ověření Thunderbolt" | msgstr "Chyba ověření Thunderbolt" | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:335 | #: js/ui/status/thunderbolt.js:357 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "Could not authorize the thunderbolt device: %s" | msgid "Could not authorize the Thunderbolt device: %s" | ||||||
| msgstr "Nezdařilo se provést ověření zařízení Thunderbolt: %s" | msgstr "Nezdařilo se provést ověření zařízení Thunderbolt: %s" | ||||||
|  |  | ||||||
| #: js/ui/status/volume.js:128 | #: js/ui/status/volume.js:128 | ||||||
| @@ -2233,15 +2233,3 @@ msgstr[2] "%u vstupů" | |||||||
| #: subprojects/gvc/gvc-mixer-control.c:2738 | #: subprojects/gvc/gvc-mixer-control.c:2738 | ||||||
| msgid "System Sounds" | msgid "System Sounds" | ||||||
| msgstr "Systémové zvuky" | msgstr "Systémové zvuky" | ||||||
|  |  | ||||||
| #~ msgctxt "search-result" |  | ||||||
| #~ msgid "Power off" |  | ||||||
| #~ msgstr "Vypnout" |  | ||||||
|  |  | ||||||
| #~ msgctxt "search-result" |  | ||||||
| #~ msgid "Log out" |  | ||||||
| #~ msgstr "Odhlásit se" |  | ||||||
|  |  | ||||||
| #~ msgctxt "search-result" |  | ||||||
| #~ msgid "Switch user" |  | ||||||
| #~ msgstr "Přepnout uživatele" |  | ||||||
|   | |||||||
							
								
								
									
										195
									
								
								po/es.po
									
									
									
									
									
								
							
							
						
						
									
										195
									
								
								po/es.po
									
									
									
									
									
								
							| @@ -9,8 +9,8 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: gnome-shell.master\n" | "Project-Id-Version: gnome-shell.master\n" | ||||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||||
| "POT-Creation-Date: 2018-02-22 09:24+0000\n" | "POT-Creation-Date: 2018-07-24 18:34+0000\n" | ||||||
| "PO-Revision-Date: 2018-02-23 08:26+0100\n" | "PO-Revision-Date: 2018-07-27 13:15+0200\n" | ||||||
| "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" | "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" | ||||||
| "Language-Team: es <gnome-es-list@gnome.org>\n" | "Language-Team: es <gnome-es-list@gnome.org>\n" | ||||||
| "Language: es\n" | "Language: es\n" | ||||||
| @@ -18,7 +18,7 @@ msgstr "" | |||||||
| "Content-Type: text/plain; charset=UTF-8\n" | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||||
| "X-Generator: Gtranslator 2.91.6\n" | "X-Generator: Gtranslator 2.91.7\n" | ||||||
|  |  | ||||||
| #: data/50-gnome-shell-system.xml:6 | #: data/50-gnome-shell-system.xml:6 | ||||||
| msgid "System" | msgid "System" | ||||||
| @@ -346,7 +346,7 @@ msgid "There was an error loading the preferences dialog for %s:" | |||||||
| msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:" | msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:" | ||||||
|  |  | ||||||
| #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 | #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 | ||||||
| #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148 | #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 | ||||||
| #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 | #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 | ||||||
| #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 | #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 | ||||||
| msgid "Cancel" | msgid "Cancel" | ||||||
| @@ -366,20 +366,20 @@ msgctxt "button" | |||||||
| msgid "Sign In" | msgid "Sign In" | ||||||
| msgstr "Iniciar sesión" | msgstr "Iniciar sesión" | ||||||
|  |  | ||||||
| #: js/gdm/loginDialog.js:315 | #: js/gdm/loginDialog.js:319 | ||||||
| msgid "Choose Session" | msgid "Choose Session" | ||||||
| msgstr "Elegir sesión" | msgstr "Elegir sesión" | ||||||
|  |  | ||||||
| #. translators: this message is shown below the user list on the | #. translators: this message is shown below the user list on the | ||||||
| #. login screen. It can be activated to reveal an entry for | #. login screen. It can be activated to reveal an entry for | ||||||
| #. manually entering the username. | #. manually entering the username. | ||||||
| #: js/gdm/loginDialog.js:458 | #: js/gdm/loginDialog.js:462 | ||||||
| msgid "Not listed?" | msgid "Not listed?" | ||||||
| msgstr "¿No está en la lista?" | msgstr "¿No está en la lista?" | ||||||
|  |  | ||||||
| #. 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 | ||||||
| #: js/gdm/loginDialog.js:887 | #: js/gdm/loginDialog.js:891 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "(e.g., user or %s)" | msgid "(e.g., user or %s)" | ||||||
| msgstr "(ej., usuario o %s)" | msgstr "(ej., usuario o %s)" | ||||||
| @@ -387,12 +387,12 @@ msgstr "(ej., usuario o %s)" | |||||||
| #. TTLS and PEAP are actually much more complicated, but this complication | #. TTLS and PEAP are actually much more complicated, but this complication | ||||||
| #. is not visible here since we only care about phase2 authentication | #. is not visible here since we only care about phase2 authentication | ||||||
| #. (and don't even care of which one) | #. (and don't even care of which one) | ||||||
| #: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243 | #: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 | ||||||
| #: js/ui/components/networkAgent.js:261 | #: js/ui/components/networkAgent.js:261 | ||||||
| msgid "Username: " | msgid "Username: " | ||||||
| msgstr "Nombre de usuario:" | msgstr "Nombre de usuario:" | ||||||
|  |  | ||||||
| #: js/gdm/loginDialog.js:1228 | #: js/gdm/loginDialog.js:1234 | ||||||
| msgid "Login Window" | msgid "Login Window" | ||||||
| msgstr "Ventana de inicio de sesión" | msgstr "Ventana de inicio de sesión" | ||||||
|  |  | ||||||
| @@ -405,7 +405,7 @@ msgstr "Error de autenticación" | |||||||
| #. as a cue to display our own message. | #. as a cue to display our own message. | ||||||
| #. Translators: this message is shown below the password entry field | #. Translators: this message is shown below the password entry field | ||||||
| #. to indicate the user can swipe their finger instead | #. to indicate the user can swipe their finger instead | ||||||
| #: js/gdm/util.js:482 | #: js/gdm/util.js:485 | ||||||
| msgid "(or swipe finger)" | msgid "(or swipe finger)" | ||||||
| msgstr "(o pase el dedo)" | msgstr "(o pase el dedo)" | ||||||
|  |  | ||||||
| @@ -645,32 +645,32 @@ msgstr "Frecuentes" | |||||||
| msgid "All" | msgid "All" | ||||||
| msgstr "Todas" | msgstr "Todas" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1886 | #: js/ui/appDisplay.js:1890 | ||||||
| msgid "New Window" | msgid "New Window" | ||||||
| msgstr "Ventana nueva" | msgstr "Ventana nueva" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1900 | #: js/ui/appDisplay.js:1904 | ||||||
| msgid "Launch using Dedicated Graphics Card" | msgid "Launch using Dedicated Graphics Card" | ||||||
| msgstr "Lanzar usando la tarjeta gráfica dedicada" | msgstr "Lanzar usando la tarjeta gráfica dedicada" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1927 js/ui/dash.js:285 | #: js/ui/appDisplay.js:1931 js/ui/dash.js:285 | ||||||
| msgid "Remove from Favorites" | msgid "Remove from Favorites" | ||||||
| msgstr "Quitar de los favoritos" | msgstr "Quitar de los favoritos" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1933 | #: js/ui/appDisplay.js:1937 | ||||||
| msgid "Add to Favorites" | msgid "Add to Favorites" | ||||||
| msgstr "Añadir a los favoritos" | msgstr "Añadir a los favoritos" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1943 | #: js/ui/appDisplay.js:1947 | ||||||
| msgid "Show Details" | msgid "Show Details" | ||||||
| msgstr "Mostrar detalles" | msgstr "Mostrar detalles" | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:138 | #: js/ui/appFavorites.js:140 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been added to your favorites." | msgid "%s has been added to your favorites." | ||||||
| msgstr "Se ha añadido %s a sus favoritos." | msgstr "Se ha añadido %s a sus favoritos." | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:172 | #: js/ui/appFavorites.js:174 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been removed from your favorites." | msgid "%s has been removed from your favorites." | ||||||
| msgstr "Se ha quitado %s de sus favoritos." | msgstr "Se ha quitado %s de sus favoritos." | ||||||
| @@ -808,35 +808,35 @@ msgctxt "event list time" | |||||||
| msgid "All Day" | msgid "All Day" | ||||||
| msgstr "Todo el día" | msgstr "Todo el día" | ||||||
|  |  | ||||||
| #: js/ui/calendar.js:864 | #: js/ui/calendar.js:866 | ||||||
| msgctxt "calendar heading" | msgctxt "calendar heading" | ||||||
| msgid "%A, %B %d" | msgid "%A, %B %d" | ||||||
| msgstr "%A, %d de %B" | msgstr "%A, %d de %B" | ||||||
|  |  | ||||||
| #: js/ui/calendar.js:868 | #: js/ui/calendar.js:870 | ||||||
| msgctxt "calendar heading" | msgctxt "calendar heading" | ||||||
| msgid "%A, %B %d, %Y" | msgid "%A, %B %d, %Y" | ||||||
| msgstr "%A, %d de %B de %Y" | msgstr "%A, %d de %B de %Y" | ||||||
|  |  | ||||||
| #: js/ui/calendar.js:1086 | #: js/ui/calendar.js:1100 | ||||||
| msgid "No Notifications" | msgid "No Notifications" | ||||||
| msgstr "No hay notificaciones" | msgstr "No hay notificaciones" | ||||||
|  |  | ||||||
| #: js/ui/calendar.js:1089 | #: js/ui/calendar.js:1103 | ||||||
| msgid "No Events" | msgid "No Events" | ||||||
| msgstr "No hay eventos" | msgstr "No hay eventos" | ||||||
|  |  | ||||||
| #: js/ui/calendar.js:1117 | #: js/ui/calendar.js:1131 | ||||||
| msgid "Clear All" | msgid "Clear All" | ||||||
| msgstr "Limpiar todo" | msgstr "Limpiar todo" | ||||||
|  |  | ||||||
| #. Translators: %s is an application name | #. Translators: %s is an application name | ||||||
| #: js/ui/closeDialog.js:44 | #: js/ui/closeDialog.js:47 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "“%s” is not responding." | msgid "“%s” is not responding." | ||||||
| msgstr "«%s» no responde." | msgstr "«%s» no responde." | ||||||
|  |  | ||||||
| #: js/ui/closeDialog.js:45 | #: js/ui/closeDialog.js:48 | ||||||
| msgid "" | msgid "" | ||||||
| "You may choose to wait a short while for it to continue or force the " | "You may choose to wait a short while for it to continue or force the " | ||||||
| "application to quit entirely." | "application to quit entirely." | ||||||
| @@ -844,11 +844,11 @@ msgstr "" | |||||||
| "Puede elegir esperar un momento para que continúe o forzar a la aplicación a " | "Puede elegir esperar un momento para que continúe o forzar a la aplicación a " | ||||||
| "terminar." | "terminar." | ||||||
|  |  | ||||||
| #: js/ui/closeDialog.js:61 | #: js/ui/closeDialog.js:64 | ||||||
| msgid "Force Quit" | msgid "Force Quit" | ||||||
| msgstr "Forzar la salida" | msgstr "Forzar la salida" | ||||||
|  |  | ||||||
| #: js/ui/closeDialog.js:64 | #: js/ui/closeDialog.js:67 | ||||||
| msgid "Wait" | msgid "Wait" | ||||||
| msgstr "Esperar" | msgstr "Esperar" | ||||||
|  |  | ||||||
| @@ -865,7 +865,7 @@ msgstr "Dispositivo externo desconectado" | |||||||
| msgid "Open with %s" | msgid "Open with %s" | ||||||
| msgstr "Abrir con %s" | msgstr "Abrir con %s" | ||||||
|  |  | ||||||
| #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 | #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 | ||||||
| msgid "Password:" | msgid "Password:" | ||||||
| msgstr "Contraseña:" | msgstr "Contraseña:" | ||||||
|  |  | ||||||
| @@ -902,11 +902,11 @@ msgstr "Contraseña de la clave privada:" | |||||||
| msgid "Service: " | msgid "Service: " | ||||||
| msgstr "Servicio:" | msgstr "Servicio:" | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659 | #: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:664 | ||||||
| msgid "Authentication required by wireless network" | msgid "Authentication required by wireless network" | ||||||
| msgstr "La red inalámbrica requiere autenticación" | msgstr "La red inalámbrica requiere autenticación" | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660 | #: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:665 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "" | msgid "" | ||||||
| "Passwords or encryption keys are required to access the wireless network " | "Passwords or encryption keys are required to access the wireless network " | ||||||
| @@ -915,7 +915,7 @@ msgstr "" | |||||||
| "Se necesitan contraseñas o claves de cifrado para acceder a la red " | "Se necesitan contraseñas o claves de cifrado para acceder a la red " | ||||||
| "inalámbrica «%s»." | "inalámbrica «%s»." | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663 | #: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:668 | ||||||
| msgid "Wired 802.1X authentication" | msgid "Wired 802.1X authentication" | ||||||
| msgstr "Autenticación 802.1X cableada" | msgstr "Autenticación 802.1X cableada" | ||||||
|  |  | ||||||
| @@ -923,15 +923,15 @@ msgstr "Autenticación 802.1X cableada" | |||||||
| msgid "Network name: " | msgid "Network name: " | ||||||
| msgstr "Nombre de la red: " | msgstr "Nombre de la red: " | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667 | #: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:672 | ||||||
| msgid "DSL authentication" | msgid "DSL authentication" | ||||||
| msgstr "Autenticación DSL" | msgstr "Autenticación DSL" | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673 | #: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:678 | ||||||
| msgid "PIN code required" | msgid "PIN code required" | ||||||
| msgstr "Código PIN requerido" | msgstr "Código PIN requerido" | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674 | #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:679 | ||||||
| msgid "PIN code is needed for the mobile broadband device" | msgid "PIN code is needed for the mobile broadband device" | ||||||
| msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil" | msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil" | ||||||
|  |  | ||||||
| @@ -939,29 +939,29 @@ msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil" | |||||||
| msgid "PIN: " | msgid "PIN: " | ||||||
| msgstr "PIN: " | msgstr "PIN: " | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680 | #: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:685 | ||||||
| msgid "Mobile broadband network password" | msgid "Mobile broadband network password" | ||||||
| msgstr "Contraseña de la red de banda ancha móvil" | msgstr "Contraseña de la red de banda ancha móvil" | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664 | #: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:669 | ||||||
| #: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681 | #: js/ui/components/networkAgent.js:673 js/ui/components/networkAgent.js:686 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "A password is required to connect to “%s”." | msgid "A password is required to connect to “%s”." | ||||||
| msgstr "Se requiere una contraseña para conectarse a «%s»." | msgstr "Se requiere una contraseña para conectarse a «%s»." | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1691 | #: js/ui/components/networkAgent.js:653 js/ui/status/network.js:1704 | ||||||
| msgid "Network Manager" | msgid "Network Manager" | ||||||
| msgstr "Gestor de la red" | msgstr "Gestor de la red" | ||||||
|  |  | ||||||
| #: js/ui/components/polkitAgent.js:43 | #: js/ui/components/polkitAgent.js:48 | ||||||
| msgid "Authentication Required" | msgid "Authentication Required" | ||||||
| msgstr "Se necesita autenticación" | msgstr "Se necesita autenticación" | ||||||
|  |  | ||||||
| #: js/ui/components/polkitAgent.js:71 | #: js/ui/components/polkitAgent.js:76 | ||||||
| msgid "Administrator" | msgid "Administrator" | ||||||
| msgstr "Administrador" | msgstr "Administrador" | ||||||
|  |  | ||||||
| #: js/ui/components/polkitAgent.js:151 | #: js/ui/components/polkitAgent.js:156 | ||||||
| msgid "Authenticate" | msgid "Authenticate" | ||||||
| msgstr "Autenticar" | msgstr "Autenticar" | ||||||
|  |  | ||||||
| @@ -969,7 +969,7 @@ msgstr "Autenticar" | |||||||
| #. * requested authentication was not gained; this can happen | #. * requested authentication was not gained; this can happen | ||||||
| #. * because of an authentication error (like invalid password), | #. * because of an authentication error (like invalid password), | ||||||
| #. * for instance. | #. * for instance. | ||||||
| #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327 | #: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:327 | ||||||
| msgid "Sorry, that didn’t work. Please try again." | msgid "Sorry, that didn’t work. Please try again." | ||||||
| msgstr "Eso no ha funcionado. Inténtelo de nuevo." | msgstr "Eso no ha funcionado. Inténtelo de nuevo." | ||||||
|  |  | ||||||
| @@ -1017,7 +1017,7 @@ msgstr "Añadir relojes del mundo…" | |||||||
| msgid "World Clocks" | msgid "World Clocks" | ||||||
| msgstr "Relojes del mundo" | msgstr "Relojes del mundo" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:225 | #: js/ui/dateMenu.js:227 | ||||||
| msgid "Weather" | msgid "Weather" | ||||||
| msgstr "Meteorología" | msgstr "Meteorología" | ||||||
|  |  | ||||||
| @@ -1025,7 +1025,7 @@ msgstr "Meteorología" | |||||||
| #. libgweather for the possible condition strings. If at all | #. libgweather for the possible condition strings. If at all | ||||||
| #. possible, the sentence should match the grammatical case etc. of | #. possible, the sentence should match the grammatical case etc. of | ||||||
| #. the inserted conditions. | #. the inserted conditions. | ||||||
| #: js/ui/dateMenu.js:289 | #: js/ui/dateMenu.js:291 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s all day." | msgid "%s all day." | ||||||
| msgstr "%s todo el día." | msgstr "%s todo el día." | ||||||
| @@ -1034,7 +1034,7 @@ msgstr "%s todo el día." | |||||||
| #. libgweather for the possible condition strings. If at all | #. libgweather for the possible condition strings. If at all | ||||||
| #. possible, the sentence should match the grammatical case etc. of | #. possible, the sentence should match the grammatical case etc. of | ||||||
| #. the inserted conditions. | #. the inserted conditions. | ||||||
| #: js/ui/dateMenu.js:295 | #: js/ui/dateMenu.js:297 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s, then %s later." | msgid "%s, then %s later." | ||||||
| msgstr "%s, luego %s." | msgstr "%s, luego %s." | ||||||
| @@ -1043,30 +1043,30 @@ msgstr "%s, luego %s." | |||||||
| #. libgweather for the possible condition strings. If at all | #. libgweather for the possible condition strings. If at all | ||||||
| #. possible, the sentence should match the grammatical case etc. of | #. possible, the sentence should match the grammatical case etc. of | ||||||
| #. the inserted conditions. | #. the inserted conditions. | ||||||
| #: js/ui/dateMenu.js:301 | #: js/ui/dateMenu.js:303 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s, then %s, followed by %s later." | msgid "%s, then %s, followed by %s later." | ||||||
| msgstr "%s, luego %s seguido de %s." | msgstr "%s, luego %s seguido de %s." | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:312 | #: js/ui/dateMenu.js:314 | ||||||
| msgid "Select a location…" | msgid "Select a location…" | ||||||
| msgstr "Seleccionar ubicación…" | msgstr "Seleccionar ubicación…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:315 | #: js/ui/dateMenu.js:317 | ||||||
| msgid "Loading…" | msgid "Loading…" | ||||||
| msgstr "Cargando…" | msgstr "Cargando…" | ||||||
|  |  | ||||||
| #. Translators: %s is a temperature with unit, e.g. "23℃" | #. Translators: %s is a temperature with unit, e.g. "23℃" | ||||||
| #: js/ui/dateMenu.js:321 | #: js/ui/dateMenu.js:323 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "Feels like %s." | msgid "Feels like %s." | ||||||
| msgstr "Sensación térmica de %s." | msgstr "Sensación térmica de %s." | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:324 | #: js/ui/dateMenu.js:326 | ||||||
| msgid "Go online for weather information" | msgid "Go online for weather information" | ||||||
| msgstr "Conectarse para obtener la información meteorológica" | msgstr "Conectarse para obtener la información meteorológica" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:326 | #: js/ui/dateMenu.js:328 | ||||||
| msgid "Weather information is currently unavailable" | msgid "Weather information is currently unavailable" | ||||||
| msgstr "La información meteorológica no está disponible actualmente." | msgstr "La información meteorológica no está disponible actualmente." | ||||||
|  |  | ||||||
| @@ -1301,13 +1301,13 @@ msgid "Leave On" | |||||||
| msgstr "Dejar activada" | msgstr "Dejar activada" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 | #: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 | ||||||
| #: js/ui/status/network.js:1281 | #: js/ui/status/network.js:1294 | ||||||
| msgid "Turn On" | msgid "Turn On" | ||||||
| msgstr "Encender" | msgstr "Encender" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143 | #: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143 | ||||||
| #: js/ui/status/network.js:154 js/ui/status/network.js:337 | #: js/ui/status/network.js:154 js/ui/status/network.js:337 | ||||||
| #: js/ui/status/network.js:1281 js/ui/status/network.js:1396 | #: js/ui/status/network.js:1294 js/ui/status/network.js:1409 | ||||||
| #: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90 | #: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90 | ||||||
| #: js/ui/status/rfkill.js:117 | #: js/ui/status/rfkill.js:117 | ||||||
| msgid "Turn Off" | msgid "Turn Off" | ||||||
| @@ -1369,7 +1369,7 @@ msgstr "Ver fuente" | |||||||
| msgid "Web Page" | msgid "Web Page" | ||||||
| msgstr "Página web" | msgstr "Página web" | ||||||
|  |  | ||||||
| #: js/ui/messageTray.js:1493 | #: js/ui/messageTray.js:1495 | ||||||
| msgid "System Information" | msgid "System Information" | ||||||
| msgstr "Información del sistema" | msgstr "Información del sistema" | ||||||
|  |  | ||||||
| @@ -1443,22 +1443,22 @@ msgstr "Pulse Esc para salir" | |||||||
| msgid "Press any key to exit" | msgid "Press any key to exit" | ||||||
| msgstr "Pulse cualquier tecla para salir" | msgstr "Pulse cualquier tecla para salir" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:355 | #: js/ui/panel.js:356 | ||||||
| msgid "Quit" | msgid "Quit" | ||||||
| msgstr "Salir" | msgstr "Salir" | ||||||
|  |  | ||||||
| #. Translators: If there is no suitable word for "Activities" | #. Translators: If there is no suitable word for "Activities" | ||||||
| #. in your language, you can use the word for "Overview". | #. in your language, you can use the word for "Overview". | ||||||
| #: js/ui/panel.js:411 | #: js/ui/panel.js:412 | ||||||
| msgid "Activities" | msgid "Activities" | ||||||
| msgstr "Actividades" | msgstr "Actividades" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:692 | #: js/ui/panel.js:693 | ||||||
| msgctxt "System menu in the top bar" | msgctxt "System menu in the top bar" | ||||||
| msgid "System" | msgid "System" | ||||||
| msgstr "Sistema" | msgstr "Sistema" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:811 | #: js/ui/panel.js:816 | ||||||
| msgid "Top Bar" | msgid "Top Bar" | ||||||
| msgstr "Barra superior" | msgstr "Barra superior" | ||||||
|  |  | ||||||
| @@ -1467,7 +1467,7 @@ msgstr "Barra superior" | |||||||
| #. "ON" and "OFF") or "toggle-switch-intl" (for toggle | #. "ON" and "OFF") or "toggle-switch-intl" (for toggle | ||||||
| #. switches containing "◯" and "|"). Other values will | #. switches containing "◯" and "|"). Other values will | ||||||
| #. simply result in invisible toggle switches. | #. simply result in invisible toggle switches. | ||||||
| #: js/ui/popupMenu.js:291 | #: js/ui/popupMenu.js:300 | ||||||
| msgid "toggle-switch-us" | msgid "toggle-switch-us" | ||||||
| msgstr "toggle-switch-intl" | msgstr "toggle-switch-intl" | ||||||
|  |  | ||||||
| @@ -1475,15 +1475,15 @@ msgstr "toggle-switch-intl" | |||||||
| msgid "Enter a Command" | msgid "Enter a Command" | ||||||
| msgstr "Introducir un comando" | msgstr "Introducir un comando" | ||||||
|  |  | ||||||
| #: js/ui/runDialog.js:110 js/ui/windowMenu.js:175 | #: js/ui/runDialog.js:110 js/ui/windowMenu.js:174 | ||||||
| msgid "Close" | msgid "Close" | ||||||
| msgstr "Cerrar" | msgstr "Cerrar" | ||||||
|  |  | ||||||
| #: js/ui/runDialog.js:273 | #: js/ui/runDialog.js:274 | ||||||
| msgid "Restart is not available on Wayland" | msgid "Restart is not available on Wayland" | ||||||
| msgstr "Reiniciar si no está disponible en Wayland" | msgstr "Reiniciar si no está disponible en Wayland" | ||||||
|  |  | ||||||
| #: js/ui/runDialog.js:278 | #: js/ui/runDialog.js:279 | ||||||
| msgid "Restarting…" | msgid "Restarting…" | ||||||
| msgstr "Reiniciando…" | msgstr "Reiniciando…" | ||||||
|  |  | ||||||
| @@ -1690,7 +1690,7 @@ msgid "<unknown>" | |||||||
| msgstr "<desconocido>" | msgstr "<desconocido>" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:441 js/ui/status/network.js:1310 | #: js/ui/status/network.js:441 js/ui/status/network.js:1323 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Off" | msgid "%s Off" | ||||||
| msgstr "%s apagada" | msgstr "%s apagada" | ||||||
| @@ -1716,7 +1716,7 @@ msgid "%s Disconnecting" | |||||||
| msgstr "Desconectando %s" | msgstr "Desconectando %s" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:459 js/ui/status/network.js:1302 | #: js/ui/status/network.js:459 js/ui/status/network.js:1315 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Connecting" | msgid "%s Connecting" | ||||||
| msgstr "Conectando %s" | msgstr "Conectando %s" | ||||||
| @@ -1756,7 +1756,7 @@ msgid "Mobile Broadband Settings" | |||||||
| msgstr "Configuración de banda ancha móvil" | msgstr "Configuración de banda ancha móvil" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:578 js/ui/status/network.js:1307 | #: js/ui/status/network.js:578 js/ui/status/network.js:1320 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Hardware Disabled" | msgid "%s Hardware Disabled" | ||||||
| msgstr "Hardware %s desactivado" | msgstr "Hardware %s desactivado" | ||||||
| @@ -1812,81 +1812,81 @@ msgstr "No hay redes" | |||||||
| msgid "Use hardware switch to turn off" | msgid "Use hardware switch to turn off" | ||||||
| msgstr "Usar el interruptor hardware para apagar" | msgstr "Usar el interruptor hardware para apagar" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1173 | #: js/ui/status/network.js:1186 | ||||||
| msgid "Select Network" | msgid "Select Network" | ||||||
| msgstr "Seleccionar red" | msgstr "Seleccionar red" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1179 | #: js/ui/status/network.js:1192 | ||||||
| msgid "Wi-Fi Settings" | msgid "Wi-Fi Settings" | ||||||
| msgstr "Configuración de Wi-Fi" | msgstr "Configuración de Wi-Fi" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1298 | #: js/ui/status/network.js:1311 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Hotspot Active" | msgid "%s Hotspot Active" | ||||||
| msgstr "Punto de acceso %s activo" | msgstr "Punto de acceso %s activo" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1313 | #: js/ui/status/network.js:1326 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Not Connected" | msgid "%s Not Connected" | ||||||
| msgstr "%s no conectado" | msgstr "%s no conectado" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1413 | #: js/ui/status/network.js:1426 | ||||||
| msgid "connecting…" | msgid "connecting…" | ||||||
| msgstr "conectando…" | msgstr "conectando…" | ||||||
|  |  | ||||||
| #. Translators: this is for network connections that require some kind of key or password | #. Translators: this is for network connections that require some kind of key or password | ||||||
| #: js/ui/status/network.js:1416 | #: js/ui/status/network.js:1429 | ||||||
| msgid "authentication required" | msgid "authentication required" | ||||||
| msgstr "se necesita autenticación" | msgstr "se necesita autenticación" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1418 | #: js/ui/status/network.js:1431 | ||||||
| msgid "connection failed" | msgid "connection failed" | ||||||
| msgstr "falló la conexión" | msgstr "falló la conexión" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1472 | #: js/ui/status/network.js:1485 | ||||||
| msgid "VPN Settings" | msgid "VPN Settings" | ||||||
| msgstr "Configuración de VPN" | msgstr "Configuración de VPN" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1485 | #: js/ui/status/network.js:1498 | ||||||
| msgid "VPN" | msgid "VPN" | ||||||
| msgstr "VPN" | msgstr "VPN" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1495 | #: js/ui/status/network.js:1508 | ||||||
| msgid "VPN Off" | msgid "VPN Off" | ||||||
| msgstr "VPN apagada" | msgstr "VPN apagada" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1559 js/ui/status/rfkill.js:93 | #: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 | ||||||
| msgid "Network Settings" | msgid "Network Settings" | ||||||
| msgstr "Configuración de la red" | msgstr "Configuración de la red" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1588 | #: js/ui/status/network.js:1601 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wired Connection" | msgid "%s Wired Connection" | ||||||
| msgid_plural "%s Wired Connections" | msgid_plural "%s Wired Connections" | ||||||
| msgstr[0] "%s conexión cableada" | msgstr[0] "%s conexión cableada" | ||||||
| msgstr[1] "%s conexiones cableadas" | msgstr[1] "%s conexiones cableadas" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1592 | #: js/ui/status/network.js:1605 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wi-Fi Connection" | msgid "%s Wi-Fi Connection" | ||||||
| msgid_plural "%s Wi-Fi Connections" | msgid_plural "%s Wi-Fi Connections" | ||||||
| msgstr[0] "%s conexión inalámbrica" | msgstr[0] "%s conexión inalámbrica" | ||||||
| msgstr[1] "%s conexiones inalámbricas" | msgstr[1] "%s conexiones inalámbricas" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1596 | #: js/ui/status/network.js:1609 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Modem Connection" | msgid "%s Modem Connection" | ||||||
| msgid_plural "%s Modem Connections" | msgid_plural "%s Modem Connections" | ||||||
| msgstr[0] "%s conexión por módem" | msgstr[0] "%s conexión por módem" | ||||||
| msgstr[1] "%s conexiones por módem" | msgstr[1] "%s conexiones por módem" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1728 | #: js/ui/status/network.js:1741 | ||||||
| msgid "Connection failed" | msgid "Connection failed" | ||||||
| msgstr "Falló la conexión" | msgstr "Falló la conexión" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1729 | #: js/ui/status/network.js:1742 | ||||||
| msgid "Activation of network connection failed" | msgid "Activation of network connection failed" | ||||||
| msgstr "Falló la activación de la conexión de red" | msgstr "Falló la activación de la conexión de red" | ||||||
|  |  | ||||||
| @@ -1937,6 +1937,15 @@ msgstr "%d∶%02d para la carga completa (%d %%)" | |||||||
| msgid "%d %%" | msgid "%d %%" | ||||||
| msgstr "%d %%" | msgstr "%d %%" | ||||||
|  |  | ||||||
|  | #: js/ui/status/remoteAccess.js:45 | ||||||
|  | msgid "Screen is Being Shared" | ||||||
|  | msgstr "Se está compartiendo la pantalla" | ||||||
|  |  | ||||||
|  | #: js/ui/status/remoteAccess.js:47 | ||||||
|  | #| msgid "Turn Off" | ||||||
|  | msgid "Turn off" | ||||||
|  | msgstr "Apagar" | ||||||
|  |  | ||||||
| #. The menu only appears when airplane mode is on, so just | #. The menu only appears when airplane mode is on, so just | ||||||
| #. statically build it as if it was on, rather than dynamically | #. statically build it as if it was on, rather than dynamically | ||||||
| #. changing the menu contents. | #. changing the menu contents. | ||||||
| @@ -1968,16 +1977,16 @@ msgstr "Suspender" | |||||||
| msgid "Power Off" | msgid "Power Off" | ||||||
| msgstr "Apagar" | msgstr "Apagar" | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:272 | #: js/ui/status/thunderbolt.js:298 | ||||||
| msgid "Thunderbolt" | msgid "Thunderbolt" | ||||||
| msgstr "Thunderbolt" | msgstr "Thunderbolt" | ||||||
|  |  | ||||||
| #. we are done | #. we are done | ||||||
| #: js/ui/status/thunderbolt.js:328 | #: js/ui/status/thunderbolt.js:354 | ||||||
| msgid "Unknown Thunderbolt device" | msgid "Unknown Thunderbolt device" | ||||||
| msgstr "Dispositivo Thunderbolt desconocido" | msgstr "Dispositivo Thunderbolt desconocido" | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:329 | #: js/ui/status/thunderbolt.js:355 | ||||||
| msgid "" | msgid "" | ||||||
| "New device has been detected while you were away. Please disconnect and " | "New device has been detected while you were away. Please disconnect and " | ||||||
| "reconnect the device to start using it." | "reconnect the device to start using it." | ||||||
| @@ -1985,13 +1994,13 @@ msgstr "" | |||||||
| "Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y " | "Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y " | ||||||
| "vuélvalo a conectar para empezar a usarlo." | "vuélvalo a conectar para empezar a usarlo." | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:334 | #: js/ui/status/thunderbolt.js:360 | ||||||
| msgid "Thunderbolt authorization error" | msgid "Thunderbolt authorization error" | ||||||
| msgstr "Error de autorización de Thunderbolt" | msgstr "Error de autorización de Thunderbolt" | ||||||
|  |  | ||||||
| #: js/ui/status/thunderbolt.js:335 | #: js/ui/status/thunderbolt.js:361 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "Could not authorize the thunderbolt device: %s" | msgid "Could not authorize the Thunderbolt device: %s" | ||||||
| msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s" | msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s" | ||||||
|  |  | ||||||
| #: js/ui/status/volume.js:128 | #: js/ui/status/volume.js:128 | ||||||
| @@ -2075,7 +2084,7 @@ msgstr[1] "La configuración se revertirá en %d segundos" | |||||||
|  |  | ||||||
| #. Translators: This represents the size of a window. The first number is | #. Translators: This represents the size of a window. The first number is | ||||||
| #. * the width of the window and the second is the height. | #. * the width of the window and the second is the height. | ||||||
| #: js/ui/windowManager.js:660 | #: js/ui/windowManager.js:668 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d × %d" | msgid "%d × %d" | ||||||
| msgstr "%d × %d" | msgstr "%d × %d" | ||||||
| @@ -2128,19 +2137,19 @@ msgstr "Subir a un área de trabajo" | |||||||
| msgid "Move to Workspace Down" | msgid "Move to Workspace Down" | ||||||
| msgstr "Bajar a un área de trabajo" | msgstr "Bajar a un área de trabajo" | ||||||
|  |  | ||||||
| #: js/ui/windowMenu.js:140 | #: js/ui/windowMenu.js:139 | ||||||
| msgid "Move to Monitor Up" | msgid "Move to Monitor Up" | ||||||
| msgstr "Mover a la pantalla de arriba" | msgstr "Mover a la pantalla de arriba" | ||||||
|  |  | ||||||
| #: js/ui/windowMenu.js:149 | #: js/ui/windowMenu.js:148 | ||||||
| msgid "Move to Monitor Down" | msgid "Move to Monitor Down" | ||||||
| msgstr "Mover a la pantalla de abajo" | msgstr "Mover a la pantalla de abajo" | ||||||
|  |  | ||||||
| #: js/ui/windowMenu.js:158 | #: js/ui/windowMenu.js:157 | ||||||
| msgid "Move to Monitor Left" | msgid "Move to Monitor Left" | ||||||
| msgstr "Mover a la pantalla de la izquierda" | msgstr "Mover a la pantalla de la izquierda" | ||||||
|  |  | ||||||
| #: js/ui/windowMenu.js:167 | #: js/ui/windowMenu.js:166 | ||||||
| msgid "Move to Monitor Right" | msgid "Move to Monitor Right" | ||||||
| msgstr "Mover a la pantalla de la derecha" | msgstr "Mover a la pantalla de la derecha" | ||||||
|  |  | ||||||
| @@ -2171,12 +2180,12 @@ msgstr "" | |||||||
| msgid "List possible modes" | msgid "List possible modes" | ||||||
| msgstr "Listar los modos posibles" | msgstr "Listar los modos posibles" | ||||||
|  |  | ||||||
| #: src/shell-app.c:270 | #: src/shell-app.c:272 | ||||||
| msgctxt "program" | msgctxt "program" | ||||||
| msgid "Unknown" | msgid "Unknown" | ||||||
| msgstr "Desconocido" | msgstr "Desconocido" | ||||||
|  |  | ||||||
| #: src/shell-app.c:511 | #: src/shell-app.c:523 | ||||||
| #, c-format | #, c-format | ||||||
| msgid "Failed to launch “%s”" | msgid "Failed to launch “%s”" | ||||||
| msgstr "Falló al lanzar «%s»" | msgstr "Falló al lanzar «%s»" | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user