Compare commits
8 Commits
wip/rtcm/m
...
screen-shi
Author | SHA1 | Date | |
---|---|---|---|
6e448a2711 | |||
1d484e2278 | |||
0b7ca098ad | |||
5cb9aa9cf3 | |||
0171e561f2 | |||
82f7431a28 | |||
29958df7e7 | |||
2f990346df |
22
.gitignore
vendored
@ -16,21 +16,15 @@ config.log
|
|||||||
config.status
|
config.status
|
||||||
config
|
config
|
||||||
configure
|
configure
|
||||||
data/50-gnome-shell-*.xml
|
data/gnome-shell.desktop
|
||||||
data/org.gnome.Shell.desktop
|
data/gnome-shell.desktop.in
|
||||||
data/org.gnome.Shell.desktop.in
|
|
||||||
data/gnome-shell-extension-prefs.desktop
|
data/gnome-shell-extension-prefs.desktop
|
||||||
data/gnome-shell-extension-prefs.desktop.in
|
data/gnome-shell-extension-prefs.desktop.in
|
||||||
data/gnome-shell-theme.gresource
|
|
||||||
data/gschemas.compiled
|
data/gschemas.compiled
|
||||||
data/perf-background.xml
|
|
||||||
data/org.gnome.shell.gschema.xml
|
data/org.gnome.shell.gschema.xml
|
||||||
data/org.gnome.shell.gschema.valid
|
data/org.gnome.shell.gschema.valid
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.xml
|
data/org.gnome.shell.evolution.calendar.gschema.xml
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.valid
|
data/org.gnome.shell.evolution.calendar.gschema.valid
|
||||||
data/org.gnome.Shell.PortalHelper.desktop
|
|
||||||
data/org.gnome.Shell.PortalHelper.service
|
|
||||||
data/theme/.sass-cache
|
|
||||||
docs/reference/*/*.args
|
docs/reference/*/*.args
|
||||||
docs/reference/*/*.bak
|
docs/reference/*/*.bak
|
||||||
docs/reference/*/*.hierarchy
|
docs/reference/*/*.hierarchy
|
||||||
@ -43,17 +37,13 @@ docs/reference/*/*.txt
|
|||||||
docs/reference/*/*.types
|
docs/reference/*/*.types
|
||||||
docs/reference/*/html/
|
docs/reference/*/html/
|
||||||
docs/reference/*/xml/
|
docs/reference/*/xml/
|
||||||
docs/reference/shell/doc-gen-*
|
|
||||||
gtk-doc.make
|
gtk-doc.make
|
||||||
js/misc/config.js
|
js/misc/config.js
|
||||||
js/js-resources.c
|
|
||||||
js/js-resources.h
|
|
||||||
intltool-extract.in
|
intltool-extract.in
|
||||||
intltool-merge.in
|
intltool-merge.in
|
||||||
intltool-update.in
|
intltool-update.in
|
||||||
libtool
|
libtool
|
||||||
m4/
|
m4/
|
||||||
man/gnome-shell.1
|
|
||||||
omf.make
|
omf.make
|
||||||
po/*.gmo
|
po/*.gmo
|
||||||
po/gnome-shell.pot
|
po/gnome-shell.pot
|
||||||
@ -78,14 +68,14 @@ src/calendar-server/evolution-calendar.desktop.in
|
|||||||
src/calendar-server/org.gnome.Shell.CalendarServer.service
|
src/calendar-server/org.gnome.Shell.CalendarServer.service
|
||||||
src/gnome-shell
|
src/gnome-shell
|
||||||
src/gnome-shell-calendar-server
|
src/gnome-shell-calendar-server
|
||||||
src/gnome-shell-extension-prefs
|
|
||||||
src/gnome-shell-extension-tool
|
src/gnome-shell-extension-tool
|
||||||
|
src/gnome-shell-extension-prefs
|
||||||
src/gnome-shell-hotplug-sniffer
|
src/gnome-shell-hotplug-sniffer
|
||||||
|
src/gnome-shell-jhbuild
|
||||||
src/gnome-shell-perf-helper
|
src/gnome-shell-perf-helper
|
||||||
src/gnome-shell-perf-tool
|
src/gnome-shell-perf-tool
|
||||||
src/gnome-shell-portal-helper
|
src/gnome-shell-real
|
||||||
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
||||||
src/org-gtk-application.[ch]
|
|
||||||
src/run-js-test
|
src/run-js-test
|
||||||
src/test-recorder
|
src/test-recorder
|
||||||
src/test-recorder.ogg
|
src/test-recorder.ogg
|
||||||
@ -93,8 +83,6 @@ src/test-theme
|
|||||||
src/st.h
|
src/st.h
|
||||||
src/stamp-st.h
|
src/stamp-st.h
|
||||||
src/stamp-st.h.tmp
|
src/stamp-st.h.tmp
|
||||||
src/st-scroll-view-fade-generated.c
|
|
||||||
src/stamp-st-scroll-view-fade-generated.c
|
|
||||||
stamp-h1
|
stamp-h1
|
||||||
tests/run-test.sh
|
tests/run-test.sh
|
||||||
xmldocs.make
|
xmldocs.make
|
||||||
|
6
.gitmodules
vendored
@ -1,6 +0,0 @@
|
|||||||
[submodule "src/gvc"]
|
|
||||||
path = src/gvc
|
|
||||||
url = git://git.gnome.org/libgnome-volume-control
|
|
||||||
[submodule "data/theme/gnome-shell-sass"]
|
|
||||||
path = data/theme/gnome-shell-sass
|
|
||||||
url = git://git.gnome.org/gnome-shell-sass
|
|
41
COPYING
@ -1,12 +1,12 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
@ -303,16 +303,17 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
along with this program; if not, write to the Free Software
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
@ -335,5 +336,5 @@ necessary. Here is a sample; alter the names:
|
|||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
library. If this is what you want to do, use the GNU Library General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
331
HACKING
@ -1,331 +0,0 @@
|
|||||||
Coding guide
|
|
||||||
============
|
|
||||||
|
|
||||||
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
|
|
||||||
(and unit tests), or you rapidly end up with a spaghetti-code mess.
|
|
||||||
|
|
||||||
A quick note
|
|
||||||
------------
|
|
||||||
|
|
||||||
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
|
|
||||||
what to do.
|
|
||||||
|
|
||||||
Indentation and whitespace
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
on one line.
|
|
||||||
|
|
||||||
* 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`
|
|
||||||
* statements, or `while`, or `for` loops.
|
|
||||||
|
|
||||||
function foo(a, b) {
|
|
||||||
let bar;
|
|
||||||
|
|
||||||
if (a > b)
|
|
||||||
bar = do_thing(a);
|
|
||||||
else
|
|
||||||
bar = do_thing(b);
|
|
||||||
|
|
||||||
if (var == 5) {
|
|
||||||
for (let i = 0; i < 10; i++) {
|
|
||||||
print(i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print(20);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Semicolons
|
|
||||||
----------
|
|
||||||
|
|
||||||
JavaScript allows omitting semicolons at the end of lines, but don't. Always
|
|
||||||
end statements with a semicolon.
|
|
||||||
|
|
||||||
js2-mode
|
|
||||||
--------
|
|
||||||
|
|
||||||
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
|
|
||||||
espresso-mode. It is the de facto emacs mode for JavaScript.
|
|
||||||
|
|
||||||
File naming and creation
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
For JavaScript files, use lowerCamelCase-style names, with a `.js` extension.
|
|
||||||
|
|
||||||
We only use C where gjs/gobject-introspection is not available for the task, or
|
|
||||||
where C would be cleaner. To work around limitations in
|
|
||||||
gjs/gobject-introspection itself, add a new method in `shell-util.[ch]`.
|
|
||||||
|
|
||||||
Like many other GNOME projects, we prefix our C source filenames with the
|
|
||||||
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
|
|
||||||
library. These headers are not installed, distributed or introspected.
|
|
||||||
|
|
||||||
Imports
|
|
||||||
-------
|
|
||||||
|
|
||||||
Use UpperCamelCase when importing modules to distinguish them from ordinary
|
|
||||||
variables, e.g.
|
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
|
|
||||||
Imports should be categorized into one of two places. The top-most import block
|
|
||||||
should contain only "environment imports". These are either modules from
|
|
||||||
gobject-introspection or modules added by gjs itself.
|
|
||||||
|
|
||||||
The second block of imports should contain only "application imports". These
|
|
||||||
are the JS code that is in the gnome-shell codebase,
|
|
||||||
e.g. `imports.ui.popupMenu`.
|
|
||||||
|
|
||||||
Each import block should be sorted alphabetically. Don't import modules you
|
|
||||||
don't use.
|
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const Params = imports.misc.params;
|
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const Util = imports.misc.util;
|
|
||||||
|
|
||||||
The alphabetical ordering should be done independently of the location of the
|
|
||||||
location. Never reference `imports` in actual code.
|
|
||||||
|
|
||||||
Constants
|
|
||||||
---------
|
|
||||||
|
|
||||||
We use CONSTANTS_CASE to define constants. All constants should be directly
|
|
||||||
under the imports:
|
|
||||||
|
|
||||||
const MY_DBUS_INTERFACE = 'org.my.Interface';
|
|
||||||
|
|
||||||
Variable declaration
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Always use either `const` or `let` when defining a variable.
|
|
||||||
|
|
||||||
// Iterating over an array
|
|
||||||
for (let i = 0; i < arr.length; ++i) {
|
|
||||||
let item = arr[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterating over an object's properties
|
|
||||||
for (let prop in someobj) {
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
Classes
|
|
||||||
-------
|
|
||||||
|
|
||||||
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
|
|
||||||
GObjects, although this feature isn't used very often in the Shell itself.
|
|
||||||
|
|
||||||
const IconLabelMenuItem = new Lang.Class({
|
|
||||||
Name: 'IconLabelMenuItem',
|
|
||||||
Extends: PopupMenu.PopupMenuBaseItem,
|
|
||||||
|
|
||||||
_init: function(icon, label) {
|
|
||||||
this.parent({ reactive: false });
|
|
||||||
this.actor.add_child(icon);
|
|
||||||
this.actor.add_child(label);
|
|
||||||
},
|
|
||||||
|
|
||||||
open: function() {
|
|
||||||
log("menu opened!");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
* 'Name' is required. 'Extends' is optional. If you leave it out, you will
|
|
||||||
automatically inherit from Object.
|
|
||||||
|
|
||||||
* Leave a blank line between the "class header" (Name, Extends, and other
|
|
||||||
things) and the "class body" (methods). Leave a blank line between each
|
|
||||||
method.
|
|
||||||
|
|
||||||
* No space before the colon, one space after.
|
|
||||||
|
|
||||||
* No trailing comma after the last item.
|
|
||||||
|
|
||||||
* Make sure to use a semicolon after the closing paren to the class. It's
|
|
||||||
still a giant function call, even though it may resemble a more
|
|
||||||
conventional syntax.
|
|
||||||
|
|
||||||
GObject Introspection
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
GObject Introspection is a powerful feature that allows us to have native
|
|
||||||
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:
|
|
||||||
|
|
||||||
const MyClutterActor = new Lang.Class({
|
|
||||||
Name: 'MyClutterActor',
|
|
||||||
Extends: Clutter.Actor,
|
|
||||||
|
|
||||||
vfunc_get_preferred_width: function(actor, forHeight) {
|
|
||||||
return [100, 100];
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_get_preferred_height: function(actor, forWidth) {
|
|
||||||
return [100, 100];
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_paint: function(actor) {
|
|
||||||
let alloc = this.get_allocation_box();
|
|
||||||
Cogl.set_source_color4ub(255, 0, 0, 255);
|
|
||||||
Cogl.rectangle(alloc.x1, alloc.y1,
|
|
||||||
alloc.x2, alloc.y2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Translatable strings, `environment.js`
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
explicitly import it. This is done through some magic in the
|
|
||||||
[environment.js](http://git.gnome.org/browse/gnome-shell/tree/js/ui/environment.js)
|
|
||||||
file. If you can't find a method that's used, it's probably either in gjs itself
|
|
||||||
or installed on the global object from the Environment.
|
|
||||||
|
|
||||||
Use 'single quotes' for programming strings that should not be translated
|
|
||||||
and "double quotes" for strings that the user may see. This allows us to
|
|
||||||
quickly find untranslated or mistranslated strings by grepping through the
|
|
||||||
sources for double quotes without a gettext call around them.
|
|
||||||
|
|
||||||
`actor` and `_delegate`
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
you could inherit from GTypes natively in JS, we usually have a wrapper class
|
|
||||||
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
|
|
||||||
the actor itself:
|
|
||||||
|
|
||||||
const MyClass = new Lang.Class({
|
|
||||||
Name: 'MyClass',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this.actor = new St.Button({ text: "This is a button" });
|
|
||||||
this.actor._delegate = this;
|
|
||||||
|
|
||||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
|
||||||
},
|
|
||||||
|
|
||||||
_onClicked: function(actor) {
|
|
||||||
actor.set_label("You clicked the button!");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
The 'delegate' property is important for anything which trying to get the
|
|
||||||
delegate object from an associated actor. For instance, the drag and drop
|
|
||||||
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`
|
|
||||||
property, your actor will not be able to be dropped onto.
|
|
||||||
|
|
||||||
Functional style
|
|
||||||
----------------
|
|
||||||
|
|
||||||
JavaScript Array objects offer a lot of common functional programming
|
|
||||||
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
|
|
||||||
messed in a procedural style. Use your best judgment.
|
|
||||||
|
|
||||||
Closures
|
|
||||||
--------
|
|
||||||
|
|
||||||
`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"
|
|
||||||
is a keyword with a value passed in at function invocation time, it is not a
|
|
||||||
variable that can be captured in closures.
|
|
||||||
|
|
||||||
All closures should be wrapped with a Lang.bind.
|
|
||||||
|
|
||||||
const Lang = imports.lang;
|
|
||||||
|
|
||||||
let closure = Lang.bind(this, function() { this._fnorbate(); });
|
|
||||||
|
|
||||||
A more realistic example would be connecting to a signal on a method of a
|
|
||||||
prototype:
|
|
||||||
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const FnorbLib = imports.fborbLib;
|
|
||||||
|
|
||||||
const MyClass = new Lang.Class({
|
|
||||||
_init: function() {
|
|
||||||
let fnorb = new FnorbLib.Fnorb();
|
|
||||||
fnorb.connect('frobate', Lang.bind(this, this._onFnorbFrobate));
|
|
||||||
},
|
|
||||||
|
|
||||||
_onFnorbFrobate: function(fnorb) {
|
|
||||||
this._updateFnorb();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Object literal syntax
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
In JavaScript, these are equivalent:
|
|
||||||
|
|
||||||
foo = { 'bar': 42 };
|
|
||||||
foo = { bar: 42 };
|
|
||||||
|
|
||||||
and so are these:
|
|
||||||
|
|
||||||
var b = foo['bar'];
|
|
||||||
var b = foo.bar;
|
|
||||||
|
|
||||||
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:
|
|
||||||
42 }` `foo.bar`.
|
|
||||||
|
|
||||||
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
|
|
||||||
}`, `foo['bar']`.
|
|
||||||
|
|
||||||
Getters, setters, and Tweener
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
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
|
|
||||||
arbitrary property, create a getter and setter, and use Tweener to animate the
|
|
||||||
property.
|
|
||||||
|
|
||||||
const ANIMATION_TIME = 2000;
|
|
||||||
|
|
||||||
const MyClass = new Lang.Class({
|
|
||||||
Name: 'MyClass',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this.actor = new St.BoxLayout();
|
|
||||||
this._position = 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
get position() {
|
|
||||||
return this._position;
|
|
||||||
},
|
|
||||||
|
|
||||||
set position(value) {
|
|
||||||
this._position = value;
|
|
||||||
this.actor.set_position(value, value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let myThing = new MyClass();
|
|
||||||
Tweener.addTween(myThing,
|
|
||||||
{ position: 100,
|
|
||||||
time: ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad' });
|
|
14
Makefile.am
@ -1,15 +1,7 @@
|
|||||||
# Point to our macro directory and pick up user flags from the environment
|
# Point to our macro directory and pick up user flags from the environment
|
||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||||
|
|
||||||
SUBDIRS = data js src tests po docs
|
SUBDIRS = data js src browser-plugin tests po man docs
|
||||||
|
|
||||||
if BUILD_BROWSER_PLUGIN
|
|
||||||
SUBDIRS += browser-plugin
|
|
||||||
endif
|
|
||||||
|
|
||||||
if ENABLE_MAN
|
|
||||||
SUBDIRS += man
|
|
||||||
endif
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
.project \
|
.project \
|
||||||
@ -20,9 +12,7 @@ EXTRA_DIST = \
|
|||||||
# These are files checked into Git that we don't want to distribute
|
# These are files checked into Git that we don't want to distribute
|
||||||
DIST_EXCLUDE = \
|
DIST_EXCLUDE = \
|
||||||
.gitignore \
|
.gitignore \
|
||||||
.gitmodules \
|
|
||||||
gnome-shell.doap \
|
gnome-shell.doap \
|
||||||
HACKING \
|
|
||||||
MAINTAINERS \
|
MAINTAINERS \
|
||||||
tools/build/*
|
tools/build/*
|
||||||
|
|
||||||
@ -30,4 +20,4 @@ distcheck-hook:
|
|||||||
@echo "Checking disted files against files in git"
|
@echo "Checking disted files against files in git"
|
||||||
@$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE)
|
@$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE)
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man
|
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||||
|
2
README
@ -8,7 +8,7 @@ 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:
|
||||||
|
|
||||||
https://wiki.gnome.org/Projects/GnomeShell
|
http://live.gnome.org/GnomeShell
|
||||||
|
|
||||||
Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
|
Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
|
||||||
product.
|
product.
|
||||||
|
14
autogen.sh
@ -1,9 +1,11 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
# Run this to generate all the initial makefiles, etc.
|
# Run this to generate all the initial makefiles, etc.
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
srcdir=`dirname $0`
|
||||||
test -z "$srcdir" && srcdir=.
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
|
PKG_NAME="gnome-shell"
|
||||||
|
|
||||||
(test -f $srcdir/configure.ac \
|
(test -f $srcdir/configure.ac \
|
||||||
&& test -d $srcdir/src) || {
|
&& test -d $srcdir/src) || {
|
||||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||||
@ -11,17 +13,9 @@ test -z "$srcdir" && srcdir=.
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Fetch submodules if needed
|
|
||||||
if test ! -f src/gvc/Makefile.am || test ! -f data/theme/gnome-shell-sass/COPYING;
|
|
||||||
then
|
|
||||||
echo "+ Setting up submodules"
|
|
||||||
git submodule init
|
|
||||||
fi
|
|
||||||
git submodule update
|
|
||||||
|
|
||||||
which gnome-autogen.sh || {
|
which gnome-autogen.sh || {
|
||||||
echo "You need to install gnome-common from GNOME Git (or from"
|
echo "You need to install gnome-common from GNOME Git (or from"
|
||||||
echo "your OS vendor's package manager)."
|
echo "your OS vendor's package manager)."
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
. gnome-autogen.sh
|
USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh
|
||||||
|
@ -3,10 +3,7 @@ mozillalibdir = $(BROWSER_PLUGIN_DIR)
|
|||||||
|
|
||||||
mozillalib_LTLIBRARIES = libgnome-shell-browser-plugin.la
|
mozillalib_LTLIBRARIES = libgnome-shell-browser-plugin.la
|
||||||
|
|
||||||
# Browsers can unload and reload the module while browsing, which is not supported by GObject.
|
libgnome_shell_browser_plugin_la_LDFLAGS = -module -avoid-version -no-undefined
|
||||||
# We pass -Wl,-z,nodelete to the linker to ensure the module is never unloaded.
|
|
||||||
# https://bugzilla.gnome.org/show_bug.cgi?id=737932
|
|
||||||
libgnome_shell_browser_plugin_la_LDFLAGS = -module -avoid-version -no-undefined -Wl,-z,nodelete
|
|
||||||
|
|
||||||
libgnome_shell_browser_plugin_la_LIBADD = \
|
libgnome_shell_browser_plugin_la_LIBADD = \
|
||||||
$(BROWSER_PLUGIN_LIBS)
|
$(BROWSER_PLUGIN_LIBS)
|
||||||
@ -20,4 +17,5 @@ libgnome_shell_browser_plugin_la_SOURCES = \
|
|||||||
|
|
||||||
libgnome_shell_browser_plugin_la_CFLAGS = \
|
libgnome_shell_browser_plugin_la_CFLAGS = \
|
||||||
$(BROWSER_PLUGIN_CFLAGS) \
|
$(BROWSER_PLUGIN_CFLAGS) \
|
||||||
|
-DG_DISABLE_DEPRECATED \
|
||||||
-DG_LOG_DOMAIN=\"GnomeShellBrowserPlugin\"
|
-DG_LOG_DOMAIN=\"GnomeShellBrowserPlugin\"
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Jasper St. Pierre <jstpierre@mecheye.net>
|
* Jasper St. Pierre <jstpierre@mecheye.net>
|
||||||
@ -33,15 +35,17 @@
|
|||||||
#include <json-glib/json-glib.h>
|
#include <json-glib/json-glib.h>
|
||||||
|
|
||||||
#define ORIGIN "extensions.gnome.org"
|
#define ORIGIN "extensions.gnome.org"
|
||||||
#define PLUGIN_NAME "GNOME Shell Integration"
|
#define PLUGIN_NAME "Gnome Shell Integration"
|
||||||
#define PLUGIN_DESCRIPTION "This plugin provides integration with GNOME Shell " \
|
#define PLUGIN_DESCRIPTION "This plugin provides integration with Gnome Shell " \
|
||||||
"for live extension enabling and disabling. " \
|
"for live extension enabling and disabling. " \
|
||||||
"It can be used only by extensions.gnome.org"
|
"It can be used only by extensions.gnome.org"
|
||||||
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::GNOME Shell Integration Dummy Content-Type";
|
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type";
|
||||||
|
|
||||||
#define PLUGIN_API_VERSION 5
|
#define PLUGIN_API_VERSION 5
|
||||||
|
|
||||||
#define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation"
|
typedef struct {
|
||||||
|
GDBusProxy *proxy;
|
||||||
|
} PluginData;
|
||||||
|
|
||||||
static NPNetscapeFuncs funcs;
|
static NPNetscapeFuncs funcs;
|
||||||
|
|
||||||
@ -141,6 +145,123 @@ check_origin_and_protocol (NPP instance)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* =============== public entry points =================== */
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
||||||
|
{
|
||||||
|
/* global initialization routine, called once when plugin
|
||||||
|
is loaded */
|
||||||
|
|
||||||
|
g_type_init ();
|
||||||
|
|
||||||
|
g_debug ("plugin loaded");
|
||||||
|
|
||||||
|
memcpy (&funcs, pfuncs, sizeof (funcs));
|
||||||
|
|
||||||
|
plugin->size = sizeof(NPPluginFuncs);
|
||||||
|
plugin->newp = NPP_New;
|
||||||
|
plugin->destroy = NPP_Destroy;
|
||||||
|
plugin->getvalue = NPP_GetValue;
|
||||||
|
plugin->setwindow = NPP_SetWindow;
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_Shutdown(void)
|
||||||
|
{
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char*
|
||||||
|
NP_GetMIMEDescription(void)
|
||||||
|
{
|
||||||
|
return PLUGIN_MIME_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_GetValue(void *instance,
|
||||||
|
NPPVariable variable,
|
||||||
|
void *value)
|
||||||
|
{
|
||||||
|
switch (variable) {
|
||||||
|
case NPPVpluginNameString:
|
||||||
|
*(char**)value = PLUGIN_NAME;
|
||||||
|
break;
|
||||||
|
case NPPVpluginDescriptionString:
|
||||||
|
*(char**)value = PLUGIN_DESCRIPTION;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NPP_New(NPMIMEType mimetype,
|
||||||
|
NPP instance,
|
||||||
|
uint16_t mode,
|
||||||
|
int16_t argc,
|
||||||
|
char **argn,
|
||||||
|
char **argv,
|
||||||
|
NPSavedData *saved)
|
||||||
|
{
|
||||||
|
/* instance initialization function */
|
||||||
|
PluginData *data;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_debug ("plugin created");
|
||||||
|
|
||||||
|
if (!check_origin_and_protocol (instance))
|
||||||
|
return NPERR_GENERIC_ERROR;
|
||||||
|
|
||||||
|
data = g_slice_new (PluginData);
|
||||||
|
instance->pdata = data;
|
||||||
|
|
||||||
|
data->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||||
|
G_DBUS_PROXY_FLAGS_NONE,
|
||||||
|
NULL, /* interface info */
|
||||||
|
"org.gnome.Shell",
|
||||||
|
"/org/gnome/Shell",
|
||||||
|
"org.gnome.Shell.Extensions",
|
||||||
|
NULL, /* GCancellable */
|
||||||
|
&error);
|
||||||
|
if (!data->proxy)
|
||||||
|
{
|
||||||
|
/* ignore error if the shell is not running, otherwise warn */
|
||||||
|
if (error->domain != G_DBUS_ERROR ||
|
||||||
|
error->code != G_DBUS_ERROR_NAME_HAS_NO_OWNER)
|
||||||
|
{
|
||||||
|
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
||||||
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
return NPERR_GENERIC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_debug ("plugin created successfully");
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NPP_Destroy(NPP instance,
|
||||||
|
NPSavedData **saved)
|
||||||
|
{
|
||||||
|
/* instance finalization function */
|
||||||
|
|
||||||
|
PluginData *data = instance->pdata;
|
||||||
|
|
||||||
|
g_debug ("plugin destroyed");
|
||||||
|
|
||||||
|
g_object_unref (data->proxy);
|
||||||
|
|
||||||
|
g_slice_free (PluginData, data);
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/* =================== scripting interface =================== */
|
/* =================== scripting interface =================== */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -211,18 +332,45 @@ static NPObject *
|
|||||||
plugin_object_allocate (NPP instance,
|
plugin_object_allocate (NPP instance,
|
||||||
NPClass *klass)
|
NPClass *klass)
|
||||||
{
|
{
|
||||||
PluginObject *obj = (PluginObject *) funcs.memalloc (sizeof (PluginObject));
|
PluginData *data = instance->pdata;
|
||||||
|
PluginObject *obj = g_slice_new0 (PluginObject);
|
||||||
|
|
||||||
memset (obj, 0, sizeof (PluginObject));
|
|
||||||
obj->instance = instance;
|
obj->instance = instance;
|
||||||
|
obj->proxy = g_object_ref (data->proxy);
|
||||||
|
obj->settings = g_settings_new (SHELL_SCHEMA);
|
||||||
|
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
||||||
|
G_CALLBACK (on_shell_signal), obj);
|
||||||
|
|
||||||
return (NPObject*) obj;
|
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
||||||
|
"org.gnome.Shell",
|
||||||
|
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
||||||
|
on_shell_appeared,
|
||||||
|
NULL,
|
||||||
|
obj,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_debug ("plugin object created");
|
||||||
|
|
||||||
|
return (NPObject*)obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
plugin_object_deallocate (NPObject *npobj)
|
plugin_object_deallocate (NPObject *npobj)
|
||||||
{
|
{
|
||||||
funcs.memfree (npobj);
|
PluginObject *obj = (PluginObject*)npobj;
|
||||||
|
|
||||||
|
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
||||||
|
g_object_unref (obj->proxy);
|
||||||
|
|
||||||
|
if (obj->listener)
|
||||||
|
funcs.releaseobject (obj->listener);
|
||||||
|
|
||||||
|
if (obj->watch_name_id)
|
||||||
|
g_bus_unwatch_name (obj->watch_name_id);
|
||||||
|
|
||||||
|
g_debug ("plugin object destroyed");
|
||||||
|
|
||||||
|
g_slice_free (PluginObject, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
@ -687,16 +835,6 @@ plugin_get_shell_version (PluginObject *obj,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_get_version_validation_enabled (PluginObject *obj,
|
|
||||||
NPVariant *result)
|
|
||||||
{
|
|
||||||
gboolean is_enabled = !g_settings_get_boolean (obj->settings, EXTENSION_DISABLE_VERSION_CHECK_KEY);
|
|
||||||
BOOLEAN_TO_NPVARIANT(is_enabled, *result);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define METHODS \
|
#define METHODS \
|
||||||
METHOD (list_extensions) \
|
METHOD (list_extensions) \
|
||||||
METHOD (get_info) \
|
METHOD (get_info) \
|
||||||
@ -716,8 +854,6 @@ static NPIdentifier api_version_id;
|
|||||||
static NPIdentifier shell_version_id;
|
static NPIdentifier shell_version_id;
|
||||||
static NPIdentifier onextension_changed_id;
|
static NPIdentifier onextension_changed_id;
|
||||||
static NPIdentifier onrestart_id;
|
static NPIdentifier onrestart_id;
|
||||||
static NPIdentifier version_validation_enabled_id;
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
plugin_object_has_method (NPObject *npobj,
|
plugin_object_has_method (NPObject *npobj,
|
||||||
@ -760,8 +896,7 @@ plugin_object_has_property (NPObject *npobj,
|
|||||||
return (name == onextension_changed_id ||
|
return (name == onextension_changed_id ||
|
||||||
name == onrestart_id ||
|
name == onrestart_id ||
|
||||||
name == api_version_id ||
|
name == api_version_id ||
|
||||||
name == shell_version_id ||
|
name == shell_version_id);
|
||||||
name == version_validation_enabled_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@ -779,8 +914,6 @@ plugin_object_get_property (NPObject *npobj,
|
|||||||
return plugin_get_api_version (obj, result);
|
return plugin_get_api_version (obj, result);
|
||||||
else if (name == shell_version_id)
|
else if (name == shell_version_id)
|
||||||
return plugin_get_shell_version (obj, result);
|
return plugin_get_shell_version (obj, result);
|
||||||
else if (name == version_validation_enabled_id)
|
|
||||||
return plugin_get_version_validation_enabled (obj, result);
|
|
||||||
else if (name == onextension_changed_id)
|
else if (name == onextension_changed_id)
|
||||||
{
|
{
|
||||||
if (obj->listener)
|
if (obj->listener)
|
||||||
@ -859,7 +992,6 @@ init_methods_and_properties (void)
|
|||||||
/* this is the JS public API; it is manipulated through NPIdentifiers for speed */
|
/* this is the JS public API; it is manipulated through NPIdentifiers for speed */
|
||||||
api_version_id = funcs.getstringidentifier ("apiVersion");
|
api_version_id = funcs.getstringidentifier ("apiVersion");
|
||||||
shell_version_id = funcs.getstringidentifier ("shellVersion");
|
shell_version_id = funcs.getstringidentifier ("shellVersion");
|
||||||
version_validation_enabled_id = funcs.getstringidentifier ("versionValidationEnabled");
|
|
||||||
|
|
||||||
get_info_id = funcs.getstringidentifier ("getExtensionInfo");
|
get_info_id = funcs.getstringidentifier ("getExtensionInfo");
|
||||||
list_extensions_id = funcs.getstringidentifier ("listExtensions");
|
list_extensions_id = funcs.getstringidentifier ("listExtensions");
|
||||||
@ -873,149 +1005,6 @@ init_methods_and_properties (void)
|
|||||||
onextension_changed_id = funcs.getstringidentifier ("onchange");
|
onextension_changed_id = funcs.getstringidentifier ("onchange");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =============== public entry points =================== */
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
|
||||||
{
|
|
||||||
/* global initialization routine, called once when plugin
|
|
||||||
is loaded */
|
|
||||||
|
|
||||||
g_debug ("plugin loaded");
|
|
||||||
|
|
||||||
memcpy (&funcs, pfuncs, sizeof (funcs));
|
|
||||||
|
|
||||||
plugin->size = sizeof(NPPluginFuncs);
|
|
||||||
plugin->newp = NPP_New;
|
|
||||||
plugin->destroy = NPP_Destroy;
|
|
||||||
plugin->getvalue = NPP_GetValue;
|
|
||||||
plugin->setwindow = NPP_SetWindow;
|
|
||||||
plugin->event = NPP_HandleEvent;
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_Shutdown(void)
|
|
||||||
{
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char*
|
|
||||||
NP_GetMIMEDescription(void)
|
|
||||||
{
|
|
||||||
return PLUGIN_MIME_STRING;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_GetValue(void *instance,
|
|
||||||
NPPVariable variable,
|
|
||||||
void *value)
|
|
||||||
{
|
|
||||||
switch (variable) {
|
|
||||||
case NPPVpluginNameString:
|
|
||||||
*(char**)value = PLUGIN_NAME;
|
|
||||||
break;
|
|
||||||
case NPPVpluginDescriptionString:
|
|
||||||
*(char**)value = PLUGIN_DESCRIPTION;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NPP_New(NPMIMEType mimetype,
|
|
||||||
NPP instance,
|
|
||||||
uint16_t mode,
|
|
||||||
int16_t argc,
|
|
||||||
char **argn,
|
|
||||||
char **argv,
|
|
||||||
NPSavedData *saved)
|
|
||||||
{
|
|
||||||
/* instance initialization function */
|
|
||||||
PluginObject *obj;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
g_debug ("plugin created");
|
|
||||||
|
|
||||||
if (!check_origin_and_protocol (instance))
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
|
|
||||||
/* set windowless mode */
|
|
||||||
funcs.setvalue(instance, NPPVpluginWindowBool, NULL);
|
|
||||||
|
|
||||||
g_debug ("creating scriptable object");
|
|
||||||
init_methods_and_properties ();
|
|
||||||
obj = (PluginObject *) funcs.createobject (instance, &plugin_class);
|
|
||||||
instance->pdata = obj;
|
|
||||||
|
|
||||||
obj->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
|
||||||
G_DBUS_PROXY_FLAGS_NONE,
|
|
||||||
NULL, /* interface info */
|
|
||||||
"org.gnome.Shell",
|
|
||||||
"/org/gnome/Shell",
|
|
||||||
"org.gnome.Shell.Extensions",
|
|
||||||
NULL, /* GCancellable */
|
|
||||||
&error);
|
|
||||||
if (!obj->proxy)
|
|
||||||
{
|
|
||||||
/* ignore error if the shell is not running, otherwise warn */
|
|
||||||
if (!g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER))
|
|
||||||
{
|
|
||||||
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
|
||||||
}
|
|
||||||
g_clear_error (&error);
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj->settings = g_settings_new (SHELL_SCHEMA);
|
|
||||||
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
|
||||||
G_CALLBACK (on_shell_signal), obj);
|
|
||||||
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
|
||||||
"org.gnome.Shell",
|
|
||||||
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
|
||||||
on_shell_appeared,
|
|
||||||
NULL,
|
|
||||||
obj,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
g_debug ("plugin created successfully");
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NPP_Destroy(NPP instance,
|
|
||||||
NPSavedData **saved)
|
|
||||||
{
|
|
||||||
/* instance finalization function */
|
|
||||||
PluginObject *obj = (PluginObject *) instance->pdata;
|
|
||||||
|
|
||||||
if (!obj)
|
|
||||||
return NPERR_INVALID_INSTANCE_ERROR;
|
|
||||||
|
|
||||||
g_debug ("plugin destroyed");
|
|
||||||
|
|
||||||
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
|
||||||
g_object_unref (obj->proxy);
|
|
||||||
|
|
||||||
if (obj->listener)
|
|
||||||
funcs.releaseobject (obj->listener);
|
|
||||||
|
|
||||||
if (obj->restart_listener)
|
|
||||||
funcs.releaseobject (obj->restart_listener);
|
|
||||||
|
|
||||||
if (obj->watch_name_id)
|
|
||||||
g_bus_unwatch_name (obj->watch_name_id);
|
|
||||||
|
|
||||||
funcs.releaseobject((NPObject *)obj);
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
NPError
|
||||||
NPP_GetValue(NPP instance,
|
NPP_GetValue(NPP instance,
|
||||||
NPPVariable variable,
|
NPPVariable variable,
|
||||||
@ -1026,10 +1015,13 @@ NPP_GetValue(NPP instance,
|
|||||||
switch (variable) {
|
switch (variable) {
|
||||||
case NPPVpluginScriptableNPObject:
|
case NPPVpluginScriptableNPObject:
|
||||||
g_debug ("creating scriptable object");
|
g_debug ("creating scriptable object");
|
||||||
if (!instance->pdata)
|
init_methods_and_properties ();
|
||||||
return NPERR_INVALID_INSTANCE_ERROR;
|
|
||||||
|
|
||||||
*(NPObject**)value = instance->pdata;
|
*(NPObject**)value = funcs.createobject (instance, &plugin_class);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NPPVpluginNeedsXEmbed:
|
||||||
|
*(bool *)value = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1047,11 +1039,3 @@ NPP_SetWindow(NPP instance,
|
|||||||
{
|
{
|
||||||
return NPERR_NO_ERROR;
|
return NPERR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t
|
|
||||||
NPP_HandleEvent(NPP instance,
|
|
||||||
void *event)
|
|
||||||
{
|
|
||||||
/* Ignore the event */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
301
configure.ac
@ -1,6 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[3.20.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[3.5.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
AX_IS_RELEASE([git-directory])
|
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
@ -17,7 +16,8 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
|||||||
|
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CXX
|
# Needed for per-target cflags, like in gnomeshell-taskpanel
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
|
||||||
# Initialize libtool
|
# Initialize libtool
|
||||||
LT_PREREQ([2.2.6])
|
LT_PREREQ([2.2.6])
|
||||||
@ -26,6 +26,9 @@ LT_INIT([disable-static])
|
|||||||
# i18n
|
# i18n
|
||||||
IT_PROG_INTLTOOL([0.40])
|
IT_PROG_INTLTOOL([0.40])
|
||||||
|
|
||||||
|
AM_GNU_GETTEXT([external])
|
||||||
|
AM_GNU_GETTEXT_VERSION([0.17])
|
||||||
|
|
||||||
GETTEXT_PACKAGE=gnome-shell
|
GETTEXT_PACKAGE=gnome-shell
|
||||||
AC_SUBST(GETTEXT_PACKAGE)
|
AC_SUBST(GETTEXT_PACKAGE)
|
||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
||||||
@ -33,12 +36,10 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
|||||||
|
|
||||||
PKG_PROG_PKG_CONFIG([0.22])
|
PKG_PROG_PKG_CONFIG([0.22])
|
||||||
|
|
||||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
|
||||||
|
|
||||||
GLIB_GSETTINGS
|
GLIB_GSETTINGS
|
||||||
|
|
||||||
# Get a value to substitute into gnome-shell.in
|
# Get a value to substitute into gnome-shell.in
|
||||||
AM_PATH_PYTHON([3])
|
AM_PATH_PYTHON([2.5])
|
||||||
AC_SUBST(PYTHON)
|
AC_SUBST(PYTHON)
|
||||||
|
|
||||||
# We need at least this, since gst_plugin_register_static() was added
|
# We need at least this, since gst_plugin_register_static() was added
|
||||||
@ -51,111 +52,129 @@ AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
|
|||||||
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
|
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
build_recorder=true
|
build_recorder=true
|
||||||
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
|
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11"
|
||||||
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules mutter-clutter-1.0)
|
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl)
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||||
|
|
||||||
AC_ARG_ENABLE([systemd],
|
CLUTTER_MIN_VERSION=1.9.16
|
||||||
AS_HELP_STRING([--enable-systemd], [Use systemd]),
|
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||||
[enable_systemd=$enableval],
|
GJS_MIN_VERSION=1.33.2
|
||||||
[enable_systemd=auto])
|
MUTTER_MIN_VERSION=3.5.4
|
||||||
AS_IF([test x$enable_systemd != xno], [
|
GTK_MIN_VERSION=3.3.9
|
||||||
AC_MSG_CHECKING([for libsystemd])
|
GIO_MIN_VERSION=2.31.6
|
||||||
PKG_CHECK_EXISTS([libsystemd],
|
|
||||||
[have_systemd=yes
|
|
||||||
AC_DEFINE([HAVE_SYSTEMD], [1], [Define if we have systemd])],
|
|
||||||
[have_systemd=no])
|
|
||||||
AC_MSG_RESULT($have_systemd)
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_MSG_RESULT($enable_systemd)
|
|
||||||
|
|
||||||
CLUTTER_MIN_VERSION=1.21.5
|
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4
|
|
||||||
GJS_MIN_VERSION=1.39.0
|
|
||||||
MUTTER_MIN_VERSION=3.20.0
|
|
||||||
GTK_MIN_VERSION=3.15.0
|
|
||||||
GIO_MIN_VERSION=2.45.3
|
|
||||||
LIBECAL_MIN_VERSION=3.5.3
|
LIBECAL_MIN_VERSION=3.5.3
|
||||||
LIBEDATASERVER_MIN_VERSION=3.17.2
|
LIBEDATASERVER_MIN_VERSION=3.5.3
|
||||||
|
LIBEDATASERVERUI_MIN_VERSION=3.5.3
|
||||||
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
||||||
|
TELEPATHY_LOGGER_MIN_VERSION=0.2.4
|
||||||
POLKIT_MIN_VERSION=0.100
|
POLKIT_MIN_VERSION=0.100
|
||||||
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||||
GCR_MIN_VERSION=3.7.5
|
GCR_MIN_VERSION=3.3.90
|
||||||
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
|
GNOME_DESKTOP_REQUIRED_VERSION=3.5.1
|
||||||
NETWORKMANAGER_MIN_VERSION=0.9.8
|
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
||||||
PULSE_MIN_VERS=2.0
|
|
||||||
|
|
||||||
# Collect more than 20 libraries for a prize!
|
# Collect more than 20 libraries for a prize!
|
||||||
SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
|
PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||||
libxml-2.0
|
libxml-2.0
|
||||||
gtk+-3.0 >= $GTK_MIN_VERSION
|
gtk+-3.0 >= $GTK_MIN_VERSION
|
||||||
atk-bridge-2.0
|
atk-bridge-2.0
|
||||||
gjs-internals-1.0 >= $GJS_MIN_VERSION
|
libmutter >= $MUTTER_MIN_VERSION
|
||||||
$recorder_modules
|
gjs-internals-1.0 >= $GJS_MIN_VERSION
|
||||||
gdk-x11-3.0 libsoup-2.4
|
libgnome-menu-3.0 >= $GNOME_MENUS_REQUIRED_VERSION
|
||||||
mutter-clutter-1.0 >= $CLUTTER_MIN_VERSION
|
$recorder_modules
|
||||||
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
|
gdk-x11-3.0 libsoup-2.4
|
||||||
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
gl
|
||||||
libcanberra libcanberra-gtk3
|
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
|
||||||
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
||||||
polkit-agent-1 >= $POLKIT_MIN_VERSION
|
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
|
||||||
gcr-base-3 >= $GCR_MIN_VERSION"
|
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
||||||
if test x$have_systemd = xyes; then
|
libcanberra
|
||||||
SHARED_PCS="${SHARED_PCS} libsystemd"
|
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
||||||
fi
|
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
||||||
|
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||||
|
libnm-glib libnm-util gnome-keyring-1
|
||||||
|
gcr-3 >= $GCR_MIN_VERSION
|
||||||
|
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
|
||||||
|
|
||||||
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
|
|
||||||
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
|
||||||
PKG_CHECK_MODULES(ST, mutter-clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
|
||||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||||
|
|
||||||
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
|
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
|
||||||
PKG_CHECK_MODULES(TRAY, mutter-clutter-1.0 gtk+-3.0)
|
|
||||||
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
|
|
||||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.19.2)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(browser-plugin,
|
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
|
||||||
[AS_HELP_STRING([--enable-browser-plugin],
|
|
||||||
[Enable browser plugin [default=yes]])],,
|
|
||||||
enable_browser_plugin=yes)
|
|
||||||
AS_IF([test x$enable_browser_plugin = xyes], [
|
|
||||||
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
|
|
||||||
])
|
|
||||||
AM_CONDITIONAL(BUILD_BROWSER_PLUGIN, test x$enable_browser_plugin = xyes)
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(BLUETOOTH, gnome-bluetooth-1.0 >= 3.9.0,
|
|
||||||
[AC_DEFINE([HAVE_BLUETOOTH],[1],[Define if you have libgnome-bluetooth-applet])
|
|
||||||
AC_SUBST([HAVE_BLUETOOTH],[1])],
|
|
||||||
[AC_DEFINE([HAVE_BLUETOOTH],[0])
|
|
||||||
AC_SUBST([HAVE_BLUETOOTH],[0])])
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
|
|
||||||
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
|
||||||
AC_SUBST(CALENDAR_SERVER_LIBS)
|
|
||||||
|
|
||||||
GNOME_KEYBINDINGS_KEYSDIR=`$PKG_CONFIG --variable keysdir gnome-keybindings`
|
|
||||||
AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
|
|
||||||
|
|
||||||
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
||||||
|
|
||||||
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
|
saved_CFLAGS=$CFLAGS
|
||||||
AC_SUBST(MUTTER_GIR_DIR)
|
saved_LIBS=$LIBS
|
||||||
|
CFLAGS=$GNOME_SHELL_CFLAGS
|
||||||
|
LIBS=$GNOME_SHELL_LIBS
|
||||||
|
AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
|
||||||
|
CFLAGS=$saved_CFLAGS
|
||||||
|
LIBS=$saved_LIBS
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
||||||
|
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 x11)
|
||||||
|
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||||
|
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
|
||||||
|
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.5.4)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for bluetooth support])
|
||||||
|
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
||||||
|
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=applet_libdir gnome-bluetooth-1.0`
|
||||||
|
BLUETOOTH_LIBS=`$PKG_CONFIG --variable=applet_libs gnome-bluetooth-1.0`
|
||||||
|
AC_SUBST([BLUETOOTH_LIBS],["$BLUETOOTH_LIBS"])
|
||||||
|
AC_SUBST([BLUETOOTH_DIR],["$BLUETOOTH_DIR"])
|
||||||
|
AC_DEFINE_UNQUOTED([BLUETOOTH_DIR],["$BLUETOOTH_DIR"],[Path to installed GnomeBluetooth typelib and library])
|
||||||
|
AC_DEFINE([HAVE_BLUETOOTH],[1],[Define if you have libgnome-bluetooth-applet])
|
||||||
|
AC_SUBST([HAVE_BLUETOOTH],[1])
|
||||||
|
AC_MSG_RESULT([yes])],
|
||||||
|
[AC_DEFINE([HAVE_BLUETOOTH],[0])
|
||||||
|
AC_SUBST([HAVE_BLUETOOTH],[0])
|
||||||
|
AC_MSG_RESULT([no])])
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-3.0 >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0)
|
||||||
|
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
||||||
|
AC_SUBST(CALENDAR_SERVER_LIBS)
|
||||||
|
|
||||||
|
AC_ARG_WITH(systemd,
|
||||||
|
AS_HELP_STRING([--with-systemd],
|
||||||
|
[Add systemd support]),
|
||||||
|
[with_systemd=$withval], [with_systemd=auto])
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(SYSTEMD,
|
||||||
|
[libsystemd-login libsystemd-daemon],
|
||||||
|
[have_systemd=yes], [have_systemd=no])
|
||||||
|
|
||||||
|
if test "x$with_systemd" = "xauto" ; then
|
||||||
|
if test x$have_systemd = xno ; then
|
||||||
|
use_systemd=no
|
||||||
|
else
|
||||||
|
use_systemd=yes
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
use_systemd=$with_systemd
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$use_systemd" = "xyes"; then
|
||||||
|
if test "x$have_systemd" = "xno"; then
|
||||||
|
AC_MSG_ERROR([Systemd support explicitly required, but systemd not found])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_DEFINE(WITH_SYSTEMD, 1, [systemd support])
|
||||||
|
fi
|
||||||
|
|
||||||
|
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
|
||||||
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
|
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
|
||||||
|
AC_SUBST(MUTTER_GIR_DIR)
|
||||||
AC_SUBST(MUTTER_TYPELIB_DIR)
|
AC_SUBST(MUTTER_TYPELIB_DIR)
|
||||||
|
|
||||||
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
|
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
|
||||||
AC_SUBST(GJS_CONSOLE)
|
AC_SUBST(GJS_CONSOLE)
|
||||||
|
|
||||||
GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable glib_compile_resources gio-2.0`
|
|
||||||
AC_SUBST(GLIB_COMPILE_RESOURCES)
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS(fdwalk)
|
AC_CHECK_FUNCS(fdwalk)
|
||||||
AC_CHECK_FUNCS(mallinfo)
|
AC_CHECK_FUNCS(mallinfo)
|
||||||
AC_CHECK_HEADERS([sys/resource.h])
|
AC_CHECK_HEADERS([sys/resource.h])
|
||||||
@ -171,78 +190,55 @@ if test "$langinfo_ok" = "yes"; then
|
|||||||
[Define if _NL_TIME_FIRST_WEEKDAY is available])
|
[Define if _NL_TIME_FIRST_WEEKDAY is available])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(networkmanager,
|
|
||||||
AS_HELP_STRING([--disable-networkmanager],
|
|
||||||
[disable NetworkManager support @<:@default=auto@:>@]),,
|
|
||||||
[enable_networkmanager=auto])
|
|
||||||
|
|
||||||
if test "x$enable_networkmanager" != "xno"; then
|
|
||||||
PKG_CHECK_MODULES(NETWORKMANAGER,
|
|
||||||
[libnm-glib
|
|
||||||
libnm-util >= $NETWORKMANAGER_MIN_VERSION
|
|
||||||
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
|
||||||
libsecret-unstable],
|
|
||||||
[have_networkmanager=yes],
|
|
||||||
[have_networkmanager=no])
|
|
||||||
|
|
||||||
GNOME_SHELL_CFLAGS="$GNOME_SHELL_CFLAGS $NETWORKMANAGER_CFLAGS"
|
|
||||||
GNOME_SHELL_LIBS="$GNOME_SHELL_LIBS $NETWORKMANAGER_LIBS"
|
|
||||||
else
|
|
||||||
have_networkmanager="no (disabled)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$have_networkmanager" = "xyes"; then
|
|
||||||
AC_DEFINE(HAVE_NETWORKMANAGER, [1], [Define if we have NetworkManager])
|
|
||||||
AC_SUBST([HAVE_NETWORKMANAGER], [1])
|
|
||||||
else
|
|
||||||
if test "x$enable_networkmanager" = "xyes"; then
|
|
||||||
AC_MSG_ERROR([Couldn't find NetworkManager.])
|
|
||||||
fi
|
|
||||||
AC_SUBST([HAVE_NETWORKMANAGER], [0])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_NETWORKMANAGER, test "$have_networkmanager" = "yes")
|
|
||||||
|
|
||||||
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
||||||
AM_PATH_GLIB_2_0()
|
AM_PATH_GLIB_2_0()
|
||||||
|
G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
|
||||||
|
AC_SUBST(G_IR_SCANNER)
|
||||||
|
G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
|
||||||
|
AC_SUBST(G_IR_COMPILER)
|
||||||
|
G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
|
||||||
|
AC_SUBST(G_IR_GENERATE)
|
||||||
|
GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
|
||||||
|
AC_SUBST(GIRDIR)
|
||||||
|
TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
|
||||||
|
AC_SUBST(TYPELIBDIR)
|
||||||
|
|
||||||
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
||||||
|
|
||||||
AC_ARG_ENABLE(man,
|
# Stay command-line compatible with the gnome-common configure option. Here
|
||||||
[AS_HELP_STRING([--enable-man],
|
# minimum/yes/maximum are the same, however.
|
||||||
[generate man pages [default=yes]])],,
|
AC_ARG_ENABLE(compile_warnings,
|
||||||
enable_man=yes)
|
AS_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],[Turn on compiler warnings]),,
|
||||||
if test "$enable_man" != no; then
|
enable_compile_warnings=error)
|
||||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
|
||||||
if test -z "$XSLTPROC"; then
|
changequote(,)dnl
|
||||||
AC_MSG_ERROR([xsltproc is required for --enable-man])
|
if test "$enable_compile_warnings" != no ; then
|
||||||
|
if test "x$GCC" = "xyes"; then
|
||||||
|
case " $CFLAGS " in
|
||||||
|
*[\ \ ]-Wall[\ \ ]*) ;;
|
||||||
|
*) CFLAGS="$CFLAGS -Wall" ;;
|
||||||
|
esac
|
||||||
|
case " $CFLAGS " in
|
||||||
|
*[\ \ ]-Wmissing-prototypes[\ \ ]*) ;;
|
||||||
|
*) CFLAGS="$CFLAGS -Wmissing-prototypes" ;;
|
||||||
|
esac
|
||||||
|
if test "$enable_compile_warnings" = error ; then
|
||||||
|
case " $CFLAGS " in
|
||||||
|
*[\ \ ]-Werror[\ \ ]*) ;;
|
||||||
|
*) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
changequote([,])dnl
|
||||||
|
|
||||||
AX_COMPILER_FLAGS()
|
AC_ARG_ENABLE(jhbuild-wrapper-script,
|
||||||
case "$WARN_CFLAGS" in
|
AS_HELP_STRING([--enable-jhbuild-wrapper-script],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no)
|
||||||
*-Werror*)
|
AM_CONDITIONAL(USE_JHBUILD_WRAPPER_SCRIPT, test "x$enable_jhbuild_wrapper_script" = xyes)
|
||||||
WARN_CFLAGS="$WARN_CFLAGS -Wno-error=deprecated-declarations"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AM_CFLAGS="$AM_CFLAGS $WARN_CFLAGS"
|
BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
|
||||||
AC_SUBST(AM_CFLAGS)
|
|
||||||
|
|
||||||
if test -z "${BROWSER_PLUGIN_DIR}"; then
|
|
||||||
BROWSER_PLUGIN_DIR="\${libdir}/mozilla/plugins"
|
|
||||||
fi
|
|
||||||
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
|
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
|
||||||
|
|
||||||
AC_ARG_VAR([GDBUS_CODEGEN],[the gdbus-codegen programme])
|
|
||||||
AC_PATH_PROG([GDBUS_CODEGEN],[gdbus-codegen],[])
|
|
||||||
if test -z "$GDBUS_CODEGEN"; then
|
|
||||||
AC_MSG_ERROR([gdbus-codegen not found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_PATH_PROG([SASS],[sass],[])
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
data/Makefile
|
data/Makefile
|
||||||
@ -255,22 +251,9 @@ AC_CONFIG_FILES([
|
|||||||
js/Makefile
|
js/Makefile
|
||||||
src/calendar-server/evolution-calendar.desktop.in
|
src/calendar-server/evolution-calendar.desktop.in
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/gvc/Makefile
|
|
||||||
browser-plugin/Makefile
|
browser-plugin/Makefile
|
||||||
tests/Makefile
|
tests/Makefile
|
||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
man/Makefile
|
man/Makefile
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
echo "
|
|
||||||
Build configuration:
|
|
||||||
|
|
||||||
Prefix: ${prefix}
|
|
||||||
Source code location: ${srcdir}
|
|
||||||
Compiler: ${CC}
|
|
||||||
Compiler Warnings: $ax_enable_compile_warnings
|
|
||||||
|
|
||||||
Support for NetworkManager: $have_networkmanager
|
|
||||||
Support for GStreamer recording: $build_recorder
|
|
||||||
"
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<KeyListEntries schema="org.gnome.shell.keybindings"
|
|
||||||
group="system"
|
|
||||||
_name="System"
|
|
||||||
wm_name="GNOME Shell"
|
|
||||||
package="gnome-shell">
|
|
||||||
|
|
||||||
<KeyListEntry name="toggle-message-tray"
|
|
||||||
_description="Show the notification list"/>
|
|
||||||
|
|
||||||
<KeyListEntry name="focus-active-notification"
|
|
||||||
_description="Focus the active notification"/>
|
|
||||||
|
|
||||||
<KeyListEntry name="toggle-overview"
|
|
||||||
_description="Show the overview"/>
|
|
||||||
|
|
||||||
<KeyListEntry name="toggle-application-view"
|
|
||||||
_description="Show all applications"/>
|
|
||||||
|
|
||||||
<KeyListEntry name="open-application-menu"
|
|
||||||
_description="Open the application menu"/>
|
|
||||||
|
|
||||||
</KeyListEntries>
|
|
||||||
|
|
131
data/Makefile.am
@ -1,25 +1,5 @@
|
|||||||
CLEANFILES =
|
|
||||||
NULL =
|
|
||||||
|
|
||||||
desktopdir=$(datadir)/applications
|
desktopdir=$(datadir)/applications
|
||||||
desktop_DATA = org.gnome.Shell.desktop gnome-shell-extension-prefs.desktop
|
desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
|
||||||
|
|
||||||
if HAVE_NETWORKMANAGER
|
|
||||||
desktop_DATA += org.gnome.Shell.PortalHelper.desktop
|
|
||||||
|
|
||||||
servicedir = $(datadir)/dbus-1/services
|
|
||||||
service_DATA = org.gnome.Shell.PortalHelper.service
|
|
||||||
|
|
||||||
CLEANFILES += \
|
|
||||||
org.gnome.Shell.PortalHelper.service \
|
|
||||||
org.gnome.Shell.PortalHelper.desktop \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
%.service: %.service.in
|
|
||||||
$(AM_V_GEN) sed -e "s|@libexecdir[@]|$(libexecdir)|" \
|
|
||||||
$< > $@ || rm $@
|
|
||||||
|
|
||||||
# We substitute in bindir so it works as an autostart
|
# We substitute in bindir so it works as an autostart
|
||||||
# file when built in a non-system prefix
|
# file when built in a non-system prefix
|
||||||
@ -30,58 +10,45 @@ endif
|
|||||||
|
|
||||||
@INTLTOOL_DESKTOP_RULE@
|
@INTLTOOL_DESKTOP_RULE@
|
||||||
|
|
||||||
|
searchprovidersdir = $(pkgdatadir)/open-search-providers
|
||||||
|
dist_searchproviders_DATA = \
|
||||||
|
open-search-providers/google.xml \
|
||||||
|
open-search-providers/wikipedia.xml
|
||||||
|
|
||||||
introspectiondir = $(datadir)/dbus-1/interfaces
|
introspectiondir = $(datadir)/dbus-1/interfaces
|
||||||
introspection_DATA = \
|
introspection_DATA = org.gnome.ShellSearchProvider.xml
|
||||||
org.gnome.Shell.Screencast.xml \
|
|
||||||
org.gnome.Shell.Screenshot.xml \
|
|
||||||
org.gnome.ShellSearchProvider.xml \
|
|
||||||
org.gnome.ShellSearchProvider2.xml \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
theme_sources = \
|
themedir = $(pkgdatadir)/theme
|
||||||
theme/gnome-shell-high-contrast.scss \
|
dist_theme_DATA = \
|
||||||
theme/gnome-shell.scss \
|
theme/calendar-arrow-left.svg \
|
||||||
theme/gnome-shell-sass/_colors.scss \
|
theme/calendar-arrow-right.svg \
|
||||||
theme/gnome-shell-sass/_common.scss \
|
theme/calendar-today.svg \
|
||||||
theme/gnome-shell-sass/_drawing.scss \
|
theme/checkbox-focused.svg \
|
||||||
theme/gnome-shell-sass/_high-contrast-colors.scss \
|
theme/checkbox-off-focused.svg \
|
||||||
$(NULL)
|
theme/checkbox-off.svg \
|
||||||
|
theme/checkbox.svg \
|
||||||
dist_theme_files = \
|
theme/close-window.svg \
|
||||||
$(theme_sources) \
|
theme/close.svg \
|
||||||
theme/Gemfile \
|
theme/corner-ripple-ltr.png \
|
||||||
theme/HACKING \
|
theme/corner-ripple-rtl.png \
|
||||||
theme/README \
|
theme/dash-placeholder.svg \
|
||||||
theme/gnome-shell-sass/COPYING \
|
theme/filter-selected-ltr.svg \
|
||||||
theme/gnome-shell-sass/HACKING \
|
theme/filter-selected-rtl.svg \
|
||||||
theme/gnome-shell-sass/NEWS \
|
theme/gnome-shell.css \
|
||||||
theme/gnome-shell-sass/README \
|
theme/logged-in-indicator.svg \
|
||||||
theme/gnome-shell-sass/gnome-shell-sass.doap \
|
theme/noise-texture.png \
|
||||||
theme/parse-sass.sh \
|
theme/panel-button-border.svg \
|
||||||
$(NULL)
|
theme/panel-button-highlight-narrow.svg \
|
||||||
|
theme/panel-button-highlight-wide.svg \
|
||||||
%.css: %.scss $(theme_sources)
|
theme/process-working.svg \
|
||||||
@if test -n "$(SASS)"; then \
|
theme/running-indicator.svg \
|
||||||
if $(AM_V_P); then PS4= set -x; else echo " GEN $@"; fi; \
|
theme/source-button-border.svg \
|
||||||
$(SASS) --sourcemap=none -f -q --update $<; \
|
theme/toggle-off-us.svg \
|
||||||
fi
|
theme/toggle-off-intl.svg \
|
||||||
|
theme/toggle-on-us.svg \
|
||||||
resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/theme --generate-dependencies $(srcdir)/gnome-shell-theme.gresource.xml)
|
theme/toggle-on-intl.svg \
|
||||||
gnome-shell-theme.gresource: gnome-shell-theme.gresource.xml $(resource_files)
|
theme/ws-switch-arrow-up.svg \
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir)/theme $<
|
theme/ws-switch-arrow-down.svg
|
||||||
resourcedir = $(pkgdatadir)
|
|
||||||
resource_DATA = gnome-shell-theme.gresource
|
|
||||||
|
|
||||||
backgrounddir = $(pkgdatadir)
|
|
||||||
background_DATA = perf-background.xml
|
|
||||||
|
|
||||||
perf-background.xml: perf-background.xml.in
|
|
||||||
$(AM_V_GEN) sed -e "s|@datadir[@]|$(datadir)|" \
|
|
||||||
$< > $@ || rm $@
|
|
||||||
|
|
||||||
keysdir = @GNOME_KEYBINDINGS_KEYSDIR@
|
|
||||||
keys_in_files = 50-gnome-shell-system.xml.in
|
|
||||||
keys_DATA = $(keys_in_files:.xml.in=.xml)
|
|
||||||
|
|
||||||
gsettings_SCHEMAS = org.gnome.shell.gschema.xml
|
gsettings_SCHEMAS = org.gnome.shell.gschema.xml
|
||||||
|
|
||||||
@ -104,30 +71,18 @@ convertdir = $(datadir)/GConf/gsettings
|
|||||||
convert_DATA = gnome-shell-overrides.convert
|
convert_DATA = gnome-shell-overrides.convert
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
org.gnome.Shell.desktop.in.in \
|
gnome-shell.desktop.in.in \
|
||||||
gnome-shell-extension-prefs.desktop.in.in \
|
gnome-shell-extension-prefs.desktop.in.in \
|
||||||
$(introspection_DATA) \
|
$(introspection_DATA) \
|
||||||
$(menu_DATA) \
|
$(menu_DATA) \
|
||||||
$(convert_DATA) \
|
$(convert_DATA) \
|
||||||
$(keys_in_files) \
|
org.gnome.shell.gschema.xml.in.in
|
||||||
$(dist_theme_files) \
|
|
||||||
perf-background.xml.in \
|
|
||||||
org.gnome.Shell.PortalHelper.desktop.in \
|
|
||||||
org.gnome.Shell.PortalHelper.service.in \
|
|
||||||
org.gnome.shell.gschema.xml.in.in \
|
|
||||||
gnome-shell-theme.gresource.xml \
|
|
||||||
$(resource_files) \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
CLEANFILES += \
|
CLEANFILES = \
|
||||||
org.gnome.Shell.desktop.in \
|
gnome-shell.desktop.in \
|
||||||
gnome-shell-extension-prefs.in \
|
gnome-shell-extension-prefs.in \
|
||||||
$(desktop_DATA) \
|
$(desktop_DATA) \
|
||||||
$(keys_DATA) \
|
|
||||||
$(gsettings_SCHEMAS) \
|
$(gsettings_SCHEMAS) \
|
||||||
perf-background.xml \
|
|
||||||
gschemas.compiled \
|
gschemas.compiled \
|
||||||
org.gnome.shell.gschema.valid \
|
org.gnome.shell.gschema.valid \
|
||||||
org.gnome.shell.gschema.xml.in \
|
org.gnome.shell.gschema.xml.in
|
||||||
gnome-shell-theme.gresource \
|
|
||||||
$(NULL)
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
[org.gnome.shell.overrides]
|
[org.gnome.shell.overrides]
|
||||||
attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs
|
attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs
|
||||||
|
button-layout = /desktop/gnome/shell/windows/button_layout
|
||||||
edge-tiling = /desktop/gnome/shell/windows/edge_tiling
|
edge-tiling = /desktop/gnome/shell/windows/edge_tiling
|
||||||
workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary
|
workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<gresources>
|
|
||||||
<gresource prefix="/org/gnome/shell/theme">
|
|
||||||
<file>calendar-arrow-left.svg</file>
|
|
||||||
<file>calendar-arrow-right.svg</file>
|
|
||||||
<file>calendar-today.svg</file>
|
|
||||||
<file>checkbox-focused.svg</file>
|
|
||||||
<file>checkbox-off-focused.svg</file>
|
|
||||||
<file>checkbox-off.svg</file>
|
|
||||||
<file>checkbox.svg</file>
|
|
||||||
<file>close-window.svg</file>
|
|
||||||
<file>close.svg</file>
|
|
||||||
<file>corner-ripple-ltr.png</file>
|
|
||||||
<file>corner-ripple-rtl.png</file>
|
|
||||||
<file>dash-placeholder.svg</file>
|
|
||||||
<file>filter-selected-ltr.svg</file>
|
|
||||||
<file>filter-selected-rtl.svg</file>
|
|
||||||
<file>gnome-shell.css</file>
|
|
||||||
<file>gnome-shell-high-contrast.css</file>
|
|
||||||
<file>logged-in-indicator.svg</file>
|
|
||||||
<file>more-results.svg</file>
|
|
||||||
<file>no-events.svg</file>
|
|
||||||
<file>no-notifications.svg</file>
|
|
||||||
<file>noise-texture.png</file>
|
|
||||||
<file>page-indicator-active.svg</file>
|
|
||||||
<file>page-indicator-inactive.svg</file>
|
|
||||||
<file>page-indicator-checked.svg</file>
|
|
||||||
<file>page-indicator-hover.svg</file>
|
|
||||||
<file>process-working.svg</file>
|
|
||||||
<file>running-indicator.svg</file>
|
|
||||||
<file>source-button-border.svg</file>
|
|
||||||
<file>summary-counter.svg</file>
|
|
||||||
<file>toggle-off-us.svg</file>
|
|
||||||
<file>toggle-off-intl.svg</file>
|
|
||||||
<file>toggle-off-hc.svg</file>
|
|
||||||
<file>toggle-on-us.svg</file>
|
|
||||||
<file>toggle-on-intl.svg</file>
|
|
||||||
<file>toggle-on-hc.svg</file>
|
|
||||||
<file>ws-switch-arrow-up.png</file>
|
|
||||||
<file>ws-switch-arrow-down.png</file>
|
|
||||||
</gresource>
|
|
||||||
</gresources>
|
|
@ -10,7 +10,7 @@ X-GNOME-Bugzilla-Version=@VERSION@
|
|||||||
Categories=GNOME;GTK;Core;
|
Categories=GNOME;GTK;Core;
|
||||||
OnlyShowIn=GNOME;
|
OnlyShowIn=GNOME;
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-GNOME-Autostart-Phase=DisplayServer
|
X-GNOME-Autostart-Phase=WindowManager
|
||||||
X-GNOME-Provides=panel;windowmanager;
|
X-GNOME-Provides=panel;windowmanager;
|
||||||
X-GNOME-Autostart-Notify=true
|
X-GNOME-Autostart-Notify=true
|
||||||
X-GNOME-AutoRestart=false
|
X-GNOME-AutoRestart=false
|
7
data/open-search-providers/google.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
|
||||||
|
<ShortName>Google</ShortName>
|
||||||
|
<Description>Google Search</Description>
|
||||||
|
<InputEncoding>UTF-8</InputEncoding>
|
||||||
|
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%2BTzvb2%2B%2Fne4dFJeBw0egA%2FfAJAfAA8ewBBegAAAAD%2B%2FPtft98Mp%2BwWsfAVsvEbs%2FQeqvF8xO7%2F%2F%2F63yqkxdgM7gwE%2FggM%2BfQA%2BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%2FQvq%2Bfz%2Bf%2F%2B%2B%2FZKhR05hgBBhQI8hgBAgAI9ewD0%2B%2Fg3pswAtO8Cxf4Kw%2FsJvvYAqupKsNv%2B%2Fv7%2F%2FP5VkSU0iQA7jQA9hgBDgQU%2BfQH%2F%2Ff%2FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%2Fv%2Fg6Nc%2Fhg05kAA8jAM9iQI%2BhQA%2BgQDQu6b97uv%2F%2F%2F7V8Pqw3eiWz97q8%2Ff%2F%2F%2F%2F7%2FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%2F%2B%2F%2F39%2F%2F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%2F%2B%2Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%2BooT8%2Fv%2F7%2F%2F%2FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%2BhwGfXifWvqz%2B%2Ff%2F58u%2Fev6Dt4tr%2B%2F%2F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%2FkwBChwHt4dv%2F%2F%2F728ei1bCi7VAC5XQ7kz7n%2F%2F%2F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%2F%2F%2F9%2F%2F%2FSqYK5UwDKZAS9WALIkFn%2B%2F%2F3%2F%2BP8oKccGGcIRJrERILYFEMwAAuEAAdX%2F%2Ff7%2F%2FP%2B%2BfDvGXQLIZgLEWgLOjlf7%2F%2F%2F%2F%2F%2F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%2F%2F%2F%2F7%2B%2Fu2bCTIYwDPZgDBWQDSr4P%2F%2Fv%2F%2F%2FP5GRuABAPkAA%2FwBAfkDAPAAAesAAN%2F%2F%2B%2Fz%2F%2F%2F64g1C5VwDMYwK8Yg7y5tz8%2Fv%2FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%2F%2FPvi28ymXyChTATRrIb8%2F%2F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA</Image>
|
||||||
|
<Url type="text/html" method="GET" template="http://www.google.com/search?q={searchTerms}"/>
|
||||||
|
</OpenSearchDescription>
|
44
data/open-search-providers/wikipedia.xml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
|
||||||
|
<ShortName>Wikipedia</ShortName>
|
||||||
|
<Description>Wikipedia, the free encyclopedia</Description>
|
||||||
|
<InputEncoding>UTF-8</InputEncoding>
|
||||||
|
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9%2FAAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiIgzuIV4iIiIhndo53KIiIiB%2FWvXoYiIiIfEZfWBSIiIEGi%2FfoqoiIgzuL84i9iIjpGIoMiEHoiMkos3FojmiLlUipYliEWIF%2BiDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image>
|
||||||
|
<Url type="text/html" method="GET" template="http://{language}.wikipedia.org/wiki/Special:Search?search={searchTerms}"/>
|
||||||
|
<!-- The criterion for being below is being listed with more than 100,000
|
||||||
|
articles on http://meta.wikimedia.org/wiki/List_of_Wikipedias -->
|
||||||
|
<Language>ar</Language>
|
||||||
|
<Language>bg</Language>
|
||||||
|
<Language>ca</Language>
|
||||||
|
<Language>cs</Language>
|
||||||
|
<Language>da</Language>
|
||||||
|
<Language>de</Language>
|
||||||
|
<Language>en</Language>
|
||||||
|
<Language>eo</Language>
|
||||||
|
<Language>es</Language>
|
||||||
|
<Language>fa</Language>
|
||||||
|
<Language>fi</Language>
|
||||||
|
<Language>fr</Language>
|
||||||
|
<Language>he</Language>
|
||||||
|
<Language>hu</Language>
|
||||||
|
<Language>id</Language>
|
||||||
|
<Language>it</Language>
|
||||||
|
<Language>ja</Language>
|
||||||
|
<Language>ko</Language>
|
||||||
|
<Language>lt</Language>
|
||||||
|
<Language>nl</Language>
|
||||||
|
<Language>no</Language>
|
||||||
|
<Language>pl</Language>
|
||||||
|
<Language>pt</Language>
|
||||||
|
<Language>ro</Language>
|
||||||
|
<Language>ru</Language>
|
||||||
|
<Language>sk</Language>
|
||||||
|
<Language>sl</Language>
|
||||||
|
<Language>sr</Language>
|
||||||
|
<Language>sv</Language>
|
||||||
|
<Language>tr</Language>
|
||||||
|
<Language>uk</Language>
|
||||||
|
<Language>vi</Language>
|
||||||
|
<Language>vo</Language>
|
||||||
|
<Language>war</Language>
|
||||||
|
<Language>zh</Language>
|
||||||
|
</OpenSearchDescription>
|
@ -1,9 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
_Name=Network Login
|
|
||||||
Type=Application
|
|
||||||
Exec=gapplication launch org.gnome.Shell.PortalHelper
|
|
||||||
DBusActivatable=true
|
|
||||||
NoDisplay=true
|
|
||||||
Icon=network-workgroup
|
|
||||||
StartupNotify=true
|
|
||||||
OnlyShowIn=GNOME;
|
|
@ -1,3 +0,0 @@
|
|||||||
[D-BUS Service]
|
|
||||||
Name=org.gnome.Shell.PortalHelper
|
|
||||||
Exec=@libexecdir@/gnome-shell-portal-helper
|
|
@ -1,95 +0,0 @@
|
|||||||
<!DOCTYPE node PUBLIC
|
|
||||||
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
|
||||||
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
|
||||||
<node>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
org.gnome.Shell.Screencast:
|
|
||||||
@short_description: Screencast interface
|
|
||||||
|
|
||||||
The interface used to record screen contents.
|
|
||||||
-->
|
|
||||||
<interface name="org.gnome.Shell.Screencast">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Screencast:
|
|
||||||
@file_template: the template for the filename to use
|
|
||||||
@options: a dictionary of optional parameters
|
|
||||||
@success: whether the screencast was started successfully
|
|
||||||
@filename_used: the file where the screencast is being saved
|
|
||||||
|
|
||||||
Records a screencast of the whole screen and saves it
|
|
||||||
(by default) as webm video under a filename derived from
|
|
||||||
@file_template. The template is either a relative or absolute
|
|
||||||
filename which may contain some escape sequences - %d and %t
|
|
||||||
will be replaced by the start date and time of the recording.
|
|
||||||
If a relative name is used, the screencast will be saved in the
|
|
||||||
$XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
|
|
||||||
The actual filename of the saved video is returned in @filename_used.
|
|
||||||
The set of optional parameters in @options currently consists of:
|
|
||||||
'draw-cursor'(b): whether the cursor should be included in the
|
|
||||||
recording (true)
|
|
||||||
'framerate'(i): the number of frames per second that should be
|
|
||||||
recorded if possible (30)
|
|
||||||
'pipeline'(s): the GStreamer pipeline used to encode recordings
|
|
||||||
in gst-launch format; if not specified, the
|
|
||||||
recorder will produce vp8 (webm) video (unset)
|
|
||||||
-->
|
|
||||||
<method name="Screencast">
|
|
||||||
<arg type="s" direction="in" name="file_template"/>
|
|
||||||
<arg type="a{sv}" direction="in" name="options"/>
|
|
||||||
<arg type="b" direction="out" name="success"/>
|
|
||||||
<arg type="s" direction="out" name="filename_used"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
ScreencastArea:
|
|
||||||
@x: the X coordinate of the area to capture
|
|
||||||
@y: the Y coordinate of the area to capture
|
|
||||||
@width: the width of the area to capture
|
|
||||||
@height: the height of the area to capture
|
|
||||||
@file_template: the template for the filename to use
|
|
||||||
@options: a dictionary of optional parameters
|
|
||||||
@success: whether the screencast was started successfully
|
|
||||||
@filename_used: the file where the screencast is being saved
|
|
||||||
|
|
||||||
Records a screencast of the passed in area and saves it
|
|
||||||
(by default) as webm video under a filename derived from
|
|
||||||
@file_template. The template is either a relative or absolute
|
|
||||||
filename which may contain some escape sequences - %d and %t
|
|
||||||
will be replaced by the start date and time of the recording.
|
|
||||||
If a relative name is used, the screencast will be saved in the
|
|
||||||
$XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
|
|
||||||
The actual filename of the saved video is returned in @filename_used.
|
|
||||||
The set of optional parameters in @options currently consists of:
|
|
||||||
'draw-cursor'(b): whether the cursor should be included in the
|
|
||||||
recording (true)
|
|
||||||
'framerate'(i): the number of frames per second that should be
|
|
||||||
recorded if possible (30)
|
|
||||||
'pipeline'(s): the GStreamer pipeline used to encode recordings
|
|
||||||
in gst-launch format; if not specified, the
|
|
||||||
recorder will produce vp8 (webm) video (unset)
|
|
||||||
-->
|
|
||||||
<method name="ScreencastArea">
|
|
||||||
<arg type="i" direction="in" name="x"/>
|
|
||||||
<arg type="i" direction="in" name="y"/>
|
|
||||||
<arg type="i" direction="in" name="width"/>
|
|
||||||
<arg type="i" direction="in" name="height"/>
|
|
||||||
<arg type="s" direction="in" name="file_template"/>
|
|
||||||
<arg type="a{sv}" direction="in" name="options"/>
|
|
||||||
<arg type="b" direction="out" name="success"/>
|
|
||||||
<arg type="s" direction="out" name="filename_used"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
StopScreencast:
|
|
||||||
@success: whether stopping the recording was successful
|
|
||||||
|
|
||||||
Stop the recording started by either Screencast or ScreencastArea.
|
|
||||||
-->
|
|
||||||
<method name="StopScreencast">
|
|
||||||
<arg type="b" direction="out" name="success"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
</interface>
|
|
||||||
</node>
|
|
@ -1,128 +0,0 @@
|
|||||||
<!DOCTYPE node PUBLIC
|
|
||||||
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
|
||||||
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
|
||||||
<node>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
org.gnome.Shell.Screenshot:
|
|
||||||
@short_description: Screenshot interface
|
|
||||||
|
|
||||||
The interface used to capture pictures of the screen contents.
|
|
||||||
-->
|
|
||||||
<interface name="org.gnome.Shell.Screenshot">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Screenshot:
|
|
||||||
@filename: The filename for the screenshot
|
|
||||||
@include_cursor: Whether to include the cursor image or not
|
|
||||||
@flash: Whether to flash the screen or not
|
|
||||||
@success: whether the screenshot was captured
|
|
||||||
@filename_used: the file where the screenshot was saved
|
|
||||||
|
|
||||||
Takes a screenshot of the whole screen and saves it
|
|
||||||
in @filename as png image, it returns a boolean
|
|
||||||
indicating whether the operation was successful or not.
|
|
||||||
@filename can either be an absolute path or a basename, in
|
|
||||||
which case the screenshot will be saved in the $XDG_PICTURES_DIR
|
|
||||||
or the home directory if it doesn't exist. The filename used
|
|
||||||
to save the screenshot will be returned in @filename_used.
|
|
||||||
-->
|
|
||||||
<method name="Screenshot">
|
|
||||||
<arg type="b" direction="in" name="include_cursor"/>
|
|
||||||
<arg type="b" direction="in" name="flash"/>
|
|
||||||
<arg type="s" direction="in" name="filename"/>
|
|
||||||
<arg type="b" direction="out" name="success"/>
|
|
||||||
<arg type="s" direction="out" name="filename_used"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
ScreenshotWindow:
|
|
||||||
@include_frame: Whether to include the frame or not
|
|
||||||
@include_cursor: Whether to include the cursor image or not
|
|
||||||
@flash: Whether to flash the window area or not
|
|
||||||
@filename: The filename for the screenshot
|
|
||||||
@success: whether the screenshot was captured
|
|
||||||
@filename_used: the file where the screenshot was saved
|
|
||||||
|
|
||||||
Takes a screenshot of the focused window (optionally omitting the frame)
|
|
||||||
and saves it in @filename as png image, it returns a boolean
|
|
||||||
indicating whether the operation was successful or not.
|
|
||||||
@filename can either be an absolute path or a basename, in
|
|
||||||
which case the screenshot will be saved in the $XDG_PICTURES_DIR
|
|
||||||
or the home directory if it doesn't exist. The filename used
|
|
||||||
to save the screenshot will be returned in @filename_used.
|
|
||||||
-->
|
|
||||||
<method name="ScreenshotWindow">
|
|
||||||
<arg type="b" direction="in" name="include_frame"/>
|
|
||||||
<arg type="b" direction="in" name="include_cursor"/>
|
|
||||||
<arg type="b" direction="in" name="flash"/>
|
|
||||||
<arg type="s" direction="in" name="filename"/>
|
|
||||||
<arg type="b" direction="out" name="success"/>
|
|
||||||
<arg type="s" direction="out" name="filename_used"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
ScreenshotArea:
|
|
||||||
@x: the X coordinate of the area to capture
|
|
||||||
@y: the Y coordinate of the area to capture
|
|
||||||
@width: the width of the area to capture
|
|
||||||
@height: the height of the area to capture
|
|
||||||
@flash: whether to flash the area or not
|
|
||||||
@filename: the filename for the screenshot
|
|
||||||
@success: whether the screenshot was captured
|
|
||||||
@filename_used: the file where the screenshot was saved
|
|
||||||
|
|
||||||
Takes a screenshot of the passed in area and saves it
|
|
||||||
in @filename as png image, it returns a boolean
|
|
||||||
indicating whether the operation was successful or not.
|
|
||||||
@filename can either be an absolute path or a basename, in
|
|
||||||
which case the screenshot will be saved in the $XDG_PICTURES_DIR
|
|
||||||
or the home directory if it doesn't exist. The filename used
|
|
||||||
to save the screenshot will be returned in @filename_used.
|
|
||||||
-->
|
|
||||||
<method name="ScreenshotArea">
|
|
||||||
<arg type="i" direction="in" name="x"/>
|
|
||||||
<arg type="i" direction="in" name="y"/>
|
|
||||||
<arg type="i" direction="in" name="width"/>
|
|
||||||
<arg type="i" direction="in" name="height"/>
|
|
||||||
<arg type="b" direction="in" name="flash"/>
|
|
||||||
<arg type="s" direction="in" name="filename"/>
|
|
||||||
<arg type="b" direction="out" name="success"/>
|
|
||||||
<arg type="s" direction="out" name="filename_used"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
FlashArea:
|
|
||||||
@x: the X coordinate of the area to flash
|
|
||||||
@y: the Y coordinate of the area to flash
|
|
||||||
@width: the width of the area to flash
|
|
||||||
@height: the height of the area to flash
|
|
||||||
|
|
||||||
Renders a flash spot effect in the specified rectangle of the screen.
|
|
||||||
-->
|
|
||||||
<method name="FlashArea">
|
|
||||||
<arg type="i" direction="in" name="x"/>
|
|
||||||
<arg type="i" direction="in" name="y"/>
|
|
||||||
<arg type="i" direction="in" name="width"/>
|
|
||||||
<arg type="i" direction="in" name="height"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
SelectArea:
|
|
||||||
@x: the X coordinate of the selected area
|
|
||||||
@y: the Y coordinate of the selected area
|
|
||||||
@width: the width of the selected area
|
|
||||||
@height: the height of the selected area
|
|
||||||
|
|
||||||
Interactively allows the user to select a rectangular area of
|
|
||||||
the screen, and returns its coordinates.
|
|
||||||
-->
|
|
||||||
<method name="SelectArea">
|
|
||||||
<arg type="i" direction="out" name="x"/>
|
|
||||||
<arg type="i" direction="out" name="y"/>
|
|
||||||
<arg type="i" direction="out" name="width"/>
|
|
||||||
<arg type="i" direction="out" name="height"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
</interface>
|
|
||||||
</node>
|
|
@ -2,72 +2,146 @@
|
|||||||
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
||||||
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
||||||
<node>
|
<node>
|
||||||
|
|
||||||
<!--
|
|
||||||
org.gnome.Shell.SearchProvider:
|
|
||||||
@short_description: Search provider interface
|
|
||||||
|
|
||||||
The interface used for integrating into GNOME Shell's search
|
|
||||||
interface. This interface is deprecated, and org.gnome.Shell.SearchProvider2 should be used instead.
|
|
||||||
-->
|
|
||||||
<interface name="org.gnome.Shell.SearchProvider">
|
<interface name="org.gnome.Shell.SearchProvider">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:description>
|
||||||
|
<doc:para>
|
||||||
|
The interface used for integrating into GNOME Shell's search
|
||||||
|
interface.
|
||||||
|
</doc:para>
|
||||||
|
</doc:description>
|
||||||
|
</doc:doc>
|
||||||
|
|
||||||
<!--
|
|
||||||
GetInitialResultSet:
|
|
||||||
@terms: Array of search terms, which the provider should treat as logical AND.
|
|
||||||
@results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
|
|
||||||
|
|
||||||
Called when the user first begins a search.
|
|
||||||
-->
|
|
||||||
<method name="GetInitialResultSet">
|
<method name="GetInitialResultSet">
|
||||||
<arg type="as" name="terms" direction="in" />
|
<doc:doc>
|
||||||
<arg type="as" name="results" direction="out" />
|
<doc:description>
|
||||||
|
<doc:para>
|
||||||
|
Called when the user first begins a search.
|
||||||
|
</doc:para>
|
||||||
|
</doc:description>
|
||||||
|
</doc:doc>
|
||||||
|
<arg type="as" direction="in">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
Array of search terms, which the provider should treat as
|
||||||
|
logical AND.
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
|
<arg type="as" direction="out">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
An array of result identifier strings representing items which
|
||||||
|
match the given search terms. Identifiers must be unique within
|
||||||
|
the provider's domain, but other than that may be chosen freely
|
||||||
|
by the provider.
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
<!--
|
|
||||||
GetSubsearchResultSet:
|
|
||||||
@previous_results: Array of results previously returned by GetInitialResultSet().
|
|
||||||
@terms: Array of updated search terms, which the provider should treat as logical AND.
|
|
||||||
@results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
|
|
||||||
|
|
||||||
Called when a search is performed which is a "subsearch" of
|
|
||||||
the previous search, e.g. the method may return less results, but
|
|
||||||
not more or different results.
|
|
||||||
|
|
||||||
This allows search providers to only search through the previous
|
|
||||||
result set, rather than possibly performing a full re-query.
|
|
||||||
-->
|
|
||||||
<method name="GetSubsearchResultSet">
|
<method name="GetSubsearchResultSet">
|
||||||
<arg type="as" name="previous_results" direction="in" />
|
<doc:doc>
|
||||||
<arg type="as" name="terms" direction="in" />
|
<doc:description>
|
||||||
<arg type="as" name="results" direction="out" />
|
<doc:para>
|
||||||
|
Called when a search is performed which is a "subsearch" of
|
||||||
|
the previous search, e.g. the method may return less results, but
|
||||||
|
not more or different results.
|
||||||
|
|
||||||
|
This allows search providers to only search through the previous
|
||||||
|
result set, rather than possibly performing a full re-query.
|
||||||
|
</doc:para>
|
||||||
|
</doc:description>
|
||||||
|
</doc:doc>
|
||||||
|
<arg type="as" direction="in">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
Array of item identifiers
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
|
<arg type="as" direction="in">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
Array of updated search terms, which the provider should treat as
|
||||||
|
logical AND.
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
|
<arg type="as" direction="out">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
An array of result identifier strings representing items which
|
||||||
|
match the given search terms. Identifiers must be unique within
|
||||||
|
the provider's domain, but other than that may be chosen freely
|
||||||
|
by the provider.
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
<!--
|
|
||||||
GetResultMetas:
|
|
||||||
@identifiers: An array of result identifiers as returned by GetInitialResultSet() or GetSubsearchResultSet()
|
|
||||||
@metas: A dictionary describing the given search result, containing a human-readable 'name' (string), along with the result identifier this meta is for, 'id' (string). Optionally, either 'gicon' (a serialized GIcon) or 'icon-data' (raw image data as (iiibiiay) - width, height, rowstride, has-alpha, bits per sample, channels, data) can be specified if the result can be better served with a thumbnail of the content (such as with images). A 'description' field (string) may also be specified if more context would help the user find the desired result.
|
|
||||||
|
|
||||||
Return an array of meta data used to display each given result
|
|
||||||
-->
|
|
||||||
<method name="GetResultMetas">
|
<method name="GetResultMetas">
|
||||||
<arg type="as" name="identifiers" direction="in" />
|
<doc:doc>
|
||||||
<arg type="aa{sv}" name="metas" direction="out" />
|
<doc:description>
|
||||||
|
<doc:para>
|
||||||
|
Return an array of meta data used to display each given result
|
||||||
|
</doc:para>
|
||||||
|
</doc:description>
|
||||||
|
</doc:doc>
|
||||||
|
<arg type="as" direction="in">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
An array of result identifiers as returned by
|
||||||
|
GetInitialResultSet() or GetSubsearchResultSet()
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
|
<arg type="a{sv}" direction="out">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
A dictionary describing the given search result, containing
|
||||||
|
'id', 'name' (both strings) and either 'icon' (a serialized
|
||||||
|
GIcon) or 'icon-data' (raw image data as (iiibiiay) - width,
|
||||||
|
height, rowstride, has-alpha, bits per sample, channels, data)
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
<!--
|
|
||||||
ActivateResult:
|
|
||||||
@identifier: A result identifier as returned by GetInitialResultSet() or GetSubsearchResultSet()
|
|
||||||
|
|
||||||
Called when the users chooses a given result. The result should
|
|
||||||
be displayed in the application associated with the corresponding
|
|
||||||
provider.
|
|
||||||
|
|
||||||
This method is deprecated, and providers should implement ActivateResult2()
|
|
||||||
instead.
|
|
||||||
-->
|
|
||||||
<method name="ActivateResult">
|
<method name="ActivateResult">
|
||||||
<arg type="s" name="identifier" direction="in" />
|
<doc:doc>
|
||||||
|
<doc:description>
|
||||||
|
<doc:para>
|
||||||
|
Called when the users chooses a given result. The result should
|
||||||
|
be displayed in the application associated with the corresponding
|
||||||
|
provider.
|
||||||
|
</doc:para>
|
||||||
|
</doc:description>
|
||||||
|
</doc:doc>
|
||||||
|
<arg type="s" direction="in">
|
||||||
|
<doc:doc>
|
||||||
|
<doc:summary>
|
||||||
|
<doc:para>
|
||||||
|
A result identifier as returned by GetInitialResultSet() or
|
||||||
|
GetSubsearchResultSet()
|
||||||
|
</doc:para>
|
||||||
|
</doc:summary>
|
||||||
|
</doc:doc>
|
||||||
|
</arg>
|
||||||
</method>
|
</method>
|
||||||
</interface>
|
</interface>
|
||||||
</node>
|
</node>
|
||||||
|
@ -1,87 +0,0 @@
|
|||||||
<!DOCTYPE node PUBLIC
|
|
||||||
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
|
||||||
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
|
||||||
<node>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
org.gnome.Shell.SearchProvider2:
|
|
||||||
@short_description: Search provider interface
|
|
||||||
|
|
||||||
The interface used for integrating into GNOME Shell's search
|
|
||||||
interface (version 2).
|
|
||||||
-->
|
|
||||||
<interface name="org.gnome.Shell.SearchProvider2">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
GetInitialResultSet:
|
|
||||||
@terms: Array of search terms, which the provider should treat as logical AND.
|
|
||||||
@results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
|
|
||||||
|
|
||||||
Called when the user first begins a search.
|
|
||||||
-->
|
|
||||||
<method name="GetInitialResultSet">
|
|
||||||
<arg type="as" name="terms" direction="in" />
|
|
||||||
<arg type="as" name="results" direction="out" />
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
GetSubsearchResultSet:
|
|
||||||
@previous_results: Array of results previously returned by GetInitialResultSet().
|
|
||||||
@terms: Array of updated search terms, which the provider should treat as logical AND.
|
|
||||||
@results: An array of result identifier strings representing items which match the given search terms. Identifiers must be unique within the provider's domain, but other than that may be chosen freely by the provider.
|
|
||||||
|
|
||||||
Called when a search is performed which is a "subsearch" of
|
|
||||||
the previous search, e.g. the method may return less results, but
|
|
||||||
not more or different results.
|
|
||||||
|
|
||||||
This allows search providers to only search through the previous
|
|
||||||
result set, rather than possibly performing a full re-query.
|
|
||||||
-->
|
|
||||||
<method name="GetSubsearchResultSet">
|
|
||||||
<arg type="as" name="previous_results" direction="in" />
|
|
||||||
<arg type="as" name="terms" direction="in" />
|
|
||||||
<arg type="as" name="results" direction="out" />
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
GetResultMetas:
|
|
||||||
@identifiers: An array of result identifiers as returned by GetInitialResultSet() or GetSubsearchResultSet()
|
|
||||||
@metas: A dictionary describing the given search result, containing a human-readable 'name' (string), along with the result identifier this meta is for, 'id' (string). Optionally, 'icon' (a serialized GIcon as obtained by g_icon_serialize) can be specified if the result can be better served with a thumbnail of the content (such as with images). 'gicon' (a serialized GIcon as obtained by g_icon_to_string) or 'icon-data' (raw image data as (iiibiiay) - width, height, rowstride, has-alpha, bits per sample, channels, data) are deprecated values that can also be used for that purpose. A 'description' field (string) may also be specified if more context would help the user find the desired result.
|
|
||||||
|
|
||||||
Return an array of meta data used to display each given result
|
|
||||||
-->
|
|
||||||
<method name="GetResultMetas">
|
|
||||||
<arg type="as" name="identifiers" direction="in" />
|
|
||||||
<arg type="aa{sv}" name="metas" direction="out" />
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
ActivateResult:
|
|
||||||
@identifier: A result identifier as returned by GetInitialResultSet() or GetSubsearchResultSet()
|
|
||||||
@terms: Array of search terms, which the provider should treat as logical AND.
|
|
||||||
@timestamp: A timestamp of the user interaction that triggered this call
|
|
||||||
|
|
||||||
Called when the users chooses a given result. The result should
|
|
||||||
be displayed in the application associated with the corresponding
|
|
||||||
provider. The provided search terms can be used to allow launching a full search in
|
|
||||||
the application.
|
|
||||||
-->
|
|
||||||
<method name="ActivateResult">
|
|
||||||
<arg type="s" name="identifier" direction="in" />
|
|
||||||
<arg type="as" name="terms" direction="in" />
|
|
||||||
<arg type="u" name="timestamp" direction="in" />
|
|
||||||
</method>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
LaunchSearch:
|
|
||||||
@terms: Array of search terms, which the provider should treat as logical AND.
|
|
||||||
@timestamp: A timestamp of the user interaction that triggered this call
|
|
||||||
|
|
||||||
Asks the search provider to launch a full search in the application for the provided terms.
|
|
||||||
-->
|
|
||||||
<method name="LaunchSearch">
|
|
||||||
<arg type="as" name="terms" direction="in" />
|
|
||||||
<arg type="u" name="timestamp" direction="in" />
|
|
||||||
</method>
|
|
||||||
</interface>
|
|
||||||
</node>
|
|
@ -13,37 +13,35 @@
|
|||||||
</key>
|
</key>
|
||||||
<key name="enabled-extensions" type="as">
|
<key name="enabled-extensions" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<_summary>UUIDs of extensions to enable</_summary>
|
<_summary>Uuids of extensions to enable</_summary>
|
||||||
<_description>
|
<_description>
|
||||||
GNOME Shell extensions have a UUID property; this key lists extensions
|
GNOME Shell extensions have a uuid property; this key lists extensions
|
||||||
which should be loaded. Any extension that wants to be loaded needs
|
which should be loaded. Any extension that wants to be loaded needs
|
||||||
to be in this list. You can also manipulate this list with the
|
to be in this list. You can also manipulate this list with the
|
||||||
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
EnableExtension and DisableExtension DBus methods on org.gnome.Shell.
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="disable-extension-version-validation" type="b">
|
<key name="enable-app-monitoring" type="b">
|
||||||
<default>false</default>
|
<default>true</default>
|
||||||
<_summary>Disables the validation of extension version compatibility</_summary>
|
<_summary>Whether to collect stats about applications usage</_summary>
|
||||||
<_description>
|
<_description>
|
||||||
GNOME Shell will only load extensions that claim to support the current
|
The shell normally monitors active applications in order to present
|
||||||
running version. Enabling this option will disable this check and try to
|
the most used ones (e.g. in launchers). While this data will be
|
||||||
load all extensions regardless of the versions they claim to support.
|
kept private, you may want to disable this for privacy reasons.
|
||||||
|
Please note that doing so won't remove already saved data.
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="favorite-apps" type="as">
|
<key name="favorite-apps" type="as">
|
||||||
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
|
||||||
<_summary>List of desktop file IDs for favorite applications</_summary>
|
<_summary>List of desktop file IDs for favorite applications</_summary>
|
||||||
<_description>
|
<_description>
|
||||||
The applications corresponding to these identifiers
|
The applications corresponding to these identifiers
|
||||||
will be displayed in the favorites area.
|
will be displayed in the favorites area.
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="app-picker-view" type="u">
|
<key name="disabled-open-search-providers" type="as">
|
||||||
<default>0</default>
|
<default>[]</default>
|
||||||
<_summary>App Picker View</_summary>
|
<_summary>disabled OpenSearch providers</_summary>
|
||||||
<_description>
|
|
||||||
Index of the currently selected view in the application picker.
|
|
||||||
</_description>
|
|
||||||
</key>
|
</key>
|
||||||
<key name="command-history" type="as">
|
<key name="command-history" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
@ -51,38 +49,20 @@
|
|||||||
</key>
|
</key>
|
||||||
<key name="looking-glass-history" type="as">
|
<key name="looking-glass-history" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<!-- Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass -->
|
|
||||||
<_summary>History for the looking glass dialog</_summary>
|
<_summary>History for the looking glass dialog</_summary>
|
||||||
</key>
|
</key>
|
||||||
<key name="always-show-log-out" type="b">
|
<key name="saved-im-presence" type="i">
|
||||||
<default>false</default>
|
<default>1</default>
|
||||||
<_summary>Always show the 'Log out' menu item in the user menu.</_summary>
|
<_summary>Internally used to store the last IM presence explicitly set by the user. The
|
||||||
<_description>
|
value here is from the TpConnectionPresenceType enumeration.</_summary>
|
||||||
This key overrides the automatic hiding of the 'Log out'
|
|
||||||
menu item in single-user, single-session situations.
|
|
||||||
</_description>
|
|
||||||
</key>
|
</key>
|
||||||
<key name="remember-mount-password" type="b">
|
<key name="saved-session-presence" type="i">
|
||||||
<default>false</default>
|
<default>0</default>
|
||||||
<_summary>Whether to remember password for mounting encrypted or remote filesystems</_summary>
|
<_summary>Internally used to store the last session presence status for the user. The
|
||||||
<_description>
|
value here is from the GsmPresenceStatus enumeration.</_summary>
|
||||||
The shell will request a password when an encrypted device or a
|
|
||||||
remote filesystem is mounted. If the password can be saved for
|
|
||||||
future use a 'Remember Password' checkbox will be present.
|
|
||||||
This key sets the default state of the checkbox.
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
<key name="had-bluetooth-devices-setup" type="b">
|
|
||||||
<default>false</default>
|
|
||||||
<_summary>Whether the default Bluetooth adapter had set up devices associated to it</_summary>
|
|
||||||
<_description>
|
|
||||||
The shell will only show a Bluetooth menu item if a Bluetooth
|
|
||||||
adapter is powered, or if there were devices set up associated
|
|
||||||
with the default adapter. This will be reset if the default
|
|
||||||
adapter is ever seen not to have devices associated to it.
|
|
||||||
</_description>
|
|
||||||
</key>
|
</key>
|
||||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||||
|
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
||||||
</schema>
|
</schema>
|
||||||
@ -107,40 +87,13 @@
|
|||||||
Keybinding to open the application menu.
|
Keybinding to open the application menu.
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-application-view" type="as">
|
<key name="toggle-recording" type="as">
|
||||||
<default>["<Super>a"]</default>
|
<default><![CDATA[['<Control><Shift><Alt>r']]]></default>
|
||||||
<_summary>Keybinding to open the "Show Applications" view</_summary>
|
<_summary>Keybinding to toggle the screen recorder</_summary>
|
||||||
<_description>
|
<_description>
|
||||||
Keybinding to open the "Show Applications" view of the Activities
|
Keybinding to start/stop the builtin screen recorder.
|
||||||
Overview.
|
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-overview" type="as">
|
|
||||||
<default>["<Super>s"]</default>
|
|
||||||
<_summary>Keybinding to open the overview</_summary>
|
|
||||||
<_description>
|
|
||||||
Keybinding to open the Activities Overview.
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
<key name="toggle-message-tray" type="as">
|
|
||||||
<default>["<Super>v","<Super>m"]</default>
|
|
||||||
<_summary>Keybinding to toggle the visibility of the notification list</_summary>
|
|
||||||
<_description>
|
|
||||||
Keybinding to toggle the visibility of the notification list.
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
<key name="focus-active-notification" type="as">
|
|
||||||
<default>["<Super>n"]</default>
|
|
||||||
<_summary>Keybinding to focus the active notification</_summary>
|
|
||||||
<_description>
|
|
||||||
Keybinding to focus the active notification.
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
<key name="pause-resume-tweens" type="as">
|
|
||||||
<default>[]</default>
|
|
||||||
<_summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</_summary>
|
|
||||||
<_description></_description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
|
<schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
|
||||||
@ -154,87 +107,85 @@
|
|||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<schema id="org.gnome.shell.app-switcher"
|
<schema id="org.gnome.shell.recorder" path="/org/gnome/shell/recorder/"
|
||||||
path="/org/gnome/shell/app-switcher/"
|
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key type="b" name="current-workspace-only">
|
<key name="framerate" type="i">
|
||||||
<default>false</default>
|
<default>30</default>
|
||||||
<_summary>Limit switcher to current workspace.</_summary>
|
<_summary>Framerate used for recording screencasts.</_summary>
|
||||||
<_description>
|
<_description>
|
||||||
If true, only applications that have windows on the current workspace are shown in the switcher.
|
The framerate of the resulting screencast recordered
|
||||||
Otherwise, all applications are included.
|
by GNOME Shell's screencast recorder in frames-per-second.
|
||||||
|
</_description>
|
||||||
|
</key>
|
||||||
|
<key name="pipeline" type="s">
|
||||||
|
<default>''</default>
|
||||||
|
<_summary>The gstreamer pipeline used to encode the screencast</_summary>
|
||||||
|
<_description>
|
||||||
|
Sets the GStreamer pipeline used to encode recordings.
|
||||||
|
It follows the syntax used for gst-launch. The pipeline should have
|
||||||
|
an unconnected sink pad where the recorded video is recorded. It will
|
||||||
|
normally have a unconnected source pad; output from that pad
|
||||||
|
will be written into the output file. However the pipeline can also
|
||||||
|
take care of its own output - this might be used to send the output
|
||||||
|
to an icecast server via shout2send or similar. When unset or set
|
||||||
|
to an empty value, the default pipeline will be used. This is currently
|
||||||
|
'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux'
|
||||||
|
and records to WEBM using the VP8 codec. %T is used as a placeholder
|
||||||
|
for a guess at the optimal thread count on the system.
|
||||||
|
</_description>
|
||||||
|
</key>
|
||||||
|
<key name="file-extension" type="s">
|
||||||
|
<default>'webm'</default>
|
||||||
|
<_summary>File extension used for storing the screencast</_summary>
|
||||||
|
<_description>
|
||||||
|
The filename for recorded screencasts will be a unique filename
|
||||||
|
based on the current date, and use this extension. It should be
|
||||||
|
changed when recording to a different container format.
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<enum id="org.gnome.shell.window-switcher.AppIconMode">
|
<schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/">
|
||||||
<value value="1" nick="thumbnail-only"/>
|
|
||||||
<value value="2" nick="app-icon-only"/>
|
|
||||||
<value value="3" nick="both"/>
|
|
||||||
</enum>
|
|
||||||
<schema id="org.gnome.shell.window-switcher"
|
|
||||||
path="/org/gnome/shell/window-switcher/"
|
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
|
||||||
<key name="app-icon-mode" enum="org.gnome.shell.window-switcher.AppIconMode">
|
|
||||||
<default>'both'</default>
|
|
||||||
<_summary>The application icon mode.</_summary>
|
|
||||||
<_description>
|
|
||||||
Configures how the windows are shown in the switcher. Valid possibilities
|
|
||||||
are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only'
|
|
||||||
(shows only the application icon) or 'both'.
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
<key type="b" name="current-workspace-only">
|
|
||||||
<default>true</default>
|
|
||||||
<_summary>Limit switcher to current workspace.</_summary>
|
|
||||||
<_description>
|
|
||||||
If true, only windows from the current workspace are shown in the switcher.
|
|
||||||
Otherwise, all windows are included.
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
<schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/"
|
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
|
||||||
<key name="attach-modal-dialogs" type="b">
|
<key name="attach-modal-dialogs" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Attach modal dialog to the parent window</_summary>
|
<summary>Attach modal dialog to the parent window</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running
|
This key overrides the key in org.gnome.mutter when running
|
||||||
GNOME Shell.
|
GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="button-layout" type="s">
|
||||||
|
<default>":close"</default>
|
||||||
|
<summary>Arrangement of buttons on the titlebar</summary>
|
||||||
|
<description>
|
||||||
|
This key overrides the key in org.gnome.desktop.wm.preferences when
|
||||||
|
running GNOME Shell.
|
||||||
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="edge-tiling" type="b">
|
<key name="edge-tiling" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Enable edge tiling when dropping windows on screen edges</_summary>
|
<summary>Enable edge tiling when dropping windows on screen edges</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="dynamic-workspaces" type="b">
|
<key name="dynamic-workspaces" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Workspaces are managed dynamically</_summary>
|
<summary>Workspaces are managed dynamically</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="workspaces-only-on-primary" type="b">
|
<key name="workspaces-only-on-primary" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<_summary>Workspaces only on primary monitor</_summary>
|
<summary>Workspaces only on primary monitor</summary>
|
||||||
<_description>
|
<description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</_description>
|
</description>
|
||||||
</key>
|
|
||||||
|
|
||||||
<key name="focus-change-on-pointer-rest" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<_summary>Delay focus changes in mouse mode until the pointer stops moving</_summary>
|
|
||||||
<_description>
|
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
|
||||||
</_description>
|
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
<!-- With an animated background, performance will differ depending on whether
|
|
||||||
one layer or two layers are being blended together. This messes up our
|
|
||||||
benchmarks. We could just benchmark a single image, but since blended
|
|
||||||
images are present for much of the day with the GNOME default background,
|
|
||||||
we want to make sure that also performs well; for that reason we ship
|
|
||||||
an "animated" background that animates super-slowly to use during
|
|
||||||
performance tests; it will be in the blended state until 2030. -->
|
|
||||||
<background>
|
|
||||||
<starttime>
|
|
||||||
<year>1990</year>
|
|
||||||
<month>1</month>
|
|
||||||
<day>1</day>
|
|
||||||
<hour>0</hour>
|
|
||||||
<minute>00</minute>
|
|
||||||
<second>00</second>
|
|
||||||
</starttime>
|
|
||||||
|
|
||||||
<!-- One transition that takes 40 years -->
|
|
||||||
<transition type="overlay">
|
|
||||||
<duration>1261440000.0</duration>
|
|
||||||
<from>@datadir@/backgrounds/gnome/adwaita-morning.jpg</from>
|
|
||||||
<to>@datadir@/backgrounds/gnome/adwaita-day.jpg</to>
|
|
||||||
</transition>
|
|
||||||
|
|
||||||
<!-- A single slide doesn't work, so another slide for 1 minute after 40 years -->
|
|
||||||
<static>
|
|
||||||
<duration>60</duration>
|
|
||||||
<file>/usr/share/backgrounds/gnome/Sandstone.jpg</file>
|
|
||||||
</static>
|
|
||||||
|
|
||||||
</background>
|
|
@ -1 +0,0 @@
|
|||||||
gem "sass", "~> 3.4.0"
|
|
@ -1,3 +0,0 @@
|
|||||||
To generate the css files, from the project directory:
|
|
||||||
|
|
||||||
sass --sourcemap=none --update .
|
|
@ -1,36 +0,0 @@
|
|||||||
Summary
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Do not edit the CSS directly, edit the source SCSS files and process them with SASS (running
|
|
||||||
`make` should do that when you have the required software installed, as described below;
|
|
||||||
run `/.parse-sass.sh` manually if it doesn't)
|
|
||||||
* To be able to use the lates/adequate version of sass, install ruby, gem, sass & bundle.
|
|
||||||
On Fedora F20, this is done with `sudo dnf install rubygems && gem install bundle && bundle install`
|
|
||||||
from the same directory this README resides in.
|
|
||||||
|
|
||||||
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 either run the ./parse-sass.sh script or keep SASS watching for changes as you
|
|
||||||
edit. This is done by running `bundle exec sass --watch --sourcemap=none .` If sass is out of date, or is
|
|
||||||
missing, you can install it with `bundle install`.
|
|
@ -10,11 +10,11 @@
|
|||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="24"
|
width="29"
|
||||||
height="24"
|
height="29"
|
||||||
id="svg10621"
|
id="svg10621"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.91 r13725"
|
inkscape:version="0.48.2 r9819"
|
||||||
sodipodi:docname="calendar-today.svg">
|
sodipodi:docname="calendar-today.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs10623">
|
id="defs10623">
|
||||||
@ -118,6 +118,17 @@
|
|||||||
fx="51"
|
fx="51"
|
||||||
fy="30"
|
fy="30"
|
||||||
r="42" />
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3113"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
@ -126,23 +137,22 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0"
|
inkscape:pageopacity="0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="8"
|
inkscape:zoom="15.839192"
|
||||||
inkscape:cx="-23.537329"
|
inkscape:cx="20.652108"
|
||||||
inkscape:cy="-31.442864"
|
inkscape:cy="11.839084"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="true"
|
||||||
fit-margin-top="0"
|
fit-margin-top="0"
|
||||||
fit-margin-left="0"
|
fit-margin-left="0"
|
||||||
fit-margin-right="0"
|
fit-margin-right="0"
|
||||||
fit-margin-bottom="0"
|
fit-margin-bottom="0"
|
||||||
inkscape:window-width="2133"
|
inkscape:window-width="1280"
|
||||||
inkscape:window-height="1241"
|
inkscape:window-height="741"
|
||||||
inkscape:window-x="238"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="88"
|
inkscape:window-y="27"
|
||||||
inkscape:window-maximized="0"
|
inkscape:window-maximized="1"
|
||||||
borderlayer="true"
|
borderlayer="true">
|
||||||
inkscape:showpageshadow="false">
|
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid3109"
|
id="grid3109"
|
||||||
@ -159,7 +169,7 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
<dc:title />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@ -167,12 +177,28 @@
|
|||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-469.08263,-537.99307)">
|
transform="translate(-469.08263,-532.99307)">
|
||||||
<circle
|
<path
|
||||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:0.23756906;fill-rule:nonzero;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;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
sodipodi:type="arc"
|
||||||
id="path7305"
|
style="opacity:0.4625;color:#000000;fill:url(#radialGradient3113);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
cx="481.57138"
|
id="path34506-3"
|
||||||
cy="559.4649"
|
sodipodi:cx="51"
|
||||||
r="1.5" />
|
sodipodi:cy="30"
|
||||||
|
sodipodi:rx="42"
|
||||||
|
sodipodi:ry="16"
|
||||||
|
d="M 9,29.999999 A 42,16 0 0 1 93,30 l -42,0 z"
|
||||||
|
sodipodi:start="3.1415927"
|
||||||
|
sodipodi:end="6.2831853"
|
||||||
|
transform="matrix(0.43692393,0,0,1.3783114,461.29951,517.6437)"
|
||||||
|
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/motion/textures/panel.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90" />
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;fill-opacity:0.50196078;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
id="rect2996"
|
||||||
|
width="31"
|
||||||
|
height="3"
|
||||||
|
x="468.08264"
|
||||||
|
y="558.99304" />
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 6.1 KiB |
@ -14,7 +14,7 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg3199"
|
id="svg3199"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="checkbox.svg">
|
sodipodi:docname="checkbox.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs3201">
|
id="defs3201">
|
||||||
@ -132,54 +132,51 @@
|
|||||||
xlink:href="#linearGradient10597-5"
|
xlink:href="#linearGradient10597-5"
|
||||||
inkscape:collect="always" />
|
inkscape:collect="always" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
y2="-388.72955"
|
||||||
xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
|
x2="-93.031357"
|
||||||
id="linearGradient11811"
|
y1="-396.34738"
|
||||||
|
x1="-93.031357"
|
||||||
|
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.685418)"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
|
id="linearGradient14219-6"
|
||||||
x1="63.568954"
|
xlink:href="#linearGradient15404-9"
|
||||||
y1="127.16142"
|
inkscape:collect="always" />
|
||||||
x2="63.568954"
|
|
||||||
y2="152.6618" />
|
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient5581-5-2-4-6-8-7-35-8">
|
id="linearGradient15404-9"
|
||||||
|
inkscape:collect="always">
|
||||||
<stop
|
<stop
|
||||||
id="stop5583-0-92-8-0-7-6-5-1"
|
id="stop15406-6"
|
||||||
offset="0"
|
offset="0"
|
||||||
style="stop-color:#454c4c;stop-opacity:1;" />
|
style="stop-color:#515151;stop-opacity:1" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#393f3f;stop-opacity:1;"
|
id="stop15408-7"
|
||||||
offset="0.40000001"
|
|
||||||
id="stop5585-4-7-2-7-9-9-92-0" />
|
|
||||||
<stop
|
|
||||||
id="stop5587-6-7-2-0-3-1-21-5"
|
|
||||||
offset="1"
|
offset="1"
|
||||||
style="stop-color:#2d3232;stop-opacity:1;" />
|
style="stop-color:#292929;stop-opacity:1" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#a2a2a2"
|
pagecolor="#000000"
|
||||||
bordercolor="#2d2d2d"
|
bordercolor="#2d2d2d"
|
||||||
borderopacity="1"
|
borderopacity="1"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="1"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="22.627417"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="9.6447897"
|
inkscape:cx="71.516955"
|
||||||
inkscape:cy="12.591409"
|
inkscape:cy="5.8710559"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="1412"
|
inkscape:window-width="1412"
|
||||||
inkscape:window-height="1067"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="184"
|
inkscape:window-x="2635"
|
||||||
inkscape:window-y="233"
|
inkscape:window-y="226"
|
||||||
inkscape:window-maximized="0"
|
inkscape:window-maximized="0"
|
||||||
borderlayer="true"
|
borderlayer="true"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:showpageshadow="false"
|
||||||
inkscape:snap-nodes="false"
|
inkscape:snap-nodes="false"
|
||||||
inkscape:snap-bbox="true"
|
inkscape:snap-bbox="true"
|
||||||
showborder="true">
|
showborder="false">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid14843"
|
id="grid14843"
|
||||||
@ -206,56 +203,87 @@
|
|||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-342.5,-521.36218)">
|
transform="translate(-342.5,-521.36218)">
|
||||||
<g
|
<g
|
||||||
style="display:inline"
|
transform="matrix(0.80230061,0,0,0.80230061,-87.624044,-453.10297)"
|
||||||
id="use5671"
|
id="g14586-0"
|
||||||
transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
|
style="stroke-width:2.3714385;stroke-miterlimit:4;stroke-dasharray:none">
|
||||||
<rect
|
<g
|
||||||
transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
|
inkscape:export-ydpi="90"
|
||||||
rx="4.4136767"
|
inkscape:export-xdpi="90"
|
||||||
y="125.3458"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
x="50.440369"
|
transform="matrix(1.9969286,0,0,1.9969286,-397.05491,877.00482)"
|
||||||
height="29.154205"
|
id="g15291-9-6"
|
||||||
width="29.559635"
|
style="stroke-width:1.18754292;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new">
|
||||||
id="rect11803"
|
<g
|
||||||
style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#3465a4;stroke-width:1.54426003000000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
transform="translate(877.50354,-102.83507)"
|
||||||
ry="4.4233952" />
|
id="g16853-4-9"
|
||||||
<path
|
style="stroke-width:1.18754292;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new">
|
||||||
inkscape:connector-curvature="0"
|
<rect
|
||||||
id="path11809"
|
transform="scale(1,-1)"
|
||||||
d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
|
style="color:#000000;fill:url(#linearGradient14219-6);fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:1.24833274;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
id="rect6506-6"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
width="11.281681"
|
||||||
<path
|
height="11.26221"
|
||||||
sodipodi:nodetypes="csssscssc"
|
x="-409.59354"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
y="-284.40115"
|
||||||
d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
rx="1.0052766"
|
||||||
id="path11867"
|
ry="1.0052764" />
|
||||||
inkscape:connector-curvature="0" />
|
</g>
|
||||||
<path
|
</g>
|
||||||
inkscape:connector-curvature="0"
|
<g
|
||||||
id="path11869"
|
inkscape:export-ydpi="90"
|
||||||
d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
inkscape:export-xdpi="90"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
transform="translate(343.99999,987.99997)"
|
||||||
|
id="g5886-5"
|
||||||
|
style="stroke-width:2.3714385;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(0.84337,0,0,0.84337,-110.16632,-503.56182)"
|
||||||
|
id="g14586">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
|
transform="matrix(1.9969286,0,0,1.9969286,-397.05491,877.00482)"
|
||||||
|
id="g15291-9"
|
||||||
|
style="display:inline;enable-background:new">
|
||||||
|
<g
|
||||||
|
transform="translate(877.50354,-102.83507)"
|
||||||
|
id="g16853-4"
|
||||||
|
style="enable-background:new" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
|
transform="translate(343.99999,987.99997)"
|
||||||
|
id="g5886"
|
||||||
|
style="display:inline;enable-background:new">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:url(#linearGradient5891-0-4);stroke-width:7.11431503;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
d="m 198.5,240 5.25,5.25 13.98616,-14.43081"
|
||||||
|
id="path5835"
|
||||||
|
inkscape:path-effect="#path-effect5837-4-6"
|
||||||
|
inkscape:original-d="m 198.5,240 5.25,5.25 13.98616,-14.43081"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 198.5,240 5.25,5.25 13.91205,-14.31964"
|
||||||
|
inkscape:path-effect="#path-effect5837-4-6"
|
||||||
|
id="path5880"
|
||||||
|
d="m 198.5,240 5.25,5.25 13.91205,-14.31964"
|
||||||
|
style="fill:none;stroke:#4787c8;stroke-width:3.55715752;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#7ea7d3;stroke-width:1.18571913px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 197.45937,240.47455 c -0.17828,-0.29362 -0.20087,-0.67548 -0.0603,-0.98892 0.14055,-0.31344 0.43739,-0.54812 0.77144,-0.62817 0.33405,-0.08 0.69314,-0.01 0.99635,0.15175 0.30321,0.16144 0.55146,0.40727 0.79165,0.65284 l 3.66429,3.74643 12.87946,-12.98973 c 0.20796,-0.20974 0.42306,-0.41969 0.68548,-0.55522 0.26242,-0.13553 0.57293,-0.19052 0.85827,-0.11426 0.14267,0.0381 0.27708,0.10787 0.38874,0.20452 0.11167,0.0966 0.20021,0.22004 0.25479,0.35726 0.0546,0.13722 0.075,0.28793 0.0585,0.43468 -0.0165,0.14674 -0.07,0.28919 -0.15422,0.41052"
|
||||||
|
id="path5882"
|
||||||
|
inkscape:path-effect="#path-effect5884-4-7"
|
||||||
|
inkscape:original-d="m 197.45937,240.47455 c 0.65604,-0.56057 2.02485,-1.34847 2.49911,-0.8125 l 3.66429,3.74643 12.87946,-12.98973 c 0.6875,-0.6875 2.09152,0.7375 2.09152,0.7375"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csccc" />
|
||||||
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
id="rect17347"
|
|
||||||
width="21.943846"
|
|
||||||
height="21.943846"
|
|
||||||
x="342.29913"
|
|
||||||
y="521.58435" />
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="opacity:0.8;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
d="m 359.97505,524.8252 -7.88606,7.71465 -2.57155,-2.57155 -2.91442,-0.0427 0,2.35727 4.02875,3.98587 c 0.80342,0.80309 2.111,0.80309 2.91442,0 l 8.18609,-8.22894 0,-0.38573 c 0,-1.24128 0.19944,-1.76801 -0.82915,-2.29836 z"
|
|
||||||
id="rect5147-9-1-5-7-6-5-8-7"
|
|
||||||
sodipodi:nodetypes="ccccccccscc" />
|
|
||||||
<path
|
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:sans-serif;-inkscape-font-specification:sans-serif"
|
|
||||||
d="m 361.65223,524.52745 -9.5602,9.36735 -2.56345,-2.56344 -2.92846,-0.0214 0.0153,2.32639 4.02203,4.02206 c 0.80341,0.80309 2.10565,0.80309 2.90906,0 l 10.95049,-11.05765 0.003,-2.1502 z"
|
|
||||||
id="path12830-4-17-0"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cccccccccc" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
@ -14,10 +14,22 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg3199"
|
id="svg3199"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="checkbox-off.svg">
|
sodipodi:docname="checkbox-off.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs3201">
|
id="defs3201">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient15404"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop15406"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#515151;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop15408"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#292929;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
sodipodi:type="inkscape:persp3d"
|
sodipodi:type="inkscape:persp3d"
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
@ -44,6 +56,16 @@
|
|||||||
effect="spiro"
|
effect="spiro"
|
||||||
id="path-effect5884-4-7"
|
id="path-effect5884-4-7"
|
||||||
is_visible="true" />
|
is_visible="true" />
|
||||||
|
<linearGradient
|
||||||
|
y2="-388.72955"
|
||||||
|
x2="-93.031357"
|
||||||
|
y1="-396.34738"
|
||||||
|
x1="-93.031357"
|
||||||
|
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.685418)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient14219"
|
||||||
|
xlink:href="#linearGradient15404"
|
||||||
|
inkscape:collect="always" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
id="linearGradient10013-4-63-6">
|
id="linearGradient10013-4-63-6">
|
||||||
@ -88,55 +110,30 @@
|
|||||||
id="linearGradient15376"
|
id="linearGradient15376"
|
||||||
xlink:href="#linearGradient10597-5"
|
xlink:href="#linearGradient10597-5"
|
||||||
inkscape:collect="always" />
|
inkscape:collect="always" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
|
|
||||||
id="linearGradient11811"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
|
|
||||||
x1="63.568954"
|
|
||||||
y1="127.16142"
|
|
||||||
x2="63.568954"
|
|
||||||
y2="152.6618" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient5581-5-2-4-6-8-7-35-8">
|
|
||||||
<stop
|
|
||||||
id="stop5583-0-92-8-0-7-6-5-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#454c4c;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#393f3f;stop-opacity:1;"
|
|
||||||
offset="0.40000001"
|
|
||||||
id="stop5585-4-7-2-7-9-9-92-0" />
|
|
||||||
<stop
|
|
||||||
id="stop5587-6-7-2-0-3-1-21-5"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#2d3232;stop-opacity:1;" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#a2a2a2"
|
pagecolor="#000000"
|
||||||
bordercolor="#2d2d2d"
|
bordercolor="#2d2d2d"
|
||||||
borderopacity="1"
|
borderopacity="1"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="1"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="5.6568542"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="19.79113"
|
inkscape:cx="6.1225392"
|
||||||
inkscape:cy="11.232334"
|
inkscape:cy="3.6003241"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="1412"
|
inkscape:window-width="1412"
|
||||||
inkscape:window-height="1067"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="184"
|
inkscape:window-x="2116"
|
||||||
inkscape:window-y="233"
|
inkscape:window-y="261"
|
||||||
inkscape:window-maximized="0"
|
inkscape:window-maximized="0"
|
||||||
borderlayer="true"
|
borderlayer="true"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:showpageshadow="false"
|
||||||
inkscape:snap-nodes="false"
|
inkscape:snap-nodes="false"
|
||||||
inkscape:snap-bbox="true"
|
inkscape:snap-bbox="true"
|
||||||
showborder="true">
|
showborder="false">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid14843"
|
id="grid14843"
|
||||||
@ -163,44 +160,39 @@
|
|||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-342.5,-521.36218)">
|
transform="translate(-342.5,-521.36218)">
|
||||||
<g
|
<g
|
||||||
style="display:inline"
|
transform="matrix(0.80230061,0,0,0.80230061,-87.624044,-453.10297)"
|
||||||
id="use5671"
|
id="g14586"
|
||||||
transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
|
style="stroke-width:2.3714385;stroke-miterlimit:4;stroke-dasharray:none">
|
||||||
<rect
|
<g
|
||||||
transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
|
inkscape:export-ydpi="90"
|
||||||
rx="4.4136767"
|
inkscape:export-xdpi="90"
|
||||||
y="125.3458"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
x="50.440369"
|
transform="matrix(1.9969286,0,0,1.9969286,-397.05491,877.00482)"
|
||||||
height="29.154205"
|
id="g15291-9"
|
||||||
width="29.559635"
|
style="stroke-width:1.18754292;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new">
|
||||||
id="rect11803"
|
<g
|
||||||
style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#3465a4;stroke-width:1.54426003000000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
transform="translate(877.50354,-102.83507)"
|
||||||
ry="4.4233952" />
|
id="g16853-4"
|
||||||
<path
|
style="stroke-width:1.18754292;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new">
|
||||||
inkscape:connector-curvature="0"
|
<rect
|
||||||
id="path11809"
|
transform="scale(1,-1)"
|
||||||
d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
|
style="color:#000000;fill:url(#linearGradient14219);fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:1.24833274;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
id="rect6506-6"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
width="11.281681"
|
||||||
<path
|
height="11.26221"
|
||||||
sodipodi:nodetypes="csssscssc"
|
x="-409.59354"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
y="-284.40115"
|
||||||
d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
rx="1.0052766"
|
||||||
id="path11867"
|
ry="1.0052764" />
|
||||||
inkscape:connector-curvature="0" />
|
</g>
|
||||||
<path
|
</g>
|
||||||
inkscape:connector-curvature="0"
|
<g
|
||||||
id="path11869"
|
inkscape:export-ydpi="90"
|
||||||
d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
inkscape:export-xdpi="90"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
transform="translate(343.99999,987.99997)"
|
||||||
|
id="g5886"
|
||||||
|
style="stroke-width:2.3714385;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new" />
|
||||||
</g>
|
</g>
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
id="rect17347"
|
|
||||||
width="21.943846"
|
|
||||||
height="21.943846"
|
|
||||||
x="342.29913"
|
|
||||||
y="521.58435" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 6.5 KiB |
@ -14,10 +14,22 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg3199"
|
id="svg3199"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="checkbox-focused.svg">
|
sodipodi:docname="checkbox.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs3201">
|
id="defs3201">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient15404"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop15406"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#515151;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop15408"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#292929;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
sodipodi:type="inkscape:persp3d"
|
sodipodi:type="inkscape:persp3d"
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
@ -32,6 +44,27 @@
|
|||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
sodipodi:type="inkscape:persp3d" />
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient5872-5-1"
|
||||||
|
id="linearGradient5891-0-4"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="205.84143"
|
||||||
|
y1="246.7094"
|
||||||
|
x2="206.74803"
|
||||||
|
y2="231.24142" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient5872-5-1">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#0b2e52;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop5874-4-4" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#1862af;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop5876-0-5" />
|
||||||
|
</linearGradient>
|
||||||
<inkscape:path-effect
|
<inkscape:path-effect
|
||||||
effect="spiro"
|
effect="spiro"
|
||||||
id="path-effect5837-4-6"
|
id="path-effect5837-4-6"
|
||||||
@ -44,6 +77,16 @@
|
|||||||
effect="spiro"
|
effect="spiro"
|
||||||
id="path-effect5884-4-7"
|
id="path-effect5884-4-7"
|
||||||
is_visible="true" />
|
is_visible="true" />
|
||||||
|
<linearGradient
|
||||||
|
y2="-388.72955"
|
||||||
|
x2="-93.031357"
|
||||||
|
y1="-396.34738"
|
||||||
|
x1="-93.031357"
|
||||||
|
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.685418)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient14219"
|
||||||
|
xlink:href="#linearGradient15404"
|
||||||
|
inkscape:collect="always" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
id="linearGradient10013-4-63-6">
|
id="linearGradient10013-4-63-6">
|
||||||
@ -88,55 +131,30 @@
|
|||||||
id="linearGradient15376"
|
id="linearGradient15376"
|
||||||
xlink:href="#linearGradient10597-5"
|
xlink:href="#linearGradient10597-5"
|
||||||
inkscape:collect="always" />
|
inkscape:collect="always" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
|
|
||||||
id="linearGradient11811"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
|
|
||||||
x1="63.568954"
|
|
||||||
y1="127.16142"
|
|
||||||
x2="63.568954"
|
|
||||||
y2="152.6618" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient5581-5-2-4-6-8-7-35-8">
|
|
||||||
<stop
|
|
||||||
id="stop5583-0-92-8-0-7-6-5-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#454c4c;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#393f3f;stop-opacity:1;"
|
|
||||||
offset="0.40000001"
|
|
||||||
id="stop5585-4-7-2-7-9-9-92-0" />
|
|
||||||
<stop
|
|
||||||
id="stop5587-6-7-2-0-3-1-21-5"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#2d3232;stop-opacity:1;" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#a2a2a2"
|
pagecolor="#000000"
|
||||||
bordercolor="#2d2d2d"
|
bordercolor="#2d2d2d"
|
||||||
borderopacity="1"
|
borderopacity="1"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="1"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="4"
|
||||||
inkscape:cx="9.6447897"
|
inkscape:cx="71.247925"
|
||||||
inkscape:cy="12.591409"
|
inkscape:cy="33.339093"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="1412"
|
inkscape:window-width="1412"
|
||||||
inkscape:window-height="1067"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="184"
|
inkscape:window-x="2116"
|
||||||
inkscape:window-y="233"
|
inkscape:window-y="261"
|
||||||
inkscape:window-maximized="0"
|
inkscape:window-maximized="0"
|
||||||
borderlayer="true"
|
borderlayer="true"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:showpageshadow="false"
|
||||||
inkscape:snap-nodes="false"
|
inkscape:snap-nodes="false"
|
||||||
inkscape:snap-bbox="true"
|
inkscape:snap-bbox="true"
|
||||||
showborder="true">
|
showborder="false">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid14843"
|
id="grid14843"
|
||||||
@ -163,44 +181,38 @@
|
|||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-342.5,-521.36218)">
|
transform="translate(-342.5,-521.36218)">
|
||||||
<g
|
<g
|
||||||
style="display:inline"
|
transform="matrix(0.84337,0,0,0.84337,-110.16632,-503.56182)"
|
||||||
id="use5671"
|
id="g14586">
|
||||||
transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
|
<g
|
||||||
<rect
|
inkscape:export-ydpi="90"
|
||||||
transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
|
inkscape:export-xdpi="90"
|
||||||
rx="4.4136767"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
y="125.3458"
|
transform="matrix(1.9969286,0,0,1.9969286,-397.05491,877.00482)"
|
||||||
x="50.440369"
|
id="g15291-9"
|
||||||
height="29.154205"
|
style="display:inline;enable-background:new">
|
||||||
width="29.559635"
|
<g
|
||||||
id="rect11803"
|
transform="translate(877.50354,-102.83507)"
|
||||||
style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#1c1f1f;stroke-width:1.54426003;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
id="g16853-4"
|
||||||
ry="4.4233952" />
|
style="enable-background:new">
|
||||||
<path
|
<rect
|
||||||
inkscape:connector-curvature="0"
|
transform="scale(1,-1)"
|
||||||
id="path11809"
|
style="color:#000000;fill:url(#linearGradient14219);fill-opacity:1;fill-rule:nonzero;stroke:#868686;stroke-width:0.59377144999999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||||
d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
|
id="rect6506-6"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
width="11.281681"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
height="11.26221"
|
||||||
<path
|
x="-409.59354"
|
||||||
sodipodi:nodetypes="csssscssc"
|
y="-284.40115"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
rx="0.95632279"
|
||||||
d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
ry="0.95632273" />
|
||||||
id="path11867"
|
</g>
|
||||||
inkscape:connector-curvature="0" />
|
</g>
|
||||||
<path
|
<g
|
||||||
inkscape:connector-curvature="0"
|
inkscape:export-ydpi="90"
|
||||||
id="path11869"
|
inkscape:export-xdpi="90"
|
||||||
d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
transform="translate(343.99999,987.99997)"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
id="g5886"
|
||||||
|
style="display:inline;enable-background:new" />
|
||||||
</g>
|
</g>
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
id="rect17347"
|
|
||||||
width="21.943846"
|
|
||||||
height="21.943846"
|
|
||||||
x="342.29913"
|
|
||||||
y="521.58435" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 6.8 KiB |
@ -14,8 +14,8 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg3199"
|
id="svg3199"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="checkbox.svg">
|
sodipodi:docname="checkbox-focused.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs3201">
|
id="defs3201">
|
||||||
<linearGradient
|
<linearGradient
|
||||||
@ -131,55 +131,30 @@
|
|||||||
id="linearGradient15376"
|
id="linearGradient15376"
|
||||||
xlink:href="#linearGradient10597-5"
|
xlink:href="#linearGradient10597-5"
|
||||||
inkscape:collect="always" />
|
inkscape:collect="always" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient5581-5-2-4-6-8-7-35-8"
|
|
||||||
id="linearGradient11811"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(3.0317573,0,0,1.0053174,-102.66338,-0.82153381)"
|
|
||||||
x1="63.568954"
|
|
||||||
y1="127.16142"
|
|
||||||
x2="63.568954"
|
|
||||||
y2="152.6618" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient5581-5-2-4-6-8-7-35-8">
|
|
||||||
<stop
|
|
||||||
id="stop5583-0-92-8-0-7-6-5-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#454c4c;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#393f3f;stop-opacity:1;"
|
|
||||||
offset="0.40000001"
|
|
||||||
id="stop5585-4-7-2-7-9-9-92-0" />
|
|
||||||
<stop
|
|
||||||
id="stop5587-6-7-2-0-3-1-21-5"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#2d3232;stop-opacity:1;" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#a2a2a2"
|
pagecolor="#000000"
|
||||||
bordercolor="#2d2d2d"
|
bordercolor="#2d2d2d"
|
||||||
borderopacity="1"
|
borderopacity="1"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="1"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="-0.17876005"
|
inkscape:cx="64.516955"
|
||||||
inkscape:cy="11.944326"
|
inkscape:cy="13.871056"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="1412"
|
||||||
inkscape:window-height="1375"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="2635"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="226"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="0"
|
||||||
borderlayer="true"
|
borderlayer="true"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:showpageshadow="false"
|
||||||
inkscape:snap-nodes="false"
|
inkscape:snap-nodes="false"
|
||||||
inkscape:snap-bbox="true"
|
inkscape:snap-bbox="true"
|
||||||
showborder="true">
|
showborder="false">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid14843"
|
id="grid14843"
|
||||||
@ -196,7 +171,7 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title />
|
<dc:title></dc:title>
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@ -206,56 +181,63 @@
|
|||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-342.5,-521.36218)">
|
transform="translate(-342.5,-521.36218)">
|
||||||
<g
|
<g
|
||||||
style="display:inline"
|
transform="matrix(0.84337,0,0,0.84337,-110.16632,-503.56182)"
|
||||||
id="use5671"
|
id="g14586">
|
||||||
transform="matrix(1.3594109,0,0,1.3564242,319.2059,481.99447)">
|
<g
|
||||||
<rect
|
inkscape:export-ydpi="90"
|
||||||
transform="matrix(0.47304779,0,0,0.4807373,-6.3607039,-29.396216)"
|
inkscape:export-xdpi="90"
|
||||||
rx="4.4136767"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
y="125.3458"
|
transform="matrix(1.9969286,0,0,1.9969286,-397.05491,877.00482)"
|
||||||
x="50.440369"
|
id="g15291-9"
|
||||||
height="29.154205"
|
style="display:inline;enable-background:new">
|
||||||
width="29.559635"
|
<g
|
||||||
id="rect11803"
|
transform="translate(877.50354,-102.83507)"
|
||||||
style="color:#000000;fill:url(#linearGradient11811);fill-opacity:1;stroke:#1c1f1f;stroke-width:1.54426003;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
id="g16853-4"
|
||||||
ry="4.4233952" />
|
style="enable-background:new">
|
||||||
<path
|
<rect
|
||||||
inkscape:connector-curvature="0"
|
transform="scale(1,-1)"
|
||||||
id="path11809"
|
style="color:#000000;fill:url(#linearGradient14219);fill-opacity:1;fill-rule:nonzero;stroke:#868686;stroke-width:0.59377144999999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||||
d="m 17.87105,33.844107 0,-0.773112 c 0,-1.031264 0.807171,-1.836142 1.811982,-1.836142 l 9.612456,0 c 1.004811,0 1.787822,0.804878 1.787822,1.836142 l 0,0.773112 c 0,-1.031264 -0.783011,-1.836142 -1.787822,-1.836142 l -9.612456,0 c -1.004811,0 -1.811982,0.804878 -1.811982,1.836142 z"
|
id="rect6506-6"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
width="11.281681"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
height="11.26221"
|
||||||
<path
|
x="-409.59354"
|
||||||
sodipodi:nodetypes="csssscssc"
|
y="-284.40115"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
rx="0.95632279"
|
||||||
d="m 17.87105,41.158551 0,0.773112 c 0,1.031264 0.807171,1.836142 1.811982,1.836142 l 9.612456,0 c 1.004811,0 1.787822,-0.804878 1.787822,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
ry="0.95632273" />
|
||||||
id="path11867"
|
</g>
|
||||||
inkscape:connector-curvature="0" />
|
</g>
|
||||||
<path
|
<g
|
||||||
inkscape:connector-curvature="0"
|
inkscape:export-ydpi="90"
|
||||||
id="path11869"
|
inkscape:export-xdpi="90"
|
||||||
d="m 17.87105,41.895784 0,0.773112 c 0,1.031264 0.644622,1.836142 1.649433,1.836142 l 10.067593,0 c 1.004811,0 1.495234,-0.804878 1.495234,-1.836142 l 0,-0.773112 c 0,1.031264 -0.783011,1.836142 -1.787822,1.836142 l -9.612456,0 c -1.004811,0 -1.811982,-0.804878 -1.811982,-1.836142 z"
|
inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.15;color:#000000;fill:#000000;fill-opacity:0.85253451;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
transform="translate(343.99999,987.99997)"
|
||||||
sodipodi:nodetypes="csssscssc" />
|
id="g5886"
|
||||||
|
style="display:inline;enable-background:new">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:url(#linearGradient5891-0-4);stroke-width:7.11431503;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
d="m 198.5,240 5.25,5.25 13.98616,-14.43081"
|
||||||
|
id="path5835"
|
||||||
|
inkscape:path-effect="#path-effect5837-4-6"
|
||||||
|
inkscape:original-d="m 198.5,240 5.25,5.25 13.98616,-14.43081"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 198.5,240 5.25,5.25 13.91205,-14.31964"
|
||||||
|
inkscape:path-effect="#path-effect5837-4-6"
|
||||||
|
id="path5880"
|
||||||
|
d="m 198.5,240 5.25,5.25 13.91205,-14.31964"
|
||||||
|
style="fill:none;stroke:#4787c8;stroke-width:3.55715752;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#7ea7d3;stroke-width:1.18571913px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 197.45937,240.47455 c -0.17828,-0.29362 -0.20087,-0.67548 -0.0603,-0.98892 0.14055,-0.31344 0.43739,-0.54812 0.77144,-0.62817 0.33405,-0.08 0.69314,-0.01 0.99635,0.15175 0.30321,0.16144 0.55146,0.40727 0.79165,0.65284 l 3.66429,3.74643 12.87946,-12.98973 c 0.20796,-0.20974 0.42306,-0.41969 0.68548,-0.55522 0.26242,-0.13553 0.57293,-0.19052 0.85827,-0.11426 0.14267,0.0381 0.27708,0.10787 0.38874,0.20452 0.11167,0.0966 0.20021,0.22004 0.25479,0.35726 0.0546,0.13722 0.075,0.28793 0.0585,0.43468 -0.0165,0.14674 -0.07,0.28919 -0.15422,0.41052"
|
||||||
|
id="path5882"
|
||||||
|
inkscape:path-effect="#path-effect5884-4-7"
|
||||||
|
inkscape:original-d="m 197.45937,240.47455 c 0.65604,-0.56057 2.02485,-1.34847 2.49911,-0.8125 l 3.66429,3.74643 12.87946,-12.98973 c 0.6875,-0.6875 2.09152,0.7375 2.09152,0.7375"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csccc" />
|
||||||
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
id="rect17347"
|
|
||||||
width="21.943846"
|
|
||||||
height="21.943846"
|
|
||||||
x="342.29913"
|
|
||||||
y="521.58435" />
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="opacity:0.8;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
d="m 359.97505,524.8252 -7.88606,7.71465 -2.57155,-2.57155 -2.91442,-0.0427 0,2.35727 4.02875,3.98587 c 0.80342,0.80309 2.111,0.80309 2.91442,0 l 8.18609,-8.22894 0,-0.38573 c 0,-1.24128 0.19944,-1.76801 -0.82915,-2.29836 z"
|
|
||||||
id="rect5147-9-1-5-7-6-5-8-7"
|
|
||||||
sodipodi:nodetypes="ccccccccscc" />
|
|
||||||
<path
|
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:sans-serif;-inkscape-font-specification:sans-serif"
|
|
||||||
d="m 361.65223,524.52745 -9.5602,9.36735 -2.56345,-2.56344 -2.92846,-0.0214 0.0153,2.32639 4.02203,4.02206 c 0.80341,0.80309 2.10565,0.80309 2.90906,0 l 10.95049,-11.05765 0.003,-2.1502 z"
|
|
||||||
id="path12830-4-17-0"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cccccccccc" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 8.8 KiB |
@ -1,14 +0,0 @@
|
|||||||
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
|
|
||||||
@import "gnome-shell-sass/_drawing";
|
|
||||||
@import "gnome-shell-sass/_common";
|
|
||||||
|
|
||||||
//force symbolic icons
|
|
||||||
stage {
|
|
||||||
-st-icon-style: symbolic;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toggle-switch { width: 48px; }
|
|
||||||
.toggle-switch-us, .toggle-switch-intl {
|
|
||||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg");
|
|
||||||
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
$variant: 'dark';
|
|
||||||
|
|
||||||
@import "gnome-shell-sass/_colors"; //use gtk colors
|
|
||||||
@import "gnome-shell-sass/_drawing";
|
|
||||||
@import "gnome-shell-sass/_common";
|
|
@ -1,114 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
id="svg12430"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.4 r9939"
|
|
||||||
sodipodi:docname="more-results.svg">
|
|
||||||
<defs
|
|
||||||
id="defs12432" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#7a7a7a"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="90.509668"
|
|
||||||
inkscape:cx="6.5009792"
|
|
||||||
inkscape:cy="8.3589595"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g14642-3-0"
|
|
||||||
showgrid="false"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:window-width="1440"
|
|
||||||
inkscape:window-height="840"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid13002" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata12435">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(0,-1036.3622)">
|
|
||||||
<g
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-141.99984,638.37113)"
|
|
||||||
inkscape:label="zoom-in"
|
|
||||||
id="g14642-3-0">
|
|
||||||
<path
|
|
||||||
sodipodi:type="inkscape:offset"
|
|
||||||
inkscape:radius="0"
|
|
||||||
inkscape:original="M 145.1875 400 C 144.5248 400 144 400.54899 144 401.21875 L 144 410.78125 C 144 411.45101 144.5248 412 145.1875 412 L 154.8125 412 C 155.4752 412 156 411.45101 156 410.78125 L 156 401.21875 C 156 400.54899 155.4752 400 154.8125 400 L 145.1875 400 z M 149 403 L 151 403 L 151 405 L 153 405 L 153 407 L 151 407 L 151 409 L 149 409 L 149 407 L 147 407 L 147 405 L 149 405 L 149 403 z "
|
|
||||||
xlink:href="#rect11749-5-0-1-8"
|
|
||||||
style="color:#bebebe;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;opacity:0.8"
|
|
||||||
id="path13004"
|
|
||||||
inkscape:href="#rect11749-5-0-1-8"
|
|
||||||
d="M 145.1875,400 C 144.5248,400 144,400.54899 144,401.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 C 156,400.54899 155.4752,400 154.8125,400 L 145.1875,400 z m 3.8125,3 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 L 149,403 Z"
|
|
||||||
transform="translate(0,1)" />
|
|
||||||
<use
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
xlink:href="#path13004"
|
|
||||||
id="use11960"
|
|
||||||
transform="translate(1,-1)"
|
|
||||||
width="16"
|
|
||||||
height="16" />
|
|
||||||
<use
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
xlink:href="#use11960"
|
|
||||||
id="use11962"
|
|
||||||
transform="translate(-2,0)"
|
|
||||||
width="16"
|
|
||||||
height="16" />
|
|
||||||
<path
|
|
||||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
|
||||||
d="M 7 5 L 7 7 L 5 7 L 5 9 L 7 9 L 7 11 L 9 11 L 9 9 L 11 9 L 11 7 L 9 7 L 9 5 L 7 5 z "
|
|
||||||
transform="translate(141.99984,397.99107)"
|
|
||||||
id="rect3757" />
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="color:#bebebe;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
|
|
||||||
d="M 145.1875,400 C 144.5248,400 144,400.54899 144,401.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 C 156,400.54899 155.4752,400 154.8125,400 L 145.1875,400 z m 3.8125,3 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 L 149,403 Z"
|
|
||||||
id="rect11749-5-0-1-8" />
|
|
||||||
<rect
|
|
||||||
style="fill:none;stroke:none"
|
|
||||||
id="rect3620-5-4"
|
|
||||||
width="15.981825"
|
|
||||||
height="16"
|
|
||||||
x="142"
|
|
||||||
y="398"
|
|
||||||
rx="0"
|
|
||||||
ry="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.4 KiB |
@ -1,119 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="64px"
|
|
||||||
height="64px"
|
|
||||||
id="svg3471"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.5 r10040"
|
|
||||||
sodipodi:docname="New document 5">
|
|
||||||
<defs
|
|
||||||
id="defs3473" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="5.5"
|
|
||||||
inkscape:cx="32"
|
|
||||||
inkscape:cy="32"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:window-width="1461"
|
|
||||||
inkscape:window-height="772"
|
|
||||||
inkscape:window-x="37"
|
|
||||||
inkscape:window-y="64"
|
|
||||||
inkscape:window-maximized="0" />
|
|
||||||
<metadata
|
|
||||||
id="metadata3476">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer">
|
|
||||||
<g
|
|
||||||
transform="matrix(4,0,0,4,1.9999997,2.3636364)"
|
|
||||||
id="g19145"
|
|
||||||
style="fill:#bebebe;fill-opacity:1;display:inline">
|
|
||||||
<g
|
|
||||||
id="g19147"
|
|
||||||
inkscape:label="status"
|
|
||||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
<g
|
|
||||||
style="fill:#bebebe;fill-opacity:1"
|
|
||||||
id="g19149"
|
|
||||||
inkscape:label="devices"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
<g
|
|
||||||
style="fill:#bebebe;fill-opacity:1"
|
|
||||||
id="g19151"
|
|
||||||
inkscape:label="apps"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
<g
|
|
||||||
style="fill:#bebebe;fill-opacity:1"
|
|
||||||
id="g19153"
|
|
||||||
inkscape:label="places"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
<g
|
|
||||||
style="fill:#bebebe;fill-opacity:1"
|
|
||||||
id="g19155"
|
|
||||||
inkscape:label="mimetypes"
|
|
||||||
transform="translate(-541.0002,-301)">
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
d="m 543.0002,301 c -1.05237,0 -2,0.84508 -2,1.9375 l 0,11.125 c 0,1.09242 0.94763,1.9375 2,1.9375 l 11,0 c 1.05237,0 2,-0.84508 2,-1.9375 l 0,-11.125 c 0,-1.09242 -0.94763,-1.9375 -2,-1.9375 l -11,0 z m 0,5 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z m -8,3 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z m -8,3 3.03125,0 0,2 -3.03125,0 0,-2 z m 4.03125,0 2.96875,0 0,2 -2.96875,0 0,-2 z m 3.96875,0 3,0 0,2 -3,0 0,-2 z"
|
|
||||||
id="path19157"
|
|
||||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans" />
|
|
||||||
<rect
|
|
||||||
height="1.9999993"
|
|
||||||
id="rect19159"
|
|
||||||
style="opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
width="2.9999993"
|
|
||||||
x="551.00018"
|
|
||||||
y="309" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g19161"
|
|
||||||
inkscape:label="emblems"
|
|
||||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
<g
|
|
||||||
id="g19163"
|
|
||||||
inkscape:label="emotes"
|
|
||||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
<g
|
|
||||||
id="g19165"
|
|
||||||
inkscape:label="categories"
|
|
||||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
<g
|
|
||||||
id="g19167"
|
|
||||||
inkscape:label="actions"
|
|
||||||
style="fill:#bebebe;fill-opacity:1;display:inline"
|
|
||||||
transform="translate(-541.0002,-301)" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.7 KiB |
@ -1,114 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="64px"
|
|
||||||
height="64px"
|
|
||||||
id="svg3393"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.5 r10040"
|
|
||||||
sodipodi:docname="New document 2">
|
|
||||||
<defs
|
|
||||||
id="defs3395" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="5.5"
|
|
||||||
inkscape:cx="32"
|
|
||||||
inkscape:cy="32"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:window-width="697"
|
|
||||||
inkscape:window-height="613"
|
|
||||||
inkscape:window-x="100"
|
|
||||||
inkscape:window-y="77"
|
|
||||||
inkscape:window-maximized="0" />
|
|
||||||
<metadata
|
|
||||||
id="metadata3398">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer">
|
|
||||||
<g
|
|
||||||
style="display:inline"
|
|
||||||
transform="matrix(4,0,0,4,0.29733827,-0.35415646)"
|
|
||||||
id="g19245">
|
|
||||||
<g
|
|
||||||
id="g19247"
|
|
||||||
inkscape:label="status"
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
<g
|
|
||||||
id="g19249"
|
|
||||||
inkscape:label="devices"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
<g
|
|
||||||
id="g19251"
|
|
||||||
inkscape:label="apps"
|
|
||||||
transform="translate(-323.02908,-649.02581)">
|
|
||||||
<path
|
|
||||||
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"
|
|
||||||
id="path19253"
|
|
||||||
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" />
|
|
||||||
<path
|
|
||||||
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"
|
|
||||||
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" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g19257"
|
|
||||||
inkscape:label="places"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
<g
|
|
||||||
id="g19259"
|
|
||||||
inkscape:label="mimetypes"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
<g
|
|
||||||
id="g19261"
|
|
||||||
inkscape:label="emblems"
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
<g
|
|
||||||
id="g19263"
|
|
||||||
inkscape:label="emotes"
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
<g
|
|
||||||
id="g19265"
|
|
||||||
inkscape:label="categories"
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
<g
|
|
||||||
id="g19267"
|
|
||||||
inkscape:label="actions"
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-323.02908,-649.02581)" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 6.1 KiB |
@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="18"
|
|
||||||
height="18"
|
|
||||||
id="svg4703"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.4 r9939"
|
|
||||||
sodipodi:docname="page-indicator-active.svg">
|
|
||||||
<defs
|
|
||||||
id="defs4705" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="22.197802"
|
|
||||||
inkscape:cx="2.1522887"
|
|
||||||
inkscape:cy="16.782904"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
inkscape:window-height="1021"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata4708">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,2)">
|
|
||||||
<path
|
|
||||||
transform="matrix(0.72823872,0,0,0.8336417,-1512.2872,-525.55618)"
|
|
||||||
d="m 2099.9808,638.83099 c 0,5.29998 -4.9184,9.59645 -10.9854,9.59645 -6.0671,0 -10.9854,-4.29647 -10.9854,-9.59645 0,-5.29997 4.9183,-9.59645 10.9854,-9.59645 6.067,0 10.9854,4.29648 10.9854,9.59645 z"
|
|
||||||
sodipodi:ry="9.5964489"
|
|
||||||
sodipodi:rx="10.985409"
|
|
||||||
sodipodi:cy="638.83099"
|
|
||||||
sodipodi:cx="2088.9954"
|
|
||||||
id="path4711"
|
|
||||||
style="fill:#fdffff;fill-opacity:0.94117647;stroke:none"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.1 KiB |
@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="18"
|
|
||||||
height="18"
|
|
||||||
id="svg5266"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.4 r9939"
|
|
||||||
sodipodi:docname="page-indicator-inactive.svg">
|
|
||||||
<defs
|
|
||||||
id="defs5268" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="11.313709"
|
|
||||||
inkscape:cx="-2.307566"
|
|
||||||
inkscape:cy="17.859535"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1374"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata5271">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,2)">
|
|
||||||
<path
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:2.93356276000000005;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
|
||||||
id="path5274"
|
|
||||||
sodipodi:cx="2088.9954"
|
|
||||||
sodipodi:cy="638.83099"
|
|
||||||
sodipodi:rx="10.985409"
|
|
||||||
sodipodi:ry="9.5964489"
|
|
||||||
d="m 2099.9808,638.83099 c 0,5.29998 -4.9184,9.59645 -10.9854,9.59645 -6.0671,0 -10.9854,-4.29647 -10.9854,-9.59645 0,-5.29997 4.9183,-9.59645 10.9854,-9.59645 6.067,0 10.9854,4.29648 10.9854,9.59645 z"
|
|
||||||
transform="matrix(0.63720887,0,0,0.72943648,-1322.1264,-458.98661)" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.2 KiB |
@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="18"
|
|
||||||
height="18"
|
|
||||||
id="svg5266"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.48.4 r9939"
|
|
||||||
sodipodi:docname="page-indicator-inactive.svg">
|
|
||||||
<defs
|
|
||||||
id="defs5268" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="11.313709"
|
|
||||||
inkscape:cx="-2.307566"
|
|
||||||
inkscape:cy="17.859535"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1374"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata5271">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,2)">
|
|
||||||
<path
|
|
||||||
sodipodi:type="arc"
|
|
||||||
style="fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:2.93356276000000005;stroke-miterlimit:4;stroke-opacity:0.39215686000000000;stroke-dasharray:none"
|
|
||||||
id="path5274"
|
|
||||||
sodipodi:cx="2088.9954"
|
|
||||||
sodipodi:cy="638.83099"
|
|
||||||
sodipodi:rx="10.985409"
|
|
||||||
sodipodi:ry="9.5964489"
|
|
||||||
d="m 2099.9808,638.83099 c 0,5.29998 -4.9184,9.59645 -10.9854,9.59645 -6.0671,0 -10.9854,-4.29647 -10.9854,-9.59645 0,-5.29997 4.9183,-9.59645 10.9854,-9.59645 6.067,0 10.9854,4.29648 10.9854,9.59645 z"
|
|
||||||
transform="matrix(0.63720887,0,0,0.72943648,-1322.1264,-458.98661)" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.2 KiB |
@ -9,63 +9,66 @@
|
|||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="18"
|
width="17"
|
||||||
height="18"
|
height="10"
|
||||||
id="svg4703"
|
id="svg2"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.4 r9939"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="page-indicator-pushed.svg">
|
sodipodi:docname="panel-button-border.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs4705" />
|
id="defs4" />
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#ffffff"
|
pagecolor="#000000"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="31.392433"
|
inkscape:zoom="44.8"
|
||||||
inkscape:cx="1.0245308"
|
inkscape:cx="8.6594891"
|
||||||
inkscape:cy="13.3715"
|
inkscape:cy="5.7029946"
|
||||||
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="true"
|
showgrid="true"
|
||||||
inkscape:grid-bbox="true"
|
showguides="true"
|
||||||
inkscape:document-units="px"
|
inkscape:guide-bbox="true"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="1440"
|
||||||
inkscape:window-height="1374"
|
inkscape:window-height="843"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="26"
|
||||||
inkscape:window-maximized="1">
|
inkscape:window-maximized="1"
|
||||||
|
guidetolerance="10000"
|
||||||
|
objecttolerance="10000">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid6140" />
|
id="grid3792"
|
||||||
|
empspacing="10"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" />
|
||||||
</sodipodi:namedview>
|
</sodipodi:namedview>
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata4708">
|
id="metadata7">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
<cc:Work
|
<cc:Work
|
||||||
rdf:about="">
|
rdf:about="">
|
||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
<dc:title />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
<g
|
<g
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
transform="translate(0,2)">
|
id="layer1">
|
||||||
<path
|
<rect
|
||||||
transform="matrix(0.54617904,0,0,0.62523128,-1131.9904,-392.39214)"
|
style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
d="m 2099.9808,638.83099 a 10.985409,9.5964489 0 1 1 -21.9708,0 10.985409,9.5964489 0 1 1 21.9708,0 z"
|
id="rect3796"
|
||||||
sodipodi:ry="9.5964489"
|
width="7"
|
||||||
sodipodi:rx="10.985409"
|
height="2"
|
||||||
sodipodi:cy="638.83099"
|
x="5"
|
||||||
sodipodi:cx="2088.9954"
|
y="8" />
|
||||||
id="path4711"
|
|
||||||
style="fill:#fdffff;fill-opacity:1;stroke:none"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.0 KiB |
111
data/theme/panel-button-highlight-narrow.svg
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="30"
|
||||||
|
height="25"
|
||||||
|
id="svg10621"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.1 r9760"
|
||||||
|
sodipodi:docname="panel-button-highlight-narrow.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10623">
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient99561-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient34508-1-3">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop34510-1-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop34512-4-5" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
r="42"
|
||||||
|
fy="30"
|
||||||
|
fx="51"
|
||||||
|
cy="30"
|
||||||
|
cx="51"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="radialGradient10592"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#000000"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1.979899"
|
||||||
|
inkscape:cx="-171.36384"
|
||||||
|
inkscape:cy="-53.255157"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="1440"
|
||||||
|
inkscape:window-height="843"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="26"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata10626">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-468.08632,-537.03477)">
|
||||||
|
<path
|
||||||
|
sodipodi:type="arc"
|
||||||
|
style="opacity:0.4625;color:#000000;fill:url(#radialGradient10592);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="path34506-3"
|
||||||
|
sodipodi:cx="51"
|
||||||
|
sodipodi:cy="30"
|
||||||
|
sodipodi:rx="42"
|
||||||
|
sodipodi:ry="16"
|
||||||
|
d="M 9,29.999999 C 9.0000011,21.163443 27.804042,14 51.000002,14 74.195961,14 93,21.163444 93,30 l -42,0 z"
|
||||||
|
sodipodi:start="3.1415927"
|
||||||
|
sodipodi:end="6.2831853"
|
||||||
|
transform="matrix(0.35714286,0,0,1.5625,464.87203,515.15977)"
|
||||||
|
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/motion/textures/panel.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.5 KiB |
111
data/theme/panel-button-highlight-wide.svg
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="84"
|
||||||
|
height="25"
|
||||||
|
id="svg10621"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.0 r9654"
|
||||||
|
sodipodi:docname="panel-button-highlight-wide.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10623">
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient99561-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient34508-1-3">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop34510-1-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop34512-4-5" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
r="42"
|
||||||
|
fy="30"
|
||||||
|
fx="51"
|
||||||
|
cy="30"
|
||||||
|
cx="51"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="radialGradient10592"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#000000"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1.979899"
|
||||||
|
inkscape:cx="-118.50071"
|
||||||
|
inkscape:cy="27.304508"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="1440"
|
||||||
|
inkscape:window-height="843"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="26"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata10626">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-441.08632,-537.03477)">
|
||||||
|
<path
|
||||||
|
sodipodi:type="arc"
|
||||||
|
style="opacity:0.4625;color:#000000;fill:url(#radialGradient10592);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="path34506-3"
|
||||||
|
sodipodi:cx="51"
|
||||||
|
sodipodi:cy="30"
|
||||||
|
sodipodi:rx="42"
|
||||||
|
sodipodi:ry="16"
|
||||||
|
d="M 9,29.999999 C 9.0000011,21.163443 27.804042,14 51.000002,14 74.195961,14 93,21.163444 93,30 l -42,0 z"
|
||||||
|
sodipodi:start="3.1415927"
|
||||||
|
sodipodi:end="6.2831853"
|
||||||
|
transform="matrix(1,0,0,1.5625,432.08632,515.15977)"
|
||||||
|
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/motion/textures/panel.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.5 KiB |
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/bash
|
|
||||||
|
|
||||||
bundle exec sass --update --sourcemap=none .
|
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 9.8 KiB |
@ -1,120 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
version="1.0"
|
|
||||||
id="Foreground"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
width="32"
|
|
||||||
height="32"
|
|
||||||
viewBox="0 0 23.272727 23.272727"
|
|
||||||
enable-background="new 0 0 16 16"
|
|
||||||
xml:space="preserve"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.48.2 r9819"
|
|
||||||
sodipodi:docname="summary-counter.svg"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
|
||||||
id="metadata2399"><rdf:RDF><cc:Work
|
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
|
||||||
id="defs2397"><linearGradient
|
|
||||||
id="linearGradient3173"><stop
|
|
||||||
style="stop-color:#c4c4c4;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3175" /><stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:1;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3177" /></linearGradient><inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 8 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="16 : 8 : 1"
|
|
||||||
inkscape:persp3d-origin="8 : 5.3333333 : 1"
|
|
||||||
id="perspective2401" /><filter
|
|
||||||
color-interpolation-filters="sRGB"
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="filter16494-4"
|
|
||||||
x="-0.20989846"
|
|
||||||
width="1.4197969"
|
|
||||||
y="-0.20903821"
|
|
||||||
height="1.4180764"><feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="1.3282637"
|
|
||||||
id="feGaussianBlur16496-8" /></filter><radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient16498-6"
|
|
||||||
id="radialGradient16504-1"
|
|
||||||
cx="7.6582627"
|
|
||||||
cy="5.8191104"
|
|
||||||
fx="7.6582627"
|
|
||||||
fy="5.8191104"
|
|
||||||
r="8.6928644"
|
|
||||||
gradientTransform="matrix(1.0474339,0,0,1.0517402,-0.3632615,-0.42032492)"
|
|
||||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient16498-6"><stop
|
|
||||||
style="stop-color:#9FD0FF;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop16500-8" /><stop
|
|
||||||
style="stop-color:#3465A4;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop16502-0" /></linearGradient></defs><sodipodi:namedview
|
|
||||||
inkscape:window-height="709"
|
|
||||||
inkscape:window-width="1366"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
guidetolerance="10.0"
|
|
||||||
gridtolerance="10.0"
|
|
||||||
objecttolerance="10.0"
|
|
||||||
borderopacity="1.0"
|
|
||||||
bordercolor="#666666"
|
|
||||||
pagecolor="#000000"
|
|
||||||
id="base"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="11.313708"
|
|
||||||
inkscape:cx="15.386407"
|
|
||||||
inkscape:cy="13.739577"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="1179"
|
|
||||||
inkscape:current-layer="g16402-8"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:window-maximized="1"><inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid11246"
|
|
||||||
empspacing="5"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" /></sodipodi:namedview><g
|
|
||||||
style="display:inline"
|
|
||||||
id="g16402-8"
|
|
||||||
transform="translate(4.7533483,2.8238929)"><g
|
|
||||||
id="g3175-4"
|
|
||||||
transform="translate(-0.89995416,0.94028614)"><path
|
|
||||||
sodipodi:type="inkscape:offset"
|
|
||||||
inkscape:radius="0"
|
|
||||||
inkscape:original="M 7.65625 0.125 C 3.2589349 0.125 -0.3125 3.7070002 -0.3125 8.125 C -0.3125 12.543001 3.2589349 16.125 7.65625 16.125 C 12.053566 16.125 15.625 12.543001 15.625 8.125 C 15.625 3.7070002 12.053566 0.125 7.65625 0.125 z "
|
|
||||||
xlink:href="#path2394-32"
|
|
||||||
style="opacity:0.52994014;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.18181825;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16494-4);enable-background:accumulate"
|
|
||||||
id="path16480-5"
|
|
||||||
inkscape:href="#path2394-32"
|
|
||||||
d="m 7.65625,0.125 c -4.3973151,0 -7.96875,3.5820002 -7.96875,8 0,4.418001 3.5714349,8 7.96875,8 4.397316,0 7.96875,-3.581999 7.96875,-8 0,-4.4179998 -3.571434,-8 -7.96875,-8 z"
|
|
||||||
transform="translate(0,1.028519)" /><path
|
|
||||||
clip-rule="evenodd"
|
|
||||||
d="m -0.30428257,8.1237596 c 0,-4.4179998 3.56522987,-7.9999996 7.96254497,-7.9999996 4.3973156,0 7.9625456,3.5819998 7.9625456,7.9999996 0,4.4180014 -3.56523,8.0000004 -7.9625456,8.0000004 -4.3973151,0 -7.96254497,-3.581999 -7.96254497,-8.0000004 z"
|
|
||||||
id="path2394-32"
|
|
||||||
style="color:#000000;fill:url(#radialGradient16504-1);fill-opacity:1;fill-rule:nonzero;stroke:#eeeeec;stroke-width:1.4545455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
sodipodi:nodetypes="csssc"
|
|
||||||
inkscape:connector-curvature="0" /><g
|
|
||||||
id="g3172-6" /></g></g></svg>
|
|
Before Width: | Height: | Size: 5.4 KiB |
@ -1,133 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="48"
|
|
||||||
height="22"
|
|
||||||
id="svg2857"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="toggle-off-hc.svg">
|
|
||||||
<defs
|
|
||||||
id="defs2859">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
|
||||||
id="perspective2865" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective2843"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#000000"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="-6.1820581"
|
|
||||||
inkscape:cy="-16.463788"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g37994"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1364"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:snap-nodes="false"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
showborder="true">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid12954"
|
|
||||||
empspacing="5"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata2862">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-444.64286,-781.36218)">
|
|
||||||
<g
|
|
||||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
|
||||||
id="g37994">
|
|
||||||
<g
|
|
||||||
transform="matrix(1.5323214,0,0,1.2413968,-324.76058,489.69039)"
|
|
||||||
id="toggle-off"
|
|
||||||
inkscape:label="#g8477">
|
|
||||||
<circle
|
|
||||||
cy="1033.993"
|
|
||||||
cx="571.95966"
|
|
||||||
id="path8444"
|
|
||||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
r="7" />
|
|
||||||
<rect
|
|
||||||
ry="2.0108337"
|
|
||||||
rx="1.9562569"
|
|
||||||
y="1031.9885"
|
|
||||||
x="565.0083"
|
|
||||||
height="4.0216675"
|
|
||||||
width="34.850178"
|
|
||||||
id="rect8461"
|
|
||||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="matrix(1.5323214,0,0,1.2413968,-324.85635,491.16456)"
|
|
||||||
id="toggle-on"
|
|
||||||
inkscape:label="#g8481">
|
|
||||||
<rect
|
|
||||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
id="rect8475"
|
|
||||||
width="34.850178"
|
|
||||||
height="4.0216675"
|
|
||||||
x="565.0083"
|
|
||||||
y="1070.9279"
|
|
||||||
rx="1.9562569"
|
|
||||||
ry="2.0108337" />
|
|
||||||
<circle
|
|
||||||
transform="scale(-1,1)"
|
|
||||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
id="circle8463"
|
|
||||||
cx="-591.0213"
|
|
||||||
cy="1072.9402"
|
|
||||||
r="9" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 6.1 KiB |
@ -7,127 +7,51 @@
|
|||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="65"
|
width="65"
|
||||||
height="22"
|
height="22"
|
||||||
id="svg2857"
|
id="svg3273"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.47 r22583"
|
||||||
sodipodi:docname="toggle-off-us.svg">
|
sodipodi:docname="New document 14">
|
||||||
<defs
|
<defs
|
||||||
id="defs2859">
|
id="defs3275">
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
sodipodi:type="inkscape:persp3d"
|
sodipodi:type="inkscape:persp3d"
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||||
id="perspective2865" />
|
id="perspective3281" />
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
id="perspective2843"
|
id="perspective3261"
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
sodipodi:type="inkscape:persp3d" />
|
sodipodi:type="inkscape:persp3d" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4-0"
|
|
||||||
is_visible="true" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
id="linearGradient12311-3-1-0-5-4"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
|
||||||
x1="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x2="610.13782"
|
|
||||||
y2="492.52756" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient37802-8"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop37804-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop37806-8"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#16191a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
y2="492.52756"
|
|
||||||
x2="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x1="610.13782"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
id="linearGradient13602"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
inkscape:collect="always" />
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#000000"
|
pagecolor="#ffffff"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="0.35"
|
||||||
inkscape:cx="-5.0602834"
|
inkscape:cx="32.000004"
|
||||||
inkscape:cy="16.473273"
|
inkscape:cy="10.999997"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="g37994"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="609"
|
||||||
inkscape:window-height="1375"
|
inkscape:window-height="501"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="26"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="0" />
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:snap-nodes="false"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
showborder="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid12954"
|
|
||||||
empspacing="5"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata2862">
|
id="metadata3278">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
<cc:Work
|
<cc:Work
|
||||||
rdf:about="">
|
rdf:about="">
|
||||||
@ -142,68 +66,61 @@
|
|||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-444.64286,-781.36218)">
|
transform="translate(-343,-521.36218)">
|
||||||
<g
|
<g
|
||||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
id="g17454"
|
||||||
id="g37994">
|
transform="translate(-453,448.36218)"
|
||||||
|
style="display:inline">
|
||||||
|
<rect
|
||||||
|
transform="scale(-1,1)"
|
||||||
|
ry="4"
|
||||||
|
rx="4"
|
||||||
|
y="74.5"
|
||||||
|
x="-859.5"
|
||||||
|
height="19"
|
||||||
|
width="63.000004"
|
||||||
|
id="rect17456"
|
||||||
|
style="color:#000000;fill:none;stroke:#2e3436;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
transform="scale(-1,1)"
|
||||||
|
ry="4"
|
||||||
|
rx="4"
|
||||||
|
y="74"
|
||||||
|
x="-828"
|
||||||
|
height="20"
|
||||||
|
width="31"
|
||||||
|
id="rect17458"
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke:#5f5f5f;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
|
||||||
<g
|
<g
|
||||||
id="g37996"
|
transform="matrix(-1,0,0,1,1619.1239,-33.986291)"
|
||||||
transform="translate(-115,1277)">
|
id="g17460"
|
||||||
<rect
|
style="display:inline">
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
<path
|
||||||
id="rect13475"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
width="98"
|
d="m 803.6322,115.48629 0,4.29495"
|
||||||
height="25"
|
id="path17462"
|
||||||
x="644.5"
|
inkscape:connector-curvature="0" />
|
||||||
y="484.61118"
|
<path
|
||||||
rx="4.7429576"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||||
ry="3.8424656" />
|
d="m 806.62805,115.48629 0,4.29495"
|
||||||
<rect
|
id="path17464"
|
||||||
ry="3.8424656"
|
inkscape:connector-curvature="0" />
|
||||||
rx="4.7429576"
|
<path
|
||||||
y="483.5"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||||
x="644.5"
|
d="m 809.6239,115.48629 0,4.29495"
|
||||||
height="25"
|
id="path17466"
|
||||||
width="98"
|
inkscape:connector-curvature="0" />
|
||||||
id="rect38000"
|
|
||||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="translate(-49.946213,-1.890275)"
|
|
||||||
id="g38002">
|
|
||||||
<g
|
|
||||||
transform="translate(-115,1247)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g38004">
|
|
||||||
<rect
|
|
||||||
ry="3.7972314"
|
|
||||||
rx="4.6871223"
|
|
||||||
y="515.5"
|
|
||||||
x="694.53046"
|
|
||||||
height="25"
|
|
||||||
width="45.969578"
|
|
||||||
id="rect38006"
|
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
id="path38016"
|
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
<path
|
<path
|
||||||
sodipodi:type="arc"
|
sodipodi:type="arc"
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.96875012;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
id="path13479"
|
id="path18722"
|
||||||
sodipodi:cx="16.4375"
|
sodipodi:cx="47.6875"
|
||||||
sodipodi:cy="10.8125"
|
sodipodi:cy="11.5625"
|
||||||
sodipodi:rx="4.3125"
|
sodipodi:rx="3.9375"
|
||||||
sodipodi:ry="4.3125"
|
sodipodi:ry="3.9375"
|
||||||
d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
|
d="m 51.625,11.5625 c 0,2.174621 -1.762879,3.9375 -3.9375,3.9375 -2.174621,0 -3.9375,-1.762879 -3.9375,-3.9375 0,-2.1746212 1.762879,-3.9375 3.9375,-3.9375 2.174621,0 3.9375,1.7628788 3.9375,3.9375 z"
|
||||||
transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
|
transform="matrix(1.0158729,0,0,1.0158729,795.55556,72.25399)" />
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 4.7 KiB |
@ -7,171 +7,51 @@
|
|||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="65"
|
width="65"
|
||||||
height="22"
|
height="22"
|
||||||
id="svg2857"
|
id="svg3012"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="0.47 r22583"
|
||||||
sodipodi:docname="toggle-on-intl.svg">
|
sodipodi:docname="New document 6">
|
||||||
<defs
|
<defs
|
||||||
id="defs2859">
|
id="defs3014">
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
sodipodi:type="inkscape:persp3d"
|
sodipodi:type="inkscape:persp3d"
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||||
id="perspective2865" />
|
id="perspective3020" />
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
id="perspective2843"
|
id="perspective2997"
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
sodipodi:type="inkscape:persp3d" />
|
sodipodi:type="inkscape:persp3d" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient37802"
|
|
||||||
id="linearGradient12311-3-1-0-5"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
|
||||||
x1="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x2="610.13782"
|
|
||||||
y2="492.52756" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient37802"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop37804"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop37806"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#16191a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4-3"
|
|
||||||
id="linearGradient77680"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4-3">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5-7" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0-9" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4-0"
|
|
||||||
is_visible="true" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
id="linearGradient12311-3-1-0-5-4"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
|
||||||
x1="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x2="610.13782"
|
|
||||||
y2="492.52756" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient37802-8"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop37804-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop37806-8"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#16191a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
y2="492.52756"
|
|
||||||
x2="610.13782"
|
|
||||||
y1="501.43866"
|
|
||||||
x1="610.13782"
|
|
||||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
id="linearGradient13602"
|
|
||||||
xlink:href="#linearGradient37802-8"
|
|
||||||
inkscape:collect="always" />
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#000000"
|
pagecolor="#ffffff"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="0.35"
|
||||||
inkscape:cx="16.760995"
|
inkscape:cx="32.000004"
|
||||||
inkscape:cy="21.955673"
|
inkscape:cy="10.999997"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="g37994"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="609"
|
||||||
inkscape:window-height="1375"
|
inkscape:window-height="501"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="26"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="0" />
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:snap-nodes="false"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
showborder="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid12954"
|
|
||||||
empspacing="5"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata2862">
|
id="metadata3017">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
<cc:Work
|
<cc:Work
|
||||||
rdf:about="">
|
rdf:about="">
|
||||||
@ -186,70 +66,73 @@
|
|||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-444.64286,-781.36218)">
|
transform="translate(-343,-521.36218)">
|
||||||
<g
|
<g
|
||||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
id="g17454"
|
||||||
id="g37994">
|
transform="translate(-453,448.36218)"
|
||||||
|
style="display:inline">
|
||||||
|
<rect
|
||||||
|
transform="scale(-1,1)"
|
||||||
|
ry="4"
|
||||||
|
rx="4"
|
||||||
|
y="74.5"
|
||||||
|
x="-859.5"
|
||||||
|
height="19"
|
||||||
|
width="63.000004"
|
||||||
|
id="rect17456"
|
||||||
|
style="color:#000000;fill:none;stroke:#2e3436;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
transform="scale(-1,1)"
|
||||||
|
ry="4"
|
||||||
|
rx="4"
|
||||||
|
y="74"
|
||||||
|
x="-828"
|
||||||
|
height="20"
|
||||||
|
width="31"
|
||||||
|
id="rect17458"
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke:#5f5f5f;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
|
||||||
<g
|
<g
|
||||||
id="g37996"
|
transform="matrix(-1,0,0,1,1619.1239,-33.986291)"
|
||||||
transform="translate(-115,1277)">
|
id="g17460"
|
||||||
<rect
|
style="display:inline">
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
<path
|
||||||
id="rect13475"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
width="98"
|
d="m 803.6322,115.48629 0,4.29495"
|
||||||
height="25"
|
id="path17462"
|
||||||
x="644.5"
|
inkscape:connector-curvature="0" />
|
||||||
y="484.61118"
|
<path
|
||||||
rx="4.7429576"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||||
ry="3.8424656" />
|
d="m 806.62805,115.48629 0,4.29495"
|
||||||
<rect
|
id="path17464"
|
||||||
ry="3.8424656"
|
inkscape:connector-curvature="0" />
|
||||||
rx="4.7429576"
|
<path
|
||||||
y="483.5"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||||
x="644.5"
|
d="m 809.6239,115.48629 0,4.29495"
|
||||||
height="25"
|
id="path17466"
|
||||||
width="98"
|
inkscape:connector-curvature="0" />
|
||||||
id="rect38000"
|
|
||||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
|
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
transform="translate(-49.946213,-1.890275)"
|
style="font-size:8.95877075px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
id="g38002">
|
id="text17468"
|
||||||
<g
|
transform="translate(0.34375,0)">
|
||||||
transform="translate(-115,1247)"
|
<path
|
||||||
style="display:inline"
|
d="m 837.28518,80.750726 c 0.63282,6e-6 1.19566,0.123947 1.68852,0.371824 0.49284,0.247888 0.8807,0.609505 1.16359,1.084851 0.28287,0.472439 0.42431,1.022155 0.42431,1.649149 0,0.635748 -0.13853,1.200045 -0.41556,1.692892 -0.27706,0.489934 -0.66638,0.870507 -1.16797,1.141719 -0.5016,0.271213 -1.07756,0.406819 -1.72789,0.406819 -0.42869,0 -0.83551,-0.06562 -1.22045,-0.196848 -0.38495,-0.134148 -0.73053,-0.32808 -1.03674,-0.581795 -0.30329,-0.256631 -0.54534,-0.589085 -0.72615,-0.997363 -0.17789,-0.408276 -0.26684,-0.869045 -0.26683,-1.382311 -10e-6,-0.638658 0.13997,-1.200039 0.41994,-1.684144 0.27996,-0.487011 0.66782,-0.858835 1.16359,-1.115472 0.49576,-0.259541 1.06297,-0.389315 1.70164,-0.389321 m 0.57305,1.089225 c -0.20123,-0.05249 -0.40683,-0.07873 -0.61679,-0.07874 -0.20998,5e-6 -0.41412,0.02625 -0.61242,0.07874 -0.19831,0.04958 -0.38933,0.129779 -0.57305,0.240592 -0.18081,0.107907 -0.33974,0.242055 -0.47681,0.402445 -0.13706,0.160399 -0.24642,0.358705 -0.32808,0.594918 -0.0816,0.233306 -0.12248,0.491395 -0.12248,0.774269 0,0.67366 0.20851,1.214627 0.62554,1.622903 0.41702,0.408278 0.93758,0.612416 1.56166,0.612416 0.25954,0 0.51034,-0.04229 0.7524,-0.126858 0.24496,-0.08457 0.47097,-0.20997 0.67803,-0.376198 0.20705,-0.166226 0.37328,-0.392236 0.49868,-0.678032 0.12539,-0.285792 0.18809,-0.610956 0.1881,-0.975492 -10e-6,-0.297455 -0.0437,-0.568668 -0.13123,-0.813638 -0.0875,-0.247878 -0.20415,-0.453475 -0.34995,-0.61679 -0.14291,-0.163307 -0.31059,-0.301829 -0.50306,-0.415568 -0.18956,-0.11373 -0.38641,-0.195385 -0.59054,-0.244967"
|
||||||
id="g38004">
|
style="line-height:125%;fill:#ffffff;fill-opacity:1;marker:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
<rect
|
id="path18599"
|
||||||
ry="3.7972314"
|
inkscape:connector-curvature="0" />
|
||||||
rx="4.6871223"
|
<path
|
||||||
y="515.5"
|
d="m 843.5362,81.831203 0,1.17917 2.94834,0 0,1.014861 -2.94834,0 0,3.00713 -1.10673,0 0,-6.216022 4.31754,0 0,1.014861 -3.21081,0"
|
||||||
x="694.53046"
|
style="line-height:125%;fill:#ffffff;fill-opacity:1;marker:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
height="25"
|
id="path18601"
|
||||||
width="45.969578"
|
inkscape:connector-curvature="0"
|
||||||
id="rect38006"
|
sodipodi:nodetypes="ccccccccccc" />
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
<path
|
||||||
<path
|
d="m 849.71285,81.831203 0,1.17917 2.94834,0 0,1.014861 -2.94834,0 0,3.00713 -1.10672,0 0,-6.216022 4.31753,0 0,1.014861 -3.21081,0"
|
||||||
sodipodi:nodetypes="cc"
|
style="line-height:125%;fill:#ffffff;fill-opacity:1;marker:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
id="path18603"
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
inkscape:connector-curvature="0"
|
||||||
id="path38016"
|
sodipodi:nodetypes="ccccccccccc" />
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-size:13.79166794px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
|
||||||
x="520.29974"
|
|
||||||
y="1997.0011"
|
|
||||||
id="text75614"
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
transform="scale(1.1236771,0.88993537)"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan75616"
|
|
||||||
x="520.29974"
|
|
||||||
y="1997.0011">OFF</tspan></text>
|
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 7.2 KiB |
@ -1,113 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="48"
|
|
||||||
height="22"
|
|
||||||
id="svg2857"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="toggle-on-hc.svg">
|
|
||||||
<defs
|
|
||||||
id="defs2859">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
|
||||||
id="perspective2865" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective2843"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#000000"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="-222.95215"
|
|
||||||
inkscape:cy="3.9378433"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="g37994"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1364"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:snap-nodes="false"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
showborder="true">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid12954"
|
|
||||||
empspacing="5"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata2862">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-444.64286,-781.36218)">
|
|
||||||
<g
|
|
||||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
|
||||||
id="g37994">
|
|
||||||
<g
|
|
||||||
transform="matrix(1.5323214,0,0,1.2413968,-324.85635,441.50868)"
|
|
||||||
id="toggle-on"
|
|
||||||
inkscape:label="#g8481">
|
|
||||||
<rect
|
|
||||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
id="rect8475"
|
|
||||||
width="34.850178"
|
|
||||||
height="4.0216675"
|
|
||||||
x="565.0083"
|
|
||||||
y="1070.9279"
|
|
||||||
rx="1.9562569"
|
|
||||||
ry="2.0108337" />
|
|
||||||
<circle
|
|
||||||
transform="scale(-1,1)"
|
|
||||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
id="circle8463"
|
|
||||||
cx="-591.0213"
|
|
||||||
cy="1072.9402"
|
|
||||||
r="9" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.4 KiB |
@ -7,113 +7,51 @@
|
|||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="65"
|
width="65"
|
||||||
height="22"
|
height="22"
|
||||||
id="svg2857"
|
id="svg3199"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.91 r13725"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="toggle-on-intl.svg">
|
sodipodi:docname="toggle-on-intl.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2859">
|
id="defs3201">
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
sodipodi:type="inkscape:persp3d"
|
sodipodi:type="inkscape:persp3d"
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||||
id="perspective2865" />
|
id="perspective3207" />
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
id="perspective2843"
|
id="perspective3187"
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
sodipodi:type="inkscape:persp3d" />
|
sodipodi:type="inkscape:persp3d" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient77461"
|
|
||||||
id="linearGradient77551"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
|
||||||
x1="1164.7644"
|
|
||||||
y1="962.93695"
|
|
||||||
x2="1164.7644"
|
|
||||||
y2="970.51404" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient77461"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop77463"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#182f4c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop77465"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#205b9a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#000000"
|
pagecolor="#ffffff"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="37.410841"
|
inkscape:cx="49.147112"
|
||||||
inkscape:cy="16.009314"
|
inkscape:cy="17.532036"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="g37994"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="1412"
|
||||||
inkscape:window-height="1376"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="26"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="0" />
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:snap-nodes="false"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
showborder="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid12954"
|
|
||||||
empspacing="5"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata2862">
|
id="metadata3204">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
<cc:Work
|
<cc:Work
|
||||||
rdf:about="">
|
rdf:about="">
|
||||||
@ -128,65 +66,57 @@
|
|||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-444.64286,-781.36218)">
|
transform="translate(-342.5,-521.36218)">
|
||||||
<g
|
<g
|
||||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
style="display:inline"
|
||||||
id="g37994">
|
transform="translate(-453.5,448.36218)"
|
||||||
<g
|
id="g16453">
|
||||||
id="g37996"
|
|
||||||
transform="translate(-115,1277)">
|
|
||||||
<rect
|
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
|
||||||
id="rect13475"
|
|
||||||
width="98"
|
|
||||||
height="25"
|
|
||||||
x="644.5"
|
|
||||||
y="484.61118"
|
|
||||||
rx="4.7429576"
|
|
||||||
ry="3.8424656" />
|
|
||||||
<rect
|
|
||||||
ry="3.8424656"
|
|
||||||
rx="4.7429576"
|
|
||||||
y="483.5"
|
|
||||||
x="644.5"
|
|
||||||
height="25"
|
|
||||||
width="98"
|
|
||||||
id="rect38000"
|
|
||||||
style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
transform="translate(2.0625,-2)"
|
|
||||||
id="g38002">
|
|
||||||
<g
|
|
||||||
transform="translate(-115,1247)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g38004">
|
|
||||||
<rect
|
|
||||||
ry="3.7972314"
|
|
||||||
rx="4.6871223"
|
|
||||||
y="515.5"
|
|
||||||
x="694.53046"
|
|
||||||
height="25"
|
|
||||||
width="45.969578"
|
|
||||||
id="rect38006"
|
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
id="path38016"
|
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<rect
|
<rect
|
||||||
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
style="color:#000000;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:0.99999994000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
id="rect13678"
|
id="rect16256-9-4"
|
||||||
width="3.0646207"
|
width="63.000004"
|
||||||
height="12.414008"
|
height="19"
|
||||||
x="554.77728"
|
x="-859.5"
|
||||||
y="1767.3566" />
|
y="74.5"
|
||||||
|
rx="4"
|
||||||
|
ry="4"
|
||||||
|
transform="scale(-1,1)" />
|
||||||
|
<rect
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke:#5f5f5f;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
|
||||||
|
id="rect16258-5-4"
|
||||||
|
width="31"
|
||||||
|
height="20"
|
||||||
|
x="-860"
|
||||||
|
y="74"
|
||||||
|
rx="4"
|
||||||
|
ry="4"
|
||||||
|
transform="scale(-1,1)" />
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
id="g16298-3-6"
|
||||||
|
transform="matrix(-1,0,0,1,1651.1322,-33.986291)">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path16265-3-5"
|
||||||
|
d="m 803.6322,115.48629 0,4.29495"
|
||||||
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path16265-0-2-0"
|
||||||
|
d="m 806.62805,115.48629 0,4.29495"
|
||||||
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path16265-8-7-1"
|
||||||
|
d="m 809.6239,115.48629 0,4.29495"
|
||||||
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="color:#000000;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
d="m 16,27.9375 0,10.125"
|
||||||
|
id="path19232"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
transform="translate(796,51.00002)" />
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 4.5 KiB |
@ -7,14 +7,13 @@
|
|||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="65"
|
width="65"
|
||||||
height="22"
|
height="22"
|
||||||
id="svg2857"
|
id="svg2857"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.91 r13725"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="toggle-on-us.svg">
|
sodipodi:docname="toggle-on-us.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2859">
|
id="defs2859">
|
||||||
@ -32,96 +31,27 @@
|
|||||||
inkscape:vp_y="0 : 1000 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
sodipodi:type="inkscape:persp3d" />
|
sodipodi:type="inkscape:persp3d" />
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient76469-7-7-4"
|
|
||||||
id="linearGradient38024"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
|
||||||
x1="6"
|
|
||||||
y1="102.95528"
|
|
||||||
x2="6"
|
|
||||||
y2="84.505203" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient76469-7-7-4">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#2e3232;stop-opacity:1"
|
|
||||||
offset="0"
|
|
||||||
id="stop76471-7-1-5" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#3e4545;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop76473-9-0-0" />
|
|
||||||
</linearGradient>
|
|
||||||
<inkscape:path-effect
|
|
||||||
effect="spiro"
|
|
||||||
id="path-effect77541-4"
|
|
||||||
is_visible="true" />
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient77461-1"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop77463-1"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#182f4c;stop-opacity:1" />
|
|
||||||
<stop
|
|
||||||
id="stop77465-4"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#205b9a;stop-opacity:1" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient77461-1"
|
|
||||||
id="linearGradient77551-6-5"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
|
|
||||||
x1="1164.7644"
|
|
||||||
y1="962.93695"
|
|
||||||
x2="1164.7644"
|
|
||||||
y2="970.51404" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient77461-1"
|
|
||||||
id="linearGradient11198"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
|
|
||||||
x1="1322.5831"
|
|
||||||
y1="-312.51855"
|
|
||||||
x2="1322.5831"
|
|
||||||
y2="-306.53461" />
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#000000"
|
pagecolor="#ffffff"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="1"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="-26.798898"
|
inkscape:cx="19.689855"
|
||||||
inkscape:cy="5.3753009"
|
inkscape:cy="2.0517979"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="g37994"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="941"
|
||||||
inkscape:window-height="1376"
|
inkscape:window-height="751"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="2577"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="206"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="0"
|
||||||
borderlayer="true"
|
borderlayer="true"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:showpageshadow="false" />
|
||||||
inkscape:snap-nodes="false"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
showborder="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid12954"
|
|
||||||
empspacing="5"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata2862">
|
id="metadata2862">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
@ -140,68 +70,61 @@
|
|||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(-444.64286,-781.36218)">
|
transform="translate(-444.64286,-781.36218)">
|
||||||
<g
|
<g
|
||||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
style="display:inline"
|
||||||
id="g37994">
|
transform="translate(-351.35714,708.36218)"
|
||||||
|
id="g16453">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:0.99999994000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="rect16256-9-4"
|
||||||
|
width="63.000004"
|
||||||
|
height="19"
|
||||||
|
x="-859.5"
|
||||||
|
y="74.5"
|
||||||
|
rx="4"
|
||||||
|
ry="4"
|
||||||
|
transform="scale(-1,1)" />
|
||||||
|
<rect
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke:#5f5f5f;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
|
||||||
|
id="rect16258-5-4"
|
||||||
|
width="31"
|
||||||
|
height="20"
|
||||||
|
x="-860"
|
||||||
|
y="74"
|
||||||
|
rx="4"
|
||||||
|
ry="4"
|
||||||
|
transform="scale(-1,1)" />
|
||||||
<g
|
<g
|
||||||
id="g37996"
|
style="display:inline"
|
||||||
transform="translate(-115,1277)">
|
id="g16298-3-6"
|
||||||
<rect
|
transform="matrix(-1,0,0,1,1651.1322,-33.986291)">
|
||||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
<path
|
||||||
id="rect13475"
|
inkscape:connector-curvature="0"
|
||||||
width="98"
|
id="path16265-3-5"
|
||||||
height="25"
|
d="m 803.6322,115.48629 0,4.29495"
|
||||||
x="644.5"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
y="484.61118"
|
<path
|
||||||
rx="4.7429576"
|
inkscape:connector-curvature="0"
|
||||||
ry="3.8424656" />
|
id="path16265-0-2-0"
|
||||||
<rect
|
d="m 806.62805,115.48629 0,4.29495"
|
||||||
ry="3.8424656"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
|
||||||
rx="4.7429576"
|
<path
|
||||||
y="483.5"
|
inkscape:connector-curvature="0"
|
||||||
x="644.5"
|
id="path16265-8-7-1"
|
||||||
height="25"
|
d="m 809.6239,115.48629 0,4.29495"
|
||||||
width="98"
|
style="fill:none;stroke:#5f5f5f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
|
||||||
id="rect38000"
|
|
||||||
style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
|
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
transform="translate(2.0625,-2)"
|
style="font-size:8.95877075px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
id="g38002">
|
id="text42229-3-0">
|
||||||
<g
|
<path
|
||||||
transform="translate(-115,1247)"
|
d="m 808.01473,80.573953 c 0.63283,6e-6 1.19567,0.123947 1.68852,0.371824 0.49284,0.247888 0.88071,0.609505 1.16359,1.084851 0.28287,0.472439 0.42431,1.022155 0.42432,1.649149 -10e-6,0.635748 -0.13853,1.200045 -0.41557,1.692892 -0.27705,0.489934 -0.66637,0.870506 -1.16796,1.141719 -0.50161,0.271212 -1.07757,0.406819 -1.72789,0.406819 -0.4287,0 -0.83552,-0.06562 -1.22046,-0.196848 -0.38495,-0.134148 -0.73053,-0.32808 -1.03673,-0.581795 -0.3033,-0.256631 -0.54535,-0.589085 -0.72615,-0.997363 -0.1779,-0.408276 -0.26684,-0.869045 -0.26684,-1.382311 0,-0.638658 0.13998,-1.200039 0.41994,-1.684144 0.27996,-0.487011 0.66782,-0.858835 1.16359,-1.115472 0.49576,-0.259541 1.06298,-0.389315 1.70164,-0.389321 m 0.57305,1.089225 c -0.20123,-0.05249 -0.40682,-0.07873 -0.61679,-0.07874 -0.20998,5e-6 -0.41411,0.02625 -0.61242,0.07874 -0.19831,0.04958 -0.38932,0.129779 -0.57304,0.240592 -0.18081,0.107907 -0.33975,0.242055 -0.47681,0.402445 -0.13707,0.160399 -0.24643,0.358705 -0.32808,0.594918 -0.0817,0.233305 -0.12249,0.491395 -0.12249,0.774269 0,0.67366 0.20851,1.214627 0.62554,1.622902 0.41703,0.408279 0.93758,0.612417 1.56166,0.612416 0.25955,10e-7 0.51035,-0.04228 0.7524,-0.126857 0.24496,-0.08457 0.47097,-0.20997 0.67803,-0.376199 0.20705,-0.166225 0.37328,-0.392236 0.49868,-0.678031 0.1254,-0.285792 0.1881,-0.610956 0.1881,-0.975492 0,-0.297455 -0.0437,-0.568668 -0.13123,-0.813638 -0.0875,-0.247878 -0.20414,-0.453475 -0.34995,-0.61679 -0.1429,-0.163307 -0.31059,-0.301829 -0.50306,-0.415568 -0.18956,-0.11373 -0.38641,-0.195385 -0.59054,-0.244967"
|
||||||
style="display:inline"
|
style="line-height:125%;fill:#ffffff;fill-opacity:1;marker:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
id="g38004">
|
id="path18606" />
|
||||||
<rect
|
<path
|
||||||
ry="3.7972314"
|
d="m 813.15903,80.639569 1.21608,0 3.4689,4.776844 0,-4.776844 1.10235,0 0,6.216022 -1.22921,0 -3.45577,-4.785594 0,4.785594 -1.10235,0 0,-6.216022"
|
||||||
rx="4.6871223"
|
style="line-height:125%;fill:#ffffff;fill-opacity:1;marker:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
y="515.5"
|
id="path18608" />
|
||||||
x="694.53046"
|
|
||||||
height="25"
|
|
||||||
width="45.969578"
|
|
||||||
id="rect38006"
|
|
||||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
|
||||||
d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
id="path38016"
|
|
||||||
inkscape:path-effect="#path-effect77541-4"
|
|
||||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
<text
|
|
||||||
transform="scale(1.1000946,0.90901274)"
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
id="text38018"
|
|
||||||
y="1955.5205"
|
|
||||||
x="495.94223"
|
|
||||||
style="font-size:13.29953671px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
|
||||||
xml:space="preserve"><tspan
|
|
||||||
y="1955.5205"
|
|
||||||
x="495.94223"
|
|
||||||
id="tspan38020"
|
|
||||||
sodipodi:role="line">ON</tspan></text>
|
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 850 B |
376
data/theme/ws-switch-arrow-down.svg
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
width="96"
|
||||||
|
height="96"
|
||||||
|
id="svg25070"
|
||||||
|
inkscape:version="0.48.0 r9654"
|
||||||
|
sodipodi:docname="ws-switch-arrow-down.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata3353">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="718"
|
||||||
|
inkscape:window-height="480"
|
||||||
|
id="namedview3351"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="2.6979167"
|
||||||
|
inkscape:cx="48"
|
||||||
|
inkscape:cy="48"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="26"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg25070" />
|
||||||
|
<defs
|
||||||
|
id="defs25072">
|
||||||
|
<linearGradient
|
||||||
|
x1="-86.552246"
|
||||||
|
y1="185.439"
|
||||||
|
x2="-83.37072"
|
||||||
|
y2="197.31261"
|
||||||
|
id="linearGradient24957"
|
||||||
|
xlink:href="#linearGradient4034-0-4"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(6,0)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4034-0-4">
|
||||||
|
<stop
|
||||||
|
id="stop4036-5-7"
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop4038-9-6"
|
||||||
|
style="stop-color:#babdb6;stop-opacity:1"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter24765">
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
values="1"
|
||||||
|
type="saturate"
|
||||||
|
id="feColorMatrix24767" />
|
||||||
|
<feColorMatrix
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix24769" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
x1="-74.520325"
|
||||||
|
y1="169.06032"
|
||||||
|
x2="-74.520325"
|
||||||
|
y2="205.94189"
|
||||||
|
id="linearGradient24955"
|
||||||
|
xlink:href="#linearGradient4632-1-3-9-3-2"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-5,0)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4632-1-3-9-3-2">
|
||||||
|
<stop
|
||||||
|
id="stop4634-1-8-3-9-0"
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop4636-1-9-9-8-8"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1"
|
||||||
|
offset="0.0274937" />
|
||||||
|
<stop
|
||||||
|
id="stop4638-8-3-9-6-6"
|
||||||
|
style="stop-color:#f2f2f2;stop-opacity:1"
|
||||||
|
offset="0.274937" />
|
||||||
|
<stop
|
||||||
|
id="stop4640-8-5-7-8-9"
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.38707438" />
|
||||||
|
<stop
|
||||||
|
id="stop4642-5-41-9-6-9"
|
||||||
|
style="stop-color:#d9dad8;stop-opacity:1"
|
||||||
|
offset="0.66528589" />
|
||||||
|
<stop
|
||||||
|
id="stop4644-5-2-7-9-2"
|
||||||
|
style="stop-color:#dfe0dd;stop-opacity:1"
|
||||||
|
offset="0.76745707" />
|
||||||
|
<stop
|
||||||
|
id="stop4646-3-2-3-7-3"
|
||||||
|
style="stop-color:#f0f0f0;stop-opacity:1"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
cx="-33.412369"
|
||||||
|
cy="185.74171"
|
||||||
|
r="2.3554697"
|
||||||
|
fx="-33.412369"
|
||||||
|
fy="185.74171"
|
||||||
|
id="radialGradient24959"
|
||||||
|
xlink:href="#linearGradient4869-4-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0075,0,0,1.0075,-5.4544,-1.25141)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4869-4-1">
|
||||||
|
<stop
|
||||||
|
id="stop4871-6-2"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop4879-7-4"
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.31807542" />
|
||||||
|
<stop
|
||||||
|
id="stop4877-6-1"
|
||||||
|
style="stop-color:#c8c9c6;stop-opacity:1"
|
||||||
|
offset="0.74691135" />
|
||||||
|
<stop
|
||||||
|
id="stop4873-1-0"
|
||||||
|
style="stop-color:#d3d7cf;stop-opacity:1"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter25011">
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
values="1"
|
||||||
|
type="saturate"
|
||||||
|
id="feColorMatrix25013" />
|
||||||
|
<feColorMatrix
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix25015" />
|
||||||
|
</filter>
|
||||||
|
<radialGradient
|
||||||
|
cx="-33.412369"
|
||||||
|
cy="185.74171"
|
||||||
|
r="2.3554697"
|
||||||
|
fx="-33.412369"
|
||||||
|
fy="185.74171"
|
||||||
|
id="radialGradient24961"
|
||||||
|
xlink:href="#linearGradient4869-4-0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0075,0,0,1.0075,-5.4544,-1.25141)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4869-4-0">
|
||||||
|
<stop
|
||||||
|
id="stop4871-6-8"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop4879-7-5"
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.31807542" />
|
||||||
|
<stop
|
||||||
|
id="stop4877-6-5"
|
||||||
|
style="stop-color:#c8c9c6;stop-opacity:1"
|
||||||
|
offset="0.74691135" />
|
||||||
|
<stop
|
||||||
|
id="stop4873-1-4"
|
||||||
|
style="stop-color:#d3d7cf;stop-opacity:1"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter25023">
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
values="1"
|
||||||
|
type="saturate"
|
||||||
|
id="feColorMatrix25025" />
|
||||||
|
<feColorMatrix
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix25027" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
x1="-39.858727"
|
||||||
|
y1="184.61784"
|
||||||
|
x2="-38.244785"
|
||||||
|
y2="188.84898"
|
||||||
|
id="linearGradient24963"
|
||||||
|
xlink:href="#linearGradient4941"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4941">
|
||||||
|
<stop
|
||||||
|
id="stop4943"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop4945"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter25033">
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
values="1"
|
||||||
|
type="saturate"
|
||||||
|
id="feColorMatrix25035" />
|
||||||
|
<feColorMatrix
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix25037" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
x1="-39.858727"
|
||||||
|
y1="184.61784"
|
||||||
|
x2="-38.244785"
|
||||||
|
y2="188.84898"
|
||||||
|
id="linearGradient24965"
|
||||||
|
xlink:href="#linearGradient4941-7"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4941-7">
|
||||||
|
<stop
|
||||||
|
id="stop4943-2"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop4945-5"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter25043">
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
values="1"
|
||||||
|
type="saturate"
|
||||||
|
id="feColorMatrix25045" />
|
||||||
|
<feColorMatrix
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix25047" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter25049">
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
values="1"
|
||||||
|
type="saturate"
|
||||||
|
id="feColorMatrix25051" />
|
||||||
|
<feColorMatrix
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix25053" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter25055">
|
||||||
|
<feColorMatrix
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
values="1"
|
||||||
|
type="saturate"
|
||||||
|
id="feColorMatrix25057" />
|
||||||
|
<feColorMatrix
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix25059" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
transform="matrix(0,1,-1,0,48.0003,4.1307112e-7)"
|
||||||
|
id="layer1">
|
||||||
|
<g
|
||||||
|
transform="matrix(-2,0,0,2,-97.2497,-374.967)"
|
||||||
|
id="g4030-1-8"
|
||||||
|
style="stroke:#000000;stroke-opacity:1;display:inline">
|
||||||
|
<path
|
||||||
|
d="m -72.5,173.5 -14,14 14,14"
|
||||||
|
id="path3165-7-3"
|
||||||
|
style="color:#000000;fill:none;stroke:#000000;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||||
|
transform="matrix(-3.34328,0,0,3.34328,-89.2797,-623.176)"
|
||||||
|
id="path4050-2-7-9-4"
|
||||||
|
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52343899;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||||
|
transform="matrix(-3.34328,0,0,3.34328,-111.2797,-623.176)"
|
||||||
|
id="path4050-2-7-9-4-8"
|
||||||
|
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52343899;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||||
|
transform="matrix(-2.86565,0,0,2.86565,-70.8457,-534.143)"
|
||||||
|
id="path4050-2-7-9-4-0"
|
||||||
|
style="color:#000000;fill:none;stroke:#000000;stroke-width:0.69792098;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||||
|
transform="matrix(-2.86565,0,0,2.86565,-92.8457,-534.143)"
|
||||||
|
id="path4050-2-7-9-4-0-9"
|
||||||
|
style="color:#000000;fill:none;stroke:#000000;stroke-width:0.69792098;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
d="m 47.87528,-34.0295 c 1.53896,0.0448 3.0511,0.70928 4.125,1.8125 l 32.25,32.25 -32.25,32.25 c -2.2253,2.2253 -6.2747,2.2253 -8.5,0 -2.2253,-2.22528 -2.2253,-6.2747 0,-8.5 l 23.75,-23.75 -23.75,-23.75 c -1.73168,-1.6731 -2.295,-4.44228 -1.3546,-6.65894 0.94042,-2.21668 3.32312,-3.73604 5.7296,-3.65356 z"
|
||||||
|
id="path3165-7-3-1"
|
||||||
|
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;opacity:0.35;color:#000000;fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
d="m 41.8316,28.09418 c -0.014,-1.58898 0.54158,-3.18406 1.66868,-4.31118 l 23.75,-23.75 m -25.1046,-30.40894 c 0.94042,-2.21668 3.32312,-3.73604 5.7296,-3.65356 1.53896,0.0448 3.0511,0.70928 4.125,1.8125 l 32.25,32.25"
|
||||||
|
id="path3165-7-3-1-9"
|
||||||
|
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#000000;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 841 B |
447
data/theme/ws-switch-arrow-up.svg
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="96"
|
||||||
|
height="96"
|
||||||
|
id="svg25070"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.0 r9654"
|
||||||
|
sodipodi:docname="ws-switch-arrow-up.svg">
|
||||||
|
<defs
|
||||||
|
id="defs25072">
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 24 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_z="48 : 24 : 1"
|
||||||
|
inkscape:persp3d-origin="24 : 16 : 1"
|
||||||
|
id="perspective25078" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective24985"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4034-0-4"
|
||||||
|
id="linearGradient24957"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(6)"
|
||||||
|
x1="-86.552246"
|
||||||
|
y1="185.439"
|
||||||
|
x2="-83.37072"
|
||||||
|
y2="197.31261" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4034-0-4">
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(238, 238, 236); stop-opacity: 1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4036-5-7" />
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(186, 189, 182); stop-opacity: 1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4038-9-6" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="filter24765"
|
||||||
|
inkscape:label="Invert"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
inkscape:menu="Color"
|
||||||
|
inkscape:menu-tooltip="Invert colors"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix24767"
|
||||||
|
type="saturate"
|
||||||
|
values="1"
|
||||||
|
result="fbSourceGraphic" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix24769"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4632-1-3-9-3-2"
|
||||||
|
id="linearGradient24955"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-5)"
|
||||||
|
x1="-74.520325"
|
||||||
|
y1="169.06032"
|
||||||
|
x2="-74.520325"
|
||||||
|
y2="205.94189" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4632-1-3-9-3-2">
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(238, 238, 236); stop-opacity: 1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4634-1-8-3-9-0" />
|
||||||
|
<stop
|
||||||
|
id="stop4636-1-9-9-8-8"
|
||||||
|
offset="0.0274937"
|
||||||
|
style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
id="stop4638-8-3-9-6-6"
|
||||||
|
offset="0.274937"
|
||||||
|
style="stop-color: rgb(242, 242, 242); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
id="stop4640-8-5-7-8-9"
|
||||||
|
offset="0.38707438"
|
||||||
|
style="stop-color: rgb(238, 238, 236); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
id="stop4642-5-41-9-6-9"
|
||||||
|
offset="0.66528589"
|
||||||
|
style="stop-color: rgb(217, 218, 216); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
id="stop4644-5-2-7-9-2"
|
||||||
|
offset="0.76745707"
|
||||||
|
style="stop-color: rgb(223, 224, 221); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(240, 240, 240); stop-opacity: 1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4646-3-2-3-7-3" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4869-4-1"
|
||||||
|
id="radialGradient24959"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0075, 0, 0, 1.0075, -5.4544, -1.25141)"
|
||||||
|
cx="-33.412369"
|
||||||
|
cy="185.74171"
|
||||||
|
fx="-33.412369"
|
||||||
|
fy="185.74171"
|
||||||
|
r="2.3554697" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4869-4-1">
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(255, 255, 255); stop-opacity: 1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4871-6-2" />
|
||||||
|
<stop
|
||||||
|
id="stop4879-7-4"
|
||||||
|
offset="0.31807542"
|
||||||
|
style="stop-color: rgb(238, 238, 236); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
id="stop4877-6-1"
|
||||||
|
offset="0.74691135"
|
||||||
|
style="stop-color: rgb(200, 201, 198); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(211, 215, 207); stop-opacity: 1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4873-1-0" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="filter25011"
|
||||||
|
inkscape:label="Invert"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
inkscape:menu="Color"
|
||||||
|
inkscape:menu-tooltip="Invert colors"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25013"
|
||||||
|
type="saturate"
|
||||||
|
values="1"
|
||||||
|
result="fbSourceGraphic" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25015"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" />
|
||||||
|
</filter>
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4869-4-0"
|
||||||
|
id="radialGradient24961"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0075, 0, 0, 1.0075, -5.4544, -1.25141)"
|
||||||
|
cx="-33.412369"
|
||||||
|
cy="185.74171"
|
||||||
|
fx="-33.412369"
|
||||||
|
fy="185.74171"
|
||||||
|
r="2.3554697" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4869-4-0">
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(255, 255, 255); stop-opacity: 1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4871-6-8" />
|
||||||
|
<stop
|
||||||
|
id="stop4879-7-5"
|
||||||
|
offset="0.31807542"
|
||||||
|
style="stop-color: rgb(238, 238, 236); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
id="stop4877-6-5"
|
||||||
|
offset="0.74691135"
|
||||||
|
style="stop-color: rgb(200, 201, 198); stop-opacity: 1;" />
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(211, 215, 207); stop-opacity: 1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4873-1-4" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="filter25023"
|
||||||
|
inkscape:label="Invert"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
inkscape:menu="Color"
|
||||||
|
inkscape:menu-tooltip="Invert colors"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25025"
|
||||||
|
type="saturate"
|
||||||
|
values="1"
|
||||||
|
result="fbSourceGraphic" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25027"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4941"
|
||||||
|
id="linearGradient24963"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="-39.858727"
|
||||||
|
y1="184.61784"
|
||||||
|
x2="-38.244785"
|
||||||
|
y2="188.84898" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4941">
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(255, 255, 255); stop-opacity: 1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4943" />
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4945" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="filter25033"
|
||||||
|
inkscape:label="Invert"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
inkscape:menu="Color"
|
||||||
|
inkscape:menu-tooltip="Invert colors"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25035"
|
||||||
|
type="saturate"
|
||||||
|
values="1"
|
||||||
|
result="fbSourceGraphic" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25037"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4941-7"
|
||||||
|
id="linearGradient24965"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="-39.858727"
|
||||||
|
y1="184.61784"
|
||||||
|
x2="-38.244785"
|
||||||
|
y2="188.84898" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4941-7">
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(255, 255, 255); stop-opacity: 1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4943-2" />
|
||||||
|
<stop
|
||||||
|
style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4945-5" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="filter25043"
|
||||||
|
inkscape:label="Invert"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
inkscape:menu="Color"
|
||||||
|
inkscape:menu-tooltip="Invert colors"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25045"
|
||||||
|
type="saturate"
|
||||||
|
values="1"
|
||||||
|
result="fbSourceGraphic" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25047"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="filter25049"
|
||||||
|
inkscape:label="Invert"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
inkscape:menu="Color"
|
||||||
|
inkscape:menu-tooltip="Invert colors"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25051"
|
||||||
|
type="saturate"
|
||||||
|
values="1"
|
||||||
|
result="fbSourceGraphic" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25053"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="filter25055"
|
||||||
|
inkscape:label="Invert"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
inkscape:menu="Color"
|
||||||
|
inkscape:menu-tooltip="Invert colors"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25057"
|
||||||
|
type="saturate"
|
||||||
|
values="1"
|
||||||
|
result="fbSourceGraphic" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix25059"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="2.8284271"
|
||||||
|
inkscape:cx="-12.356322"
|
||||||
|
inkscape:cy="57.536221"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:grid-bbox="true"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:window-width="1200"
|
||||||
|
inkscape:window-height="840"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="26"
|
||||||
|
inkscape:window-maximized="0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata25075">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
transform="translate(0, 48)">
|
||||||
|
<g
|
||||||
|
id="g3181"
|
||||||
|
transform="matrix(0,1,-1,0,48.0003,-48)">
|
||||||
|
<g
|
||||||
|
style="stroke:#000000;stroke-opacity:1;display:inline"
|
||||||
|
transform="matrix(2,0,0,2,193.25,-374.967)"
|
||||||
|
id="g4030-1-8">
|
||||||
|
<path
|
||||||
|
style="color:#000000;fill:none;stroke:#000000;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
d="m -72.5,173.5 -14,14 14,14"
|
||||||
|
id="path3165-7-3"
|
||||||
|
sodipodi:nodetypes="ccc"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
transform="matrix(3.34328,0,0,3.34328,185.28,-623.176)"
|
||||||
|
d="m -36.5,186.40625 c 0,1.15635 -0.937404,2.09375 -2.09375,2.09375 -1.156346,0 -2.09375,-0.9374 -2.09375,-2.09375 0,-1.15635 0.937404,-2.09375 2.09375,-2.09375 1.156346,0 2.09375,0.9374 2.09375,2.09375 z"
|
||||||
|
sodipodi:ry="2.09375"
|
||||||
|
sodipodi:rx="2.09375"
|
||||||
|
sodipodi:cy="186.40625"
|
||||||
|
sodipodi:cx="-38.59375"
|
||||||
|
id="path4050-2-7-9-4"
|
||||||
|
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52343899;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<path
|
||||||
|
transform="matrix(3.34328,0,0,3.34328,207.28,-623.176)"
|
||||||
|
d="m -36.5,186.40625 c 0,1.15635 -0.937404,2.09375 -2.09375,2.09375 -1.156346,0 -2.09375,-0.9374 -2.09375,-2.09375 0,-1.15635 0.937404,-2.09375 2.09375,-2.09375 1.156346,0 2.09375,0.9374 2.09375,2.09375 z"
|
||||||
|
sodipodi:ry="2.09375"
|
||||||
|
sodipodi:rx="2.09375"
|
||||||
|
sodipodi:cy="186.40625"
|
||||||
|
sodipodi:cx="-38.59375"
|
||||||
|
id="path4050-2-7-9-4-8"
|
||||||
|
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52343899;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<path
|
||||||
|
transform="matrix(2.86565,0,0,2.86565,166.846,-534.143)"
|
||||||
|
d="m -36.5,186.40625 c 0,1.15635 -0.937404,2.09375 -2.09375,2.09375 -1.156346,0 -2.09375,-0.9374 -2.09375,-2.09375 0,-1.15635 0.937404,-2.09375 2.09375,-2.09375 1.156346,0 2.09375,0.9374 2.09375,2.09375 z"
|
||||||
|
sodipodi:ry="2.09375"
|
||||||
|
sodipodi:rx="2.09375"
|
||||||
|
sodipodi:cy="186.40625"
|
||||||
|
sodipodi:cx="-38.59375"
|
||||||
|
id="path4050-2-7-9-4-0"
|
||||||
|
style="color:#000000;fill:none;stroke:#000000;stroke-width:0.69792098;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<path
|
||||||
|
transform="matrix(2.86565,0,0,2.86565,188.846,-534.143)"
|
||||||
|
d="m -36.5,186.40625 c 0,1.15635 -0.937404,2.09375 -2.09375,2.09375 -1.156346,0 -2.09375,-0.9374 -2.09375,-2.09375 0,-1.15635 0.937404,-2.09375 2.09375,-2.09375 1.156346,0 2.09375,0.9374 2.09375,2.09375 z"
|
||||||
|
sodipodi:ry="2.09375"
|
||||||
|
sodipodi:rx="2.09375"
|
||||||
|
sodipodi:cy="186.40625"
|
||||||
|
sodipodi:cx="-38.59375"
|
||||||
|
id="path4050-2-7-9-4-0-9"
|
||||||
|
style="color:#000000;fill:none;stroke:#000000;stroke-width:0.69792098;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<path
|
||||||
|
transform="matrix(2,0,0,2,-586,-765.967)"
|
||||||
|
sodipodi:nodetypes="ccccscccsc"
|
||||||
|
id="path3165-7-3-1"
|
||||||
|
d="m 317.06251,365.96875 c -0.76948,0.0224 -1.52555,0.35464 -2.0625,0.90625 l -16.125,16.125 16.125,16.125 c 1.11265,1.11265 3.13735,1.11265 4.25,0 1.11265,-1.11264 1.11265,-3.13735 0,-4.25 l -11.875,-11.875 11.875,-11.875 c 0.86584,-0.83655 1.1475,-2.22114 0.6773,-3.32947 -0.47021,-1.10834 -1.66156,-1.86802 -2.8648,-1.82678 z"
|
||||||
|
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;opacity:0.35;color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
transform="matrix(2,0,0,2,-586,-765.967)"
|
||||||
|
sodipodi:nodetypes="ccccccc"
|
||||||
|
id="path3165-7-3-1-9"
|
||||||
|
d="m 320.08435,397.03059 c 0.007,-0.79449 -0.27079,-1.59203 -0.83434,-2.15559 L 307.37501,383 m 12.5523,-15.20447 c -0.47021,-1.10834 -1.66156,-1.86802 -2.8648,-1.82678 -0.76948,0.0224 -1.52555,0.35464 -2.0625,0.90625 L 298.87501,383"
|
||||||
|
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 16 KiB |
@ -66,7 +66,6 @@ IGNORE_HFILES= \
|
|||||||
gactionmuxer.h \
|
gactionmuxer.h \
|
||||||
gactionobservable.h \
|
gactionobservable.h \
|
||||||
gactionobserver.h \
|
gactionobserver.h \
|
||||||
shell-network-agent.h \
|
|
||||||
shell-recorder-src.h
|
shell-recorder-src.h
|
||||||
|
|
||||||
if !BUILD_RECORDER
|
if !BUILD_RECORDER
|
||||||
@ -77,30 +76,9 @@ endif
|
|||||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||||
HTML_IMAGES=
|
HTML_IMAGES=
|
||||||
|
|
||||||
doc-gen-org.gnome.Shell.SearchProvider.xml: $(top_srcdir)/data/org.gnome.ShellSearchProvider.xml
|
|
||||||
gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.ShellSearchProvider. \
|
|
||||||
--generate-docbook doc-gen \
|
|
||||||
$(top_srcdir)/data/org.gnome.ShellSearchProvider.xml
|
|
||||||
|
|
||||||
doc-gen-org.gnome.Shell.SearchProvider2.xml: $(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
|
|
||||||
gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.ShellSearchProvider2. \
|
|
||||||
--generate-docbook doc-gen \
|
|
||||||
$(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
|
|
||||||
|
|
||||||
doc-gen-org.gnome.Shell.Screenshot.xml: $(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
|
|
||||||
gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.Shell.Screenshot. \
|
|
||||||
--generate-docbook doc-gen \
|
|
||||||
$(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
|
|
||||||
|
|
||||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||||
content_files= \
|
content_files=
|
||||||
doc-gen-org.gnome.Shell.SearchProvider.xml \
|
|
||||||
doc-gen-org.gnome.Shell.SearchProvider2.xml \
|
|
||||||
doc-gen-org.gnome.Shell.Screenshot.xml
|
|
||||||
|
|
||||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||||
# These files must be listed here *and* in content_files
|
# These files must be listed here *and* in content_files
|
||||||
@ -113,7 +91,7 @@ expand_content_files=
|
|||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||||
GTKDOC_CFLAGS=$(GNOME_SHELL_CFLAGS)
|
GTKDOC_CFLAGS=$(GNOME_SHELL_CFLAGS)
|
||||||
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(top_builddir)/src/libgnome-shell-menu.la $(top_builddir)/src/libgnome-shell-base.la $(top_builddir)/src/libgnome-shell.la
|
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(BLUETOOTH_LIBS) $(top_builddir)/src/libgnome-shell.la
|
||||||
|
|
||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||||
include $(top_srcdir)/gtk-doc.make
|
include $(top_srcdir)/gtk-doc.make
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
<chapter>
|
<chapter>
|
||||||
<title>Actors</title>
|
<title>Actors</title>
|
||||||
<xi:include href="xml/shell-generic-container.xml"/>
|
<xi:include href="xml/shell-generic-container.xml"/>
|
||||||
|
<xi:include href="xml/shell-slicer.xml"/>
|
||||||
<xi:include href="xml/shell-stack.xml"/>
|
<xi:include href="xml/shell-stack.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
<chapter>
|
<chapter>
|
||||||
@ -28,6 +29,8 @@
|
|||||||
<chapter>
|
<chapter>
|
||||||
<title>Search</title>
|
<title>Search</title>
|
||||||
<xi:include href="xml/shell-app-system.xml"/>
|
<xi:include href="xml/shell-app-system.xml"/>
|
||||||
|
<xi:include href="xml/shell-contact-system.xml"/>
|
||||||
|
<xi:include href="xml/shell-doc-system.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
<chapter>
|
<chapter>
|
||||||
<title>Tray Icons</title>
|
<title>Tray Icons</title>
|
||||||
@ -39,16 +42,17 @@
|
|||||||
<chapter>
|
<chapter>
|
||||||
<title>Recorder</title>
|
<title>Recorder</title>
|
||||||
<xi:include href="xml/shell-recorder.xml"/>
|
<xi:include href="xml/shell-recorder.xml"/>
|
||||||
|
<xi:include href="xml/shell-recorder-src.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
<chapter>
|
<chapter>
|
||||||
<title>Integration helpers and utilities</title>
|
<title>Integration helpers and utilities</title>
|
||||||
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider.xml"/>
|
|
||||||
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider2.xml"/>
|
|
||||||
<xi:include href="xml/shell-global.xml"/>
|
<xi:include href="xml/shell-global.xml"/>
|
||||||
<xi:include href="xml/shell-action-modes.xml"/>
|
|
||||||
<xi:include href="xml/shell-wm.xml"/>
|
<xi:include href="xml/shell-wm.xml"/>
|
||||||
|
<xi:include href="xml/shell-xfixes-cursor.xml"/>
|
||||||
<xi:include href="xml/shell-util.xml"/>
|
<xi:include href="xml/shell-util.xml"/>
|
||||||
<xi:include href="xml/shell-mount-operation.xml"/>
|
<xi:include href="xml/shell-mount-operation.xml"/>
|
||||||
|
<xi:include href="xml/shell-mobile-providers.xml"/>
|
||||||
|
<xi:include href="xml/shell-network-agent.xml"/>
|
||||||
<xi:include href="xml/shell-polkit-authentication-agent.xml"/>
|
<xi:include href="xml/shell-polkit-authentication-agent.xml"/>
|
||||||
<xi:include href="xml/shell-tp-client.xml"/>
|
<xi:include href="xml/shell-tp-client.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
<xi:include href="xml/st-bin.xml"/>
|
<xi:include href="xml/st-bin.xml"/>
|
||||||
<xi:include href="xml/st-box-layout.xml"/>
|
<xi:include href="xml/st-box-layout.xml"/>
|
||||||
<xi:include href="xml/st-scroll-view.xml"/>
|
<xi:include href="xml/st-scroll-view.xml"/>
|
||||||
|
<xi:include href="xml/st-table.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="styling">
|
<chapter id="styling">
|
||||||
|
@ -17,19 +17,19 @@ packages. If you are interested in building GNOME Shell from source,
|
|||||||
we would recommend building from version control using the build
|
we would recommend building from version control using the build
|
||||||
script described at:
|
script described at:
|
||||||
|
|
||||||
https://wiki.gnome.org/Projects/GnomeShell
|
http://live.gnome.org/GnomeShell
|
||||||
|
|
||||||
Not only will that give you the very latest version of this rapidly
|
Not only will that give you the very latest version of this rapidly
|
||||||
changing project, it will be much easier than get GNOME Shell and
|
changing project, it will be much easier than get GNOME Shell and
|
||||||
its dependencies to build from tarballs.</description>
|
its dependencies to build from tarballs.</description>
|
||||||
<homepage rdf:resource="https://wiki.gnome.org/Projects/GnomeShell" />
|
<!--
|
||||||
|
<homepage rdf:resource="http://live.gnome.org/GnomeShell" />
|
||||||
|
-->
|
||||||
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
||||||
<download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" />
|
<download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" />
|
||||||
<bug-database rdf:resource="https://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
|
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
|
||||||
|
|
||||||
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
|
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
||||||
<programming-language>JavaScript</programming-language>
|
|
||||||
<programming-language>C</programming-language>
|
|
||||||
|
|
||||||
<maintainer>
|
<maintainer>
|
||||||
<foaf:Person>
|
<foaf:Person>
|
||||||
@ -52,6 +52,13 @@ its dependencies to build from tarballs.</description>
|
|||||||
<gnome:userid>walters</gnome:userid>
|
<gnome:userid>walters</gnome:userid>
|
||||||
</foaf:Person>
|
</foaf:Person>
|
||||||
</maintainer>
|
</maintainer>
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Dan Winship</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:danw@gnome.org" />
|
||||||
|
<gnome:userid>danw</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
<maintainer>
|
<maintainer>
|
||||||
<foaf:Person>
|
<foaf:Person>
|
||||||
<foaf:name>Marina Zhurakhinskaya</foaf:name>
|
<foaf:name>Marina Zhurakhinskaya</foaf:name>
|
||||||
|
114
js/Makefile.am
@ -1,38 +1,102 @@
|
|||||||
NULL =
|
|
||||||
BUILT_SOURCES =
|
EXTRA_DIST = misc/config.js.in
|
||||||
|
CLEANFILES = misc/config.js
|
||||||
|
|
||||||
misc/config.js: misc/config.js.in Makefile
|
misc/config.js: misc/config.js.in Makefile
|
||||||
[ -d $(@D) ] || $(mkdir_p) $(@D) ; \
|
[ -d $(@D) ] || $(mkdir_p) $(@D) ; \
|
||||||
sed -e "s|[@]PACKAGE_NAME@|$(PACKAGE_NAME)|g" \
|
sed -e "s|[@]PACKAGE_NAME@|$(PACKAGE_NAME)|g" \
|
||||||
-e "s|[@]PACKAGE_VERSION@|$(PACKAGE_VERSION)|g" \
|
-e "s|[@]PACKAGE_VERSION@|$(PACKAGE_VERSION)|g" \
|
||||||
-e "s|[@]HAVE_BLUETOOTH@|$(HAVE_BLUETOOTH)|g" \
|
-e "s|[@]HAVE_BLUETOOTH@|$(HAVE_BLUETOOTH)|g" \
|
||||||
-e "s|[@]HAVE_NETWORKMANAGER@|$(HAVE_NETWORKMANAGER)|g" \
|
|
||||||
-e "s|[@]GETTEXT_PACKAGE@|$(GETTEXT_PACKAGE)|g" \
|
-e "s|[@]GETTEXT_PACKAGE@|$(GETTEXT_PACKAGE)|g" \
|
||||||
-e "s|[@]datadir@|$(datadir)|g" \
|
-e "s|[@]datadir@|$(datadir)|g" \
|
||||||
-e "s|[@]libexecdir@|$(libexecdir)|g" \
|
-e "s|[@]libexecdir@|$(libexecdir)|g" \
|
||||||
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
||||||
$< > $@
|
$< > $@
|
||||||
|
|
||||||
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
jsdir = $(pkgdatadir)/js
|
||||||
js-resources.h: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
|
||||||
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
|
||||||
|
|
||||||
js_built_sources = js-resources.c js-resources.h
|
nobase_dist_js_DATA = \
|
||||||
|
gdm/batch.js \
|
||||||
BUILT_SOURCES += $(js_built_sources)
|
gdm/consoleKit.js \
|
||||||
|
gdm/fingerprint.js \
|
||||||
all-local: $(js_built_sources)
|
gdm/loginDialog.js \
|
||||||
|
gdm/powerMenu.js \
|
||||||
js_resource_dist_files = $(filter-out misc/config.js, $(js_resource_files))
|
gdm/systemd.js \
|
||||||
|
gdm/util.js \
|
||||||
EXTRA_DIST = \
|
extensionPrefs/main.js \
|
||||||
$(js_resource_dist_files) \
|
misc/config.js \
|
||||||
js-resources.gresource.xml \
|
misc/extensionUtils.js \
|
||||||
misc/config.js.in \
|
misc/fileUtils.js \
|
||||||
$(NULL)
|
misc/gnomeSession.js \
|
||||||
|
misc/history.js \
|
||||||
CLEANFILES = \
|
misc/jsParse.js \
|
||||||
$(js_built_sources) \
|
misc/modemManager.js \
|
||||||
$(NULL)
|
misc/params.js \
|
||||||
|
misc/util.js \
|
||||||
|
perf/core.js \
|
||||||
|
ui/altTab.js \
|
||||||
|
ui/appDisplay.js \
|
||||||
|
ui/appFavorites.js \
|
||||||
|
ui/automountManager.js \
|
||||||
|
ui/autorunManager.js \
|
||||||
|
ui/boxpointer.js \
|
||||||
|
ui/calendar.js \
|
||||||
|
ui/checkBox.js \
|
||||||
|
ui/ctrlAltTab.js \
|
||||||
|
ui/dash.js \
|
||||||
|
ui/dateMenu.js \
|
||||||
|
ui/dnd.js \
|
||||||
|
ui/endSessionDialog.js \
|
||||||
|
ui/environment.js \
|
||||||
|
ui/extensionSystem.js \
|
||||||
|
ui/extensionDownloader.js \
|
||||||
|
ui/flashspot.js \
|
||||||
|
ui/ibusCandidatePopup.js\
|
||||||
|
ui/iconGrid.js \
|
||||||
|
ui/keyboard.js \
|
||||||
|
ui/keyringPrompt.js \
|
||||||
|
ui/layout.js \
|
||||||
|
ui/lightbox.js \
|
||||||
|
ui/lookingGlass.js \
|
||||||
|
ui/magnifier.js \
|
||||||
|
ui/magnifierDBus.js \
|
||||||
|
ui/main.js \
|
||||||
|
ui/messageTray.js \
|
||||||
|
ui/modalDialog.js \
|
||||||
|
ui/networkAgent.js \
|
||||||
|
ui/sessionMode.js \
|
||||||
|
ui/shellEntry.js \
|
||||||
|
ui/shellMountOperation.js \
|
||||||
|
ui/notificationDaemon.js \
|
||||||
|
ui/overview.js \
|
||||||
|
ui/panel.js \
|
||||||
|
ui/panelMenu.js \
|
||||||
|
ui/placeDisplay.js \
|
||||||
|
ui/polkitAuthenticationAgent.js \
|
||||||
|
ui/popupMenu.js \
|
||||||
|
ui/remoteSearch.js \
|
||||||
|
ui/runDialog.js \
|
||||||
|
ui/screenShield.js \
|
||||||
|
ui/scripting.js \
|
||||||
|
ui/search.js \
|
||||||
|
ui/searchDisplay.js \
|
||||||
|
ui/shellDBus.js \
|
||||||
|
ui/status/accessibility.js \
|
||||||
|
ui/status/keyboard.js \
|
||||||
|
ui/status/network.js \
|
||||||
|
ui/status/power.js \
|
||||||
|
ui/status/volume.js \
|
||||||
|
ui/status/bluetooth.js \
|
||||||
|
ui/telepathyClient.js \
|
||||||
|
ui/tweener.js \
|
||||||
|
ui/unlockDialog.js \
|
||||||
|
ui/userMenu.js \
|
||||||
|
ui/viewSelector.js \
|
||||||
|
ui/wanda.js \
|
||||||
|
ui/windowAttentionHandler.js \
|
||||||
|
ui/windowManager.js \
|
||||||
|
ui/workspace.js \
|
||||||
|
ui/workspaceThumbnail.js \
|
||||||
|
ui/workspacesView.js \
|
||||||
|
ui/workspaceSwitcherPopup.js \
|
||||||
|
ui/xdndHandler.js
|
||||||
|
@ -13,15 +13,13 @@ const _ = Gettext.gettext;
|
|||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
const GnomeShellIface = '<node> \
|
const GnomeShellIface = <interface name="org.gnome.Shell.Extensions">
|
||||||
<interface name="org.gnome.Shell.Extensions"> \
|
<signal name="ExtensionStatusChanged">
|
||||||
<signal name="ExtensionStatusChanged"> \
|
<arg type="s" name="uuid"/>
|
||||||
<arg type="s" name="uuid"/> \
|
<arg type="i" name="state"/>
|
||||||
<arg type="i" name="state"/> \
|
<arg type="s" name="error"/>
|
||||||
<arg type="s" name="error"/> \
|
</signal>
|
||||||
</signal> \
|
</interface>;
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
||||||
|
|
||||||
@ -46,9 +44,12 @@ const Application = new Lang.Class({
|
|||||||
|
|
||||||
this._extensionPrefsModules = {};
|
this._extensionPrefsModules = {};
|
||||||
|
|
||||||
this._startupUuid = null;
|
this._extensionIters = {};
|
||||||
this._loaded = false;
|
},
|
||||||
this._skipMainWindow = false;
|
|
||||||
|
_buildModel: function() {
|
||||||
|
this._model = new Gtk.ListStore();
|
||||||
|
this._model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]);
|
||||||
},
|
},
|
||||||
|
|
||||||
_extensionAvailable: function(uuid) {
|
_extensionAvailable: function(uuid) {
|
||||||
@ -57,12 +58,20 @@ const Application = new Lang.Class({
|
|||||||
if (!extension)
|
if (!extension)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (ExtensionUtils.isOutOfDate(extension))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setExtensionInsensitive: function(layout, cell, model, iter, data) {
|
||||||
|
let uuid = model.get_value(iter, 0);
|
||||||
|
cell.set_sensitive(this._extensionAvailable(uuid));
|
||||||
|
},
|
||||||
|
|
||||||
_getExtensionPrefsModule: function(extension) {
|
_getExtensionPrefsModule: function(extension) {
|
||||||
let uuid = extension.metadata.uuid;
|
let uuid = extension.metadata.uuid;
|
||||||
|
|
||||||
@ -92,23 +101,21 @@ const Application = new Lang.Class({
|
|||||||
widget = this._buildErrorUI(extension, e);
|
widget = this._buildErrorUI(extension, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
let dialog = new Gtk.Dialog({ use_header_bar: true,
|
// Destroy the current prefs widget, if it exists
|
||||||
modal: true,
|
if (this._extensionPrefsBin.get_child())
|
||||||
title: extension.metadata.name });
|
this._extensionPrefsBin.get_child().destroy();
|
||||||
|
|
||||||
if (this._skipMainWindow) {
|
this._extensionPrefsBin.add(widget);
|
||||||
this.application.add_window(dialog);
|
this._extensionSelector.set_active_iter(this._extensionIters[uuid]);
|
||||||
if (this._window)
|
},
|
||||||
this._window.destroy();
|
|
||||||
this._window = dialog;
|
|
||||||
this._window.window_position = Gtk.WindowPosition.CENTER;
|
|
||||||
} else {
|
|
||||||
dialog.transient_for = this._window;
|
|
||||||
}
|
|
||||||
|
|
||||||
dialog.set_default_size(600, 400);
|
_extensionSelected: function() {
|
||||||
dialog.get_content_area().add(widget);
|
let [success, iter] = this._extensionSelector.get_active_iter();
|
||||||
dialog.show();
|
if (!success)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let uuid = this._model.get_value(iter, 0);
|
||||||
|
this._selectExtension(uuid);
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildErrorUI: function(extension, exc) {
|
_buildErrorUI: function(extension, exc) {
|
||||||
@ -141,26 +148,48 @@ const Application = new Lang.Class({
|
|||||||
|
|
||||||
_buildUI: function(app) {
|
_buildUI: function(app) {
|
||||||
this._window = new Gtk.ApplicationWindow({ application: app,
|
this._window = new Gtk.ApplicationWindow({ application: app,
|
||||||
window_position: Gtk.WindowPosition.CENTER });
|
window_position: Gtk.WindowPosition.CENTER,
|
||||||
|
title: _("GNOME Shell Extension Preferences") });
|
||||||
|
|
||||||
this._window.set_size_request(800, 500);
|
this._window.set_size_request(600, 400);
|
||||||
|
|
||||||
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
|
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
|
||||||
title: _("GNOME Shell Extensions") });
|
this._window.add(vbox);
|
||||||
this._window.set_titlebar(this._titlebar);
|
|
||||||
|
|
||||||
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER,
|
let toolbar = new Gtk.Toolbar();
|
||||||
shadow_type: Gtk.ShadowType.IN,
|
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR);
|
||||||
halign: Gtk.Align.CENTER,
|
vbox.add(toolbar);
|
||||||
margin: 18 });
|
let toolitem;
|
||||||
this._window.add(scroll);
|
|
||||||
|
|
||||||
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
|
let label = new Gtk.Label({ label: '<b>' + _("Extension") + '</b>',
|
||||||
this._extensionSelector.set_sort_func(Lang.bind(this, this._sortList));
|
use_markup: true });
|
||||||
this._extensionSelector.set_header_func(Lang.bind(this, this._updateHeader));
|
toolitem = new Gtk.ToolItem({ child: label });
|
||||||
|
toolbar.add(toolitem);
|
||||||
|
|
||||||
scroll.add(this._extensionSelector);
|
this._extensionSelector = new Gtk.ComboBox({ model: this._model,
|
||||||
|
margin_left: 8,
|
||||||
|
hexpand: true });
|
||||||
|
this._extensionSelector.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED);
|
||||||
|
|
||||||
|
let renderer = new Gtk.CellRendererText();
|
||||||
|
this._extensionSelector.pack_start(renderer, true);
|
||||||
|
this._extensionSelector.add_attribute(renderer, 'text', 1);
|
||||||
|
this._extensionSelector.set_cell_data_func(renderer, Lang.bind(this, this._setExtensionInsensitive), null);
|
||||||
|
this._extensionSelector.connect('changed', Lang.bind(this, this._extensionSelected));
|
||||||
|
|
||||||
|
toolitem = new Gtk.ToolItem({ child: this._extensionSelector });
|
||||||
|
toolitem.set_expand(true);
|
||||||
|
toolbar.add(toolitem);
|
||||||
|
|
||||||
|
this._extensionPrefsBin = new Gtk.Frame();
|
||||||
|
vbox.add(this._extensionPrefsBin);
|
||||||
|
|
||||||
|
let label = new Gtk.Label({
|
||||||
|
label: _("Select an extension to configure using the combobox above."),
|
||||||
|
vexpand: true
|
||||||
|
});
|
||||||
|
|
||||||
|
this._extensionPrefsBin.add(label);
|
||||||
|
|
||||||
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
|
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
|
||||||
this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
|
this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
|
||||||
@ -171,53 +200,25 @@ const Application = new Lang.Class({
|
|||||||
this._window.show_all();
|
this._window.show_all();
|
||||||
},
|
},
|
||||||
|
|
||||||
_sortList: function(row1, row2) {
|
|
||||||
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
|
|
||||||
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
|
|
||||||
return name1.localeCompare(name2);
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateHeader: function(row, before) {
|
|
||||||
if (!before || row.get_header())
|
|
||||||
return;
|
|
||||||
|
|
||||||
let sep = new Gtk.Separator({ orientation: Gtk.Orientation.HORIZONTAL });
|
|
||||||
row.set_header(sep);
|
|
||||||
},
|
|
||||||
|
|
||||||
_scanExtensions: function() {
|
_scanExtensions: function() {
|
||||||
let finder = new ExtensionUtils.ExtensionFinder();
|
let finder = new ExtensionUtils.ExtensionFinder();
|
||||||
finder.connect('extension-found', Lang.bind(this, this._extensionFound));
|
finder.connect('extension-found', Lang.bind(this, this._extensionFound));
|
||||||
finder.scanExtensions();
|
finder.scanExtensions();
|
||||||
this._extensionsLoaded();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_extensionFound: function(finder, extension) {
|
_extensionFound: function(signals, extension) {
|
||||||
let row = new ExtensionRow(extension.uuid);
|
let iter = this._model.append();
|
||||||
|
this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]);
|
||||||
row.prefsButton.visible = this._extensionAvailable(row.uuid);
|
this._extensionIters[extension.uuid] = iter;
|
||||||
row.prefsButton.connect('clicked', Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this._selectExtension(row.uuid);
|
|
||||||
}));
|
|
||||||
|
|
||||||
row.show_all();
|
|
||||||
this._extensionSelector.add(row);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_extensionsLoaded: function() {
|
|
||||||
if (this._startupUuid && this._extensionAvailable(this._startupUuid))
|
|
||||||
this._selectExtension(this._startupUuid);
|
|
||||||
this._startupUuid = null;
|
|
||||||
this._skipMainWindow = false;
|
|
||||||
this._loaded = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onActivate: function() {
|
_onActivate: function() {
|
||||||
this._window.present();
|
this._window.present();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onStartup: function(app) {
|
_onStartup: function(app) {
|
||||||
|
this._buildModel();
|
||||||
this._buildUI(app);
|
this._buildUI(app);
|
||||||
this._scanExtensions();
|
this._scanExtensions();
|
||||||
},
|
},
|
||||||
@ -225,129 +226,21 @@ const Application = new Lang.Class({
|
|||||||
_onCommandLine: function(app, commandLine) {
|
_onCommandLine: function(app, commandLine) {
|
||||||
app.activate();
|
app.activate();
|
||||||
let args = commandLine.get_arguments();
|
let args = commandLine.get_arguments();
|
||||||
|
|
||||||
if (args.length) {
|
if (args.length) {
|
||||||
let uuid = args[0];
|
let uuid = args[0];
|
||||||
|
|
||||||
this._skipMainWindow = true;
|
|
||||||
|
|
||||||
// Strip off "extension:///" prefix which fakes a URI, if it exists
|
// Strip off "extension:///" prefix which fakes a URI, if it exists
|
||||||
uuid = stripPrefix(uuid, "extension:///");
|
uuid = stripPrefix(uuid, "extension:///");
|
||||||
|
|
||||||
if (this._extensionAvailable(uuid))
|
if (!this._extensionAvailable(uuid))
|
||||||
this._selectExtension(uuid);
|
return 1;
|
||||||
else if (!this._loaded)
|
|
||||||
this._startupUuid = uuid;
|
this._selectExtension(uuid);
|
||||||
else
|
|
||||||
this._skipMainWindow = false;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const ExtensionRow = new Lang.Class({
|
|
||||||
Name: 'ExtensionRow',
|
|
||||||
Extends: Gtk.ListBoxRow,
|
|
||||||
|
|
||||||
_init: function(uuid) {
|
|
||||||
this.parent();
|
|
||||||
|
|
||||||
this.uuid = uuid;
|
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
|
||||||
this._settings.connect('changed::enabled-extensions', Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this._switch.state = this._isEnabled();
|
|
||||||
}));
|
|
||||||
this._settings.connect('changed::disable-extension-version-validation',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._switch.sensitive = this._canEnable();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._buildUI();
|
|
||||||
},
|
|
||||||
|
|
||||||
_buildUI: function() {
|
|
||||||
let extension = ExtensionUtils.extensions[this.uuid];
|
|
||||||
|
|
||||||
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
|
|
||||||
hexpand: true, margin: 12, spacing: 6 });
|
|
||||||
this.add(hbox);
|
|
||||||
|
|
||||||
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
|
|
||||||
spacing: 6, hexpand: true });
|
|
||||||
hbox.add(vbox);
|
|
||||||
|
|
||||||
let name = GLib.markup_escape_text(extension.metadata.name, -1);
|
|
||||||
let label = new Gtk.Label({ label: '<b>' + name + '</b>',
|
|
||||||
use_markup: true,
|
|
||||||
halign: Gtk.Align.START });
|
|
||||||
vbox.add(label);
|
|
||||||
|
|
||||||
let desc = extension.metadata.description.split('\n')[0];
|
|
||||||
label = new Gtk.Label({ label: desc,
|
|
||||||
ellipsize: Pango.EllipsizeMode.END,
|
|
||||||
halign: Gtk.Align.START });
|
|
||||||
vbox.add(label);
|
|
||||||
|
|
||||||
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
|
|
||||||
no_show_all: true });
|
|
||||||
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
|
||||||
icon_size: Gtk.IconSize.BUTTON,
|
|
||||||
visible: true }));
|
|
||||||
button.get_style_context().add_class('circular');
|
|
||||||
hbox.add(button);
|
|
||||||
|
|
||||||
this.prefsButton = button;
|
|
||||||
|
|
||||||
this._switch = new Gtk.Switch({ valign: Gtk.Align.CENTER,
|
|
||||||
sensitive: this._canEnable(),
|
|
||||||
state: this._isEnabled() });
|
|
||||||
this._switch.connect('notify::active', Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
if (this._switch.active)
|
|
||||||
this._enable();
|
|
||||||
else
|
|
||||||
this._disable();
|
|
||||||
}));
|
|
||||||
this._switch.connect('state-set', function() { return true; });
|
|
||||||
hbox.add(this._switch);
|
|
||||||
},
|
|
||||||
|
|
||||||
_canEnable: function() {
|
|
||||||
let extension = ExtensionUtils.extensions[this.uuid];
|
|
||||||
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
|
||||||
|
|
||||||
return !(checkVersion && ExtensionUtils.isOutOfDate(extension));
|
|
||||||
},
|
|
||||||
|
|
||||||
_isEnabled: function() {
|
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
|
||||||
return extensions.indexOf(this.uuid) != -1;
|
|
||||||
},
|
|
||||||
|
|
||||||
_enable: function() {
|
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
|
||||||
if (extensions.indexOf(this.uuid) != -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
extensions.push(this.uuid);
|
|
||||||
this._settings.set_strv('enabled-extensions', extensions);
|
|
||||||
},
|
|
||||||
|
|
||||||
_disable: function() {
|
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
|
||||||
let pos = extensions.indexOf(this.uuid);
|
|
||||||
if (pos == -1)
|
|
||||||
return;
|
|
||||||
do {
|
|
||||||
extensions.splice(pos, 1);
|
|
||||||
pos = extensions.indexOf(this.uuid);
|
|
||||||
} while (pos != -1);
|
|
||||||
this._settings.set_strv('enabled-extensions', extensions);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function initEnvironment() {
|
function initEnvironment() {
|
||||||
// Monkey-patch in a "global" object that fakes some Shell utilities
|
// Monkey-patch in a "global" object that fakes some Shell utilities
|
||||||
// that ExtensionUtils depends on.
|
// that ExtensionUtils depends on.
|
||||||
|
@ -1,526 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
|
||||||
const Batch = imports.gdm.batch;
|
|
||||||
const GdmUtil = imports.gdm.util;
|
|
||||||
const Params = imports.misc.params;
|
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const UserWidget = imports.ui.userWidget;
|
|
||||||
|
|
||||||
const DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
|
|
||||||
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
|
||||||
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
|
||||||
|
|
||||||
const MESSAGE_FADE_OUT_ANIMATION_TIME = 0.5;
|
|
||||||
|
|
||||||
const AuthPromptMode = {
|
|
||||||
UNLOCK_ONLY: 0,
|
|
||||||
UNLOCK_OR_LOG_IN: 1
|
|
||||||
};
|
|
||||||
|
|
||||||
const AuthPromptStatus = {
|
|
||||||
NOT_VERIFYING: 0,
|
|
||||||
VERIFYING: 1,
|
|
||||||
VERIFICATION_FAILED: 2,
|
|
||||||
VERIFICATION_SUCCEEDED: 3
|
|
||||||
};
|
|
||||||
|
|
||||||
const BeginRequestType = {
|
|
||||||
PROVIDE_USERNAME: 0,
|
|
||||||
DONT_PROVIDE_USERNAME: 1
|
|
||||||
};
|
|
||||||
|
|
||||||
const AuthPrompt = new Lang.Class({
|
|
||||||
Name: 'AuthPrompt',
|
|
||||||
|
|
||||||
_init: function(gdmClient, mode) {
|
|
||||||
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
|
||||||
|
|
||||||
this._gdmClient = gdmClient;
|
|
||||||
this._mode = mode;
|
|
||||||
|
|
||||||
let reauthenticationOnly;
|
|
||||||
if (this._mode == AuthPromptMode.UNLOCK_ONLY)
|
|
||||||
reauthenticationOnly = true;
|
|
||||||
else if (this._mode == AuthPromptMode.UNLOCK_OR_LOG_IN)
|
|
||||||
reauthenticationOnly = false;
|
|
||||||
|
|
||||||
this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly: reauthenticationOnly });
|
|
||||||
|
|
||||||
this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
|
|
||||||
this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage));
|
|
||||||
this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed));
|
|
||||||
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
|
|
||||||
this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
|
|
||||||
this._userVerifier.connect('smartcard-status-changed', Lang.bind(this, this._onSmartcardStatusChanged));
|
|
||||||
this._userVerifier.connect('ovirt-user-authenticated', Lang.bind(this, this._onOVirtUserAuthenticated));
|
|
||||||
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
|
||||||
|
|
||||||
this.connect('next', Lang.bind(this, function() {
|
|
||||||
this.updateSensitivity(false);
|
|
||||||
this.startSpinning();
|
|
||||||
if (this._queryingService) {
|
|
||||||
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
|
|
||||||
} else {
|
|
||||||
this._preemptiveAnswer = this._entry.text;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
|
||||||
vertical: true });
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
|
||||||
this.actor.connect('key-press-event',
|
|
||||||
Lang.bind(this, function(actor, event) {
|
|
||||||
if (event.get_key_symbol() == Clutter.KEY_Escape) {
|
|
||||||
this.cancel();
|
|
||||||
}
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._userWell = new St.Bin({ x_fill: true,
|
|
||||||
x_align: St.Align.START });
|
|
||||||
this.actor.add(this._userWell,
|
|
||||||
{ x_align: St.Align.START,
|
|
||||||
x_fill: true,
|
|
||||||
y_fill: true,
|
|
||||||
expand: true });
|
|
||||||
this._label = new St.Label({ style_class: 'login-dialog-prompt-label' });
|
|
||||||
|
|
||||||
this.actor.add(this._label,
|
|
||||||
{ expand: true,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: true,
|
|
||||||
x_align: St.Align.START });
|
|
||||||
this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
|
||||||
can_focus: true });
|
|
||||||
ShellEntry.addContextMenu(this._entry, { isPassword: true });
|
|
||||||
|
|
||||||
this.actor.add(this._entry,
|
|
||||||
{ expand: true,
|
|
||||||
x_fill: true,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.START });
|
|
||||||
|
|
||||||
this._entry.grab_key_focus();
|
|
||||||
|
|
||||||
this._message = new St.Label({ opacity: 0,
|
|
||||||
styleClass: 'login-dialog-message' });
|
|
||||||
this._message.clutter_text.line_wrap = true;
|
|
||||||
this.actor.add(this._message, { x_fill: false, x_align: St.Align.START, y_align: St.Align.START });
|
|
||||||
|
|
||||||
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
|
|
||||||
vertical: false });
|
|
||||||
this.actor.add(this._buttonBox,
|
|
||||||
{ expand: true,
|
|
||||||
x_align: St.Align.MIDDLE,
|
|
||||||
y_align: St.Align.END });
|
|
||||||
|
|
||||||
this._defaultButtonWell = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
|
||||||
this._defaultButtonWellActor = null;
|
|
||||||
|
|
||||||
this._initButtons();
|
|
||||||
|
|
||||||
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
|
|
||||||
this._spinner = new Animation.AnimatedIcon(spinnerIcon, DEFAULT_BUTTON_WELL_ICON_SIZE);
|
|
||||||
this._spinner.actor.opacity = 0;
|
|
||||||
this._spinner.actor.show();
|
|
||||||
this._defaultButtonWell.add_child(this._spinner.actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDestroy: function() {
|
|
||||||
this._userVerifier.destroy();
|
|
||||||
this._userVerifier = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_initButtons: function() {
|
|
||||||
this.cancelButton = new St.Button({ style_class: 'modal-dialog-button button',
|
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
|
||||||
reactive: true,
|
|
||||||
can_focus: true,
|
|
||||||
label: _("Cancel") });
|
|
||||||
this.cancelButton.connect('clicked',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this.cancel();
|
|
||||||
}));
|
|
||||||
this._buttonBox.add(this.cancelButton,
|
|
||||||
{ expand: false,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.START,
|
|
||||||
y_align: St.Align.END });
|
|
||||||
|
|
||||||
this._buttonBox.add(this._defaultButtonWell,
|
|
||||||
{ expand: true,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.END,
|
|
||||||
y_align: St.Align.MIDDLE });
|
|
||||||
this.nextButton = new St.Button({ style_class: 'modal-dialog-button button',
|
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
|
||||||
reactive: true,
|
|
||||||
can_focus: true,
|
|
||||||
label: _("Next") });
|
|
||||||
this.nextButton.connect('clicked',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this.emit('next');
|
|
||||||
}));
|
|
||||||
this.nextButton.add_style_pseudo_class('default');
|
|
||||||
this._buttonBox.add(this.nextButton,
|
|
||||||
{ expand: false,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: false,
|
|
||||||
x_align: St.Align.END,
|
|
||||||
y_align: St.Align.END });
|
|
||||||
|
|
||||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
|
||||||
|
|
||||||
this._entry.clutter_text.connect('text-changed',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
if (!this._userVerifier.hasPendingMessages)
|
|
||||||
this._fadeOutMessage();
|
|
||||||
|
|
||||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
|
||||||
}));
|
|
||||||
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
|
||||||
if (this.nextButton.reactive)
|
|
||||||
this.emit('next');
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
|
|
||||||
if (this._queryingService)
|
|
||||||
this.clear();
|
|
||||||
|
|
||||||
this._queryingService = serviceName;
|
|
||||||
if (this._preemptiveAnswer) {
|
|
||||||
this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
|
|
||||||
this._preemptiveAnswer = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.setPasswordChar(passwordChar);
|
|
||||||
this.setQuestion(question);
|
|
||||||
|
|
||||||
if (passwordChar) {
|
|
||||||
if (this._userVerifier.reauthenticating)
|
|
||||||
this.nextButton.label = _("Unlock");
|
|
||||||
else
|
|
||||||
this.nextButton.label = C_("button", "Sign In");
|
|
||||||
} else {
|
|
||||||
this.nextButton.label = _("Next");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateSensitivity(true);
|
|
||||||
this.emit('prompted');
|
|
||||||
},
|
|
||||||
|
|
||||||
_onOVirtUserAuthenticated: function() {
|
|
||||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
|
||||||
this.reset();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onSmartcardStatusChanged: function() {
|
|
||||||
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
|
||||||
|
|
||||||
// Most of the time we want to reset if the user inserts or removes
|
|
||||||
// a smartcard. Smartcard insertion "preempts" what the user was
|
|
||||||
// doing, and smartcard removal aborts the preemption.
|
|
||||||
// The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying
|
|
||||||
// with a smartcard
|
|
||||||
// 2) Don't reset if we've already succeeded at verification and
|
|
||||||
// the user is getting logged in.
|
|
||||||
if (this._userVerifier.serviceIsDefault(GdmUtil.SMARTCARD_SERVICE_NAME) &&
|
|
||||||
this.verificationStatus == AuthPromptStatus.VERIFYING &&
|
|
||||||
this.smartcardDetected)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
|
||||||
this.reset();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onShowMessage: function(userVerifier, message, type) {
|
|
||||||
this.setMessage(message, type);
|
|
||||||
this.emit('prompted');
|
|
||||||
},
|
|
||||||
|
|
||||||
_onVerificationFailed: function() {
|
|
||||||
this._queryingService = null;
|
|
||||||
this.clear();
|
|
||||||
|
|
||||||
this.updateSensitivity(true);
|
|
||||||
this.setActorInDefaultButtonWell(null);
|
|
||||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onVerificationComplete: function() {
|
|
||||||
this.setActorInDefaultButtonWell(null);
|
|
||||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
|
|
||||||
this.cancelButton.reactive = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onReset: function() {
|
|
||||||
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
|
||||||
this.reset();
|
|
||||||
},
|
|
||||||
|
|
||||||
addActorToDefaultButtonWell: function(actor) {
|
|
||||||
this._defaultButtonWell.add_child(actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
setActorInDefaultButtonWell: function(actor, animate) {
|
|
||||||
if (!this._defaultButtonWellActor &&
|
|
||||||
!actor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let oldActor = this._defaultButtonWellActor;
|
|
||||||
|
|
||||||
if (oldActor)
|
|
||||||
Tweener.removeTweens(oldActor);
|
|
||||||
|
|
||||||
let wasSpinner;
|
|
||||||
if (oldActor == this._spinner.actor)
|
|
||||||
wasSpinner = true;
|
|
||||||
else
|
|
||||||
wasSpinner = false;
|
|
||||||
|
|
||||||
let isSpinner;
|
|
||||||
if (actor == this._spinner.actor)
|
|
||||||
isSpinner = true;
|
|
||||||
else
|
|
||||||
isSpinner = false;
|
|
||||||
|
|
||||||
if (this._defaultButtonWellActor != actor && oldActor) {
|
|
||||||
if (!animate) {
|
|
||||||
oldActor.opacity = 0;
|
|
||||||
|
|
||||||
if (wasSpinner) {
|
|
||||||
if (this._spinner)
|
|
||||||
this._spinner.stop();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Tweener.addTween(oldActor,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
|
||||||
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
|
||||||
transition: 'linear',
|
|
||||||
onCompleteScope: this,
|
|
||||||
onComplete: function() {
|
|
||||||
if (wasSpinner) {
|
|
||||||
if (this._spinner)
|
|
||||||
this._spinner.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actor) {
|
|
||||||
if (isSpinner)
|
|
||||||
this._spinner.play();
|
|
||||||
|
|
||||||
if (!animate)
|
|
||||||
actor.opacity = 255;
|
|
||||||
else
|
|
||||||
Tweener.addTween(actor,
|
|
||||||
{ opacity: 255,
|
|
||||||
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
|
||||||
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
|
||||||
transition: 'linear' });
|
|
||||||
}
|
|
||||||
|
|
||||||
this._defaultButtonWellActor = actor;
|
|
||||||
},
|
|
||||||
|
|
||||||
startSpinning: function() {
|
|
||||||
this.setActorInDefaultButtonWell(this._spinner.actor, true);
|
|
||||||
},
|
|
||||||
|
|
||||||
stopSpinning: function() {
|
|
||||||
this.setActorInDefaultButtonWell(null, false);
|
|
||||||
},
|
|
||||||
|
|
||||||
clear: function() {
|
|
||||||
this._entry.text = '';
|
|
||||||
this.stopSpinning();
|
|
||||||
},
|
|
||||||
|
|
||||||
setPasswordChar: function(passwordChar) {
|
|
||||||
this._entry.clutter_text.set_password_char(passwordChar);
|
|
||||||
this._entry.menu.isPassword = passwordChar != '';
|
|
||||||
},
|
|
||||||
|
|
||||||
setQuestion: function(question) {
|
|
||||||
this._label.set_text(question);
|
|
||||||
|
|
||||||
this._label.show();
|
|
||||||
this._entry.show();
|
|
||||||
|
|
||||||
this._entry.grab_key_focus();
|
|
||||||
},
|
|
||||||
|
|
||||||
getAnswer: function() {
|
|
||||||
let text;
|
|
||||||
|
|
||||||
if (this._preemptiveAnswer) {
|
|
||||||
text = this._preemptiveAnswer;
|
|
||||||
this._preemptiveAnswer = null;
|
|
||||||
} else {
|
|
||||||
text = this._entry.get_text();
|
|
||||||
}
|
|
||||||
|
|
||||||
return text;
|
|
||||||
},
|
|
||||||
|
|
||||||
_fadeOutMessage: function() {
|
|
||||||
if (this._message.opacity == 0)
|
|
||||||
return;
|
|
||||||
Tweener.removeTweens(this._message);
|
|
||||||
Tweener.addTween(this._message,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: MESSAGE_FADE_OUT_ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
setMessage: function(message, type) {
|
|
||||||
if (type == GdmUtil.MessageType.ERROR)
|
|
||||||
this._message.add_style_class_name('login-dialog-message-warning');
|
|
||||||
else
|
|
||||||
this._message.remove_style_class_name('login-dialog-message-warning');
|
|
||||||
|
|
||||||
if (type == GdmUtil.MessageType.HINT)
|
|
||||||
this._message.add_style_class_name('login-dialog-message-hint');
|
|
||||||
else
|
|
||||||
this._message.remove_style_class_name('login-dialog-message-hint');
|
|
||||||
|
|
||||||
if (message) {
|
|
||||||
Tweener.removeTweens(this._message);
|
|
||||||
this._message.text = message;
|
|
||||||
this._message.opacity = 255;
|
|
||||||
} else {
|
|
||||||
this._message.opacity = 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateNextButtonSensitivity: function(sensitive) {
|
|
||||||
this.nextButton.reactive = sensitive;
|
|
||||||
this.nextButton.can_focus = sensitive;
|
|
||||||
},
|
|
||||||
|
|
||||||
updateSensitivity: function(sensitive) {
|
|
||||||
this._updateNextButtonSensitivity(sensitive && this._entry.text.length > 0);
|
|
||||||
this._entry.reactive = sensitive;
|
|
||||||
this._entry.clutter_text.editable = sensitive;
|
|
||||||
},
|
|
||||||
|
|
||||||
hide: function() {
|
|
||||||
this.setActorInDefaultButtonWell(null, true);
|
|
||||||
this.actor.hide();
|
|
||||||
this._message.opacity = 0;
|
|
||||||
|
|
||||||
this.setUser(null);
|
|
||||||
|
|
||||||
this.updateSensitivity(true);
|
|
||||||
this._entry.set_text('');
|
|
||||||
},
|
|
||||||
|
|
||||||
setUser: function(user) {
|
|
||||||
let oldChild = this._userWell.get_child();
|
|
||||||
if (oldChild)
|
|
||||||
oldChild.destroy();
|
|
||||||
|
|
||||||
if (user) {
|
|
||||||
let userWidget = new UserWidget.UserWidget(user);
|
|
||||||
this._userWell.set_child(userWidget.actor);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
reset: function() {
|
|
||||||
let oldStatus = this.verificationStatus;
|
|
||||||
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
|
||||||
this.cancelButton.reactive = true;
|
|
||||||
this.nextButton.label = _("Next");
|
|
||||||
|
|
||||||
if (this._userVerifier)
|
|
||||||
this._userVerifier.cancel();
|
|
||||||
|
|
||||||
this._queryingService = null;
|
|
||||||
this.clear();
|
|
||||||
this._message.opacity = 0;
|
|
||||||
this.setUser(null);
|
|
||||||
this.stopSpinning();
|
|
||||||
|
|
||||||
if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED)
|
|
||||||
this.emit('failed');
|
|
||||||
|
|
||||||
let beginRequestType;
|
|
||||||
|
|
||||||
if (this._mode == AuthPromptMode.UNLOCK_ONLY) {
|
|
||||||
// The user is constant at the unlock screen, so it will immediately
|
|
||||||
// respond to the request with the username
|
|
||||||
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
|
|
||||||
} else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) ||
|
|
||||||
this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME)) {
|
|
||||||
// We don't need to know the username if the user preempted the login screen
|
|
||||||
// with a smartcard or with preauthenticated oVirt credentials
|
|
||||||
beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME;
|
|
||||||
} else {
|
|
||||||
// In all other cases, we should get the username up front.
|
|
||||||
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emit('reset', beginRequestType);
|
|
||||||
},
|
|
||||||
|
|
||||||
addCharacter: function(unichar) {
|
|
||||||
if (!this._entry.visible)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._entry.grab_key_focus();
|
|
||||||
this._entry.clutter_text.insert_unichar(unichar);
|
|
||||||
},
|
|
||||||
|
|
||||||
begin: function(params) {
|
|
||||||
params = Params.parse(params, { userName: null,
|
|
||||||
hold: null });
|
|
||||||
|
|
||||||
this.updateSensitivity(false);
|
|
||||||
|
|
||||||
let hold = params.hold;
|
|
||||||
if (!hold)
|
|
||||||
hold = new Batch.Hold();
|
|
||||||
|
|
||||||
this._userVerifier.begin(params.userName, hold);
|
|
||||||
this.verificationStatus = AuthPromptStatus.VERIFYING;
|
|
||||||
},
|
|
||||||
|
|
||||||
finish: function(onComplete) {
|
|
||||||
if (!this._userVerifier.hasPendingMessages) {
|
|
||||||
this._userVerifier.clear();
|
|
||||||
onComplete();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let signalId = this._userVerifier.connect('no-more-messages',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._userVerifier.disconnect(signalId);
|
|
||||||
this._userVerifier.clear();
|
|
||||||
onComplete();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
cancel: function() {
|
|
||||||
if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.reset();
|
|
||||||
this.emit('cancelled');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(AuthPrompt.prototype);
|
|
@ -13,35 +13,9 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
*/
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
/*
|
|
||||||
* In order for transformation animations to look good, they need to be
|
|
||||||
* incremental and have some order to them (e.g., fade out hidden items,
|
|
||||||
* then shrink to close the void left over). Chaining animations in this way can
|
|
||||||
* be error-prone and wordy using just Tweener callbacks.
|
|
||||||
*
|
|
||||||
* The classes in this file help with this:
|
|
||||||
*
|
|
||||||
* - Task. encapsulates schedulable work to be run in a specific scope.
|
|
||||||
*
|
|
||||||
* - ConsecutiveBatch. runs a series of tasks in order and completes
|
|
||||||
* when the last in the series finishes.
|
|
||||||
*
|
|
||||||
* - ConcurrentBatch. runs a set of tasks at the same time and completes
|
|
||||||
* when the last to finish completes.
|
|
||||||
*
|
|
||||||
* - Hold. prevents a batch from completing the pending task until
|
|
||||||
* the hold is released.
|
|
||||||
*
|
|
||||||
* The tasks associated with a batch are specified in a list at batch
|
|
||||||
* construction time as either task objects or plain functions.
|
|
||||||
* Batches are task objects, themselves, so they can be nested.
|
|
||||||
*
|
|
||||||
* These classes aren't specific to GDM, but were found to be unintuitive and so
|
|
||||||
* are not used elsewhere. These APIs may ultimately get dropped entirely and
|
|
||||||
* replaced by something else.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
|
22
js/gdm/consoleKit.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
|
||||||
|
const ConsoleKitManagerIface = <interface name='org.freedesktop.ConsoleKit.Manager'>
|
||||||
|
<method name='CanRestart'>
|
||||||
|
<arg type='b' direction='out'/>
|
||||||
|
</method>
|
||||||
|
<method name='CanStop'>
|
||||||
|
<arg type='b' direction='out'/>
|
||||||
|
</method>
|
||||||
|
<method name='Restart' />
|
||||||
|
<method name='Stop' />
|
||||||
|
</interface>;
|
||||||
|
|
||||||
|
const ConsoleKitProxy = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface);
|
||||||
|
|
||||||
|
function ConsoleKitManager() {
|
||||||
|
return new ConsoleKitProxy(Gio.DBus.system,
|
||||||
|
'org.freedesktop.ConsoleKit',
|
||||||
|
'/org/freedesktop/ConsoleKit/Manager');
|
||||||
|
};
|
@ -5,13 +5,11 @@ const Lang = imports.lang;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const FprintManagerIface = '<node> \
|
const FprintManagerIface = <interface name='net.reactivated.Fprint.Manager'>
|
||||||
<interface name="net.reactivated.Fprint.Manager"> \
|
<method name='GetDefaultDevice'>
|
||||||
<method name="GetDefaultDevice"> \
|
<arg type='o' direction='out' />
|
||||||
<arg type="o" direction="out" /> \
|
</method>
|
||||||
</method> \
|
</interface>;
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface);
|
const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface);
|
||||||
|
|
||||||
@ -21,7 +19,8 @@ function FprintManager() {
|
|||||||
g_interface_info: FprintManagerInfo,
|
g_interface_info: FprintManagerInfo,
|
||||||
g_name: 'net.reactivated.Fprint',
|
g_name: 'net.reactivated.Fprint',
|
||||||
g_object_path: '/net/reactivated/Fprint/Manager',
|
g_object_path: '/net/reactivated/Fprint/Manager',
|
||||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
|
||||||
|
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
||||||
|
|
||||||
self.init(null);
|
self.init(null);
|
||||||
return self;
|
return self;
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const OVirtCredentialsIface = '<node> \
|
|
||||||
<interface name="org.ovirt.vdsm.Credentials"> \
|
|
||||||
<signal name="UserAuthenticated"> \
|
|
||||||
<arg type="s" name="token"/> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const OVirtCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(OVirtCredentialsIface);
|
|
||||||
|
|
||||||
let _oVirtCredentialsManager = null;
|
|
||||||
|
|
||||||
function OVirtCredentials() {
|
|
||||||
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
|
|
||||||
g_interface_name: OVirtCredentialsInfo.name,
|
|
||||||
g_interface_info: OVirtCredentialsInfo,
|
|
||||||
g_name: 'org.ovirt.vdsm.Credentials',
|
|
||||||
g_object_path: '/org/ovirt/vdsm/Credentials',
|
|
||||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
|
||||||
self.init(null);
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
const OVirtCredentialsManager = new Lang.Class({
|
|
||||||
Name: 'OVirtCredentialsManager',
|
|
||||||
_init: function() {
|
|
||||||
this._token = null;
|
|
||||||
|
|
||||||
this._credentials = new OVirtCredentials();
|
|
||||||
this._credentials.connectSignal('UserAuthenticated',
|
|
||||||
Lang.bind(this, this._onUserAuthenticated));
|
|
||||||
},
|
|
||||||
|
|
||||||
_onUserAuthenticated: function(proxy, sender, [token]) {
|
|
||||||
this._token = token;
|
|
||||||
this.emit('user-authenticated', token);
|
|
||||||
},
|
|
||||||
|
|
||||||
hasToken: function() {
|
|
||||||
return this._token != null;
|
|
||||||
},
|
|
||||||
|
|
||||||
getToken: function() {
|
|
||||||
return this._token;
|
|
||||||
},
|
|
||||||
|
|
||||||
resetToken: function() {
|
|
||||||
this._token = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(OVirtCredentialsManager.prototype);
|
|
||||||
|
|
||||||
function getOVirtCredentialsManager() {
|
|
||||||
if (!_oVirtCredentialsManager)
|
|
||||||
_oVirtCredentialsManager = new OVirtCredentialsManager();
|
|
||||||
|
|
||||||
return _oVirtCredentialsManager;
|
|
||||||
}
|
|
170
js/gdm/powerMenu.js
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/*
|
||||||
|
* Copyright 2011 Red Hat, Inc
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const UPowerGlib = imports.gi.UPowerGlib;
|
||||||
|
|
||||||
|
const ConsoleKit = imports.gdm.consoleKit;
|
||||||
|
const Systemd = imports.gdm.systemd;
|
||||||
|
|
||||||
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
|
const PowerMenuButton = new Lang.Class({
|
||||||
|
Name: 'PowerMenuButton',
|
||||||
|
Extends: PanelMenu.SystemStatusButton,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent('system-shutdown', null);
|
||||||
|
this._upClient = new UPowerGlib.Client();
|
||||||
|
|
||||||
|
if (Systemd.haveSystemd())
|
||||||
|
this._systemdLoginManager = new Systemd.SystemdLoginManager();
|
||||||
|
else
|
||||||
|
this._consoleKitManager = new ConsoleKit.ConsoleKitManager();
|
||||||
|
|
||||||
|
this._createSubMenu();
|
||||||
|
|
||||||
|
this._upClient.connect('notify::can-suspend',
|
||||||
|
Lang.bind(this, this._updateHaveSuspend));
|
||||||
|
this._updateHaveSuspend();
|
||||||
|
|
||||||
|
// ConsoleKit doesn't send notifications when shutdown/reboot
|
||||||
|
// are disabled, so we update the menu item each time the menu opens
|
||||||
|
this.menu.connect('open-state-changed', Lang.bind(this,
|
||||||
|
function(menu, open) {
|
||||||
|
if (open) {
|
||||||
|
this._updateHaveShutdown();
|
||||||
|
this._updateHaveRestart();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
this._updateHaveShutdown();
|
||||||
|
this._updateHaveRestart();
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateVisibility: function() {
|
||||||
|
let shouldBeVisible = (this._haveSuspend || this._haveShutdown || this._haveRestart);
|
||||||
|
this.actor.visible = shouldBeVisible;
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateHaveShutdown: function() {
|
||||||
|
|
||||||
|
if (Systemd.haveSystemd()) {
|
||||||
|
this._systemdLoginManager.CanPowerOffRemote(Lang.bind(this,
|
||||||
|
function(result, error) {
|
||||||
|
if (!error)
|
||||||
|
this._haveShutdown = result[0] != 'no';
|
||||||
|
else
|
||||||
|
this._haveShutdown = false;
|
||||||
|
|
||||||
|
this._powerOffItem.actor.visible = this._haveShutdown;
|
||||||
|
this._updateVisibility();
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
this._consoleKitManager.CanStopRemote(Lang.bind(this,
|
||||||
|
function(result, error) {
|
||||||
|
if (!error)
|
||||||
|
this._haveShutdown = result[0];
|
||||||
|
else
|
||||||
|
this._haveShutdown = false;
|
||||||
|
|
||||||
|
this._powerOffItem.actor.visible = this._haveShutdown;
|
||||||
|
this._updateVisibility();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateHaveRestart: function() {
|
||||||
|
|
||||||
|
if (Systemd.haveSystemd()) {
|
||||||
|
this._systemdLoginManager.CanRebootRemote(Lang.bind(this,
|
||||||
|
function(result, error) {
|
||||||
|
if (!error)
|
||||||
|
this._haveRestart = result[0] != 'no';
|
||||||
|
else
|
||||||
|
this._haveRestart = false;
|
||||||
|
|
||||||
|
this._restartItem.actor.visible = this._haveRestart;
|
||||||
|
this._updateVisibility();
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
this._consoleKitManager.CanRestartRemote(Lang.bind(this,
|
||||||
|
function(result, error) {
|
||||||
|
if (!error)
|
||||||
|
this._haveRestart = result[0];
|
||||||
|
else
|
||||||
|
this._haveRestart = false;
|
||||||
|
|
||||||
|
this._restartItem.actor.visible = this._haveRestart;
|
||||||
|
this._updateVisibility();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateHaveSuspend: function() {
|
||||||
|
this._haveSuspend = this._upClient.get_can_suspend();
|
||||||
|
this._suspendItem.actor.visible = this._haveSuspend;
|
||||||
|
this._updateVisibility();
|
||||||
|
},
|
||||||
|
|
||||||
|
_createSubMenu: function() {
|
||||||
|
let item;
|
||||||
|
|
||||||
|
item = new PopupMenu.PopupMenuItem(_("Suspend"));
|
||||||
|
item.connect('activate', Lang.bind(this, this._onActivateSuspend));
|
||||||
|
this.menu.addMenuItem(item);
|
||||||
|
this._suspendItem = item;
|
||||||
|
|
||||||
|
item = new PopupMenu.PopupMenuItem(_("Restart"));
|
||||||
|
item.connect('activate', Lang.bind(this, this._onActivateRestart));
|
||||||
|
this.menu.addMenuItem(item);
|
||||||
|
this._restartItem = item;
|
||||||
|
|
||||||
|
item = new PopupMenu.PopupMenuItem(_("Power Off"));
|
||||||
|
item.connect('activate', Lang.bind(this, this._onActivatePowerOff));
|
||||||
|
this.menu.addMenuItem(item);
|
||||||
|
this._powerOffItem = item;
|
||||||
|
},
|
||||||
|
|
||||||
|
_onActivateSuspend: function() {
|
||||||
|
if (this._haveSuspend)
|
||||||
|
this._upClient.suspend_sync(null);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onActivateRestart: function() {
|
||||||
|
if (!this._haveRestart)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Systemd.haveSystemd())
|
||||||
|
this._systemdLoginManager.RebootRemote(true);
|
||||||
|
else
|
||||||
|
this._consoleKitManager.RestartRemote();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onActivatePowerOff: function() {
|
||||||
|
if (!this._haveShutdown)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Systemd.haveSystemd())
|
||||||
|
this._systemdLoginManager.PowerOffRemote(true);
|
||||||
|
else
|
||||||
|
this._consoleKitManager.StopRemote();
|
||||||
|
}
|
||||||
|
});
|
157
js/gdm/realmd.js
@ -1,157 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const ProviderIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.realmd.Provider"> \
|
|
||||||
<property name="Name" type="s" access="read"/> \
|
|
||||||
<property name="Version" type="s" access="read"/> \
|
|
||||||
<property name="Realms" type="ao" access="read"/> \
|
|
||||||
<method name="Discover"> \
|
|
||||||
<arg name="string" type="s" direction="in"/> \
|
|
||||||
<arg name="options" type="a{sv}" direction="in"/> \
|
|
||||||
<arg name="relevance" type="i" direction="out"/> \
|
|
||||||
<arg name="realm" type="ao" direction="out"/> \
|
|
||||||
</method> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface);
|
|
||||||
|
|
||||||
const ServiceIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.realmd.Service"> \
|
|
||||||
<method name="Cancel"> \
|
|
||||||
<arg name="operation" type="s" direction="in"/> \
|
|
||||||
</method> \
|
|
||||||
<method name="Release" /> \
|
|
||||||
<method name="SetLocale"> \
|
|
||||||
<arg name="locale" type="s" direction="in"/> \
|
|
||||||
</method> \
|
|
||||||
<signal name="Diagnostics"> \
|
|
||||||
<arg name="data" type="s"/> \
|
|
||||||
<arg name="operation" type="s"/> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface);
|
|
||||||
|
|
||||||
const RealmIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.realmd.Realm"> \
|
|
||||||
<property name="Name" type="s" access="read"/> \
|
|
||||||
<property name="Configured" type="s" access="read"/> \
|
|
||||||
<property name="Details" type="a(ss)" access="read"/> \
|
|
||||||
<property name="LoginFormats" type="as" access="read"/> \
|
|
||||||
<property name="LoginPolicy" type="s" access="read"/> \
|
|
||||||
<property name="PermittedLogins" type="as" access="read"/> \
|
|
||||||
<property name="SupportedInterfaces" type="as" access="read"/> \
|
|
||||||
<method name="ChangeLoginPolicy"> \
|
|
||||||
<arg name="login_policy" type="s" direction="in"/> \
|
|
||||||
<arg name="permitted_add" type="as" direction="in"/> \
|
|
||||||
<arg name="permitted_remove" type="as" direction="in"/> \
|
|
||||||
<arg name="options" type="a{sv}" direction="in"/> \
|
|
||||||
</method> \
|
|
||||||
<method name="Deconfigure"> \
|
|
||||||
<arg name="options" type="a{sv}" direction="in"/> \
|
|
||||||
</method> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
|
||||||
|
|
||||||
const Manager = new Lang.Class({
|
|
||||||
Name: 'Manager',
|
|
||||||
|
|
||||||
_init: function(parentActor) {
|
|
||||||
this._aggregateProvider = Provider(Gio.DBus.system,
|
|
||||||
'org.freedesktop.realmd',
|
|
||||||
'/org/freedesktop/realmd',
|
|
||||||
Lang.bind(this, this._reloadRealms))
|
|
||||||
this._realms = {};
|
|
||||||
|
|
||||||
this._signalId = this._aggregateProvider.connect('g-properties-changed',
|
|
||||||
Lang.bind(this, function(proxy, properties) {
|
|
||||||
if ('Realms' in properties.deep_unpack())
|
|
||||||
this._reloadRealms();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_reloadRealms: function() {
|
|
||||||
let realmPaths = this._aggregateProvider.Realms;
|
|
||||||
|
|
||||||
if (!realmPaths)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (let i = 0; i < realmPaths.length; i++) {
|
|
||||||
let realm = Realm(Gio.DBus.system,
|
|
||||||
'org.freedesktop.realmd',
|
|
||||||
realmPaths[i],
|
|
||||||
Lang.bind(this, this._onRealmLoaded));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_reloadRealm: function(realm) {
|
|
||||||
if (!realm.Configured) {
|
|
||||||
if (this._realms[realm.get_object_path()])
|
|
||||||
delete this._realms[realm.get_object_path()];
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._realms[realm.get_object_path()] = realm;
|
|
||||||
|
|
||||||
this._updateLoginFormat();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onRealmLoaded: function(realm, error) {
|
|
||||||
if (error)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._reloadRealm(realm);
|
|
||||||
|
|
||||||
realm.connect('g-properties-changed',
|
|
||||||
Lang.bind(this, function(proxy, properties) {
|
|
||||||
if ('Configured' in properties.deep_unpack())
|
|
||||||
this._reloadRealm(realm);
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateLoginFormat: function() {
|
|
||||||
let newLoginFormat;
|
|
||||||
|
|
||||||
for (let realmPath in this._realms) {
|
|
||||||
let realm = this._realms[realmPath];
|
|
||||||
if (realm.LoginFormats && realm.LoginFormats.length > 0) {
|
|
||||||
newLoginFormat = realm.LoginFormats[0];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._loginFormat != newLoginFormat) {
|
|
||||||
this._loginFormat = newLoginFormat;
|
|
||||||
this.emit('login-format-changed', newLoginFormat);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
get loginFormat() {
|
|
||||||
if (this._loginFormat !== undefined)
|
|
||||||
return this._loginFormat;
|
|
||||||
|
|
||||||
this._updateLoginFormat();
|
|
||||||
|
|
||||||
return this._loginFormat;
|
|
||||||
},
|
|
||||||
|
|
||||||
release: function() {
|
|
||||||
Service(Gio.DBus.system,
|
|
||||||
'org.freedesktop.realmd',
|
|
||||||
'/org/freedesktop/realmd',
|
|
||||||
function(service) {
|
|
||||||
service.ReleaseRemote();
|
|
||||||
});
|
|
||||||
this._aggregateProvider.disconnect(this._signalId);
|
|
||||||
this._realms = { };
|
|
||||||
this._updateLoginFormat();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(Manager.prototype)
|
|
31
js/gdm/systemd.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
|
||||||
|
const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager'>
|
||||||
|
<method name='PowerOff'>
|
||||||
|
<arg type='b' direction='in'/>
|
||||||
|
</method>
|
||||||
|
<method name='Reboot'>
|
||||||
|
<arg type='b' direction='in'/>
|
||||||
|
</method>
|
||||||
|
<method name='CanPowerOff'>
|
||||||
|
<arg type='s' direction='out'/>
|
||||||
|
</method>
|
||||||
|
<method name='CanReboot'>
|
||||||
|
<arg type='s' direction='out'/>
|
||||||
|
</method>
|
||||||
|
</interface>;
|
||||||
|
|
||||||
|
const SystemdLoginManagerProxy = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
|
||||||
|
|
||||||
|
function SystemdLoginManager() {
|
||||||
|
return new SystemdLoginManagerProxy(Gio.DBus.system,
|
||||||
|
'org.freedesktop.login1',
|
||||||
|
'/org/freedesktop/login1');
|
||||||
|
};
|
||||||
|
|
||||||
|
function haveSystemd() {
|
||||||
|
return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0;
|
||||||
|
}
|
471
js/gdm/util.js
@ -1,49 +1,25 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const Fprint = imports.gdm.fingerprint;
|
const Fprint = imports.gdm.fingerprint;
|
||||||
const OVirt = imports.gdm.oVirt;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
|
||||||
const SmartcardManager = imports.misc.smartcardManager;
|
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const PASSWORD_SERVICE_NAME = 'gdm-password';
|
const PASSWORD_SERVICE_NAME = 'gdm-password';
|
||||||
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
||||||
const SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
|
||||||
const OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
|
||||||
const FADE_ANIMATION_TIME = 0.16;
|
const FADE_ANIMATION_TIME = 0.16;
|
||||||
const CLONE_FADE_ANIMATION_TIME = 0.25;
|
|
||||||
|
|
||||||
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
||||||
const PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication';
|
|
||||||
const FINGERPRINT_AUTHENTICATION_KEY = 'enable-fingerprint-authentication';
|
const FINGERPRINT_AUTHENTICATION_KEY = 'enable-fingerprint-authentication';
|
||||||
const SMARTCARD_AUTHENTICATION_KEY = 'enable-smartcard-authentication';
|
|
||||||
const BANNER_MESSAGE_KEY = 'banner-message-enable';
|
const BANNER_MESSAGE_KEY = 'banner-message-enable';
|
||||||
const BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
|
const BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
|
||||||
const ALLOWED_FAILURES_KEY = 'allowed-failures';
|
|
||||||
|
|
||||||
const LOGO_KEY = 'logo';
|
const LOGO_KEY = 'logo';
|
||||||
const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
|
||||||
|
|
||||||
// Give user 48ms to read each character of a PAM message
|
|
||||||
const USER_READ_TIME = 48
|
|
||||||
|
|
||||||
const MessageType = {
|
|
||||||
NONE: 0,
|
|
||||||
ERROR: 1,
|
|
||||||
INFO: 2,
|
|
||||||
HINT: 3
|
|
||||||
};
|
|
||||||
|
|
||||||
function fadeInActor(actor) {
|
function fadeInActor(actor) {
|
||||||
if (actor.opacity == 255 && actor.visible)
|
if (actor.opacity == 255 && actor.visible)
|
||||||
@ -91,34 +67,6 @@ function fadeOutActor(actor) {
|
|||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
|
|
||||||
function cloneAndFadeOutActor(actor) {
|
|
||||||
// Immediately hide actor so its sibling can have its space
|
|
||||||
// and position, but leave a non-reactive clone on-screen,
|
|
||||||
// so from the user's point of view it smoothly fades away
|
|
||||||
// and reveals its sibling.
|
|
||||||
actor.hide();
|
|
||||||
|
|
||||||
let clone = new Clutter.Clone({ source: actor,
|
|
||||||
reactive: false });
|
|
||||||
|
|
||||||
Main.uiGroup.add_child(clone);
|
|
||||||
|
|
||||||
let [x, y] = actor.get_transformed_position();
|
|
||||||
clone.set_position(x, y);
|
|
||||||
|
|
||||||
let hold = new Batch.Hold();
|
|
||||||
Tweener.addTween(clone,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: CLONE_FADE_ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: function() {
|
|
||||||
clone.destroy();
|
|
||||||
hold.release();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return hold;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ShellUserVerifier = new Lang.Class({
|
const ShellUserVerifier = new Lang.Class({
|
||||||
Name: 'ShellUserVerifier',
|
Name: 'ShellUserVerifier',
|
||||||
|
|
||||||
@ -128,48 +76,17 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
this._client = client;
|
this._client = client;
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
|
||||||
this._settings.connect('changed',
|
|
||||||
Lang.bind(this, this._updateDefaultService));
|
this._cancellable = new Gio.Cancellable();
|
||||||
this._updateDefaultService();
|
|
||||||
|
|
||||||
this._fprintManager = new Fprint.FprintManager();
|
this._fprintManager = new Fprint.FprintManager();
|
||||||
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
this._checkForFingerprintReader();
|
||||||
|
|
||||||
// We check for smartcards right away, since an inserted smartcard
|
|
||||||
// at startup should result in immediately initiating authentication.
|
|
||||||
// This is different than fingeprint readers, where we only check them
|
|
||||||
// after a user has been picked.
|
|
||||||
this._checkForSmartcard();
|
|
||||||
|
|
||||||
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
|
||||||
Lang.bind(this, this._checkForSmartcard));
|
|
||||||
this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
|
|
||||||
Lang.bind(this, this._checkForSmartcard));
|
|
||||||
|
|
||||||
this._messageQueue = [];
|
|
||||||
this._messageQueueTimeoutId = 0;
|
|
||||||
this.hasPendingMessages = false;
|
|
||||||
this.reauthenticating = false;
|
|
||||||
|
|
||||||
this._failCounter = 0;
|
|
||||||
|
|
||||||
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
|
|
||||||
|
|
||||||
if (this._oVirtCredentialsManager.hasToken())
|
|
||||||
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
|
|
||||||
|
|
||||||
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
|
|
||||||
Lang.bind(this, this._oVirtUserAuthenticated));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
begin: function(userName, hold) {
|
begin: function(userName, hold) {
|
||||||
this._cancellable = new Gio.Cancellable();
|
|
||||||
this._hold = hold;
|
this._hold = hold;
|
||||||
this._userName = userName;
|
this._userName = userName;
|
||||||
this.reauthenticating = false;
|
|
||||||
|
|
||||||
this._checkForFingerprintReader();
|
|
||||||
|
|
||||||
if (userName) {
|
if (userName) {
|
||||||
// If possible, reauthenticate an already running session,
|
// If possible, reauthenticate an already running session,
|
||||||
@ -182,203 +99,66 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
cancel: function() {
|
cancel: function() {
|
||||||
if (this._cancellable)
|
this._cancellable.cancel();
|
||||||
this._cancellable.cancel();
|
|
||||||
|
|
||||||
if (this._userVerifier) {
|
if (this._userVerifier)
|
||||||
this._userVerifier.call_cancel_sync(null);
|
this._userVerifier.call_cancel_sync(null);
|
||||||
this.clear();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_clearUserVerifier: function() {
|
clear: function() {
|
||||||
|
this._cancellable.cancel();
|
||||||
|
|
||||||
if (this._userVerifier) {
|
if (this._userVerifier) {
|
||||||
this._userVerifier.run_dispose();
|
this._userVerifier.run_dispose();
|
||||||
this._userVerifier = null;
|
this._userVerifier = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
clear: function() {
|
|
||||||
if (this._cancellable) {
|
|
||||||
this._cancellable.cancel();
|
|
||||||
this._cancellable = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._clearUserVerifier();
|
|
||||||
this._clearMessageQueue();
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
this.clear();
|
|
||||||
|
|
||||||
this._settings.run_dispose();
|
|
||||||
this._settings = null;
|
|
||||||
|
|
||||||
this._smartcardManager.disconnect(this._smartcardInsertedId);
|
|
||||||
this._smartcardManager.disconnect(this._smartcardRemovedId);
|
|
||||||
this._smartcardManager = null;
|
|
||||||
|
|
||||||
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
|
|
||||||
this._oVirtCredentialsManager = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
answerQuery: function(serviceName, answer) {
|
answerQuery: function(serviceName, answer) {
|
||||||
if (!this.hasPendingMessages) {
|
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
|
||||||
} else {
|
|
||||||
let signalId = this.connect('no-more-messages',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this.disconnect(signalId);
|
|
||||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_getIntervalForMessage: function(message) {
|
|
||||||
// We probably could be smarter here
|
|
||||||
return message.length * USER_READ_TIME;
|
|
||||||
},
|
|
||||||
|
|
||||||
finishMessageQueue: function() {
|
|
||||||
if (!this.hasPendingMessages)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._messageQueue = [];
|
|
||||||
|
|
||||||
this.hasPendingMessages = false;
|
|
||||||
this.emit('no-more-messages');
|
|
||||||
},
|
|
||||||
|
|
||||||
_queueMessageTimeout: function() {
|
|
||||||
if (this._messageQueue.length == 0) {
|
|
||||||
this.finishMessageQueue();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._messageQueueTimeoutId != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let message = this._messageQueue.shift();
|
|
||||||
|
|
||||||
this.emit('show-message', message.text, message.type);
|
|
||||||
|
|
||||||
this._messageQueueTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
|
||||||
message.interval,
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._messageQueueTimeoutId = 0;
|
|
||||||
this._queueMessageTimeout();
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
}));
|
|
||||||
GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout');
|
|
||||||
},
|
|
||||||
|
|
||||||
_queueMessage: function(message, messageType) {
|
|
||||||
let interval = this._getIntervalForMessage(message);
|
|
||||||
|
|
||||||
this.hasPendingMessages = true;
|
|
||||||
this._messageQueue.push({ text: message, type: messageType, interval: interval });
|
|
||||||
this._queueMessageTimeout();
|
|
||||||
},
|
|
||||||
|
|
||||||
_clearMessageQueue: function() {
|
|
||||||
this.finishMessageQueue();
|
|
||||||
|
|
||||||
if (this._messageQueueTimeoutId != 0) {
|
|
||||||
GLib.source_remove(this._messageQueueTimeoutId);
|
|
||||||
this._messageQueueTimeoutId = 0;
|
|
||||||
}
|
|
||||||
this.emit('show-message', null, MessageType.NONE);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_checkForFingerprintReader: function() {
|
_checkForFingerprintReader: function() {
|
||||||
this._haveFingerprintReader = false;
|
this._haveFingerprintReader = false;
|
||||||
|
|
||||||
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY)) {
|
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY))
|
||||||
this._updateDefaultService();
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this,
|
this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this,
|
||||||
function(device, error) {
|
function(device, error) {
|
||||||
if (!error && device) {
|
if (!error && device)
|
||||||
this._haveFingerprintReader = true;
|
this._haveFingerprintReader = true;
|
||||||
this._updateDefaultService();
|
|
||||||
}
|
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_oVirtUserAuthenticated: function(token) {
|
|
||||||
this._preemptingService = OVIRT_SERVICE_NAME;
|
|
||||||
this.emit('ovirt-user-authenticated');
|
|
||||||
},
|
|
||||||
|
|
||||||
_checkForSmartcard: function() {
|
|
||||||
let smartcardDetected;
|
|
||||||
|
|
||||||
if (!this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
|
|
||||||
smartcardDetected = false;
|
|
||||||
else if (this._reauthOnly)
|
|
||||||
smartcardDetected = this._smartcardManager.hasInsertedLoginToken();
|
|
||||||
else
|
|
||||||
smartcardDetected = this._smartcardManager.hasInsertedTokens();
|
|
||||||
|
|
||||||
if (smartcardDetected != this.smartcardDetected) {
|
|
||||||
this.smartcardDetected = smartcardDetected;
|
|
||||||
|
|
||||||
if (this.smartcardDetected)
|
|
||||||
this._preemptingService = SMARTCARD_SERVICE_NAME;
|
|
||||||
else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
|
|
||||||
this._preemptingService = null;
|
|
||||||
|
|
||||||
this.emit('smartcard-status-changed');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_reportInitError: function(where, error) {
|
|
||||||
logError(error, where);
|
|
||||||
this._hold.release();
|
|
||||||
|
|
||||||
this._queueMessage(_("Authentication error"), MessageType.ERROR);
|
|
||||||
this._verificationFailed(false);
|
|
||||||
},
|
|
||||||
|
|
||||||
_reauthenticationChannelOpened: function(client, result) {
|
_reauthenticationChannelOpened: function(client, result) {
|
||||||
try {
|
try {
|
||||||
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)) {
|
this._connectSignals();
|
||||||
return;
|
this._beginVerification();
|
||||||
} 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, Lang.bind(this, this._userVerifierGot));
|
|
||||||
return;
|
|
||||||
} catch(e) {
|
|
||||||
this._reportInitError('Failed to open reauthentication channel', e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.reauthenticating = true;
|
this._hold.release();
|
||||||
this._connectSignals();
|
} catch (e) {
|
||||||
this._beginVerification();
|
if (this._reauthOnly) {
|
||||||
this._hold.release();
|
logError(e, 'Failed to open reauthentication channel');
|
||||||
|
|
||||||
|
this._hold.release();
|
||||||
|
this.emit('verification-failed');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there's no session running, or it otherwise fails, then fall back
|
||||||
|
// to performing verification from this login session
|
||||||
|
client.get_user_verifier(this._cancellable, Lang.bind(this, this._userVerifierGot));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_userVerifierGot: function(client, result) {
|
_userVerifierGot: function(client, result) {
|
||||||
try {
|
this._userVerifier = client.get_user_verifier_finish(result);
|
||||||
this._clearUserVerifier();
|
|
||||||
this._userVerifier = client.get_user_verifier_finish(result);
|
|
||||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
|
||||||
return;
|
|
||||||
} catch(e) {
|
|
||||||
this._reportInitError('Failed to obtain user verifier', e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._connectSignals();
|
this._connectSignals();
|
||||||
this._beginVerification();
|
this._beginVerification();
|
||||||
|
|
||||||
this._hold.release();
|
this._hold.release();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -392,119 +172,80 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
|
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
|
||||||
},
|
},
|
||||||
|
|
||||||
_getForegroundService: function() {
|
_beginVerification: function() {
|
||||||
if (this._preemptingService)
|
|
||||||
return this._preemptingService;
|
|
||||||
|
|
||||||
return this._defaultService;
|
|
||||||
},
|
|
||||||
|
|
||||||
serviceIsForeground: function(serviceName) {
|
|
||||||
return serviceName == this._getForegroundService();
|
|
||||||
},
|
|
||||||
|
|
||||||
serviceIsDefault: function(serviceName) {
|
|
||||||
return serviceName == this._defaultService;
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateDefaultService: function() {
|
|
||||||
if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
|
|
||||||
this._defaultService = PASSWORD_SERVICE_NAME;
|
|
||||||
else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
|
|
||||||
this._defaultService = SMARTCARD_SERVICE_NAME;
|
|
||||||
else if (this._haveFingerprintReader)
|
|
||||||
this._defaultService = FINGERPRINT_SERVICE_NAME;
|
|
||||||
},
|
|
||||||
|
|
||||||
_startService: function(serviceName) {
|
|
||||||
this._hold.acquire();
|
this._hold.acquire();
|
||||||
|
|
||||||
if (this._userName) {
|
if (this._userName) {
|
||||||
this._userVerifier.call_begin_verification_for_user(serviceName,
|
this._userVerifier.call_begin_verification_for_user(PASSWORD_SERVICE_NAME,
|
||||||
this._userName,
|
this._userName,
|
||||||
this._cancellable,
|
this._cancellable,
|
||||||
Lang.bind(this, function(obj, result) {
|
Lang.bind(this, function(obj, result) {
|
||||||
try {
|
obj.call_begin_verification_for_user_finish(result);
|
||||||
obj.call_begin_verification_for_user_finish(result);
|
this._hold.release();
|
||||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
}));
|
||||||
return;
|
|
||||||
} catch(e) {
|
|
||||||
this._reportInitError('Failed to start verification for user', e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._hold.release();
|
if (this._haveFingerprintReader) {
|
||||||
}));
|
this._hold.acquire();
|
||||||
|
|
||||||
|
this._userVerifier.call_begin_verification_for_user(FINGERPRINT_SERVICE_NAME,
|
||||||
|
this._userName,
|
||||||
|
this._cancellable,
|
||||||
|
Lang.bind(this, function(obj, result) {
|
||||||
|
obj.call_begin_verification_for_user_finish(result);
|
||||||
|
this._hold.release();
|
||||||
|
}));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this._userVerifier.call_begin_verification(serviceName,
|
this._userVerifier.call_begin_verification(PASSWORD_SERVICE_NAME,
|
||||||
this._cancellable,
|
this._cancellable,
|
||||||
Lang.bind(this, function(obj, result) {
|
Lang.bind(this, function(obj, result) {
|
||||||
try {
|
obj.call_begin_verification_finish(result);
|
||||||
obj.call_begin_verification_finish(result);
|
this._hold.release();
|
||||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
}));
|
||||||
return;
|
|
||||||
} catch(e) {
|
|
||||||
this._reportInitError('Failed to start verification', e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._hold.release();
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_beginVerification: function() {
|
|
||||||
this._startService(this._getForegroundService());
|
|
||||||
|
|
||||||
if (this._userName && this._haveFingerprintReader && !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME))
|
|
||||||
this._startService(FINGERPRINT_SERVICE_NAME);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onInfo: function(client, serviceName, info) {
|
_onInfo: function(client, serviceName, info) {
|
||||||
if (this.serviceIsForeground(serviceName)) {
|
// We don't display fingerprint messages, because they
|
||||||
this._queueMessage(info, MessageType.INFO);
|
// have words like UPEK in them. Instead we use the messages
|
||||||
} else if (serviceName == FINGERPRINT_SERVICE_NAME &&
|
// as a cue to display our own message.
|
||||||
|
if (serviceName == FINGERPRINT_SERVICE_NAME &&
|
||||||
this._haveFingerprintReader) {
|
this._haveFingerprintReader) {
|
||||||
// We don't show fingerprint messages directly since it's
|
this.emit('show-fingerprint-prompt');
|
||||||
// not the main auth service. Instead we use the messages
|
} else if (serviceName == PASSWORD_SERVICE_NAME) {
|
||||||
// as a cue to display our own message.
|
Main.notifyError(info);
|
||||||
|
|
||||||
// Translators: this message is shown below the password entry field
|
|
||||||
// to indicate the user can swipe their finger instead
|
|
||||||
this._queueMessage(_("(or swipe finger)"), MessageType.HINT);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onProblem: function(client, serviceName, problem) {
|
_onProblem: function(client, serviceName, problem) {
|
||||||
if (!this.serviceIsForeground(serviceName))
|
// we don't want to show auth failed messages to
|
||||||
|
// users who haven't enrolled their fingerprint.
|
||||||
|
if (serviceName != PASSWORD_SERVICE_NAME)
|
||||||
return;
|
return;
|
||||||
|
Main.notifyError(problem);
|
||||||
this._queueMessage(problem, MessageType.ERROR);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onInfoQuery: function(client, serviceName, question) {
|
_onInfoQuery: function(client, serviceName, question) {
|
||||||
if (!this.serviceIsForeground(serviceName))
|
// We only expect questions to come from the main auth service
|
||||||
|
if (serviceName != PASSWORD_SERVICE_NAME)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.emit('ask-question', serviceName, question, '');
|
this.emit('ask-question', serviceName, question, '');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onSecretInfoQuery: function(client, serviceName, secretQuestion) {
|
_onSecretInfoQuery: function(client, serviceName, secretQuestion) {
|
||||||
if (!this.serviceIsForeground(serviceName))
|
// We only expect secret requests to come from the main auth service
|
||||||
|
if (serviceName != PASSWORD_SERVICE_NAME)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (serviceName == OVIRT_SERVICE_NAME) {
|
|
||||||
// The only question asked by this service is "Token?"
|
|
||||||
this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
|
this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onReset: function() {
|
_onReset: function() {
|
||||||
// Clear previous attempts to authenticate
|
this._userVerifier.run_dispose();
|
||||||
this._failCounter = 0;
|
this._userVerifier = null;
|
||||||
this._updateDefaultService();
|
|
||||||
|
this._checkForFingerprintReader();
|
||||||
|
|
||||||
this.emit('reset');
|
this.emit('reset');
|
||||||
},
|
},
|
||||||
@ -513,66 +254,14 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
this.emit('verification-complete');
|
this.emit('verification-complete');
|
||||||
},
|
},
|
||||||
|
|
||||||
_cancelAndReset: function() {
|
|
||||||
this.cancel();
|
|
||||||
this._onReset();
|
|
||||||
},
|
|
||||||
|
|
||||||
_retry: function() {
|
|
||||||
this.begin(this._userName, new Batch.Hold());
|
|
||||||
},
|
|
||||||
|
|
||||||
_verificationFailed: function(retry) {
|
|
||||||
// For Not Listed / enterprise logins, immediately reset
|
|
||||||
// the dialog
|
|
||||||
// Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
|
|
||||||
// go back to the welcome screen.
|
|
||||||
|
|
||||||
this._failCounter++;
|
|
||||||
let canRetry = retry && this._userName &&
|
|
||||||
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
|
|
||||||
|
|
||||||
if (canRetry) {
|
|
||||||
if (!this.hasPendingMessages) {
|
|
||||||
this._retry();
|
|
||||||
} else {
|
|
||||||
let signalId = this.connect('no-more-messages',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this.disconnect(signalId);
|
|
||||||
this._retry();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!this.hasPendingMessages) {
|
|
||||||
this._cancelAndReset();
|
|
||||||
} else {
|
|
||||||
let signalId = this.connect('no-more-messages',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this.disconnect(signalId);
|
|
||||||
this._cancelAndReset();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emit('verification-failed');
|
|
||||||
},
|
|
||||||
|
|
||||||
_onConversationStopped: function(client, serviceName) {
|
_onConversationStopped: function(client, serviceName) {
|
||||||
// If the login failed with the preauthenticated oVirt credentials
|
|
||||||
// then discard the credentials and revert to default authentication
|
|
||||||
// mechanism.
|
|
||||||
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
|
|
||||||
this._oVirtCredentialsManager.resetToken();
|
|
||||||
this._preemptingService = null;
|
|
||||||
this._verificationFailed(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the password service fails, then cancel everything.
|
// if the password service fails, then cancel everything.
|
||||||
// But if, e.g., fingerprint fails, still give
|
// But if, e.g., fingerprint fails, still give
|
||||||
// password authentication a chance to succeed
|
// password authentication a chance to succeed
|
||||||
if (this.serviceIsForeground(serviceName)) {
|
if (serviceName == PASSWORD_SERVICE_NAME) {
|
||||||
this._verificationFailed(true);
|
this.emit('verification-failed');
|
||||||
|
} else if (serviceName == FINGERPRINT_SERVICE_NAME) {
|
||||||
|
this.emit('hide-fingerprint-prompt');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -1,126 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<gresources>
|
|
||||||
<gresource prefix="/org/gnome/shell">
|
|
||||||
<file>gdm/authPrompt.js</file>
|
|
||||||
<file>gdm/batch.js</file>
|
|
||||||
<file>gdm/fingerprint.js</file>
|
|
||||||
<file>gdm/loginDialog.js</file>
|
|
||||||
<file>gdm/oVirt.js</file>
|
|
||||||
<file>gdm/realmd.js</file>
|
|
||||||
<file>gdm/util.js</file>
|
|
||||||
|
|
||||||
<file>extensionPrefs/main.js</file>
|
|
||||||
|
|
||||||
<file>misc/config.js</file>
|
|
||||||
<file>misc/extensionUtils.js</file>
|
|
||||||
<file>misc/fileUtils.js</file>
|
|
||||||
<file>misc/gnomeSession.js</file>
|
|
||||||
<file>misc/history.js</file>
|
|
||||||
<file>misc/ibusManager.js</file>
|
|
||||||
<file>misc/jsParse.js</file>
|
|
||||||
<file>misc/keyboardManager.js</file>
|
|
||||||
<file>misc/loginManager.js</file>
|
|
||||||
<file>misc/modemManager.js</file>
|
|
||||||
<file>misc/objectManager.js</file>
|
|
||||||
<file>misc/params.js</file>
|
|
||||||
<file>misc/smartcardManager.js</file>
|
|
||||||
<file>misc/util.js</file>
|
|
||||||
|
|
||||||
<file>perf/core.js</file>
|
|
||||||
<file>perf/hwtest.js</file>
|
|
||||||
|
|
||||||
<file>portalHelper/main.js</file>
|
|
||||||
|
|
||||||
<file>ui/altTab.js</file>
|
|
||||||
<file>ui/animation.js</file>
|
|
||||||
<file>ui/appDisplay.js</file>
|
|
||||||
<file>ui/appFavorites.js</file>
|
|
||||||
<file>ui/audioDeviceSelection.js</file>
|
|
||||||
<file>ui/backgroundMenu.js</file>
|
|
||||||
<file>ui/background.js</file>
|
|
||||||
<file>ui/boxpointer.js</file>
|
|
||||||
<file>ui/calendar.js</file>
|
|
||||||
<file>ui/checkBox.js</file>
|
|
||||||
<file>ui/ctrlAltTab.js</file>
|
|
||||||
<file>ui/dash.js</file>
|
|
||||||
<file>ui/dateMenu.js</file>
|
|
||||||
<file>ui/dnd.js</file>
|
|
||||||
<file>ui/edgeDragAction.js</file>
|
|
||||||
<file>ui/endSessionDialog.js</file>
|
|
||||||
<file>ui/environment.js</file>
|
|
||||||
<file>ui/extensionDownloader.js</file>
|
|
||||||
<file>ui/extensionSystem.js</file>
|
|
||||||
<file>ui/focusCaretTracker.js</file>
|
|
||||||
<file>ui/grabHelper.js</file>
|
|
||||||
<file>ui/ibusCandidatePopup.js</file>
|
|
||||||
<file>ui/iconGrid.js</file>
|
|
||||||
<file>ui/keyboard.js</file>
|
|
||||||
<file>ui/layout.js</file>
|
|
||||||
<file>ui/lightbox.js</file>
|
|
||||||
<file>ui/lookingGlass.js</file>
|
|
||||||
<file>ui/legacyTray.js</file>
|
|
||||||
<file>ui/magnifier.js</file>
|
|
||||||
<file>ui/magnifierDBus.js</file>
|
|
||||||
<file>ui/main.js</file>
|
|
||||||
<file>ui/messageTray.js</file>
|
|
||||||
<file>ui/messageList.js</file>
|
|
||||||
<file>ui/modalDialog.js</file>
|
|
||||||
<file>ui/mpris.js</file>
|
|
||||||
<file>ui/notificationDaemon.js</file>
|
|
||||||
<file>ui/osdWindow.js</file>
|
|
||||||
<file>ui/osdMonitorLabeler.js</file>
|
|
||||||
<file>ui/overview.js</file>
|
|
||||||
<file>ui/overviewControls.js</file>
|
|
||||||
<file>ui/panel.js</file>
|
|
||||||
<file>ui/panelMenu.js</file>
|
|
||||||
<file>ui/pointerWatcher.js</file>
|
|
||||||
<file>ui/popupMenu.js</file>
|
|
||||||
<file>ui/remoteMenu.js</file>
|
|
||||||
<file>ui/remoteSearch.js</file>
|
|
||||||
<file>ui/runDialog.js</file>
|
|
||||||
<file>ui/screenShield.js</file>
|
|
||||||
<file>ui/screencast.js</file>
|
|
||||||
<file>ui/screenshot.js</file>
|
|
||||||
<file>ui/scripting.js</file>
|
|
||||||
<file>ui/search.js</file>
|
|
||||||
<file>ui/separator.js</file>
|
|
||||||
<file>ui/sessionMode.js</file>
|
|
||||||
<file>ui/shellDBus.js</file>
|
|
||||||
<file>ui/shellEntry.js</file>
|
|
||||||
<file>ui/shellMountOperation.js</file>
|
|
||||||
<file>ui/slider.js</file>
|
|
||||||
<file>ui/switcherPopup.js</file>
|
|
||||||
<file>ui/tweener.js</file>
|
|
||||||
<file>ui/unlockDialog.js</file>
|
|
||||||
<file>ui/userWidget.js</file>
|
|
||||||
<file>ui/viewSelector.js</file>
|
|
||||||
<file>ui/windowAttentionHandler.js</file>
|
|
||||||
<file>ui/windowMenu.js</file>
|
|
||||||
<file>ui/windowManager.js</file>
|
|
||||||
<file>ui/workspace.js</file>
|
|
||||||
<file>ui/workspaceSwitcherPopup.js</file>
|
|
||||||
<file>ui/workspaceThumbnail.js</file>
|
|
||||||
<file>ui/workspacesView.js</file>
|
|
||||||
<file>ui/xdndHandler.js</file>
|
|
||||||
|
|
||||||
<file>ui/components/__init__.js</file>
|
|
||||||
<file>ui/components/autorunManager.js</file>
|
|
||||||
<file>ui/components/automountManager.js</file>
|
|
||||||
<file>ui/components/networkAgent.js</file>
|
|
||||||
<file>ui/components/polkitAgent.js</file>
|
|
||||||
<file>ui/components/telepathyClient.js</file>
|
|
||||||
<file>ui/components/keyring.js</file>
|
|
||||||
|
|
||||||
<file>ui/status/accessibility.js</file>
|
|
||||||
<file>ui/status/brightness.js</file>
|
|
||||||
<file>ui/status/location.js</file>
|
|
||||||
<file>ui/status/keyboard.js</file>
|
|
||||||
<file>ui/status/network.js</file>
|
|
||||||
<file>ui/status/power.js</file>
|
|
||||||
<file>ui/status/rfkill.js</file>
|
|
||||||
<file>ui/status/volume.js</file>
|
|
||||||
<file>ui/status/bluetooth.js</file>
|
|
||||||
<file>ui/status/screencast.js</file>
|
|
||||||
<file>ui/status/system.js</file>
|
|
||||||
</gresource>
|
|
||||||
</gresources>
|
|
@ -6,8 +6,6 @@ const PACKAGE_NAME = '@PACKAGE_NAME@';
|
|||||||
const PACKAGE_VERSION = '@PACKAGE_VERSION@';
|
const PACKAGE_VERSION = '@PACKAGE_VERSION@';
|
||||||
/* 1 if gnome-bluetooth is available, 0 otherwise */
|
/* 1 if gnome-bluetooth is available, 0 otherwise */
|
||||||
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
|
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
|
||||||
/* 1 if networkmanager is available, 0 otherwise */
|
|
||||||
const HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
|
|
||||||
/* gettext package */
|
/* gettext package */
|
||||||
const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
|
const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
|
||||||
/* locale dir */
|
/* locale dir */
|
||||||
|
@ -11,7 +11,6 @@ const Gio = imports.gi.Gio;
|
|||||||
const ShellJS = imports.gi.ShellJS;
|
const ShellJS = imports.gi.ShellJS;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const FileUtils = imports.misc.fileUtils;
|
|
||||||
|
|
||||||
const ExtensionType = {
|
const ExtensionType = {
|
||||||
SYSTEM: 1,
|
SYSTEM: 1,
|
||||||
@ -43,7 +42,7 @@ function getCurrentExtension() {
|
|||||||
let path = match[1];
|
let path = match[1];
|
||||||
let file = Gio.File.new_for_path(path);
|
let file = Gio.File.new_for_path(path);
|
||||||
|
|
||||||
// Walk up the directory tree, looking for an extension with
|
// Walk up the directory tree, looking for an extesion with
|
||||||
// the same UUID as a directory name.
|
// the same UUID as a directory name.
|
||||||
while (file != null) {
|
while (file != null) {
|
||||||
let extension = extensions[file.get_basename()];
|
let extension = extensions[file.get_basename()];
|
||||||
@ -121,6 +120,11 @@ function createExtensionObject(uuid, dir, type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Encourage people to add this
|
||||||
|
if (!meta.url) {
|
||||||
|
log('Warning: Missing "url" property in %s/metadata.json'.format(uuid));
|
||||||
|
}
|
||||||
|
|
||||||
if (uuid != meta.uuid) {
|
if (uuid != meta.uuid) {
|
||||||
throw new Error('uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"');
|
throw new Error('uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"');
|
||||||
}
|
}
|
||||||
@ -151,32 +155,52 @@ function installImporter(extension) {
|
|||||||
const ExtensionFinder = new Lang.Class({
|
const ExtensionFinder = new Lang.Class({
|
||||||
Name: 'ExtensionFinder',
|
Name: 'ExtensionFinder',
|
||||||
|
|
||||||
_loadExtension: function(extensionDir, info, perUserDir) {
|
_scanExtensionsInDirectory: function(dir, type) {
|
||||||
let fileType = info.get_file_type();
|
let fileEnum;
|
||||||
if (fileType != Gio.FileType.DIRECTORY)
|
let file, info;
|
||||||
return;
|
try {
|
||||||
let uuid = info.get_name();
|
fileEnum = dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
|
||||||
let existing = extensions[uuid];
|
} catch(e) {
|
||||||
if (existing) {
|
logError(e, 'Could not enumerate extensions directory');
|
||||||
log('Extension %s already installed in %s. %s will not be loaded'.format(uuid, existing.path, extensionDir.get_path()));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let extension;
|
while ((info = fileEnum.next_file(null)) != null) {
|
||||||
let type = extensionDir.has_prefix(perUserDir) ? ExtensionType.PER_USER
|
let fileType = info.get_file_type();
|
||||||
: ExtensionType.SYSTEM;
|
if (fileType != Gio.FileType.DIRECTORY)
|
||||||
try {
|
continue;
|
||||||
extension = createExtensionObject(uuid, extensionDir, type);
|
let uuid = info.get_name();
|
||||||
} catch(e) {
|
let extensionDir = dir.get_child(uuid);
|
||||||
logError(e, 'Could not load extension %s'.format(uuid));
|
|
||||||
return;
|
let existing = extensions[uuid];
|
||||||
|
if (existing) {
|
||||||
|
log('Extension %s already installed in %s. %s will not be loaded'.format(uuid, existing.path, extensionDir.get_path()));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let extension;
|
||||||
|
try {
|
||||||
|
extension = createExtensionObject(uuid, extensionDir, type);
|
||||||
|
} catch(e) {
|
||||||
|
logError(e, 'Could not load extension %s'.format(uuid));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
this.emit('extension-found', extension);
|
||||||
}
|
}
|
||||||
this.emit('extension-found', extension);
|
fileEnum.close(null);
|
||||||
},
|
},
|
||||||
|
|
||||||
scanExtensions: function() {
|
scanExtensions: function() {
|
||||||
let perUserDir = Gio.File.new_for_path(global.userdatadir);
|
let userExtensionsDir = Gio.File.new_for_path(GLib.build_filenamev([global.userdatadir, 'extensions']));
|
||||||
FileUtils.collectFromDatadirs('extensions', true, Lang.bind(this, this._loadExtension, perUserDir));
|
this._scanExtensionsInDirectory(userExtensionsDir, ExtensionType.PER_USER);
|
||||||
|
|
||||||
|
let systemDataDirs = GLib.get_system_data_dirs();
|
||||||
|
for (let i = 0; i < systemDataDirs.length; i++) {
|
||||||
|
let dirPath = GLib.build_filenamev([systemDataDirs[i], 'gnome-shell', 'extensions']);
|
||||||
|
let dir = Gio.file_new_for_path(dirPath);
|
||||||
|
if (dir.query_exists(null))
|
||||||
|
this._scanExtensionsInDirectory(dir, ExtensionType.SYSTEM);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(ExtensionFinder.prototype);
|
Signals.addSignalMethods(ExtensionFinder.prototype);
|
||||||
|
@ -2,31 +2,25 @@
|
|||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
|
||||||
const Params = imports.misc.params;
|
|
||||||
|
|
||||||
function collectFromDatadirs(subdir, includeUserDir, processFile) {
|
function listDirAsync(file, callback) {
|
||||||
let dataDirs = GLib.get_system_data_dirs();
|
let allFiles = [];
|
||||||
if (includeUserDir)
|
file.enumerate_children_async(Gio.FILE_ATTRIBUTE_STANDARD_NAME,
|
||||||
dataDirs.unshift(GLib.get_user_data_dir());
|
Gio.FileQueryInfoFlags.NONE,
|
||||||
|
GLib.PRIORITY_LOW, null, function (obj, res) {
|
||||||
for (let i = 0; i < dataDirs.length; i++) {
|
let enumerator = obj.enumerate_children_finish(res);
|
||||||
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', subdir]);
|
function onNextFileComplete(obj, res) {
|
||||||
let dir = Gio.File.new_for_path(path);
|
let files = obj.next_files_finish(res);
|
||||||
|
if (files.length) {
|
||||||
let fileEnum;
|
allFiles = allFiles.concat(files);
|
||||||
try {
|
enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, onNextFileComplete);
|
||||||
fileEnum = dir.enumerate_children('standard::name,standard::type',
|
} else {
|
||||||
Gio.FileQueryInfoFlags.NONE, null);
|
enumerator.close(null);
|
||||||
} catch (e) {
|
callback(allFiles);
|
||||||
fileEnum = null;
|
}
|
||||||
}
|
}
|
||||||
if (fileEnum != null) {
|
enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, onNextFileComplete);
|
||||||
let info;
|
});
|
||||||
while ((info = fileEnum.next_file(null)))
|
|
||||||
processFile(fileEnum.get_child(info), info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteGFile(file) {
|
function deleteGFile(file) {
|
||||||
@ -64,6 +58,7 @@ function recursivelyMoveDir(srcDir, destDir) {
|
|||||||
let type = info.get_file_type();
|
let type = info.get_file_type();
|
||||||
let srcChild = srcDir.get_child(info.get_name());
|
let srcChild = srcDir.get_child(info.get_name());
|
||||||
let destChild = destDir.get_child(info.get_name());
|
let destChild = destDir.get_child(info.get_name());
|
||||||
|
log([srcChild.get_path(), destChild.get_path()]);
|
||||||
if (type == Gio.FileType.REGULAR)
|
if (type == Gio.FileType.REGULAR)
|
||||||
srcChild.move(destChild, Gio.FileCopyFlags.NONE, null, null);
|
srcChild.move(destChild, Gio.FileCopyFlags.NONE, null, null);
|
||||||
else if (type == Gio.FileType.DIRECTORY)
|
else if (type == Gio.FileType.DIRECTORY)
|
||||||
|
@ -4,17 +4,15 @@ const Gio = imports.gi.Gio;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const PresenceIface = '<node> \
|
const PresenceIface = <interface name="org.gnome.SessionManager.Presence">
|
||||||
<interface name="org.gnome.SessionManager.Presence"> \
|
<method name="SetStatus">
|
||||||
<method name="SetStatus"> \
|
<arg type="u" direction="in"/>
|
||||||
<arg type="u" direction="in"/> \
|
</method>
|
||||||
</method> \
|
<property name="status" type="u" access="readwrite"/>
|
||||||
<property name="status" type="u" access="readwrite"/> \
|
<signal name="StatusChanged">
|
||||||
<signal name="StatusChanged"> \
|
<arg type="u" direction="out"/>
|
||||||
<arg type="u" direction="out"/> \
|
</signal>
|
||||||
</signal> \
|
</interface>;
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const PresenceStatus = {
|
const PresenceStatus = {
|
||||||
AVAILABLE: 0,
|
AVAILABLE: 0,
|
||||||
@ -32,16 +30,14 @@ function Presence(initCallback, cancellable) {
|
|||||||
// Note inhibitors are immutable objects, so they don't
|
// Note inhibitors are immutable objects, so they don't
|
||||||
// change at runtime (changes always come in the form
|
// change at runtime (changes always come in the form
|
||||||
// of new inhibitors)
|
// of new inhibitors)
|
||||||
const InhibitorIface = '<node> \
|
const InhibitorIface = <interface name="org.gnome.SessionManager.Inhibitor">
|
||||||
<interface name="org.gnome.SessionManager.Inhibitor"> \
|
<method name="GetAppId">
|
||||||
<method name="GetAppId"> \
|
<arg type="s" direction="out" />
|
||||||
<arg type="s" direction="out" /> \
|
</method>
|
||||||
</method> \
|
<method name="GetReason">
|
||||||
<method name="GetReason"> \
|
<arg type="s" direction="out" />
|
||||||
<arg type="s" direction="out" /> \
|
</method>
|
||||||
</method> \
|
</interface>;
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface);
|
var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface);
|
||||||
function Inhibitor(objectPath, initCallback, cancellable) {
|
function Inhibitor(objectPath, initCallback, cancellable) {
|
||||||
@ -49,29 +45,26 @@ function Inhibitor(objectPath, initCallback, cancellable) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not the full interface, only the methods we use
|
// Not the full interface, only the methods we use
|
||||||
const SessionManagerIface = '<node> \
|
const SessionManagerIface = <interface name="org.gnome.SessionManager">
|
||||||
<interface name="org.gnome.SessionManager"> \
|
<method name="Logout">
|
||||||
<method name="Logout"> \
|
<arg type="u" direction="in" />
|
||||||
<arg type="u" direction="in" /> \
|
</method>
|
||||||
</method> \
|
<method name="Shutdown" />
|
||||||
<method name="Shutdown" /> \
|
<method name="Reboot" />
|
||||||
<method name="Reboot" /> \
|
<method name="CanShutdown">
|
||||||
<method name="CanShutdown"> \
|
<arg type="b" direction="out" />
|
||||||
<arg type="b" direction="out" /> \
|
</method>
|
||||||
</method> \
|
<method name="IsInhibited">
|
||||||
<method name="IsInhibited"> \
|
<arg type="u" direction="in" />
|
||||||
<arg type="u" direction="in" /> \
|
<arg type="b" direction="out" />
|
||||||
<arg type="b" direction="out" /> \
|
</method>
|
||||||
</method> \
|
<signal name="InhibitorAdded">
|
||||||
<property name="SessionIsActive" type="b" access="read"/> \
|
<arg type="o" direction="out"/>
|
||||||
<signal name="InhibitorAdded"> \
|
</signal>
|
||||||
<arg type="o" direction="out"/> \
|
<signal name="InhibitorRemoved">
|
||||||
</signal> \
|
<arg type="o" direction="out"/>
|
||||||
<signal name="InhibitorRemoved"> \
|
</signal>
|
||||||
<arg type="o" direction="out"/> \
|
</interface>;
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface);
|
var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface);
|
||||||
function SessionManager(initCallback, cancellable) {
|
function SessionManager(initCallback, cancellable) {
|
||||||
|
@ -41,26 +41,24 @@ const HistoryManager = new Lang.Class({
|
|||||||
this._historyIndex = this._history.length;
|
this._historyIndex = this._history.length;
|
||||||
},
|
},
|
||||||
|
|
||||||
_setPrevItem: function(text) {
|
prevItem: function(text) {
|
||||||
if (this._historyIndex <= 0)
|
if (this._historyIndex <= 0)
|
||||||
return false;
|
return text;
|
||||||
|
|
||||||
if (text)
|
if (text)
|
||||||
this._history[this._historyIndex] = text;
|
this._history[this._historyIndex] = text;
|
||||||
this._historyIndex--;
|
this._historyIndex--;
|
||||||
this._indexChanged();
|
return this._indexChanged();
|
||||||
return true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_setNextItem: function(text) {
|
nextItem: function(text) {
|
||||||
if (this._historyIndex >= this._history.length)
|
if (this._historyIndex >= this._history.length)
|
||||||
return false;
|
return text;
|
||||||
|
|
||||||
if (text)
|
if (text)
|
||||||
this._history[this._historyIndex] = text;
|
this._history[this._historyIndex] = text;
|
||||||
this._historyIndex++;
|
this._historyIndex++;
|
||||||
this._indexChanged();
|
return this._indexChanged();
|
||||||
return true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
lastItem: function() {
|
lastItem: function() {
|
||||||
@ -85,11 +83,13 @@ const HistoryManager = new Lang.Class({
|
|||||||
_onEntryKeyPress: function(entry, event) {
|
_onEntryKeyPress: function(entry, event) {
|
||||||
let symbol = event.get_key_symbol();
|
let symbol = event.get_key_symbol();
|
||||||
if (symbol == Clutter.KEY_Up) {
|
if (symbol == Clutter.KEY_Up) {
|
||||||
return this._setPrevItem(entry.get_text());
|
this.prevItem(entry.get_text());
|
||||||
|
return true;
|
||||||
} else if (symbol == Clutter.KEY_Down) {
|
} else if (symbol == Clutter.KEY_Down) {
|
||||||
return this._setNextItem(entry.get_text());
|
this.nextItem(entry.get_text());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_indexChanged: function() {
|
_indexChanged: function() {
|
||||||
@ -98,6 +98,8 @@ const HistoryManager = new Lang.Class({
|
|||||||
|
|
||||||
if (this._entry)
|
if (this._entry)
|
||||||
this._entry.set_text(current);
|
this._entry.set_text(current);
|
||||||
|
|
||||||
|
return current;
|
||||||
},
|
},
|
||||||
|
|
||||||
_save: function() {
|
_save: function() {
|
||||||
|
@ -1,234 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var IBus = imports.gi.IBus;
|
|
||||||
_checkIBusVersion(1, 5, 2);
|
|
||||||
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
|
|
||||||
} catch (e) {
|
|
||||||
var IBus = null;
|
|
||||||
log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
let _ibusManager = null;
|
|
||||||
|
|
||||||
function _checkIBusVersion(requiredMajor, requiredMinor, requiredMicro) {
|
|
||||||
if ((IBus.MAJOR_VERSION > requiredMajor) ||
|
|
||||||
(IBus.MAJOR_VERSION == requiredMajor && IBus.MINOR_VERSION > requiredMinor) ||
|
|
||||||
(IBus.MAJOR_VERSION == requiredMajor && IBus.MINOR_VERSION == requiredMinor &&
|
|
||||||
IBus.MICRO_VERSION >= requiredMicro))
|
|
||||||
return;
|
|
||||||
|
|
||||||
throw "Found IBus version %d.%d.%d but required is %d.%d.%d".
|
|
||||||
format(IBus.MAJOR_VERSION, IBus.MINOR_VERSION, IBus.MINOR_VERSION,
|
|
||||||
requiredMajor, requiredMinor, requiredMicro);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIBusManager() {
|
|
||||||
if (_ibusManager == null)
|
|
||||||
_ibusManager = new IBusManager();
|
|
||||||
return _ibusManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
const IBusManager = new Lang.Class({
|
|
||||||
Name: 'IBusManager',
|
|
||||||
|
|
||||||
// This is the longest we'll keep the keyboard frozen until an input
|
|
||||||
// source is active.
|
|
||||||
_MAX_INPUT_SOURCE_ACTIVATION_TIME: 4000, // ms
|
|
||||||
_PRELOAD_ENGINES_DELAY_TIME: 30, // sec
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
if (!IBus)
|
|
||||||
return;
|
|
||||||
|
|
||||||
IBus.init();
|
|
||||||
|
|
||||||
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
|
|
||||||
|
|
||||||
this._panelService = null;
|
|
||||||
this._engines = {};
|
|
||||||
this._ready = false;
|
|
||||||
this._registerPropertiesId = 0;
|
|
||||||
this._currentEngineName = null;
|
|
||||||
this._preloadEnginesId = 0;
|
|
||||||
|
|
||||||
this._ibus = IBus.Bus.new_async();
|
|
||||||
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
|
|
||||||
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
|
|
||||||
// Need to set this to get 'global-engine-changed' emitions
|
|
||||||
this._ibus.set_watch_ibus_signal(true);
|
|
||||||
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
|
|
||||||
|
|
||||||
this._spawn();
|
|
||||||
},
|
|
||||||
|
|
||||||
_spawn: function() {
|
|
||||||
try {
|
|
||||||
Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
|
|
||||||
Gio.SubprocessFlags.NONE);
|
|
||||||
} catch(e) {
|
|
||||||
log('Failed to launch ibus-daemon: ' + e.message);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_clear: function() {
|
|
||||||
if (this._panelService)
|
|
||||||
this._panelService.destroy();
|
|
||||||
|
|
||||||
this._panelService = null;
|
|
||||||
this._candidatePopup.setPanelService(null);
|
|
||||||
this._engines = {};
|
|
||||||
this._ready = false;
|
|
||||||
this._registerPropertiesId = 0;
|
|
||||||
this._currentEngineName = null;
|
|
||||||
|
|
||||||
this.emit('ready', false);
|
|
||||||
|
|
||||||
this._spawn();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onConnected: function() {
|
|
||||||
this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines));
|
|
||||||
this._ibus.request_name_async(IBus.SERVICE_PANEL,
|
|
||||||
IBus.BusNameFlag.REPLACE_EXISTING,
|
|
||||||
-1, null,
|
|
||||||
Lang.bind(this, this._initPanelService));
|
|
||||||
},
|
|
||||||
|
|
||||||
_initEngines: function(ibus, result) {
|
|
||||||
let enginesList = this._ibus.list_engines_async_finish(result);
|
|
||||||
if (enginesList) {
|
|
||||||
for (let i = 0; i < enginesList.length; ++i) {
|
|
||||||
let name = enginesList[i].get_name();
|
|
||||||
this._engines[name] = enginesList[i];
|
|
||||||
}
|
|
||||||
this._updateReadiness();
|
|
||||||
} else {
|
|
||||||
this._clear();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_initPanelService: function(ibus, result) {
|
|
||||||
let success = this._ibus.request_name_async_finish(result);
|
|
||||||
if (success) {
|
|
||||||
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
|
|
||||||
object_path: IBus.PATH_PANEL });
|
|
||||||
this._candidatePopup.setPanelService(this._panelService);
|
|
||||||
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
|
|
||||||
try {
|
|
||||||
// IBus versions older than 1.5.10 have a bug which
|
|
||||||
// causes spurious set-content-type emissions when
|
|
||||||
// switching input focus that temporarily lose purpose
|
|
||||||
// and hints defeating its intended semantics and
|
|
||||||
// confusing users. We thus don't use it in that case.
|
|
||||||
_checkIBusVersion(1, 5, 10);
|
|
||||||
this._panelService.connect('set-content-type', Lang.bind(this, this._setContentType));
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
// If an engine is already active we need to get its properties
|
|
||||||
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
|
|
||||||
let engine;
|
|
||||||
try {
|
|
||||||
engine = this._ibus.get_global_engine_async_finish(result);
|
|
||||||
if (!engine)
|
|
||||||
return;
|
|
||||||
} catch(e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._engineChanged(this._ibus, engine.get_name());
|
|
||||||
}));
|
|
||||||
this._updateReadiness();
|
|
||||||
} else {
|
|
||||||
this._clear();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateReadiness: function() {
|
|
||||||
this._ready = (Object.keys(this._engines).length > 0 &&
|
|
||||||
this._panelService != null);
|
|
||||||
this.emit('ready', this._ready);
|
|
||||||
},
|
|
||||||
|
|
||||||
_engineChanged: function(bus, engineName) {
|
|
||||||
if (!this._ready)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._currentEngineName = engineName;
|
|
||||||
|
|
||||||
if (this._registerPropertiesId != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._registerPropertiesId =
|
|
||||||
this._panelService.connect('register-properties', Lang.bind(this, function(p, props) {
|
|
||||||
if (!props.get(0))
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._panelService.disconnect(this._registerPropertiesId);
|
|
||||||
this._registerPropertiesId = 0;
|
|
||||||
|
|
||||||
this.emit('properties-registered', this._currentEngineName, props);
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateProperty: function(panel, prop) {
|
|
||||||
this.emit('property-updated', this._currentEngineName, prop);
|
|
||||||
},
|
|
||||||
|
|
||||||
_setContentType: function(panel, purpose, hints) {
|
|
||||||
this.emit('set-content-type', purpose, hints);
|
|
||||||
},
|
|
||||||
|
|
||||||
activateProperty: function(key, state) {
|
|
||||||
this._panelService.property_activate(key, state);
|
|
||||||
},
|
|
||||||
|
|
||||||
getEngineDesc: function(id) {
|
|
||||||
if (!IBus || !this._ready)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return this._engines[id];
|
|
||||||
},
|
|
||||||
|
|
||||||
setEngine: function(id, callback) {
|
|
||||||
// Send id even if id == this._currentEngineName
|
|
||||||
// because 'properties-registered' signal can be emitted
|
|
||||||
// while this._ibusSources == null on a lock screen.
|
|
||||||
if (!IBus || !this._ready) {
|
|
||||||
if (callback)
|
|
||||||
callback();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
|
|
||||||
null, callback);
|
|
||||||
},
|
|
||||||
|
|
||||||
preloadEngines: function(ids) {
|
|
||||||
if (!IBus || !this._ibus || ids.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this._preloadEnginesId != 0) {
|
|
||||||
Mainloop.source_remove(this._preloadEnginesId);
|
|
||||||
this._preloadEnginesId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._preloadEnginesId =
|
|
||||||
Mainloop.timeout_add_seconds(this._PRELOAD_ENGINES_DELAY_TIME,
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._ibus.preload_engines_async(
|
|
||||||
ids,
|
|
||||||
-1,
|
|
||||||
null,
|
|
||||||
null);
|
|
||||||
this._preloadEnginesId = 0;
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(IBusManager.prototype);
|
|
@ -1,153 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
|
|
||||||
const DEFAULT_LOCALE = 'en_US';
|
|
||||||
const DEFAULT_LAYOUT = 'us';
|
|
||||||
const DEFAULT_VARIANT = '';
|
|
||||||
|
|
||||||
let _xkbInfo = null;
|
|
||||||
|
|
||||||
function getXkbInfo() {
|
|
||||||
if (_xkbInfo == null)
|
|
||||||
_xkbInfo = new GnomeDesktop.XkbInfo();
|
|
||||||
return _xkbInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
let _keyboardManager = null;
|
|
||||||
|
|
||||||
function getKeyboardManager() {
|
|
||||||
if (_keyboardManager == null)
|
|
||||||
_keyboardManager = new KeyboardManager();
|
|
||||||
return _keyboardManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
function releaseKeyboard() {
|
|
||||||
if (Main.modalCount > 0)
|
|
||||||
global.display.unfreeze_keyboard(global.get_current_time());
|
|
||||||
else
|
|
||||||
global.display.ungrab_keyboard(global.get_current_time());
|
|
||||||
}
|
|
||||||
|
|
||||||
function holdKeyboard() {
|
|
||||||
global.display.freeze_keyboard(global.get_current_time());
|
|
||||||
}
|
|
||||||
|
|
||||||
const KeyboardManager = new Lang.Class({
|
|
||||||
Name: 'KeyboardManager',
|
|
||||||
|
|
||||||
// The XKB protocol doesn't allow for more that 4 layouts in a
|
|
||||||
// keymap. Wayland doesn't impose this limit and libxkbcommon can
|
|
||||||
// handle up to 32 layouts but since we need to support X clients
|
|
||||||
// even as a Wayland compositor, we can't bump this.
|
|
||||||
MAX_LAYOUTS_PER_GROUP: 4,
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._xkbInfo = getXkbInfo();
|
|
||||||
this._current = null;
|
|
||||||
this._localeLayoutInfo = this._getLocaleLayout();
|
|
||||||
this._layoutInfos = {};
|
|
||||||
},
|
|
||||||
|
|
||||||
_applyLayoutGroup: function(group) {
|
|
||||||
let options = this._buildOptionsString();
|
|
||||||
let [layouts, variants] = this._buildGroupStrings(group);
|
|
||||||
Meta.get_backend().set_keymap(layouts, variants, options);
|
|
||||||
},
|
|
||||||
|
|
||||||
_applyLayoutGroupIndex: function(idx) {
|
|
||||||
Meta.get_backend().lock_layout_group(idx);
|
|
||||||
},
|
|
||||||
|
|
||||||
apply: function(id) {
|
|
||||||
let info = this._layoutInfos[id];
|
|
||||||
if (!info)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this._current && this._current.group == info.group) {
|
|
||||||
if (this._current.groupIndex != info.groupIndex)
|
|
||||||
this._applyLayoutGroupIndex(info.groupIndex);
|
|
||||||
} else {
|
|
||||||
this._applyLayoutGroup(info.group);
|
|
||||||
this._applyLayoutGroupIndex(info.groupIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._current = info;
|
|
||||||
},
|
|
||||||
|
|
||||||
reapply: function() {
|
|
||||||
if (!this._current)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._applyLayoutGroup(this._current.group);
|
|
||||||
this._applyLayoutGroupIndex(this._current.groupIndex);
|
|
||||||
},
|
|
||||||
|
|
||||||
setUserLayouts: function(ids) {
|
|
||||||
this._current = null;
|
|
||||||
this._layoutInfos = {};
|
|
||||||
|
|
||||||
for (let i = 0; i < ids.length; ++i) {
|
|
||||||
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(ids[i]);
|
|
||||||
if (found)
|
|
||||||
this._layoutInfos[ids[i]] = { id: ids[i], layout: _layout, variant: _variant };
|
|
||||||
}
|
|
||||||
|
|
||||||
let i = 0;
|
|
||||||
let group = [];
|
|
||||||
for (let id in this._layoutInfos) {
|
|
||||||
// We need to leave one slot on each group free so that we
|
|
||||||
// can add a layout containing the symbols for the
|
|
||||||
// language used in UI strings to ensure that toolkits can
|
|
||||||
// handle mnemonics like Alt+Ф even if the user is
|
|
||||||
// actually typing in a different layout.
|
|
||||||
let groupIndex = i % (this.MAX_LAYOUTS_PER_GROUP - 1);
|
|
||||||
if (groupIndex == 0)
|
|
||||||
group = [];
|
|
||||||
|
|
||||||
let info = this._layoutInfos[id];
|
|
||||||
group[groupIndex] = info;
|
|
||||||
info.group = group;
|
|
||||||
info.groupIndex = groupIndex;
|
|
||||||
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_getLocaleLayout: function() {
|
|
||||||
let locale = GLib.get_language_names()[0];
|
|
||||||
if (locale.indexOf('_') == -1)
|
|
||||||
locale = DEFAULT_LOCALE;
|
|
||||||
|
|
||||||
let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
|
|
||||||
if (!found)
|
|
||||||
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
|
|
||||||
|
|
||||||
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
|
|
||||||
if (found)
|
|
||||||
return { layout: _layout, variant: _variant };
|
|
||||||
else
|
|
||||||
return { layout: DEFAULT_LAYOUT, variant: DEFAULT_VARIANT };
|
|
||||||
},
|
|
||||||
|
|
||||||
_buildGroupStrings: function(_group) {
|
|
||||||
let group = _group.concat(this._localeLayoutInfo);
|
|
||||||
let layouts = group.map(function(g) { return g.layout; }).join(',');
|
|
||||||
let variants = group.map(function(g) { return g.variant; }).join(',');
|
|
||||||
return [layouts, variants];
|
|
||||||
},
|
|
||||||
|
|
||||||
setKeyboardOptions: function(options) {
|
|
||||||
this._xkbOptions = options;
|
|
||||||
},
|
|
||||||
|
|
||||||
_buildOptionsString: function() {
|
|
||||||
let options = this._xkbOptions.join(',');
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,206 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const SystemdLoginManagerIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.login1.Manager"> \
|
|
||||||
<method name="Suspend"> \
|
|
||||||
<arg type="b" direction="in"/> \
|
|
||||||
</method> \
|
|
||||||
<method name="CanSuspend"> \
|
|
||||||
<arg type="s" direction="out"/> \
|
|
||||||
</method> \
|
|
||||||
<method name="Inhibit"> \
|
|
||||||
<arg type="s" direction="in"/> \
|
|
||||||
<arg type="s" direction="in"/> \
|
|
||||||
<arg type="s" direction="in"/> \
|
|
||||||
<arg type="s" direction="in"/> \
|
|
||||||
<arg type="h" direction="out"/> \
|
|
||||||
</method> \
|
|
||||||
<method name="GetSession"> \
|
|
||||||
<arg type="s" direction="in"/> \
|
|
||||||
<arg type="o" direction="out"/> \
|
|
||||||
</method> \
|
|
||||||
<method name="ListSessions"> \
|
|
||||||
<arg name="sessions" type="a(susso)" direction="out"/> \
|
|
||||||
</method> \
|
|
||||||
<signal name="PrepareForSleep"> \
|
|
||||||
<arg type="b" direction="out"/> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const SystemdLoginSessionIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.login1.Session"> \
|
|
||||||
<signal name="Lock" /> \
|
|
||||||
<signal name="Unlock" /> \
|
|
||||||
<property name="Active" type="b" access="read" /> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
|
|
||||||
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
|
|
||||||
|
|
||||||
function haveSystemd() {
|
|
||||||
return GLib.access("/run/systemd/seats", 0) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function versionCompare(required, reference) {
|
|
||||||
required = required.split('.');
|
|
||||||
reference = reference.split('.');
|
|
||||||
|
|
||||||
for (let i = 0; i < required.length; i++) {
|
|
||||||
let requiredInt = parseInt(required[i]);
|
|
||||||
let referenceInt = parseInt(reference[i]);
|
|
||||||
if (requiredInt != referenceInt)
|
|
||||||
return requiredInt < referenceInt;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function canLock() {
|
|
||||||
try {
|
|
||||||
let params = GLib.Variant.new('(ss)', ['org.gnome.DisplayManager.Manager', 'Version']);
|
|
||||||
let result = Gio.DBus.system.call_sync('org.gnome.DisplayManager',
|
|
||||||
'/org/gnome/DisplayManager/Manager',
|
|
||||||
'org.freedesktop.DBus.Properties',
|
|
||||||
'Get', params, null,
|
|
||||||
Gio.DBusCallFlags.NONE,
|
|
||||||
-1, null);
|
|
||||||
|
|
||||||
let version = result.deep_unpack()[0].deep_unpack();
|
|
||||||
return haveSystemd() && versionCompare('3.5.91', version);
|
|
||||||
} catch(e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let _loginManager = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LoginManager:
|
|
||||||
* An abstraction over systemd/logind and ConsoleKit.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function getLoginManager() {
|
|
||||||
if (_loginManager == null) {
|
|
||||||
if (haveSystemd())
|
|
||||||
_loginManager = new LoginManagerSystemd();
|
|
||||||
else
|
|
||||||
_loginManager = new LoginManagerDummy();
|
|
||||||
}
|
|
||||||
|
|
||||||
return _loginManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
const LoginManagerSystemd = new Lang.Class({
|
|
||||||
Name: 'LoginManagerSystemd',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._proxy = new SystemdLoginManager(Gio.DBus.system,
|
|
||||||
'org.freedesktop.login1',
|
|
||||||
'/org/freedesktop/login1');
|
|
||||||
this._proxy.connectSignal('PrepareForSleep',
|
|
||||||
Lang.bind(this, this._prepareForSleep));
|
|
||||||
},
|
|
||||||
|
|
||||||
getCurrentSessionProxy: function(callback) {
|
|
||||||
if (this._currentSession) {
|
|
||||||
callback (this._currentSession);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._proxy.GetSessionRemote(GLib.getenv('XDG_SESSION_ID'), Lang.bind(this,
|
|
||||||
function(result, error) {
|
|
||||||
if (error) {
|
|
||||||
logError(error, 'Could not get a proxy for the current session');
|
|
||||||
} else {
|
|
||||||
this._currentSession = new SystemdLoginSession(Gio.DBus.system,
|
|
||||||
'org.freedesktop.login1',
|
|
||||||
result[0]);
|
|
||||||
callback(this._currentSession);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
canSuspend: function(asyncCallback) {
|
|
||||||
this._proxy.CanSuspendRemote(function(result, error) {
|
|
||||||
if (error)
|
|
||||||
asyncCallback(false);
|
|
||||||
else
|
|
||||||
asyncCallback(result[0] != 'no' && result[0] != 'na');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
listSessions: function(asyncCallback) {
|
|
||||||
this._proxy.ListSessionsRemote(function(result, error) {
|
|
||||||
if (error)
|
|
||||||
asyncCallback([]);
|
|
||||||
else
|
|
||||||
asyncCallback(result[0]);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
suspend: function() {
|
|
||||||
this._proxy.SuspendRemote(true);
|
|
||||||
},
|
|
||||||
|
|
||||||
inhibit: function(reason, callback) {
|
|
||||||
let inVariant = GLib.Variant.new('(ssss)',
|
|
||||||
['sleep',
|
|
||||||
'GNOME Shell',
|
|
||||||
reason,
|
|
||||||
'delay']);
|
|
||||||
this._proxy.call_with_unix_fd_list('Inhibit', inVariant, 0, -1, null, null,
|
|
||||||
Lang.bind(this, function(proxy, result) {
|
|
||||||
let fd = -1;
|
|
||||||
try {
|
|
||||||
let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result);
|
|
||||||
fd = fdList.steal_fds()[0];
|
|
||||||
callback(new Gio.UnixInputStream({ fd: fd }));
|
|
||||||
} catch(e) {
|
|
||||||
logError(e, "Error getting systemd inhibitor");
|
|
||||||
callback(null);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_prepareForSleep: function(proxy, sender, [aboutToSuspend]) {
|
|
||||||
this.emit('prepare-for-sleep', aboutToSuspend);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
|
||||||
|
|
||||||
const LoginManagerDummy = new Lang.Class({
|
|
||||||
Name: 'LoginManagerDummy',
|
|
||||||
|
|
||||||
getCurrentSessionProxy: function(callback) {
|
|
||||||
// we could return a DummySession object that fakes whatever callers
|
|
||||||
// expect (at the time of writing: connect() and connectSignal()
|
|
||||||
// methods), but just never calling the callback should be safer
|
|
||||||
},
|
|
||||||
|
|
||||||
canSuspend: function(asyncCallback) {
|
|
||||||
asyncCallback(false);
|
|
||||||
},
|
|
||||||
|
|
||||||
listSessions: function(asyncCallback) {
|
|
||||||
asyncCallback([]);
|
|
||||||
},
|
|
||||||
|
|
||||||
suspend: function() {
|
|
||||||
this.emit('prepare-for-sleep', true);
|
|
||||||
this.emit('prepare-for-sleep', false);
|
|
||||||
},
|
|
||||||
|
|
||||||
inhibit: function(reason, callback) {
|
|
||||||
callback(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(LoginManagerDummy.prototype);
|
|
@ -2,134 +2,54 @@
|
|||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const NMGtk = imports.gi.NMGtk;
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
// _getMobileProvidersDatabase:
|
|
||||||
//
|
|
||||||
// Gets the database of mobile providers, with references between MCCMNC/SID and
|
|
||||||
// operator name
|
|
||||||
//
|
|
||||||
let _mpd;
|
|
||||||
function _getMobileProvidersDatabase() {
|
|
||||||
if (_mpd == null) {
|
|
||||||
try {
|
|
||||||
_mpd = new NMGtk.MobileProvidersDatabase();
|
|
||||||
_mpd.init(null);
|
|
||||||
} catch (e) {
|
|
||||||
log(e.message);
|
|
||||||
_mpd = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return _mpd;
|
|
||||||
}
|
|
||||||
|
|
||||||
// _findProviderForMccMnc:
|
|
||||||
// @operator_name: operator name
|
|
||||||
// @operator_code: operator code
|
|
||||||
//
|
|
||||||
// Given an operator name string (which may not be a real operator name) and an
|
|
||||||
// operator code string, tries to find a proper operator name to display.
|
|
||||||
//
|
|
||||||
function _findProviderForMccMnc(operator_name, operator_code) {
|
|
||||||
if (operator_name) {
|
|
||||||
if (operator_name.length != 0 &&
|
|
||||||
(operator_name.length > 6 || operator_name.length < 5)) {
|
|
||||||
// this looks like a valid name, i.e. not an MCCMNC (that some
|
|
||||||
// devices return when not yet connected
|
|
||||||
return operator_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNaN(parseInt(operator_name))) {
|
|
||||||
// name is definitely not a MCCMNC, so it may be a name
|
|
||||||
// after all; return that
|
|
||||||
return operator_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let needle;
|
|
||||||
if ((!operator_name || operator_name.length == 0) && operator_code)
|
|
||||||
needle = operator_code;
|
|
||||||
else if (operator_name && (operator_name.length == 6 || operator_name.length == 5))
|
|
||||||
needle = operator_name;
|
|
||||||
else // nothing to search
|
|
||||||
return null;
|
|
||||||
|
|
||||||
let mpd = _getMobileProvidersDatabase();
|
|
||||||
if (mpd) {
|
|
||||||
let provider = mpd.lookup_3gpp_mcc_mnc(needle);
|
|
||||||
if (provider)
|
|
||||||
return provider.get_name();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// _findProviderForSid:
|
|
||||||
// @sid: System Identifier of the serving CDMA network
|
|
||||||
//
|
|
||||||
// Tries to find the operator name corresponding to the given SID
|
|
||||||
//
|
|
||||||
function _findProviderForSid(sid) {
|
|
||||||
if (sid == 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
let mpd = _getMobileProvidersDatabase();
|
|
||||||
if (mpd) {
|
|
||||||
let provider = mpd.lookup_cdma_sid(sid);
|
|
||||||
if (provider)
|
|
||||||
return provider.get_name();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Support for the old ModemManager interface (MM < 0.7)
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// The following are not the complete interfaces, just the methods we need
|
// The following are not the complete interfaces, just the methods we need
|
||||||
// (or may need in the future)
|
// (or may need in the future)
|
||||||
|
|
||||||
const ModemGsmNetworkInterface = '<node> \
|
const ModemGsmNetworkInterface = <interface name="org.freedesktop.ModemManager.Modem.Gsm.Network">
|
||||||
<interface name="org.freedesktop.ModemManager.Modem.Gsm.Network"> \
|
<method name="GetRegistrationInfo">
|
||||||
<method name="GetRegistrationInfo"> \
|
<arg type="(uss)" direction="out" />
|
||||||
<arg type="(uss)" direction="out" /> \
|
</method>
|
||||||
</method> \
|
<method name="GetSignalQuality">
|
||||||
<method name="GetSignalQuality"> \
|
<arg type="u" direction="out" />
|
||||||
<arg type="u" direction="out" /> \
|
</method>
|
||||||
</method> \
|
<property name="AccessTechnology" type="u" access="read" />
|
||||||
<property name="AccessTechnology" type="u" access="read" /> \
|
<signal name="SignalQuality">
|
||||||
<signal name="SignalQuality"> \
|
<arg type="u" direction="out" />
|
||||||
<arg type="u" direction="out" /> \
|
</signal>
|
||||||
</signal> \
|
<signal name="RegistrationInfo">
|
||||||
<signal name="RegistrationInfo"> \
|
<arg type="u" direction="out" />
|
||||||
<arg type="u" direction="out" /> \
|
<arg type="s" direction="out" />
|
||||||
<arg type="s" direction="out" /> \
|
<arg type="s" direction="out" />
|
||||||
<arg type="s" direction="out" /> \
|
</signal>
|
||||||
</signal> \
|
</interface>;
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface);
|
const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface);
|
||||||
|
|
||||||
const ModemCdmaInterface = '<node> \
|
const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma">
|
||||||
<interface name="org.freedesktop.ModemManager.Modem.Cdma"> \
|
<method name="GetSignalQuality">
|
||||||
<method name="GetSignalQuality"> \
|
<arg type="u" direction="out" />
|
||||||
<arg type="u" direction="out" /> \
|
</method>
|
||||||
</method> \
|
<method name="GetServingSystem">
|
||||||
<method name="GetServingSystem"> \
|
<arg type="(usu)" direction="out" />
|
||||||
<arg type="(usu)" direction="out" /> \
|
</method>
|
||||||
</method> \
|
<signal name="SignalQuality">
|
||||||
<signal name="SignalQuality"> \
|
<arg type="u" direction="out" />
|
||||||
<arg type="u" direction="out" /> \
|
</signal>
|
||||||
</signal> \
|
</interface>;
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
|
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
|
||||||
|
|
||||||
|
let _providersTable;
|
||||||
|
function _getProvidersTable() {
|
||||||
|
if (_providersTable)
|
||||||
|
return _providersTable;
|
||||||
|
let [providers, countryCodes] = Shell.mobile_providers_parse();
|
||||||
|
return _providersTable = providers;
|
||||||
|
}
|
||||||
|
|
||||||
const ModemGsm = new Lang.Class({
|
const ModemGsm = new Lang.Class({
|
||||||
Name: 'ModemGsm',
|
Name: 'ModemGsm',
|
||||||
|
|
||||||
@ -145,7 +65,7 @@ const ModemGsm = new Lang.Class({
|
|||||||
this.emit('notify::signal-quality');
|
this.emit('notify::signal-quality');
|
||||||
}));
|
}));
|
||||||
this._proxy.connectSignal('RegistrationInfo', Lang.bind(this, function(proxy, sender, [status, code, name]) {
|
this._proxy.connectSignal('RegistrationInfo', Lang.bind(this, function(proxy, sender, [status, code, name]) {
|
||||||
this.operator_name = _findProviderForMccMnc(name, code);
|
this.operator_name = this._findOperatorName(name, code);
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
}));
|
}));
|
||||||
this._proxy.GetRegistrationInfoRemote(Lang.bind(this, function([result], err) {
|
this._proxy.GetRegistrationInfoRemote(Lang.bind(this, function([result], err) {
|
||||||
@ -155,7 +75,7 @@ const ModemGsm = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let [status, code, name] = result;
|
let [status, code, name] = result;
|
||||||
this.operator_name = _findProviderForMccMnc(name, code);
|
this.operator_name = this._findOperatorName(name, code);
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
}));
|
}));
|
||||||
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
|
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
|
||||||
@ -168,6 +88,67 @@ const ModemGsm = new Lang.Class({
|
|||||||
}
|
}
|
||||||
this.emit('notify::signal-quality');
|
this.emit('notify::signal-quality');
|
||||||
}));
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_findOperatorName: function(name, opCode) {
|
||||||
|
if (name.length != 0 && (name.length > 6 || name.length < 5)) {
|
||||||
|
// this looks like a valid name, i.e. not an MCCMNC (that some
|
||||||
|
// devices return when not yet connected
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
if (isNaN(parseInt(name))) {
|
||||||
|
// name is definitely not a MCCMNC, so it may be a name
|
||||||
|
// after all; return that
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
let needle;
|
||||||
|
if (name.length == 0 && opCode)
|
||||||
|
needle = opCode;
|
||||||
|
else if (name.length == 6 || name.length == 5)
|
||||||
|
needle = name;
|
||||||
|
else // nothing to search
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return this._findProviderForMCCMNC(needle);
|
||||||
|
},
|
||||||
|
|
||||||
|
_findProviderForMCCMNC: function(needle) {
|
||||||
|
let table = _getProvidersTable();
|
||||||
|
let needlemcc = needle.substring(0, 3);
|
||||||
|
let needlemnc = needle.substring(3, needle.length);
|
||||||
|
|
||||||
|
let name2, name3;
|
||||||
|
for (let iter in table) {
|
||||||
|
let providers = table[iter];
|
||||||
|
|
||||||
|
// Search through each country's providers
|
||||||
|
for (let i = 0; i < providers.length; i++) {
|
||||||
|
let provider = providers[i];
|
||||||
|
|
||||||
|
// Search through MCC/MNC list
|
||||||
|
let list = provider.get_gsm_mcc_mnc();
|
||||||
|
for (let j = 0; j < list.length; j++) {
|
||||||
|
let mccmnc = list[j];
|
||||||
|
|
||||||
|
// Match both 2-digit and 3-digit MNC; prefer a
|
||||||
|
// 3-digit match if found, otherwise a 2-digit one.
|
||||||
|
if (mccmnc.mcc != needlemcc)
|
||||||
|
continue; // MCC was wrong
|
||||||
|
|
||||||
|
if (!name3 && needle.length == 6 && needlemnc == mccmnc.mnc)
|
||||||
|
name3 = provider.name;
|
||||||
|
|
||||||
|
if (!name2 && needlemnc.substring(0, 2) == mccmnc.mnc.substring(0, 2))
|
||||||
|
name2 = provider.name;
|
||||||
|
|
||||||
|
if (name2 && name3)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return name3 || name2 || null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(ModemGsm.prototype);
|
Signals.addSignalMethods(ModemGsm.prototype);
|
||||||
@ -207,105 +188,40 @@ const ModemCdma = new Lang.Class({
|
|||||||
// it will return an error if the device is not connected
|
// it will return an error if the device is not connected
|
||||||
this.operator_name = null;
|
this.operator_name = null;
|
||||||
} else {
|
} else {
|
||||||
let [bandClass, band, sid] = result;
|
let [bandClass, band, id] = result;
|
||||||
|
if (name.length > 0)
|
||||||
this.operator_name = _findProviderForSid(sid)
|
this.operator_name = this._findProviderForSid(id);
|
||||||
|
else
|
||||||
|
this.operator_name = null;
|
||||||
}
|
}
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
}));
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_findProviderForSid: function(sid) {
|
||||||
|
if (sid == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
let table = _getProvidersTable();
|
||||||
|
|
||||||
|
// Search through each country
|
||||||
|
for (let iter in table) {
|
||||||
|
let providers = table[iter];
|
||||||
|
|
||||||
|
// Search through each country's providers
|
||||||
|
for (let i = 0; i < providers.length; i++) {
|
||||||
|
let provider = providers[i];
|
||||||
|
let cdma_sid = provider.get_cdma_sid();
|
||||||
|
|
||||||
|
// Search through CDMA SID list
|
||||||
|
for (let j = 0; j < cdma_sid.length; j++) {
|
||||||
|
if (cdma_sid[j] == sid)
|
||||||
|
return provider.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(ModemCdma.prototype);
|
Signals.addSignalMethods(ModemCdma.prototype);
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Support for the new ModemManager1 interface (MM >= 0.7)
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
const BroadbandModemInterface = '<node> \
|
|
||||||
<interface name="org.freedesktop.ModemManager1.Modem"> \
|
|
||||||
<property name="SignalQuality" type="(ub)" access="read" /> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
const BroadbandModemProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemInterface);
|
|
||||||
|
|
||||||
const BroadbandModem3gppInterface = '<node> \
|
|
||||||
<interface name="org.freedesktop.ModemManager1.Modem.Modem3gpp"> \
|
|
||||||
<property name="OperatorCode" type="s" access="read" /> \
|
|
||||||
<property name="OperatorName" type="s" access="read" /> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
const BroadbandModem3gppProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModem3gppInterface);
|
|
||||||
|
|
||||||
const BroadbandModemCdmaInterface = '<node> \
|
|
||||||
<interface name="org.freedesktop.ModemManager1.Modem.ModemCdma"> \
|
|
||||||
<property name="Sid" type="u" access="read" /> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
|
|
||||||
|
|
||||||
const BroadbandModem = new Lang.Class({
|
|
||||||
Name: 'BroadbandModem',
|
|
||||||
|
|
||||||
_init: function(path, capabilities) {
|
|
||||||
this._proxy = new BroadbandModemProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path);
|
|
||||||
this._proxy_3gpp = new BroadbandModem3gppProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path);
|
|
||||||
this._proxy_cdma = new BroadbandModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager1', path);
|
|
||||||
this._capabilities = capabilities;
|
|
||||||
|
|
||||||
this._proxy.connect('g-properties-changed', Lang.bind(this, function(proxy, properties) {
|
|
||||||
if ('SignalQuality' in properties.deep_unpack())
|
|
||||||
this._reloadSignalQuality();
|
|
||||||
}));
|
|
||||||
this._reloadSignalQuality();
|
|
||||||
|
|
||||||
this._proxy_3gpp.connect('g-properties-changed', Lang.bind(this, function(proxy, properties) {
|
|
||||||
let unpacked = properties.deep_unpack();
|
|
||||||
if ('OperatorName' in unpacked || 'OperatorCode' in unpacked)
|
|
||||||
this._reload3gppOperatorName();
|
|
||||||
}));
|
|
||||||
this._reload3gppOperatorName();
|
|
||||||
|
|
||||||
this._proxy_cdma.connect('g-properties-changed', Lang.bind(this, function(proxy, properties) {
|
|
||||||
let unpacked = properties.deep_unpack();
|
|
||||||
if ('Nid' in unpacked || 'Sid' in unpacked)
|
|
||||||
this._reloadCdmaOperatorName();
|
|
||||||
}));
|
|
||||||
this._reloadCdmaOperatorName();
|
|
||||||
},
|
|
||||||
|
|
||||||
_reloadSignalQuality: function() {
|
|
||||||
let [quality, recent] = this._proxy.SignalQuality;
|
|
||||||
this.signal_quality = quality;
|
|
||||||
this.emit('notify::signal-quality');
|
|
||||||
},
|
|
||||||
|
|
||||||
_reloadOperatorName: function() {
|
|
||||||
let new_name = "";
|
|
||||||
if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0)
|
|
||||||
new_name += this.operator_name_3gpp;
|
|
||||||
|
|
||||||
if (this.operator_name_cdma && this.operator_name_cdma.length > 0) {
|
|
||||||
if (new_name != "")
|
|
||||||
new_name += ", ";
|
|
||||||
new_name += this.operator_name_cdma;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.operator_name = new_name;
|
|
||||||
this.emit('notify::operator-name');
|
|
||||||
},
|
|
||||||
|
|
||||||
_reload3gppOperatorName: function() {
|
|
||||||
let name = this._proxy_3gpp.OperatorName;
|
|
||||||
let code = this._proxy_3gpp.OperatorCode;
|
|
||||||
this.operator_name_3gpp = _findProviderForMccMnc(name, code);
|
|
||||||
this._reloadOperatorName();
|
|
||||||
},
|
|
||||||
|
|
||||||
_reloadCdmaOperatorName: function() {
|
|
||||||
let sid = this._proxy_cdma.Sid;
|
|
||||||
this.operator_name_cdma = _findProviderForSid(sid);
|
|
||||||
this._reloadOperatorName();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(BroadbandModem.prototype);
|
|
||||||
|
@ -1,259 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Params = imports.misc.params;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
// Specified in the D-Bus specification here:
|
|
||||||
// http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager
|
|
||||||
const ObjectManagerIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.DBus.ObjectManager"> \
|
|
||||||
<method name="GetManagedObjects"> \
|
|
||||||
<arg name="objects" type="a{oa{sa{sv}}}" direction="out"/> \
|
|
||||||
</method> \
|
|
||||||
<signal name="InterfacesAdded"> \
|
|
||||||
<arg name="objectPath" type="o"/> \
|
|
||||||
<arg name="interfaces" type="a{sa{sv}}" /> \
|
|
||||||
</signal> \
|
|
||||||
<signal name="InterfacesRemoved"> \
|
|
||||||
<arg name="objectPath" type="o"/> \
|
|
||||||
<arg name="interfaces" type="as" /> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);
|
|
||||||
|
|
||||||
const ObjectManager = new Lang.Class({
|
|
||||||
Name: 'ObjectManager',
|
|
||||||
_init: function(params) {
|
|
||||||
params = Params.parse(params, { connection: null,
|
|
||||||
name: null,
|
|
||||||
objectPath: null,
|
|
||||||
knownInterfaces: null,
|
|
||||||
cancellable: null,
|
|
||||||
onLoaded: null });
|
|
||||||
|
|
||||||
this._connection = params.connection;
|
|
||||||
this._serviceName = params.name;
|
|
||||||
this._managerPath = params.objectPath;
|
|
||||||
this._cancellable = params.cancellable;
|
|
||||||
|
|
||||||
this._managerProxy = new Gio.DBusProxy({ g_connection: this._connection,
|
|
||||||
g_interface_name: ObjectManagerInfo.name,
|
|
||||||
g_interface_info: ObjectManagerInfo,
|
|
||||||
g_name: this._serviceName,
|
|
||||||
g_object_path: this._managerPath,
|
|
||||||
g_flags: Gio.DBusProxyFlags.NONE });
|
|
||||||
|
|
||||||
this._interfaceInfos = {};
|
|
||||||
this._objects = {};
|
|
||||||
this._interfaces = {};
|
|
||||||
this._onLoaded = params.onLoaded;
|
|
||||||
|
|
||||||
if (params.knownInterfaces)
|
|
||||||
this._registerInterfaces(params.knownInterfaces);
|
|
||||||
|
|
||||||
// Start out inhibiting load until at least the proxy
|
|
||||||
// manager is loaded and the remote objects are fetched
|
|
||||||
this._numLoadInhibitors = 1;
|
|
||||||
this._managerProxy.init_async(GLib.PRIORITY_DEFAULT,
|
|
||||||
this._cancellable,
|
|
||||||
Lang.bind(this, this._onManagerProxyLoaded));
|
|
||||||
},
|
|
||||||
|
|
||||||
_tryToCompleteLoad: function() {
|
|
||||||
this._numLoadInhibitors--;
|
|
||||||
if (this._numLoadInhibitors == 0) {
|
|
||||||
if (this._onLoaded)
|
|
||||||
this._onLoaded();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_addInterface: function(objectPath, interfaceName, onFinished) {
|
|
||||||
let info = this._interfaceInfos[interfaceName];
|
|
||||||
|
|
||||||
if (!info) {
|
|
||||||
if (onFinished)
|
|
||||||
onFinished();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let proxy = new Gio.DBusProxy({ g_connection: this._connection,
|
|
||||||
g_name: this._serviceName,
|
|
||||||
g_object_path: objectPath,
|
|
||||||
g_interface_name: interfaceName,
|
|
||||||
g_interface_info: info,
|
|
||||||
g_flags: Gio.DBusProxyFlags.NONE });
|
|
||||||
|
|
||||||
proxy.init_async(GLib.PRIORITY_DEFAULT,
|
|
||||||
this._cancellable,
|
|
||||||
Lang.bind(this, function(initable, result) {
|
|
||||||
let error = null;
|
|
||||||
try {
|
|
||||||
initable.init_finish(result);
|
|
||||||
} catch(e) {
|
|
||||||
logError(e, 'could not initialize proxy for interface ' + interfaceName);
|
|
||||||
|
|
||||||
if (onFinished)
|
|
||||||
onFinished();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let isNewObject;
|
|
||||||
if (!this._objects[objectPath]) {
|
|
||||||
this._objects[objectPath] = {};
|
|
||||||
isNewObject = true;
|
|
||||||
} else {
|
|
||||||
isNewObject = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._objects[objectPath][interfaceName] = proxy;
|
|
||||||
|
|
||||||
if (!this._interfaces[interfaceName])
|
|
||||||
this._interfaces[interfaceName] = [];
|
|
||||||
|
|
||||||
this._interfaces[interfaceName].push(proxy);
|
|
||||||
|
|
||||||
if (isNewObject)
|
|
||||||
this.emit('object-added', objectPath);
|
|
||||||
|
|
||||||
this.emit('interface-added', interfaceName, proxy);
|
|
||||||
|
|
||||||
if (onFinished)
|
|
||||||
onFinished();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_removeInterface: function(objectPath, interfaceName) {
|
|
||||||
if (!this._objects[objectPath])
|
|
||||||
return;
|
|
||||||
|
|
||||||
let proxy = this._objects[objectPath][interfaceName];
|
|
||||||
|
|
||||||
if (this._interfaces[interfaceName]) {
|
|
||||||
let index = this._interfaces[interfaceName].indexOf(proxy);
|
|
||||||
|
|
||||||
if (index >= 0)
|
|
||||||
this._interfaces[interfaceName].splice(index, 1);
|
|
||||||
|
|
||||||
if (this._interfaces[interfaceName].length == 0)
|
|
||||||
delete this._interfaces[interfaceName];
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emit('interface-removed', interfaceName, proxy);
|
|
||||||
|
|
||||||
this._objects[objectPath][interfaceName] = null;
|
|
||||||
|
|
||||||
if (Object.keys(this._objects[objectPath]).length == 0) {
|
|
||||||
delete this._objects[objectPath];
|
|
||||||
this.emit('object-removed', objectPath);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onManagerProxyLoaded: function(initable, result) {
|
|
||||||
let error = null;
|
|
||||||
try {
|
|
||||||
initable.init_finish(result);
|
|
||||||
} catch(e) {
|
|
||||||
logError(e, 'could not initialize object manager for object ' + params.name);
|
|
||||||
|
|
||||||
this._tryToCompleteLoad();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._managerProxy.connectSignal('InterfacesAdded',
|
|
||||||
Lang.bind(this, function(objectManager, sender, [objectPath, interfaces]) {
|
|
||||||
let interfaceNames = Object.keys(interfaces);
|
|
||||||
for (let i = 0; i < interfaceNames.length; i++)
|
|
||||||
this._addInterface(objectPath, interfaceNames[i]);
|
|
||||||
}));
|
|
||||||
this._managerProxy.connectSignal('InterfacesRemoved',
|
|
||||||
Lang.bind(this, function(objectManager, sender, [objectPath, interfaceNames]) {
|
|
||||||
for (let i = 0; i < interfaceNames.length; i++)
|
|
||||||
this._removeInterface(objectPath, interfaceNames[i]);
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (Object.keys(this._interfaceInfos).length == 0) {
|
|
||||||
this._tryToCompleteLoad();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
|
|
||||||
if (!result) {
|
|
||||||
if (error) {
|
|
||||||
logError(error, 'could not get remote objects for service ' + this._serviceName + ' path ' + this._managerPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._tryToCompleteLoad();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let [objects] = result;
|
|
||||||
|
|
||||||
let objectPaths = Object.keys(objects);
|
|
||||||
for (let i = 0; i < objectPaths.length; i++) {
|
|
||||||
let objectPath = objectPaths[i];
|
|
||||||
let object = objects[objectPath];
|
|
||||||
|
|
||||||
let interfaceNames = Object.getOwnPropertyNames(object);
|
|
||||||
for (let j = 0; j < interfaceNames.length; j++) {
|
|
||||||
let interfaceName = interfaceNames[j];
|
|
||||||
|
|
||||||
// Prevent load from completing until the interface is loaded
|
|
||||||
this._numLoadInhibitors++;
|
|
||||||
this._addInterface(objectPath,
|
|
||||||
interfaceName,
|
|
||||||
Lang.bind(this, this._tryToCompleteLoad));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._tryToCompleteLoad();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_registerInterfaces: function(interfaces) {
|
|
||||||
for (let i = 0; i < interfaces.length; i++) {
|
|
||||||
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
|
|
||||||
this._interfaceInfos[info.name] = info;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
getProxy: function(objectPath, interfaceName) {
|
|
||||||
let object = this._objects[objectPath];
|
|
||||||
|
|
||||||
if (!object)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return object[interfaceName];
|
|
||||||
},
|
|
||||||
|
|
||||||
getProxiesForInterface: function(interfaceName) {
|
|
||||||
let proxyList = this._interfaces[interfaceName];
|
|
||||||
|
|
||||||
if (!proxyList)
|
|
||||||
return [];
|
|
||||||
|
|
||||||
return proxyList;
|
|
||||||
},
|
|
||||||
|
|
||||||
getAllProxies: function() {
|
|
||||||
let proxies = [];
|
|
||||||
|
|
||||||
let objectPaths = Object.keys(this._objects);
|
|
||||||
for (let i = 0; i < objectPaths.length; i++) {
|
|
||||||
let object = this._objects[objectPaths];
|
|
||||||
|
|
||||||
let interfaceNames = Object.keys(object);
|
|
||||||
for (let j = 0; i < interfaceNames.length; i++) {
|
|
||||||
let interfaceName = interfaceNames[i];
|
|
||||||
if (object[interfaceName])
|
|
||||||
proxies.push(object(interfaceName));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return proxies;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(ObjectManager.prototype);
|
|
@ -1,119 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const ObjectManager = imports.misc.objectManager;
|
|
||||||
|
|
||||||
const SmartcardTokenIface = '<node> \
|
|
||||||
<interface name="org.gnome.SettingsDaemon.Smartcard.Token"> \
|
|
||||||
<property name="Name" type="s" access="read"/> \
|
|
||||||
<property name="Driver" type="o" access="read"/> \
|
|
||||||
<property name="IsInserted" type="b" access="read"/> \
|
|
||||||
<property name="UsedToLogin" type="b" access="read"/> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
let _smartcardManager = null;
|
|
||||||
|
|
||||||
function getSmartcardManager() {
|
|
||||||
if (_smartcardManager == null)
|
|
||||||
_smartcardManager = new SmartcardManager();
|
|
||||||
|
|
||||||
return _smartcardManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
const SmartcardManager = new Lang.Class({
|
|
||||||
Name: 'SmartcardManager',
|
|
||||||
_init: function() {
|
|
||||||
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
|
|
||||||
name: "org.gnome.SettingsDaemon.Smartcard",
|
|
||||||
objectPath: '/org/gnome/SettingsDaemon/Smartcard',
|
|
||||||
knownInterfaces: [ SmartcardTokenIface ],
|
|
||||||
onLoaded: Lang.bind(this, this._onLoaded) });
|
|
||||||
this._insertedTokens = {};
|
|
||||||
this._loginToken = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onLoaded: function() {
|
|
||||||
let tokens = this._objectManager.getProxiesForInterface('org.gnome.SettingsDaemon.Smartcard.Token');
|
|
||||||
|
|
||||||
for (let i = 0; i < tokens.length; i++)
|
|
||||||
this._addToken(tokens[i]);
|
|
||||||
|
|
||||||
this._objectManager.connect('interface-added', Lang.bind(this, function(objectManager, interfaceName, proxy) {
|
|
||||||
if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token')
|
|
||||||
this._addToken(proxy);
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._objectManager.connect('interface-removed', Lang.bind(this, function(objectManager, interfaceName, proxy) {
|
|
||||||
if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token')
|
|
||||||
this._removeToken(proxy);
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateToken: function(token) {
|
|
||||||
let objectPath = token.get_object_path();
|
|
||||||
|
|
||||||
delete this._insertedTokens[objectPath];
|
|
||||||
|
|
||||||
if (token.IsInserted)
|
|
||||||
this._insertedTokens[objectPath] = token;
|
|
||||||
|
|
||||||
if (token.UsedToLogin)
|
|
||||||
this._loginToken = token;
|
|
||||||
},
|
|
||||||
|
|
||||||
_addToken: function(token) {
|
|
||||||
this._updateToken(token);
|
|
||||||
|
|
||||||
token.connect('g-properties-changed',
|
|
||||||
Lang.bind(this, function(proxy, properties) {
|
|
||||||
if ('IsInserted' in properties.deep_unpack()) {
|
|
||||||
this._updateToken(token);
|
|
||||||
|
|
||||||
if (token.IsInserted) {
|
|
||||||
this.emit('smartcard-inserted', token);
|
|
||||||
} else {
|
|
||||||
this.emit('smartcard-removed', token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Emit a smartcard-inserted at startup if it's already plugged in
|
|
||||||
if (token.IsInserted)
|
|
||||||
this.emit('smartcard-inserted', token);
|
|
||||||
},
|
|
||||||
|
|
||||||
_removeToken: function(token) {
|
|
||||||
let objectPath = token.get_object_path();
|
|
||||||
|
|
||||||
if (this._insertedTokens[objectPath] == token) {
|
|
||||||
delete this._insertedTokens[objectPath];
|
|
||||||
this.emit('smartcard-removed', token);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._loginToken == token)
|
|
||||||
this._loginToken = null;
|
|
||||||
|
|
||||||
token.disconnectAll();
|
|
||||||
},
|
|
||||||
|
|
||||||
hasInsertedTokens: function() {
|
|
||||||
return Object.keys(this._insertedTokens).length > 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
hasInsertedLoginToken: function() {
|
|
||||||
if (!this._loginToken)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!this._loginToken.IsInserted)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(SmartcardManager.prototype);
|
|
314
js/misc/util.js
@ -1,17 +1,8 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const Params = imports.misc.params;
|
|
||||||
|
|
||||||
const 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()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
||||||
@ -22,7 +13,7 @@ const _urlRegexp = new RegExp(
|
|||||||
'(^|' + _leadingJunk + ')' +
|
'(^|' + _leadingJunk + ')' +
|
||||||
'(' +
|
'(' +
|
||||||
'(?:' +
|
'(?:' +
|
||||||
'(?:http|https|ftp)://' + // scheme://
|
'[a-z][\\w-]+://' + // scheme://
|
||||||
'|' +
|
'|' +
|
||||||
'www\\d{0,3}[.]' + // www.
|
'www\\d{0,3}[.]' + // www.
|
||||||
'|' +
|
'|' +
|
||||||
@ -40,8 +31,6 @@ const _urlRegexp = new RegExp(
|
|||||||
')' +
|
')' +
|
||||||
')', 'gi');
|
')', 'gi');
|
||||||
|
|
||||||
let _desktopSettings = null;
|
|
||||||
|
|
||||||
// findUrls:
|
// findUrls:
|
||||||
// @str: string to find URLs in
|
// @str: string to find URLs in
|
||||||
//
|
//
|
||||||
@ -84,22 +73,6 @@ function spawnCommandLine(command_line) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// spawnApp:
|
|
||||||
// @argv: an argv array
|
|
||||||
//
|
|
||||||
// Runs @argv as if it was an application, handling startup notification
|
|
||||||
function spawnApp(argv) {
|
|
||||||
try {
|
|
||||||
let app = Gio.AppInfo.create_from_commandline(argv.join(' '), null,
|
|
||||||
Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION);
|
|
||||||
|
|
||||||
let context = global.create_app_launch_context(0, -1);
|
|
||||||
app.launch([], context);
|
|
||||||
} catch(err) {
|
|
||||||
_handleSpawnError(argv[0], err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// trySpawn:
|
// trySpawn:
|
||||||
// @argv: an argv array
|
// @argv: an argv array
|
||||||
//
|
//
|
||||||
@ -111,7 +84,7 @@ function trySpawn(argv)
|
|||||||
try {
|
try {
|
||||||
[success, pid] = GLib.spawn_async(null, argv, null,
|
[success, pid] = GLib.spawn_async(null, argv, null,
|
||||||
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
|
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
|
||||||
null);
|
null, null);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
/* Rewrite the error in case of ENOENT */
|
/* Rewrite the error in case of ENOENT */
|
||||||
if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) {
|
if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) {
|
||||||
@ -133,7 +106,7 @@ function trySpawn(argv)
|
|||||||
// Dummy child watch; we don't want to double-fork internally
|
// Dummy child watch; we don't want to double-fork internally
|
||||||
// because then we lose the parent-child relationship, which
|
// because then we lose the parent-child relationship, which
|
||||||
// can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275
|
// can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275
|
||||||
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function () {});
|
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function () {}, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// trySpawnCommandLine:
|
// trySpawnCommandLine:
|
||||||
@ -157,107 +130,113 @@ function trySpawnCommandLine(command_line) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _handleSpawnError(command, err) {
|
function _handleSpawnError(command, err) {
|
||||||
let title = _("Execution of “%s” failed:").format(command);
|
let title = _("Execution of '%s' failed:").format(command);
|
||||||
Main.notifyError(title, err.message);
|
Main.notifyError(title, err.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatTime(time, params) {
|
// killall:
|
||||||
let date;
|
// @processName: a process name
|
||||||
// HACK: The built-in Date type sucks at timezones, which we need for the
|
//
|
||||||
// world clock; it's often more convenient though, so allow either
|
// Kills @processName. If no process with the given name is found,
|
||||||
// Date or GLib.DateTime as parameter
|
// this will fail silently.
|
||||||
if (time instanceof Date)
|
function killall(processName) {
|
||||||
date = GLib.DateTime.new_from_unix_local(time.getTime() / 1000);
|
try {
|
||||||
else
|
// pkill is more portable than killall, but on Linux at least
|
||||||
date = time;
|
// it won't match if you pass more than 15 characters of the
|
||||||
|
// process name... However, if you use the '-f' flag to match
|
||||||
|
// the entire command line, it will work, but we have to be
|
||||||
|
// careful in that case that we can match
|
||||||
|
// '/usr/bin/processName' but not 'gedit processName.c' or
|
||||||
|
// whatever...
|
||||||
|
|
||||||
let now = GLib.DateTime.new_now_local();
|
let argv = ['pkill', '-f', '^([^ ]*/)?' + processName + '($| )'];
|
||||||
|
GLib.spawn_sync(null, argv, null, GLib.SpawnFlags.SEARCH_PATH, null);
|
||||||
let daysAgo = now.difference(date) / (24 * 60 * 60 * 1000 * 1000);
|
// It might be useful to return success/failure, but we'd need
|
||||||
|
// a wrapper around WIFEXITED and WEXITSTATUS. Since none of
|
||||||
let format;
|
// the current callers care, we don't bother.
|
||||||
|
} catch (e) {
|
||||||
if (_desktopSettings == null)
|
logError(e, 'Failed to kill ' + processName);
|
||||||
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
|
||||||
let clockFormat = _desktopSettings.get_string('clock-format');
|
|
||||||
let hasAmPm = date.format('%p') != '';
|
|
||||||
|
|
||||||
params = Params.parse(params, { timeOnly: false });
|
|
||||||
|
|
||||||
if (clockFormat == '24h' || !hasAmPm) {
|
|
||||||
// Show only the time if date is on today
|
|
||||||
if (daysAgo < 1 || params.timeOnly)
|
|
||||||
/* Translators: Time in 24h format */
|
|
||||||
format = N_("%H\u2236%M");
|
|
||||||
// Show the word "Yesterday" and time if date is on yesterday
|
|
||||||
else if (daysAgo <2)
|
|
||||||
/* Translators: this is the word "Yesterday" followed by a
|
|
||||||
time string in 24h format. i.e. "Yesterday, 14:30" */
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("Yesterday, %H\u2236%M");
|
|
||||||
// Show a week day and time if date is in the last week
|
|
||||||
else if (daysAgo < 7)
|
|
||||||
/* Translators: this is the week day name followed by a time
|
|
||||||
string in 24h format. i.e. "Monday, 14:30" */
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("%A, %H\u2236%M");
|
|
||||||
else if (date.get_year() == now.get_year())
|
|
||||||
/* Translators: this is the month name and day number
|
|
||||||
followed by a time string in 24h format.
|
|
||||||
i.e. "May 25, 14:30" */
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("%B %d, %H\u2236%M");
|
|
||||||
else
|
|
||||||
/* Translators: this is the month name, day number, year
|
|
||||||
number followed by a time string in 24h format.
|
|
||||||
i.e. "May 25 2012, 14:30" */
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("%B %d %Y, %H\u2236%M");
|
|
||||||
} else {
|
|
||||||
// Show only the time if date is on today
|
|
||||||
if (daysAgo < 1 || params.timeOnly)
|
|
||||||
/* Translators: Time in 12h format */
|
|
||||||
format = N_("%l\u2236%M %p");
|
|
||||||
// Show the word "Yesterday" and time if date is on yesterday
|
|
||||||
else if (daysAgo <2)
|
|
||||||
/* Translators: this is the word "Yesterday" followed by a
|
|
||||||
time string in 12h format. i.e. "Yesterday, 2:30 pm" */
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("Yesterday, %l\u2236%M %p");
|
|
||||||
// Show a week day and time if date is in the last week
|
|
||||||
else if (daysAgo < 7)
|
|
||||||
/* Translators: this is the week day name followed by a time
|
|
||||||
string in 12h format. i.e. "Monday, 2:30 pm" */
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("%A, %l\u2236%M %p");
|
|
||||||
else if (date.get_year() == now.get_year())
|
|
||||||
/* Translators: this is the month name and day number
|
|
||||||
followed by a time string in 12h format.
|
|
||||||
i.e. "May 25, 2:30 pm" */
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("%B %d, %l\u2236%M %p");
|
|
||||||
else
|
|
||||||
/* Translators: this is the month name, day number, year
|
|
||||||
number followed by a time string in 12h format.
|
|
||||||
i.e. "May 25 2012, 2:30 pm"*/
|
|
||||||
// xgettext:no-c-format
|
|
||||||
format = N_("%B %d %Y, %l\u2236%M %p");
|
|
||||||
}
|
}
|
||||||
return date.format(Shell.util_translate_time_string(format));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createTimeLabel(date, params) {
|
// This was ported from network-manager-applet
|
||||||
if (_desktopSettings == null)
|
// Copyright 2007 - 2011 Red Hat, Inc.
|
||||||
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
// Author: Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
let label = new St.Label({ text: formatTime(date, params) });
|
const _IGNORED_WORDS = [
|
||||||
let id = _desktopSettings.connect('changed::clock-format', function() {
|
'Semiconductor',
|
||||||
label.text = formatTime(date, params);
|
'Components',
|
||||||
});
|
'Corporation',
|
||||||
label.connect('destroy', function() {
|
'Communications',
|
||||||
_desktopSettings.disconnect(id);
|
'Company',
|
||||||
});
|
'Corp.',
|
||||||
return label;
|
'Corp',
|
||||||
|
'Co.',
|
||||||
|
'Inc.',
|
||||||
|
'Inc',
|
||||||
|
'Incorporated',
|
||||||
|
'Ltd.',
|
||||||
|
'Limited.',
|
||||||
|
'Intel',
|
||||||
|
'chipset',
|
||||||
|
'adapter',
|
||||||
|
'[hex]',
|
||||||
|
'NDIS',
|
||||||
|
'Module'
|
||||||
|
];
|
||||||
|
|
||||||
|
const _IGNORED_PHRASES = [
|
||||||
|
'Multiprotocol MAC/baseband processor',
|
||||||
|
'Wireless LAN Controller',
|
||||||
|
'Wireless LAN Adapter',
|
||||||
|
'Wireless Adapter',
|
||||||
|
'Network Connection',
|
||||||
|
'Wireless Cardbus Adapter',
|
||||||
|
'Wireless CardBus Adapter',
|
||||||
|
'54 Mbps Wireless PC Card',
|
||||||
|
'Wireless PC Card',
|
||||||
|
'Wireless PC',
|
||||||
|
'PC Card with XJACK(r) Antenna',
|
||||||
|
'Wireless cardbus',
|
||||||
|
'Wireless LAN PC Card',
|
||||||
|
'Technology Group Ltd.',
|
||||||
|
'Communication S.p.A.',
|
||||||
|
'Business Mobile Networks BV',
|
||||||
|
'Mobile Broadband Minicard Composite Device',
|
||||||
|
'Mobile Communications AB',
|
||||||
|
'(PC-Suite Mode)'
|
||||||
|
];
|
||||||
|
|
||||||
|
function fixupPCIDescription(desc) {
|
||||||
|
desc = desc.replace(/[_,]/, ' ');
|
||||||
|
|
||||||
|
/* Attempt to shorten ID by ignoring certain phrases */
|
||||||
|
for (let i = 0; i < _IGNORED_PHRASES.length; i++) {
|
||||||
|
let item = _IGNORED_PHRASES[i];
|
||||||
|
let pos = desc.indexOf(item);
|
||||||
|
if (pos != -1) {
|
||||||
|
let before = desc.substring(0, pos);
|
||||||
|
let after = desc.substring(pos + item.length, desc.length);
|
||||||
|
desc = before + after;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attmept to shorten ID by ignoring certain individual words */
|
||||||
|
let words = desc.split(' ');
|
||||||
|
let out = [ ];
|
||||||
|
for (let i = 0; i < words.length; i++) {
|
||||||
|
let item = words[i];
|
||||||
|
|
||||||
|
// skip empty items (that come out from consecutive spaces)
|
||||||
|
if (item.length == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (_IGNORED_WORDS.indexOf(item) == -1) {
|
||||||
|
out.push(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out.join(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
// lowerBound:
|
// lowerBound:
|
||||||
@ -309,92 +288,3 @@ function insertSorted(array, val, cmp) {
|
|||||||
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CloseButton = new Lang.Class({
|
|
||||||
Name: 'CloseButton',
|
|
||||||
Extends: St.Button,
|
|
||||||
|
|
||||||
_init: function(boxpointer) {
|
|
||||||
this.parent({ style_class: 'notification-close'});
|
|
||||||
|
|
||||||
// This is a bit tricky. St.Bin has its own x-align/y-align properties
|
|
||||||
// that compete with Clutter's properties. This should be fixed for
|
|
||||||
// Clutter 2.0. Since St.Bin doesn't define its own setters, the
|
|
||||||
// setters are a workaround to get Clutter's version.
|
|
||||||
this.set_x_align(Clutter.ActorAlign.END);
|
|
||||||
this.set_y_align(Clutter.ActorAlign.START);
|
|
||||||
|
|
||||||
// XXX Clutter 2.0 workaround: ClutterBinLayout needs expand
|
|
||||||
// to respect the alignments.
|
|
||||||
this.set_x_expand(true);
|
|
||||||
this.set_y_expand(true);
|
|
||||||
|
|
||||||
this._boxPointer = boxpointer;
|
|
||||||
if (boxpointer)
|
|
||||||
this._boxPointer.connect('arrow-side-changed', Lang.bind(this, this._sync));
|
|
||||||
},
|
|
||||||
|
|
||||||
_computeBoxPointerOffset: function() {
|
|
||||||
if (!this._boxPointer || !this._boxPointer.actor.get_stage())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
let side = this._boxPointer.arrowSide;
|
|
||||||
if (side == St.Side.TOP)
|
|
||||||
return this._boxPointer.getArrowHeight();
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
_sync: function() {
|
|
||||||
let themeNode = this.get_theme_node();
|
|
||||||
|
|
||||||
let offY = this._computeBoxPointerOffset();
|
|
||||||
this.translation_x = themeNode.get_length('-shell-close-overlap-x')
|
|
||||||
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_style_changed: function() {
|
|
||||||
this._sync();
|
|
||||||
this.parent();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
function makeCloseButton(boxpointer) {
|
|
||||||
return new CloseButton(boxpointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensureActorVisibleInScrollView(scrollView, actor) {
|
|
||||||
let adjustment = scrollView.vscroll.adjustment;
|
|
||||||
let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
|
|
||||||
|
|
||||||
let offset = 0;
|
|
||||||
let vfade = scrollView.get_effect("fade");
|
|
||||||
if (vfade)
|
|
||||||
offset = vfade.vfade_offset;
|
|
||||||
|
|
||||||
let box = actor.get_allocation_box();
|
|
||||||
let y1 = box.y1, y2 = box.y2;
|
|
||||||
|
|
||||||
let parent = actor.get_parent();
|
|
||||||
while (parent != scrollView) {
|
|
||||||
if (!parent)
|
|
||||||
throw new Error("actor not in scroll view");
|
|
||||||
|
|
||||||
let box = parent.get_allocation_box();
|
|
||||||
y1 += box.y1;
|
|
||||||
y2 += box.y1;
|
|
||||||
parent = parent.get_parent();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (y1 < value + offset)
|
|
||||||
value = Math.max(0, y1 - offset);
|
|
||||||
else if (y2 > value + pageSize - offset)
|
|
||||||
value = Math.min(upper, y2 + offset - pageSize);
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
Tweener.addTween(adjustment,
|
|
||||||
{ value: value,
|
|
||||||
time: SCROLL_TIME,
|
|
||||||
transition: 'easeOutQuad' });
|
|
||||||
}
|
|
||||||
|
@ -72,9 +72,6 @@ function run() {
|
|||||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
||||||
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
||||||
|
|
||||||
// Enable recording of timestamps for different points in the frame cycle
|
|
||||||
global.frame_timestamps = true;
|
|
||||||
|
|
||||||
Main.overview.connect('shown', function() {
|
Main.overview.connect('shown', function() {
|
||||||
Scripting.scriptEvent('overviewShowDone');
|
Scripting.scriptEvent('overviewShowDone');
|
||||||
});
|
});
|
||||||
@ -90,10 +87,7 @@ function run() {
|
|||||||
yield Scripting.destroyTestWindows();
|
yield Scripting.destroyTestWindows();
|
||||||
|
|
||||||
for (let k = 0; k < config.count; k++)
|
for (let k = 0; k < config.count; k++)
|
||||||
yield Scripting.createTestWindow({ width: config.width,
|
yield Scripting.createTestWindow(config.width, config.height, config.alpha, config.maximized);
|
||||||
height: config.height,
|
|
||||||
alpha: config.alpha,
|
|
||||||
maximized: config.maximized });
|
|
||||||
|
|
||||||
yield Scripting.waitTestWindows();
|
yield Scripting.waitTestWindows();
|
||||||
yield Scripting.sleep(1000);
|
yield Scripting.sleep(1000);
|
||||||
@ -121,10 +115,10 @@ function run() {
|
|||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
for (let i = 0; i < 2; i++) {
|
||||||
Scripting.scriptEvent('applicationsShowStart');
|
Scripting.scriptEvent('applicationsShowStart');
|
||||||
Main.overview._dash.showAppsButton.checked = true;
|
Main.overview._viewSelector.switchTab('applications');
|
||||||
yield Scripting.waitLeisure();
|
yield Scripting.waitLeisure();
|
||||||
Scripting.scriptEvent('applicationsShowDone');
|
Scripting.scriptEvent('applicationsShowDone');
|
||||||
Main.overview._dash.showAppsButton.checked = false;
|
Main.overview._viewSelector.switchTab('windows');
|
||||||
yield Scripting.waitLeisure();
|
yield Scripting.waitLeisure();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,308 +0,0 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const Scripting = imports.ui.scripting;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
let METRICS = {
|
|
||||||
timeToDesktop:
|
|
||||||
{ description: "Time from starting graphical.target to desktop showing",
|
|
||||||
units: "us" },
|
|
||||||
|
|
||||||
overviewShowTime:
|
|
||||||
{ description: "Time to switch to overview view, first time",
|
|
||||||
units: "us" },
|
|
||||||
|
|
||||||
applicationsShowTime:
|
|
||||||
{ description: "Time to switch to applications view, first time",
|
|
||||||
units: "us" },
|
|
||||||
|
|
||||||
mainViewRedrawTime:
|
|
||||||
{ description: "Time to redraw the main view, full screen",
|
|
||||||
units: "us" },
|
|
||||||
|
|
||||||
overviewRedrawTime:
|
|
||||||
{ description: "Time to redraw the overview, full screen, 5 windows",
|
|
||||||
units: "us" },
|
|
||||||
|
|
||||||
applicationRedrawTime:
|
|
||||||
{ description: "Time to redraw frame with a maximized application update",
|
|
||||||
units: "us" },
|
|
||||||
|
|
||||||
geditStartTime:
|
|
||||||
{ description: "Time from gedit launch to window drawn",
|
|
||||||
units: "us" },
|
|
||||||
}
|
|
||||||
|
|
||||||
function waitAndDraw(milliseconds) {
|
|
||||||
let cb;
|
|
||||||
|
|
||||||
let timeline = new Clutter.Timeline({ duration: milliseconds });
|
|
||||||
timeline.start();
|
|
||||||
|
|
||||||
timeline.connect('new-frame',
|
|
||||||
function(timeline, frame) {
|
|
||||||
global.stage.queue_redraw();
|
|
||||||
});
|
|
||||||
|
|
||||||
timeline.connect('completed',
|
|
||||||
function() {
|
|
||||||
timeline.stop();
|
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function waitSignal(object, signal) {
|
|
||||||
let cb;
|
|
||||||
|
|
||||||
let id = object.connect(signal, function() {
|
|
||||||
object.disconnect(id);
|
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractBootTimestamp() {
|
|
||||||
let sp = Gio.Subprocess.new(['journalctl', '-b',
|
|
||||||
'MESSAGE_ID=7d4958e842da4a758f6c1cdc7b36dcc5',
|
|
||||||
'UNIT=graphical.target',
|
|
||||||
'-o',
|
|
||||||
'json'],
|
|
||||||
Gio.SubprocessFlags.STDOUT_PIPE);
|
|
||||||
let result = null;
|
|
||||||
|
|
||||||
let datastream = Gio.DataInputStream.new(sp.get_stdout_pipe());
|
|
||||||
while (true) {
|
|
||||||
let [line, length] = datastream.read_line_utf8(null);
|
|
||||||
if (line === null)
|
|
||||||
break;
|
|
||||||
|
|
||||||
let fields = JSON.parse(line);
|
|
||||||
result = Number(fields['__MONOTONIC_TIMESTAMP']);
|
|
||||||
}
|
|
||||||
datastream.close(null);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function run() {
|
|
||||||
Scripting.defineScriptEvent("desktopShown", "Finished initial animation");
|
|
||||||
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
|
||||||
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
|
||||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
|
||||||
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
|
||||||
Scripting.defineScriptEvent("mainViewDrawStart", "Drawing main view");
|
|
||||||
Scripting.defineScriptEvent("mainViewDrawDone", "Ending timing main view drawing");
|
|
||||||
Scripting.defineScriptEvent("overviewDrawStart", "Drawing overview");
|
|
||||||
Scripting.defineScriptEvent("overviewDrawDone", "Ending timing overview drawing");
|
|
||||||
Scripting.defineScriptEvent("redrawTestStart", "Drawing application window");
|
|
||||||
Scripting.defineScriptEvent("redrawTestDone", "Ending timing application window drawing");
|
|
||||||
Scripting.defineScriptEvent("collectTimings", "Accumulate frame timings from redraw tests");
|
|
||||||
Scripting.defineScriptEvent("geditLaunch", "gedit application launch");
|
|
||||||
Scripting.defineScriptEvent("geditFirstFrame", "first frame of gedit window drawn");
|
|
||||||
|
|
||||||
yield Scripting.waitLeisure();
|
|
||||||
Scripting.scriptEvent('desktopShown');
|
|
||||||
|
|
||||||
Gtk.Settings.get_default().gtk_enable_animations = false;
|
|
||||||
|
|
||||||
Scripting.scriptEvent('overviewShowStart');
|
|
||||||
Main.overview.show();
|
|
||||||
yield Scripting.waitLeisure();
|
|
||||||
Scripting.scriptEvent('overviewShowDone');
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
|
|
||||||
Scripting.scriptEvent('applicationsShowStart');
|
|
||||||
Main.overview._dash.showAppsButton.checked = true;
|
|
||||||
|
|
||||||
yield Scripting.waitLeisure();
|
|
||||||
Scripting.scriptEvent('applicationsShowDone');
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
|
|
||||||
Main.overview.hide();
|
|
||||||
yield Scripting.waitLeisure();
|
|
||||||
|
|
||||||
////////////////////////////////////////
|
|
||||||
// Tests of redraw speed
|
|
||||||
////////////////////////////////////////
|
|
||||||
|
|
||||||
global.frame_timestamps = true;
|
|
||||||
global.frame_finish_timestamp = true;
|
|
||||||
|
|
||||||
for (let k = 0; k < 5; k++)
|
|
||||||
yield Scripting.createTestWindow(640, 480,
|
|
||||||
{ maximized: true });
|
|
||||||
yield Scripting.waitTestWindows();
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
|
|
||||||
Scripting.scriptEvent('mainViewDrawStart');
|
|
||||||
yield waitAndDraw(1000);
|
|
||||||
Scripting.scriptEvent('mainViewDrawDone');
|
|
||||||
|
|
||||||
Main.overview.show();
|
|
||||||
Scripting.waitLeisure();
|
|
||||||
|
|
||||||
yield Scripting.sleep(1500);
|
|
||||||
|
|
||||||
Scripting.scriptEvent('overviewDrawStart');
|
|
||||||
yield waitAndDraw(1000);
|
|
||||||
Scripting.scriptEvent('overviewDrawDone');
|
|
||||||
|
|
||||||
yield Scripting.destroyTestWindows();
|
|
||||||
Main.overview.hide();
|
|
||||||
|
|
||||||
yield Scripting.createTestWindow(640, 480,
|
|
||||||
{ maximized: true,
|
|
||||||
redraws: true});
|
|
||||||
yield Scripting.waitTestWindows();
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
|
|
||||||
Scripting.scriptEvent('redrawTestStart');
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
Scripting.scriptEvent('redrawTestDone');
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
Scripting.scriptEvent('collectTimings');
|
|
||||||
|
|
||||||
yield Scripting.destroyTestWindows();
|
|
||||||
|
|
||||||
global.frame_timestamps = false;
|
|
||||||
global.frame_finish_timestamp = false;
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
|
|
||||||
////////////////////////////////////////
|
|
||||||
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
let app = appSys.lookup_app('org.gnome.gedit.desktop');
|
|
||||||
|
|
||||||
Scripting.scriptEvent('geditLaunch');
|
|
||||||
app.activate();
|
|
||||||
|
|
||||||
let windows = app.get_windows();
|
|
||||||
if (windows.length > 0)
|
|
||||||
throw new Error('gedit was already running');
|
|
||||||
|
|
||||||
while (windows.length == 0) {
|
|
||||||
yield waitSignal(global.display, 'window-created');
|
|
||||||
windows = app.get_windows();
|
|
||||||
}
|
|
||||||
|
|
||||||
let actor = windows[0].get_compositor_private();
|
|
||||||
yield waitSignal(actor, 'first-frame');
|
|
||||||
Scripting.scriptEvent('geditFirstFrame');
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
|
|
||||||
windows[0].delete(global.get_current_time());
|
|
||||||
|
|
||||||
yield Scripting.sleep(1000);
|
|
||||||
|
|
||||||
Gtk.Settings.get_default().gtk_enable_animations = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
let overviewShowStart;
|
|
||||||
let applicationsShowStart;
|
|
||||||
let stagePaintStart;
|
|
||||||
let redrawTiming;
|
|
||||||
let redrawTimes = {};
|
|
||||||
let geditLaunchTime;
|
|
||||||
|
|
||||||
function script_desktopShown(time) {
|
|
||||||
let bootTimestamp = extractBootTimestamp();
|
|
||||||
METRICS.timeToDesktop.value = time - bootTimestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_overviewShowStart(time) {
|
|
||||||
overviewShowStart = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_overviewShowDone(time) {
|
|
||||||
METRICS.overviewShowTime.value = time - overviewShowStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_applicationsShowStart(time) {
|
|
||||||
applicationsShowStart = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_applicationsShowDone(time) {
|
|
||||||
METRICS.applicationsShowTime.value = time - applicationsShowStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_mainViewDrawStart(time) {
|
|
||||||
redrawTiming = 'mainView';
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_mainViewDrawDone(time) {
|
|
||||||
redrawTiming = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_overviewDrawStart(time) {
|
|
||||||
redrawTiming = 'overview';
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_overviewDrawDone(time) {
|
|
||||||
redrawTiming = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_redrawTestStart(time) {
|
|
||||||
redrawTiming = 'application';
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_redrawTestDone(time) {
|
|
||||||
redrawTiming = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_collectTimings(time) {
|
|
||||||
for (let timing in redrawTimes) {
|
|
||||||
let times = redrawTimes[timing];
|
|
||||||
times.sort(function(a, b) { return a - b });
|
|
||||||
|
|
||||||
let len = times.length;
|
|
||||||
let median;
|
|
||||||
|
|
||||||
if (len == 0)
|
|
||||||
median = -1;
|
|
||||||
else if (len % 2 == 1)
|
|
||||||
median = times[(len - 1)/ 2];
|
|
||||||
else
|
|
||||||
median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
|
|
||||||
|
|
||||||
METRICS[timing + 'RedrawTime'].value = median;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_geditLaunch(time) {
|
|
||||||
geditLaunchTime = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
function script_geditFirstFrame(time) {
|
|
||||||
METRICS.geditStartTime.value = time - geditLaunchTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
function clutter_stagePaintStart(time) {
|
|
||||||
stagePaintStart = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
function clutter_paintCompletedTimestamp(time) {
|
|
||||||
if (redrawTiming != null && stagePaintStart != null) {
|
|
||||||
if (!(redrawTiming in redrawTimes))
|
|
||||||
redrawTimes[redrawTiming] = [];
|
|
||||||
redrawTimes[redrawTiming].push(time - stagePaintStart);
|
|
||||||
}
|
|
||||||
stagePaintStart = null;
|
|
||||||
}
|
|
@ -1,247 +0,0 @@
|
|||||||
const Format = imports.format;
|
|
||||||
const Gettext = imports.gettext;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Soup = imports.gi.Soup;
|
|
||||||
const WebKit = imports.gi.WebKit2;
|
|
||||||
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
|
||||||
|
|
||||||
const PortalHelperResult = {
|
|
||||||
CANCELLED: 0,
|
|
||||||
COMPLETED: 1,
|
|
||||||
RECHECK: 2
|
|
||||||
};
|
|
||||||
|
|
||||||
const INACTIVITY_TIMEOUT = 30000; //ms
|
|
||||||
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
|
||||||
|
|
||||||
const HelperDBusInterface = '<node> \
|
|
||||||
<interface name="org.gnome.Shell.PortalHelper"> \
|
|
||||||
<method name="Authenticate"> \
|
|
||||||
<arg type="o" direction="in" name="connection" /> \
|
|
||||||
<arg type="s" direction="in" name="url" /> \
|
|
||||||
<arg type="u" direction="in" name="timestamp" /> \
|
|
||||||
</method> \
|
|
||||||
<method name="Close"> \
|
|
||||||
<arg type="o" direction="in" name="connection" /> \
|
|
||||||
</method> \
|
|
||||||
<method name="Refresh"> \
|
|
||||||
<arg type="o" direction="in" name="connection" /> \
|
|
||||||
</method> \
|
|
||||||
<signal name="Done"> \
|
|
||||||
<arg type="o" name="connection" /> \
|
|
||||||
<arg type="u" name="result" /> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const PortalWindow = new Lang.Class({
|
|
||||||
Name: 'PortalWindow',
|
|
||||||
Extends: Gtk.ApplicationWindow,
|
|
||||||
|
|
||||||
_init: function(application, url, timestamp, doneCallback) {
|
|
||||||
this.parent({ application: application });
|
|
||||||
|
|
||||||
if (!url) {
|
|
||||||
url = 'http://www.gnome.org';
|
|
||||||
this._originalUrlWasGnome = true;
|
|
||||||
} else {
|
|
||||||
this._originalUrlWasGnome = false;
|
|
||||||
}
|
|
||||||
this._uri = new Soup.URI(url);
|
|
||||||
this._everSeenRedirect = false;
|
|
||||||
this._originalUrl = url;
|
|
||||||
this._doneCallback = doneCallback;
|
|
||||||
this._lastRecheck = 0;
|
|
||||||
this._recheckAtExit = false;
|
|
||||||
|
|
||||||
this._webView = new WebKit.WebView();
|
|
||||||
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
|
|
||||||
this._webView.load_uri(url);
|
|
||||||
this._webView.connect('notify::title', Lang.bind(this, this._syncTitle));
|
|
||||||
this._syncTitle();
|
|
||||||
|
|
||||||
this.add(this._webView);
|
|
||||||
this._webView.show();
|
|
||||||
this.maximize();
|
|
||||||
this.present_with_time(timestamp);
|
|
||||||
},
|
|
||||||
|
|
||||||
_syncTitle: function() {
|
|
||||||
let title = this._webView.title;
|
|
||||||
|
|
||||||
if (title) {
|
|
||||||
this.title = title;
|
|
||||||
} else {
|
|
||||||
/* TRANSLATORS: this is the title of the wifi captive portal login
|
|
||||||
* window, until we know the title of the actual login page */
|
|
||||||
this.title = _("Web Authentication Redirect");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
refresh: function() {
|
|
||||||
this._everSeenRedirect = false;
|
|
||||||
this._webView.load_uri(this._originalUrl);
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_delete_event: function(event) {
|
|
||||||
if (this._recheckAtExit)
|
|
||||||
this._doneCallback(PortalHelperResult.RECHECK);
|
|
||||||
else
|
|
||||||
this._doneCallback(PortalHelperResult.CANCELLED);
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDecidePolicy: function(view, decision, type) {
|
|
||||||
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
|
|
||||||
decision.ignore();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type != WebKit.PolicyDecisionType.NAVIGATION_ACTION)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let request = decision.get_request();
|
|
||||||
let uri = new Soup.URI(request.get_uri());
|
|
||||||
|
|
||||||
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
|
|
||||||
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
|
|
||||||
// Yay, we got to gnome!
|
|
||||||
decision.ignore();
|
|
||||||
this._doneCallback(PortalHelperResult.COMPLETED);
|
|
||||||
return true;
|
|
||||||
} else if (uri.get_host() != 'www.gnome.org') {
|
|
||||||
this._everSeenRedirect = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We *may* have finished here, but we don't know for
|
|
||||||
// sure. Tell gnome-shell to run another connectivity check
|
|
||||||
// (but ratelimit the checks, we don't want to spam
|
|
||||||
// nmcheck.gnome.org for portals that have 10 or more internal
|
|
||||||
// redirects - and unfortunately they exist)
|
|
||||||
// If we hit the rate limit, we also queue a recheck
|
|
||||||
// when the window is closed, just in case we miss the
|
|
||||||
// final check and don't realize we're connected
|
|
||||||
// This should not be a problem in the cancelled logic,
|
|
||||||
// because if the user doesn't want to start the login,
|
|
||||||
// we should not see any redirect at all, outside this._uri
|
|
||||||
|
|
||||||
let now = GLib.get_monotonic_time();
|
|
||||||
let shouldRecheck = (now - this._lastRecheck) >
|
|
||||||
CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT;
|
|
||||||
|
|
||||||
if (shouldRecheck) {
|
|
||||||
this._lastRecheck = now;
|
|
||||||
this._recheckAtExit = false;
|
|
||||||
this._doneCallback(PortalHelperResult.RECHECK);
|
|
||||||
} else {
|
|
||||||
this._recheckAtExit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the URI, in case of chained redirects, so we still
|
|
||||||
// think we're doing the login until gnome-shell kills us
|
|
||||||
this._uri = uri;
|
|
||||||
|
|
||||||
decision.use();
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const WebPortalHelper = new Lang.Class({
|
|
||||||
Name: 'WebPortalHelper',
|
|
||||||
Extends: Gtk.Application,
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this.parent({ application_id: 'org.gnome.Shell.PortalHelper',
|
|
||||||
flags: Gio.ApplicationFlags.IS_SERVICE,
|
|
||||||
inactivity_timeout: 30000 });
|
|
||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
|
|
||||||
this._queue = [];
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_dbus_register: function(connection, path) {
|
|
||||||
this._dbusImpl.export(connection, path);
|
|
||||||
this.parent(connection, path);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_dbus_unregister: function(connection, path) {
|
|
||||||
this._dbusImpl.unexport_from_connection(connection);
|
|
||||||
this.parent(connection, path);
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_activate: function() {
|
|
||||||
// If launched manually (for example for testing), force a dummy authentication
|
|
||||||
// session with the default url
|
|
||||||
this.Authenticate('/org/gnome/dummy', '', 0);
|
|
||||||
},
|
|
||||||
|
|
||||||
Authenticate: function(connection, url, timestamp) {
|
|
||||||
this._queue.push({ connection: connection, url: url, timestamp: timestamp });
|
|
||||||
|
|
||||||
this._processQueue();
|
|
||||||
},
|
|
||||||
|
|
||||||
Close: function(connection) {
|
|
||||||
for (let i = 0; i < this._queue.length; i++) {
|
|
||||||
let obj = this._queue[i];
|
|
||||||
|
|
||||||
if (obj.connection == connection) {
|
|
||||||
if (obj.window)
|
|
||||||
obj.window.destroy();
|
|
||||||
this._queue.splice(i, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._processQueue();
|
|
||||||
},
|
|
||||||
|
|
||||||
Refresh: function(connection) {
|
|
||||||
for (let i = 0; i < this._queue.length; i++) {
|
|
||||||
let obj = this._queue[i];
|
|
||||||
|
|
||||||
if (obj.connection == connection) {
|
|
||||||
if (obj.window)
|
|
||||||
obj.window.refresh();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_processQueue: function() {
|
|
||||||
if (this._queue.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let top = this._queue[0];
|
|
||||||
if (top.window != null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
top.window = new PortalWindow(this, top.uri, top.timestamp, Lang.bind(this, function(result) {
|
|
||||||
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
function initEnvironment() {
|
|
||||||
String.prototype.format = Format.format;
|
|
||||||
}
|
|
||||||
|
|
||||||
function main(argv) {
|
|
||||||
initEnvironment();
|
|
||||||
|
|
||||||
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
|
||||||
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
|
||||||
|
|
||||||
let app = new WebPortalHelper();
|
|
||||||
return app.run(argv);
|
|
||||||
}
|
|
1001
js/ui/altTab.js
@ -1,88 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const Atk = imports.gi.Atk;
|
|
||||||
|
|
||||||
const ANIMATED_ICON_UPDATE_TIMEOUT = 16;
|
|
||||||
|
|
||||||
const Animation = new Lang.Class({
|
|
||||||
Name: 'Animation',
|
|
||||||
|
|
||||||
_init: function(file, width, height, speed) {
|
|
||||||
this.actor = new St.Bin();
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
|
||||||
this._speed = speed;
|
|
||||||
|
|
||||||
this._isLoaded = false;
|
|
||||||
this._isPlaying = false;
|
|
||||||
this._timeoutId = 0;
|
|
||||||
this._frame = 0;
|
|
||||||
|
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
|
||||||
this._animations = St.TextureCache.get_default().load_sliced_image (file, width, height, scaleFactor,
|
|
||||||
Lang.bind(this, this._animationsLoaded));
|
|
||||||
this.actor.set_child(this._animations);
|
|
||||||
},
|
|
||||||
|
|
||||||
play: function() {
|
|
||||||
if (this._isLoaded && this._timeoutId == 0) {
|
|
||||||
if (this._frame == 0)
|
|
||||||
this._showFrame(0);
|
|
||||||
|
|
||||||
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_LOW, this._speed, Lang.bind(this, this._update));
|
|
||||||
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isPlaying = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
stop: function() {
|
|
||||||
if (this._timeoutId > 0) {
|
|
||||||
Mainloop.source_remove(this._timeoutId);
|
|
||||||
this._timeoutId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isPlaying = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_showFrame: function(frame) {
|
|
||||||
let oldFrameActor = this._animations.get_child_at_index(this._frame);
|
|
||||||
if (oldFrameActor)
|
|
||||||
oldFrameActor.hide();
|
|
||||||
|
|
||||||
this._frame = (frame % this._animations.get_n_children());
|
|
||||||
|
|
||||||
let newFrameActor = this._animations.get_child_at_index(this._frame);
|
|
||||||
if (newFrameActor)
|
|
||||||
newFrameActor.show();
|
|
||||||
},
|
|
||||||
|
|
||||||
_update: function() {
|
|
||||||
this._showFrame(this._frame + 1);
|
|
||||||
return GLib.SOURCE_CONTINUE;
|
|
||||||
},
|
|
||||||
|
|
||||||
_animationsLoaded: function() {
|
|
||||||
this._isLoaded = true;
|
|
||||||
|
|
||||||
if (this._isPlaying)
|
|
||||||
this.play();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDestroy: function() {
|
|
||||||
this.stop();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const AnimatedIcon = new Lang.Class({
|
|
||||||
Name: 'AnimatedIcon',
|
|
||||||
Extends: Animation,
|
|
||||||
|
|
||||||
_init: function(file, size) {
|
|
||||||
this.parent(file, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
|
|
||||||
}
|
|
||||||
});
|
|
2090
js/ui/appDisplay.js
@ -6,38 +6,6 @@ const Signals = imports.signals;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const RENAMED_DESKTOP_IDS = {
|
|
||||||
'baobab.desktop': 'org.gnome.baobab.desktop',
|
|
||||||
'cheese.desktop': 'org.gnome.Cheese.desktop',
|
|
||||||
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
|
||||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
|
||||||
'gcalctool.desktop': 'gnome-calculator.desktop',
|
|
||||||
'gedit.desktop': 'org.gnome.gedit.desktop',
|
|
||||||
'glchess.desktop': 'gnome-chess.desktop',
|
|
||||||
'glines.desktop': 'five-or-more.desktop',
|
|
||||||
'gnect.desktop': 'four-in-a-row.desktop',
|
|
||||||
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
|
||||||
'gnobots2.desktop': 'gnome-robots.desktop',
|
|
||||||
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
|
||||||
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
|
||||||
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
|
||||||
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
|
||||||
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
|
||||||
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
|
||||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
|
||||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
|
||||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
|
||||||
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
|
||||||
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
|
||||||
'gnomine.desktop': 'gnome-mines.desktop',
|
|
||||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
|
||||||
'gnotski.desktop': 'gnome-klotski.desktop',
|
|
||||||
'gtali.desktop': 'tali.desktop',
|
|
||||||
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
|
||||||
'polari.desktop': 'org.gnome.Polari.desktop',
|
|
||||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
|
||||||
};
|
|
||||||
|
|
||||||
const AppFavorites = new Lang.Class({
|
const AppFavorites = new Lang.Class({
|
||||||
Name: 'AppFavorites',
|
Name: 'AppFavorites',
|
||||||
|
|
||||||
@ -46,31 +14,16 @@ const AppFavorites = new Lang.Class({
|
|||||||
_init: function() {
|
_init: function() {
|
||||||
this._favorites = {};
|
this._favorites = {};
|
||||||
global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, Lang.bind(this, this._onFavsChanged));
|
global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, Lang.bind(this, this._onFavsChanged));
|
||||||
this.reload();
|
this._reload();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onFavsChanged: function() {
|
_onFavsChanged: function() {
|
||||||
this.reload();
|
this._reload();
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
},
|
},
|
||||||
|
|
||||||
reload: function() {
|
_reload: function() {
|
||||||
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
||||||
|
|
||||||
// Map old desktop file names to the current ones
|
|
||||||
let updated = false;
|
|
||||||
ids = ids.map(function (id) {
|
|
||||||
let newId = RENAMED_DESKTOP_IDS[id];
|
|
||||||
if (newId !== undefined) {
|
|
||||||
updated = true;
|
|
||||||
return newId;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
});
|
|
||||||
// ... and write back the updated desktop file names
|
|
||||||
if (updated)
|
|
||||||
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
|
||||||
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
let appSys = Shell.AppSystem.get_default();
|
||||||
let apps = ids.map(function (id) {
|
let apps = ids.map(function (id) {
|
||||||
return appSys.lookup_app(id);
|
return appSys.lookup_app(id);
|
||||||
@ -131,12 +84,9 @@ const AppFavorites = new Lang.Class({
|
|||||||
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(appId);
|
let app = Shell.AppSystem.get_default().lookup_app(appId);
|
||||||
|
|
||||||
Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()),
|
Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
|
||||||
{ forFeedback: true,
|
this._removeFavorite(appId);
|
||||||
undoCallback: Lang.bind(this, function () {
|
}));
|
||||||
this._removeFavorite(appId);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
addFavorite: function(appId) {
|
addFavorite: function(appId) {
|
||||||
@ -166,11 +116,9 @@ const AppFavorites = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Main.overview.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
|
Main.overview.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
|
||||||
{ forFeedback: true,
|
Lang.bind(this, function () {
|
||||||
undoCallback: Lang.bind(this, function () {
|
this._addFavorite(appId, pos);
|
||||||
this._addFavorite(appId, pos);
|
}));
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(AppFavorites.prototype);
|
Signals.addSignalMethods(AppFavorites.prototype);
|
||||||
|
@ -1,216 +0,0 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
|
||||||
|
|
||||||
const AudioDevice = {
|
|
||||||
HEADPHONES: 1 << 0,
|
|
||||||
HEADSET: 1 << 1,
|
|
||||||
MICROPHONE: 1 << 2
|
|
||||||
};
|
|
||||||
|
|
||||||
const AudioDeviceSelectionIface = '<node> \
|
|
||||||
<interface name="org.gnome.Shell.AudioDeviceSelection"> \
|
|
||||||
<method name="Open"> \
|
|
||||||
<arg name="devices" direction="in" type="as" /> \
|
|
||||||
</method> \
|
|
||||||
<method name="Close"> \
|
|
||||||
</method> \
|
|
||||||
<signal name="DeviceSelected"> \
|
|
||||||
<arg name="device" type="s" /> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const AudioDeviceSelectionDialog = new Lang.Class({
|
|
||||||
Name: 'AudioDeviceSelectionDialog',
|
|
||||||
Extends: ModalDialog.ModalDialog,
|
|
||||||
|
|
||||||
_init: function(devices) {
|
|
||||||
this.parent({ styleClass: 'audio-device-selection-dialog' });
|
|
||||||
|
|
||||||
this._deviceItems = {};
|
|
||||||
|
|
||||||
this._buildLayout();
|
|
||||||
|
|
||||||
if (devices & AudioDevice.HEADPHONES)
|
|
||||||
this._addDevice(AudioDevice.HEADPHONES);
|
|
||||||
if (devices & AudioDevice.HEADSET)
|
|
||||||
this._addDevice(AudioDevice.HEADSET);
|
|
||||||
if (devices & AudioDevice.MICROPHONE)
|
|
||||||
this._addDevice(AudioDevice.MICROPHONE);
|
|
||||||
|
|
||||||
if (this._selectionBox.get_n_children() < 2)
|
|
||||||
throw new Error('Too few devices for a selection');
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
this.parent();
|
|
||||||
},
|
|
||||||
|
|
||||||
_buildLayout: function(devices) {
|
|
||||||
let title = new St.Label({ style_class: 'audio-selection-title',
|
|
||||||
text: _("Select Audio Device"),
|
|
||||||
x_align: Clutter.ActorAlign.CENTER });
|
|
||||||
|
|
||||||
this.contentLayout.style_class = 'audio-selection-content';
|
|
||||||
this.contentLayout.add(title);
|
|
||||||
|
|
||||||
this._selectionBox = new St.BoxLayout({ style_class: 'audio-selection-box' });
|
|
||||||
this.contentLayout.add(this._selectionBox, { expand: true });
|
|
||||||
|
|
||||||
this.addButton({ action: Lang.bind(this, this._openSettings),
|
|
||||||
label: _("Sound Settings") });
|
|
||||||
this.addButton({ action: Lang.bind(this, this.close),
|
|
||||||
label: _("Cancel"),
|
|
||||||
key: Clutter.Escape });
|
|
||||||
},
|
|
||||||
|
|
||||||
_getDeviceLabel: function(device) {
|
|
||||||
switch(device) {
|
|
||||||
case AudioDevice.HEADPHONES:
|
|
||||||
return _("Headphones");
|
|
||||||
case AudioDevice.HEADSET:
|
|
||||||
return _("Headset");
|
|
||||||
case AudioDevice.MICROPHONE:
|
|
||||||
return _("Microphone");
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_getDeviceIcon: function(device) {
|
|
||||||
switch(device) {
|
|
||||||
case AudioDevice.HEADPHONES:
|
|
||||||
return 'audio-headphones-symbolic';
|
|
||||||
case AudioDevice.HEADSET:
|
|
||||||
return 'audio-headset-symbolic';
|
|
||||||
case AudioDevice.MICROPHONE:
|
|
||||||
return 'audio-input-microphone-symbolic';
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_addDevice: function(device) {
|
|
||||||
let box = new St.BoxLayout({ style_class: 'audio-selection-device-box',
|
|
||||||
vertical: true });
|
|
||||||
box.connect('notify::height',
|
|
||||||
function() {
|
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
|
||||||
function() {
|
|
||||||
box.width = box.height;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let icon = new St.Icon({ style_class: 'audio-selection-device-icon',
|
|
||||||
icon_name: this._getDeviceIcon(device) });
|
|
||||||
box.add(icon);
|
|
||||||
|
|
||||||
let label = new St.Label({ style_class: 'audio-selection-device-label',
|
|
||||||
text: this._getDeviceLabel(device),
|
|
||||||
x_align: Clutter.ActorAlign.CENTER });
|
|
||||||
box.add(label);
|
|
||||||
|
|
||||||
let button = new St.Button({ style_class: 'audio-selection-device',
|
|
||||||
can_focus: true,
|
|
||||||
child: box });
|
|
||||||
this._selectionBox.add(button);
|
|
||||||
|
|
||||||
button.connect('clicked', Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this.emit('device-selected', device);
|
|
||||||
this.close();
|
|
||||||
Main.overview.hide();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_openSettings: function() {
|
|
||||||
let desktopFile = 'gnome-sound-panel.desktop'
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
|
||||||
|
|
||||||
if (!app) {
|
|
||||||
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.close();
|
|
||||||
Main.overview.hide();
|
|
||||||
app.activate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const AudioDeviceSelectionDBus = new Lang.Class({
|
|
||||||
Name: 'AudioDeviceSelectionDBus',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._audioSelectionDialog = null;
|
|
||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this);
|
|
||||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection');
|
|
||||||
|
|
||||||
Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDialogClosed: function() {
|
|
||||||
this._audioSelectionDialog = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDeviceSelected: function(dialog, device) {
|
|
||||||
let connection = this._dbusImpl.get_connection();
|
|
||||||
let info = this._dbusImpl.get_info();
|
|
||||||
let deviceName = Object.keys(AudioDevice).filter(
|
|
||||||
function(dev) {
|
|
||||||
return AudioDevice[dev] == device;
|
|
||||||
})[0].toLowerCase();
|
|
||||||
connection.emit_signal(this._audioSelectionDialog._sender,
|
|
||||||
this._dbusImpl.get_object_path(),
|
|
||||||
info ? info.name : null,
|
|
||||||
'DeviceSelected',
|
|
||||||
GLib.Variant.new('(s)', [deviceName]));
|
|
||||||
},
|
|
||||||
|
|
||||||
OpenAsync: function(params, invocation) {
|
|
||||||
if (this._audioSelectionDialog) {
|
|
||||||
invocation.return_value(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let [deviceNames] = params;
|
|
||||||
let devices = 0;
|
|
||||||
deviceNames.forEach(function(n) {
|
|
||||||
devices |= AudioDevice[n.toUpperCase()];
|
|
||||||
});
|
|
||||||
|
|
||||||
let dialog;
|
|
||||||
try {
|
|
||||||
dialog = new AudioDeviceSelectionDialog(devices);
|
|
||||||
} catch(e) {
|
|
||||||
invocation.return_value(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dialog._sender = invocation.get_sender();
|
|
||||||
|
|
||||||
dialog.connect('closed', Lang.bind(this, this._onDialogClosed));
|
|
||||||
dialog.connect('device-selected',
|
|
||||||
Lang.bind(this, this._onDeviceSelected));
|
|
||||||
dialog.open();
|
|
||||||
|
|
||||||
this._audioSelectionDialog = dialog;
|
|
||||||
invocation.return_value(null);
|
|
||||||
},
|
|
||||||
|
|
||||||
CloseAsync: function(params, invocation) {
|
|
||||||
if (this._audioSelectionDialog &&
|
|
||||||
this._audioSelectionDialog._sender == invocation.get_sender())
|
|
||||||
this._audioSelectionDialog.close();
|
|
||||||
|
|
||||||
invocation.return_value(null);
|
|
||||||
}
|
|
||||||
});
|
|
@ -5,11 +5,11 @@ const Mainloop = imports.mainloop;
|
|||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
const Shell = imports.gi.Shell;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
|
|
||||||
const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
||||||
|
|
||||||
@ -19,11 +19,67 @@ const SETTING_ENABLE_AUTOMOUNT = 'automount';
|
|||||||
|
|
||||||
const AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
|
const AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
|
||||||
|
|
||||||
|
const ConsoleKitSessionIface = <interface name="org.freedesktop.ConsoleKit.Session">
|
||||||
|
<method name="IsActive">
|
||||||
|
<arg type="b" direction="out" />
|
||||||
|
</method>
|
||||||
|
<signal name="ActiveChanged">
|
||||||
|
<arg type="b" direction="out" />
|
||||||
|
</signal>
|
||||||
|
</interface>;
|
||||||
|
|
||||||
|
const ConsoleKitSessionProxy = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface);
|
||||||
|
|
||||||
|
const ConsoleKitManagerIface = <interface name="org.freedesktop.ConsoleKit.Manager">
|
||||||
|
<method name="GetCurrentSession">
|
||||||
|
<arg type="o" direction="out" />
|
||||||
|
</method>
|
||||||
|
</interface>;
|
||||||
|
|
||||||
|
const ConsoleKitManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ConsoleKitManagerIface);
|
||||||
|
|
||||||
|
function ConsoleKitManager() {
|
||||||
|
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
|
||||||
|
g_interface_name: ConsoleKitManagerInfo.name,
|
||||||
|
g_interface_info: ConsoleKitManagerInfo,
|
||||||
|
g_name: 'org.freedesktop.ConsoleKit',
|
||||||
|
g_object_path: '/org/freedesktop/ConsoleKit/Manager',
|
||||||
|
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
|
||||||
|
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
||||||
|
|
||||||
|
self._updateSessionActive = function() {
|
||||||
|
if (self.g_name_owner) {
|
||||||
|
self.GetCurrentSessionRemote(function([session]) {
|
||||||
|
self._ckSession = new ConsoleKitSessionProxy(Gio.DBus.system, 'org.freedesktop.ConsoleKit', session);
|
||||||
|
|
||||||
|
self._ckSession.connectSignal('ActiveChanged', function(object, senderName, [isActive]) {
|
||||||
|
self.sessionActive = isActive;
|
||||||
|
});
|
||||||
|
self._ckSession.IsActiveRemote(function([isActive]) {
|
||||||
|
self.sessionActive = isActive;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.sessionActive = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
self.connect('notify::g-name-owner',
|
||||||
|
Lang.bind(self, self._updateSessionActive));
|
||||||
|
|
||||||
|
self._updateSessionActive();
|
||||||
|
self.init(null);
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
function haveSystemd() {
|
||||||
|
return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
const AutomountManager = new Lang.Class({
|
const AutomountManager = new Lang.Class({
|
||||||
Name: 'AutomountManager',
|
Name: 'AutomountManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
|
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||||
this._volumeQueue = [];
|
this._volumeQueue = [];
|
||||||
this._session = new GnomeSession.SessionManager();
|
this._session = new GnomeSession.SessionManager();
|
||||||
this._session.connectSignal('InhibitorAdded',
|
this._session.connectSignal('InhibitorAdded',
|
||||||
@ -32,31 +88,30 @@ const AutomountManager = new Lang.Class({
|
|||||||
Lang.bind(this, this._InhibitorsChanged));
|
Lang.bind(this, this._InhibitorsChanged));
|
||||||
this._inhibited = false;
|
this._inhibited = false;
|
||||||
|
|
||||||
|
if (!haveSystemd())
|
||||||
|
this.ckListener = new ConsoleKitManager();
|
||||||
|
|
||||||
|
Main.screenShield.connect('lock-status-changed', Lang.bind(this, this._lockStatusChanged));
|
||||||
|
|
||||||
this._volumeMonitor = Gio.VolumeMonitor.get();
|
this._volumeMonitor = Gio.VolumeMonitor.get();
|
||||||
},
|
|
||||||
|
|
||||||
enable: function() {
|
this._volumeMonitor.connect('volume-added',
|
||||||
this._volumeAddedId = this._volumeMonitor.connect('volume-added', Lang.bind(this, this._onVolumeAdded));
|
Lang.bind(this,
|
||||||
this._volumeRemovedId = this._volumeMonitor.connect('volume-removed', Lang.bind(this, this._onVolumeRemoved));
|
this._onVolumeAdded));
|
||||||
this._driveConnectedId = this._volumeMonitor.connect('drive-connected', Lang.bind(this, this._onDriveConnected));
|
this._volumeMonitor.connect('volume-removed',
|
||||||
this._driveDisconnectedId = this._volumeMonitor.connect('drive-disconnected', Lang.bind(this, this._onDriveDisconnected));
|
Lang.bind(this,
|
||||||
this._driveEjectButtonId = this._volumeMonitor.connect('drive-eject-button', Lang.bind(this, this._onDriveEjectButton));
|
this._onVolumeRemoved));
|
||||||
|
this._volumeMonitor.connect('drive-connected',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._onDriveConnected));
|
||||||
|
this._volumeMonitor.connect('drive-disconnected',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._onDriveDisconnected));
|
||||||
|
this._volumeMonitor.connect('drive-eject-button',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._onDriveEjectButton));
|
||||||
|
|
||||||
this._mountAllId = Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
|
Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
|
||||||
GLib.Source.set_name_by_id(this._mountAllId, '[gnome-shell] this._startupMountAll');
|
|
||||||
},
|
|
||||||
|
|
||||||
disable: function() {
|
|
||||||
this._volumeMonitor.disconnect(this._volumeAddedId);
|
|
||||||
this._volumeMonitor.disconnect(this._volumeRemovedId);
|
|
||||||
this._volumeMonitor.disconnect(this._driveConnectedId);
|
|
||||||
this._volumeMonitor.disconnect(this._driveDisconnectedId);
|
|
||||||
this._volumeMonitor.disconnect(this._driveEjectButtonId);
|
|
||||||
|
|
||||||
if (this._mountAllId > 0) {
|
|
||||||
Mainloop.source_remove(this._mountAllId);
|
|
||||||
this._mountAllId = 0;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_InhibitorsChanged: function(object, senderName, [inhibtor]) {
|
_InhibitorsChanged: function(object, senderName, [inhibtor]) {
|
||||||
@ -69,6 +124,17 @@ const AutomountManager = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_lockStatusChanged: function(shield, locked) {
|
||||||
|
if (!locked) {
|
||||||
|
this._volumeQueue.forEach(Lang.bind(this, function(volume) {
|
||||||
|
this._checkAndMountVolume(volume);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear the queue anyway
|
||||||
|
this._volumeQueue = [];
|
||||||
|
},
|
||||||
|
|
||||||
_startupMountAll: function() {
|
_startupMountAll: function() {
|
||||||
let volumes = this._volumeMonitor.get_volumes();
|
let volumes = this._volumeMonitor.get_volumes();
|
||||||
volumes.forEach(Lang.bind(this, function(volume) {
|
volumes.forEach(Lang.bind(this, function(volume) {
|
||||||
@ -77,36 +143,48 @@ const AutomountManager = new Lang.Class({
|
|||||||
allowAutorun: false });
|
allowAutorun: false });
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._mountAllId = 0;
|
return false;
|
||||||
return GLib.SOURCE_REMOVE;
|
},
|
||||||
|
|
||||||
|
isSessionActive: function() {
|
||||||
|
// Return whether the current session is active, using the
|
||||||
|
// right mechanism: either systemd if available or ConsoleKit
|
||||||
|
// as fallback.
|
||||||
|
|
||||||
|
if (haveSystemd())
|
||||||
|
return Shell.session_is_active_for_systemd();
|
||||||
|
|
||||||
|
return this.ckListener.sessionActive;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDriveConnected: function() {
|
_onDriveConnected: function() {
|
||||||
// if we're not in the current ConsoleKit session,
|
// if we're not in the current ConsoleKit session,
|
||||||
// or screensaver is active, don't play sounds
|
// or screensaver is active, don't play sounds
|
||||||
if (!this._session.SessionIsActive)
|
if (!this.isSessionActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
global.play_theme_sound(0, 'device-added-media',
|
if (Main.screenShield.locked)
|
||||||
_("External drive connected"),
|
return;
|
||||||
null);
|
|
||||||
|
global.play_theme_sound(0, 'device-added-media');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDriveDisconnected: function() {
|
_onDriveDisconnected: function() {
|
||||||
// if we're not in the current ConsoleKit session,
|
// if we're not in the current ConsoleKit session,
|
||||||
// or screensaver is active, don't play sounds
|
// or screensaver is active, don't play sounds
|
||||||
if (!this._session.SessionIsActive)
|
if (!this.isSessionActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
global.play_theme_sound(0, 'device-removed-media',
|
if (Main.screenShield.locked)
|
||||||
_("External drive disconnected"),
|
return;
|
||||||
null);
|
|
||||||
|
global.play_theme_sound(0, 'device-removed-media');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDriveEjectButton: function(monitor, drive) {
|
_onDriveEjectButton: function(monitor, drive) {
|
||||||
// TODO: this code path is not tested, as the GVfs volume monitor
|
// TODO: this code path is not tested, as the GVfs volume monitor
|
||||||
// doesn't emit this signal just yet.
|
// doesn't emit this signal just yet.
|
||||||
if (!this._session.SessionIsActive)
|
if (!this.isSessionActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// we force stop/eject in this case, so we don't have to pass a
|
// we force stop/eject in this case, so we don't have to pass a
|
||||||
@ -146,8 +224,15 @@ const AutomountManager = new Lang.Class({
|
|||||||
if (params.checkSession) {
|
if (params.checkSession) {
|
||||||
// if we're not in the current ConsoleKit session,
|
// if we're not in the current ConsoleKit session,
|
||||||
// don't attempt automount
|
// don't attempt automount
|
||||||
if (!this._session.SessionIsActive)
|
if (!this.isSessionActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (Main.screenShield.locked) {
|
||||||
|
if (this._volumeQueue.indexOf(volume) == -1)
|
||||||
|
this._volumeQueue.push(volume);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._inhibited)
|
if (this._inhibited)
|
||||||
@ -235,11 +320,9 @@ const AutomountManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_allowAutorunExpire: function(volume) {
|
_allowAutorunExpire: function(volume) {
|
||||||
let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, function() {
|
Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, function() {
|
||||||
volume.allowAutorun = false;
|
volume.allowAutorun = false;
|
||||||
return GLib.SOURCE_REMOVE;
|
return false;
|
||||||
});
|
});
|
||||||
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const Component = AutomountManager;
|
|
591
js/ui/autorunManager.js
Normal file
@ -0,0 +1,591 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const MessageTray = imports.ui.messageTray;
|
||||||
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
|
// GSettings keys
|
||||||
|
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
||||||
|
const SETTING_DISABLE_AUTORUN = 'autorun-never';
|
||||||
|
const SETTING_START_APP = 'autorun-x-content-start-app';
|
||||||
|
const SETTING_IGNORE = 'autorun-x-content-ignore';
|
||||||
|
const SETTING_OPEN_FOLDER = 'autorun-x-content-open-folder';
|
||||||
|
|
||||||
|
const AutorunSetting = {
|
||||||
|
RUN: 0,
|
||||||
|
IGNORE: 1,
|
||||||
|
FILES: 2,
|
||||||
|
ASK: 3
|
||||||
|
};
|
||||||
|
|
||||||
|
// misc utils
|
||||||
|
function shouldAutorunMount(mount, forTransient) {
|
||||||
|
let root = mount.get_root();
|
||||||
|
let volume = mount.get_volume();
|
||||||
|
|
||||||
|
if (!volume || (!volume.allowAutorun && forTransient))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!root.is_native() || isMountRootHidden(root))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isMountRootHidden(root) {
|
||||||
|
let path = root.get_path();
|
||||||
|
|
||||||
|
// skip any mounts in hidden directory hierarchies
|
||||||
|
return (path.indexOf('/.') != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function startAppForMount(app, mount) {
|
||||||
|
let files = [];
|
||||||
|
let root = mount.get_root();
|
||||||
|
let retval = false;
|
||||||
|
|
||||||
|
files.push(root);
|
||||||
|
|
||||||
|
try {
|
||||||
|
retval = app.launch(files,
|
||||||
|
global.create_app_launch_context())
|
||||||
|
} catch (e) {
|
||||||
|
log('Unable to launch the application ' + app.get_name()
|
||||||
|
+ ': ' + e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
|
||||||
|
const HotplugSnifferIface = <interface name="org.gnome.Shell.HotplugSniffer">
|
||||||
|
<method name="SniffURI">
|
||||||
|
<arg type="s" direction="in" />
|
||||||
|
<arg type="as" direction="out" />
|
||||||
|
</method>
|
||||||
|
</interface>;
|
||||||
|
|
||||||
|
const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface);
|
||||||
|
function HotplugSniffer() {
|
||||||
|
return new HotplugSnifferProxy(Gio.DBus.session,
|
||||||
|
'org.gnome.Shell.HotplugSniffer',
|
||||||
|
'/org/gnome/Shell/HotplugSniffer');
|
||||||
|
}
|
||||||
|
|
||||||
|
const ContentTypeDiscoverer = new Lang.Class({
|
||||||
|
Name: 'ContentTypeDiscoverer',
|
||||||
|
|
||||||
|
_init: function(callback) {
|
||||||
|
this._callback = callback;
|
||||||
|
},
|
||||||
|
|
||||||
|
guessContentTypes: function(mount) {
|
||||||
|
// guess mount's content types using GIO
|
||||||
|
mount.guess_content_type(false, null,
|
||||||
|
Lang.bind(this,
|
||||||
|
this._onContentTypeGuessed));
|
||||||
|
},
|
||||||
|
|
||||||
|
_onContentTypeGuessed: function(mount, res) {
|
||||||
|
let contentTypes = [];
|
||||||
|
|
||||||
|
try {
|
||||||
|
contentTypes = mount.guess_content_type_finish(res);
|
||||||
|
} catch (e) {
|
||||||
|
log('Unable to guess content types on added mount ' + mount.get_name()
|
||||||
|
+ ': ' + e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contentTypes.length) {
|
||||||
|
this._emitCallback(mount, contentTypes);
|
||||||
|
} else {
|
||||||
|
let root = mount.get_root();
|
||||||
|
|
||||||
|
let hotplugSniffer = new HotplugSniffer();
|
||||||
|
hotplugSniffer.SniffURIRemote(root.get_uri(),
|
||||||
|
Lang.bind(this, function([contentTypes]) {
|
||||||
|
this._emitCallback(mount, contentTypes);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_emitCallback: function(mount, contentTypes) {
|
||||||
|
if (!contentTypes)
|
||||||
|
contentTypes = [];
|
||||||
|
|
||||||
|
// we're not interested in win32 software content types here
|
||||||
|
contentTypes = contentTypes.filter(function(type) {
|
||||||
|
return (type != 'x-content/win32-software');
|
||||||
|
});
|
||||||
|
|
||||||
|
let apps = [];
|
||||||
|
contentTypes.forEach(function(type) {
|
||||||
|
let app = Gio.app_info_get_default_for_type(type, false);
|
||||||
|
|
||||||
|
if (app)
|
||||||
|
apps.push(app);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (apps.length == 0)
|
||||||
|
apps.push(Gio.app_info_get_default_for_type('inode/directory', false));
|
||||||
|
|
||||||
|
this._callback(mount, apps, contentTypes);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AutorunManager = new Lang.Class({
|
||||||
|
Name: 'AutorunManager',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._volumeMonitor = Gio.VolumeMonitor.get();
|
||||||
|
|
||||||
|
this._volumeMonitor.connect('mount-added',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._onMountAdded));
|
||||||
|
this._volumeMonitor.connect('mount-removed',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._onMountRemoved));
|
||||||
|
|
||||||
|
this._transDispatcher = new AutorunTransientDispatcher();
|
||||||
|
this._createResidentSource();
|
||||||
|
|
||||||
|
let mounts = this._volumeMonitor.get_mounts();
|
||||||
|
|
||||||
|
mounts.forEach(Lang.bind(this, function (mount) {
|
||||||
|
let discoverer = new ContentTypeDiscoverer(Lang.bind (this,
|
||||||
|
function (mount, apps) {
|
||||||
|
this._residentSource.addMount(mount, apps);
|
||||||
|
}));
|
||||||
|
|
||||||
|
discoverer.guessContentTypes(mount);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_createResidentSource: function() {
|
||||||
|
this._residentSource = new AutorunResidentSource();
|
||||||
|
this._residentSource.connect('destroy',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._createResidentSource));
|
||||||
|
},
|
||||||
|
|
||||||
|
_onMountAdded: function(monitor, mount) {
|
||||||
|
// don't do anything if our session is not the currently
|
||||||
|
// active one
|
||||||
|
if (!Main.automountManager.isSessionActive())
|
||||||
|
return;
|
||||||
|
|
||||||
|
let discoverer = new ContentTypeDiscoverer(Lang.bind (this,
|
||||||
|
function (mount, apps, contentTypes) {
|
||||||
|
this._transDispatcher.addMount(mount, apps, contentTypes);
|
||||||
|
this._residentSource.addMount(mount, apps);
|
||||||
|
}));
|
||||||
|
|
||||||
|
discoverer.guessContentTypes(mount);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onMountRemoved: function(monitor, mount) {
|
||||||
|
this._transDispatcher.removeMount(mount);
|
||||||
|
this._residentSource.removeMount(mount);
|
||||||
|
},
|
||||||
|
|
||||||
|
ejectMount: function(mount) {
|
||||||
|
let mountOp = new ShellMountOperation.ShellMountOperation(mount);
|
||||||
|
|
||||||
|
// first, see if we have a drive
|
||||||
|
let drive = mount.get_drive();
|
||||||
|
let volume = mount.get_volume();
|
||||||
|
|
||||||
|
if (drive &&
|
||||||
|
drive.get_start_stop_type() == Gio.DriveStartStopType.SHUTDOWN &&
|
||||||
|
drive.can_stop()) {
|
||||||
|
drive.stop(0, mountOp.mountOp, null,
|
||||||
|
Lang.bind(this, this._onStop));
|
||||||
|
} else {
|
||||||
|
if (mount.can_eject()) {
|
||||||
|
mount.eject_with_operation(0, mountOp.mountOp, null,
|
||||||
|
Lang.bind(this, this._onEject));
|
||||||
|
} else if (volume && volume.can_eject()) {
|
||||||
|
volume.eject_with_operation(0, mountOp.mountOp, null,
|
||||||
|
Lang.bind(this, this._onEject));
|
||||||
|
} else if (drive && drive.can_eject()) {
|
||||||
|
drive.eject_with_operation(0, mountOp.mountOp, null,
|
||||||
|
Lang.bind(this, this._onEject));
|
||||||
|
} else if (mount.can_unmount()) {
|
||||||
|
mount.unmount_with_operation(0, mountOp.mountOp, null,
|
||||||
|
Lang.bind(this, this._onUnmount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_onUnmount: function(mount, res) {
|
||||||
|
try {
|
||||||
|
mount.unmount_with_operation_finish(res);
|
||||||
|
} catch (e) {
|
||||||
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
||||||
|
log('Unable to eject the mount ' + mount.get_name()
|
||||||
|
+ ': ' + e.toString());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_onEject: function(source, res) {
|
||||||
|
try {
|
||||||
|
source.eject_with_operation_finish(res);
|
||||||
|
} catch (e) {
|
||||||
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
||||||
|
log('Unable to eject the drive ' + source.get_name()
|
||||||
|
+ ': ' + e.toString());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_onStop: function(drive, res) {
|
||||||
|
try {
|
||||||
|
drive.stop_finish(res);
|
||||||
|
} catch (e) {
|
||||||
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
||||||
|
log('Unable to stop the drive ' + drive.get_name()
|
||||||
|
+ ': ' + e.toString());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const AutorunResidentSource = new Lang.Class({
|
||||||
|
Name: 'AutorunResidentSource',
|
||||||
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent(_("Removable Devices"), 'media-removable', St.IconType.FULLCOLOR);
|
||||||
|
|
||||||
|
this._mounts = [];
|
||||||
|
|
||||||
|
this._notification = new AutorunResidentNotification(this);
|
||||||
|
},
|
||||||
|
|
||||||
|
addMount: function(mount, apps) {
|
||||||
|
if (!shouldAutorunMount(mount, false))
|
||||||
|
return;
|
||||||
|
|
||||||
|
let filtered = this._mounts.filter(function (element) {
|
||||||
|
return (element.mount == mount);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (filtered.length != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let element = { mount: mount, apps: apps };
|
||||||
|
this._mounts.push(element);
|
||||||
|
this._redisplay();
|
||||||
|
},
|
||||||
|
|
||||||
|
removeMount: function(mount) {
|
||||||
|
this._mounts =
|
||||||
|
this._mounts.filter(function (element) {
|
||||||
|
return (element.mount != mount);
|
||||||
|
});
|
||||||
|
|
||||||
|
this._redisplay();
|
||||||
|
},
|
||||||
|
|
||||||
|
_redisplay: function() {
|
||||||
|
if (this._mounts.length == 0) {
|
||||||
|
this._notification.destroy();
|
||||||
|
this.destroy();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._notification.updateForMounts(this._mounts);
|
||||||
|
|
||||||
|
// add ourselves as a source, and push the notification
|
||||||
|
if (!Main.messageTray.contains(this)) {
|
||||||
|
Main.messageTray.add(this);
|
||||||
|
this.pushNotification(this._notification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AutorunResidentNotification = new Lang.Class({
|
||||||
|
Name: 'AutorunResidentNotification',
|
||||||
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
|
_init: function(source) {
|
||||||
|
this.parent(source, source.title, null, { customContent: true });
|
||||||
|
|
||||||
|
// set the notification as resident
|
||||||
|
this.setResident(true);
|
||||||
|
|
||||||
|
this._layout = new St.BoxLayout ({ style_class: 'hotplug-resident-box',
|
||||||
|
vertical: true });
|
||||||
|
|
||||||
|
this.addActor(this._layout,
|
||||||
|
{ x_expand: true,
|
||||||
|
x_fill: true });
|
||||||
|
},
|
||||||
|
|
||||||
|
updateForMounts: function(mounts) {
|
||||||
|
// remove all the layout content
|
||||||
|
this._layout.destroy_all_children();
|
||||||
|
|
||||||
|
for (let idx = 0; idx < mounts.length; idx++) {
|
||||||
|
let element = mounts[idx];
|
||||||
|
|
||||||
|
let actor = this._itemForMount(element.mount, element.apps);
|
||||||
|
this._layout.add(actor, { x_fill: true,
|
||||||
|
expand: true });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_itemForMount: function(mount, apps) {
|
||||||
|
let item = new St.BoxLayout();
|
||||||
|
|
||||||
|
// prepare the mount button content
|
||||||
|
let mountLayout = new St.BoxLayout();
|
||||||
|
|
||||||
|
let mountIcon = new St.Icon({ gicon: mount.get_icon(),
|
||||||
|
style_class: 'hotplug-resident-mount-icon' });
|
||||||
|
mountLayout.add_actor(mountIcon);
|
||||||
|
|
||||||
|
let labelBin = new St.Bin({ y_align: St.Align.MIDDLE });
|
||||||
|
let mountLabel =
|
||||||
|
new St.Label({ text: mount.get_name(),
|
||||||
|
style_class: 'hotplug-resident-mount-label',
|
||||||
|
track_hover: true,
|
||||||
|
reactive: true });
|
||||||
|
labelBin.add_actor(mountLabel);
|
||||||
|
mountLayout.add_actor(labelBin);
|
||||||
|
|
||||||
|
let mountButton = new St.Button({ child: mountLayout,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
x_fill: true,
|
||||||
|
style_class: 'hotplug-resident-mount',
|
||||||
|
button_mask: St.ButtonMask.ONE });
|
||||||
|
item.add(mountButton, { x_align: St.Align.START,
|
||||||
|
expand: true });
|
||||||
|
|
||||||
|
let ejectIcon =
|
||||||
|
new St.Icon({ icon_name: 'media-eject',
|
||||||
|
style_class: 'hotplug-resident-eject-icon' });
|
||||||
|
|
||||||
|
let ejectButton =
|
||||||
|
new St.Button({ style_class: 'hotplug-resident-eject-button',
|
||||||
|
button_mask: St.ButtonMask.ONE,
|
||||||
|
child: ejectIcon });
|
||||||
|
item.add(ejectButton, { x_align: St.Align.END });
|
||||||
|
|
||||||
|
// now connect signals
|
||||||
|
mountButton.connect('clicked', Lang.bind(this, function(actor, event) {
|
||||||
|
startAppForMount(apps[0], mount);
|
||||||
|
}));
|
||||||
|
|
||||||
|
ejectButton.connect('clicked', Lang.bind(this, function() {
|
||||||
|
Main.autorunManager.ejectMount(mount);
|
||||||
|
}));
|
||||||
|
|
||||||
|
return item;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const AutorunTransientDispatcher = new Lang.Class({
|
||||||
|
Name: 'AutorunTransientDispatcher',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._sources = [];
|
||||||
|
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||||
|
},
|
||||||
|
|
||||||
|
_getAutorunSettingForType: function(contentType) {
|
||||||
|
let runApp = this._settings.get_strv(SETTING_START_APP);
|
||||||
|
if (runApp.indexOf(contentType) != -1)
|
||||||
|
return AutorunSetting.RUN;
|
||||||
|
|
||||||
|
let ignore = this._settings.get_strv(SETTING_IGNORE);
|
||||||
|
if (ignore.indexOf(contentType) != -1)
|
||||||
|
return AutorunSetting.IGNORE;
|
||||||
|
|
||||||
|
let openFiles = this._settings.get_strv(SETTING_OPEN_FOLDER);
|
||||||
|
if (openFiles.indexOf(contentType) != -1)
|
||||||
|
return AutorunSetting.FILES;
|
||||||
|
|
||||||
|
return AutorunSetting.ASK;
|
||||||
|
},
|
||||||
|
|
||||||
|
_getSourceForMount: function(mount) {
|
||||||
|
let filtered =
|
||||||
|
this._sources.filter(function (source) {
|
||||||
|
return (source.mount == mount);
|
||||||
|
});
|
||||||
|
|
||||||
|
// we always make sure not to add two sources for the same
|
||||||
|
// mount in addMount(), so it's safe to assume filtered.length
|
||||||
|
// is always either 1 or 0.
|
||||||
|
if (filtered.length == 1)
|
||||||
|
return filtered[0];
|
||||||
|
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
_addSource: function(mount, apps) {
|
||||||
|
// if we already have a source showing for this
|
||||||
|
// mount, return
|
||||||
|
if (this._getSourceForMount(mount))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// add a new source
|
||||||
|
this._sources.push(new AutorunTransientSource(mount, apps));
|
||||||
|
},
|
||||||
|
|
||||||
|
addMount: function(mount, apps, contentTypes) {
|
||||||
|
// if autorun is disabled globally, return
|
||||||
|
if (this._settings.get_boolean(SETTING_DISABLE_AUTORUN))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// if the mount doesn't want to be autorun, return
|
||||||
|
if (!shouldAutorunMount(mount, true))
|
||||||
|
return;
|
||||||
|
|
||||||
|
let setting = this._getAutorunSettingForType(contentTypes[0]);
|
||||||
|
|
||||||
|
// check at the settings for the first content type
|
||||||
|
// to see whether we should ask
|
||||||
|
if (setting == AutorunSetting.IGNORE)
|
||||||
|
return; // return right away
|
||||||
|
|
||||||
|
let success = false;
|
||||||
|
let app = null;
|
||||||
|
|
||||||
|
if (setting == AutorunSetting.RUN) {
|
||||||
|
app = Gio.app_info_get_default_for_type(contentTypes[0], false);
|
||||||
|
} else if (setting == AutorunSetting.FILES) {
|
||||||
|
app = Gio.app_info_get_default_for_type('inode/directory', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (app)
|
||||||
|
success = startAppForMount(app, mount);
|
||||||
|
|
||||||
|
// we fallback here also in case the settings did not specify 'ask',
|
||||||
|
// but we failed launching the default app or the default file manager
|
||||||
|
if (!success)
|
||||||
|
this._addSource(mount, apps);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeMount: function(mount) {
|
||||||
|
let source = this._getSourceForMount(mount);
|
||||||
|
|
||||||
|
// if we aren't tracking this mount, don't do anything
|
||||||
|
if (!source)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// destroy the notification source
|
||||||
|
source.destroy();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AutorunTransientSource = new Lang.Class({
|
||||||
|
Name: 'AutorunTransientSource',
|
||||||
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
|
_init: function(mount, apps) {
|
||||||
|
this.mount = mount;
|
||||||
|
this.apps = apps;
|
||||||
|
|
||||||
|
this.parent(mount.get_name());
|
||||||
|
|
||||||
|
this._notification = new AutorunTransientNotification(this);
|
||||||
|
|
||||||
|
// add ourselves as a source, and popup the notification
|
||||||
|
Main.messageTray.add(this);
|
||||||
|
this.notify(this._notification);
|
||||||
|
},
|
||||||
|
|
||||||
|
createIcon: function(size) {
|
||||||
|
return new St.Icon({ gicon: this.mount.get_icon(),
|
||||||
|
icon_size: size });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AutorunTransientNotification = new Lang.Class({
|
||||||
|
Name: 'AutorunTransientNotification',
|
||||||
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
|
_init: function(source) {
|
||||||
|
this.parent(source, source.title, null, { customContent: true });
|
||||||
|
|
||||||
|
this._box = new St.BoxLayout({ style_class: 'hotplug-transient-box',
|
||||||
|
vertical: true });
|
||||||
|
this.addActor(this._box);
|
||||||
|
|
||||||
|
this._mount = source.mount;
|
||||||
|
|
||||||
|
source.apps.forEach(Lang.bind(this, function (app) {
|
||||||
|
let actor = this._buttonForApp(app);
|
||||||
|
|
||||||
|
if (actor)
|
||||||
|
this._box.add(actor, { x_fill: true,
|
||||||
|
x_align: St.Align.START });
|
||||||
|
}));
|
||||||
|
|
||||||
|
this._box.add(this._buttonForEject(), { x_fill: true,
|
||||||
|
x_align: St.Align.START });
|
||||||
|
|
||||||
|
// set the notification to transient and urgent, so that it
|
||||||
|
// expands out
|
||||||
|
this.setTransient(true);
|
||||||
|
this.setUrgency(MessageTray.Urgency.CRITICAL);
|
||||||
|
},
|
||||||
|
|
||||||
|
_buttonForApp: function(app) {
|
||||||
|
let box = new St.BoxLayout();
|
||||||
|
let icon = new St.Icon({ gicon: app.get_icon(),
|
||||||
|
style_class: 'hotplug-notification-item-icon' });
|
||||||
|
box.add(icon);
|
||||||
|
|
||||||
|
let label = new St.Bin({ y_align: St.Align.MIDDLE,
|
||||||
|
child: new St.Label
|
||||||
|
({ text: _("Open with %s").format(app.get_name()) })
|
||||||
|
});
|
||||||
|
box.add(label);
|
||||||
|
|
||||||
|
let button = new St.Button({ child: box,
|
||||||
|
x_fill: true,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
button_mask: St.ButtonMask.ONE,
|
||||||
|
style_class: 'hotplug-notification-item' });
|
||||||
|
|
||||||
|
button.connect('clicked', Lang.bind(this, function() {
|
||||||
|
startAppForMount(app, this._mount);
|
||||||
|
this.destroy();
|
||||||
|
}));
|
||||||
|
|
||||||
|
return button;
|
||||||
|
},
|
||||||
|
|
||||||
|
_buttonForEject: function() {
|
||||||
|
let box = new St.BoxLayout();
|
||||||
|
let icon = new St.Icon({ icon_name: 'media-eject',
|
||||||
|
style_class: 'hotplug-notification-item-icon' });
|
||||||
|
box.add(icon);
|
||||||
|
|
||||||
|
let label = new St.Bin({ y_align: St.Align.MIDDLE,
|
||||||
|
child: new St.Label
|
||||||
|
({ text: _("Eject") })
|
||||||
|
});
|
||||||
|
box.add(label);
|
||||||
|
|
||||||
|
let button = new St.Button({ child: box,
|
||||||
|
x_fill: true,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
button_mask: St.ButtonMask.ONE,
|
||||||
|
style_class: 'hotplug-notification-item' });
|
||||||
|
|
||||||
|
button.connect('clicked', Lang.bind(this, function() {
|
||||||
|
Main.autorunManager.ejectMount(this._mount);
|
||||||
|
}));
|
||||||
|
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|