moved unite&dash2dock to packages
|
@ -9,6 +9,8 @@ kvantum-theme-vimix-git
|
|||
imageburner
|
||||
timeshift-autosnap
|
||||
dat-fox-helper-git
|
||||
gnome-shell-extension-unite
|
||||
gnome-shell-extension-dash-to-dock
|
||||
|
||||
|
||||
#TROM
|
||||
|
|
|
@ -1,341 +0,0 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
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 promoting the sharing and reuse of software generally.
|
||||
|
||||
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
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
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
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
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
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 of the License, 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
|
||||
|
||||
|
||||
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
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# Dash to Dock
|
||||
![screenshot](https://github.com/micheleg/dash-to-dock/raw/master/media/screenshot.jpg)
|
||||
|
||||
## A dock for the GNOME Shell
|
||||
This extension enhances the dash moving it out of the overview and transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops without having to leave the desktop view.
|
||||
|
||||
[<img src="https://micheleg.github.io/dash-to-dock/media/get-it-on-ego.png" height="100">](https://extensions.gnome.org/extension/307/dash-to-dock)
|
||||
|
||||
For additional installation instructions and more information visit [https://micheleg.github.io/dash-to-dock/](https://micheleg.github.io/dash-to-dock/).
|
||||
|
||||
## Installation from source
|
||||
|
||||
The extension can be installed directly from source, either for the convenience of using git or to test the latest development version. Clone the desired branch with git
|
||||
|
||||
<pre>git clone https://github.com/micheleg/dash-to-dock.git</pre>
|
||||
or download the branch from github. A simple Makefile is included. Then run
|
||||
<pre>make
|
||||
make install
|
||||
</pre>
|
||||
to install the extension in your home directory. A Shell reload is required <code>Alt+F2 r Enter</code> and the extension has to be enabled with *gnome-tweak-tool* or with *dconf*.
|
||||
|
||||
## Bug Reporting
|
||||
|
||||
Bugs should be reported to the Github bug tracker [https://github.com/micheleg/dash-to-dock/issues](https://github.com/micheleg/dash-to-dock/issues).
|
||||
|
||||
## License
|
||||
Dash to Dock Gnome Shell extension is distributed under the terms of the GNU General Public License,
|
||||
version 2 or later. See the COPYING file for details.
|
|
@ -1,21 +0,0 @@
|
|||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Docking = Me.imports.docking;
|
||||
|
||||
// We declare this with var so it can be accessed by other extensions in
|
||||
// GNOME Shell 3.26+ (mozjs52+).
|
||||
var dockManager;
|
||||
|
||||
function init() {
|
||||
ExtensionUtils.initTranslations('dashtodock');
|
||||
}
|
||||
|
||||
function enable() {
|
||||
new Docking.DockManager();
|
||||
}
|
||||
|
||||
function disable() {
|
||||
dockManager.destroy();
|
||||
}
|
|
@ -1,217 +0,0 @@
|
|||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const Utils = Me.imports.utils;
|
||||
|
||||
const FileManager1Iface = '<node><interface name="org.freedesktop.FileManager1">\
|
||||
<property name="XUbuntuOpenLocationsXids" type="a{uas}" access="read"/>\
|
||||
<property name="OpenWindowsWithLocations" type="a{sas}" access="read"/>\
|
||||
</interface></node>';
|
||||
|
||||
const FileManager1Proxy = Gio.DBusProxy.makeProxyWrapper(FileManager1Iface);
|
||||
|
||||
/**
|
||||
* This class implements a client for the org.freedesktop.FileManager1 dbus
|
||||
* interface, and specifically for the OpenWindowsWithLocations property
|
||||
* which is published by Nautilus, but is not an official part of the interface.
|
||||
*
|
||||
* The property is a map from window identifiers to a list of locations open in
|
||||
* the window.
|
||||
*
|
||||
* While OpeWindowsWithLocations is part of upstream Nautilus, for many years
|
||||
* prior, Ubuntu patched Nautilus to publish XUbuntuOpenLocationsXids, which is
|
||||
* similar but uses Xids as the window identifiers instead of gtk window paths.
|
||||
*
|
||||
* When an old or unpatched Nautilus is running, we will observe the properties
|
||||
* to always be empty arrays, but there will not be any correctness issues.
|
||||
*/
|
||||
var FileManager1Client = class DashToDock_FileManager1Client {
|
||||
|
||||
constructor() {
|
||||
this._signalsHandler = new Utils.GlobalSignalsHandler();
|
||||
|
||||
this._locationMap = new Map();
|
||||
this._proxy = new FileManager1Proxy(Gio.DBus.session,
|
||||
"org.freedesktop.FileManager1",
|
||||
"/org/freedesktop/FileManager1",
|
||||
(initable, error) => {
|
||||
// Use async construction to avoid blocking on errors.
|
||||
if (error) {
|
||||
global.log(error);
|
||||
} else {
|
||||
this._updateLocationMap();
|
||||
}
|
||||
});
|
||||
|
||||
this._signalsHandler.add([
|
||||
this._proxy,
|
||||
'g-properties-changed',
|
||||
this._onPropertyChanged.bind(this)
|
||||
], [
|
||||
// We must additionally listen for Screen events to know when to
|
||||
// rebuild our location map when the set of available windows changes.
|
||||
global.workspace_manager,
|
||||
'workspace-switched',
|
||||
this._updateLocationMap.bind(this)
|
||||
], [
|
||||
global.display,
|
||||
'window-entered-monitor',
|
||||
this._updateLocationMap.bind(this)
|
||||
], [
|
||||
global.display,
|
||||
'window-left-monitor',
|
||||
this._updateLocationMap.bind(this)
|
||||
]);
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._signalsHandler.destroy();
|
||||
this._proxy.run_dispose();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of windows that are showing a location or
|
||||
* sub-directories of that location.
|
||||
*/
|
||||
getWindows(location) {
|
||||
let ret = new Set();
|
||||
for (let [k,v] of this._locationMap) {
|
||||
if (k.startsWith(location)) {
|
||||
for (let l of v) {
|
||||
ret.add(l);
|
||||
}
|
||||
}
|
||||
}
|
||||
return Array.from(ret);
|
||||
}
|
||||
|
||||
_onPropertyChanged(proxy, changed, invalidated) {
|
||||
let property = changed.unpack();
|
||||
if (property &&
|
||||
('XUbuntuOpenLocationsXids' in property ||
|
||||
'OpenWindowsWithLocations' in property)) {
|
||||
this._updateLocationMap();
|
||||
}
|
||||
}
|
||||
|
||||
_updateLocationMap() {
|
||||
let properties = this._proxy.get_cached_property_names();
|
||||
if (properties == null) {
|
||||
// Nothing to check yet.
|
||||
return;
|
||||
}
|
||||
|
||||
if (properties.includes('OpenWindowsWithLocations')) {
|
||||
this._updateFromPaths();
|
||||
} else if (properties.includes('XUbuntuOpenLocationsXids')) {
|
||||
this._updateFromXids();
|
||||
}
|
||||
}
|
||||
|
||||
_updateFromPaths() {
|
||||
let pathToLocations = this._proxy.OpenWindowsWithLocations;
|
||||
let pathToWindow = getPathToWindow();
|
||||
|
||||
let locationToWindow = new Map();
|
||||
for (let path in pathToLocations) {
|
||||
let locations = pathToLocations[path];
|
||||
for (let i = 0; i < locations.length; i++) {
|
||||
let l = locations[i];
|
||||
// Use a set to deduplicate when a window has a
|
||||
// location open in multiple tabs.
|
||||
if (!locationToWindow.has(l)) {
|
||||
locationToWindow.set(l, new Set());
|
||||
}
|
||||
let window = pathToWindow.get(path);
|
||||
if (window != null) {
|
||||
locationToWindow.get(l).add(window);
|
||||
}
|
||||
}
|
||||
}
|
||||
this._locationMap = locationToWindow;
|
||||
this.emit('windows-changed');
|
||||
}
|
||||
|
||||
_updateFromXids() {
|
||||
let xidToLocations = this._proxy.XUbuntuOpenLocationsXids;
|
||||
let xidToWindow = getXidToWindow();
|
||||
|
||||
let locationToWindow = new Map();
|
||||
for (let xid in xidToLocations) {
|
||||
let locations = xidToLocations[xid];
|
||||
for (let i = 0; i < locations.length; i++) {
|
||||
let l = locations[i];
|
||||
// Use a set to deduplicate when a window has a
|
||||
// location open in multiple tabs.
|
||||
if (!locationToWindow.has(l)) {
|
||||
locationToWindow.set(l, new Set());
|
||||
}
|
||||
let window = xidToWindow.get(parseInt(xid));
|
||||
if (window != null) {
|
||||
locationToWindow.get(l).add(window);
|
||||
}
|
||||
}
|
||||
}
|
||||
this._locationMap = locationToWindow;
|
||||
this.emit('windows-changed');
|
||||
}
|
||||
}
|
||||
Signals.addSignalMethods(FileManager1Client.prototype);
|
||||
|
||||
/**
|
||||
* Construct a map of gtk application window object paths to MetaWindows.
|
||||
*/
|
||||
function getPathToWindow() {
|
||||
let pathToWindow = new Map();
|
||||
|
||||
for (let i = 0; i < global.workspace_manager.n_workspaces; i++) {
|
||||
let ws = global.workspace_manager.get_workspace_by_index(i);
|
||||
ws.list_windows().map(function(w) {
|
||||
let path = w.get_gtk_window_object_path();
|
||||
if (path != null) {
|
||||
pathToWindow.set(path, w);
|
||||
}
|
||||
});
|
||||
}
|
||||
return pathToWindow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a map of XIDs to MetaWindows.
|
||||
*
|
||||
* This is somewhat annoying as you cannot lookup a window by
|
||||
* XID in any way, and must iterate through all of them looking
|
||||
* for a match.
|
||||
*/
|
||||
function getXidToWindow() {
|
||||
let xidToWindow = new Map();
|
||||
|
||||
for (let i = 0; i < global.workspace_manager.n_workspaces; i++) {
|
||||
let ws = global.workspace_manager.get_workspace_by_index(i);
|
||||
ws.list_windows().map(function(w) {
|
||||
let xid = guessWindowXID(w);
|
||||
if (xid != null) {
|
||||
xidToWindow.set(parseInt(xid), w);
|
||||
}
|
||||
});
|
||||
}
|
||||
return xidToWindow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Guesses the X ID of a window.
|
||||
*
|
||||
* This is the basic implementation that is sufficient for Nautilus
|
||||
* windows. The pixel-saver extension has a much more complex
|
||||
* implementation if we ever need it.
|
||||
*/
|
||||
function guessWindowXID(win) {
|
||||
try {
|
||||
return win.get_description().match(/0x[0-9a-f]+/)[0];
|
||||
} catch (err) {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,321 +0,0 @@
|
|||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const GLib = imports.gi.GLib;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const Docking = Me.imports.docking;
|
||||
const Utils = Me.imports.utils;
|
||||
|
||||
// A good compromise between reactivity and efficiency; to be tuned.
|
||||
const INTELLIHIDE_CHECK_INTERVAL = 100;
|
||||
|
||||
const OverlapStatus = {
|
||||
UNDEFINED: -1,
|
||||
FALSE: 0,
|
||||
TRUE: 1
|
||||
};
|
||||
|
||||
const IntellihideMode = {
|
||||
ALL_WINDOWS: 0,
|
||||
FOCUS_APPLICATION_WINDOWS: 1,
|
||||
MAXIMIZED_WINDOWS : 2
|
||||
};
|
||||
|
||||
// List of windows type taken into account. Order is important (keep the original
|
||||
// enum order).
|
||||
const handledWindowTypes = [
|
||||
Meta.WindowType.NORMAL,
|
||||
Meta.WindowType.DOCK,
|
||||
Meta.WindowType.DIALOG,
|
||||
Meta.WindowType.MODAL_DIALOG,
|
||||
Meta.WindowType.TOOLBAR,
|
||||
Meta.WindowType.MENU,
|
||||
Meta.WindowType.UTILITY,
|
||||
Meta.WindowType.SPLASHSCREEN
|
||||
];
|
||||
|
||||
/**
|
||||
* A rough and ugly implementation of the intellihide behaviour.
|
||||
* Intallihide object: emit 'status-changed' signal when the overlap of windows
|
||||
* with the provided targetBoxClutter.ActorBox changes;
|
||||
*/
|
||||
var Intellihide = class DashToDock_Intellihide {
|
||||
|
||||
constructor(monitorIndex) {
|
||||
// Load settings
|
||||
this._monitorIndex = monitorIndex;
|
||||
|
||||
this._signalsHandler = new Utils.GlobalSignalsHandler();
|
||||
this._tracker = Shell.WindowTracker.get_default();
|
||||
this._focusApp = null; // The application whose window is focused.
|
||||
this._topApp = null; // The application whose window is on top on the monitor with the dock.
|
||||
|
||||
this._isEnabled = false;
|
||||
this.status = OverlapStatus.UNDEFINED;
|
||||
this._targetBox = null;
|
||||
|
||||
this._checkOverlapTimeoutContinue = false;
|
||||
this._checkOverlapTimeoutId = 0;
|
||||
|
||||
this._trackedWindows = new Map();
|
||||
|
||||
// Connect global signals
|
||||
this._signalsHandler.add([
|
||||
// Add signals on windows created from now on
|
||||
global.display,
|
||||
'window-created',
|
||||
this._windowCreated.bind(this)
|
||||
], [
|
||||
// triggered for instance when the window list order changes,
|
||||
// included when the workspace is switched
|
||||
global.display,
|
||||
'restacked',
|
||||
this._checkOverlap.bind(this)
|
||||
], [
|
||||
// when windows are alwasy on top, the focus window can change
|
||||
// without the windows being restacked. Thus monitor window focus change.
|
||||
this._tracker,
|
||||
'notify::focus-app',
|
||||
this._checkOverlap.bind(this)
|
||||
], [
|
||||
// update wne monitor changes, for instance in multimonitor when monitor are attached
|
||||
Meta.MonitorManager.get(),
|
||||
'monitors-changed',
|
||||
this._checkOverlap.bind(this)
|
||||
]);
|
||||
}
|
||||
|
||||
destroy() {
|
||||
// Disconnect global signals
|
||||
this._signalsHandler.destroy();
|
||||
|
||||
// Remove residual windows signals
|
||||
this.disable();
|
||||
}
|
||||
|
||||
enable() {
|
||||
this._isEnabled = true;
|
||||
this._status = OverlapStatus.UNDEFINED;
|
||||
global.get_window_actors().forEach(function(wa) {
|
||||
this._addWindowSignals(wa);
|
||||
}, this);
|
||||
this._doCheckOverlap();
|
||||
}
|
||||
|
||||
disable() {
|
||||
this._isEnabled = false;
|
||||
|
||||
for (let wa of this._trackedWindows.keys()) {
|
||||
this._removeWindowSignals(wa);
|
||||
}
|
||||
this._trackedWindows.clear();
|
||||
|
||||
if (this._checkOverlapTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._checkOverlapTimeoutId);
|
||||
this._checkOverlapTimeoutId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
_windowCreated(display, metaWindow) {
|
||||
this._addWindowSignals(metaWindow.get_compositor_private());
|
||||
}
|
||||
|
||||
_addWindowSignals(wa) {
|
||||
if (!this._handledWindow(wa))
|
||||
return;
|
||||
let signalId = wa.connect('allocation-changed', this._checkOverlap.bind(this));
|
||||
this._trackedWindows.set(wa, signalId);
|
||||
wa.connect('destroy', this._removeWindowSignals.bind(this));
|
||||
}
|
||||
|
||||
_removeWindowSignals(wa) {
|
||||
if (this._trackedWindows.get(wa)) {
|
||||
wa.disconnect(this._trackedWindows.get(wa));
|
||||
this._trackedWindows.delete(wa);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
updateTargetBox(box) {
|
||||
this._targetBox = box;
|
||||
this._checkOverlap();
|
||||
}
|
||||
|
||||
forceUpdate() {
|
||||
this._status = OverlapStatus.UNDEFINED;
|
||||
this._doCheckOverlap();
|
||||
}
|
||||
|
||||
getOverlapStatus() {
|
||||
return (this._status == OverlapStatus.TRUE);
|
||||
}
|
||||
|
||||
_checkOverlap() {
|
||||
if (!this._isEnabled || (this._targetBox == null))
|
||||
return;
|
||||
|
||||
/* Limit the number of calls to the doCheckOverlap function */
|
||||
if (this._checkOverlapTimeoutId) {
|
||||
this._checkOverlapTimeoutContinue = true;
|
||||
return
|
||||
}
|
||||
|
||||
this._doCheckOverlap();
|
||||
|
||||
this._checkOverlapTimeoutId = Mainloop.timeout_add(INTELLIHIDE_CHECK_INTERVAL, () => {
|
||||
this._doCheckOverlap();
|
||||
if (this._checkOverlapTimeoutContinue) {
|
||||
this._checkOverlapTimeoutContinue = false;
|
||||
return GLib.SOURCE_CONTINUE;
|
||||
} else {
|
||||
this._checkOverlapTimeoutId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_doCheckOverlap() {
|
||||
|
||||
if (!this._isEnabled || (this._targetBox == null))
|
||||
return;
|
||||
|
||||
let overlaps = OverlapStatus.FALSE;
|
||||
let windows = global.get_window_actors();
|
||||
|
||||
if (windows.length > 0) {
|
||||
/*
|
||||
* Get the top window on the monitor where the dock is placed.
|
||||
* The idea is that we dont want to overlap with the windows of the topmost application,
|
||||
* event is it's not the focused app -- for instance because in multimonitor the user
|
||||
* select a window in the secondary monitor.
|
||||
*/
|
||||
|
||||
let topWindow = null;
|
||||
for (let i = windows.length - 1; i >= 0; i--) {
|
||||
let meta_win = windows[i].get_meta_window();
|
||||
if (this._handledWindow(windows[i]) && (meta_win.get_monitor() == this._monitorIndex)) {
|
||||
topWindow = meta_win;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (topWindow !== null) {
|
||||
this._topApp = this._tracker.get_window_app(topWindow);
|
||||
// If there isn't a focused app, use that of the window on top
|
||||
this._focusApp = this._tracker.focus_app || this._topApp
|
||||
|
||||
windows = windows.filter(this._intellihideFilterInteresting, this);
|
||||
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let win = windows[i].get_meta_window();
|
||||
|
||||
if (win) {
|
||||
let rect = win.get_frame_rect();
|
||||
|
||||
let test = (rect.x < this._targetBox.x2) &&
|
||||
(rect.x + rect.width > this._targetBox.x1) &&
|
||||
(rect.y < this._targetBox.y2) &&
|
||||
(rect.y + rect.height > this._targetBox.y1);
|
||||
|
||||
if (test) {
|
||||
overlaps = OverlapStatus.TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this._status !== overlaps) {
|
||||
this._status = overlaps;
|
||||
this.emit('status-changed', this._status);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Filter interesting windows to be considered for intellihide.
|
||||
// Consider all windows visible on the current workspace.
|
||||
// Optionally skip windows of other applications
|
||||
_intellihideFilterInteresting(wa) {
|
||||
let meta_win = wa.get_meta_window();
|
||||
if (!this._handledWindow(wa))
|
||||
return false;
|
||||
|
||||
let currentWorkspace = global.workspace_manager.get_active_workspace_index();
|
||||
let wksp = meta_win.get_workspace();
|
||||
let wksp_index = wksp.index();
|
||||
|
||||
// Depending on the intellihide mode, exclude non-relevent windows
|
||||
switch (Docking.DockManager.settings.get_enum('intellihide-mode')) {
|
||||
case IntellihideMode.ALL_WINDOWS:
|
||||
// Do nothing
|
||||
break;
|
||||
|
||||
case IntellihideMode.FOCUS_APPLICATION_WINDOWS:
|
||||
// Skip windows of other apps
|
||||
if (this._focusApp) {
|
||||
// The DropDownTerminal extension is not an application per se
|
||||
// so we match its window by wm class instead
|
||||
if (meta_win.get_wm_class() == 'DropDownTerminalWindow')
|
||||
return true;
|
||||
|
||||
let currentApp = this._tracker.get_window_app(meta_win);
|
||||
let focusWindow = global.display.get_focus_window()
|
||||
|
||||
// Consider half maximized windows side by side
|
||||
// and windows which are alwayson top
|
||||
if((currentApp != this._focusApp) && (currentApp != this._topApp)
|
||||
&& !((focusWindow && focusWindow.maximized_vertically && !focusWindow.maximized_horizontally)
|
||||
&& (meta_win.maximized_vertically && !meta_win.maximized_horizontally)
|
||||
&& meta_win.get_monitor() == focusWindow.get_monitor())
|
||||
&& !meta_win.is_above())
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case IntellihideMode.MAXIMIZED_WINDOWS:
|
||||
// Skip unmaximized windows
|
||||
if (!meta_win.maximized_vertically && !meta_win.maximized_horizontally)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( wksp_index == currentWorkspace && meta_win.showing_on_its_workspace() )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
// Filter windows by type
|
||||
// inspired by Opacify@gnome-shell.localdomain.pl
|
||||
_handledWindow(wa) {
|
||||
let metaWindow = wa.get_meta_window();
|
||||
|
||||
if (!metaWindow)
|
||||
return false;
|
||||
|
||||
// The DropDownTerminal extension uses the POPUP_MENU window type hint
|
||||
// so we match its window by wm class instead
|
||||
if (metaWindow.get_wm_class() == 'DropDownTerminalWindow')
|
||||
return true;
|
||||
|
||||
let wtype = metaWindow.get_window_type();
|
||||
for (let i = 0; i < handledWindowTypes.length; i++) {
|
||||
var hwtype = handledWindowTypes[i];
|
||||
if (hwtype == wtype)
|
||||
return true;
|
||||
else if (hwtype > wtype)
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(Intellihide.prototype);
|
|
@ -1,239 +0,0 @@
|
|||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const Signals = imports.signals;
|
||||
|
||||
var LauncherEntryRemoteModel = class DashToDock_LauncherEntryRemoteModel {
|
||||
|
||||
constructor() {
|
||||
this._entriesByDBusName = {};
|
||||
|
||||
this._launcher_entry_dbus_signal_id =
|
||||
Gio.DBus.session.signal_subscribe(null, // sender
|
||||
'com.canonical.Unity.LauncherEntry', // iface
|
||||
null, // member
|
||||
null, // path
|
||||
null, // arg0
|
||||
Gio.DBusSignalFlags.NONE,
|
||||
this._onEntrySignalReceived.bind(this));
|
||||
|
||||
this._dbus_name_owner_changed_signal_id =
|
||||
Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender
|
||||
'org.freedesktop.DBus', // interface
|
||||
'NameOwnerChanged', // member
|
||||
'/org/freedesktop/DBus', // path
|
||||
null, // arg0
|
||||
Gio.DBusSignalFlags.NONE,
|
||||
this._onDBusNameOwnerChanged.bind(this));
|
||||
|
||||
this._acquireUnityDBus();
|
||||
}
|
||||
|
||||
destroy() {
|
||||
if (this._launcher_entry_dbus_signal_id) {
|
||||
Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id);
|
||||
}
|
||||
|
||||
if (this._dbus_name_owner_changed_signal_id) {
|
||||
Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id);
|
||||
}
|
||||
|
||||
this._releaseUnityDBus();
|
||||
}
|
||||
|
||||
size() {
|
||||
return Object.keys(this._entriesByDBusName).length;
|
||||
}
|
||||
|
||||
lookupByDBusName(dbusName) {
|
||||
return this._entriesByDBusName.hasOwnProperty(dbusName) ? this._entriesByDBusName[dbusName] : null;
|
||||
}
|
||||
|
||||
lookupById(appId) {
|
||||
let ret = [];
|
||||
for (let dbusName in this._entriesByDBusName) {
|
||||
let entry = this._entriesByDBusName[dbusName];
|
||||
if (entry && entry.appId() == appId) {
|
||||
ret.push(entry);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
addEntry(entry) {
|
||||
let existingEntry = this.lookupByDBusName(entry.dbusName());
|
||||
if (existingEntry) {
|
||||
existingEntry.update(entry);
|
||||
} else {
|
||||
this._entriesByDBusName[entry.dbusName()] = entry;
|
||||
this.emit('entry-added', entry);
|
||||
}
|
||||
}
|
||||
|
||||
removeEntry(entry) {
|
||||
delete this._entriesByDBusName[entry.dbusName()]
|
||||
this.emit('entry-removed', entry);
|
||||
}
|
||||
|
||||
_acquireUnityDBus() {
|
||||
if (!this._unity_bus_id) {
|
||||
Gio.DBus.session.own_name('com.canonical.Unity',
|
||||
Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
_releaseUnityDBus() {
|
||||
if (this._unity_bus_id) {
|
||||
Gio.DBus.session.unown_name(this._unity_bus_id);
|
||||
this._unity_bus_id = 0;
|
||||
}
|
||||
}
|
||||
|
||||
_onEntrySignalReceived(connection, sender_name, object_path,
|
||||
interface_name, signal_name, parameters, user_data) {
|
||||
if (!parameters || !signal_name)
|
||||
return;
|
||||
|
||||
if (signal_name == 'Update') {
|
||||
if (!sender_name) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._handleUpdateRequest(sender_name, parameters);
|
||||
}
|
||||
}
|
||||
|
||||
_onDBusNameOwnerChanged(connection, sender_name, object_path,
|
||||
interface_name, signal_name, parameters, user_data) {
|
||||
if (!parameters || !this.size())
|
||||
return;
|
||||
|
||||
let [name, before, after] = parameters.deep_unpack();
|
||||
|
||||
if (!after) {
|
||||
if (this._entriesByDBusName.hasOwnProperty(before)) {
|
||||
this.removeEntry(this._entriesByDBusName[before]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_handleUpdateRequest(senderName, parameters) {
|
||||
if (!senderName || !parameters) {
|
||||
return;
|
||||
}
|
||||
|
||||
let [appUri, properties] = parameters.deep_unpack();
|
||||
let appId = appUri.replace(/(^\w+:|^)\/\//, '');
|
||||
let entry = this.lookupByDBusName(senderName);
|
||||
|
||||
if (entry) {
|
||||
entry.setDBusName(senderName);
|
||||
entry.update(properties);
|
||||
} else {
|
||||
let entry = new LauncherEntryRemote(senderName, appId, properties);
|
||||
this.addEntry(entry);
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(LauncherEntryRemoteModel.prototype);
|
||||
|
||||
var LauncherEntryRemote = class DashToDock_LauncherEntryRemote {
|
||||
|
||||
constructor(dbusName, appId, properties) {
|
||||
this._dbusName = dbusName;
|
||||
this._appId = appId;
|
||||
this._count = 0;
|
||||
this._countVisible = false;
|
||||
this._progress = 0.0;
|
||||
this._progressVisible = false;
|
||||
this.update(properties);
|
||||
}
|
||||
|
||||
appId() {
|
||||
return this._appId;
|
||||
}
|
||||
|
||||
dbusName() {
|
||||
return this._dbusName;
|
||||
}
|
||||
|
||||
count() {
|
||||
return this._count;
|
||||
}
|
||||
|
||||
setCount(count) {
|
||||
if (this._count != count) {
|
||||
this._count = count;
|
||||
this.emit('count-changed', this._count);
|
||||
}
|
||||
}
|
||||
|
||||
countVisible() {
|
||||
return this._countVisible;
|
||||
}
|
||||
|
||||
setCountVisible(countVisible) {
|
||||
if (this._countVisible != countVisible) {
|
||||
this._countVisible = countVisible;
|
||||
this.emit('count-visible-changed', this._countVisible);
|
||||
}
|
||||
}
|
||||
|
||||
progress() {
|
||||
return this._progress;
|
||||
}
|
||||
|
||||
setProgress(progress) {
|
||||
if (this._progress != progress) {
|
||||
this._progress = progress;
|
||||
this.emit('progress-changed', this._progress);
|
||||
}
|
||||
}
|
||||
|
||||
progressVisible() {
|
||||
return this._progressVisible;
|
||||
}
|
||||
|
||||
setProgressVisible(progressVisible) {
|
||||
if (this._progressVisible != progressVisible) {
|
||||
this._progressVisible = progressVisible;
|
||||
this.emit('progress-visible-changed', this._progressVisible);
|
||||
}
|
||||
}
|
||||
|
||||
setDBusName(dbusName) {
|
||||
if (this._dbusName != dbusName) {
|
||||
let oldName = this._dbusName;
|
||||
this._dbusName = dbusName;
|
||||
this.emit('dbus-name-changed', oldName);
|
||||
}
|
||||
}
|
||||
|
||||
update(other) {
|
||||
if (other instanceof LauncherEntryRemote) {
|
||||
this.setDBusName(other.dbusName())
|
||||
this.setCount(other.count());
|
||||
this.setCountVisible(other.countVisible());
|
||||
this.setProgress(other.progress());
|
||||
this.setProgressVisible(other.progressVisible())
|
||||
} else {
|
||||
for (let property in other) {
|
||||
if (other.hasOwnProperty(property)) {
|
||||
if (property == 'count') {
|
||||
this.setCount(other[property].get_int64());
|
||||
} else if (property == 'count-visible') {
|
||||
this.setCountVisible(other[property].get_boolean());
|
||||
} if (property == 'progress') {
|
||||
this.setProgress(other[property].get_double());
|
||||
} else if (property == 'progress-visible') {
|
||||
this.setProgressVisible(other[property].get_boolean());
|
||||
} else {
|
||||
// Not implemented yet
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(LauncherEntryRemote.prototype);
|
|
@ -1,268 +0,0 @@
|
|||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
|
||||
// Use __ () and N__() for the extension gettext domain, and reuse
|
||||
// the shell domain with the default _() and N_()
|
||||
const Gettext = imports.gettext.domain('dashtodock');
|
||||
const __ = Gettext.gettext;
|
||||
const N__ = function(e) { return e };
|
||||
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const Utils = Me.imports.utils;
|
||||
|
||||
/**
|
||||
* This class maintains a Shell.App representing the Trash and keeps it
|
||||
* up-to-date as the trash fills and is emptied over time.
|
||||
*/
|
||||
var Trash = class DashToDock_Trash {
|
||||
|
||||
constructor() {
|
||||
this._file = Gio.file_new_for_uri('trash://');
|
||||
try {
|
||||
this._monitor = this._file.monitor_directory(0, null);
|
||||
this._signalId = this._monitor.connect(
|
||||
'changed',
|
||||
this._onTrashChange.bind(this)
|
||||
);
|
||||
} catch (e) {
|
||||
log(`Impossible to monitor trash: ${e}`)
|
||||
}
|
||||
this._lastEmpty = true;
|
||||
this._empty = true;
|
||||
this._onTrashChange();
|
||||
}
|
||||
|
||||
destroy() {
|
||||
if (this._monitor) {
|
||||
this._monitor.disconnect(this._signalId);
|
||||
this._monitor.run_dispose();
|
||||
}
|
||||
this._file.run_dispose();
|
||||
}
|
||||
|
||||
_onTrashChange() {
|
||||
try {
|
||||
let children = this._file.enumerate_children('*', 0, null);
|
||||
this._empty = children.next_file(null) == null;
|
||||
children.close(null);
|
||||
} catch (e) {
|
||||
log(`Impossible to enumerate trash children: ${e}`)
|
||||
return;
|
||||
}
|
||||
|
||||
this._ensureApp();
|
||||
}
|
||||
|
||||
_ensureApp() {
|
||||
if (this._trashApp == null ||
|
||||
this._lastEmpty != this._empty) {
|
||||
let trashKeys = new GLib.KeyFile();
|
||||
trashKeys.set_string('Desktop Entry', 'Name', __('Trash'));
|
||||
trashKeys.set_string('Desktop Entry', 'Icon',
|
||||
this._empty ? 'user-trash' : 'user-trash-full');
|
||||
trashKeys.set_string('Desktop Entry', 'Type', 'Application');
|
||||
trashKeys.set_string('Desktop Entry', 'Exec', 'gio open trash:///');
|
||||
trashKeys.set_string('Desktop Entry', 'StartupNotify', 'false');
|
||||
trashKeys.set_string('Desktop Entry', 'XdtdUri', 'trash:///');
|
||||
if (!this._empty) {
|
||||
trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash;');
|
||||
trashKeys.set_string('Desktop Action empty-trash', 'Name', __('Empty Trash'));
|
||||
trashKeys.set_string('Desktop Action empty-trash', 'Exec',
|
||||
'dbus-send --print-reply --dest=org.gnome.Nautilus /org/gnome/Nautilus org.gnome.Nautilus.FileOperations.EmptyTrash');
|
||||
}
|
||||
|
||||
let trashAppInfo = Gio.DesktopAppInfo.new_from_keyfile(trashKeys);
|
||||
this._trashApp = new Shell.App({appInfo: trashAppInfo});
|
||||
this._lastEmpty = this._empty;
|
||||
|
||||
this.emit('changed');
|
||||
}
|
||||
}
|
||||
|
||||
getApp() {
|
||||
this._ensureApp();
|
||||
return this._trashApp;
|
||||
}
|
||||
}
|
||||
Signals.addSignalMethods(Trash.prototype);
|
||||
|
||||
/**
|
||||
* This class maintains Shell.App representations for removable devices
|
||||
* plugged into the system, and keeps the list of Apps up-to-date as
|
||||
* devices come and go and are mounted and unmounted.
|
||||
*/
|
||||
var Removables = class DashToDock_Removables {
|
||||
|
||||
constructor() {
|
||||
this._signalsHandler = new Utils.GlobalSignalsHandler();
|
||||
|
||||
this._monitor = Gio.VolumeMonitor.get();
|
||||
this._volumeApps = []
|
||||
this._mountApps = []
|
||||
|
||||
this._monitor.get_volumes().forEach(
|
||||
(volume) => {
|
||||
this._onVolumeAdded(this._monitor, volume);
|
||||
}
|
||||
);
|
||||
|
||||
this._monitor.get_mounts().forEach(
|
||||
(mount) => {
|
||||
this._onMountAdded(this._monitor, mount);
|
||||
}
|
||||
);
|
||||
|
||||
this._signalsHandler.add([
|
||||
this._monitor,
|
||||
'mount-added',
|
||||
this._onMountAdded.bind(this)
|
||||
], [
|
||||
this._monitor,
|
||||
'mount-removed',
|
||||
this._onMountRemoved.bind(this)
|
||||
], [
|
||||
this._monitor,
|
||||
'volume-added',
|
||||
this._onVolumeAdded.bind(this)
|
||||
], [
|
||||
this._monitor,
|
||||
'volume-removed',
|
||||
this._onVolumeRemoved.bind(this)
|
||||
]);
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._signalsHandler.destroy();
|
||||
this._monitor.run_dispose();
|
||||
}
|
||||
|
||||
_getWorkingIconName(icon) {
|
||||
if (icon instanceof Gio.ThemedIcon) {
|
||||
let iconTheme = Gtk.IconTheme.get_default();
|
||||
let names = icon.get_names();
|
||||
for (let i = 0; i < names.length; i++) {
|
||||
let iconName = names[i];
|
||||
if (iconTheme.has_icon(iconName)) {
|
||||
return iconName;
|
||||
}
|
||||
}
|
||||
return '';
|
||||
} else {
|
||||
return icon.to_string();
|
||||
}
|
||||
}
|
||||
|
||||
_onVolumeAdded(monitor, volume) {
|
||||
if (!volume.can_mount()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let activationRoot = volume.get_activation_root();
|
||||
if (!activationRoot) {
|
||||
// Can't offer to mount a device if we don't know
|
||||
// where to mount it.
|
||||
// These devices are usually ejectable so you
|
||||
// don't normally unmount them anyway.
|
||||
return;
|
||||
}
|
||||
let uri = GLib.uri_unescape_string(activationRoot.get_uri(), null);
|
||||
|
||||
let volumeKeys = new GLib.KeyFile();
|
||||
volumeKeys.set_string('Desktop Entry', 'Name', volume.get_name());
|
||||
volumeKeys.set_string('Desktop Entry', 'Icon', this._getWorkingIconName(volume.get_icon()));
|
||||
volumeKeys.set_string('Desktop Entry', 'Type', 'Application');
|
||||
volumeKeys.set_string('Desktop Entry', 'Exec', 'nautilus "' + uri + '"');
|
||||
volumeKeys.set_string('Desktop Entry', 'StartupNotify', 'false');
|
||||
volumeKeys.set_string('Desktop Entry', 'Actions', 'mount;');
|
||||
volumeKeys.set_string('Desktop Action mount', 'Name', __('Mount'));
|
||||
volumeKeys.set_string('Desktop Action mount', 'Exec', 'gio mount "' + uri + '"');
|
||||
let volumeAppInfo = Gio.DesktopAppInfo.new_from_keyfile(volumeKeys);
|
||||
let volumeApp = new Shell.App({appInfo: volumeAppInfo});
|
||||
this._volumeApps.push(volumeApp);
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
_onVolumeRemoved(monitor, volume) {
|
||||
for (let i = 0; i < this._volumeApps.length; i++) {
|
||||
let app = this._volumeApps[i];
|
||||
if (app.get_name() == volume.get_name()) {
|
||||
this._volumeApps.splice(i, 1);
|
||||
}
|
||||
}
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
_onMountAdded(monitor, mount) {
|
||||
// Filter out uninteresting mounts
|
||||
if (!mount.can_eject() && !mount.can_unmount())
|
||||
return;
|
||||
if (mount.is_shadowed())
|
||||
return;
|
||||
|
||||
let volume = mount.get_volume();
|
||||
if (!volume || volume.get_identifier('class') == 'network') {
|
||||
return;
|
||||
}
|
||||
|
||||
let escapedUri = mount.get_root().get_uri()
|
||||
let uri = GLib.uri_unescape_string(escapedUri, null);
|
||||
|
||||
let mountKeys = new GLib.KeyFile();
|
||||
mountKeys.set_string('Desktop Entry', 'Name', mount.get_name());
|
||||
mountKeys.set_string('Desktop Entry', 'Icon',
|
||||
this._getWorkingIconName(volume.get_icon()));
|
||||
mountKeys.set_string('Desktop Entry', 'Type', 'Application');
|
||||
mountKeys.set_string('Desktop Entry', 'Exec', 'gio open "' + uri + '"');
|
||||
mountKeys.set_string('Desktop Entry', 'StartupNotify', 'false');
|
||||
mountKeys.set_string('Desktop Entry', 'XdtdUri', escapedUri);
|
||||
mountKeys.set_string('Desktop Entry', 'Actions', 'unmount;');
|
||||
if (mount.can_eject()) {
|
||||
mountKeys.set_string('Desktop Action unmount', 'Name', __('Eject'));
|
||||
mountKeys.set_string('Desktop Action unmount', 'Exec',
|
||||
'gio mount -e "' + uri + '"');
|
||||
} else {
|
||||
mountKeys.set_string('Desktop Entry', 'Actions', 'unmount;');
|
||||
mountKeys.set_string('Desktop Action unmount', 'Name', __('Unmount'));
|
||||
mountKeys.set_string('Desktop Action unmount', 'Exec',
|
||||
'gio mount -u "' + uri + '"');
|
||||
}
|
||||
let mountAppInfo = Gio.DesktopAppInfo.new_from_keyfile(mountKeys);
|
||||
let mountApp = new Shell.App({appInfo: mountAppInfo});
|
||||
this._mountApps.push(mountApp);
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
_onMountRemoved(monitor, mount) {
|
||||
for (let i = 0; i < this._mountApps.length; i++) {
|
||||
let app = this._mountApps[i];
|
||||
if (app.get_name() == mount.get_name()) {
|
||||
this._mountApps.splice(i, 1);
|
||||
}
|
||||
}
|
||||
this.emit('changed');
|
||||
}
|
||||
|
||||
getApps() {
|
||||
// When we have both a volume app and a mount app, we prefer
|
||||
// the mount app.
|
||||
let apps = new Map();
|
||||
this._volumeApps.map(function(app) {
|
||||
apps.set(app.get_name(), app);
|
||||
});
|
||||
this._mountApps.map(function(app) {
|
||||
apps.set(app.get_name(), app);
|
||||
});
|
||||
|
||||
let ret = [];
|
||||
for (let app of apps.values()) {
|
||||
ret.push(app);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
Signals.addSignalMethods(Removables.prototype);
|
|
@ -1,139 +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="18.343554mm"
|
||||
height="18.343554mm"
|
||||
viewBox="0 0 14.674843 14.674842"
|
||||
version="1.1"
|
||||
id="svg4941"
|
||||
sodipodi:docname="glossy.svg"
|
||||
inkscape:version="0.92.1 r15371">
|
||||
<defs
|
||||
id="defs4935">
|
||||
<linearGradient
|
||||
id="linearGradient6812"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="0"
|
||||
id="stop6810" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6808" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient18962"
|
||||
id="linearGradient35463"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.29132751,0,0,0.15428114,-54.210829,160.22776)"
|
||||
x1="214.71877"
|
||||
y1="404.36081"
|
||||
x2="214.71877"
|
||||
y2="443.54596" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient18962">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop18964" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop18966" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient18806">
|
||||
<stop
|
||||
style="stop-color:#ff0101;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop18808" />
|
||||
<stop
|
||||
style="stop-color:#800000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop18810" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6812"
|
||||
id="radialGradient6798"
|
||||
cx="7.3538475"
|
||||
cy="230.28426"
|
||||
fx="7.3538475"
|
||||
fy="230.28426"
|
||||
r="7.2099228"
|
||||
gradientTransform="matrix(5.9484829,-0.0346444,0.01679088,3.0681664,-40.338609,-476.01412)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="10.68"
|
||||
inkscape:cx="65.485107"
|
||||
inkscape:cy="29.432163"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1406"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
scale-x="0.8"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata4938">
|
||||
<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(0,-222.92515)">
|
||||
<rect
|
||||
inkscape:export-ydpi="180"
|
||||
inkscape:export-xdpi="180"
|
||||
inkscape:export-filename="C:\Arbeit\Blog\Tutorials\glossybutton\Glossy_Button_Tutorial.png"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.35100002;fill:url(#linearGradient35463);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.39747861;marker:none;enable-background:accumulate"
|
||||
id="rect19155"
|
||||
width="14.634871"
|
||||
height="3.7392156"
|
||||
x="0.039808333"
|
||||
y="222.98268"
|
||||
rx="1.5496143"
|
||||
ry="0.82064426" />
|
||||
<rect
|
||||
style="opacity:0.427;fill:url(#radialGradient6798);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect6706"
|
||||
width="14.363673"
|
||||
height="14.404656"
|
||||
x="0.090466507"
|
||||
y="223.07919" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 4.3 KiB |
|
@ -1,82 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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"
|
||||
viewBox="-0.7 0 48 48"
|
||||
version="1.1"
|
||||
id="svg10"
|
||||
sodipodi:docname="highlight_stacked_bg.svg"
|
||||
width="48"
|
||||
height="48"
|
||||
inkscape:version="0.92.1 r15371">
|
||||
<metadata
|
||||
id="metadata16">
|
||||
<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="defs14" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="951"
|
||||
id="namedview12"
|
||||
showgrid="false"
|
||||
viewbox-x="-0.7"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="3.8125"
|
||||
inkscape:cx="-63.872219"
|
||||
inkscape:cy="15.195756"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg10" />
|
||||
<g
|
||||
id="g8"
|
||||
transform="matrix(1,0,0,48,-0.7,0)"
|
||||
style="opacity:0.25;fill:#eeeeee;stroke-width:0.14433756">
|
||||
<rect
|
||||
width="45"
|
||||
height="1"
|
||||
id="rect2"
|
||||
x="0"
|
||||
y="0"
|
||||
style="stroke-width:0.14433756" />
|
||||
<rect
|
||||
x="45"
|
||||
width="1"
|
||||
height="1"
|
||||
id="rect4"
|
||||
y="0"
|
||||
style="opacity:0.2;stroke-width:0.02083333" />
|
||||
<rect
|
||||
x="46"
|
||||
width="2"
|
||||
height="1"
|
||||
id="rect6"
|
||||
y="0"
|
||||
style="opacity:0.6;stroke-width:0.02083333" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.1 KiB |
|
@ -1,82 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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"
|
||||
viewBox="-0.7 0 48 48"
|
||||
version="1.1"
|
||||
id="svg10"
|
||||
sodipodi:docname="highlight_stacked_bg_h.svg"
|
||||
width="48"
|
||||
height="48"
|
||||
inkscape:version="0.92.1 r15371">
|
||||
<metadata
|
||||
id="metadata16">
|
||||
<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="defs14" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1853"
|
||||
inkscape:window-height="1016"
|
||||
id="namedview12"
|
||||
showgrid="false"
|
||||
viewbox-x="-0.7"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="3.8125"
|
||||
inkscape:cx="-63.872219"
|
||||
inkscape:cy="15.195756"
|
||||
inkscape:window-x="67"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg10" />
|
||||
<g
|
||||
id="g8"
|
||||
transform="matrix(0,-1,-48,0,47.3,48)"
|
||||
style="opacity:0.25;fill:#eeeeee;stroke-width:0.14433756">
|
||||
<rect
|
||||
width="45"
|
||||
height="1"
|
||||
id="rect2"
|
||||
x="0"
|
||||
y="0"
|
||||
style="stroke-width:0.14433756" />
|
||||
<rect
|
||||
x="45"
|
||||
width="1"
|
||||
height="1"
|
||||
id="rect4"
|
||||
y="0"
|
||||
style="opacity:0.2;stroke-width:0.02083333" />
|
||||
<rect
|
||||
x="46"
|
||||
width="2"
|
||||
height="1"
|
||||
id="rect6"
|
||||
y="0"
|
||||
style="opacity:0.6;stroke-width:0.02083333" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.1 KiB |
|
@ -1,528 +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="33.866665mm"
|
||||
height="33.866684mm"
|
||||
viewBox="0 0 33.866665 33.866683"
|
||||
id="svg5179"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="logo.svg">
|
||||
<defs
|
||||
id="defs5181">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath4379-92-4-9-6-8-0">
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.83189655;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4381-17-7-5-2-0-6"
|
||||
width="19.934219"
|
||||
height="33.52573"
|
||||
x="356.02826"
|
||||
y="457.71631" />
|
||||
</clipPath>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:collect="always"
|
||||
id="filter4435-8-5-3-2-13-8"
|
||||
x="-0.22881356"
|
||||
width="1.4576271"
|
||||
y="-0.22881356"
|
||||
height="1.4576271">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="1.0352993"
|
||||
id="feGaussianBlur4437-6-7-9-8-8-1" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:collect="always"
|
||||
id="filter4365-71-5-7-0-6-2"
|
||||
x="-0.21864407"
|
||||
width="1.437288"
|
||||
y="-0.21864407"
|
||||
height="1.437288">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.98928601"
|
||||
id="feGaussianBlur4367-74-5-92-0-6-5" />
|
||||
</filter>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath4379-6-7-5-8-6-01-2">
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.83189655;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4381-1-8-5-2-0-2-7"
|
||||
width="19.934219"
|
||||
height="33.52573"
|
||||
x="356.02826"
|
||||
y="457.71631" />
|
||||
</clipPath>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:collect="always"
|
||||
id="filter4435-6-1-2-8-2-2-7"
|
||||
x="-0.22881356"
|
||||
width="1.4576271"
|
||||
y="-0.22881356"
|
||||
height="1.4576271">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="1.0352993"
|
||||
id="feGaussianBlur4437-1-1-3-60-1-4-4" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:collect="always"
|
||||
id="filter4365-4-5-2-24-7-3-3"
|
||||
x="-0.21864407"
|
||||
width="1.437288"
|
||||
y="-0.21864407"
|
||||
height="1.437288">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.98928601"
|
||||
id="feGaussianBlur4367-7-0-7-7-9-0-3" />
|
||||
</filter>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath4379-5-6-0-9-8-7-9">
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.83189655;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4381-6-8-5-9-9-2-4"
|
||||
width="19.934219"
|
||||
height="33.52573"
|
||||
x="356.02826"
|
||||
y="457.71631" />
|
||||
</clipPath>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:collect="always"
|
||||
id="filter4435-63-9-2-4-1-2-6"
|
||||
x="-0.22881356"
|
||||
width="1.4576271"
|
||||
y="-0.22881356"
|
||||
height="1.4576271">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="1.0352993"
|
||||
id="feGaussianBlur4437-0-5-6-8-8-9-9" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:collect="always"
|
||||
id="filter4365-2-4-3-6-3-1-7"
|
||||
x="-0.21864407"
|
||||
width="1.437288"
|
||||
y="-0.21864407"
|
||||
height="1.437288">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.98928601"
|
||||
id="feGaussianBlur4367-1-2-5-3-5-8-3" />
|
||||
</filter>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4255"
|
||||
x="-0.20374454"
|
||||
width="1.4074891"
|
||||
y="-0.13779147"
|
||||
height="1.2755829">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="0.25863247"
|
||||
id="feGaussianBlur4257" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="8"
|
||||
inkscape:cx="60.090739"
|
||||
inkscape:cy="60.108985"
|
||||
inkscape:document-units="mm"
|
||||
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="1861"
|
||||
inkscape:window-height="1023"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5184">
|
||||
<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(136.97858,-11.552354)">
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4006-4-6-9-2-0-6"
|
||||
width="33.83363"
|
||||
height="33.859909"
|
||||
x="-136.9473"
|
||||
y="11.552354"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.15440008;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
d="m -130.12265,11.559157 c -4.30029,5.691881 -6.67207,12.608761 -6.82289,19.674442 -0.0115,0.54232 -0.0147,1.0766 0,1.62024 0.11433,4.23572 1.04846,8.50668 2.82497,12.565201 l 31.00865,0 0,-33.859883 -27.01073,0 z"
|
||||
id="path6097-2-6-0-89-4"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
|
||||
d="m -136.9473,18.430158 0,0.7896 0,20.641361 0,0.7896 1.23782,0 2.26288,0 1.60528,0 c 0.68577,0 1.23783,-0.3548 1.23783,-0.7896 l 0,-20.641361 c 0,-0.4398 -0.55206,-0.7896 -1.23783,-0.7896 l -1.60528,0 -2.26288,0 z"
|
||||
id="rect4008-7-9-2-0-3-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccssssccc"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.15440008;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
d="m -119.36792,11.559157 c -10.47023,5.721881 -17.57762,16.847401 -17.57762,29.627402 0,1.43804 0.0897,2.841801 0.26432,4.232481 l 33.5693,0 0,-33.859883 -16.256,0 z"
|
||||
id="path6097-4-5-23-9"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4247-4-4-5-3-8-1"
|
||||
width="33.83363"
|
||||
height="2.1162443"
|
||||
x="-136.9473"
|
||||
y="11.552354"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
d="m -103.11365,13.668597 0,1.05812 c 0,-0.58196 -0.47338,-1.05812 -1.05731,-1.05812 l 1.05731,0 z"
|
||||
id="rect4272-0-7-8-1-1-3-3-1"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4031-9-9-2-4-2-5"
|
||||
width="4.2292037"
|
||||
height="4.2324886"
|
||||
x="-135.89"
|
||||
y="19.488146"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
d="m -136.94728,13.668597 0,1.05812 c 0,-0.58196 0.47337,-1.05812 1.0573,-1.05812 l -1.0573,0 z"
|
||||
id="rect4272-0-2-1-74-41-1-6"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<g
|
||||
id="g4353-9-2-1-5-5-4"
|
||||
transform="matrix(0.10331261,0,0,0.10339285,-173.76079,-27.453246)"
|
||||
clip-path="url(#clipPath4379-92-4-9-6-8-0)"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099">
|
||||
<circle
|
||||
r="5.4295697"
|
||||
cy="477.71164"
|
||||
cx="274.13016"
|
||||
transform="matrix(0.94749688,0,0,0.94749688,96.290796,21.848877)"
|
||||
id="path3153-1-7-3-5-60-3-6"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.42241378;fill:#d7eef4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;filter:url(#filter4435-8-5-3-2-13-8);enable-background:accumulate" />
|
||||
<circle
|
||||
r="5.4295697"
|
||||
cy="477.71164"
|
||||
cx="274.13016"
|
||||
transform="matrix(0.24231546,0,0,0.24231546,289.60229,358.72226)"
|
||||
id="path3153-2-4-1-6-6-9-4-1"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d7eef4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;filter:url(#filter4365-71-5-7-0-6-2);enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
id="g4589-4-1-1-3-6-2"
|
||||
transform="matrix(0.49926208,0,0,0.49964988,-318.21072,-206.05794)"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099">
|
||||
<g
|
||||
clip-path="url(#clipPath4379-6-7-5-8-6-01-2)"
|
||||
transform="matrix(0.20693061,0,0,0.20693061,289.32686,368.5622)"
|
||||
id="g4353-66-1-4-2-6-94-5">
|
||||
<circle
|
||||
r="5.4295697"
|
||||
cy="477.71164"
|
||||
cx="274.13016"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.42241378;fill:#d7eef4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;filter:url(#filter4435-6-1-2-8-2-2-7);enable-background:accumulate"
|
||||
id="path3153-1-6-4-5-63-7-1-0"
|
||||
transform="matrix(0.94749688,0,0,0.94749688,96.290796,21.848877)" />
|
||||
<circle
|
||||
r="5.4295697"
|
||||
cy="477.71164"
|
||||
cx="274.13016"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d7eef4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;filter:url(#filter4365-4-5-2-24-7-3-3);enable-background:accumulate"
|
||||
id="path3153-2-4-7-6-5-8-5-9-5"
|
||||
transform="matrix(0.24231546,0,0,0.24231546,289.60229,358.72226)" />
|
||||
</g>
|
||||
<g
|
||||
clip-path="url(#clipPath4379-5-6-0-9-8-7-9)"
|
||||
transform="matrix(0.20693061,0,0,0.20693061,289.32686,367.53449)"
|
||||
id="g4353-7-2-2-6-4-5-1">
|
||||
<circle
|
||||
r="5.4295697"
|
||||
cy="477.71164"
|
||||
cx="274.13016"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.42241378;fill:#d7eef4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;filter:url(#filter4435-63-9-2-4-1-2-6);enable-background:accumulate"
|
||||
id="path3153-1-19-3-1-5-5-7-8"
|
||||
transform="matrix(0.94749688,0,0,0.94749688,96.290796,21.848877)" />
|
||||
<circle
|
||||
r="5.4295697"
|
||||
cy="477.71164"
|
||||
cx="274.13016"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d7eef4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;filter:url(#filter4365-2-4-3-6-3-1-7);enable-background:accumulate"
|
||||
id="path3153-2-4-5-7-9-9-9-7-6"
|
||||
transform="matrix(0.24231546,0,0,0.24231546,289.60229,358.72226)" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:1.28805089px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
x="-124.44726"
|
||||
y="13.10139"
|
||||
id="text4824-5-2-0-4-8"
|
||||
sodipodi:linespacing="125%"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099"
|
||||
transform="scale(0.99961185,1.0003883)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4826-16-3-8-8-1"
|
||||
x="-124.44726"
|
||||
y="13.10139">Dash to Dock</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:1.28805089px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
x="-136.50272"
|
||||
y="13.10139"
|
||||
id="text4824-8-8-6-8-7-4"
|
||||
sodipodi:linespacing="125%"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099"
|
||||
transform="scale(0.99961185,1.0003883)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4826-1-7-7-5-07-5"
|
||||
x="-136.50272"
|
||||
y="13.10139">Michele</tspan></text>
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4031-9-0-8-5-4-0-7-6"
|
||||
width="4.2292037"
|
||||
height="4.2324886"
|
||||
x="-135.89"
|
||||
y="24.778917"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4031-9-0-7-3-3-6-0-1"
|
||||
width="4.2292037"
|
||||
height="4.2324886"
|
||||
x="-135.89"
|
||||
y="30.069445"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.04922473;marker:none;enable-background:accumulate"
|
||||
id="rect4031-9-0-6-5-1-3-9-0"
|
||||
width="4.2292037"
|
||||
height="4.2324886"
|
||||
x="-135.89"
|
||||
y="35.359974"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
|
||||
d="m -136.9473,17.901078 0,0.52908 2.42849,0 2.21372,0 c 0.94338,0 1.7016,0.3372 1.7016,0.77704 l 0,20.649921 c 0,0.43476 -0.75822,0.7936 -1.7016,0.7936 l -2.21372,0 -2.42849,0 0,0.52904 0.90862,0 2.64325,0 1.88332,0 c 0.80005,0 1.43727,-0.3712 1.43727,-0.82664 l 0,-21.625361 c 0,-0.46072 -0.63722,-0.82668 -1.43727,-0.82668 l -1.88332,0 -2.64325,0 z"
|
||||
id="rect4008-7-0-0-3-3-3-7-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccsssscccccssssccc"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
|
||||
d="m -136.9473,17.901078 0,0.52908 2.42849,0 2.21372,0 c 0.94338,0 1.7016,0.3372 1.7016,0.77704 l 0,20.649921 c 0,0.43476 -0.75822,0.7936 -1.7016,0.7936 l -2.21372,0 -2.42849,0 0,0.52904 0.90862,0 2.64325,0 1.88332,0 c 0.80005,0 1.43727,-0.3712 1.43727,-0.82664 l 0,-21.625361 c 0,-0.46072 -0.63722,-0.82668 -1.43727,-0.82668 l -1.88332,0 -2.64325,0 z"
|
||||
id="rect4008-7-0-0-3-1-5-0-5-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccsssscccccssssccc"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="44.99099"
|
||||
inkscape:export-ydpi="44.99099" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
id="rect6777-7-9-6-9-8"
|
||||
width="20.108335"
|
||||
height="18.256252"
|
||||
x="-125.24149"
|
||||
y="19.139757"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="45"
|
||||
inkscape:export-ydpi="45" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.13229166;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||
id="rect4923-8-7-8-2"
|
||||
width="3.7041669"
|
||||
height="3.7041669"
|
||||
x="-116.71888"
|
||||
y="30.163927"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
d="m -111.94623,19.146638 c -5.49508,1.3884 -10.21465,5.00036 -13.29531,9.92188 l 0,8.334361 20.10833,0 0,-18.256241 -6.81302,0 z"
|
||||
id="path6862-84-2-2-6-7"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="45"
|
||||
inkscape:export-ydpi="45" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
d="m -125.02657,18.882038 c -0.11728,0 -0.21496,0.0812 -0.21496,0.1984 l 0,0.44648 0,1.2568 0,0.2148 0.21496,0 19.67838,0 0.215,0 0,-0.2148 0,-1.2568 0,-0.44648 c 0,-0.1172 -0.0977,-0.1984 -0.215,-0.1984 l -19.67838,0 z"
|
||||
id="rect6779-5-8-6-4-6"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="45"
|
||||
inkscape:export-ydpi="45" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
id="rect6779-2-3-9-9-0-8"
|
||||
width="20.108335"
|
||||
height="0.5291667"
|
||||
x="-125.24149"
|
||||
y="20.991808"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="45"
|
||||
inkscape:export-ydpi="45" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
id="rect6779-2-4-8-0-7-1-1"
|
||||
width="15.875001"
|
||||
height="0.5291667"
|
||||
x="21.521105"
|
||||
y="105.13315"
|
||||
transform="rotate(90)"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="45"
|
||||
inkscape:export-ydpi="45" />
|
||||
<g
|
||||
id="g6839-1-5-1-33-0"
|
||||
transform="matrix(0.02002288,0.02002284,-0.02002288,0.02002284,-106.62848,-6.0229242)"
|
||||
style="fill:#1a1a1a"
|
||||
inkscape:export-filename="/home/michele/Dropbox/lavori/gnome-shell-extension/icon/g5218.png"
|
||||
inkscape:export-xdpi="45"
|
||||
inkscape:export-ydpi="45">
|
||||
<rect
|
||||
y="616.07727"
|
||||
x="653.01312"
|
||||
height="41.542522"
|
||||
width="11.313708"
|
||||
id="rect6819-8-9-2-56-9"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;filter:url(#filter4365-3);enable-background:accumulate" />
|
||||
<rect
|
||||
transform="rotate(90)"
|
||||
y="-679.44122"
|
||||
x="631.19165"
|
||||
height="41.542522"
|
||||
width="11.313708"
|
||||
id="rect6819-3-9-4-3-1-5"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;filter:url(#filter4365-3);enable-background:accumulate" />
|
||||
</g>
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.13229166;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||
id="rect4923-6-8-9-1"
|
||||
width="3.7041669"
|
||||
height="3.7041669"
|
||||
x="-123.59805"
|
||||
y="30.163927"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458335;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate;opacity:0.866;filter:url(#filter4255)"
|
||||
d="m -121.46776,32.043964 -5e-4,1.742839 -4.9e-4,1.742839 0.71518,-0.708051 0.99716,1.727136 1.33421,-0.770304 -0.99542,-1.724104 0.96903,-0.268366 -1.50959,-0.870995 z"
|
||||
id="path6155-6-0-01-4-5-6-0-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccccc" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.13229167;stroke-miterlimit:4;stroke-dasharray:none;marker:none;filter:url(#filter4365-3);enable-background:accumulate"
|
||||
d="m -121.86464,32.043964 -5e-4,1.742839 -4.9e-4,1.742839 0.71518,-0.708051 1.05563,1.8284 1.3342,-0.770304 -1.05388,-1.825368 0.96903,-0.268366 -1.50959,-0.870995 z"
|
||||
id="path6155-6-0-8-0-7-97-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccccc" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.13229166;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||
id="rect4923-4-8-4"
|
||||
width="3.7041669"
|
||||
height="3.7041669"
|
||||
x="-123.59805"
|
||||
y="23.020128"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334" />
|
||||
<rect
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.13229166;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||
id="rect4923-2-6-7-8"
|
||||
width="3.7041669"
|
||||
height="3.7041669"
|
||||
x="-116.71888"
|
||||
y="23.020128"
|
||||
rx="1.0583334"
|
||||
ry="1.0583334" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 26 KiB |
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"_generated": "Generated by SweetTooth, do not edit",
|
||||
"description": "A dock for the Gnome Shell. This extension moves the dash out of the overview transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops. Side and bottom placement options are available.",
|
||||
"gettext-domain": "dashtodock",
|
||||
"name": "Dash to Dock",
|
||||
"original-author": "micxgx@gmail.com",
|
||||
"shell-version": [
|
||||
"3.34"
|
||||
],
|
||||
"url": "https://micheleg.github.io/dash-to-dock/",
|
||||
"uuid": "dash-to-dock@micxgx.gmail.com",
|
||||
"version": 67
|
||||
}
|
|
@ -1,869 +0,0 @@
|
|||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
// Use __ () and N__() for the extension gettext domain, and reuse
|
||||
// the shell domain with the default _() and N_()
|
||||
const Gettext = imports.gettext.domain('dashtodock');
|
||||
const __ = Gettext.gettext;
|
||||
const N__ = function(e) { return e };
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
|
||||
const SCALE_UPDATE_TIMEOUT = 500;
|
||||
const DEFAULT_ICONS_SIZES = [ 128, 96, 64, 48, 32, 24, 16 ];
|
||||
|
||||
const TransparencyMode = {
|
||||
DEFAULT: 0,
|
||||
FIXED: 1,
|
||||
DYNAMIC: 3
|
||||
};
|
||||
|
||||
const RunningIndicatorStyle = {
|
||||
DEFAULT: 0,
|
||||
DOTS: 1,
|
||||
SQUARES: 2,
|
||||
DASHES: 3,
|
||||
SEGMENTED: 4,
|
||||
SOLID: 5,
|
||||
CILIORA: 6,
|
||||
METRO: 7
|
||||
};
|
||||
|
||||
/**
|
||||
* This function was copied from the activities-config extension
|
||||
* https://github.com/nls1729/acme-code/tree/master/activities-config
|
||||
* by Norman L. Smith.
|
||||
*/
|
||||
function cssHexString(css) {
|
||||
let rrggbb = '#';
|
||||
let start;
|
||||
for (let loop = 0; loop < 3; loop++) {
|
||||
let end = 0;
|
||||
let xx = '';
|
||||
for (let loop = 0; loop < 2; loop++) {
|
||||
while (true) {
|
||||
let x = css.slice(end, end + 1);
|
||||
if ((x == '(') || (x == ',') || (x == ')'))
|
||||
break;
|
||||
end++;
|
||||
}
|
||||
if (loop == 0) {
|
||||
end++;
|
||||
start = end;
|
||||
}
|
||||
}
|
||||
xx = parseInt(css.slice(start, end)).toString(16);
|
||||
if (xx.length == 1)
|
||||
xx = '0' + xx;
|
||||
rrggbb += xx;
|
||||
css = css.slice(end);
|
||||
}
|
||||
return rrggbb;
|
||||
}
|
||||
|
||||
function setShortcut(settings) {
|
||||
let shortcut_text = settings.get_string('shortcut-text');
|
||||
let [key, mods] = Gtk.accelerator_parse(shortcut_text);
|
||||
|
||||
if (Gtk.accelerator_valid(key, mods)) {
|
||||
let shortcut = Gtk.accelerator_name(key, mods);
|
||||
settings.set_strv('shortcut', [shortcut]);
|
||||
}
|
||||
else {
|
||||
settings.set_strv('shortcut', []);
|
||||
}
|
||||
}
|
||||
|
||||
var Settings = class DashToDock_Settings {
|
||||
|
||||
constructor() {
|
||||
this._settings = ExtensionUtils.getSettings('org.gnome.shell.extensions.dash-to-dock');
|
||||
|
||||
this._rtl = (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL);
|
||||
|
||||
this._builder = new Gtk.Builder();
|
||||
this._builder.set_translation_domain(Me.metadata['gettext-domain']);
|
||||
this._builder.add_from_file(Me.path + '/Settings.ui');
|
||||
|
||||
this.widget = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });
|
||||
this._notebook = this._builder.get_object('settings_notebook');
|
||||
this.widget.add(this._notebook);
|
||||
|
||||
// Set a reasonable initial window height
|
||||
this.widget.connect('realize', () => {
|
||||
let window = this.widget.get_toplevel();
|
||||
let [default_width, default_height] = window.get_default_size();
|
||||
window.resize(default_width, 650);
|
||||
});
|
||||
|
||||
// Timeout to delay the update of the settings
|
||||
this._dock_size_timeout = 0;
|
||||
this._icon_size_timeout = 0;
|
||||
this._opacity_timeout = 0;
|
||||
|
||||
this._bindSettings();
|
||||
|
||||
this._builder.connect_signals_full(this._connector.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect signals
|
||||
*/
|
||||
_connector(builder, object, signal, handler) {
|
||||
/**init
|
||||
* Object containing all signals defined in the glade file
|
||||
*/
|
||||
const SignalHandler = {
|
||||
dock_display_combo_changed_cb(combo) {
|
||||
this._settings.set_int('preferred-monitor', this._monitors[combo.get_active()]);
|
||||
},
|
||||
|
||||
position_top_button_toggled_cb(button) {
|
||||
if (button.get_active())
|
||||
this._settings.set_enum('dock-position', 0);
|
||||
},
|
||||
|
||||
position_right_button_toggled_cb(button) {
|
||||
if (button.get_active())
|
||||
this._settings.set_enum('dock-position', 1);
|
||||
},
|
||||
|
||||
position_bottom_button_toggled_cb(button) {
|
||||
if (button.get_active())
|
||||
this._settings.set_enum('dock-position', 2);
|
||||
},
|
||||
|
||||
position_left_button_toggled_cb(button) {
|
||||
if (button.get_active())
|
||||
this._settings.set_enum('dock-position', 3);
|
||||
},
|
||||
|
||||
icon_size_combo_changed_cb(combo) {
|
||||
this._settings.set_int('dash-max-icon-size', this._allIconSizes[combo.get_active()]);
|
||||
},
|
||||
|
||||
dock_size_scale_format_value_cb(scale, value) {
|
||||
return Math.round(value * 100) + ' %';
|
||||
},
|
||||
|
||||
dock_size_scale_value_changed_cb(scale) {
|
||||
// Avoid settings the size consinuosly
|
||||
if (this._dock_size_timeout > 0)
|
||||
Mainloop.source_remove(this._dock_size_timeout);
|
||||
|
||||
this._dock_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => {
|
||||
this._settings.set_double('height-fraction', scale.get_value());
|
||||
this._dock_size_timeout = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
},
|
||||
|
||||
icon_size_scale_format_value_cb(scale, value) {
|
||||
return value + ' px';
|
||||
},
|
||||
|
||||
icon_size_scale_value_changed_cb(scale) {
|
||||
// Avoid settings the size consinuosly
|
||||
if (this._icon_size_timeout > 0)
|
||||
Mainloop.source_remove(this._icon_size_timeout);
|
||||
|
||||
this._icon_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => {
|
||||
this._settings.set_int('dash-max-icon-size', scale.get_value());
|
||||
this._icon_size_timeout = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
},
|
||||
|
||||
custom_opacity_scale_value_changed_cb(scale) {
|
||||
// Avoid settings the opacity consinuosly as it's change is animated
|
||||
if (this._opacity_timeout > 0)
|
||||
Mainloop.source_remove(this._opacity_timeout);
|
||||
|
||||
this._opacity_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => {
|
||||
this._settings.set_double('background-opacity', scale.get_value());
|
||||
this._opacity_timeout = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
},
|
||||
|
||||
min_opacity_scale_value_changed_cb(scale) {
|
||||
// Avoid settings the opacity consinuosly as it's change is animated
|
||||
if (this._opacity_timeout > 0)
|
||||
Mainloop.source_remove(this._opacity_timeout);
|
||||
|
||||
this._opacity_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => {
|
||||
this._settings.set_double('min-alpha', scale.get_value());
|
||||
this._opacity_timeout = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
},
|
||||
|
||||
max_opacity_scale_value_changed_cb(scale) {
|
||||
// Avoid settings the opacity consinuosly as it's change is animated
|
||||
if (this._opacity_timeout > 0)
|
||||
Mainloop.source_remove(this._opacity_timeout);
|
||||
|
||||
this._opacity_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, () => {
|
||||
this._settings.set_double('max-alpha', scale.get_value());
|
||||
this._opacity_timeout = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
},
|
||||
|
||||
custom_opacity_scale_format_value_cb(scale, value) {
|
||||
return Math.round(value * 100) + ' %';
|
||||
},
|
||||
|
||||
min_opacity_scale_format_value_cb(scale, value) {
|
||||
return Math.round(value * 100) + ' %';
|
||||
},
|
||||
|
||||
max_opacity_scale_format_value_cb(scale, value) {
|
||||
return Math.round(value * 100) + ' %';
|
||||
},
|
||||
|
||||
all_windows_radio_button_toggled_cb(button) {
|
||||
if (button.get_active())
|
||||
this._settings.set_enum('intellihide-mode', 0);
|
||||
},
|
||||
|
||||
focus_application_windows_radio_button_toggled_cb(button) {
|
||||
if (button.get_active())
|
||||
this._settings.set_enum('intellihide-mode', 1);
|
||||
},
|
||||
|
||||
maximized_windows_radio_button_toggled_cb(button) {
|
||||
if (button.get_active())
|
||||
this._settings.set_enum('intellihide-mode', 2);
|
||||
}
|
||||
}
|
||||
|
||||
object.connect(signal, SignalHandler[handler].bind(this));
|
||||
}
|
||||
|
||||
_bindSettings() {
|
||||
// Position and size panel
|
||||
|
||||
// Monitor options
|
||||
|
||||
this._monitors = [];
|
||||
// Build options based on the number of monitors and the current settings.
|
||||
let n_monitors = Gdk.Screen.get_default().get_n_monitors();
|
||||
let primary_monitor = Gdk.Screen.get_default().get_primary_monitor();
|
||||
|
||||
let monitor = this._settings.get_int('preferred-monitor');
|
||||
|
||||
// Add primary monitor with index 0, because in GNOME Shell the primary monitor is always 0
|
||||
this._builder.get_object('dock_monitor_combo').append_text(__('Primary monitor'));
|
||||
this._monitors.push(0);
|
||||
|
||||
// Add connected monitors
|
||||
let ctr = 0;
|
||||
for (let i = 0; i < n_monitors; i++) {
|
||||
if (i !== primary_monitor) {
|
||||
ctr++;
|
||||
this._monitors.push(ctr);
|
||||
this._builder.get_object('dock_monitor_combo').append_text(__('Secondary monitor ') + ctr);
|
||||
}
|
||||
}
|
||||
|
||||
// If one of the external monitor is set as preferred, show it even if not attached
|
||||
if ((monitor >= n_monitors) && (monitor !== primary_monitor)) {
|
||||
this._monitors.push(monitor)
|
||||
this._builder.get_object('dock_monitor_combo').append_text(__('Secondary monitor ') + ++ctr);
|
||||
}
|
||||
|
||||
this._builder.get_object('dock_monitor_combo').set_active(this._monitors.indexOf(monitor));
|
||||
|
||||
// Position option
|
||||
let position = this._settings.get_enum('dock-position');
|
||||
|
||||
switch (position) {
|
||||
case 0:
|
||||
this._builder.get_object('position_top_button').set_active(true);
|
||||
break;
|
||||
case 1:
|
||||
this._builder.get_object('position_right_button').set_active(true);
|
||||
break;
|
||||
case 2:
|
||||
this._builder.get_object('position_bottom_button').set_active(true);
|
||||
break;
|
||||
case 3:
|
||||
this._builder.get_object('position_left_button').set_active(true);
|
||||
break;
|
||||
}
|
||||
|
||||
if (this._rtl) {
|
||||
/* Left is Right in rtl as a setting */
|
||||
this._builder.get_object('position_left_button').set_label(__('Right'));
|
||||
this._builder.get_object('position_right_button').set_label(__('Left'));
|
||||
}
|
||||
|
||||
// Intelligent autohide options
|
||||
this._settings.bind('dock-fixed',
|
||||
this._builder.get_object('intelligent_autohide_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
||||
this._settings.bind('dock-fixed',
|
||||
this._builder.get_object('intelligent_autohide_button'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
||||
this._settings.bind('autohide',
|
||||
this._builder.get_object('autohide_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('autohide-in-fullscreen',
|
||||
this._builder.get_object('autohide_enable_in_fullscreen_checkbutton'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('require-pressure-to-show',
|
||||
this._builder.get_object('require_pressure_checkbutton'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('intellihide',
|
||||
this._builder.get_object('intellihide_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('animation-time',
|
||||
this._builder.get_object('animation_duration_spinbutton'),
|
||||
'value',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('hide-delay',
|
||||
this._builder.get_object('hide_timeout_spinbutton'),
|
||||
'value',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-delay',
|
||||
this._builder.get_object('show_timeout_spinbutton'),
|
||||
'value',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('pressure-threshold',
|
||||
this._builder.get_object('pressure_threshold_spinbutton'),
|
||||
'value',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
//this._builder.get_object('animation_duration_spinbutton').set_value(this._settings.get_double('animation-time'));
|
||||
|
||||
// Create dialog for intelligent autohide advanced settings
|
||||
this._builder.get_object('intelligent_autohide_button').connect('clicked', () => {
|
||||
|
||||
let dialog = new Gtk.Dialog({ title: __('Intelligent autohide customization'),
|
||||
transient_for: this.widget.get_toplevel(),
|
||||
use_header_bar: true,
|
||||
modal: true });
|
||||
|
||||
// GTK+ leaves positive values for application-defined response ids.
|
||||
// Use +1 for the reset action
|
||||
dialog.add_button(__('Reset to defaults'), 1);
|
||||
|
||||
let box = this._builder.get_object('intelligent_autohide_advanced_settings_box');
|
||||
dialog.get_content_area().add(box);
|
||||
|
||||
this._settings.bind('intellihide',
|
||||
this._builder.get_object('intellihide_mode_box'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
|
||||
// intellihide mode
|
||||
|
||||
let intellihideModeRadioButtons = [
|
||||
this._builder.get_object('all_windows_radio_button'),
|
||||
this._builder.get_object('focus_application_windows_radio_button'),
|
||||
this._builder.get_object('maximized_windows_radio_button')
|
||||
];
|
||||
|
||||
intellihideModeRadioButtons[this._settings.get_enum('intellihide-mode')].set_active(true);
|
||||
|
||||
this._settings.bind('autohide',
|
||||
this._builder.get_object('require_pressure_checkbutton'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
|
||||
this._settings.bind('autohide',
|
||||
this._builder.get_object('autohide_enable_in_fullscreen_checkbutton'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
|
||||
this._settings.bind('require-pressure-to-show',
|
||||
this._builder.get_object('show_timeout_spinbutton'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
||||
this._settings.bind('require-pressure-to-show',
|
||||
this._builder.get_object('show_timeout_label'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
||||
this._settings.bind('require-pressure-to-show',
|
||||
this._builder.get_object('pressure_threshold_spinbutton'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('require-pressure-to-show',
|
||||
this._builder.get_object('pressure_threshold_label'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
dialog.connect('response', (dialog, id) => {
|
||||
if (id == 1) {
|
||||
// restore default settings for the relevant keys
|
||||
let keys = ['intellihide', 'autohide', 'intellihide-mode', 'autohide-in-fullscreen', 'require-pressure-to-show',
|
||||
'animation-time', 'show-delay', 'hide-delay', 'pressure-threshold'];
|
||||
keys.forEach(function(val) {
|
||||
this._settings.set_value(val, this._settings.get_default_value(val));
|
||||
}, this);
|
||||
intellihideModeRadioButtons[this._settings.get_enum('intellihide-mode')].set_active(true);
|
||||
} else {
|
||||
// remove the settings box so it doesn't get destroyed;
|
||||
dialog.get_content_area().remove(box);
|
||||
dialog.destroy();
|
||||
}
|
||||
return;
|
||||
});
|
||||
|
||||
dialog.show_all();
|
||||
|
||||
});
|
||||
|
||||
// size options
|
||||
this._builder.get_object('dock_size_scale').set_value(this._settings.get_double('height-fraction'));
|
||||
this._builder.get_object('dock_size_scale').add_mark(0.9, Gtk.PositionType.TOP, null);
|
||||
let icon_size_scale = this._builder.get_object('icon_size_scale');
|
||||
icon_size_scale.set_range(8, DEFAULT_ICONS_SIZES[0]);
|
||||
icon_size_scale.set_value(this._settings.get_int('dash-max-icon-size'));
|
||||
DEFAULT_ICONS_SIZES.forEach(function(val) {
|
||||
icon_size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString());
|
||||
});
|
||||
|
||||
// Corrent for rtl languages
|
||||
if (this._rtl) {
|
||||
// Flip value position: this is not done automatically
|
||||
this._builder.get_object('dock_size_scale').set_value_pos(Gtk.PositionType.LEFT);
|
||||
icon_size_scale.set_value_pos(Gtk.PositionType.LEFT);
|
||||
// I suppose due to a bug, having a more than one mark and one above a value of 100
|
||||
// makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable
|
||||
// and then manually inverting it
|
||||
icon_size_scale.set_flippable(false);
|
||||
icon_size_scale.set_inverted(true);
|
||||
}
|
||||
|
||||
this._settings.bind('icon-size-fixed', this._builder.get_object('icon_size_fixed_checkbutton'), 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('extend-height', this._builder.get_object('dock_size_extend_checkbutton'), 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('extend-height', this._builder.get_object('dock_size_scale'), 'sensitive', Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
||||
|
||||
|
||||
// Apps panel
|
||||
|
||||
this._settings.bind('show-running',
|
||||
this._builder.get_object('show_running_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('isolate-workspaces',
|
||||
this._builder.get_object('application_button_isolation_button'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('isolate-monitors',
|
||||
this._builder.get_object('application_button_monitor_isolation_button'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-windows-preview',
|
||||
this._builder.get_object('windows_preview_button'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('multi-monitor',
|
||||
this._builder.get_object('multi_monitor_button'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-favorites',
|
||||
this._builder.get_object('show_favorite_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-trash',
|
||||
this._builder.get_object('show_trash_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-mounts',
|
||||
this._builder.get_object('show_mounts_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-show-apps-button',
|
||||
this._builder.get_object('show_applications_button_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-apps-at-top',
|
||||
this._builder.get_object('application_button_first_button'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-show-apps-button',
|
||||
this._builder.get_object('application_button_first_button'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('animate-show-apps',
|
||||
this._builder.get_object('application_button_animation_button'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('show-show-apps-button',
|
||||
this._builder.get_object('application_button_animation_button'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
|
||||
// Behavior panel
|
||||
|
||||
this._settings.bind('hot-keys',
|
||||
this._builder.get_object('hot_keys_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('hot-keys',
|
||||
this._builder.get_object('overlay_button'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
this._builder.get_object('click_action_combo').set_active(this._settings.get_enum('click-action'));
|
||||
this._builder.get_object('click_action_combo').connect('changed', (widget) => {
|
||||
this._settings.set_enum('click-action', widget.get_active());
|
||||
});
|
||||
|
||||
this._builder.get_object('scroll_action_combo').set_active(this._settings.get_enum('scroll-action'));
|
||||
this._builder.get_object('scroll_action_combo').connect('changed', (widget) => {
|
||||
this._settings.set_enum('scroll-action', widget.get_active());
|
||||
});
|
||||
|
||||
this._builder.get_object('shift_click_action_combo').connect('changed', (widget) => {
|
||||
this._settings.set_enum('shift-click-action', widget.get_active());
|
||||
});
|
||||
|
||||
this._builder.get_object('middle_click_action_combo').connect('changed', (widget) => {
|
||||
this._settings.set_enum('middle-click-action', widget.get_active());
|
||||
});
|
||||
this._builder.get_object('shift_middle_click_action_combo').connect('changed', (widget) => {
|
||||
this._settings.set_enum('shift-middle-click-action', widget.get_active());
|
||||
});
|
||||
|
||||
// Create dialog for number overlay options
|
||||
this._builder.get_object('overlay_button').connect('clicked', () => {
|
||||
|
||||
let dialog = new Gtk.Dialog({ title: __('Show dock and application numbers'),
|
||||
transient_for: this.widget.get_toplevel(),
|
||||
use_header_bar: true,
|
||||
modal: true });
|
||||
|
||||
// GTK+ leaves positive values for application-defined response ids.
|
||||
// Use +1 for the reset action
|
||||
dialog.add_button(__('Reset to defaults'), 1);
|
||||
|
||||
let box = this._builder.get_object('box_overlay_shortcut');
|
||||
dialog.get_content_area().add(box);
|
||||
|
||||
this._builder.get_object('overlay_switch').set_active(this._settings.get_boolean('hotkeys-overlay'));
|
||||
this._builder.get_object('show_dock_switch').set_active(this._settings.get_boolean('hotkeys-show-dock'));
|
||||
|
||||
// We need to update the shortcut 'strv' when the text is modified
|
||||
this._settings.connect('changed::shortcut-text', () => {setShortcut(this._settings);});
|
||||
this._settings.bind('shortcut-text',
|
||||
this._builder.get_object('shortcut_entry'),
|
||||
'text',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
this._settings.bind('hotkeys-overlay',
|
||||
this._builder.get_object('overlay_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('hotkeys-show-dock',
|
||||
this._builder.get_object('show_dock_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('shortcut-timeout',
|
||||
this._builder.get_object('timeout_spinbutton'),
|
||||
'value',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
dialog.connect('response', (dialog, id) => {
|
||||
if (id == 1) {
|
||||
// restore default settings for the relevant keys
|
||||
let keys = ['shortcut-text', 'hotkeys-overlay', 'hotkeys-show-dock', 'shortcut-timeout'];
|
||||
keys.forEach(function(val) {
|
||||
this._settings.set_value(val, this._settings.get_default_value(val));
|
||||
}, this);
|
||||
} else {
|
||||
// remove the settings box so it doesn't get destroyed;
|
||||
dialog.get_content_area().remove(box);
|
||||
dialog.destroy();
|
||||
}
|
||||
return;
|
||||
});
|
||||
|
||||
dialog.show_all();
|
||||
});
|
||||
|
||||
// Create dialog for middle-click options
|
||||
this._builder.get_object('middle_click_options_button').connect('clicked', () => {
|
||||
|
||||
let dialog = new Gtk.Dialog({ title: __('Customize middle-click behavior'),
|
||||
transient_for: this.widget.get_toplevel(),
|
||||
use_header_bar: true,
|
||||
modal: true });
|
||||
|
||||
// GTK+ leaves positive values for application-defined response ids.
|
||||
// Use +1 for the reset action
|
||||
dialog.add_button(__('Reset to defaults'), 1);
|
||||
|
||||
let box = this._builder.get_object('box_middle_click_options');
|
||||
dialog.get_content_area().add(box);
|
||||
|
||||
this._builder.get_object('shift_click_action_combo').set_active(this._settings.get_enum('shift-click-action'));
|
||||
|
||||
this._builder.get_object('middle_click_action_combo').set_active(this._settings.get_enum('middle-click-action'));
|
||||
|
||||
this._builder.get_object('shift_middle_click_action_combo').set_active(this._settings.get_enum('shift-middle-click-action'));
|
||||
|
||||
this._settings.bind('shift-click-action',
|
||||
this._builder.get_object('shift_click_action_combo'),
|
||||
'active-id',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('middle-click-action',
|
||||
this._builder.get_object('middle_click_action_combo'),
|
||||
'active-id',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('shift-middle-click-action',
|
||||
this._builder.get_object('shift_middle_click_action_combo'),
|
||||
'active-id',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
dialog.connect('response', (dialog, id) => {
|
||||
if (id == 1) {
|
||||
// restore default settings for the relevant keys
|
||||
let keys = ['shift-click-action', 'middle-click-action', 'shift-middle-click-action'];
|
||||
keys.forEach(function(val) {
|
||||
this._settings.set_value(val, this._settings.get_default_value(val));
|
||||
}, this);
|
||||
this._builder.get_object('shift_click_action_combo').set_active(this._settings.get_enum('shift-click-action'));
|
||||
this._builder.get_object('middle_click_action_combo').set_active(this._settings.get_enum('middle-click-action'));
|
||||
this._builder.get_object('shift_middle_click_action_combo').set_active(this._settings.get_enum('shift-middle-click-action'));
|
||||
} else {
|
||||
// remove the settings box so it doesn't get destroyed;
|
||||
dialog.get_content_area().remove(box);
|
||||
dialog.destroy();
|
||||
}
|
||||
return;
|
||||
});
|
||||
|
||||
dialog.show_all();
|
||||
|
||||
});
|
||||
|
||||
// Appearance Panel
|
||||
|
||||
this._settings.bind('apply-custom-theme', this._builder.get_object('customize_theme'), 'sensitive', Gio.SettingsBindFlags.INVERT_BOOLEAN | Gio.SettingsBindFlags.GET);
|
||||
this._settings.bind('apply-custom-theme', this._builder.get_object('builtin_theme_switch'), 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('custom-theme-shrink', this._builder.get_object('shrink_dash_switch'), 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
// Running indicators
|
||||
this._builder.get_object('running_indicators_combo').set_active(
|
||||
this._settings.get_enum('running-indicator-style')
|
||||
);
|
||||
this._builder.get_object('running_indicators_combo').connect(
|
||||
'changed',
|
||||
(widget) => {
|
||||
this._settings.set_enum('running-indicator-style', widget.get_active());
|
||||
}
|
||||
);
|
||||
|
||||
if (this._settings.get_enum('running-indicator-style') == RunningIndicatorStyle.DEFAULT)
|
||||
this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(false);
|
||||
|
||||
this._settings.connect('changed::running-indicator-style', () => {
|
||||
if (this._settings.get_enum('running-indicator-style') == RunningIndicatorStyle.DEFAULT)
|
||||
this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(false);
|
||||
else
|
||||
this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(true);
|
||||
});
|
||||
|
||||
// Create dialog for running indicators advanced settings
|
||||
this._builder.get_object('running_indicators_advance_settings_button').connect('clicked', () => {
|
||||
|
||||
let dialog = new Gtk.Dialog({ title: __('Customize running indicators'),
|
||||
transient_for: this.widget.get_toplevel(),
|
||||
use_header_bar: true,
|
||||
modal: true });
|
||||
|
||||
let box = this._builder.get_object('running_dots_advance_settings_box');
|
||||
dialog.get_content_area().add(box);
|
||||
|
||||
this._settings.bind('running-indicator-dominant-color',
|
||||
this._builder.get_object('dominant_color_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
this._settings.bind('custom-theme-customize-running-dots',
|
||||
this._builder.get_object('dot_style_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('custom-theme-customize-running-dots',
|
||||
this._builder.get_object('dot_style_settings_box'),
|
||||
'sensitive', Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
let rgba = new Gdk.RGBA();
|
||||
rgba.parse(this._settings.get_string('custom-theme-running-dots-color'));
|
||||
this._builder.get_object('dot_color_colorbutton').set_rgba(rgba);
|
||||
|
||||
this._builder.get_object('dot_color_colorbutton').connect('notify::color', (button) => {
|
||||
let rgba = button.get_rgba();
|
||||
let css = rgba.to_string();
|
||||
let hexString = cssHexString(css);
|
||||
this._settings.set_string('custom-theme-running-dots-color', hexString);
|
||||
});
|
||||
|
||||
rgba.parse(this._settings.get_string('custom-theme-running-dots-border-color'));
|
||||
this._builder.get_object('dot_border_color_colorbutton').set_rgba(rgba);
|
||||
|
||||
this._builder.get_object('dot_border_color_colorbutton').connect('notify::color', (button) => {
|
||||
let rgba = button.get_rgba();
|
||||
let css = rgba.to_string();
|
||||
let hexString = cssHexString(css);
|
||||
this._settings.set_string('custom-theme-running-dots-border-color', hexString);
|
||||
});
|
||||
|
||||
this._settings.bind('custom-theme-running-dots-border-width',
|
||||
this._builder.get_object('dot_border_width_spin_button'),
|
||||
'value',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
|
||||
dialog.connect('response', (dialog, id) => {
|
||||
// remove the settings box so it doesn't get destroyed;
|
||||
dialog.get_content_area().remove(box);
|
||||
dialog.destroy();
|
||||
return;
|
||||
});
|
||||
|
||||
dialog.show_all();
|
||||
|
||||
});
|
||||
|
||||
this._settings.bind('custom-background-color', this._builder.get_object('custom_background_color_switch'), 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
this._settings.bind('custom-background-color', this._builder.get_object('custom_background_color'), 'sensitive', Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
let rgba = new Gdk.RGBA();
|
||||
rgba.parse(this._settings.get_string('background-color'));
|
||||
this._builder.get_object('custom_background_color').set_rgba(rgba);
|
||||
|
||||
this._builder.get_object('custom_background_color').connect('notify::color', (button) => {
|
||||
let rgba = button.get_rgba();
|
||||
let css = rgba.to_string();
|
||||
let hexString = cssHexString(css);
|
||||
this._settings.set_string('background-color', hexString);
|
||||
});
|
||||
|
||||
// Opacity
|
||||
this._builder.get_object('customize_opacity_combo').set_active_id(
|
||||
this._settings.get_enum('transparency-mode').toString()
|
||||
);
|
||||
this._builder.get_object('customize_opacity_combo').connect(
|
||||
'changed',
|
||||
(widget) => {
|
||||
this._settings.set_enum('transparency-mode', parseInt(widget.get_active_id()));
|
||||
}
|
||||
);
|
||||
|
||||
this._builder.get_object('custom_opacity_scale').set_value(this._settings.get_double('background-opacity'));
|
||||
|
||||
if (this._settings.get_enum('transparency-mode') !== TransparencyMode.FIXED)
|
||||
this._builder.get_object('custom_opacity_scale').set_sensitive(false);
|
||||
|
||||
this._settings.connect('changed::transparency-mode', () => {
|
||||
if (this._settings.get_enum('transparency-mode') !== TransparencyMode.FIXED)
|
||||
this._builder.get_object('custom_opacity_scale').set_sensitive(false);
|
||||
else
|
||||
this._builder.get_object('custom_opacity_scale').set_sensitive(true);
|
||||
});
|
||||
|
||||
if (this._settings.get_enum('transparency-mode') !== TransparencyMode.DYNAMIC) {
|
||||
this._builder.get_object('dynamic_opacity_button').set_sensitive(false);
|
||||
}
|
||||
|
||||
this._settings.connect('changed::transparency-mode', () => {
|
||||
if (this._settings.get_enum('transparency-mode') !== TransparencyMode.DYNAMIC) {
|
||||
this._builder.get_object('dynamic_opacity_button').set_sensitive(false);
|
||||
}
|
||||
else {
|
||||
this._builder.get_object('dynamic_opacity_button').set_sensitive(true);
|
||||
}
|
||||
});
|
||||
|
||||
// Create dialog for transparency advanced settings
|
||||
this._builder.get_object('dynamic_opacity_button').connect('clicked', () => {
|
||||
|
||||
let dialog = new Gtk.Dialog({ title: __('Cutomize opacity'),
|
||||
transient_for: this.widget.get_toplevel(),
|
||||
use_header_bar: true,
|
||||
modal: true });
|
||||
|
||||
let box = this._builder.get_object('advanced_transparency_dialog');
|
||||
dialog.get_content_area().add(box);
|
||||
|
||||
this._settings.bind(
|
||||
'customize-alphas',
|
||||
this._builder.get_object('customize_alphas_switch'),
|
||||
'active',
|
||||
Gio.SettingsBindFlags.DEFAULT
|
||||
);
|
||||
this._settings.bind(
|
||||
'customize-alphas',
|
||||
this._builder.get_object('min_alpha_scale'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.DEFAULT
|
||||
);
|
||||
this._settings.bind(
|
||||
'customize-alphas',
|
||||
this._builder.get_object('max_alpha_scale'),
|
||||
'sensitive',
|
||||
Gio.SettingsBindFlags.DEFAULT
|
||||
);
|
||||
|
||||
this._builder.get_object('min_alpha_scale').set_value(
|
||||
this._settings.get_double('min-alpha')
|
||||
);
|
||||
this._builder.get_object('max_alpha_scale').set_value(
|
||||
this._settings.get_double('max-alpha')
|
||||
);
|
||||
|
||||
dialog.connect('response', (dialog, id) => {
|
||||
// remove the settings box so it doesn't get destroyed;
|
||||
dialog.get_content_area().remove(box);
|
||||
dialog.destroy();
|
||||
return;
|
||||
});
|
||||
|
||||
dialog.show_all();
|
||||
});
|
||||
|
||||
|
||||
this._settings.bind('unity-backlit-items',
|
||||
this._builder.get_object('unity_backlit_items_switch'),
|
||||
'active', Gio.SettingsBindFlags.DEFAULT
|
||||
);
|
||||
|
||||
this._settings.bind('force-straight-corner',
|
||||
this._builder.get_object('force_straight_corner_switch'),
|
||||
'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
// About Panel
|
||||
|
||||
this._builder.get_object('extension_version').set_label(Me.metadata.version.toString());
|
||||
}
|
||||
};
|
||||
|
||||
function init() {
|
||||
ExtensionUtils.initTranslations();
|
||||
}
|
||||
|
||||
function buildPrefsWidget() {
|
||||
let settings = new Settings();
|
||||
let widget = settings.widget;
|
||||
widget.show_all();
|
||||
return widget;
|
||||
}
|
|
@ -1,550 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<enum id='org.gnome.shell.extensions.dash-to-dock.clickAction'>
|
||||
<value value='0' nick='skip'/>
|
||||
<value value='1' nick='minimize'/>
|
||||
<value value='2' nick='launch'/>
|
||||
<value value='3' nick='cycle-windows'/>
|
||||
<value value='4' nick='minimize-or-overview'/>
|
||||
<value value='5' nick='previews'/>
|
||||
<value value='6' nick='minimize-or-previews'/>
|
||||
<value value='7' nick='focus-or-previews'/>
|
||||
<value value='8' nick='quit'/>
|
||||
</enum>
|
||||
<enum id='org.gnome.shell.extensions.dash-to-dock.scrollAction'>
|
||||
<value value='0' nick='do-nothing'/>
|
||||
<value value='1' nick='cycle-windows'/>
|
||||
<value value='2' nick='switch-workspace'/>
|
||||
</enum>
|
||||
<!-- this is mean to Match StSide. LEFT and RIGHT actual position in reversed in
|
||||
rtl languages -->
|
||||
<enum id='org.gnome.shell.extensions.dash-to-dock.position'>
|
||||
<value value='0' nick='TOP'/>
|
||||
<value value='1' nick='RIGHT'/>
|
||||
<value value='2' nick='BOTTOM'/>
|
||||
<value value='3' nick='LEFT'/>
|
||||
</enum>
|
||||
<enum id='org.gnome.shell.extensions.dash-to-dock.intellihide-mode'>
|
||||
<value value='0' nick='ALL_WINDOWS'/>
|
||||
<value value='1' nick='FOCUS_APPLICATION_WINDOWS'/>
|
||||
<value value='2' nick='MAXIMIZED_WINDOWS'/>
|
||||
</enum>
|
||||
<enum id='org.gnome.shell.extensions.dash-to-dock.transparency-mode'>
|
||||
<value value='0' nick='DEFAULT'/>
|
||||
<value value='1' nick='FIXED'/>
|
||||
<value value='3' nick='DYNAMIC'/>
|
||||
</enum>
|
||||
<enum id='org.gnome.shell.extensions.dash-to-dock.running-indicator-style'>
|
||||
<value value='0' nick='DEFAULT'/>
|
||||
<value value='1' nick='DOTS'/>
|
||||
<value value='2' nick='SQUARES'/>
|
||||
<value value='3' nick='DASHES'/>
|
||||
<value value='4' nick='SEGMENTED'/>
|
||||
<value value='5' nick='SOLID'/>
|
||||
<value value='6' nick='CILIORA'/>
|
||||
<value value='7' nick='METRO'/>
|
||||
</enum>
|
||||
<schema path="/org/gnome/shell/extensions/dash-to-dock/" id="org.gnome.shell.extensions.dash-to-dock">
|
||||
<key name="dock-position" enum="org.gnome.shell.extensions.dash-to-dock.position">
|
||||
<default>'LEFT'</default>
|
||||
<summary>Dock position</summary>
|
||||
<description>Dock is shown on the Left, Right, Top or Bottom side of the screen.</description>
|
||||
</key>
|
||||
<key type="d" name="animation-time">
|
||||
<default>0.2</default>
|
||||
<summary>Animation time</summary>
|
||||
<description>Sets the time duration of the autohide effect.</description>
|
||||
</key>
|
||||
<key type="d" name="show-delay">
|
||||
<default>0.25</default>
|
||||
<summary>Show delay</summary>
|
||||
<description>Sets the delay after the mouse reaches the screen border before showing the dock.</description>
|
||||
</key>
|
||||
<key type="d" name="hide-delay">
|
||||
<default>0.20</default>
|
||||
<summary>Show delay</summary>
|
||||
<description>Sets the delay after the mouse left the dock before hiding it.</description>
|
||||
</key>
|
||||
<key type="b" name="custom-background-color">
|
||||
<default>false</default>
|
||||
<summary>Set a custom dash background background color</summary>
|
||||
<description>Sets the color for the dash background.</description>
|
||||
</key>
|
||||
<key type="s" name="background-color">
|
||||
<default>"#ffffff"</default>
|
||||
<summary>Dash background color.</summary>
|
||||
<description>Customize the background color of the dash.</description>
|
||||
</key>
|
||||
<key name="transparency-mode" enum="org.gnome.shell.extensions.dash-to-dock.transparency-mode">
|
||||
<default>'DEFAULT'</default>
|
||||
<summary>Transparency mode for the dock</summary>
|
||||
<description>FIXED: constant transparency. DYNAMIC: dock takes the opaque style only when windows are close to it.</description>
|
||||
</key>
|
||||
<key name="running-indicator-style" enum="org.gnome.shell.extensions.dash-to-dock.running-indicator-style">
|
||||
<default>'DEFAULT'</default>
|
||||
<summary>...</summary>
|
||||
<description>DEFAULT: .... DOTS: ....</description>
|
||||
</key>
|
||||
<key type="b" name="running-indicator-dominant-color">
|
||||
<default>false</default>
|
||||
<summary>Use application icon dominant color for the indicator color</summary>
|
||||
<description></description>
|
||||
</key>
|
||||
<key type="b" name="customize-alphas">
|
||||
<default>false</default>
|
||||
<summary>Manually set the min and max opacity</summary>
|
||||
<description>For the dynamic mode, the min/max opacity values will be given by 'min-alpha' and 'max-alpha'.</description>
|
||||
</key>
|
||||
<key type="d" name="min-alpha">
|
||||
<default>0.2</default>
|
||||
<summary>Opacity of the dash background when free-floating</summary>
|
||||
<description>Sets the opacity of the dash background when no windows are close.</description>
|
||||
</key>
|
||||
<key type="d" name="max-alpha">
|
||||
<default>0.8</default>
|
||||
<summary>Opacity of the dash background when windows are close.</summary>
|
||||
<description>Sets the opacity of the dash background when windows are close.</description>
|
||||
</key>
|
||||
<key type="d" name="background-opacity">
|
||||
<default>0.8</default>
|
||||
<summary>Opacity of the dash background</summary>
|
||||
<description>Sets the opacity of the dash background when in autohide mode.</description>
|
||||
</key>
|
||||
<key type="b" name="intellihide">
|
||||
<default>true</default>
|
||||
<summary>Dock dodges windows</summary>
|
||||
<description>Enable or disable intellihide mode</description>
|
||||
</key>
|
||||
<key name="intellihide-mode" enum="org.gnome.shell.extensions.dash-to-dock.intellihide-mode">
|
||||
<default>'FOCUS_APPLICATION_WINDOWS'</default>
|
||||
<summary>Define which windows are considered for intellihide.</summary>
|
||||
<description></description>
|
||||
</key>
|
||||
<key type="b" name="autohide">
|
||||
<default>true</default>
|
||||
<summary>Dock shown on mouse over</summary>
|
||||
<description>Enable or disable autohide mode</description>
|
||||
</key>
|
||||
<key type="b" name="require-pressure-to-show">
|
||||
<default>true</default>
|
||||
<summary>Require pressure to show dash</summary>
|
||||
<description>Enable or disable requiring pressure to show the dash</description>
|
||||
</key>
|
||||
<key type="d" name="pressure-threshold">
|
||||
<default>100</default>
|
||||
<summary>Pressure threshold</summary>
|
||||
<description>Sets how much pressure is needed to show the dash.</description>
|
||||
</key>
|
||||
<key type="b" name="autohide-in-fullscreen">
|
||||
<default>false</default>
|
||||
<summary>Enable autohide in fullscreen mode.</summary>
|
||||
<description>Enable autohide in fullscreen mode.</description>
|
||||
</key>
|
||||
<key type="b" name="dock-fixed">
|
||||
<default>false</default>
|
||||
<summary>Dock always visible</summary>
|
||||
<description>Dock is always visible</description>
|
||||
</key>
|
||||
<key type="b" name="scroll-switch-workspace">
|
||||
<default>true</default>
|
||||
<summary>Switch workspace by scrolling over the dock</summary>
|
||||
<description>Add the possibility to switch workspace by mouse scrolling over the dock.</description>
|
||||
</key>
|
||||
<key type="i" name="dash-max-icon-size">
|
||||
<default>48</default>
|
||||
<summary>Maximum dash icon size</summary>
|
||||
<description>Set the allowed maximum dash icon size. Allowed range: 16..64.</description>
|
||||
</key>
|
||||
<key type="b" name="icon-size-fixed">
|
||||
<default>false</default>
|
||||
<summary>Fixed icon size</summary>
|
||||
<description>Keep the icon size fived by scrolling the dock.</description>
|
||||
</key>
|
||||
<key type="b" name="apply-custom-theme">
|
||||
<default>false</default>
|
||||
<summary>Apply custom theme</summary>
|
||||
<description>Apply customization to the dash appearance</description>
|
||||
</key>
|
||||
<key type="b" name="custom-theme-shrink">
|
||||
<default>false</default>
|
||||
<summary>TODO</summary>
|
||||
<description>TODO</description>
|
||||
</key>
|
||||
<key type="b" name="custom-theme-customize-running-dots">
|
||||
<default>false</default>
|
||||
<summary>Customize the style of the running application indicators.</summary>
|
||||
<description>Customize the style of the running application indicators.</description>
|
||||
</key>
|
||||
<key type="s" name="custom-theme-running-dots-color">
|
||||
<default>"#ffffff"</default>
|
||||
<summary>Running application indicators color</summary>
|
||||
<description>Customize the color of the running application indicators.</description>
|
||||
</key>
|
||||
<key type="s" name="custom-theme-running-dots-border-color">
|
||||
<default>"#ffffff"</default>
|
||||
<summary>Running application indicators border color.</summary>
|
||||
<description>Customize the border color of the running application indicators.</description>
|
||||
</key>
|
||||
<key type="i" name="custom-theme-running-dots-border-width">
|
||||
<default>0</default>
|
||||
<summary>Running application indicators border width.</summary>
|
||||
<description>Customize the border width of the running application indicators.</description>
|
||||
</key>
|
||||
<key type="b" name="show-running">
|
||||
<default>true</default>
|
||||
<summary>Show running apps</summary>
|
||||
<description>Show or hide running appplications icons in the dash</description>
|
||||
</key>
|
||||
<key type="b" name="isolate-workspaces">
|
||||
<default>false</default>
|
||||
<summary>Provide workspace isolation</summary>
|
||||
<description>Dash shows only windows from the currentworkspace</description>
|
||||
</key>
|
||||
<key type="b" name="isolate-monitors">
|
||||
<default>false</default>
|
||||
<summary>Provide monitor isolation</summary>
|
||||
<description>Dash shows only windows from the monitor</description>
|
||||
</key>
|
||||
<key type="b" name="show-windows-preview">
|
||||
<default>true</default>
|
||||
<summary>Show preview of the open windows</summary>
|
||||
<description>Replace open windows list with windows previews</description>
|
||||
</key>
|
||||
<key type="b" name="show-favorites">
|
||||
<default>true</default>
|
||||
<summary>Show favorites apps</summary>
|
||||
<description>Show or hide favorite appplications icons in the dash</description>
|
||||
</key>
|
||||
<key type="b" name="show-trash">
|
||||
<default>true</default>
|
||||
<summary>Show trash can</summary>
|
||||
<description>Show or hide the trash can icon in the dash</description>
|
||||
</key>
|
||||
<key type="b" name="show-mounts">
|
||||
<default>true</default>
|
||||
<summary>Show mounted volumes and devices</summary>
|
||||
<description>Show or hide mounted volume and device icons in the dash</description>
|
||||
</key>
|
||||
<key type="b" name="show-show-apps-button">
|
||||
<default>true</default>
|
||||
<summary>Show applications button</summary>
|
||||
<description>Show appplications button in the dash</description>
|
||||
</key>
|
||||
<key type="b" name="show-apps-at-top">
|
||||
<default>false</default>
|
||||
<summary>Show application button at top</summary>
|
||||
<description>Show appplication button at top of the dash</description>
|
||||
</key>
|
||||
<key type="b" name="animate-show-apps">
|
||||
<default>true</default>
|
||||
<summary>Animate Show Applications from the desktop</summary>
|
||||
<description>Animate Show Applications from the desktop</description>
|
||||
</key>
|
||||
<key type="b" name="bolt-support">
|
||||
<default>true</default>
|
||||
<summary>Basic compatibility with bolt extensions</summary>
|
||||
<description>Make the extension work properly when bolt extensions is enabled</description>
|
||||
</key>
|
||||
<key type="d" name="height-fraction">
|
||||
<default>0.90</default>
|
||||
<summary>Dock max height (fraction of available space)</summary>
|
||||
</key>
|
||||
<key type="b" name="extend-height">
|
||||
<default>false</default>
|
||||
<summary>Extend the dock container to all the available height</summary>
|
||||
</key>
|
||||
<key type="i" name="preferred-monitor">
|
||||
<default>-1</default>
|
||||
<summary>Monitor on which putting the dock</summary>
|
||||
<description>Set on which monitor to put the dock, use -1 for the primary one</description>
|
||||
</key>
|
||||
<key type="b" name="multi-monitor">
|
||||
<default>false</default>
|
||||
<summary>Enable multi-monitor docks</summary>
|
||||
<description>Show a dock on every monitor</description>
|
||||
</key>
|
||||
<key type="b" name="minimize-shift">
|
||||
<default>true</default>
|
||||
<summary>Minimize on shift+click</summary>
|
||||
</key>
|
||||
<key type="b" name="activate-single-window">
|
||||
<default>true</default>
|
||||
<summary>Activate only one window</summary>
|
||||
</key>
|
||||
<key name="click-action" enum="org.gnome.shell.extensions.dash-to-dock.clickAction">
|
||||
<default>'cycle-windows'</default>
|
||||
<summary>Action when clicking on a running app</summary>
|
||||
<description>Set the action that is executed when clicking on the icon of a running application</description>
|
||||
</key>
|
||||
<key name="scroll-action" enum="org.gnome.shell.extensions.dash-to-dock.scrollAction">
|
||||
<default>'do-nothing'</default>
|
||||
<summary>Action when scrolling app</summary>
|
||||
<description>Set the action that is executed when scrolling on the application icon</description>
|
||||
</key>
|
||||
<key name="shift-click-action" enum="org.gnome.shell.extensions.dash-to-dock.clickAction">
|
||||
<default>'minimize'</default>
|
||||
<summary>Action when shift+clicking on a running app</summary>
|
||||
<description>Set the action that is executed when shift+clicking on the icon of a running application</description>
|
||||
</key>
|
||||
<key name="middle-click-action" enum="org.gnome.shell.extensions.dash-to-dock.clickAction">
|
||||
<default>'launch'</default>
|
||||
<summary>Action when clicking on a running app</summary>
|
||||
<description>Set the action that is executed when middle-clicking on the icon of a running application</description>
|
||||
</key>
|
||||
<key name="shift-middle-click-action" enum="org.gnome.shell.extensions.dash-to-dock.clickAction">
|
||||
<default>'launch'</default>
|
||||
<summary>Action when clicking on a running app</summary>
|
||||
<description>Set the action that is executed when shift+middle-clicking on the icon of a running application</description>
|
||||
</key>
|
||||
<key type="b" name="hot-keys">
|
||||
<default>true</default>
|
||||
<summary>Super Hot-Keys</summary>
|
||||
<description>Launch and switch between dash items using Super+(0-9)</description>
|
||||
</key>
|
||||
<key type="b" name="hotkeys-show-dock">
|
||||
<default>true</default>
|
||||
<summary>Show the dock when using the hotkeys</summary>
|
||||
<description>The dock will be quickly shown so that the number-overlay is visible and app activation is easier</description>
|
||||
</key>
|
||||
<key type="s" name="shortcut-text">
|
||||
<default>"<Super>q"</default>
|
||||
<summary>Keybinding to show the dock and the number overlay.</summary>
|
||||
<description>Behavior depends on hotkeys-show-dock and hotkeys-overlay.</description>
|
||||
</key>
|
||||
<key type="as" name="shortcut">
|
||||
<default><![CDATA[['<Super>q']]]></default>
|
||||
<summary>Keybinding to show the dock and the number overlay.</summary>
|
||||
<description>Behavior depends on hotkeys-show-dock and hotkeys-overlay.</description>
|
||||
</key>
|
||||
<key type="d" name="shortcut-timeout">
|
||||
<default>2</default>
|
||||
<summary>Timeout to hide the dock</summary>
|
||||
<description>Sets the time duration before the dock is hidden again.</description>
|
||||
</key>
|
||||
<key type="b" name="hotkeys-overlay">
|
||||
<default>true</default>
|
||||
<summary>Show the dock when using the hotkeys</summary>
|
||||
<description>The dock will be quickly shown so that the number-overlay is visible and app activation is easier</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-1" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>1']]]></default>
|
||||
<summary>Keybinding to launch 1st dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 1st app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-2" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>2']]]></default>
|
||||
<summary>Keybinding to launch 2nd dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 2nd app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-3" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>3']]]></default>
|
||||
<summary>Keybinding to launch 3rd dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 3rd app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-4" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>4']]]></default>
|
||||
<summary>Keybinding to launch 4th dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 4th app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-5" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>5']]]></default>
|
||||
<summary>Keybinding to launch 5th dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 5th app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-6" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>6']]]></default>
|
||||
<summary>Keybinding to launch 6th dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 6th app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-7" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>7']]]></default>
|
||||
<summary>Keybinding to launch 7th dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 7th app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-8" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>8']]]></default>
|
||||
<summary>Keybinding to launch 8th dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 8th app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-9" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>9']]]></default>
|
||||
<summary>Keybinding to launch 9th dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 9th app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-ctrl-hotkey-10" type="as">
|
||||
<default><![CDATA[['<Ctrl><Super>0']]]></default>
|
||||
<summary>Keybinding to launch 10th dash app</summary>
|
||||
<description>
|
||||
Keybinding to launch 10th app.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-1" type="as">
|
||||
<default><![CDATA[['<Shift><Super>1']]]></default>
|
||||
<summary>Keybinding to trigger 1st dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 1st app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-2" type="as">
|
||||
<default><![CDATA[['<Shift><Super>2']]]></default>
|
||||
<summary>Keybinding to trigger 2nd dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 2nd app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-3" type="as">
|
||||
<default><![CDATA[['<Shift><Super>3']]]></default>
|
||||
<summary>Keybinding to trigger 3rd dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 3rd app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-4" type="as">
|
||||
<default><![CDATA[['<Shift><Super>4']]]></default>
|
||||
<summary>Keybinding to trigger 4th dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 4th app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-5" type="as">
|
||||
<default><![CDATA[['<Shift><Super>5']]]></default>
|
||||
<summary>Keybinding to trigger 5th dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 5th app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-6" type="as">
|
||||
<default><![CDATA[['<Shift><Super>6']]]></default>
|
||||
<summary>Keybinding to trigger 6th dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 6th app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-7" type="as">
|
||||
<default><![CDATA[['<Shift><Super>7']]]></default>
|
||||
<summary>Keybinding to trigger 7th dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 7th app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-8" type="as">
|
||||
<default><![CDATA[['<Shift><Super>8']]]></default>
|
||||
<summary>Keybinding to trigger 8th dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 8th app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-9" type="as">
|
||||
<default><![CDATA[['<Shift><Super>9']]]></default>
|
||||
<summary>Keybinding to trigger 9th dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 9th app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-shift-hotkey-10" type="as">
|
||||
<default><![CDATA[['<Shift><Super>0']]]></default>
|
||||
<summary>Keybinding to trigger 10th dash app with shift behavior</summary>
|
||||
<description>
|
||||
Keybinding to trigger 10th app with shift behavior.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-1" type="as">
|
||||
<default><![CDATA[['<Super>1']]]></default>
|
||||
<summary>Keybinding to trigger 1st dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 1st application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-2" type="as">
|
||||
<default><![CDATA[['<Super>2']]]></default>
|
||||
<summary>Keybinding to trigger 2nd dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 2nd application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-3" type="as">
|
||||
<default><![CDATA[['<Super>3']]]></default>
|
||||
<summary>Keybinding to trigger 3rd dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 3rd application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-4" type="as">
|
||||
<default><![CDATA[['<Super>4']]]></default>
|
||||
<summary>Keybinding to trigger 4th dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 4th application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-5" type="as">
|
||||
<default><![CDATA[['<Super>5']]]></default>
|
||||
<summary>Keybinding to trigger 5th dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 5th application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-6" type="as">
|
||||
<default><![CDATA[['<Super>6']]]></default>
|
||||
<summary>Keybinding to trigger 6th dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 6th application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-7" type="as">
|
||||
<default><![CDATA[['<Super>7']]]></default>
|
||||
<summary>Keybinding to trigger 7th dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 7th application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-8" type="as">
|
||||
<default><![CDATA[['<Super>8']]]></default>
|
||||
<summary>Keybinding to trigger 8th dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 8th application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-9" type="as">
|
||||
<default><![CDATA[['<Super>9']]]></default>
|
||||
<summary>Keybinding to trigger 9th dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 9th application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="app-hotkey-10" type="as">
|
||||
<default><![CDATA[['<Super>0']]]></default>
|
||||
<summary>Keybinding to trigger 10th dash app</summary>
|
||||
<description>
|
||||
Keybinding to either show or launch the 10th application in the dash.
|
||||
</description>
|
||||
</key>
|
||||
<key name="force-straight-corner" type="b">
|
||||
<default>false</default>
|
||||
<summary>Force straight corners in dash</summary>
|
||||
<description>Make the borders in the dash non rounded</description>
|
||||
</key>
|
||||
<key name="unity-backlit-items" type="b">
|
||||
<default>false</default>
|
||||
<summary>Enable unity7 like glossy backlit items</summary>
|
||||
<description>Emulate the unity7 backlit glossy items behaviour</description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
|
@ -1,178 +0,0 @@
|
|||
/* Shrink the dash by reducing padding and border radius */
|
||||
#dashtodockContainer.shrink #dash,
|
||||
#dashtodockContainer.dashtodock #dash {
|
||||
border:1px;
|
||||
padding:0px;
|
||||
}
|
||||
|
||||
#dashtodockContainer.shrink.left #dash,
|
||||
#dashtodockContainer.dashtodock.left #dash {
|
||||
border-left: 0px;
|
||||
}
|
||||
|
||||
|
||||
#dashtodockContainer.shrink.right #dash,
|
||||
#dashtodockContainer.dashtodock.right #dash {
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
|
||||
#dashtodockContainer.shrink.top #dash,
|
||||
#dashtodockContainer.dashtodock.top #dash {
|
||||
border-top: 0px;
|
||||
}
|
||||
|
||||
#dashtodockContainer.shrink.bottom #dash,
|
||||
#dashtodockContainer.dashtodock.bottom #dash {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
#dashtodockContainer.straight-corner #dash,
|
||||
#dashtodockContainer.shrink.straight-corner #dash {
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
/* Scrollview style */
|
||||
.bottom #dashtodockDashScrollview,
|
||||
.top #dashtodockDashScrollview {
|
||||
-st-hfade-offset: 24px;
|
||||
}
|
||||
|
||||
.left #dashtodockDashScrollview,
|
||||
.right #dashtodockDashScrollview {
|
||||
-st-vfade-offset: 24px;
|
||||
}
|
||||
|
||||
#dashtodockContainer.running-dots .dash-item-container > StButton,
|
||||
#dashtodockContainer.dashtodock .dash-item-container > StButton {
|
||||
transition-duration: 250;
|
||||
background-size: contain;
|
||||
}
|
||||
|
||||
#dashtodockContainer.shrink .dash-item-container > StButton,
|
||||
#dashtodockContainer.dashtodock .dash-item-container > StButton {
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
/* Dash height extended to the whole available vertical space */
|
||||
#dashtodockContainer.extended.top #dash,
|
||||
#dashtodockContainer.extended.right #dash,
|
||||
#dashtodockContainer.extended.bottom #dash,
|
||||
#dashtodockContainer.extended.left #dash {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
#dashtodockContainer.extended.top #dash,
|
||||
#dashtodockContainer.extended.bottom #dash {
|
||||
border-left:0px;
|
||||
border-right:0px;
|
||||
}
|
||||
|
||||
#dashtodockContainer.extended.right #dash,
|
||||
#dashtodockContainer.extended.left #dash {
|
||||
border-top:0px;
|
||||
border-bottom:0px;
|
||||
}
|
||||
|
||||
/* Running and focused application style */
|
||||
|
||||
#dashtodockContainer.running-dots .app-well-app.running > .overview-icon,
|
||||
#dashtodockContainer.dashtodock .app-well-app.running > .overview-icon {
|
||||
background-image:none;
|
||||
}
|
||||
|
||||
|
||||
#dashtodockContainer.running-dots .app-well-app.focused .overview-icon,
|
||||
#dashtodockContainer.dashtodock .app-well-app.focused .overview-icon {
|
||||
background-color: rgba(238, 238, 236, 0.2);
|
||||
}
|
||||
|
||||
#dashtodockContainer.dashtodock #dash {
|
||||
background: #2e3436;
|
||||
}
|
||||
|
||||
#dashtodockContainer.dashtodock .progress-bar {
|
||||
/* Customization of the progress bar style, e.g.:
|
||||
-progress-bar-background: rgba(0.8, 0.8, 0.8, 1);
|
||||
-progress-bar-border: rgba(0.9, 0.9, 0.9, 1);
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* This is applied to a dummy actor. Only the alpha value for the background and border color
|
||||
* and the transition-duration are used
|
||||
*/
|
||||
#dashtodockContainer.dummy-opaque {
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
border-color: rgba(0, 0, 0, 0.4);
|
||||
transition-duration: 300ms;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is applied to a dummy actor. Only the alpha value for the background and border color
|
||||
* and the transition-duration are used
|
||||
*/
|
||||
#dashtodockContainer.dummy-transparent {
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
border-color: rgba(0, 0, 0, 0.1);
|
||||
transition-duration: 500ms;
|
||||
}
|
||||
|
||||
#dashtodockContainer.opaque {
|
||||
}
|
||||
|
||||
#dashtodockContainer.transparent {
|
||||
}
|
||||
|
||||
#dashtodockContainer .number-overlay {
|
||||
color: rgba(255,255,255,1);
|
||||
background-color: rgba(0,0,0,0.8);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#dashtodockContainer .notification-badge {
|
||||
color: rgba(255,255,255,1);
|
||||
background-color: rgba(255,0,0,1.0);
|
||||
padding: 0.2em 0.5em;
|
||||
border-radius: 1em;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
#dashtodockPreviewSeparator.popup-separator-menu-item-horizontal {
|
||||
width: 1px;
|
||||
height: auto;
|
||||
border-right-width: 1px;
|
||||
margin: 32px 0px;
|
||||
}
|
||||
|
||||
.dashtodock-app-well-preview-menu-item {
|
||||
padding: 1em 1em 0.5em 1em;
|
||||
}
|
||||
|
||||
#dashtodockContainer .metro .overview-icon{
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
#dashtodockContainer.bottom .metro.running2.focused,
|
||||
#dashtodockContainer.bottom .metro.running3.focused,
|
||||
#dashtodockContainer.bottom .metro.running4.focused,
|
||||
#dashtodockContainer.top .metro.running2.focused,
|
||||
#dashtodockContainer.top .metro.running3.focused,
|
||||
#dashtodockContainer.top .metro.running4.focused {
|
||||
background-image: url('./media/highlight_stacked_bg.svg');
|
||||
background-position: 0px 0px;
|
||||
background-size: contain;
|
||||
}
|
||||
|
||||
#dashtodockContainer.left .metro.running2.focused,
|
||||
#dashtodockContainer.left .metro.running3.focused,
|
||||
#dashtodockContainer.left .metro.running4.focused,
|
||||
#dashtodockContainer.right .metro.running2.focused,
|
||||
#dashtodockContainer.right .metro.running3.focused,
|
||||
#dashtodockContainer.right .metro.running4.focused {
|
||||
background-image: url('./media/highlight_stacked_bg_h.svg');
|
||||
background-position: 0px 0px;
|
||||
background-size: contain;
|
||||
}
|
|
@ -1,572 +0,0 @@
|
|||
// -*- 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 Gtk = imports.gi.Gtk;
|
||||
const Signals = imports.signals;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const AppFavorites = imports.ui.appFavorites;
|
||||
const Dash = imports.ui.dash;
|
||||
const DND = imports.ui.dnd;
|
||||
const IconGrid = imports.ui.iconGrid;
|
||||
const Main = imports.ui.main;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Util = imports.misc.util;
|
||||
const Workspace = imports.ui.workspace;
|
||||
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const Docking = Me.imports.docking;
|
||||
const Utils = Me.imports.utils;
|
||||
|
||||
/*
|
||||
* DEFAULT: transparency given by theme
|
||||
* FIXED: constant transparency chosen by user
|
||||
* DYNAMIC: apply 'transparent' style when no windows are close to the dock
|
||||
* */
|
||||
const TransparencyMode = {
|
||||
DEFAULT: 0,
|
||||
FIXED: 1,
|
||||
DYNAMIC: 3
|
||||
};
|
||||
|
||||
/**
|
||||
* Manage theme customization and custom theme support
|
||||
*/
|
||||
var ThemeManager = class DashToDock_ThemeManager {
|
||||
|
||||
constructor(dock) {
|
||||
this._signalsHandler = new Utils.GlobalSignalsHandler();
|
||||
this._bindSettingsChanges();
|
||||
this._actor = dock;
|
||||
this._dash = dock.dash;
|
||||
|
||||
// initialize colors with generic values
|
||||
this._customizedBackground = {red: 0, green: 0, blue: 0, alpha: 0};
|
||||
this._customizedBorder = {red: 0, green: 0, blue: 0, alpha: 0};
|
||||
this._transparency = new Transparency(dock);
|
||||
|
||||
this._signalsHandler.add([
|
||||
// When theme changes re-obtain default background color
|
||||
St.ThemeContext.get_for_stage (global.stage),
|
||||
'changed',
|
||||
this.updateCustomTheme.bind(this)
|
||||
], [
|
||||
// update :overview pseudoclass
|
||||
Main.overview,
|
||||
'showing',
|
||||
this._onOverviewShowing.bind(this)
|
||||
], [
|
||||
Main.overview,
|
||||
'hiding',
|
||||
this._onOverviewHiding.bind(this)
|
||||
]);
|
||||
|
||||
this._updateCustomStyleClasses();
|
||||
|
||||
// destroy themeManager when the managed actor is destroyed (e.g. extension unload)
|
||||
// in order to disconnect signals
|
||||
this._actor.connect('destroy', this.destroy.bind(this));
|
||||
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._signalsHandler.destroy();
|
||||
this._transparency.destroy();
|
||||
}
|
||||
|
||||
_onOverviewShowing() {
|
||||
this._actor.add_style_pseudo_class('overview');
|
||||
}
|
||||
|
||||
_onOverviewHiding() {
|
||||
this._actor.remove_style_pseudo_class('overview');
|
||||
}
|
||||
|
||||
_updateDashOpacity() {
|
||||
let newAlpha = Docking.DockManager.settings.get_double('background-opacity');
|
||||
|
||||
let [backgroundColor, borderColor] = this._getDefaultColors();
|
||||
|
||||
if (backgroundColor==null)
|
||||
return;
|
||||
|
||||
// Get the background and border alphas. We check the background alpha
|
||||
// for a minimum of .001 to prevent division by 0 errors
|
||||
let backgroundAlpha = Math.max(Math.round(backgroundColor.alpha/2.55)/100, .001);
|
||||
let borderAlpha = Math.round(borderColor.alpha/2.55)/100;
|
||||
|
||||
// The border and background alphas should remain in sync
|
||||
// We also limit the borderAlpha to a maximum of 1 (full opacity)
|
||||
borderAlpha = Math.min((borderAlpha/backgroundAlpha)*newAlpha, 1);
|
||||
|
||||
this._customizedBackground = 'rgba(' +
|
||||
backgroundColor.red + ',' +
|
||||
backgroundColor.green + ',' +
|
||||
backgroundColor.blue + ',' +
|
||||
newAlpha + ')';
|
||||
|
||||
this._customizedBorder = 'rgba(' +
|
||||
borderColor.red + ',' +
|
||||
borderColor.green + ',' +
|
||||
borderColor.blue + ',' +
|
||||
borderAlpha + ')';
|
||||
|
||||
}
|
||||
|
||||
_getDefaultColors() {
|
||||
// Prevent shell crash if the actor is not on the stage.
|
||||
// It happens enabling/disabling repeatedly the extension
|
||||
if (!this._dash._container.get_stage())
|
||||
return [null, null];
|
||||
|
||||
// Remove custom style
|
||||
let oldStyle = this._dash._container.get_style();
|
||||
this._dash._container.set_style(null);
|
||||
|
||||
let themeNode = this._dash._container.get_theme_node();
|
||||
this._dash._container.set_style(oldStyle);
|
||||
|
||||
let backgroundColor = themeNode.get_background_color();
|
||||
|
||||
// Just in case the theme has different border colors ..
|
||||
// We want to find the inside border-color of the dock because it is
|
||||
// the side most visible to the user. We do this by finding the side
|
||||
// opposite the position
|
||||
let position = Utils.getPosition();
|
||||
let side = position + 2;
|
||||
if (side > 3)
|
||||
side = Math.abs(side - 4);
|
||||
|
||||
let borderColor = themeNode.get_border_color(side);
|
||||
|
||||
return [backgroundColor, borderColor];
|
||||
}
|
||||
|
||||
_updateDashColor() {
|
||||
// Retrieve the color. If needed we will adjust it before passing it to
|
||||
// this._transparency.
|
||||
let [backgroundColor, borderColor] = this._getDefaultColors();
|
||||
|
||||
if (backgroundColor==null)
|
||||
return;
|
||||
|
||||
let settings = Docking.DockManager.settings;
|
||||
|
||||
if (settings.get_boolean('custom-background-color')) {
|
||||
// When applying a custom color, we need to check the alpha value,
|
||||
// if not the opacity will always be overridden by the color below.
|
||||
// Note that if using 'dynamic' transparency modes,
|
||||
// the opacity will be set by the opaque/transparent styles anyway.
|
||||
let newAlpha = Math.round(backgroundColor.alpha/2.55)/100;
|
||||
if (settings.get_enum('transparency-mode') == TransparencyMode.FIXED)
|
||||
newAlpha = settings.get_double('background-opacity');
|
||||
|
||||
backgroundColor = Clutter.color_from_string(settings.get_string('background-color'))[1];
|
||||
this._customizedBackground = 'rgba(' +
|
||||
backgroundColor.red + ',' +
|
||||
backgroundColor.green + ',' +
|
||||
backgroundColor.blue + ',' +
|
||||
newAlpha + ')';
|
||||
|
||||
this._customizedBorder = this._customizedBackground;
|
||||
}
|
||||
this._transparency.setColor(backgroundColor);
|
||||
}
|
||||
|
||||
_updateCustomStyleClasses() {
|
||||
let settings = Docking.DockManager.settings;
|
||||
|
||||
if (settings.get_boolean('apply-custom-theme'))
|
||||
this._actor.add_style_class_name('dashtodock');
|
||||
else
|
||||
this._actor.remove_style_class_name('dashtodock');
|
||||
|
||||
if (settings.get_boolean('custom-theme-shrink'))
|
||||
this._actor.add_style_class_name('shrink');
|
||||
else
|
||||
this._actor.remove_style_class_name('shrink');
|
||||
|
||||
if (settings.get_enum('running-indicator-style') !== 0)
|
||||
this._actor.add_style_class_name('running-dots');
|
||||
else
|
||||
this._actor.remove_style_class_name('running-dots');
|
||||
|
||||
// If not the built-in theme option is not selected
|
||||
if (!settings.get_boolean('apply-custom-theme')) {
|
||||
if (settings.get_boolean('force-straight-corner'))
|
||||
this._actor.add_style_class_name('straight-corner');
|
||||
else
|
||||
this._actor.remove_style_class_name('straight-corner');
|
||||
} else {
|
||||
this._actor.remove_style_class_name('straight-corner');
|
||||
}
|
||||
}
|
||||
|
||||
updateCustomTheme() {
|
||||
this._updateCustomStyleClasses();
|
||||
this._updateDashOpacity();
|
||||
this._updateDashColor();
|
||||
this._adjustTheme();
|
||||
this._dash._redisplay();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reimported back and adapted from atomdock
|
||||
*/
|
||||
_adjustTheme() {
|
||||
// Prevent shell crash if the actor is not on the stage.
|
||||
// It happens enabling/disabling repeatedly the extension
|
||||
if (!this._dash._container.get_stage())
|
||||
return;
|
||||
|
||||
let settings = Docking.DockManager.settings;
|
||||
|
||||
// Remove prior style edits
|
||||
this._dash._container.set_style(null);
|
||||
this._transparency.disable();
|
||||
|
||||
// If built-in theme is enabled do nothing else
|
||||
if (settings.get_boolean('apply-custom-theme'))
|
||||
return;
|
||||
|
||||
let newStyle = '';
|
||||
let position = Utils.getPosition(settings);
|
||||
|
||||
// obtain theme border settings
|
||||
let themeNode = this._dash._container.get_theme_node();
|
||||
let borderColor = themeNode.get_border_color(St.Side.TOP);
|
||||
let borderWidth = themeNode.get_border_width(St.Side.TOP);
|
||||
let borderRadius = themeNode.get_border_radius(St.Corner.TOPRIGHT);
|
||||
|
||||
// We're copying border and corner styles to left border and top-left
|
||||
// corner, also removing bottom border and bottom-right corner styles
|
||||
let borderInner = '';
|
||||
let borderRadiusValue = '';
|
||||
let borderMissingStyle = '';
|
||||
|
||||
if (this._rtl && (position != St.Side.RIGHT))
|
||||
borderMissingStyle = 'border-right: ' + borderWidth + 'px solid ' +
|
||||
borderColor.to_string() + ';';
|
||||
else if (!this._rtl && (position != St.Side.LEFT))
|
||||
borderMissingStyle = 'border-left: ' + borderWidth + 'px solid ' +
|
||||
borderColor.to_string() + ';';
|
||||
|
||||
switch (position) {
|
||||
case St.Side.LEFT:
|
||||
borderInner = 'border-left';
|
||||
borderRadiusValue = '0 ' + borderRadius + 'px ' + borderRadius + 'px 0;';
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
borderInner = 'border-right';
|
||||
borderRadiusValue = borderRadius + 'px 0 0 ' + borderRadius + 'px;';
|
||||
break;
|
||||
case St.Side.TOP:
|
||||
borderInner = 'border-top';
|
||||
borderRadiusValue = '0 0 ' + borderRadius + 'px ' + borderRadius + 'px;';
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
borderInner = 'border-bottom';
|
||||
borderRadiusValue = borderRadius + 'px ' + borderRadius + 'px 0 0;';
|
||||
break;
|
||||
}
|
||||
|
||||
newStyle = borderInner + ': none;' +
|
||||
'border-radius: ' + borderRadiusValue +
|
||||
borderMissingStyle;
|
||||
|
||||
// I do call set_style possibly twice so that only the background gets the transition.
|
||||
// The transition-property css rules seems to be unsupported
|
||||
this._dash._container.set_style(newStyle);
|
||||
|
||||
// Customize background
|
||||
let fixedTransparency = settings.get_enum('transparency-mode') == TransparencyMode.FIXED;
|
||||
let defaultTransparency = settings.get_enum('transparency-mode') == TransparencyMode.DEFAULT;
|
||||
if (!defaultTransparency && !fixedTransparency) {
|
||||
this._transparency.enable();
|
||||
}
|
||||
else if (!defaultTransparency || settings.get_boolean('custom-background-color')) {
|
||||
newStyle = newStyle + 'background-color:'+ this._customizedBackground + '; ' +
|
||||
'border-color:'+ this._customizedBorder + '; ' +
|
||||
'transition-delay: 0s; transition-duration: 0.250s;';
|
||||
this._dash._container.set_style(newStyle);
|
||||
}
|
||||
}
|
||||
|
||||
_bindSettingsChanges() {
|
||||
let keys = ['transparency-mode',
|
||||
'customize-alphas',
|
||||
'min-alpha',
|
||||
'max-alpha',
|
||||
'background-opacity',
|
||||
'custom-background-color',
|
||||
'background-color',
|
||||
'apply-custom-theme',
|
||||
'custom-theme-shrink',
|
||||
'custom-theme-running-dots',
|
||||
'extend-height',
|
||||
'force-straight-corner'];
|
||||
|
||||
keys.forEach(function(key) {
|
||||
this._signalsHandler.add([
|
||||
Docking.DockManager.settings,
|
||||
'changed::' + key,
|
||||
this.updateCustomTheme.bind(this)
|
||||
]);
|
||||
}, this);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* The following class is based on the following upstream commit:
|
||||
* https://git.gnome.org/browse/gnome-shell/commit/?id=447bf55e45b00426ed908b1b1035f472c2466956
|
||||
* Transparency when free-floating
|
||||
*/
|
||||
var Transparency = class DashToDock_Transparency {
|
||||
|
||||
constructor(dock) {
|
||||
this._dash = dock.dash;
|
||||
this._actor = this._dash._container;
|
||||
this._dockActor = dock;
|
||||
this._dock = dock;
|
||||
this._panel = Main.panel;
|
||||
this._position = Utils.getPosition();
|
||||
|
||||
// All these properties are replaced with the ones in the .dummy-opaque and .dummy-transparent css classes
|
||||
this._backgroundColor = '0,0,0';
|
||||
this._transparentAlpha = '0.2';
|
||||
this._opaqueAlpha = '1';
|
||||
this._transparentAlphaBorder = '0.1';
|
||||
this._opaqueAlphaBorder = '0.5';
|
||||
this._transparentTransition = '0ms';
|
||||
this._opaqueTransition = '0ms';
|
||||
this._base_actor_style = "";
|
||||
|
||||
this._signalsHandler = new Utils.GlobalSignalsHandler();
|
||||
this._injectionsHandler = new Utils.InjectionsHandler();
|
||||
this._trackedWindows = new Map();
|
||||
}
|
||||
|
||||
enable() {
|
||||
// ensure I never double-register/inject
|
||||
// although it should never happen
|
||||
this.disable();
|
||||
|
||||
this._base_actor_style = this._actor.get_style();
|
||||
if (this._base_actor_style == null) {
|
||||
this._base_actor_style = "";
|
||||
}
|
||||
|
||||
this._signalsHandler.addWithLabel('transparency', [
|
||||
global.window_group,
|
||||
'actor-added',
|
||||
this._onWindowActorAdded.bind(this)
|
||||
], [
|
||||
global.window_group,
|
||||
'actor-removed',
|
||||
this._onWindowActorRemoved.bind(this)
|
||||
], [
|
||||
global.window_manager,
|
||||
'switch-workspace',
|
||||
this._updateSolidStyle.bind(this)
|
||||
], [
|
||||
Main.overview,
|
||||
'hiding',
|
||||
this._updateSolidStyle.bind(this)
|
||||
], [
|
||||
Main.overview,
|
||||
'showing',
|
||||
this._updateSolidStyle.bind(this)
|
||||
]);
|
||||
|
||||
// Window signals
|
||||
global.window_group.get_children().filter(function(child) {
|
||||
// An irrelevant window actor ('Gnome-shell') produces an error when the signals are
|
||||
// disconnected, therefore do not add signals to it.
|
||||
return child instanceof Meta.WindowActor &&
|
||||
child.get_meta_window().get_wm_class() !== 'Gnome-shell';
|
||||
}).forEach(function(win) {
|
||||
this._onWindowActorAdded(null, win);
|
||||
}, this);
|
||||
|
||||
if (this._actor.get_stage())
|
||||
this._updateSolidStyle();
|
||||
|
||||
this._updateStyles();
|
||||
this._updateSolidStyle();
|
||||
|
||||
this.emit('transparency-enabled');
|
||||
}
|
||||
|
||||
disable() {
|
||||
// ensure I never double-register/inject
|
||||
// although it should never happen
|
||||
this._signalsHandler.removeWithLabel('transparency');
|
||||
|
||||
for (let key of this._trackedWindows.keys())
|
||||
this._trackedWindows.get(key).forEach(id => {
|
||||
key.disconnect(id);
|
||||
});
|
||||
this._trackedWindows.clear();
|
||||
|
||||
this.emit('transparency-disabled');
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.disable();
|
||||
this._signalsHandler.destroy();
|
||||
this._injectionsHandler.destroy();
|
||||
}
|
||||
|
||||
_onWindowActorAdded(container, metaWindowActor) {
|
||||
let signalIds = [];
|
||||
['allocation-changed', 'notify::visible'].forEach(s => {
|
||||
signalIds.push(metaWindowActor.connect(s, this._updateSolidStyle.bind(this)));
|
||||
});
|
||||
this._trackedWindows.set(metaWindowActor, signalIds);
|
||||
}
|
||||
|
||||
_onWindowActorRemoved(container, metaWindowActor) {
|
||||
if (!this._trackedWindows.get(metaWindowActor))
|
||||
return;
|
||||
|
||||
this._trackedWindows.get(metaWindowActor).forEach(id => {
|
||||
metaWindowActor.disconnect(id);
|
||||
});
|
||||
this._trackedWindows.delete(metaWindowActor);
|
||||
this._updateSolidStyle();
|
||||
}
|
||||
|
||||
_updateSolidStyle() {
|
||||
let isNear = this._dockIsNear();
|
||||
if (isNear) {
|
||||
this._actor.set_style(this._opaque_style);
|
||||
this._dockActor.remove_style_class_name('transparent');
|
||||
this._dockActor.add_style_class_name('opaque');
|
||||
}
|
||||
else {
|
||||
this._actor.set_style(this._transparent_style);
|
||||
this._dockActor.remove_style_class_name('opaque');
|
||||
this._dockActor.add_style_class_name('transparent');
|
||||
}
|
||||
|
||||
this.emit('solid-style-updated', isNear);
|
||||
}
|
||||
|
||||
_dockIsNear() {
|
||||
if (this._dockActor.has_style_pseudo_class('overview'))
|
||||
return false;
|
||||
/* Get all the windows in the active workspace that are in the primary monitor and visible */
|
||||
let activeWorkspace = global.workspace_manager.get_active_workspace();
|
||||
let dash = this._dash;
|
||||
let windows = activeWorkspace.list_windows().filter(function(metaWindow) {
|
||||
return metaWindow.get_monitor() === dash._monitorIndex &&
|
||||
metaWindow.showing_on_its_workspace() &&
|
||||
metaWindow.get_window_type() != Meta.WindowType.DESKTOP;
|
||||
});
|
||||
|
||||
/* Check if at least one window is near enough to the panel.
|
||||
* If the dock is hidden, we need to account for the space it would take
|
||||
* up when it slides out. This is avoid an ugly transition.
|
||||
* */
|
||||
let factor = 0;
|
||||
if (!Docking.DockManager.settings.get_boolean('dock-fixed') &&
|
||||
this._dock.getDockState() == Docking.State.HIDDEN)
|
||||
factor = 1;
|
||||
let [leftCoord, topCoord] = this._actor.get_transformed_position();
|
||||
let threshold;
|
||||
if (this._position === St.Side.LEFT)
|
||||
threshold = leftCoord + this._actor.get_width() * (factor + 1);
|
||||
else if (this._position === St.Side.RIGHT)
|
||||
threshold = leftCoord - this._actor.get_width() * factor;
|
||||
else if (this._position === St.Side.TOP)
|
||||
threshold = topCoord + this._actor.get_height() * (factor + 1);
|
||||
else
|
||||
threshold = topCoord - this._actor.get_height() * factor;
|
||||
|
||||
let scale = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
let isNearEnough = windows.some((metaWindow) => {
|
||||
let coord;
|
||||
if (this._position === St.Side.LEFT) {
|
||||
coord = metaWindow.get_frame_rect().x;
|
||||
return coord < threshold + 5 * scale;
|
||||
}
|
||||
else if (this._position === St.Side.RIGHT) {
|
||||
coord = metaWindow.get_frame_rect().x + metaWindow.get_frame_rect().width;
|
||||
return coord > threshold - 5 * scale;
|
||||
}
|
||||
else if (this._position === St.Side.TOP) {
|
||||
coord = metaWindow.get_frame_rect().y;
|
||||
return coord < threshold + 5 * scale;
|
||||
}
|
||||
else {
|
||||
coord = metaWindow.get_frame_rect().y + metaWindow.get_frame_rect().height;
|
||||
return coord > threshold - 5 * scale;
|
||||
}
|
||||
});
|
||||
|
||||
return isNearEnough;
|
||||
}
|
||||
|
||||
_updateStyles() {
|
||||
this._getAlphas();
|
||||
|
||||
this._transparent_style = this._base_actor_style +
|
||||
'background-color: rgba(' +
|
||||
this._backgroundColor + ', ' + this._transparentAlpha + ');' +
|
||||
'border-color: rgba(' +
|
||||
this._backgroundColor + ', ' + this._transparentAlphaBorder + ');' +
|
||||
'transition-duration: ' + this._transparentTransition + 'ms;';
|
||||
|
||||
this._opaque_style = this._base_actor_style +
|
||||
'background-color: rgba(' +
|
||||
this._backgroundColor + ', ' + this._opaqueAlpha + ');' +
|
||||
'border-color: rgba(' +
|
||||
this._backgroundColor + ',' + this._opaqueAlphaBorder + ');' +
|
||||
'transition-duration: ' + this._opaqueTransition + 'ms;';
|
||||
|
||||
this.emit('styles-updated');
|
||||
}
|
||||
|
||||
setColor(color) {
|
||||
this._backgroundColor = color.red + ',' + color.green + ',' + color.blue;
|
||||
this._updateStyles();
|
||||
}
|
||||
|
||||
_getAlphas() {
|
||||
// Create dummy object and add to the uiGroup to get it to the stage
|
||||
let dummyObject = new St.Bin({
|
||||
name: 'dashtodockContainer',
|
||||
});
|
||||
Main.uiGroup.add_child(dummyObject);
|
||||
|
||||
dummyObject.add_style_class_name('dummy-opaque');
|
||||
let themeNode = dummyObject.get_theme_node();
|
||||
this._opaqueAlpha = themeNode.get_background_color().alpha / 255;
|
||||
this._opaqueAlphaBorder = themeNode.get_border_color(0).alpha / 255;
|
||||
this._opaqueTransition = themeNode.get_transition_duration();
|
||||
|
||||
dummyObject.add_style_class_name('dummy-transparent');
|
||||
themeNode = dummyObject.get_theme_node();
|
||||
this._transparentAlpha = themeNode.get_background_color().alpha / 255;
|
||||
this._transparentAlphaBorder = themeNode.get_border_color(0).alpha / 255;
|
||||
this._transparentTransition = themeNode.get_transition_duration();
|
||||
|
||||
Main.uiGroup.remove_child(dummyObject);
|
||||
|
||||
let settings = Docking.DockManager.settings;
|
||||
|
||||
if (settings.get_boolean('customize-alphas')) {
|
||||
this._opaqueAlpha = settings.get_double('max-alpha');
|
||||
this._opaqueAlphaBorder = this._opaqueAlpha / 2;
|
||||
this._transparentAlpha = settings.get_double('min-alpha');
|
||||
this._transparentAlphaBorder = this._transparentAlpha / 2;
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Transparency.prototype);
|
|
@ -1,284 +0,0 @@
|
|||
const Clutter = imports.gi.Clutter;
|
||||
const Meta = imports.gi.Meta;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const Docking = Me.imports.docking;
|
||||
|
||||
var SignalsHandlerFlags = {
|
||||
NONE: 0,
|
||||
CONNECT_AFTER: 1
|
||||
};
|
||||
|
||||
/**
|
||||
* Simplify global signals and function injections handling
|
||||
* abstract class
|
||||
*/
|
||||
const BasicHandler = class DashToDock_BasicHandler {
|
||||
|
||||
constructor() {
|
||||
this._storage = new Object();
|
||||
}
|
||||
|
||||
add(/* unlimited 3-long array arguments */) {
|
||||
// Convert arguments object to array, concatenate with generic
|
||||
let args = Array.concat('generic', Array.slice(arguments));
|
||||
// Call addWithLabel with ags as if they were passed arguments
|
||||
this.addWithLabel.apply(this, args);
|
||||
}
|
||||
|
||||
destroy() {
|
||||
for( let label in this._storage )
|
||||
this.removeWithLabel(label);
|
||||
}
|
||||
|
||||
addWithLabel(label /* plus unlimited 3-long array arguments*/) {
|
||||
if (this._storage[label] == undefined)
|
||||
this._storage[label] = new Array();
|
||||
|
||||
// Skip first element of the arguments
|
||||
for (let i = 1; i < arguments.length; i++) {
|
||||
let item = this._storage[label];
|
||||
try {
|
||||
item.push(this._create(arguments[i]));
|
||||
} catch (e) {
|
||||
logError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
removeWithLabel(label) {
|
||||
if (this._storage[label]) {
|
||||
for (let i = 0; i < this._storage[label].length; i++)
|
||||
this._remove(this._storage[label][i]);
|
||||
|
||||
delete this._storage[label];
|
||||
}
|
||||
}
|
||||
|
||||
// Virtual methods to be implemented by subclass
|
||||
|
||||
/**
|
||||
* Create single element to be stored in the storage structure
|
||||
*/
|
||||
_create(item) {
|
||||
throw new GObject.NotImplementedError(`_create in ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Correctly delete single element
|
||||
*/
|
||||
_remove(item) {
|
||||
throw new GObject.NotImplementedError(`_remove in ${this.constructor.name}`);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Manage global signals
|
||||
*/
|
||||
var GlobalSignalsHandler = class DashToDock_GlobalSignalHandler extends BasicHandler {
|
||||
|
||||
_create(item) {
|
||||
let object = item[0];
|
||||
let event = item[1];
|
||||
let callback = item[2]
|
||||
let flags = item.length > 3 ? item[3] : SignalsHandlerFlags.NONE;
|
||||
|
||||
if (!object)
|
||||
throw new Error('Impossible to connect to an invalid object');
|
||||
|
||||
let after = flags == SignalsHandlerFlags.CONNECT_AFTER;
|
||||
let connector = after ? object.connect_after : object.connect;
|
||||
|
||||
if (!connector) {
|
||||
throw new Error(`Requested to connect to signal '${event}', ` +
|
||||
`but no implementation for 'connect${after ? '_after' : ''}' `+
|
||||
`found in ${object.constructor.name}`);
|
||||
}
|
||||
|
||||
let id = connector.call(object, event, callback);
|
||||
|
||||
return [object, id];
|
||||
}
|
||||
|
||||
_remove(item) {
|
||||
item[0].disconnect(item[1]);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Color manipulation utilities
|
||||
*/
|
||||
var ColorUtils = class DashToDock_ColorUtils {
|
||||
|
||||
// Darken or brigthen color by a fraction dlum
|
||||
// Each rgb value is modified by the same fraction.
|
||||
// Return "#rrggbb" string
|
||||
static ColorLuminance(r, g, b, dlum) {
|
||||
let rgbString = '#';
|
||||
|
||||
rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2);
|
||||
rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2);
|
||||
rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2);
|
||||
|
||||
return rgbString;
|
||||
}
|
||||
|
||||
// Convert decimal to an hexadecimal string adding the desired padding
|
||||
static _decimalToHex(d, padding) {
|
||||
let hex = d.toString(16);
|
||||
while (hex.length < padding)
|
||||
hex = '0'+ hex;
|
||||
return hex;
|
||||
}
|
||||
|
||||
// Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]).
|
||||
// Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV
|
||||
// here with h = [0,1] instead of [0, 360]
|
||||
// Accept either (h,s,v) independently or {h:h, s:s, v:v} object.
|
||||
// Return {r:r, g:g, b:b} object.
|
||||
static HSVtoRGB(h, s, v) {
|
||||
if (arguments.length === 1) {
|
||||
s = h.s;
|
||||
v = h.v;
|
||||
h = h.h;
|
||||
}
|
||||
|
||||
let r,g,b;
|
||||
let c = v*s;
|
||||
let h1 = h*6;
|
||||
let x = c*(1 - Math.abs(h1 % 2 - 1));
|
||||
let m = v - c;
|
||||
|
||||
if (h1 <=1)
|
||||
r = c + m, g = x + m, b = m;
|
||||
else if (h1 <=2)
|
||||
r = x + m, g = c + m, b = m;
|
||||
else if (h1 <=3)
|
||||
r = m, g = c + m, b = x + m;
|
||||
else if (h1 <=4)
|
||||
r = m, g = x + m, b = c + m;
|
||||
else if (h1 <=5)
|
||||
r = x + m, g = m, b = c + m;
|
||||
else
|
||||
r = c + m, g = m, b = x + m;
|
||||
|
||||
return {
|
||||
r: Math.round(r * 255),
|
||||
g: Math.round(g * 255),
|
||||
b: Math.round(b * 255)
|
||||
};
|
||||
}
|
||||
|
||||
// Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]).
|
||||
// Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV
|
||||
// here with h = [0,1] instead of [0, 360]
|
||||
// Accept either (r,g,b) independently or {r:r, g:g, b:b} object.
|
||||
// Return {h:h, s:s, v:v} object.
|
||||
static RGBtoHSV(r, g, b) {
|
||||
if (arguments.length === 1) {
|
||||
r = r.r;
|
||||
g = r.g;
|
||||
b = r.b;
|
||||
}
|
||||
|
||||
let h,s,v;
|
||||
|
||||
let M = Math.max(r, g, b);
|
||||
let m = Math.min(r, g, b);
|
||||
let c = M - m;
|
||||
|
||||
if (c == 0)
|
||||
h = 0;
|
||||
else if (M == r)
|
||||
h = ((g-b)/c) % 6;
|
||||
else if (M == g)
|
||||
h = (b-r)/c + 2;
|
||||
else
|
||||
h = (r-g)/c + 4;
|
||||
|
||||
h = h/6;
|
||||
v = M/255;
|
||||
if (M !== 0)
|
||||
s = c/M;
|
||||
else
|
||||
s = 0;
|
||||
|
||||
return {
|
||||
h: h,
|
||||
s: s,
|
||||
v: v
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Manage function injection: both instances and prototype can be overridden
|
||||
* and restored
|
||||
*/
|
||||
var InjectionsHandler = class DashToDock_InjectionsHandler extends BasicHandler {
|
||||
|
||||
_create(item) {
|
||||
let object = item[0];
|
||||
let name = item[1];
|
||||
let injectedFunction = item[2];
|
||||
let original = object[name];
|
||||
|
||||
object[name] = injectedFunction;
|
||||
return [object, name, injectedFunction, original];
|
||||
}
|
||||
|
||||
_remove(item) {
|
||||
let object = item[0];
|
||||
let name = item[1];
|
||||
let original = item[3];
|
||||
object[name] = original;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the actual position reverseing left and right in rtl
|
||||
*/
|
||||
function getPosition() {
|
||||
let position = Docking.DockManager.settings.get_enum('dock-position');
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||
if (position == St.Side.LEFT)
|
||||
position = St.Side.RIGHT;
|
||||
else if (position == St.Side.RIGHT)
|
||||
position = St.Side.LEFT;
|
||||
}
|
||||
return position;
|
||||
}
|
||||
|
||||
function drawRoundedLine(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) {
|
||||
if (height > width) {
|
||||
y += Math.floor((height - width) / 2.0);
|
||||
height = width;
|
||||
}
|
||||
|
||||
height = 2.0 * Math.floor(height / 2.0);
|
||||
|
||||
var leftRadius = isRoundLeft ? height / 2.0 : 0.0;
|
||||
var rightRadius = isRoundRight ? height / 2.0 : 0.0;
|
||||
|
||||
cr.moveTo(x + width - rightRadius, y);
|
||||
cr.lineTo(x + leftRadius, y);
|
||||
if (isRoundLeft)
|
||||
cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2);
|
||||
else
|
||||
cr.lineTo(x, y + height);
|
||||
cr.lineTo(x + width - rightRadius, y + height);
|
||||
if (isRoundRight)
|
||||
cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2);
|
||||
else
|
||||
cr.lineTo(x + width, y);
|
||||
cr.closePath();
|
||||
|
||||
if (fill != null) {
|
||||
cr.setSource(fill);
|
||||
cr.fillPreserve();
|
||||
}
|
||||
if (stroke != null)
|
||||
cr.setSource(stroke);
|
||||
cr.stroke();
|
||||
}
|
|
@ -1,586 +0,0 @@
|
|||
/*
|
||||
* Credits:
|
||||
* This file is based on code from the Dash to Panel extension by Jason DeRose
|
||||
* and code from the Taskbar extension by Zorin OS
|
||||
* Some code was also adapted from the upstream Gnome Shell source code.
|
||||
*/
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const St = imports.gi.St;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Main = imports.ui.main;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
|
||||
const Params = imports.misc.params;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Workspace = imports.ui.workspace;
|
||||
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const Utils = Me.imports.utils;
|
||||
|
||||
const PREVIEW_MAX_WIDTH = 250;
|
||||
const PREVIEW_MAX_HEIGHT = 150;
|
||||
|
||||
const PREVIEW_ANIMATION_DURATION = 250;
|
||||
|
||||
var WindowPreviewMenu = class DashToDock_WindowPreviewMenu extends PopupMenu.PopupMenu {
|
||||
|
||||
constructor(source) {
|
||||
let side = Utils.getPosition();
|
||||
super(source.actor, 0.5, side);
|
||||
|
||||
// We want to keep the item hovered while the menu is up
|
||||
this.blockSourceEvents = true;
|
||||
|
||||
this._source = source;
|
||||
this._app = this._source.app;
|
||||
let monitorIndex = this._source.monitorIndex;
|
||||
|
||||
this.actor.add_style_class_name('app-well-menu');
|
||||
this.actor.set_style('max-width: ' + (Main.layoutManager.monitors[monitorIndex].width - 22) + 'px; ' +
|
||||
'max-height: ' + (Main.layoutManager.monitors[monitorIndex].height - 22) + 'px;');
|
||||
this.actor.hide();
|
||||
|
||||
// Chain our visibility and lifecycle to that of the source
|
||||
this._mappedId = this._source.actor.connect('notify::mapped', () => {
|
||||
if (!this._source.actor.mapped)
|
||||
this.close();
|
||||
});
|
||||
this._destroyId = this._source.actor.connect('destroy', this.destroy.bind(this));
|
||||
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
|
||||
// Change the initialized side where required.
|
||||
this._arrowSide = side;
|
||||
this._boxPointer._arrowSide = side;
|
||||
this._boxPointer._userArrowSide = side;
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
}
|
||||
|
||||
_redisplay() {
|
||||
if (this._previewBox)
|
||||
this._previewBox.destroy();
|
||||
this._previewBox = new WindowPreviewList(this._source);
|
||||
this.addMenuItem(this._previewBox);
|
||||
this._previewBox._redisplay();
|
||||
}
|
||||
|
||||
popup() {
|
||||
let windows = this._source.getInterestingWindows();
|
||||
if (windows.length > 0) {
|
||||
this._redisplay();
|
||||
this.open();
|
||||
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
this._source.emit('sync-tooltip');
|
||||
}
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
if (this._mappedId)
|
||||
this._source.actor.disconnect(this._mappedId);
|
||||
|
||||
if (this._destroyId)
|
||||
this._source.actor.disconnect(this._destroyId);
|
||||
}
|
||||
};
|
||||
|
||||
var WindowPreviewList = class DashToDock_WindowPreviewList extends PopupMenu.PopupMenuSection {
|
||||
|
||||
constructor(source) {
|
||||
super();
|
||||
this.actor = new St.ScrollView({ name: 'dashtodockWindowScrollview',
|
||||
hscrollbar_policy: Gtk.PolicyType.NEVER,
|
||||
vscrollbar_policy: Gtk.PolicyType.NEVER,
|
||||
enable_mouse_scrolling: true });
|
||||
|
||||
this.actor.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||
|
||||
let position = Utils.getPosition();
|
||||
this.isHorizontal = position == St.Side.BOTTOM || position == St.Side.TOP;
|
||||
this.box.set_vertical(!this.isHorizontal);
|
||||
this.box.set_name('dashtodockWindowList');
|
||||
this.actor.add_actor(this.box);
|
||||
this.actor._delegate = this;
|
||||
|
||||
this._shownInitially = false;
|
||||
|
||||
this._source = source;
|
||||
this.app = source.app;
|
||||
|
||||
this._redisplayId = Main.initializeDeferredWork(this.actor, this._redisplay.bind(this));
|
||||
|
||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||
this._stateChangedId = this.app.connect('windows-changed',
|
||||
this._queueRedisplay.bind(this));
|
||||
}
|
||||
|
||||
_queueRedisplay () {
|
||||
Main.queueDeferredWork(this._redisplayId);
|
||||
}
|
||||
|
||||
_onScrollEvent(actor, event) {
|
||||
// Event coordinates are relative to the stage but can be transformed
|
||||
// as the actor will only receive events within his bounds.
|
||||
let stage_x, stage_y, ok, event_x, event_y, actor_w, actor_h;
|
||||
[stage_x, stage_y] = event.get_coords();
|
||||
[ok, event_x, event_y] = actor.transform_stage_point(stage_x, stage_y);
|
||||
[actor_w, actor_h] = actor.get_size();
|
||||
|
||||
// If the scroll event is within a 1px margin from
|
||||
// the relevant edge of the actor, let the event propagate.
|
||||
if (event_y >= actor_h - 2)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
// Skip to avoid double events mouse
|
||||
if (event.is_pointer_emulated())
|
||||
return Clutter.EVENT_STOP;
|
||||
|
||||
let adjustment, delta;
|
||||
|
||||
if (this.isHorizontal)
|
||||
adjustment = this.actor.get_hscroll_bar().get_adjustment();
|
||||
else
|
||||
adjustment = this.actor.get_vscroll_bar().get_adjustment();
|
||||
|
||||
let increment = adjustment.step_increment;
|
||||
|
||||
switch ( event.get_scroll_direction() ) {
|
||||
case Clutter.ScrollDirection.UP:
|
||||
delta = -increment;
|
||||
break;
|
||||
case Clutter.ScrollDirection.DOWN:
|
||||
delta = +increment;
|
||||
break;
|
||||
case Clutter.ScrollDirection.SMOOTH:
|
||||
let [dx, dy] = event.get_scroll_delta();
|
||||
delta = dy*increment;
|
||||
delta += dx*increment;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
adjustment.set_value(adjustment.get_value() + delta);
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this.app.disconnect(this._stateChangedId);
|
||||
this._stateChangedId = 0;
|
||||
}
|
||||
|
||||
_createPreviewItem(window) {
|
||||
let preview = new WindowPreviewMenuItem(window);
|
||||
return preview;
|
||||
}
|
||||
|
||||
_redisplay () {
|
||||
let children = this._getMenuItems().filter(function(actor) {
|
||||
return actor._window;
|
||||
});
|
||||
|
||||
// Windows currently on the menu
|
||||
let oldWin = children.map(function(actor) {
|
||||
return actor._window;
|
||||
});
|
||||
|
||||
// All app windows with a static order
|
||||
let newWin = this._source.getInterestingWindows().sort(function(a, b) {
|
||||
return a.get_stable_sequence() > b.get_stable_sequence();
|
||||
});
|
||||
|
||||
let addedItems = [];
|
||||
let removedActors = [];
|
||||
|
||||
let newIndex = 0;
|
||||
let oldIndex = 0;
|
||||
|
||||
while (newIndex < newWin.length || oldIndex < oldWin.length) {
|
||||
// No change at oldIndex/newIndex
|
||||
if (oldWin[oldIndex] &&
|
||||
oldWin[oldIndex] == newWin[newIndex]) {
|
||||
oldIndex++;
|
||||
newIndex++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Window removed at oldIndex
|
||||
if (oldWin[oldIndex] &&
|
||||
newWin.indexOf(oldWin[oldIndex]) == -1) {
|
||||
removedActors.push(children[oldIndex]);
|
||||
oldIndex++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Window added at newIndex
|
||||
if (newWin[newIndex] &&
|
||||
oldWin.indexOf(newWin[newIndex]) == -1) {
|
||||
addedItems.push({ item: this._createPreviewItem(newWin[newIndex]),
|
||||
pos: newIndex });
|
||||
newIndex++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Window moved
|
||||
let insertHere = newWin[newIndex + 1] &&
|
||||
newWin[newIndex + 1] == oldWin[oldIndex];
|
||||
let alreadyRemoved = removedActors.reduce(function(result, actor) {
|
||||
let removedWin = actor._window;
|
||||
return result || removedWin == newWin[newIndex];
|
||||
}, false);
|
||||
|
||||
if (insertHere || alreadyRemoved) {
|
||||
addedItems.push({ item: this._createPreviewItem(newWin[newIndex]),
|
||||
pos: newIndex + removedActors.length });
|
||||
newIndex++;
|
||||
} else {
|
||||
removedActors.push(children[oldIndex]);
|
||||
oldIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < addedItems.length; i++)
|
||||
this.addMenuItem(addedItems[i].item,
|
||||
addedItems[i].pos);
|
||||
|
||||
for (let i = 0; i < removedActors.length; i++) {
|
||||
let item = removedActors[i];
|
||||
if (this._shownInitially)
|
||||
item._animateOutAndDestroy();
|
||||
else
|
||||
item.actor.destroy();
|
||||
}
|
||||
|
||||
// Skip animations on first run when adding the initial set
|
||||
// of items, to avoid all items zooming in at once
|
||||
let animate = this._shownInitially;
|
||||
|
||||
if (!this._shownInitially)
|
||||
this._shownInitially = true;
|
||||
|
||||
for (let i = 0; i < addedItems.length; i++)
|
||||
addedItems[i].item.show(animate);
|
||||
|
||||
// Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744
|
||||
// Without it, StBoxLayout may use a stale size cache
|
||||
this.box.queue_relayout();
|
||||
|
||||
if (newWin.length < 1)
|
||||
this._getTopMenu().close(~0);
|
||||
|
||||
// As for upstream:
|
||||
// St.ScrollView always requests space horizontally for a possible vertical
|
||||
// scrollbar if in AUTOMATIC mode. Doing better would require implementation
|
||||
// of width-for-height in St.BoxLayout and St.ScrollView. This looks bad
|
||||
// when we *don't* need it, so turn off the scrollbar when that's true.
|
||||
// Dynamic changes in whether we need it aren't handled properly.
|
||||
let needsScrollbar = this._needsScrollbar();
|
||||
let scrollbar_policy = needsScrollbar ? Gtk.PolicyType.AUTOMATIC : Gtk.PolicyType.NEVER;
|
||||
if (this.isHorizontal)
|
||||
this.actor.hscrollbar_policy = scrollbar_policy;
|
||||
else
|
||||
this.actor.vscrollbar_policy = scrollbar_policy;
|
||||
|
||||
if (needsScrollbar)
|
||||
this.actor.add_style_pseudo_class('scrolled');
|
||||
else
|
||||
this.actor.remove_style_pseudo_class('scrolled');
|
||||
}
|
||||
|
||||
_needsScrollbar() {
|
||||
let topMenu = this._getTopMenu();
|
||||
let topThemeNode = topMenu.actor.get_theme_node();
|
||||
if (this.isHorizontal) {
|
||||
let [topMinWidth, topNaturalWidth] = topMenu.actor.get_preferred_width(-1);
|
||||
let topMaxWidth = topThemeNode.get_max_width();
|
||||
return topMaxWidth >= 0 && topNaturalWidth >= topMaxWidth;
|
||||
} else {
|
||||
let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1);
|
||||
let topMaxHeight = topThemeNode.get_max_height();
|
||||
return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
isAnimatingOut() {
|
||||
return this.actor.get_children().reduce(function(result, actor) {
|
||||
return result || actor.animatingOut;
|
||||
}, false);
|
||||
}
|
||||
};
|
||||
|
||||
var WindowPreviewMenuItem = GObject.registerClass(
|
||||
class DashToDock_WindowPreviewMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
_init(window, params) {
|
||||
super._init(params);
|
||||
|
||||
this._window = window;
|
||||
this._destroyId = 0;
|
||||
this._windowAddedId = 0;
|
||||
|
||||
// We don't want this: it adds spacing on the left of the item.
|
||||
this.remove_child(this._ornamentLabel);
|
||||
this.add_style_class_name('dashtodock-app-well-preview-menu-item');
|
||||
|
||||
this._cloneBin = new St.Bin();
|
||||
this._cloneBin.set_size(PREVIEW_MAX_WIDTH, PREVIEW_MAX_HEIGHT);
|
||||
|
||||
// TODO: improve the way the closebutton is layout. Just use some padding
|
||||
// for the moment.
|
||||
this._cloneBin.set_style('padding-bottom: 0.5em');
|
||||
|
||||
this.closeButton = new St.Button({ style_class: 'window-close',
|
||||
x_expand: true,
|
||||
y_expand: true});
|
||||
this.closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' }));
|
||||
this.closeButton.set_x_align(Clutter.ActorAlign.END);
|
||||
this.closeButton.set_y_align(Clutter.ActorAlign.START);
|
||||
|
||||
|
||||
this.closeButton.opacity = 0;
|
||||
this.closeButton.connect('clicked', this._closeWindow.bind(this));
|
||||
|
||||
let overlayGroup = new Clutter.Actor({layout_manager: new Clutter.BinLayout() });
|
||||
|
||||
overlayGroup.add_actor(this._cloneBin);
|
||||
overlayGroup.add_actor(this.closeButton);
|
||||
|
||||
let label = new St.Label({ text: window.get_title()});
|
||||
label.set_style('max-width: '+PREVIEW_MAX_WIDTH +'px');
|
||||
let labelBin = new St.Bin({ child: label,
|
||||
x_align: St.Align.MIDDLE});
|
||||
|
||||
this._windowTitleId = this._window.connect('notify::title', () => {
|
||||
label.set_text(this._window.get_title());
|
||||
});
|
||||
|
||||
let box = new St.BoxLayout({ vertical: true,
|
||||
reactive:true,
|
||||
x_expand:true });
|
||||
box.add(overlayGroup);
|
||||
box.add(labelBin);
|
||||
this.add_actor(box);
|
||||
|
||||
this.connect('enter-event', this._onEnter.bind(this));
|
||||
this.connect('leave-event', this._onLeave.bind(this));
|
||||
this.connect('key-focus-in', this._onEnter.bind(this));
|
||||
this.connect('key-focus-out', this._onLeave.bind(this));
|
||||
|
||||
this._cloneTexture(window);
|
||||
|
||||
}
|
||||
|
||||
_cloneTexture(metaWin){
|
||||
|
||||
let mutterWindow = metaWin.get_compositor_private();
|
||||
|
||||
// Newly-created windows are added to a workspace before
|
||||
// the compositor finds out about them...
|
||||
// Moreover sometimes they return an empty texture, thus as a workarounf also check for it size
|
||||
if (!mutterWindow || !mutterWindow.get_texture() || !mutterWindow.get_size()[0]) {
|
||||
this._cloneTextureId = Mainloop.idle_add(() => {
|
||||
// Check if there's still a point in getting the texture,
|
||||
// otherwise this could go on indefinitely
|
||||
if (metaWin.get_workspace())
|
||||
this._cloneTexture(metaWin);
|
||||
this._cloneTextureId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(this._cloneTextureId, '[dash-to-dock] this._cloneTexture');
|
||||
return;
|
||||
}
|
||||
|
||||
let [width, height] = mutterWindow.get_size();
|
||||
let scale = Math.min(1.0, PREVIEW_MAX_WIDTH/width, PREVIEW_MAX_HEIGHT/height);
|
||||
let clone = new Clutter.Clone ({ source: mutterWindow,
|
||||
reactive: true,
|
||||
width: width * scale,
|
||||
height: height * scale });
|
||||
|
||||
// when the source actor is destroyed, i.e. the window closed, first destroy the clone
|
||||
// and then destroy the menu item (do this animating out)
|
||||
this._destroyId = mutterWindow.connect('destroy', () => {
|
||||
clone.destroy();
|
||||
this._destroyId = 0; // avoid to try to disconnect this signal from mutterWindow in _onDestroy(),
|
||||
// as the object was just destroyed
|
||||
this._animateOutAndDestroy();
|
||||
});
|
||||
|
||||
this._clone = clone;
|
||||
this._mutterWindow = mutterWindow;
|
||||
this._cloneBin.set_child(this._clone);
|
||||
|
||||
this._clone.connect('destroy', () => {
|
||||
if (this._destroyId) {
|
||||
mutterWindow.disconnect(this._destroyId);
|
||||
this._destroyId = 0;
|
||||
}
|
||||
this._clone = null;
|
||||
})
|
||||
}
|
||||
|
||||
_windowCanClose() {
|
||||
return this._window.can_close() &&
|
||||
!this._hasAttachedDialogs();
|
||||
}
|
||||
|
||||
_closeWindow(actor) {
|
||||
this._workspace = this._window.get_workspace();
|
||||
|
||||
// This mechanism is copied from the workspace.js upstream code
|
||||
// It forces window activation if the windows don't get closed,
|
||||
// for instance because asking user confirmation, by monitoring the opening of
|
||||
// such additional confirmation window
|
||||
this._windowAddedId = this._workspace.connect('window-added',
|
||||
this._onWindowAdded.bind(this));
|
||||
|
||||
this.deleteAllWindows();
|
||||
}
|
||||
|
||||
deleteAllWindows() {
|
||||
// Delete all windows, starting from the bottom-most (most-modal) one
|
||||
//let windows = this._window.get_compositor_private().get_children();
|
||||
let windows = this._clone.get_children();
|
||||
for (let i = windows.length - 1; i >= 1; i--) {
|
||||
let realWindow = windows[i].source;
|
||||
let metaWindow = realWindow.meta_window;
|
||||
|
||||
metaWindow.delete(global.get_current_time());
|
||||
}
|
||||
|
||||
this._window.delete(global.get_current_time());
|
||||
}
|
||||
|
||||
_onWindowAdded(workspace, win) {
|
||||
let metaWindow = this._window;
|
||||
|
||||
if (win.get_transient_for() == metaWindow) {
|
||||
workspace.disconnect(this._windowAddedId);
|
||||
this._windowAddedId = 0;
|
||||
|
||||
// use an idle handler to avoid mapping problems -
|
||||
// see comment in Workspace._windowAdded
|
||||
let activationEvent = Clutter.get_current_event();
|
||||
let id = Mainloop.idle_add(() => {
|
||||
this.emit('activate', activationEvent);
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(id, '[dash-to-dock] this.emit');
|
||||
}
|
||||
}
|
||||
|
||||
_hasAttachedDialogs() {
|
||||
// count trasient windows
|
||||
let n=0;
|
||||
this._window.foreach_transient(function(){n++;});
|
||||
return n>0;
|
||||
}
|
||||
|
||||
_onEnter() {
|
||||
this._showCloseButton();
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_onLeave() {
|
||||
if (!this._cloneBin.has_pointer &&
|
||||
!this.closeButton.has_pointer)
|
||||
this._hideCloseButton();
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_idleToggleCloseButton() {
|
||||
this._idleToggleCloseId = 0;
|
||||
|
||||
if (!this._cloneBin.has_pointer &&
|
||||
!this.closeButton.has_pointer)
|
||||
this._hideCloseButton();
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
_showCloseButton() {
|
||||
|
||||
if (this._windowCanClose()) {
|
||||
this.closeButton.show();
|
||||
this.closeButton.remove_all_transitions();
|
||||
this.closeButton.ease({
|
||||
opacity: 255,
|
||||
duration: Workspace.WINDOW_OVERLAY_FADE_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_hideCloseButton() {
|
||||
this.closeButton.remove_all_transitions();
|
||||
this.closeButton.ease({
|
||||
opacity: 0,
|
||||
duration: Workspace.WINDOW_OVERLAY_FADE_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_IN_QUAD
|
||||
});
|
||||
}
|
||||
|
||||
show(animate) {
|
||||
let fullWidth = this.get_width();
|
||||
|
||||
this.opacity = 0;
|
||||
this.set_width(0);
|
||||
|
||||
let time = animate ? PREVIEW_ANIMATION_DURATION : 0;
|
||||
this.remove_all_transitions();
|
||||
this.ease({
|
||||
opacity: 255,
|
||||
width: fullWidth,
|
||||
duration: time,
|
||||
mode: Clutter.AnimationMode.EASE_IN_OUT_QUAD,
|
||||
});
|
||||
}
|
||||
|
||||
_animateOutAndDestroy() {
|
||||
this.remove_all_transitions();
|
||||
this.ease({
|
||||
opacity: 0,
|
||||
duration: PREVIEW_ANIMATION_DURATION,
|
||||
});
|
||||
|
||||
this.ease({
|
||||
width: 0,
|
||||
height: 0,
|
||||
duration: PREVIEW_ANIMATION_DURATION,
|
||||
delay: PREVIEW_ANIMATION_DURATION,
|
||||
onComplete: () => this.destroy()
|
||||
});
|
||||
}
|
||||
|
||||
activate() {
|
||||
this._getTopMenu().close();
|
||||
Main.activateWindow(this._window);
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
super._onDestroy();
|
||||
|
||||
if (this._cloneTextureId) {
|
||||
GLib.source_remove(this._cloneTextureId);
|
||||
this._cloneTextureId = 0;
|
||||
}
|
||||
|
||||
if (this._windowAddedId > 0) {
|
||||
this._workspace.disconnect(this._windowAddedId);
|
||||
this._windowAddedId = 0;
|
||||
}
|
||||
|
||||
if (this._destroyId > 0) {
|
||||
this._mutterWindow.disconnect(this._destroyId);
|
||||
this._destroyId = 0;
|
||||
}
|
||||
|
||||
if (this._windowTitleId > 0) {
|
||||
this._window.disconnect(this._windowTitleId);
|
||||
this._windowTitleId = 0;
|
||||
}
|
||||
}
|
||||
});
|
|
@ -1,124 +0,0 @@
|
|||
const Gettext = imports.gettext
|
||||
const GObject = imports.gi.GObject
|
||||
const Gio = imports.gi.Gio
|
||||
const Config = imports.misc.config
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
|
||||
var SettingsManager = GObject.registerClass(
|
||||
class UniteSettings extends Gio.Settings {
|
||||
get DEFAULT_BINDING() {
|
||||
return Gio.SettingsBindFlags.DEFAULT
|
||||
}
|
||||
|
||||
get _types() {
|
||||
return {
|
||||
'autofocus-windows': 'boolean',
|
||||
'hide-activities-button': 'enum',
|
||||
'show-window-title': 'enum',
|
||||
'show-desktop-name': 'boolean',
|
||||
'desktop-name-text': 'string',
|
||||
'extend-left-box': 'boolean',
|
||||
'notifications-position': 'enum',
|
||||
'use-system-fonts': 'boolean',
|
||||
'show-legacy-tray': 'boolean',
|
||||
'greyscale-tray-icons': 'boolean',
|
||||
'show-window-buttons': 'enum',
|
||||
'window-buttons-theme': 'enum',
|
||||
'hide-window-titlebars': 'enum',
|
||||
'window-buttons-placement': 'select',
|
||||
'hide-dropdown-arrows': 'boolean',
|
||||
'hide-aggregate-menu-arrow': 'boolean',
|
||||
'hide-app-menu-arrow': 'boolean',
|
||||
'hide-app-menu-icon': 'boolean',
|
||||
'reduce-panel-spacing': 'boolean',
|
||||
'restrict-to-primary-screen': 'boolean'
|
||||
}
|
||||
}
|
||||
|
||||
exists(key) {
|
||||
return Object.keys(this._types).includes(key)
|
||||
}
|
||||
|
||||
getSettingType(key) {
|
||||
return this._types[key] || 'invalid'
|
||||
}
|
||||
|
||||
getTypeSettings(type) {
|
||||
return Object.keys(this._types).filter(key => this._types[key] == type)
|
||||
}
|
||||
|
||||
getSetting(key) {
|
||||
if (!this.exists(key)) return
|
||||
|
||||
let boolean = this.getSettingType(key) == 'boolean'
|
||||
return boolean ? this.get_boolean(key) : this.get_string(key)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
var PreferencesManager = GObject.registerClass(
|
||||
class UnitePreferences extends Gio.Settings {
|
||||
get window_buttons_position() {
|
||||
let setting = this.get_string('button-layout')
|
||||
return /(close|minimize|maximize).*:/.test(setting) ? 'left' : 'right'
|
||||
}
|
||||
|
||||
get window_buttons_layout() {
|
||||
let setting = this.get_string('button-layout')
|
||||
return setting.match(/(close|minimize|maximize)/g)
|
||||
}
|
||||
|
||||
exists(key) {
|
||||
let fun = key.replace(/-/g, '_')
|
||||
return (fun in this) || this.list_keys().includes(key)
|
||||
}
|
||||
|
||||
getSetting(key) {
|
||||
let fun = key.replace(/-/g, '_')
|
||||
|
||||
if (this.exists(fun)) return this[fun]
|
||||
if (this.exists(key)) return this.get_string(key)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
function initTranslations(domain) {
|
||||
let textDomain = domain || Unite.metadata['gettext-domain']
|
||||
let localeDir = Unite.dir.get_child('locale')
|
||||
|
||||
if (localeDir.query_exists(null))
|
||||
localeDir = localeDir.get_path()
|
||||
else
|
||||
localeDir = Config.LOCALEDIR
|
||||
|
||||
Gettext.bindtextdomain(textDomain, localeDir)
|
||||
}
|
||||
|
||||
function getSettings(schema) {
|
||||
schema = schema || Unite.metadata['settings-schema']
|
||||
|
||||
let gioSSS = Gio.SettingsSchemaSource
|
||||
let schemaDir = Unite.dir.get_child('schemas')
|
||||
let schemaSource = gioSSS.get_default()
|
||||
|
||||
if (schemaDir.query_exists(null)) {
|
||||
schemaDir = schemaDir.get_path()
|
||||
schemaSource = gioSSS.new_from_directory(schemaDir, schemaSource, false)
|
||||
}
|
||||
|
||||
let schemaObj = schemaSource.lookup(schema, true)
|
||||
|
||||
if (!schemaObj) {
|
||||
let metaId = Unite.metadata.uuid
|
||||
let message = `Schema ${schema} could not be found for extension ${metaId}.`
|
||||
|
||||
throw new Error(`${message} Please check your installation.`)
|
||||
}
|
||||
|
||||
return new SettingsManager({ settings_schema: schemaObj })
|
||||
}
|
||||
|
||||
function getPreferences() {
|
||||
let schemaId = 'org.gnome.desktop.wm.preferences'
|
||||
return new PreferencesManager({ schema_id: schemaId })
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const ActivateWindow = Unite.imports.modules.activateWindow.ActivateWindow
|
||||
const ExtendLeftBox = Unite.imports.modules.extendLeftBox.ExtendLeftBox
|
||||
const DesktopName = Unite.imports.modules.desktopName.DesktopName
|
||||
const MessageTray = Unite.imports.modules.messageTray.MessageTray
|
||||
const ActivitiesButton = Unite.imports.modules.activitiesButton.ActivitiesButton
|
||||
const ApplicationMenu = Unite.imports.modules.applicationMenu.ApplicationMenu
|
||||
const WindowButtons = Unite.imports.modules.windowButtons.WindowButtons
|
||||
const WindowDecoration = Unite.imports.modules.windowDecoration.WindowDecoration
|
||||
const TopIcons = Unite.imports.modules.topIcons.TopIcons
|
||||
const ThemeMods = Unite.imports.modules.themeMods.ThemeMods
|
||||
|
||||
class UniteExtension {
|
||||
constructor() {
|
||||
this._activateWindow = new ActivateWindow()
|
||||
this._extendLeftBox = new ExtendLeftBox()
|
||||
this._desktopName = new DesktopName()
|
||||
this._messageTray = new MessageTray()
|
||||
this._activitiesButton = new ActivitiesButton()
|
||||
this._applicationMenu = new ApplicationMenu()
|
||||
this._windowButtons = new WindowButtons()
|
||||
this._windowDecoration = new WindowDecoration()
|
||||
this._topIcons = new TopIcons()
|
||||
this._themeMods = new ThemeMods()
|
||||
|
||||
Main.panel._addStyleClassName('unite-shell')
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._activateWindow.destroy()
|
||||
this._extendLeftBox.destroy()
|
||||
this._desktopName.destroy()
|
||||
this._messageTray.destroy()
|
||||
this._activitiesButton.destroy()
|
||||
this._applicationMenu.destroy()
|
||||
this._windowButtons.destroy()
|
||||
this._windowDecoration.destroy()
|
||||
this._topIcons.destroy()
|
||||
this._themeMods.destroy()
|
||||
|
||||
Main.panel._removeStyleClassName('unite-shell')
|
||||
}
|
||||
}
|
||||
|
||||
let uniteExtension
|
||||
|
||||
function enable() {
|
||||
uniteExtension = new UniteExtension()
|
||||
}
|
||||
|
||||
function disable() {
|
||||
uniteExtension.destroy()
|
||||
uniteExtension = null
|
||||
}
|
|
@ -1,100 +0,0 @@
|
|||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Convenience = Unite.imports.convenience
|
||||
|
||||
var SignalsHandler = class SignalsHandler {
|
||||
constructor(context) {
|
||||
this._init(context)
|
||||
}
|
||||
|
||||
_init(context) {
|
||||
this._signals = {}
|
||||
this._context = context
|
||||
}
|
||||
|
||||
_getCallbackFunction(callback) {
|
||||
if (typeof callback == 'string')
|
||||
callback = this._context[callback] || this._context[`_${callback}`]
|
||||
|
||||
return callback
|
||||
}
|
||||
|
||||
_connectHandler(object, name, callbackObj) {
|
||||
let callback = this._getCallbackFunction(callbackObj)
|
||||
let signalId = object.connect(name, callback.bind(this._context))
|
||||
|
||||
return { object: object, signalId: signalId }
|
||||
}
|
||||
|
||||
_addHandler(object, name, callback) {
|
||||
let signalKey = `${object}[${name}#${callback}]`
|
||||
|
||||
if (!this._signals[signalKey])
|
||||
this._signals[signalKey] = this._connectHandler(object, name, callback)
|
||||
|
||||
return signalKey
|
||||
}
|
||||
|
||||
connect(object, name, callback) {
|
||||
return this._addHandler(object, name, callback)
|
||||
}
|
||||
|
||||
disconnect(signalKey) {
|
||||
let signalData = this._signals[signalKey]
|
||||
if (!signalData) return
|
||||
|
||||
signalData.object.disconnect(signalData.signalId)
|
||||
delete this._signals[signalKey]
|
||||
}
|
||||
|
||||
disconnectMany(signalKeys) {
|
||||
signalKeys.forEach(signalKey => { this.disconnect(signalKey) })
|
||||
}
|
||||
|
||||
disconnectAll() {
|
||||
this.disconnectMany(Object.keys(this._signals))
|
||||
}
|
||||
}
|
||||
|
||||
var SettingsHandler = class SettingsHandler extends SignalsHandler {
|
||||
_init(context) {
|
||||
this._enabler = null
|
||||
this._signals = {}
|
||||
this._context = context
|
||||
this._settings = Convenience.getSettings()
|
||||
this._wmPrefs = Convenience.getPreferences()
|
||||
}
|
||||
|
||||
_getSettingObject(settingKey) {
|
||||
if (this._settings.exists(settingKey))
|
||||
return this._settings
|
||||
|
||||
if (this._wmPrefs.exists(settingKey))
|
||||
return this._wmPrefs
|
||||
}
|
||||
|
||||
connect(name, callback) {
|
||||
let object = this._getSettingObject(name)
|
||||
return this._addHandler(object, `changed::${name}`, callback)
|
||||
}
|
||||
|
||||
enable(name, callback) {
|
||||
if (this._enabler) return
|
||||
|
||||
let signalObj = this._settings
|
||||
this._enabler = this._connectHandler(signalObj, `changed::${name}`, callback)
|
||||
}
|
||||
|
||||
disable() {
|
||||
if (!this._enabler) return
|
||||
|
||||
this._settings.disconnect(this._enabler.signalId)
|
||||
this._enabler = null
|
||||
}
|
||||
|
||||
get(settingKey) {
|
||||
if (settingKey == null) return
|
||||
|
||||
let object = this._getSettingObject(settingKey)
|
||||
if (object) return object.getSetting(settingKey)
|
||||
}
|
||||
}
|
|
@ -1,101 +0,0 @@
|
|||
const Gio = imports.gi.Gio
|
||||
const GLib = imports.gi.GLib
|
||||
const St = imports.gi.St
|
||||
const Meta = imports.gi.Meta
|
||||
const Config = imports.misc.config
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Settings = Unite.imports.convenience.getSettings()
|
||||
|
||||
const USER_CONFIG = GLib.get_user_config_dir()
|
||||
const USER_STYLES = `${USER_CONFIG}/gtk-3.0/gtk.css`
|
||||
|
||||
var minorVersion = parseInt(Config.PACKAGE_VERSION.split('.')[1])
|
||||
|
||||
function fileExists(path) {
|
||||
return GLib.file_test(path, GLib.FileTest.EXISTS)
|
||||
}
|
||||
|
||||
function getUserStyles() {
|
||||
if (!fileExists(USER_STYLES)) return ''
|
||||
|
||||
let file = GLib.file_get_contents(USER_STYLES)
|
||||
let style = String.fromCharCode.apply(null, file[1])
|
||||
|
||||
return style.replace(/@import.*unite@hardpixel\.eu.*css['"]\);\n/g, '')
|
||||
}
|
||||
|
||||
function loadUserStyles(styles) {
|
||||
let existing = getUserStyles()
|
||||
GLib.file_set_contents(USER_STYLES, styles + existing)
|
||||
}
|
||||
|
||||
function getThemeContext() {
|
||||
return St.ThemeContext.get_for_stage(global.stage)
|
||||
}
|
||||
|
||||
function getTheme() {
|
||||
let context = getThemeContext()
|
||||
return context.get_theme()
|
||||
}
|
||||
|
||||
function getGioFile(filePath) {
|
||||
let absPath = GLib.build_filenamev([Unite.path, filePath])
|
||||
|
||||
if (fileExists(absPath))
|
||||
return Gio.file_new_for_path(absPath)
|
||||
}
|
||||
|
||||
function loadStyles(filePath) {
|
||||
let gioFile = getGioFile(filePath)
|
||||
if (!gioFile) return
|
||||
|
||||
let theme = getTheme()
|
||||
theme.load_stylesheet(gioFile)
|
||||
|
||||
return gioFile
|
||||
}
|
||||
|
||||
function unloadStyles(gioFile) {
|
||||
let theme = getTheme()
|
||||
theme.unload_stylesheet(gioFile)
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
function scaleSize(initialSize) {
|
||||
let context = getThemeContext()
|
||||
return initialSize * context.scale_factor
|
||||
}
|
||||
|
||||
function getWindowXID(win) {
|
||||
let desc = win.get_description() || ''
|
||||
let match = desc.match(/0x[0-9a-f]+/) || [null]
|
||||
|
||||
return match[0]
|
||||
}
|
||||
|
||||
function isWindow(win) {
|
||||
if (!win) return
|
||||
|
||||
let meta = Meta.WindowType
|
||||
let types = [meta.NORMAL, meta.DIALOG, meta.MODAL_DIALOG, meta.UTILITY]
|
||||
|
||||
return types.includes(win.window_type)
|
||||
}
|
||||
|
||||
function isMaximized(win, matchState) {
|
||||
if (!win) return
|
||||
|
||||
let flags = Meta.MaximizeFlags
|
||||
let maximized = win.get_maximized()
|
||||
let primaryScreen = win.is_on_primary_monitor() || !(Settings.getSetting('restrict-to-primary-screen'))
|
||||
let tileMaximized = maximized == flags.HORIZONTAL || maximized == flags.VERTICAL
|
||||
let fullMaximized = maximized == flags.BOTH
|
||||
let bothMaximized = fullMaximized || tileMaximized
|
||||
|
||||
switch (matchState) {
|
||||
case 'both': return primaryScreen && bothMaximized
|
||||
case 'maximized': return primaryScreen && fullMaximized
|
||||
case 'tiled': return primaryScreen && tileMaximized
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
"_generated": "Generated by SweetTooth, do not edit",
|
||||
"description": "Unite is a GNOME Shell extension which makes a few layout tweaks to the top panel and removes window decorations to make it look like Ubuntu Unity Shell.\n\n- Adds window buttons to the top panel for maximized windows.\n- Shows current window title in the app menu for maximized windows.\n- Removes titlebars on maximized windows.\n- Hides window controls on maximized windows with headerbars.\n- Moves the date to the right, reduces panel spacing and removes dropdown arrows.\n- Moves legacy tray icons to the top panel.\n- Moves notifications to the right.\n- Hides activities button.\n- Adds desktop name to the top panel.\n\nThis extension depends on some Xorg utilities. To install them:\n- Debian/Ubuntu: apt install x11-utils\n- Fedora/RHEL: dnf install xorg-x11-utils\n- Arch: pacman -S xorg-xprop\n\n*Settings are provided to enable/disable or customize the available tweaks.\n* Since version 2 applications on wayland with client side decorations are supported using CSS.",
|
||||
"gettext-domain": "unite",
|
||||
"name": "Unite",
|
||||
"settings-schema": "org.gnome.shell.extensions.unite",
|
||||
"shell-version": [
|
||||
"3.34",
|
||||
"3.32"
|
||||
],
|
||||
"url": "https://github.com/hardpixel/unite-shell",
|
||||
"uuid": "unite@hardpixel.eu",
|
||||
"version": 34
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Signals = Unite.imports.handlers.SignalsHandler
|
||||
const Settings = Unite.imports.handlers.SettingsHandler
|
||||
|
||||
var BaseModule = class UniteBaseModule {
|
||||
constructor() {
|
||||
this._setup()
|
||||
this._init()
|
||||
}
|
||||
|
||||
_setup() {
|
||||
this._enableKey = null
|
||||
this._enableValue = null
|
||||
this._disableValue = null
|
||||
|
||||
this._runCallback('_onSetup')
|
||||
}
|
||||
|
||||
_init() {
|
||||
this._signals = new Signals(this)
|
||||
this._settings = new Settings(this)
|
||||
this._setting = this._settings.get(this._enableKey)
|
||||
|
||||
this._runCallback('_onInitialize')
|
||||
this._activate()
|
||||
|
||||
this._settings.enable(this._enableKey, 'reload')
|
||||
}
|
||||
|
||||
get _enabled() {
|
||||
if (this._enableKey == null)
|
||||
return true
|
||||
|
||||
if (this._enableValue != null)
|
||||
return this._setting == this._enableValue
|
||||
|
||||
if (this._disableValue != null)
|
||||
return this._setting != this._disableValue
|
||||
}
|
||||
|
||||
_hasCallback(name) {
|
||||
return typeof(this[name]) === 'function'
|
||||
}
|
||||
|
||||
_runCallback(name) {
|
||||
if (this._hasCallback(name))
|
||||
this[name]()
|
||||
}
|
||||
|
||||
_activate() {
|
||||
if (this._enabled)
|
||||
this._runCallback('_onActivate')
|
||||
}
|
||||
|
||||
_deactivate() {
|
||||
this._runCallback('_onDeactivate')
|
||||
|
||||
this._settings.disconnectAll()
|
||||
this._signals.disconnectAll()
|
||||
}
|
||||
|
||||
_reload() {
|
||||
let prevState = this._enabled
|
||||
this._setting = this._settings.get(this._enableKey)
|
||||
|
||||
if (prevState == this._enabled) {
|
||||
this._runCallback('_onReset')
|
||||
} else {
|
||||
this._deactivate()
|
||||
this._activate()
|
||||
|
||||
this._runCallback('_onReload')
|
||||
}
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._deactivate()
|
||||
this._runCallback('_onDestroy')
|
||||
|
||||
this._settings.disable()
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
|
||||
var ActivateWindow = class ActivateWindow extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'autofocus-windows'
|
||||
this._enableValue = true
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._signals.connect(global.display, 'window-demands-attention', 'focusWindow')
|
||||
}
|
||||
|
||||
_focusWindow(actor, win) {
|
||||
Main.activateWindow(win, global.get_current_time())
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
const Shell = imports.gi.Shell
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
|
||||
var ActivitiesButton = class ActivitiesButton extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'hide-activities-button'
|
||||
this._disableValue = 'never'
|
||||
}
|
||||
|
||||
_onInitialize() {
|
||||
this._container = Main.panel.statusArea.activities.container
|
||||
this.appSystem = Shell.AppSystem.get_default()
|
||||
this.winTracker = Shell.WindowTracker.get_default()
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._signals.connect(this.appSystem, 'app-state-changed', 'toggleButton')
|
||||
this._signals.connect(this.winTracker, 'notify::focus-app', 'toggleButton')
|
||||
|
||||
this._signals.connect(Main.overview, 'showing', 'toggleButton')
|
||||
this._signals.connect(Main.overview, 'hiding', 'toggleButton')
|
||||
|
||||
this._toggleButton()
|
||||
}
|
||||
|
||||
_onReset() {
|
||||
this._toggleButton()
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
this._container.show()
|
||||
}
|
||||
|
||||
_toggleButton() {
|
||||
let appMenu = Main.panel.statusArea.appMenu._targetApp != null
|
||||
let overview = Main.overview.visibleTarget
|
||||
let hidden = this._setting == 'always' || (appMenu && !overview)
|
||||
|
||||
if (!hidden && this._settings.get('show-desktop-name'))
|
||||
hidden = !appMenu && !overview
|
||||
|
||||
this._container.visible = !hidden
|
||||
}
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
const Shell = imports.gi.Shell
|
||||
const Meta = imports.gi.Meta
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
const isWindow = Unite.imports.helpers.isWindow
|
||||
const isMaximized = Unite.imports.helpers.isMaximized
|
||||
|
||||
var ApplicationMenu = class ApplicationMenu extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'show-window-title'
|
||||
this._disableValue = 'never'
|
||||
}
|
||||
|
||||
_onInitialize() {
|
||||
this.appMenu = Main.panel.statusArea.appMenu
|
||||
this.winTracker = Shell.WindowTracker.get_default()
|
||||
this.monitorManager = Meta.MonitorManager.get()
|
||||
this._isUpdating = false
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._signals.connect(global.display, 'notify::focus-window', 'updateTitle')
|
||||
this._signals.connect(this.monitorManager, 'monitors-changed', 'updateTitle')
|
||||
|
||||
this._signals.connect(global.window_manager, 'size-change', 'updateTitleText')
|
||||
this._signals.connect(this.appMenu._label, 'notify::text', 'updateTitleText')
|
||||
|
||||
this._updateTitle()
|
||||
}
|
||||
|
||||
_onReset() {
|
||||
this._updateTitle()
|
||||
}
|
||||
|
||||
_handleWindowTitle(win) {
|
||||
if (!isWindow(win) || win._updateTitleID) return
|
||||
|
||||
win._updateTitleID = win.connect(
|
||||
'notify::title', () => { this._updateTitleText() }
|
||||
)
|
||||
}
|
||||
|
||||
_updateTitle() {
|
||||
let focusWindow = global.display.focus_window
|
||||
|
||||
this._handleWindowTitle(focusWindow)
|
||||
this._updateTitleText()
|
||||
}
|
||||
|
||||
_updateTitleText() {
|
||||
if (this._isUpdating) return
|
||||
|
||||
let focusApp = this.winTracker.focus_app
|
||||
let focusWindow = global.display.focus_window
|
||||
let current = this.appMenu._label.get_text()
|
||||
let maximized = isMaximized(focusWindow, this._setting)
|
||||
let always = this._setting == 'always' && focusWindow
|
||||
let title = null
|
||||
|
||||
if (always || maximized)
|
||||
title = focusWindow.title
|
||||
|
||||
if (!title && focusApp)
|
||||
title = focusApp.get_name()
|
||||
|
||||
if (title && title != current) {
|
||||
this._isUpdating = true
|
||||
this.appMenu._label.set_text(title)
|
||||
this._isUpdating = false
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
const Shell = imports.gi.Shell
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
const DesktopLabel = Unite.imports.panel.DesktopLabel
|
||||
|
||||
var DesktopName = class DesktopName extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'show-desktop-name'
|
||||
this._enableValue = true
|
||||
}
|
||||
|
||||
_onInitialize() {
|
||||
this.appSystem = Shell.AppSystem.get_default()
|
||||
this.winTracker = Shell.WindowTracker.get_default()
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._signals.connect(this.appSystem, 'app-state-changed', 'toggleLabel')
|
||||
this._signals.connect(this.winTracker, 'notify::focus-app', 'toggleLabel')
|
||||
|
||||
this._signals.connect(Main.overview, 'showing', 'toggleLabel')
|
||||
this._signals.connect(Main.overview, 'hiding', 'toggleLabel')
|
||||
|
||||
this._settings.connect('desktop-name-text', 'setLabelText')
|
||||
|
||||
this._createLabel()
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
if (!this._label) return
|
||||
|
||||
this._label.destroy()
|
||||
this._label = null
|
||||
}
|
||||
|
||||
_visibleWindows() {
|
||||
let windows = global.get_window_actors().find(win => {
|
||||
let visible = win.metaWindow.showing_on_its_workspace()
|
||||
let skipped = win.metaWindow.skip_taskbar
|
||||
|
||||
return visible && !skipped
|
||||
})
|
||||
|
||||
return windows
|
||||
}
|
||||
|
||||
_setLabelText() {
|
||||
let text = this._settings.get('desktop-name-text')
|
||||
this._label.setText(text)
|
||||
}
|
||||
|
||||
_toggleLabel() {
|
||||
let appMenu = Main.panel.statusArea.appMenu._targetApp != null
|
||||
let overview = Main.overview.visibleTarget
|
||||
let visible = !appMenu && !overview
|
||||
|
||||
if (visible)
|
||||
visible = visible && !this._visibleWindows()
|
||||
|
||||
this._label.setVisible(visible)
|
||||
}
|
||||
|
||||
_createLabel() {
|
||||
if (this._label) return
|
||||
|
||||
this._label = new DesktopLabel()
|
||||
Main.panel.addToStatusArea('uniteDesktopLabel', this._label, 1, 'left')
|
||||
|
||||
this._setLabelText()
|
||||
this._toggleLabel()
|
||||
}
|
||||
}
|
|
@ -1,87 +0,0 @@
|
|||
const Gi = imports._gi
|
||||
const Clutter = imports.gi.Clutter
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
|
||||
var ExtendLeftBox = class ExtendLeftBox extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'extend-left-box'
|
||||
this._enableValue = true
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._oldAllocate = Main.panel.__proto__.vfunc_allocate
|
||||
|
||||
Main.panel.__proto__[Gi.hook_up_vfunc_symbol]('allocate', (box, flags) => {
|
||||
Main.panel.vfunc_allocate.call(Main.panel, box, flags)
|
||||
this._extendBox(Main.panel, box, flags)
|
||||
})
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
if (this._oldAllocate) {
|
||||
Main.panel.__proto__[Gi.hook_up_vfunc_symbol]('allocate', this._oldAllocate)
|
||||
this._oldAllocate = null
|
||||
}
|
||||
}
|
||||
|
||||
_onReload() {
|
||||
Main.panel.queue_relayout()
|
||||
}
|
||||
|
||||
_extendBox(actor, box, flags) {
|
||||
let leftBox = Main.panel._leftBox
|
||||
let centerBox = Main.panel._centerBox
|
||||
let rightBox = Main.panel._rightBox
|
||||
|
||||
let allocWidth = box.x2 - box.x1
|
||||
let allocHeight = box.y2 - box.y1
|
||||
|
||||
let [leftMinWidth, leftNaturalWidth] = leftBox.get_preferred_width(-1)
|
||||
let [centerMinWidth, centerNaturalWidth] = centerBox.get_preferred_width(-1)
|
||||
let [rightMinWidth, rightNaturalWidth] = rightBox.get_preferred_width(-1)
|
||||
|
||||
let sideWidth = allocWidth - rightNaturalWidth - centerNaturalWidth
|
||||
let childBox = new Clutter.ActorBox()
|
||||
|
||||
childBox.y1 = 0
|
||||
childBox.y2 = allocHeight
|
||||
|
||||
if (actor.get_text_direction() == Clutter.TextDirection.RTL) {
|
||||
childBox.x1 = allocWidth - Math.min(Math.floor(sideWidth), leftNaturalWidth)
|
||||
childBox.x2 = allocWidth
|
||||
} else {
|
||||
childBox.x1 = 0
|
||||
childBox.x2 = Math.min(Math.floor(sideWidth), leftNaturalWidth)
|
||||
}
|
||||
|
||||
leftBox.allocate(childBox, flags)
|
||||
|
||||
childBox.y1 = 0
|
||||
childBox.y2 = allocHeight
|
||||
|
||||
if (actor.get_text_direction() == Clutter.TextDirection.RTL) {
|
||||
childBox.x1 = rightNaturalWidth
|
||||
childBox.x2 = childBox.x1 + centerNaturalWidth
|
||||
} else {
|
||||
childBox.x1 = allocWidth - centerNaturalWidth - rightNaturalWidth
|
||||
childBox.x2 = childBox.x1 + centerNaturalWidth
|
||||
}
|
||||
|
||||
centerBox.allocate(childBox, flags)
|
||||
|
||||
childBox.y1 = 0
|
||||
childBox.y2 = allocHeight
|
||||
|
||||
if (actor.get_text_direction() == Clutter.TextDirection.RTL) {
|
||||
childBox.x1 = 0
|
||||
childBox.x2 = rightNaturalWidth
|
||||
} else {
|
||||
childBox.x1 = allocWidth - rightNaturalWidth
|
||||
childBox.x2 = allocWidth
|
||||
}
|
||||
|
||||
rightBox.allocate(childBox, flags)
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
const Clutter = imports.gi.Clutter
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
const scaleSize = Unite.imports.helpers.scaleSize
|
||||
|
||||
var MessageTray = class MessageTray extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'notifications-position'
|
||||
this._disableValue = 'center'
|
||||
}
|
||||
|
||||
_onInitialize() {
|
||||
this._banner = Main.messageTray._bannerBin
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
let mappings = { center: 'CENTER', left: 'START', right: 'END' }
|
||||
let position = mappings[this._setting] || 'CENTER'
|
||||
|
||||
this._banner.set_x_align(Clutter.ActorAlign[position])
|
||||
this._banner.set_width(scaleSize(390))
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
this._banner.set_x_align(Clutter.ActorAlign.CENTER)
|
||||
this._banner.set_width(-1)
|
||||
}
|
||||
}
|
|
@ -1,230 +0,0 @@
|
|||
const Gtk = imports.gi.Gtk
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
const minorVersion = Unite.imports.helpers.minorVersion
|
||||
|
||||
var ThemeMods = class ThemeMods extends Base {
|
||||
_onInitialize() {
|
||||
this.gtkSettings = Gtk.Settings.get_default()
|
||||
this._extraSpace = minorVersion < 34
|
||||
this._appMenu = Main.panel.statusArea.appMenu
|
||||
this._aggMenu = Main.panel.statusArea.aggregateMenu
|
||||
this._leftBox = Main.panel._leftBox
|
||||
this._centerBox = Main.panel._centerBox
|
||||
this._rightBox = Main.panel._rightBox
|
||||
this._uiStyles = {}
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._signals.connect(this.gtkSettings, 'notify::gtk-font-name', 'setPanelStyle')
|
||||
this._signals.connect(this._leftBox, 'actor_added', 'removePanelArrows')
|
||||
this._signals.connect(this._centerBox, 'actor_added', 'removePanelArrows')
|
||||
this._signals.connect(this._rightBox, 'actor_added', 'removePanelArrows')
|
||||
|
||||
this._settings.connect('use-system-fonts', 'setPanelStyle')
|
||||
this._settings.connect('reduce-panel-spacing', 'setPanelStyle')
|
||||
this._settings.connect('hide-app-menu-icon', 'toggleAppMenuIcon')
|
||||
this._settings.connect('hide-dropdown-arrows', 'togglePanelArrows')
|
||||
this._settings.connect('hide-aggregate-menu-arrow', 'toggleAggMenuArrow')
|
||||
this._settings.connect('hide-app-menu-arrow', 'toggleAppMenuArrow')
|
||||
|
||||
this._setExtraSpace()
|
||||
|
||||
this._toggleAppMenuIcon()
|
||||
this._togglePanelArrows()
|
||||
this._toggleAggMenuArrow()
|
||||
this._toggleAppMenuArrow()
|
||||
|
||||
this._setPanelStyle()
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
this._unsetExtraSpace()
|
||||
|
||||
this._resetAppMenuIcon()
|
||||
this._resetPanelArrows()
|
||||
this._resetAggMenuArrow()
|
||||
this._resetAppMenuArrow()
|
||||
|
||||
this._unsetPanelStyle()
|
||||
}
|
||||
|
||||
_setExtraSpace() {
|
||||
if (this._extraSpace) {
|
||||
this._addClass('extra-spacing')
|
||||
}
|
||||
}
|
||||
|
||||
_unsetExtraSpace() {
|
||||
if (this._extraSpace) {
|
||||
this._removeClass('extra-spacing')
|
||||
}
|
||||
}
|
||||
|
||||
_setPanelStyle() {
|
||||
this._unsetPanelStyle()
|
||||
|
||||
const fonts = this._settings.get('use-system-fonts')
|
||||
const space = this._settings.get('reduce-panel-spacing')
|
||||
|
||||
if (!fonts && !space) return
|
||||
|
||||
if (fonts) {
|
||||
const gtkFont = this.gtkSettings.gtk_font_name
|
||||
const cssFont = gtkFont.replace(/\s\d+$/, '')
|
||||
|
||||
this._addStyle('uiGroup', `font-family: ${cssFont};`)
|
||||
this._addClass('system-fonts')
|
||||
}
|
||||
|
||||
if (space) {
|
||||
this._addClass('small-spacing')
|
||||
}
|
||||
|
||||
this._addStyle('panel', 'font-size: 11.25pt;')
|
||||
}
|
||||
|
||||
_unsetPanelStyle() {
|
||||
this._removeClass('small-spacing')
|
||||
this._removeClass('system-fonts')
|
||||
|
||||
this._removeStyle('uiGroup')
|
||||
this._removeStyle('panel')
|
||||
}
|
||||
|
||||
_toggleAppMenuIcon() {
|
||||
const enabled = this._settings.get('hide-app-menu-icon')
|
||||
|
||||
if (enabled) {
|
||||
this._appMenu._iconBox.hide()
|
||||
} else {
|
||||
this._resetAppMenuIcon()
|
||||
}
|
||||
}
|
||||
|
||||
_resetAppMenuIcon() {
|
||||
this._appMenu._iconBox.show()
|
||||
}
|
||||
|
||||
_getWidgetArrow(widget) {
|
||||
let arrow = widget._arrow
|
||||
|
||||
if (!arrow) {
|
||||
const last = widget.get_n_children() - 1
|
||||
const actor = widget.get_children()[last]
|
||||
|
||||
if (!actor) return
|
||||
|
||||
if (actor.has_style_class_name && actor.has_style_class_name('popup-menu-arrow'))
|
||||
arrow = actor
|
||||
else
|
||||
arrow = this._getWidgetArrow(actor)
|
||||
}
|
||||
|
||||
if (arrow && !widget.hasOwnProperty('_arrow'))
|
||||
widget._arrow = arrow
|
||||
|
||||
return arrow
|
||||
}
|
||||
|
||||
_toggleWidgetArrow(widget, hide) {
|
||||
if (!widget) return
|
||||
|
||||
const arrow = this._getWidgetArrow(widget)
|
||||
if (!arrow) return
|
||||
|
||||
if (hide && !widget._arrowHandled) {
|
||||
arrow.visible = false
|
||||
widget._arrowHandled = true
|
||||
}
|
||||
|
||||
if (!hide && widget._arrowHandled) {
|
||||
arrow.visible = true
|
||||
delete widget._arrowHandled
|
||||
}
|
||||
}
|
||||
|
||||
_removePanelArrows() {
|
||||
for (const [name, widget] of Object.entries(Main.panel.statusArea)) {
|
||||
if (name != 'aggregateMenu' && name != 'appMenu') {
|
||||
this._toggleWidgetArrow(widget, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_resetPanelArrows() {
|
||||
for (const [name, widget] of Object.entries(Main.panel.statusArea)) {
|
||||
if (name != 'aggregateMenu' && name != 'appMenu') {
|
||||
this._toggleWidgetArrow(widget, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_togglePanelArrows() {
|
||||
const enabled = this._settings.get('hide-dropdown-arrows')
|
||||
|
||||
if (enabled) {
|
||||
this._removePanelArrows()
|
||||
} else {
|
||||
this._resetPanelArrows()
|
||||
}
|
||||
}
|
||||
|
||||
_toggleAggMenuArrow() {
|
||||
const enabled = this._settings.get('hide-aggregate-menu-arrow')
|
||||
|
||||
if (enabled) {
|
||||
this._toggleWidgetArrow(this._aggMenu, true)
|
||||
} else {
|
||||
this._resetAggMenuArrow()
|
||||
}
|
||||
}
|
||||
|
||||
_resetAggMenuArrow() {
|
||||
this._toggleWidgetArrow(this._aggMenu, false)
|
||||
}
|
||||
|
||||
_toggleAppMenuArrow() {
|
||||
const enabled = this._settings.get('hide-app-menu-arrow')
|
||||
|
||||
if (enabled) {
|
||||
this._toggleWidgetArrow(this._appMenu, true)
|
||||
} else {
|
||||
this._resetAppMenuArrow()
|
||||
}
|
||||
}
|
||||
|
||||
_resetAppMenuArrow() {
|
||||
this._toggleWidgetArrow(this._appMenu, false)
|
||||
}
|
||||
|
||||
_addClass(name) {
|
||||
Main.panel._addStyleClassName(name)
|
||||
}
|
||||
|
||||
_removeClass(name) {
|
||||
Main.panel._removeStyleClassName(name)
|
||||
}
|
||||
|
||||
_addStyle(name, style) {
|
||||
this._uiStyles[name] = style
|
||||
|
||||
let widget = Main[name]
|
||||
let styles = widget.get_style() || ''
|
||||
|
||||
widget.set_style(style + styles)
|
||||
}
|
||||
|
||||
_removeStyle(name) {
|
||||
let style = this._uiStyles[name]
|
||||
if (!style) return
|
||||
|
||||
let widget = Main[name]
|
||||
let styles = widget.get_style() || ''
|
||||
|
||||
widget.set_style(styles.replace(style, ''))
|
||||
|
||||
delete this._uiStyles[name]
|
||||
}
|
||||
}
|
|
@ -1,83 +0,0 @@
|
|||
const System = imports.system
|
||||
const Clutter = imports.gi.Clutter
|
||||
const Shell = imports.gi.Shell
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
const TrayIndicator = Unite.imports.panel.TrayIndicator
|
||||
const scaleSize = Unite.imports.helpers.scaleSize
|
||||
|
||||
var TopIcons = class TopIcons extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'show-legacy-tray'
|
||||
this._enableValue = true
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._settings.connect('greyscale-tray-icons', 'desaturateIcons')
|
||||
|
||||
this._createContainer()
|
||||
this._createTray()
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
this._destroyContainer()
|
||||
this._destroyTray()
|
||||
}
|
||||
|
||||
_createTray() {
|
||||
this._tray = new Shell.TrayManager()
|
||||
|
||||
this._tray.connect('tray-icon-added', (trayManager, icon) => {
|
||||
this._indicators.addIcon(icon)
|
||||
this._desaturateIcon(icon)
|
||||
})
|
||||
|
||||
this._tray.connect('tray-icon-removed', (trayManager, icon) => {
|
||||
this._indicators.removeIcon(icon)
|
||||
})
|
||||
|
||||
this._tray.manage_screen(Main.panel)
|
||||
}
|
||||
|
||||
_destroyTray() {
|
||||
this._tray = null
|
||||
System.gc()
|
||||
}
|
||||
|
||||
_createContainer() {
|
||||
if (this._indicators) return
|
||||
|
||||
this._indicators = new TrayIndicator({ size: scaleSize(20) })
|
||||
Main.panel.addToStatusArea('uniteTrayIndicator', this._indicators)
|
||||
}
|
||||
|
||||
_destroyContainer() {
|
||||
if (!this._indicators) return
|
||||
|
||||
this._indicators.destroy()
|
||||
this._indicators = null
|
||||
}
|
||||
|
||||
_desaturateIcon(icon) {
|
||||
let greyscale = this._settings.get('greyscale-tray-icons')
|
||||
icon.clear_effects()
|
||||
|
||||
if (!greyscale) return
|
||||
|
||||
let desEffect = new Clutter.DesaturateEffect({ factor : 1.0 })
|
||||
let briEffect = new Clutter.BrightnessContrastEffect({})
|
||||
|
||||
briEffect.set_brightness(0.2)
|
||||
briEffect.set_contrast(0.3)
|
||||
|
||||
icon.add_effect_with_name('desaturate', desEffect)
|
||||
icon.add_effect_with_name('brightness-contrast', briEffect)
|
||||
}
|
||||
|
||||
_desaturateIcons() {
|
||||
if (!this._indicators) return
|
||||
|
||||
this._indicators.forEach(icon => { this._desaturateIcon(icon) })
|
||||
}
|
||||
}
|
|
@ -1,181 +0,0 @@
|
|||
const St = imports.gi.St
|
||||
const Shell = imports.gi.Shell
|
||||
const Meta = imports.gi.Meta
|
||||
const Main = imports.ui.main
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
const WindowControls = Unite.imports.panel.WindowControls
|
||||
const isWindow = Unite.imports.helpers.isWindow
|
||||
const isMaximized = Unite.imports.helpers.isMaximized
|
||||
const loadStyles = Unite.imports.helpers.loadStyles
|
||||
const unloadStyles = Unite.imports.helpers.unloadStyles
|
||||
|
||||
var WindowButtons = class WindowButtons extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'show-window-buttons'
|
||||
this._disableValue = 'never'
|
||||
}
|
||||
|
||||
_onInitialize() {
|
||||
this.monitorManager = Meta.MonitorManager.get()
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._signals.connect(global.display, 'notify::focus-window', 'toggleButtons')
|
||||
this._signals.connect(global.window_manager, 'size-change', 'toggleButtons')
|
||||
this._signals.connect(global.window_manager, 'destroy', 'toggleButtons')
|
||||
this._signals.connect(this.monitorManager, 'monitors-changed', 'toggleButtons')
|
||||
|
||||
this._signals.connect(Main.overview, 'showing', 'toggleButtons')
|
||||
this._signals.connect(Main.overview, 'hiding', 'toggleButtons')
|
||||
|
||||
this._settings.connect('window-buttons-theme', 'updateTheme')
|
||||
this._settings.connect('button-layout', 'updateButtons')
|
||||
this._settings.connect('window-buttons-placement', 'updateButtons')
|
||||
this._settings.connect('restrict-to-primary-screen', 'updateButtons')
|
||||
|
||||
this._createButtons()
|
||||
this._toggleButtons()
|
||||
this._loadTheme()
|
||||
}
|
||||
|
||||
_onReset() {
|
||||
this._toggleButtons()
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
this._unloadTheme()
|
||||
this._destroyButtons()
|
||||
}
|
||||
|
||||
_createButtons() {
|
||||
let buttons = this._settings.get('window-buttons-layout')
|
||||
let side = this._settings.get('window-buttons-position')
|
||||
let place = this._settings.get('window-buttons-placement')
|
||||
let index = side == 'left' ? 1 : -1
|
||||
|
||||
if (!buttons || this._controls) return
|
||||
|
||||
if ((place == 'right' || place == 'last') && side == 'left') {
|
||||
buttons = buttons.reverse()
|
||||
}
|
||||
|
||||
if (place == 'left' || place == 'first') {
|
||||
side = 'left'
|
||||
index = 0
|
||||
}
|
||||
|
||||
if (place == 'right' || place == 'last') {
|
||||
side = 'right'
|
||||
index = -1
|
||||
}
|
||||
|
||||
this._controls = new WindowControls()
|
||||
|
||||
this._controls.addButtons(buttons, (actor, event) => {
|
||||
this._onButtonClick(actor, event)
|
||||
})
|
||||
|
||||
Main.panel.addToStatusArea('uniteWindowControls', this._controls, index, side)
|
||||
|
||||
const widget = this._controls.get_parent()
|
||||
const appMenu = Main.panel.statusArea.appMenu.get_parent()
|
||||
const aggMenu = Main.panel.statusArea.aggregateMenu.get_parent()
|
||||
|
||||
if (side == 'left' && place != 'first') {
|
||||
Main.panel._leftBox.set_child_below_sibling(widget, appMenu)
|
||||
}
|
||||
|
||||
if (side == 'right' && place != 'last') {
|
||||
Main.panel._rightBox.set_child_below_sibling(widget, aggMenu)
|
||||
}
|
||||
}
|
||||
|
||||
_destroyButtons() {
|
||||
if (!this._controls) return
|
||||
|
||||
this._controls.destroy()
|
||||
this._controls = null
|
||||
}
|
||||
|
||||
_updateButtons() {
|
||||
this._destroyButtons()
|
||||
this._createButtons()
|
||||
}
|
||||
|
||||
_updateTheme() {
|
||||
this._unloadTheme()
|
||||
this._loadTheme()
|
||||
}
|
||||
|
||||
_loadTheme() {
|
||||
if (this._themeFile || !this._controls) return
|
||||
|
||||
this._themeName = this._settings.get('window-buttons-theme')
|
||||
this._themeFile = loadStyles(`themes/${this._themeName}/stylesheet.css`)
|
||||
|
||||
this._controls.add_style_class_name(`${this._themeName}-buttons`)
|
||||
}
|
||||
|
||||
_unloadTheme() {
|
||||
if (!this._themeFile || !this._controls) return
|
||||
|
||||
this._controls.remove_style_class_name(`${this._themeName}-buttons`)
|
||||
|
||||
this._themeName = this._settings.get('window-buttons-theme')
|
||||
this._themeFile = unloadStyles(this._themeFile)
|
||||
}
|
||||
|
||||
_onButtonClick(actor, event) {
|
||||
let focusWindow = global.display.focus_window
|
||||
if (!focusWindow) return
|
||||
|
||||
switch (actor._windowAction) {
|
||||
case 'minimize': return this._minimizeWindow(focusWindow)
|
||||
case 'maximize': return this._maximizeWindow(focusWindow)
|
||||
case 'close': return this._closeWindow(focusWindow)
|
||||
}
|
||||
}
|
||||
|
||||
_minimizeWindow(win) {
|
||||
if (!win.minimized) win.minimize()
|
||||
}
|
||||
|
||||
_maximizeWindow(win) {
|
||||
let bothMaximized = Meta.MaximizeFlags.BOTH
|
||||
let maximizeState = win.get_maximized()
|
||||
|
||||
if (maximizeState === bothMaximized)
|
||||
win.unmaximize(bothMaximized)
|
||||
else
|
||||
win.maximize(bothMaximized)
|
||||
}
|
||||
|
||||
_closeWindow(win) {
|
||||
win.delete(global.get_current_time())
|
||||
}
|
||||
|
||||
_toggleButtons() {
|
||||
if (!this._controls) return
|
||||
|
||||
let focusWindow = global.display.focus_window
|
||||
let overview = Main.overview.visibleTarget
|
||||
let valid = isWindow(focusWindow)
|
||||
let visible = false
|
||||
|
||||
if (!overview && valid) {
|
||||
let maxed = isMaximized(focusWindow, this._setting)
|
||||
let always = this._setting == 'always' && focusWindow
|
||||
|
||||
visible = always || maxed
|
||||
} else {
|
||||
let target = Main.panel.statusArea.appMenu._targetApp
|
||||
let state = target != null && target.get_state()
|
||||
let running = state == Shell.AppState.RUNNING
|
||||
|
||||
visible = running && !overview
|
||||
}
|
||||
|
||||
this._controls.setVisible(visible)
|
||||
}
|
||||
}
|
|
@ -1,196 +0,0 @@
|
|||
const ByteArray = imports.byteArray
|
||||
const GLib = imports.gi.GLib
|
||||
const Meta = imports.gi.Meta
|
||||
const Util = imports.misc.util
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Base = Unite.imports.module.BaseModule
|
||||
const getWindowXID = Unite.imports.helpers.getWindowXID
|
||||
const isWindow = Unite.imports.helpers.isWindow
|
||||
const isMaximized = Unite.imports.helpers.isMaximized
|
||||
const loadUserStyles = Unite.imports.helpers.loadUserStyles
|
||||
|
||||
var WindowDecoration = class WindowDecoration extends Base {
|
||||
_onSetup() {
|
||||
this._enableKey = 'hide-window-titlebars'
|
||||
this._disableValue = 'never'
|
||||
}
|
||||
|
||||
_onInitialize() {
|
||||
this.monitorManager = Meta.MonitorManager.get()
|
||||
}
|
||||
|
||||
_onActivate() {
|
||||
this._signals.connect(global.display, 'notify::focus-window', 'updateTitlebar')
|
||||
this._signals.connect(global.window_manager, 'size-change', 'updateTitlebar')
|
||||
this._signals.connect(this.monitorManager, 'monitors-changed', 'undecorateWindows')
|
||||
|
||||
this._settings.connect('hide-window-titlebars', 'updateUserStyles')
|
||||
this._settings.connect('button-layout', 'updateUserStyles')
|
||||
this._settings.connect('restrict-to-primary-screen', 'undecorateWindows')
|
||||
|
||||
this._updateUserStyles()
|
||||
this._undecorateWindows()
|
||||
}
|
||||
|
||||
_onDeactivate() {
|
||||
this._removeUserStyles()
|
||||
this._decorateWindows()
|
||||
}
|
||||
|
||||
_onReset() {
|
||||
this._removeUserStyles()
|
||||
this._updateUserStyles()
|
||||
|
||||
this._undecorateWindows()
|
||||
}
|
||||
|
||||
_getWindowXID(win) {
|
||||
win._windowXID = win._windowXID || getWindowXID(win)
|
||||
return win._windowXID
|
||||
}
|
||||
|
||||
_getHintValue(win, hint) {
|
||||
let winId = this._getWindowXID(win)
|
||||
if (!winId) return
|
||||
|
||||
let result = GLib.spawn_command_line_sync(`xprop -id ${winId} ${hint}`)
|
||||
let string = ByteArray.toString(result[1])
|
||||
if (!string.match(/=/)) return
|
||||
|
||||
string = string.split('=')[1].trim().split(',').map(part => {
|
||||
part = part.trim()
|
||||
return part.match(/\dx/) ? part : `0x${part}`
|
||||
})
|
||||
|
||||
return string
|
||||
}
|
||||
|
||||
_setHintValue(win, hint, value) {
|
||||
let winId = this._getWindowXID(win)
|
||||
if (!winId) return
|
||||
|
||||
Util.spawn(['xprop', '-id', winId, '-f', hint, '32c', '-set', hint, value])
|
||||
}
|
||||
|
||||
_getMotifHints(win) {
|
||||
if (!win._uniteOriginalState) {
|
||||
let state = this._getHintValue(win, '_UNITE_ORIGINAL_STATE')
|
||||
|
||||
if (!state) {
|
||||
state = this._getHintValue(win, '_MOTIF_WM_HINTS')
|
||||
state = state || ['0x2', '0x0', '0x1', '0x0', '0x0']
|
||||
|
||||
this._setHintValue(win, '_UNITE_ORIGINAL_STATE', state.join(', '))
|
||||
}
|
||||
|
||||
win._uniteOriginalState = state
|
||||
}
|
||||
|
||||
return win._uniteOriginalState
|
||||
}
|
||||
|
||||
_getAllWindows() {
|
||||
let windows = global.get_window_actors().map(win => win.meta_window)
|
||||
return windows.filter(win => this._handleWindow(win))
|
||||
}
|
||||
|
||||
_handleWindow(win) {
|
||||
let handleWin = false
|
||||
if (!isWindow(win)) return
|
||||
|
||||
let state = this._getMotifHints(win)
|
||||
handleWin = !win.is_client_decorated()
|
||||
handleWin = handleWin && (state[2] != '0x2' && state[2] != '0x0')
|
||||
|
||||
return handleWin
|
||||
}
|
||||
|
||||
_toggleDecorations(win, hide) {
|
||||
let winId = this._getWindowXID(win)
|
||||
if (!winId) return
|
||||
|
||||
let prop = '_MOTIF_WM_HINTS'
|
||||
let flag = '0x2, 0x0, %s, 0x0, 0x0'
|
||||
let value = hide ? flag.format('0x2') : flag.format('0x1')
|
||||
|
||||
Util.spawn(['xprop', '-id', winId, '-f', prop, '32c', '-set', prop, value])
|
||||
}
|
||||
|
||||
_resetDecorations(win) {
|
||||
if (!this._handleWindow(win))
|
||||
return
|
||||
|
||||
this._toggleDecorations(win, false)
|
||||
|
||||
delete win._decorationOFF
|
||||
delete win._windowXID
|
||||
}
|
||||
|
||||
_updateTitlebar() {
|
||||
let focusWindow = global.display.focus_window
|
||||
if (!focusWindow) return
|
||||
|
||||
this._toggleTitlebar(focusWindow)
|
||||
}
|
||||
|
||||
_showTitlebar(win) {
|
||||
if (!win._decorationOFF) return
|
||||
|
||||
win._decorationOFF = false
|
||||
this._toggleDecorations(win, false)
|
||||
}
|
||||
|
||||
_hideTitlebar(win) {
|
||||
if (win._decorationOFF) return
|
||||
|
||||
win._decorationOFF = true
|
||||
this._toggleDecorations(win, true)
|
||||
}
|
||||
|
||||
_toggleTitlebar(win) {
|
||||
if (!this._handleWindow(win))
|
||||
return
|
||||
|
||||
let maxed = isMaximized(win, this._setting)
|
||||
let always = this._setting == 'always'
|
||||
|
||||
if (always || maxed)
|
||||
this._hideTitlebar(win)
|
||||
else
|
||||
this._showTitlebar(win)
|
||||
}
|
||||
|
||||
_getCssImports() {
|
||||
let position = this._settings.get('window-buttons-position')
|
||||
let filePath = `${Unite.path}/styles/buttons-${position}`
|
||||
let maximized = `@import url('${filePath}.css');\n`
|
||||
let tiled = `@import url('${filePath}-tiled.css');\n`
|
||||
let always = `@import url('${filePath}-always.css');\n`
|
||||
|
||||
switch (this._setting) {
|
||||
case 'both': return maximized + tiled
|
||||
case 'maximized': return maximized
|
||||
case 'tiled': return tiled
|
||||
case 'always': return always
|
||||
}
|
||||
}
|
||||
|
||||
_updateUserStyles() {
|
||||
let styles = this._getCssImports()
|
||||
loadUserStyles(styles || '')
|
||||
}
|
||||
|
||||
_removeUserStyles() {
|
||||
loadUserStyles('')
|
||||
}
|
||||
|
||||
_undecorateWindows() {
|
||||
let windows = this._getAllWindows()
|
||||
windows.forEach(win => { this._toggleTitlebar(win) })
|
||||
}
|
||||
|
||||
_decorateWindows() {
|
||||
let windows = this._getAllWindows()
|
||||
windows.forEach(win => { this._resetDecorations(win) })
|
||||
}
|
||||
}
|
|
@ -1,121 +0,0 @@
|
|||
const GObject = imports.gi.GObject
|
||||
const St = imports.gi.St
|
||||
const Clutter = imports.gi.Clutter
|
||||
const Main = imports.ui.main
|
||||
const PanelMenu = imports.ui.panelMenu
|
||||
|
||||
var DesktopLabel = GObject.registerClass(
|
||||
class UniteDesktopLabel extends PanelMenu.Button {
|
||||
_init(params = { text: 'Desktop' }) {
|
||||
this.params = params
|
||||
this.appMenu = Main.panel.statusArea.appMenu
|
||||
|
||||
super._init(0.0, null, true)
|
||||
|
||||
this._label = new St.Label({ y_align: Clutter.ActorAlign.CENTER })
|
||||
this.add_actor(this._label)
|
||||
|
||||
this.reactive = false
|
||||
this.label_actor = this._label
|
||||
|
||||
this.setText(params.text)
|
||||
}
|
||||
|
||||
setText(text) {
|
||||
this._label.set_text(text)
|
||||
}
|
||||
|
||||
setVisible(visible) {
|
||||
this.container.visible = visible
|
||||
this.appMenu.container.visible = !visible
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
var TrayIndicator = GObject.registerClass(
|
||||
class UniteTrayIndicator extends PanelMenu.Button {
|
||||
_init(params = { size: 20 }) {
|
||||
this._icons = []
|
||||
this.params = params
|
||||
|
||||
super._init(0.0, null, true)
|
||||
|
||||
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' })
|
||||
this.add_child(this._indicators)
|
||||
|
||||
this._sync()
|
||||
}
|
||||
|
||||
_sync() {
|
||||
this.visible = this._icons.length
|
||||
}
|
||||
|
||||
addIcon(icon) {
|
||||
this._icons.push(icon)
|
||||
|
||||
const mask = St.ButtonMask.ONE | St.ButtonMask.TWO | St.ButtonMask.THREE
|
||||
const ibtn = new St.Button({ child: icon, button_mask: mask })
|
||||
|
||||
this._indicators.add_child(ibtn)
|
||||
|
||||
icon.connect('destroy', () => { ibtn.destroy() })
|
||||
ibtn.connect('button-release-event', (actor, event) => { icon.click(event) })
|
||||
|
||||
icon.set_reactive(true)
|
||||
icon.set_size(this.params.size, this.params.size)
|
||||
|
||||
this._sync()
|
||||
}
|
||||
|
||||
removeIcon(icon) {
|
||||
const actor = icon.get_parent() || icon
|
||||
actor.destroy()
|
||||
|
||||
const index = this._icons.indexOf(icon)
|
||||
this._icons.splice(index, 1)
|
||||
|
||||
this._sync()
|
||||
}
|
||||
|
||||
forEach(callback) {
|
||||
this._icons.forEach(icon => { callback.call(null, icon) })
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
var WindowControls = GObject.registerClass(
|
||||
class UniteWindowControls extends PanelMenu.Button {
|
||||
_init() {
|
||||
super._init(0.0, null, true)
|
||||
|
||||
this._controls = new St.BoxLayout({ style_class: 'window-controls-box' })
|
||||
this.add_child(this._controls)
|
||||
|
||||
this.add_style_class_name('window-controls')
|
||||
}
|
||||
|
||||
_addButton(action, callback) {
|
||||
const bin = new St.Bin({ style_class: 'icon' })
|
||||
const btn = new St.Button({ track_hover: true })
|
||||
|
||||
btn._windowAction = action
|
||||
|
||||
btn.add_style_class_name(`window-button ${action}`)
|
||||
btn.add_actor(bin)
|
||||
|
||||
btn.connect('clicked', (actor, event) => {
|
||||
callback.call(null, actor, event)
|
||||
})
|
||||
|
||||
this._controls.add_child(btn)
|
||||
}
|
||||
|
||||
addButtons(buttons, callback) {
|
||||
buttons.forEach(action => { this._addButton(action, callback) })
|
||||
}
|
||||
|
||||
setVisible(visible) {
|
||||
this.container.visible = visible
|
||||
}
|
||||
}
|
||||
)
|
|
@ -1,74 +0,0 @@
|
|||
const GObject = imports.gi.GObject
|
||||
const Gtk = imports.gi.Gtk
|
||||
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||||
const Convenience = Unite.imports.convenience
|
||||
|
||||
var PrefsWidget = GObject.registerClass(
|
||||
class UnitePrefsWidget extends Gtk.Box {
|
||||
_init(params) {
|
||||
this._settings = Convenience.getSettings()
|
||||
super._init(params)
|
||||
|
||||
this._buildable = new Gtk.Builder()
|
||||
this._buildable.add_from_file(`${Unite.path}/settings.ui`)
|
||||
|
||||
this._container = this._getWidget('prefs_widget')
|
||||
this.add(this._container)
|
||||
|
||||
this._bindStrings()
|
||||
this._bindSelects()
|
||||
this._bindBooleans()
|
||||
this._bindEnumerations()
|
||||
}
|
||||
|
||||
_getWidget(name) {
|
||||
let widgetName = name.replace(/-/g, '_')
|
||||
return this._buildable.get_object(widgetName)
|
||||
}
|
||||
|
||||
_bindInput(setting, prop) {
|
||||
let widget = this._getWidget(setting)
|
||||
this._settings.bind(setting, widget, prop, this._settings.DEFAULT_BINDING)
|
||||
}
|
||||
|
||||
_bindEnum(setting) {
|
||||
let widget = this._getWidget(setting)
|
||||
widget.set_active(this._settings.get_enum(setting))
|
||||
|
||||
widget.connect('changed', (combobox) => {
|
||||
this._settings.set_enum(setting, combobox.get_active())
|
||||
})
|
||||
}
|
||||
|
||||
_bindStrings() {
|
||||
let settings = this._settings.getTypeSettings('string')
|
||||
settings.forEach(setting => { this._bindInput(setting, 'text') })
|
||||
}
|
||||
|
||||
_bindSelects() {
|
||||
let settings = this._settings.getTypeSettings('select')
|
||||
settings.forEach(setting => { this._bindInput(setting, 'active-id') })
|
||||
}
|
||||
|
||||
_bindBooleans() {
|
||||
let settings = this._settings.getTypeSettings('boolean')
|
||||
settings.forEach(setting => { this._bindInput(setting, 'active') })
|
||||
}
|
||||
|
||||
_bindEnumerations() {
|
||||
let settings = this._settings.getTypeSettings('enum')
|
||||
settings.forEach(setting => { this._bindEnum(setting) })
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations()
|
||||
}
|
||||
|
||||
function buildPrefsWidget() {
|
||||
let widget = new PrefsWidget()
|
||||
widget.show_all()
|
||||
|
||||
return widget
|
||||
}
|
|
@ -1,161 +0,0 @@
|
|||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<enum id="org.gnome.shell.extensions.unite.buttonsTheme">
|
||||
<value value="0" nick="default-dark" />
|
||||
<value value="1" nick="default-light" />
|
||||
<value value="2" nick="ambiance" />
|
||||
<value value="3" nick="radiance" />
|
||||
<value value="4" nick="arc-dark" />
|
||||
<value value="5" nick="arc-light" />
|
||||
<value value="6" nick="united-dark" />
|
||||
<value value="7" nick="united-light" />
|
||||
<value value="8" nick="materia-dark" />
|
||||
<value value="9" nick="materia-light" />
|
||||
<value value="10" nick="osx-arc" />
|
||||
<value value="11" nick="vertex" />
|
||||
<value value="12" nick="pop-dark" />
|
||||
<value value="13" nick="pop-light" />
|
||||
<value value="14" nick="vimix" />
|
||||
<value value="15" nick="yaru" />
|
||||
<value value="16" nick="arrongin" />
|
||||
<value value="17" nick="telinkrin" />
|
||||
</enum>
|
||||
|
||||
<enum id="org.gnome.shell.extensions.unite.hideTitlebars">
|
||||
<value value="0" nick="never" />
|
||||
<value value="1" nick="tiled" />
|
||||
<value value="2" nick="maximized" />
|
||||
<value value="3" nick="both" />
|
||||
<value value="4" nick="always" />
|
||||
</enum>
|
||||
|
||||
<enum id="org.gnome.shell.extensions.unite.showTitle">
|
||||
<value value="0" nick="never" />
|
||||
<value value="1" nick="tiled" />
|
||||
<value value="2" nick="maximized" />
|
||||
<value value="3" nick="both" />
|
||||
<value value="4" nick="always" />
|
||||
</enum>
|
||||
|
||||
<enum id="org.gnome.shell.extensions.unite.showButtons">
|
||||
<value value="0" nick="never" />
|
||||
<value value="1" nick="tiled" />
|
||||
<value value="2" nick="maximized" />
|
||||
<value value="3" nick="both" />
|
||||
<value value="4" nick="always" />
|
||||
</enum>
|
||||
|
||||
<enum id="org.gnome.shell.extensions.unite.notificationsPosition">
|
||||
<value value="0" nick="center" />
|
||||
<value value="1" nick="left" />
|
||||
<value value="2" nick="right" />
|
||||
</enum>
|
||||
|
||||
<enum id="org.gnome.shell.extensions.unite.hideActivitiesButton">
|
||||
<value value="0" nick="never" />
|
||||
<value value="1" nick="auto" />
|
||||
<value value="2" nick="always" />
|
||||
</enum>
|
||||
|
||||
<schema id="org.gnome.shell.extensions.unite" path="/org/gnome/shell/extensions/unite/">
|
||||
<key name="use-system-fonts" type="b">
|
||||
<default>true</default>
|
||||
<summary>Apply system fonts to shell interface.</summary>
|
||||
</key>
|
||||
|
||||
<key name="extend-left-box" type="b">
|
||||
<default>true</default>
|
||||
<summary>Extend top bar left box.</summary>
|
||||
</key>
|
||||
|
||||
<key name="show-legacy-tray" type="b">
|
||||
<default>true</default>
|
||||
<summary>Legacy tray icons in top bar.</summary>
|
||||
</key>
|
||||
|
||||
<key name="greyscale-tray-icons" type="b">
|
||||
<default>false</default>
|
||||
<summary>Convert legacy tray icons to greyscale.</summary>
|
||||
</key>
|
||||
|
||||
<key name="autofocus-windows" type="b">
|
||||
<default>true</default>
|
||||
<summary>Autofocus windows that demand attention.</summary>
|
||||
</key>
|
||||
|
||||
<key name="show-desktop-name" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show desktop name in top bar.</summary>
|
||||
</key>
|
||||
|
||||
<key name="desktop-name-text" type="s">
|
||||
<default>"GNOME Desktop"</default>
|
||||
<summary>Set the top bar desktop name text.</summary>
|
||||
</key>
|
||||
|
||||
<key name="restrict-to-primary-screen" type="b">
|
||||
<default>true</default>
|
||||
<summary>Restrict functionalities to the primary screen.</summary>
|
||||
</key>
|
||||
|
||||
<key name="hide-dropdown-arrows" type="b">
|
||||
<default>true</default>
|
||||
<summary>Hide top bar dropdown arrows.</summary>
|
||||
</key>
|
||||
|
||||
<key name="hide-aggregate-menu-arrow" type="b">
|
||||
<default>false</default>
|
||||
<summary>Hide aggregate menu dropdown arrow.</summary>
|
||||
</key>
|
||||
|
||||
<key name="hide-app-menu-arrow" type="b">
|
||||
<default>true</default>
|
||||
<summary>Hide app menu dropdown arrow.</summary>
|
||||
</key>
|
||||
|
||||
<key name="hide-app-menu-icon" type="b">
|
||||
<default>true</default>
|
||||
<summary>Hide app menu application icon.</summary>
|
||||
</key>
|
||||
|
||||
<key name="reduce-panel-spacing" type="b">
|
||||
<default>true</default>
|
||||
<summary>Reduce top bar items spacing.</summary>
|
||||
</key>
|
||||
|
||||
<key name="window-buttons-placement" type="s">
|
||||
<default>"auto"</default>
|
||||
<summary>Top bar window buttons position.</summary>
|
||||
</key>
|
||||
|
||||
<key name="show-window-title" enum="org.gnome.shell.extensions.unite.showTitle">
|
||||
<default>"maximized"</default>
|
||||
<summary>Use window title to replace the app-menu label.</summary>
|
||||
</key>
|
||||
|
||||
<key name="show-window-buttons" enum="org.gnome.shell.extensions.unite.showButtons">
|
||||
<default>"maximized"</default>
|
||||
<summary>Active window bottons in top bar.</summary>
|
||||
</key>
|
||||
|
||||
<key name="window-buttons-theme" enum="org.gnome.shell.extensions.unite.buttonsTheme">
|
||||
<default>"default-dark"</default>
|
||||
<summary>Top bar window buttons theme.</summary>
|
||||
</key>
|
||||
|
||||
<key name="hide-window-titlebars" enum="org.gnome.shell.extensions.unite.hideTitlebars">
|
||||
<default>"maximized"</default>
|
||||
<summary>Select windows state to hide titlebars.</summary>
|
||||
</key>
|
||||
|
||||
<key name="notifications-position" enum="org.gnome.shell.extensions.unite.notificationsPosition">
|
||||
<default>"right"</default>
|
||||
<summary>Select notification messages position.</summary>
|
||||
</key>
|
||||
|
||||
<key name="hide-activities-button" enum="org.gnome.shell.extensions.unite.hideActivitiesButton">
|
||||
<default>"auto"</default>
|
||||
<summary>Hide top bar activities button.</summary>
|
||||
</key>
|
||||
|
||||
</schema>
|
||||
</schemalist>
|
|
@ -1,906 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated with glade 3.22.1 -->
|
||||
<interface domain="unite">
|
||||
<requires lib="gtk+" version="3.10"/>
|
||||
<object class="GtkNotebook" id="prefs_widget">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="show_border">False</property>
|
||||
<property name="scrollable">True</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="general_prefs">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">start</property>
|
||||
<property name="margin_left">20</property>
|
||||
<property name="margin_right">20</property>
|
||||
<property name="margin_top">20</property>
|
||||
<property name="margin_bottom">20</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">15</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="extend_left_box_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Extend top bar left box</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="extend_left_box">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="autofocus_windows_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Auto focus new windows</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="autofocus_windows">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="show_legacy_tray_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Show system tray in top bar</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="show_legacy_tray">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="show_desktop_name_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Show desktop name in top bar</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="show_desktop_name">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="restrict_to_primary_screen_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Restrict functionalities to the primary screen</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="restrict_to_primary_screen">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">6</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="hide_activities_button_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Hide activities button</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="hide_activities_button">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active_id">1</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes">Never</item>
|
||||
<item id="1" translatable="yes">Auto</item>
|
||||
<item id="2" translatable="yes">Always</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">8</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="hide_window_titlebars_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Hide window titlebars</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="hide_window_titlebars">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active_id">2</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes">Never</item>
|
||||
<item id="1" translatable="yes">Tiled</item>
|
||||
<item id="2" translatable="yes">Maximized</item>
|
||||
<item id="3" translatable="yes">Both</item>
|
||||
<item id="4" translatable="yes">Always</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">9</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="show_window_title_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Show window title in app menu</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="show_window_title">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active_id">2</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes">Never</item>
|
||||
<item id="1" translatable="yes">Tiled</item>
|
||||
<item id="2" translatable="yes">Maximized</item>
|
||||
<item id="3" translatable="yes">Both</item>
|
||||
<item id="4" translatable="yes">Always</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="show_window_buttons_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Show window buttons in top bar</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="show_window_buttons">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active_id">2</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes">Never</item>
|
||||
<item id="1" translatable="yes">Tiled</item>
|
||||
<item id="2" translatable="yes">Maximized</item>
|
||||
<item id="3" translatable="yes">Both</item>
|
||||
<item id="4" translatable="yes">Always</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">11</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="notifications_position_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Notification messages position</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="notifications_position">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active_id">2</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes">Center</item>
|
||||
<item id="1" translatable="yes">Left</item>
|
||||
<item id="2" translatable="yes">Right</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">13</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="tab_expand">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child type="tab">
|
||||
<object class="GtkLabel" id="general_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">General</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="tab_fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="appearance_prefs">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">start</property>
|
||||
<property name="margin_left">20</property>
|
||||
<property name="margin_right">20</property>
|
||||
<property name="margin_top">20</property>
|
||||
<property name="margin_bottom">20</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">15</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="use_system_fonts_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Apply system fonts to shell theme</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="use_system_fonts">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="greyscale_tray_icons_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Convert tray icons to greyscale</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="greyscale_tray_icons">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="hide_dropdown_arrows_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Hide top bar dropdown arrows</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="hide_dropdown_arrows">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="hide_aggregate_menu_arrow_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Hide aggregate menu dropdown arrow</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="hide_aggregate_menu_arrow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="hide_app_menu_arrow_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Hide app menu dropdown arrow</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="hide_app_menu_arrow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="hide_app_menu_icon_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Hide app menu application icon</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="hide_app_menu_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="reduce_panel_spacing_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Reduce top bar items spacing</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="reduce_panel_spacing">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">6</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="desktop_name_text_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Top bar desktop name text</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="desktop_name_text">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="text" translatable="yes">GNOME Desktop</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">7</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="window_buttons_placement_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="no_show_all">True</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Top bar window buttons position</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="window_buttons_placement">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active_id">auto</property>
|
||||
<items>
|
||||
<item id="auto" translatable="yes">Auto</item>
|
||||
<item id="left" translatable="yes">Left</item>
|
||||
<item id="right" translatable="yes">Right</item>
|
||||
<item id="first" translatable="yes">First</item>
|
||||
<item id="last" translatable="yes">Last</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">8</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="window_buttons_theme_section">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="no_show_all">True</property>
|
||||
<property name="spacing">50</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Top bar window buttons theme</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="window_buttons_theme">
|
||||
<property name="width_request">170</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active_id">0</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes">Default Dark</item>
|
||||
<item id="1" translatable="yes">Default Light</item>
|
||||
<item id="2" translatable="yes">Ambiance</item>
|
||||
<item id="3" translatable="yes">Radiance</item>
|
||||
<item id="4" translatable="yes">Arc Dark</item>
|
||||
<item id="5" translatable="yes">Arc Light</item>
|
||||
<item id="6" translatable="yes">United Dark</item>
|
||||
<item id="7" translatable="yes">United Light</item>
|
||||
<item id="8" translatable="yes">Materia Dark</item>
|
||||
<item id="9" translatable="yes">Materia Light</item>
|
||||
<item id="10" translatable="yes">OSX Arc</item>
|
||||
<item id="11" translatable="yes">Vertex</item>
|
||||
<item id="12" translatable="yes">Pop Dark</item>
|
||||
<item id="13" translatable="yes">Pop Light</item>
|
||||
<item id="14" translatable="yes">Vimix</item>
|
||||
<item id="15" translatable="yes">Yaru</item>
|
||||
<item id="16" translatable="yes">Arrongin</item>
|
||||
<item id="17" translatable="yes">Telinkrin</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">9</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
<property name="tab_expand">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child type="tab">
|
||||
<object class="GtkLabel" id="appearance_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Appearance</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
<property name="tab_fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
|
@ -1,22 +0,0 @@
|
|||
window headerbar,
|
||||
window .titlebar {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
window headerbar ~ headerbar,
|
||||
window headerbar ~ .titlebar,
|
||||
window .titlebar ~ .titlebar,
|
||||
window .titlebar ~ headerbar {
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
window headerbar > box.left,
|
||||
window .titlebar > box.left {
|
||||
margin: 0 0 0 -200px;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
window .titlebar.default-decoration {
|
||||
margin: -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
.tiled headerbar,
|
||||
.tiled .titlebar {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.tiled headerbar ~ headerbar,
|
||||
.tiled headerbar ~ .titlebar,
|
||||
.tiled .titlebar ~ .titlebar,
|
||||
.tiled .titlebar ~ headerbar {
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
.tiled headerbar > box.left,
|
||||
.tiled .titlebar > box.left {
|
||||
margin: 0 0 0 -200px;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.tiled .titlebar.default-decoration {
|
||||
margin: -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
.maximized headerbar,
|
||||
.maximized .titlebar {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.maximized headerbar ~ headerbar,
|
||||
.maximized headerbar ~ .titlebar,
|
||||
.maximized .titlebar ~ .titlebar,
|
||||
.maximized .titlebar ~ headerbar {
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
.maximized headerbar > box.left,
|
||||
.maximized .titlebar > box.left {
|
||||
margin: 0 0 0 -200px;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.maximized .titlebar.default-decoration {
|
||||
margin: -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
window > headerbar,
|
||||
window > .titlebar,
|
||||
window > headerbar > headerbar,
|
||||
window > .titlebar > .titlebar,
|
||||
window > .titlebar > stack > headerbar,
|
||||
window headerbar:last-child,
|
||||
window .titlebar:last-child {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
window headerbar > box.right,
|
||||
window .titlebar > box.right {
|
||||
margin: 0 -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
window .titlebar.default-decoration {
|
||||
margin: -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
.tiled > headerbar,
|
||||
.tiled > .titlebar,
|
||||
.tiled > headerbar > headerbar,
|
||||
.tiled > .titlebar > .titlebar,
|
||||
.tiled > .titlebar > stack > headerbar,
|
||||
.tiled headerbar:last-child,
|
||||
.tiled .titlebar:last-child {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.tiled headerbar > box.right,
|
||||
.tiled .titlebar > box.right {
|
||||
margin: 0 -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.tiled .titlebar.default-decoration {
|
||||
margin: -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
.maximized > headerbar,
|
||||
.maximized > .titlebar,
|
||||
.maximized > headerbar > headerbar,
|
||||
.maximized > .titlebar > .titlebar,
|
||||
.maximized > .titlebar > stack > headerbar,
|
||||
.maximized headerbar:last-child,
|
||||
.maximized .titlebar:last-child {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.maximized headerbar > box.right,
|
||||
.maximized .titlebar > box.right {
|
||||
margin: 0 -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.maximized .titlebar.default-decoration {
|
||||
margin: -200px 0 0;
|
||||
opacity: 0;
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
#panel.small-spacing .panel-button {
|
||||
-natural-hpadding: 8px;
|
||||
-minimum-hpadding: 6px;
|
||||
}
|
||||
|
||||
#panel.small-spacing .panel-button .system-status-icon {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#panel.small-spacing .panel-button .panel-status-indicators-box {
|
||||
spacing: 12px;
|
||||
}
|
||||
|
||||
#panel.small-spacing.extra-spacing .panel-button .panel-status-indicators-box {
|
||||
spacing: 10px;
|
||||
}
|
||||
|
||||
#panel.small-spacing.extra-spacing #appMenu {
|
||||
margin: 0 8px;
|
||||
}
|
||||
|
||||
#panel .panel-button.window-controls {
|
||||
-natural-hpadding: 0px;
|
||||
-minimum-hpadding: 0px;
|
||||
}
|
||||
|
||||
#panel .window-controls-box {
|
||||
spacing: 2px;
|
||||
}
|
||||
|
||||
#panel .window-controls-box .window-button {
|
||||
width: 22px;
|
||||
}
|
||||
|
||||
#panelLeft .window-controls-box:first-child .window-button:first-child {
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
#panelRight .window-controls-box:last-child .window-button:last-child {
|
||||
padding-right: 3px;
|
||||
}
|
||||
|
||||
#panel .window-controls-box .icon {
|
||||
background-color: transparent;
|
||||
border-radius: 0;
|
||||
box-shadow: none;
|
||||
border: 0;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.50001" y2="9.50001">
|
||||
<stop offset="0" stop-color="#ec6e44"/>
|
||||
<stop offset="1" stop-color="#e76b41"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 -1 1 0 .00001 -1053.36223)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="8.999996" y2="8.999996"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 -1.0357118 1.0357118 0 -.339252 -1091.3189)" x1="-1070.1036" x2="-1055.6208" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499992" cy="9.500005" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0 4.1362 3.363788 7.5 7.5 7.5s7.5-3.3638 7.5-7.5-3.363788-7.5-7.5-7.5-7.5 3.3638-7.5 7.5zm1 0c0-3.5957 2.9042281-6.5 6.5-6.5 3.595772 0 6.5 2.9043 6.5 6.5 0 3.5958-2.904228 6.5-6.5 6.5-3.5957719 0-6.5-2.9042-6.5-6.5z" fill="url(#c)" opacity=".05"/>
|
||||
<path d="m2.00001 9.4991c0 4.1392 3.3608366 7.5 7.5 7.5 4.139163 0 7.5-3.3608 7.5-7.5 0-4.1391-3.360837-7.5-7.5-7.5-4.1391634 0-7.5 3.3609-7.5 7.5zm.5 0c0-3.8689 3.1310567-7 7-7 3.868943 0 7 3.1311 7 7 0 3.869-3.131057 7-7 7-3.8689433 0-7-3.131-7-7z" fill="url(#d)" opacity=".05"/>
|
||||
<g fill="#32312e">
|
||||
<path d="m11.8005 6.49328-.35352.35351-4.59961 4.59961-.35351.35352.70703.70703.35352-.35352 4.59961-4.5996.35351-.35352z"/>
|
||||
<path d="m7.20089 6.49328-.70703.70703.35351.35352 4.59961 4.5996.35352.35352.70703-.70703-.35351-.35352-4.59961-4.59961z"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.8 KiB |
|
@ -1,22 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.5" y2="9.5">
|
||||
<stop offset="0" stop-color="#e24f1b"/>
|
||||
<stop offset=".50001228" stop-color="#f17750"/>
|
||||
<stop offset="1" stop-color="#fba992"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 1 1 0 .00001 1072.3622)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 1.0357118 1.0357118 0 -.339252 1110.3189)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499983" cy="9.499995" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0-4.1362 3.363788-7.5 7.5-7.5s7.5 3.3638 7.5 7.5-3.363788 7.5-7.5 7.5-7.5-3.3638-7.5-7.5zm1 0c0 3.5958 2.9042281 6.5 6.5 6.5 3.595772 0 6.5-2.9042 6.5-6.5 0-3.5957-2.904228-6.5-6.5-6.5-3.5957719 0-6.5 2.9043-6.5 6.5z" fill="url(#c)" opacity=".07"/>
|
||||
<path d="m2.00001 9.4991c0-4.1391 3.3608366-7.5 7.5-7.5 4.139163 0 7.5 3.3609 7.5 7.5 0 4.1392-3.360837 7.5-7.5 7.5-4.1391634 0-7.5-3.3608-7.5-7.5zm.5 0c0 3.869 3.1310567 7 7 7 3.868943 0 7-3.131 7-7 0-3.8689-3.131057-7-7-7-3.8689433 0-7 3.1311-7 7z" fill="url(#d)" opacity=".07"/>
|
||||
<path d="m7.19922 7.49334-.70703.707.35351.3535 1.94727 1.9473-1.94727 1.9453-.35351.3535.70703.707.35352-.3535 1.94726-1.9472 1.94727 1.9472.35351.3535.70703-.707-.35351-.3535-1.94727-1.9453 1.94727-1.9473.35351-.3535-.70703-.707-.35351.3535-1.94727 1.9472-1.94726-1.9472z" fill="#fff" opacity=".25"/>
|
||||
<g fill="#32312e">
|
||||
<path d="m11.8005 6.49328-.35352.35351-4.59961 4.59961-.35351.35352.70703.70703.35352-.35352 4.59961-4.5996.35351-.35352z"/>
|
||||
<path d="m7.20089 6.49328-.70703.70703.35351.35352 4.59961 4.5996.35352.35352.70703-.70703-.35351-.35352-4.59961-4.59961z"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.1 KiB |
|
@ -1,22 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.5" y2="9.5">
|
||||
<stop offset="0" stop-color="#de4c19"/>
|
||||
<stop offset=".50001228" stop-color="#e55e30"/>
|
||||
<stop offset="1" stop-color="#f58d6e"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 1 1 0 0 1072.3622)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 1.0357118 1.0357118 0 -.339262 1110.3189)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.499992" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499983" cy="9.499995" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2 9.4991c0-4.1362 3.363788-7.5 7.5-7.5s7.5 3.3638 7.5 7.5-3.363788 7.5-7.5 7.5-7.5-3.3638-7.5-7.5zm1 0c0 3.5958 2.9042281 6.5 6.5 6.5 3.595772 0 6.5-2.9042 6.5-6.5 0-3.5957-2.904228-6.5-6.5-6.5-3.5957719 0-6.5 2.9043-6.5 6.5z" fill="url(#c)" opacity=".07"/>
|
||||
<path d="m2 9.4991c0-4.1391 3.3608366-7.5 7.5-7.5 4.139163 0 7.5 3.3609 7.5 7.5 0 4.1392-3.360837 7.5-7.5 7.5-4.1391634 0-7.5-3.3608-7.5-7.5zm.5 0c0 3.869 3.1310567 7 7 7 3.868943 0 7-3.131 7-7 0-3.8689-3.131057-7-7-7-3.8689433 0-7 3.1311-7 7z" fill="url(#d)" opacity=".07"/>
|
||||
<path d="m7.19921 7.49334-.70703.707.35352.3535 1.94726 1.9473-1.94726 1.9453-.35352.3535.70703.707.35352-.3535 1.94727-1.9472 1.94726 1.9472.35352.3535.70703-.707-.35352-.3535-1.94726-1.9453 1.94726-1.9473.35352-.3535-.70703-.707-.35352.3535-1.94726 1.9472-1.94727-1.9472z" fill="#fff" opacity=".25"/>
|
||||
<g fill="#32312e">
|
||||
<path d="m11.80051 6.49328-.35352.35351-4.59961 4.59961-.35351.35352.70703.70703.35352-.35352 4.59961-4.5996.35351-.35352z"/>
|
||||
<path d="m7.2009 6.49328-.70703.70703.35351.35352 4.59961 4.5996.35352.35352.70703-.70703-.35351-.35352-4.59961-4.59961z"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.1 KiB |
|
@ -1,17 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.5" y2="9.5">
|
||||
<stop offset="0" stop-color="#77766f"/>
|
||||
<stop offset="1" stop-color="#74736c"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 -1 1 0 .00001 -1053.36223)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="8.999996" y2="8.999996"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 -1.0357118 1.0357118 0 -.339252 -1091.3189)" x1="-1070.1036" x2="-1055.6208" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499983" cy="9.499995" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0 4.1362 3.363788 7.5 7.5 7.5s7.5-3.3638 7.5-7.5-3.363788-7.5-7.5-7.5-7.5 3.3638-7.5 7.5zm1 0c0-3.5957 2.9042281-6.5 6.5-6.5 3.595772 0 6.5 2.9043 6.5 6.5 0 3.5958-2.904228 6.5-6.5 6.5-3.5957719 0-6.5-2.9042-6.5-6.5z" fill="url(#c)" opacity=".05"/>
|
||||
<path d="m2.00001 9.4991c0 4.1392 3.3608366 7.5 7.5 7.5 4.139163 0 7.5-3.3608 7.5-7.5 0-4.1391-3.360837-7.5-7.5-7.5-4.1391634 0-7.5 3.3609-7.5 7.5zm.5 0c0-3.8689 3.1310567-7 7-7 3.868943 0 7 3.1311 7 7 0 3.869-3.131057 7-7 7-3.8689433 0-7-3.131-7-7z" fill="url(#d)" opacity=".05"/>
|
||||
<path d="m5.99972 5.99914v.5 6.5h7v-7zm1 1h5v5h-5z" fill="#3d3c37"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1,19 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.5" y2="9.5">
|
||||
<stop offset="0" stop-color="#969696"/>
|
||||
<stop offset=".50001228" stop-color="#bdbdbd"/>
|
||||
<stop offset="1" stop-color="#cacaca"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 1 1 0 .00001 1072.3622)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 1.0357118 1.0357118 0 -.339252 1110.3189)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499983" cy="9.499995" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0-4.1362 3.363788-7.5 7.5-7.5s7.5 3.3638 7.5 7.5-3.363788 7.5-7.5 7.5-7.5-3.3638-7.5-7.5zm1 0c0 3.5958 2.9042281 6.5 6.5 6.5 3.595772 0 6.5-2.9042 6.5-6.5 0-3.5957-2.904228-6.5-6.5-6.5-3.5957719 0-6.5 2.9043-6.5 6.5z" fill="url(#c)" opacity=".07"/>
|
||||
<path d="m2.00001 9.4991c0-4.1391 3.3608366-7.5 7.5-7.5 4.139163 0 7.5 3.3609 7.5 7.5 0 4.1392-3.360837 7.5-7.5 7.5-4.1391634 0-7.5-3.3608-7.5-7.5zm.5 0c0 3.869 3.1310567 7 7 7 3.868943 0 7-3.131 7-7 0-3.8689-3.131057-7-7-7-3.8689433 0-7 3.1311-7 7z" fill="url(#d)" opacity=".07"/>
|
||||
<path d="m5.99972 6.99914v.5 6.5h7v-7zm1 1h5v5h-5z" fill="#fff" opacity=".15"/>
|
||||
<path d="m5.99972 5.99914v.5 6.5h7v-7zm1 1h5v5h-5z" fill="#51504b"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.7 KiB |
|
@ -1,19 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.5" y2="9.5">
|
||||
<stop offset="0" stop-color="#5a5955"/>
|
||||
<stop offset=".50001228" stop-color="#75746d"/>
|
||||
<stop offset="1" stop-color="#8e8d88"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 1 1 0 .00001 1072.3622)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 1.0357118 1.0357118 0 -.339252 1110.3189)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499983" cy="9.499995" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0-4.1362 3.363788-7.5 7.5-7.5s7.5 3.3638 7.5 7.5-3.363788 7.5-7.5 7.5-7.5-3.3638-7.5-7.5zm1 0c0 3.5958 2.9042281 6.5 6.5 6.5 3.595772 0 6.5-2.9042 6.5-6.5 0-3.5957-2.904228-6.5-6.5-6.5-3.5957719 0-6.5 2.9043-6.5 6.5z" fill="url(#c)" opacity=".07"/>
|
||||
<path d="m2.00001 9.4991c0-4.1391 3.3608366-7.5 7.5-7.5 4.139163 0 7.5 3.3609 7.5 7.5 0 4.1392-3.360837 7.5-7.5 7.5-4.1391634 0-7.5-3.3608-7.5-7.5zm.5 0c0 3.869 3.1310567 7 7 7 3.868943 0 7-3.131 7-7 0-3.8689-3.131057-7-7-7-3.8689433 0-7 3.1311-7 7z" fill="url(#d)" opacity=".07"/>
|
||||
<path d="m5.99973 6.99914v.5 6.5h7v-7zm1 1h5v5h-5z" fill="#fff" opacity=".1"/>
|
||||
<path d="m5.99973 5.99914v.5 6.5h7v-7zm1 1h5v5h-5z" fill="#3d3c37"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.7 KiB |
|
@ -1,17 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.50001" y2="9.50001">
|
||||
<stop offset="0" stop-color="#77766f"/>
|
||||
<stop offset="1" stop-color="#74736c"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 -1 1 0 .00001 -1053.36223)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="8.999996" y2="8.999996"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 -1.0357118 1.0357118 0 -.339252 -1091.3189)" x1="-1070.1036" x2="-1055.6208" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499992" cy="9.500005" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0 4.1362 3.363788 7.5 7.5 7.5s7.5-3.3638 7.5-7.5-3.363788-7.5-7.5-7.5-7.5 3.3638-7.5 7.5zm1 0c0-3.5957 2.9042281-6.5 6.5-6.5 3.595772 0 6.5 2.9043 6.5 6.5 0 3.5958-2.904228 6.5-6.5 6.5-3.5957719 0-6.5-2.9042-6.5-6.5z" fill="url(#c)" opacity=".05"/>
|
||||
<path d="m2.00001 9.4991c0 4.1392 3.3608366 7.5 7.5 7.5 4.139163 0 7.5-3.3608 7.5-7.5 0-4.1391-3.360837-7.5-7.5-7.5-4.1391634 0-7.5 3.3609-7.5 7.5zm.5 0c0-3.8689 3.1310567-7 7-7 3.868943 0 7 3.1311 7 7 0 3.869-3.131057 7-7 7-3.8689433 0-7-3.131-7-7z" fill="url(#d)" opacity=".05"/>
|
||||
<path d="m6.00002 8.99999h7v1h-7z" fill="#3d3c37"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.5 KiB |
|
@ -1,19 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.50001" y2="9.50001">
|
||||
<stop offset="0" stop-color="#969696"/>
|
||||
<stop offset=".50001228" stop-color="#bdbdbd"/>
|
||||
<stop offset="1" stop-color="#cacaca"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 1 1 0 .00001 1072.3622)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<linearGradient id="d" gradientTransform="matrix(0 1.0357118 1.0357118 0 -.339252 1110.3189)" x1="-1070.3622" x2="-1055.3622" xlink:href="#b" y1="9.499995" y2="9.499995"/>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499992" cy="9.500005" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0-4.1362 3.363788-7.5 7.5-7.5s7.5 3.3638 7.5 7.5-3.363788 7.5-7.5 7.5-7.5-3.3638-7.5-7.5zm1 0c0 3.5958 2.9042281 6.5 6.5 6.5 3.595772 0 6.5-2.9042 6.5-6.5 0-3.5957-2.904228-6.5-6.5-6.5-3.5957719 0-6.5 2.9043-6.5 6.5z" fill="url(#c)" opacity=".07"/>
|
||||
<path d="m2.00001 9.4991c0-4.1391 3.3608366-7.5 7.5-7.5 4.139163 0 7.5 3.3609 7.5 7.5 0 4.1392-3.360837 7.5-7.5 7.5-4.1391634 0-7.5-3.3608-7.5-7.5zm.5 0c0 3.869 3.1310567 7 7 7 3.868943 0 7-3.131 7-7 0-3.8689-3.131057-7-7-7-3.8689433 0-7 3.1311-7 7z" fill="url(#d)" opacity=".07"/>
|
||||
<path d="m5.99999 9.00005h7v1h-7z" fill="#51504b"/>
|
||||
<path d="m5.99999 10.00005h7v1h-7z" fill="#fff" opacity=".15"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.7 KiB |
|
@ -1,19 +0,0 @@
|
|||
<svg height="19" width="19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-16.999985" x2="-2.000025" y1="9.5" y2="9.5">
|
||||
<stop offset="0" stop-color="#5a5955"/>
|
||||
<stop offset=".50001228" stop-color="#75746d"/>
|
||||
<stop offset="1" stop-color="#8e8d88"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" gradientTransform="matrix(0 1 1 0 .00001 1072.3622)" x1="-1070.3622" x2="-1055.3622" xlink:href="#d" y1="9.499995" y2="9.499995"/>
|
||||
<linearGradient id="c" gradientTransform="matrix(0 1.0357118 1.0357118 0 -.339252 1110.3189)" x1="-1070.3622" x2="-1055.3622" xlink:href="#d" y1="9.499995" y2="9.499995"/>
|
||||
<linearGradient id="d" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#fff"/>
|
||||
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<circle cx="9.500002" cy="9.499983" fill="#383734" r="8.5"/>
|
||||
<circle cx="-9.499983" cy="9.499995" fill="url(#a)" r="7.49998" transform="rotate(-90)"/>
|
||||
<path d="m2.00001 9.4991c0-4.1362 3.363788-7.5 7.5-7.5s7.5 3.3638 7.5 7.5-3.363788 7.5-7.5 7.5-7.5-3.3638-7.5-7.5zm1 0c0 3.5958 2.9042281 6.5 6.5 6.5 3.595772 0 6.5-2.9042 6.5-6.5 0-3.5957-2.904228-6.5-6.5-6.5-3.5957719 0-6.5 2.9043-6.5 6.5z" fill="url(#b)" opacity=".07"/>
|
||||
<path d="m2.00001 9.4991c0-4.1391 3.3608366-7.5 7.5-7.5 4.139163 0 7.5 3.3609 7.5 7.5 0 4.1392-3.360837 7.5-7.5 7.5-4.1391634 0-7.5-3.3608-7.5-7.5zm.5 0c0 3.869 3.1310567 7 7 7 3.868943 0 7-3.131 7-7 0-3.8689-3.131057-7-7-7-3.8689433 0-7 3.1311-7 7z" fill="url(#c)" opacity=".07"/>
|
||||
<path d="m6 8.99999h7v1h-7z" fill="#3d3c37"/>
|
||||
<path d="m6 9.99999h7v1h-7z" fill="#fff" opacity=".1"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.7 KiB |
|
@ -1,40 +0,0 @@
|
|||
.window-button .icon {
|
||||
width: 19px;
|
||||
height: 19px;
|
||||
}
|
||||
|
||||
.close .icon {
|
||||
background-image: url("close.svg");
|
||||
}
|
||||
|
||||
.close:hover .icon {
|
||||
background-image: url("close-hover.svg");
|
||||
}
|
||||
|
||||
.close:active .icon {
|
||||
background-image: url("close-active.svg");
|
||||
}
|
||||
|
||||
.minimize .icon {
|
||||
background-image: url("minimize.svg");
|
||||
}
|
||||
|
||||
.minimize:hover .icon {
|
||||
background-image: url("minimize-hover.svg");
|
||||
}
|
||||
|
||||
.minimize:active .icon {
|
||||
background-image: url("minimize-active.svg");
|
||||
}
|
||||
|
||||
.maximize .icon {
|
||||
background-image: url("maximize.svg");
|
||||
}
|
||||
|
||||
.maximize:hover .icon {
|
||||
background-image: url("maximize-hover.svg");
|
||||
}
|
||||
|
||||
.maximize:active .icon {
|
||||
background-image: url("maximize-active.svg");
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m12 4.99999a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-3 3.92188h.75c.008-.0001.0156-.00035.0234 0 .19121.008.3824.0964.51562.23437l1.71094 1.71094 1.73438-1.71094c.19921-.17287.335-.22913.51562-.23437h.75v.75c0 .21485-.0258.41298-.1875.5625l-1.71094 1.71093 1.6875 1.6875c.14114.14113.21093.34009.21094.53907v.75h-.75c-.19898-.00001-.39794-.0698-.53906-.21094l-1.7109-1.71094-1.71094 1.71094c-.14112.14114-.34009.21094-.53906.21094h-.75v-.75c0-.19897.0698-.39794.21094-.53907l1.71094-1.6875-1.71094-1.71093c-.15806-.14598-.22737-.35194-.21094-.5625z" fill="#be3841"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 668 B |
|
@ -1,3 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m12 5a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-3 3.921875h.75c.008-.00009.0156-.000345.0234 0 .19121.0084.3824.09643.51562.234375l1.71098 1.710938 1.73438-1.710938c.19921-.172875.335-.229125.51562-.234375h.75v.75c0 .214853-.0258.412987-.1875.5625l-1.71094 1.710937 1.6875 1.687498c.14114.14113.21093.34009.21094.53907v.75h-.75c-.19898-.00001-.39794-.0698-.53906-.21094l-1.71094-1.71094-1.71094 1.71094c-.14112.14114-.34009.21094-.53906.21094h-.75v-.75c0-.19897.0698-.39794.21094-.53907l1.71094-1.687498-1.71094-1.710937c-.15806-.145972-.22737-.351937-.21094-.5625z" fill="#d7787d"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 684 B |
|
@ -1,3 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m12.00001 5a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-3 3.921875h.75c.008-.00009.0156-.000345.0234 0 .19121.0084.3824.09643.51562.234375l1.71098 1.710938 1.73438-1.710938c.19921-.172875.335-.229125.51562-.234375h.75v.75c0 .214853-.0258.412987-.1875.5625l-1.71094 1.710937 1.6875 1.6875c.14114.141128.21093.340088.21094.539063v.75h-.75c-.19898-.000008-.39794-.06982-.53906-.210937l-1.71094-1.710938-1.71094 1.710938c-.14112.141142-.34009.210937-.53906.210937h-.75v-.75c0-.198967.0698-.397935.21094-.539063l1.71094-1.6875-1.71094-1.710937c-.15806-.145972-.22737-.351937-.21094-.5625z" fill="#cc575d"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 700 B |
|
@ -1,7 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<ellipse cx="12" cy="11.99998" fill="#5f697f" opacity=".45" rx="6" ry="6.000001"/>
|
||||
<path d="m12 4.99998a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1 -6 6 6 6 0 0 1 -6-6 6 6 0 0 1 6-6z" fill="#15171c" opacity=".37"/>
|
||||
<path d="m10.799505 8.99998h3.381737c.450297 0 .816227.36847.818758.8188v3.3817zm2.407413 6.00692h-3.395078c-.450346 0-.818758-.36842-.818758-.81875v-3.39509z" fill="#c4c7cc"/>
|
||||
<circle cx="11.99999" cy="11.99998" fill="#5294e2" r="7"/>
|
||||
<path d="m10.799495 8.99998h3.381737c.450297 0 .816227.36847.818758.8188v3.3817zm2.407413 6.00692h-3.395078c-.450346 0-.818758-.36842-.818758-.81875v-3.39509z" fill="#fff"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 749 B |
|
@ -1,5 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<ellipse cx="12" cy="11.99998" fill="#5f697f" opacity=".45" rx="6" ry="6.000001"/>
|
||||
<path d="m12 4.99998a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1 -6 6 6 6 0 0 1 -6-6 6 6 0 0 1 6-6z" fill="#15171c" opacity=".37"/>
|
||||
<path d="m10.799505 8.99998h3.381737c.450297 0 .816227.36847.818758.8188v3.3817zm2.407413 6.00692h-3.395078c-.450346 0-.818758-.36842-.818758-.81875v-3.39509z" fill="#c4c7cc"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 512 B |
|
@ -1,3 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m10.79948 8.99998h3.3818c.4503 0 .8162.36847.8187.8188v3.3817zm2.4074 6.00692h-3.395c-.4504 0-.8188-.36842-.8188-.81875v-3.39509z" fill="#b9bcc2" opacity=".7"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 243 B |
|
@ -1,4 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="11.99999" cy="11.99998" fill="#5294e2" r="7"/>
|
||||
<path d="m8.99999 10.99998v2h6v-2z" fill="#fff"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 184 B |
|
@ -1,5 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<ellipse cx="12" cy="11.99998" fill="#5f697f" opacity=".45" rx="6" ry="6.000001"/>
|
||||
<path d="m12 4.99998a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1 -6 6 6 6 0 0 1 -6-6 6 6 0 0 1 6-6z" fill="#15171c" opacity=".37"/>
|
||||
<path d="m9 10.99998v2h6v-2z" fill="#c4c7cc"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 382 B |
|
@ -1,3 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m8.99998 10.99998v2h6v-2z" fill="#b9bcc2" opacity=".7"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 139 B |
|
@ -1,40 +0,0 @@
|
|||
.window-button .icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.close .icon {
|
||||
background-image: url("close.svg");
|
||||
}
|
||||
|
||||
.close:hover .icon {
|
||||
background-image: url("close-hover.svg");
|
||||
}
|
||||
|
||||
.close:active .icon {
|
||||
background-image: url("close-active.svg");
|
||||
}
|
||||
|
||||
.minimize .icon {
|
||||
background-image: url("minimize.svg");
|
||||
}
|
||||
|
||||
.minimize:hover .icon {
|
||||
background-image: url("minimize-hover.svg");
|
||||
}
|
||||
|
||||
.minimize:active .icon {
|
||||
background-image: url("minimize-active.svg");
|
||||
}
|
||||
|
||||
.maximize .icon {
|
||||
background-image: url("maximize.svg");
|
||||
}
|
||||
|
||||
.maximize:hover .icon {
|
||||
background-image: url("maximize-hover.svg");
|
||||
}
|
||||
|
||||
.maximize:active .icon {
|
||||
background-image: url("maximize-active.svg");
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m12 4.99999a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-3 3.92188h.75c.008-.0001.0156-.00035.0234 0 .19121.008.3824.0964.51562.23437l1.71094 1.71094 1.73438-1.71094c.19921-.17287.335-.22913.51562-.23437h.75v.75c0 .21485-.0258.41298-.1875.5625l-1.71094 1.71093 1.6875 1.6875c.14114.14113.21093.34009.21094.53907v.75h-.75c-.19898-.00001-.39794-.0698-.53906-.21094l-1.7109-1.71094-1.71094 1.71094c-.14112.14114-.34009.21094-.53906.21094h-.75v-.75c0-.19897.0698-.39794.21094-.53907l1.71094-1.6875-1.71094-1.71093c-.15806-.14598-.22737-.35194-.21094-.5625z" fill="#f13039"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 668 B |
|
@ -1,3 +0,0 @@
|
|||
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m12 5a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-3 3.921875h.75c.008-.00009.0156-.000345.0234 0 .19121.0084.3824.09643.51562.234375l1.71098 1.710938 1.73438-1.710938c.19921-.172875.335-.229125.51562-.234375h.75v.75c0 .214853-.0258.412987-.1875.5625l-1.71094 1.710937 1.6875 1.687498c.14114.14113.21093.34009.21094.53907v.75h-.75c-.19898-.00001-.39794-.0698-.53906-.21094l-1.71094-1.71094-1.71094 1.71094c-.14112.14114-.34009.21094-.53906.21094h-.75v-.75c0-.19897.0698-.39794.21094-.53907l1.71094-1.687498-1.71094-1.710937c-.15806-.145972-.22737-.351937-.21094-.5625z" fill="#f68086"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 684 B |