From 6601c54c5139e75cee19e073e24b065ec7fc9435 Mon Sep 17 00:00:00 2001 From: Davisson Paulino <dhp14@inf.ufpr.br> Date: Wed, 11 Oct 2017 10:20:36 -0300 Subject: [PATCH] SCRUM#14: Created package --- .deploy.sh | 23 + .gitignore | 14 + .gitlab-ci.yml | 63 + dput.cf | 9 + package/COPYING | 341 ++ package/Makefile | 84 + package/README.md | 38 + package/Settings.ui | 2998 +++++++++++++++++ package/appIcons.js | 1256 +++++++ package/convenience.js | 74 + package/dash.js | 1180 +++++++ package/debian/changelog | 72 + package/debian/compat | 1 + package/debian/control | 25 + package/debian/copyright | 91 + package/debian/docs | 1 + package/debian/install | 1 + .../patches/makefile-clean-translations | 20 + package/debian/patches/series | 1 + package/debian/rules | 13 + package/debian/source/format | 1 + package/debian/watch | 3 + package/docking.js | 1909 +++++++++++ package/extension.js | 21 + package/intellihide.js | 323 ++ package/media/logo.svg | 528 +++ package/media/screenshot.jpg | Bin 0 -> 148723 bytes package/metadata.json | 10 + package/po/ar.po | 554 +++ package/po/cs.po | 460 +++ package/po/de.po | 589 ++++ package/po/el.po | 442 +++ package/po/es.po | 438 +++ package/po/fr.po | 438 +++ package/po/hu.po | 440 +++ package/po/it.po | 453 +++ package/po/ja.po | 458 +++ package/po/nl.po | 581 ++++ package/po/pl.po | 564 ++++ package/po/pt.po | 526 +++ package/po/pt_BR.po | 555 +++ package/po/ru.po | 564 ++++ package/po/sk.po | 454 +++ package/po/sr.po | 465 +++ package/po/sr@latin.po | 464 +++ package/po/sv.po | 452 +++ package/po/tr.po | 457 +++ package/po/zh_CN.po | 524 +++ package/prefs.js | 705 ++++ ....shell.extensions.dash-to-dock.gschema.xml | 713 ++++ package/stylesheet.css | 109 + package/theming.js | 293 ++ package/utils.js | 123 + package/windowPreview.js | 595 ++++ 54 files changed, 21516 insertions(+) create mode 100755 .deploy.sh create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 dput.cf create mode 100644 package/COPYING create mode 100644 package/Makefile create mode 100644 package/README.md create mode 100644 package/Settings.ui create mode 100644 package/appIcons.js create mode 100644 package/convenience.js create mode 100644 package/dash.js create mode 100644 package/debian/changelog create mode 100644 package/debian/compat create mode 100644 package/debian/control create mode 100644 package/debian/copyright create mode 100644 package/debian/docs create mode 100644 package/debian/install create mode 100644 package/debian/patches/makefile-clean-translations create mode 100644 package/debian/patches/series create mode 100755 package/debian/rules create mode 100644 package/debian/source/format create mode 100644 package/debian/watch create mode 100644 package/docking.js create mode 100644 package/extension.js create mode 100644 package/intellihide.js create mode 100644 package/media/logo.svg create mode 100644 package/media/screenshot.jpg create mode 100644 package/metadata.json create mode 100644 package/po/ar.po create mode 100644 package/po/cs.po create mode 100644 package/po/de.po create mode 100644 package/po/el.po create mode 100644 package/po/es.po create mode 100644 package/po/fr.po create mode 100644 package/po/hu.po create mode 100644 package/po/it.po create mode 100644 package/po/ja.po create mode 100644 package/po/nl.po create mode 100644 package/po/pl.po create mode 100644 package/po/pt.po create mode 100644 package/po/pt_BR.po create mode 100644 package/po/ru.po create mode 100644 package/po/sk.po create mode 100644 package/po/sr.po create mode 100644 package/po/sr@latin.po create mode 100644 package/po/sv.po create mode 100644 package/po/tr.po create mode 100644 package/po/zh_CN.po create mode 100644 package/prefs.js create mode 100644 package/schemas/org.gnome.shell.extensions.dash-to-dock.gschema.xml create mode 100644 package/stylesheet.css create mode 100644 package/theming.js create mode 100644 package/utils.js create mode 100644 package/windowPreview.js diff --git a/.deploy.sh b/.deploy.sh new file mode 100755 index 0000000..7088e4f --- /dev/null +++ b/.deploy.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# This script uploads an includes a .deb package in our debian repository. +# The distribution is chosen based on the gitlab-ci stage we are on. + +apt-get update && apt-get install -y dput ssh + +eval $(ssh-agent -s) +ssh-add <(echo "$PRIV_KEY") + +echo "Deploy job name: $CI_JOB_NAME" + +if [ "$CI_JOB_NAME" = "deploy_for_testing" ]; then + dput -u -f --config=dput.cf repo build/*.changes +elif [ "$CI_JOB_NAME" = "deploy_for_stable" ]; then + CHANGELOG="package/debian/changelog" + LINE=$(head -n 1 $CHANGELOG) + PACKAGE=$(echo $LINE | cut -d' ' -f1) + VERSION=$(echo $LINE | cut -d' ' -f2 | grep -o -E '[0-9]*-[0-9]*') + + REPREPRO_CMD="reprepro -Vb /home/repository/www/lc2 copysrc stable testing $PACKAGE $VERSION" + ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa repository@repo.c3sl.ufpr.br "$REPREPRO_CMD" +fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb8bc73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.compiled +package/debian/gnome-shell-extension-dashtodock +package/debian/gnome-shell-extension-dashtodock.debhelper.log +package/debian/gnome-shell-extension-dashtodock.substvars +package/debian/gnome-shell-extension-dashtodock.*.debhelper +package/debian/files +package/debian/debhelper-build-stamp +gnome-shell-extension-dashtodock_*.tar.xz +gnome-shell-extension-dashtodock_*.tar.gz +gnome-shell-extension-dashtodock_*.build +gnome-shell-extension-dashtodock_*.dsc +gnome-shell-extension-dashtodock_*.changes +gnome-shell-extension-dashtodock_*.deb +*.mo diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..ded4f58 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,63 @@ +## Template para empacotamento utilizando o Gitlab-ci. + +stages: + - build + - test + - deploy + +build: + stage: build + artifacts: + paths: + - build/ + tags: + - debian-packaging + script: + - if [ ! -d "package/debian/" ] ; then exit 1; fi + - apt-get update && apt-get install -y debhelper libglib2.0-bin + - LINE=$(head -n 1 package/debian/changelog) + - PACKAGE=$(echo $LINE | cut -d' ' -f1) + - VERSION=$(echo $LINE | cut -d' ' -f2 | grep -o -E '[0-9]*-[0-9]*') + - VERSION=$(echo $VERSION | cut -d'-' -f1) + - tar --exclude=debian -czf ${PACKAGE}_${VERSION}.orig.tar.gz package/* + - cd package ; debuild -us -uc -sa + - cd ../ + - mkdir build/ + - mv ${PACKAGE}* build/ + +test: + stage: test + tags: + - ubuntu + - regular + script: + # TODO: find a way to get the dependencies automatically + - apt-get update + - DEBIAN_FRONTEND=noninteractive apt-get install -y gnome-shell gir1.2-clutter-1.0 + - dpkg -i build/*.deb + - echo "Estágio de Teste finalizado" + dependencies: + - build + +deploy_for_testing: + stage: deploy + only: + - master + tags: + - debian-packaging + script: + - ./.deploy.sh + dependencies: + - build + +deploy_for_stable: + stage: deploy + when: manual + only: + - master + tags: + - debian-packaging + script: + - ./.deploy.sh + dependencies: + - build diff --git a/dput.cf b/dput.cf new file mode 100644 index 0000000..1a3ee4c --- /dev/null +++ b/dput.cf @@ -0,0 +1,9 @@ +[repo] +fqdn = repo.c3sl.ufpr.br +method = scp +login = repository +incoming = /home/repository/www/lc2/incoming +allow_unsigned_uploads = 1 +ssh_config_options = User=repository + StrictHostKeyChecking=no +post_upload_command = ssh -l repository -i ~/.ssh/id_rsa repo.c3sl.ufpr.br "reprepro -Vb /home/repository/www/lc2 processincoming default" diff --git a/package/COPYING b/package/COPYING new file mode 100644 index 0000000..8d61b15 --- /dev/null +++ b/package/COPYING @@ -0,0 +1,341 @@ + 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. + diff --git a/package/Makefile b/package/Makefile new file mode 100644 index 0000000..40a2bc0 --- /dev/null +++ b/package/Makefile @@ -0,0 +1,84 @@ +# Basic Makefile + +UUID = dash-to-dock@micxgx.gmail.com +BASE_MODULES = extension.js stylesheet.css metadata.json COPYING README.md +EXTRA_MODULES = convenience.js dash.js docking.js appIcons.js windowPreview.js intellihide.js prefs.js theming.js utils.js Settings.ui +EXTRA_MEDIA = logo.svg +TOLOCALIZE = prefs.js appIcons.js +MSGSRC = $(wildcard po/*.po) +ifeq ($(strip $(DESTDIR)),) + INSTALLBASE = $(HOME)/.local/share/gnome-shell/extensions +else + INSTALLBASE = $(DESTDIR)/usr/share/gnome-shell/extensions +endif +INSTALLNAME = dash-to-dock@micxgx.gmail.com + +# The command line passed variable VERSION is used to set the version string +# in the metadata and in the generated zip-file. If no VERSION is passed, the +# current commit SHA1 is used as version number in the metadata while the +# generated zip file has no string attached. +ifdef VERSION + VSTRING = _v$(VERSION) +else + VERSION = $(shell git rev-parse HEAD) + VSTRING = +endif + +all: extension + +clean: + rm -f ./schemas/gschemas.compiled + +extension: ./schemas/gschemas.compiled $(MSGSRC:.po=.mo) + +./schemas/gschemas.compiled: ./schemas/org.gnome.shell.extensions.dash-to-dock.gschema.xml + glib-compile-schemas ./schemas/ + +potfile: ./po/dashtodock.pot + +mergepo: potfile + for l in $(MSGSRC); do \ + msgmerge -U $$l ./po/dashtodock.pot; \ + done; + +./po/dashtodock.pot: $(TOLOCALIZE) Settings.ui + mkdir -p po + xgettext -k --keyword=__ --keyword=N__ --add-comments='Translators:' -o po/dashtodock.pot --package-name "Dash to Dock" $(TOLOCALIZE) + intltool-extract --type=gettext/glade Settings.ui + xgettext -k --keyword=_ --keyword=N_ --join-existing -o po/dashtodock.pot Settings.ui.h + +./po/%.mo: ./po/%.po + msgfmt -c $< -o $@ + +install: install-local + +install-local: _build + rm -rf $(INSTALLBASE)/$(INSTALLNAME) + mkdir -p $(INSTALLBASE)/$(INSTALLNAME) + cp -r ./_build/* $(INSTALLBASE)/$(INSTALLNAME)/ + -rm -fR _build + echo done + +zip-file: _build + cd _build ; \ + zip -qr "$(UUID)$(VSTRING).zip" . + mv _build/$(UUID)$(VSTRING).zip ./ + -rm -fR _build + +_build: all + -rm -fR ./_build + mkdir -p _build + cp $(BASE_MODULES) $(EXTRA_MODULES) _build + mkdir -p _build/media + cd media ; cp $(EXTRA_MEDIA) ../_build/media/ + mkdir -p _build/schemas + cp schemas/*.xml _build/schemas/ + cp schemas/gschemas.compiled _build/schemas/ + mkdir -p _build/locale + for l in $(MSGSRC:.po=.mo) ; do \ + lf=_build/locale/`basename $$l .mo`; \ + mkdir -p $$lf; \ + mkdir -p $$lf/LC_MESSAGES; \ + cp $$l $$lf/LC_MESSAGES/dashtodock.mo; \ + done; + sed -i 's/"version": -1/"version": "$(VERSION)"/' _build/metadata.json; diff --git a/package/README.md b/package/README.md new file mode 100644 index 0000000..8827a6c --- /dev/null +++ b/package/README.md @@ -0,0 +1,38 @@ +# Dash to Dock + + +## 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. + +For 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. + +## Donations + +You can + +<a href="http://flattr.com/thing/1047592/" target="_blank"> +<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a> + +or + +<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3S5HFFG2BWGPL" target="_blank"> +<img src="https://www.paypalobjects.com/en_US/GB/i/btn/btn_donateCC_LG.gif" alt="PayPal — The safer, easier way to pay online."/></a> diff --git a/package/Settings.ui b/package/Settings.ui new file mode 100644 index 0000000..d8d498f --- /dev/null +++ b/package/Settings.ui @@ -0,0 +1,2998 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> +<interface> + <requires lib="gtk+" version="3.12"/> + <object class="GtkAdjustment" id="animation_time_adjustment"> + <property name="upper">1</property> + <property name="step_increment">0.050000000000000003</property> + <property name="page_increment">0.25</property> + </object> + <object class="GtkAdjustment" id="shortcut_time_adjustment"> + <property name="upper">10</property> + <property name="step_increment">0.250000000000000003</property> + <property name="page_increment">1</property> + </object> + <object class="GtkAdjustment" id="custom_opacity_adjustement"> + <property name="upper">1</property> + <property name="step_increment">0.01</property> + <property name="page_increment">0.10000000000000001</property> + </object> + <object class="GtkAdjustment" id="dock_size_adjustment"> + <property name="lower">0.33000000000000002</property> + <property name="upper">1</property> + <property name="step_increment">0.01</property> + <property name="page_increment">0.10000000000000001</property> + </object> + <object class="GtkAdjustment" id="dot_border_width_adjustment"> + <property name="upper">10</property> + <property name="step_increment">1</property> + <property name="page_increment">5</property> + </object> + <object class="GtkBox" id="running_dots_advance_settings_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow10"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkBox" id="dot_style_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="dot_style_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label" translatable="yes">Customize indicator style</property> + <property name="justify">fill</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</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="dot_style_settings_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_bottom">1</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkBox" id="dot_color_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">32</property> + <child> + <object class="GtkLabel" id="dot_color_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Color</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkColorButton" id="dot_color_colorbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</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="border_color_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">32</property> + <child> + <object class="GtkLabel" id="dot_border_color_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Border color</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkColorButton" id="dot_border_color_colorbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</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="box_boder_width_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">32</property> + <child> + <object class="GtkLabel" id="dot_border_width_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Border width</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="dot_border_width_spin_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">dot_border_width_adjustment</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</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> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <object class="GtkBox" id="box_overlay_shortcut"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="frame_overlay_show_dock"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox_overlay_shortcut"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow_overlay_shortcut"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="grid_overlay"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="overlay_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="overlay_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Number overlay</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="overlay_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Temporarily show the application numbers over the icons, corresponding to the shortcut.</property> + <property name="wrap">True</property> + <property name="max-width-chars">40</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow_show_dock"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="grid_show_dock"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="show_dock_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="show_dock_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show the dock if it is hidden</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="show_dock_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">If using autohide, the dock will appear for a short time when triggering the shortcut.</property> + <property name="wrap">True</property> + <property name="max-width-chars">40</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow_extra_shortcut"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="grid_shortcut"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkEntry" id="shortcut_entry"> + <property name="width-chars">12</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shortcut_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Shortcut for the options above</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shortcut_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="max-width-chars">40</property> + <property name="label" translatable="yes">Syntax: <Shift>, <Ctrl>, <Alt>, <Super></property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow_timeout"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="grid_timeout"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="hexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSpinButton" id="timeout_spinbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="adjustment">shortcut_time_adjustment</property> + <property name="digits">3</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shortcut_timeout_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Hide timeout (s)</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <object class="GtkBox" id="box_middle_click_options"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="frame_middle_click_options"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox_middle_click_options"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow11"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="buitin_theme7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_description4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="max-width-chars">40</property> + <property name="label" translatable="yes">When set to minimize, double clicking minimizes all the windows of the application.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="builtin_theme_label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Shift+Click action</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="shift_click_action_combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <items> + <item translatable="yes">Raise window</item> + <item translatable="yes">Minimize window</item> + <item translatable="yes">Launch new instance</item> + <item translatable="yes">Cycle through windows</item> + <item translatable="yes">Minimize or overview</item> + <item translatable="yes">Show window previews</item> + <item translatable="yes">Quit</item> + </items> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow_middle_click"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="grid_middle_click"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="description_middle_click"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="max-width-chars">40</property> + <property name="label" translatable="yes">Behavior for Middle-Click.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_middle_click"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Middle-Click action</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="middle_click_action_combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <items> + <item translatable="yes">Raise window</item> + <item translatable="yes">Minimize window</item> + <item translatable="yes">Launch new instance</item> + <item translatable="yes">Cycle through windows</item> + <item translatable="yes">Minimize or overview</item> + <item translatable="yes">Show window previews</item> + <item translatable="yes">Quit</item> + </items> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow_shift_middle_click"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="grid_shift_middle_click"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="description_shift_middle_click"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="max-width-chars">40</property> + <property name="label" translatable="yes">Behavior for Shift+Middle-Click.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_shift_middle_click"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Shift+Middle-Click action</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="shift_middle_click_action_combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <items> + <item translatable="yes">Raise window</item> + <item translatable="yes">Minimize window</item> + <item translatable="yes">Launch new instance</item> + <item translatable="yes">Cycle through windows</item> + <item translatable="yes">Minimize or overview</item> + <item translatable="yes">Show window previews</item> + <item translatable="yes">Quit</item> + </items> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <object class="GtkAdjustment" id="hide_timeout_adjustment"> + <property name="upper">1</property> + <property name="step_increment">0.050000000000000003</property> + <property name="page_increment">0.25</property> + </object> + <object class="GtkAdjustment" id="icon_size_adjustment"> + <property name="lower">16</property> + <property name="upper">128</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkNotebook" id="settings_notebook"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="margin_left">6</property> + <property name="margin_right">6</property> + <property name="margin_top">6</property> + <property name="margin_bottom">6</property> + <child> + <object class="GtkBox" id="position_and_size"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">24</property> + <property name="margin_right">24</property> + <property name="margin_top">24</property> + <property name="margin_bottom">24</property> + <property name="orientation">vertical</property> + <property name="spacing">24</property> + <child> + <object class="GtkFrame" id="dock_display"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="dock_display_listbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="dock_monitor_listboxrow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="dock_monitor_grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="dock_monitor_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show the dock on</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="dock_monitor_combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <signal name="changed" handler="dock_display_combo_changed_cb" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="multi_monitor_button"> + <property name="label" translatable="yes">Show on all monitors.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="dock_position_listboxrow"> + <property name="width_request">100</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkBox" id="dock_position_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="spacing">32</property> + <child> + <object class="GtkLabel" id="dock_position_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Position on screen</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="dock_position_butttons_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">32</property> + <child> + <object class="GtkRadioButton" id="position_left_button"> + <property name="label" translatable="yes">Left</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="valign">center</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="position_left_button_toggled_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="position_bottom_button"> + <property name="label" translatable="yes">Bottom</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="halign">center</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <property name="group">position_left_button</property> + <signal name="toggled" handler="position_bottom_button_toggled_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="position_top_button"> + <property name="label" translatable="yes">Top</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="halign">center</property> + <property name="xalign">0</property> + <property name="image_position">bottom</property> + <property name="draw_indicator">True</property> + <property name="group">position_left_button</property> + <signal name="toggled" handler="position_top_button_toggled_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="position_right_button"> + <property name="label" translatable="yes">Right</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="valign">center</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <property name="group">position_left_button</property> + <signal name="toggled" handler="position_right_button_toggled_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="intelligent_autohide_frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow14"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="intelligent_autohide_grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_description7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Hide the dock when it obstructs a window of the the current application. More refined settings are available.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="builtin_theme_label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Intelligent autohide</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkButton" id="intelligent_autohide_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="xalign">0.46000000834465027</property> + <child> + <object class="GtkImage" id="image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">emblem-system-symbolic</property> + </object> + </child> + <style> + <class name="circular"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="intelligent_autohide_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="size_frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="size_listbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="dock_size_listboxrow"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="dock_size_grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="dock_size_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Dock size limit</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkScale" id="dock_size_scale"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">baseline</property> + <property name="hexpand">True</property> + <property name="adjustment">dock_size_adjustment</property> + <property name="round_digits">0</property> + <property name="digits">2</property> + <property name="value_pos">right</property> + <signal name="format-value" handler="dock_size_scale_format_value_cb" swapped="no"/> + <signal name="value-changed" handler="dock_size_scale_value_changed_cb" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="dock_size_extend_checkbutton"> + <property name="label" translatable="yes">Panel mode: extend to the screen edge</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="icon_size_listboxrow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="icon_size_grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Icon size limit</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkScale" id="icon_size_scale"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">baseline</property> + <property name="hexpand">True</property> + <property name="adjustment">icon_size_adjustment</property> + <property name="round_digits">1</property> + <property name="digits">0</property> + <property name="value_pos">right</property> + <signal name="format-value" handler="icon_size_scale_format_value_cb" swapped="no"/> + <signal name="value-changed" handler="icon_size_scale_value_changed_cb" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="icon_size_fixed_checkbutton"> + <property name="label" translatable="yes">Fixed icon size: scroll to reveal other icons</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </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">Position and size</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkBox" id="apps"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">24</property> + <property name="margin_right">24</property> + <property name="margin_top">24</property> + <property name="margin_bottom">24</property> + <property name="orientation">vertical</property> + <property name="spacing">24</property> + <child> + <object class="GtkFrame" id="customize_theme1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="shrink_dash1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="show_favorite_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shrink_dash_label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show favorite applications</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="shrink_dash2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="show_running_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shrink_dash_label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show running applications</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="application_button_isolation_button"> + <property name="label" translatable="yes">Isolate workspaces.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="application_button_monitor_isolation_button"> + <property name="label" translatable="yes">Isolate monitors.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="windows_preview_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">3</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <child> + <object class="GtkLabel" id="windows_previews_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Show open windows previews.</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow17"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="shrink_dash3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="show_applications_button_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shrink_dash_description1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">If disabled, these settings are accessible from gnome-tweak-tool or the extension website.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shrink_dash_label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show <i>Applications</i> icon</property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="application_button_first_button"> + <property name="label" translatable="yes">Move the applications button at the beginning of the dock.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="application_button_animation_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">3</property> + <property name="xalign">0</property> + <property name="yalign">0.43000000715255737</property> + <property name="draw_indicator">True</property> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Animate <i>Show Applications</i>.</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="launchers_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Launchers</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkBox" id="behaviour"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">24</property> + <property name="margin_right">24</property> + <property name="margin_top">24</property> + <property name="margin_bottom">24</property> + <property name="orientation">vertical</property> + <property name="spacing">24</property> + <child> + <object class="GtkFrame" id="hot_keys_frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="hot_keys_listbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="hot_keys_listboxrow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="hot_keys_grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="hot_keys_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl.</property> + <property name="use_markup">True</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="hot_keys_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Use keyboard shortcuts to activate apps</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="overlay_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkButton" id="overlay_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="xalign">0.46000000834465027</property> + <child> + <object class="GtkImage" id="image_overlay"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">emblem-system-symbolic</property> + </object> + </child> + <style> + <class name="circular"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="hot_keys_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="built_in_theme_frame3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="buitin_theme5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_description5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Behaviour when clicking on the icon of a running application.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="builtin_theme_label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Click action</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="click_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkButton" id="middle_click_options_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="valign">center</property> + <child> + <object class="GtkImage" id="middle_click_image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">emblem-system-symbolic</property> + </object> + </child> + <style> + <class name="circular"/> + </style> + </object> + </child> + <child> + <object class="GtkComboBoxText" id="click_action_combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <items> + <item translatable="yes">Raise window</item> + <item translatable="yes">Minimize</item> + <item translatable="yes">Launch new instance</item> + <item translatable="yes">Cycle through windows</item> + <item translatable="yes">Minimize or overview</item> + <item translatable="yes">Show window previews</item> + </items> + </object> + </child> + </object> + <packing> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="built_in_theme_frame_scroll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow_scroll"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="buitin_theme_scroll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_description_scroll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label" translatable="yes">Behaviour when scrolling on the icon of an application.</property> + <property name="wrap">True</property> + <property name="xalign">0</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="builtin_theme_label_scroll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="label" translatable="yes">Scroll action</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="click_box_scroll"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkComboBoxText" id="scroll_action_combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <items> + <item translatable="yes">Do nothing</item> + <item translatable="yes">Cycle through windows</item> + <item translatable="yes">Switch workspace</item> + </items> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="behaviour_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Behavior</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkBox" id="appearance"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">24</property> + <property name="margin_right">24</property> + <property name="margin_top">24</property> + <property name="margin_bottom">24</property> + <property name="orientation">vertical</property> + <property name="spacing">24</property> + <child> + <object class="GtkFrame" id="built_in_theme_frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="buitin_theme"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Few customizations meant to integrate the dock with the default GNOME theme. Alternatively, specific options can be enabled below.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="builtin_theme_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Use built-in theme</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="builtin_theme_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="customize_theme"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="shrink_dash"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="shrink_dash_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shrink_dash_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Save space reducing padding and border radius.</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="shrink_dash_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Shrink the dash</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="running_dots"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="running_dots_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show a dot for each windows of the application.</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="running_dots_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show windows counter indicators</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkButton" id="running_dots_advance_settings_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="xalign">0.46000000834465027</property> + <child> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">emblem-system-symbolic</property> + </object> + </child> + <style> + <class name="circular"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="running_dots_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="custom_background_color_listboxrow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="custom_background_color_grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="custom_background_color_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Set the background color for the dash.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="custom_background_color_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Customize the dash color</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="custom_background_color_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkColorButton" id="custom_background_color"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="xalign">0.46000000834465027</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="custom_background_color_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkGrid" id="customize_opacity"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSwitch" id="customize_opacity_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="customize_opacity_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Tune the dash background opacity.</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="customize_opacity_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Customize opacity</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</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="custom_opacity"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="spacing">32</property> + <child> + <object class="GtkLabel" id="custom_opacity_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Opacity</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScale" id="custom_opacity_scale"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">custom_opacity_adjustement</property> + <property name="lower_stepper_sensitivity">on</property> + <property name="restrict_to_fill_level">False</property> + <property name="fill_level">0</property> + <property name="round_digits">0</property> + <property name="digits">2</property> + <property name="value_pos">right</property> + <signal name="format-value" handler="custom_opacity_scale_format_value_cb" swapped="no"/> + <signal name="value-changed" handler="custom_opacity_scale_value_changed_cb" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</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> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow_rnd_border"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">32</property> + <child> + <object class="GtkLabel" id="force_straight_corner_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="xpad">12</property> + <property name="label" translatable="yes">Force straight corner +</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="force_straight_corner_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">center</property> + <property name="margin_left">3</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">12</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</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">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkBox" id="about"> + <property name="can_focus">False</property> + <property name="margin_top">24</property> + <property name="margin_bottom">24</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkImage" id="logo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">./media/logo.svg</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">10</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="extension_name"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label"><b>Dash to Dock</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <child> + <object class="GtkLabel" id="extension_version_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="label" translatable="yes">version: </property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="extension_version"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label">...</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</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="GtkLabel" id="extension_description"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Moves the dash out of the overview transforming it in a dock</property> + <property name="justify">center</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkBox" id="box10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <property name="spacing">5</property> + <child> + <object class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Created by</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">Michele (<a href="mailto:micxgx@gmail.com">micxgx@gmail.com</a>)</property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</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="GtkLinkButton" id="homepage_link"> + <property name="label" translatable="yes">Webpage</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events"/> + <property name="halign">center</property> + <property name="relief">none</property> + <property name="uri">https://micheleg.github.io/dash-to-dock/</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="valign">end</property> + <property name="label" translatable="yes"><span size="small">This program comes with ABSOLUTELY NO WARRANTY. +See the <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2 or later</a> for details.</span></property> + <property name="use_markup">True</property> + <property name="justify">center</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="about_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">About</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <object class="GtkAdjustment" id="pressure_threshold_adjustment"> + <property name="upper">1000</property> + <property name="step_increment">50</property> + <property name="page_increment">250</property> + </object> + <object class="GtkAdjustment" id="show_timeout_adjustment"> + <property name="upper">1</property> + <property name="step_increment">0.050000000000000003</property> + <property name="page_increment">0.25</property> + </object> + <object class="GtkBox" id="intelligent_autohide_advanced_settings_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="intelligent_autohide_advanced_settings_frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkListBox" id="listbox4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow" id="listboxrow8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="buitin_theme2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_description2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show the dock by mouse hover on the screen edge.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="builtin_theme_label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Autohide</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="autohide_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="require_pressure_checkbutton"> + <property name="label" translatable="yes">Push to show: require pressure to show the dock</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="autohide_enable_in_fullscreen_checkbutton"> + <property name="label" translatable="yes">Enable in fullscreen mode</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="intellihide_grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkLabel" id="builtin_theme_description3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show the dock when it doesn't obstruct application windows.</property> + <property name="wrap">True</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="builtin_theme_label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Dodge windows</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSwitch" id="intellihide_switch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="valign">center</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="height">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="intellihide_mode_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkRadioButton" id="all_windows_radio_button"> + <property name="label" translatable="yes">All windows</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="margin_top">12</property> + <property name="xalign">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="all_windows_radio_button_toggled_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="focus_application_windows_radio_button"> + <property name="label" translatable="yes">Only focused application's windows</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="xalign">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">all_windows_radio_button</property> + <signal name="toggled" handler="focus_application_windows_radio_button_toggled_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="maximized_windows_radio_button"> + <property name="label" translatable="yes">Only maximized windows</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="xalign">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">all_windows_radio_button</property> + <signal name="toggled" handler="maximized_windows_radio_button_toggled_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkListBoxRow" id="listboxrow5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="hexpand">True</property> + <property name="row_spacing">6</property> + <property name="column_spacing">32</property> + <child> + <object class="GtkSpinButton" id="animation_duration_spinbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="adjustment">animation_time_adjustment</property> + <property name="digits">3</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Animation duration (s)</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="hide_timeout_spinbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="adjustment">hide_timeout_adjustment</property> + <property name="digits">3</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="show_timeout_spinbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">end</property> + <property name="adjustment">show_timeout_adjustment</property> + <property name="digits">3</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="pressure_threshold_spinbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="text">0.000</property> + <property name="adjustment">pressure_threshold_adjustment</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Hide timeout (s)</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="show_timeout_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Show timeout (s)</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="pressure_threshold_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Pressure threshold</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label_item"> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> +</interface> diff --git a/package/appIcons.js b/package/appIcons.js new file mode 100644 index 0000000..ac90585 --- /dev/null +++ b/package/appIcons.js @@ -0,0 +1,1256 @@ +// -*- 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 Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +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 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 Tweener = imports.ui.tweener; +const Util = imports.misc.util; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; +const WindowPreview = Me.imports.windowPreview; + +let tracker = Shell.WindowTracker.get_default(); + +let DASH_ITEM_LABEL_SHOW_TIME = Dash.DASH_ITEM_LABEL_SHOW_TIME; + +const clickAction = { + SKIP: 0, + MINIMIZE: 1, + LAUNCH: 2, + CYCLE_WINDOWS: 3, + MINIMIZE_OR_OVERVIEW: 4, + PREVIEWS: 5, + QUIT: 6 +}; + +const scrollAction = { + DO_NOTHING: 0, + CYCLE_WINDOWS: 1, + SWITCH_WORKSPACE: 2 +}; + +let recentlyClickedAppLoopId = 0; +let recentlyClickedApp = null; +let recentlyClickedAppWindows = null; +let recentlyClickedAppIndex = 0; +let recentlyClickedAppMonitor = -1; + +/** + * Extend AppIcon + * + * - Pass settings to the constructor and bind settings changes + * - Apply a css class based on the number of windows of each application (#N); + * - Draw a dot for each window of the application based on the default "dot" style which is hidden (#N); + * a class of the form "running#N" is applied to the AppWellIcon actor. + * like the original .running one. + * - Add a .focused style to the focused app + * - Customize click actions. + * - Update minimization animation target + * - Update menu if open on windows change + */ +const MyAppIcon = new Lang.Class({ + Name: 'DashToDock.AppIcon', + Extends: AppDisplay.AppIcon, + + // settings are required inside. + _init: function(settings, app, monitorIndex, iconParams) { + // a prefix is required to avoid conflicting with the parent class variable + this._dtdSettings = settings; + this.monitorIndex = monitorIndex; + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._nWindows = 0; + + this.parent(app, iconParams); + + // Monitor windows-changes instead of app state. + // Keep using the same Id and function callback (that is extended) + if (this._stateChangedId > 0) { + this.app.disconnect(this._stateChangedId); + this._stateChangedId = 0; + } + + this._stateChangedId = this.app.connect('windows-changed', + Lang.bind(this, + this.onWindowsChanged)); + this._focusAppChangeId = tracker.connect('notify::focus-app', + Lang.bind(this, + this._onFocusAppChanged)); + this._enteredMonitorId = global.screen.connect('window-entered-monitor', + Lang.bind(this, + this.onWindowsChanged)); + + this._dots = null; + + let keys = ['apply-custom-theme', + 'custom-theme-running-dots', + 'custom-theme-customize-running-dots', + 'custom-theme-running-dots-color', + 'custom-theme-running-dots-border-color', + 'custom-theme-running-dots-border-width']; + + keys.forEach(function(key) { + this._signalsHandler.add([ + this._dtdSettings, + 'changed::' + key, + Lang.bind(this, this._toggleDots) + ]); + }, this); + + this._toggleDots(); + + this._dtdSettings.connect('changed::scroll-action', Lang.bind(this, function() { + this._optionalScrollCycleWindows(); + })); + this._optionalScrollCycleWindows(); + + this._numberOverlay(); + + this._previewMenuManager = null; + this._previewMenu = null; + }, + + _onDestroy: function() { + this.parent(); + + // This is necessary due to an upstream bug + // https://bugzilla.gnome.org/show_bug.cgi?id=757556 + // It can be safely removed once it get solved upstrea. + if (this._menu) + this._menu.close(false); + + // Disconect global signals + // stateChangedId is already handled by parent) + if (this._focusAppChangeId > 0) { + tracker.disconnect(this._focusAppChangeId); + this._focusAppChangeId = 0; + } + + if (this._enteredMonitorId > 0) { + global.screen.disconnect(this._enteredMonitorId); + this._enteredMonitorId = 0; + } + + this._signalsHandler.destroy(); + + if (this._scrollEventHandler) + this.actor.disconnect(this._scrollEventHandler); + }, + + _optionalScrollCycleWindows: function() { + if (this._scrollEventHandler) { + this.actor.disconnect(this._scrollEventHandler); + this._scrollEventHandler = 0; + } + + let isEnabled = this._dtdSettings.get_enum('scroll-action') === scrollAction.CYCLE_WINDOWS; + if (!isEnabled) return; + + this._scrollEventHandler = this.actor.connect('scroll-event', Lang.bind(this, + this.onScrollEvent)); + }, + + onScrollEvent: function(actor, event) { + + // We only activate windows of running applications, i.e. we never open new windows + // We check if the app is running, and that the # of windows is > 0 in + // case we use workspace isolation, + let appIsRunning = this.app.state == Shell.AppState.RUNNING + && this.getInterestingWindows().length > 0; + + if (!appIsRunning) + return false + + if (this._optionalScrollCycleWindowsDeadTimeId > 0) + return false; + else + this._optionalScrollCycleWindowsDeadTimeId = Mainloop.timeout_add(250, Lang.bind(this, function() { + this._optionalScrollCycleWindowsDeadTimeId = 0; + })); + + let direction = null; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + direction = Meta.MotionDirection.UP; + break; + case Clutter.ScrollDirection.DOWN: + direction = Meta.MotionDirection.DOWN; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + if (dy < 0) + direction = Meta.MotionDirection.UP; + else if (dy > 0) + direction = Meta.MotionDirection.DOWN; + break; + } + + let focusedApp = tracker.focus_app; + if (!Main.overview._shown) { + let reversed = direction === Meta.MotionDirection.UP; + if (this.app == focusedApp) + this._cycleThroughWindows(reversed); + else { + // Activate the first window + let windows = this.getInterestingWindows(); + if (windows.length > 0) { + let w = windows[0]; + Main.activateWindow(w); + } + } + } + else + this.app.activate(); + return true; + }, + + onWindowsChanged: function() { + + if (this._menu && this._menu.isOpen) + this._menu.update(); + + this._updateRunningStyle(); + this.updateIconGeometry(); + }, + + /** + * Update taraget for minimization animation + */ + updateIconGeometry: function() { + // If (for unknown reason) the actor is not on the stage the reported size + // and position are random values, which might exceeds the integer range + // resulting in an error when assigned to the a rect. This is a more like + // a workaround to prevent flooding the system with errors. + if (this.actor.get_stage() == null) + return; + + let rect = new Meta.Rectangle(); + + [rect.x, rect.y] = this.actor.get_transformed_position(); + [rect.width, rect.height] = this.actor.get_transformed_size(); + + let windows = this.app.get_windows(); + if (this._dtdSettings.get_boolean('multi-monitor')){ + let monitorIndex = this.monitorIndex; + windows = windows.filter(function(w) { + return w.get_monitor() == monitorIndex; + }); + } + windows.forEach(function(w) { + w.set_icon_geometry(rect); + }); + }, + + _toggleDots: function() { + if (this._dtdSettings.get_boolean('custom-theme-running-dots') || this._dtdSettings.get_boolean('apply-custom-theme')) + this._showDots(); + else + this._hideDots(); + }, + + _showDots: function() { + // I use opacity to hide the default dot because the show/hide function + // are used by the parent class. + this._dot.opacity = 0; + + // Just update style if dots already exist + if (this._dots) { + this._updateCounterClass(); + return; + } + + this._dots = new St.DrawingArea({x_expand: true, y_expand: true}); + this._dots.connect('repaint', Lang.bind(this, function() { + this._drawCircles(this._dots, Utils.getPosition(this._dtdSettings)); + })); + this._iconContainer.add_child(this._dots); + this._updateCounterClass(); + }, + + _hideDots: function() { + this._dot.opacity = 255; + if (this._dots) + this._dots.destroy() + this._dots = null; + }, + + _updateRunningStyle: function() { + // When using workspace isolation, we need to hide the dots of apps with + // no windows in the current workspace + if (this._dtdSettings.get_boolean('isolate-workspaces') || + this._dtdSettings.get_boolean('isolate-monitors')) { + if (this.app.state != Shell.AppState.STOPPED + && this.getInterestingWindows().length != 0) + this._dot.show(); + else + this._dot.hide(); + } + else + this.parent(); + this._onFocusAppChanged(); + this._updateCounterClass(); + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + this._draggable.fakeRelease(); + + if (!this._menu) { + this._menu = new MyAppIconMenu(this, this._dtdSettings); + this._menu.connect('activate-window', Lang.bind(this, function(menu, window) { + this.activateWindow(window); + })); + this._menu.connect('open-state-changed', Lang.bind(this, function(menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + else { + // Setting the max-height is s useful if part of the menu is + // scrollable so the minimum height is smaller than the natural height. + let monitor_index = Main.layoutManager.findIndexForActor(this.actor); + let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor_index); + let position = Utils.getPosition(this._dtdSettings); + this._isHorizontal = ( position == St.Side.TOP || + position == St.Side.BOTTOM); + // If horizontal also remove the height of the dash + let additional_margin = this._isHorizontal && !this._dtdSettings.get_boolean('dock-fixed') ? Main.overview._dash.actor.height : 0; + let verticalMargins = this._menu.actor.margin_top + this._menu.actor.margin_bottom; + // Also set a max width to the menu, so long labels (long windows title) get truncated + this._menu.actor.style = ('max-height: ' + Math.round(workArea.height - additional_margin - verticalMargins) + 'px;' + + 'max-width: 400px'); + } + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function() { + this._menu.close(); + })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + + this._menuManager.addMenu(this._menu); + } + + this.emit('menu-state-changed', true); + + this.actor.set_hover(true); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + _onFocusAppChanged: function() { + // We need to check the number of windows, as the focus might be + // happening on another monitor if using isolation + if (tracker.focus_app == this.app && this.getInterestingWindows().length != 0) + this.actor.add_style_class_name('focused'); + else + this.actor.remove_style_class_name('focused'); + }, + + activate: function(button) { + + if (!this._dtdSettings.get_boolean('customize-click')) { + this.parent(button); + return; + } + + let event = Clutter.get_current_event(); + let modifiers = event ? event.get_state() : 0; + let focusedApp = tracker.focus_app; + + // Only consider SHIFT and CONTROL as modifiers (exclude SUPER, CAPS-LOCK, etc.) + modifiers = modifiers & (Clutter.ModifierType.SHIFT_MASK | Clutter.ModifierType.CONTROL_MASK); + + // We don't change the CTRL-click behaviour: in such case we just chain + // up the parent method and return. + if (modifiers & Clutter.ModifierType.CONTROL_MASK) { + // Keep default behaviour: launch new window + // By calling the parent method I make it compatible + // with other extensions tweaking ctrl + click + this.parent(button); + return; + } + + // We check what type of click we have and if the modifier SHIFT is + // being used. We then define what buttonAction should be for this + // event. + let buttonAction = 0; + if (button && button == 2 ) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = this._dtdSettings.get_enum('shift-middle-click-action'); + else + buttonAction = this._dtdSettings.get_enum('middle-click-action'); + } + else if (button && button == 1) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = this._dtdSettings.get_enum('shift-click-action'); + else + buttonAction = this._dtdSettings.get_enum('click-action'); + } + + // We check if the app is running, and that the # of windows is > 0 in + // case we use workspace isolation. + let windows = this.getInterestingWindows(); + let appIsRunning = this.app.state == Shell.AppState.RUNNING + && windows.length > 0; + + // Some action modes (e.g. MINIMIZE_OR_OVERVIEW) require overview to remain open + // This variable keeps track of this + let shouldHideOverview = true; + + // We customize the action only when the application is already running + if (appIsRunning) { + switch (buttonAction) { + case clickAction.MINIMIZE: + // In overview just activate the app, unless the acion is explicitely + // requested with a keyboard modifier + if (!Main.overview._shown || modifiers){ + // If we have button=2 or a modifier, allow minimization even if + // the app is not focused + if (this.app == focusedApp || button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK) { + // minimize all windows on double click and always in the case of primary click without + // additional modifiers + let click_count = 0; + if (Clutter.EventType.CLUTTER_BUTTON_PRESS) + click_count = event.get_click_count(); + let all_windows = (button == 1 && ! modifiers) || click_count > 1; + this._minimizeWindow(all_windows); + } + else + this._activateAllWindows(); + } + else { + let w = windows[0]; + Main.activateWindow(w); + } + break; + + case clickAction.MINIMIZE_OR_OVERVIEW: + // When a single window is present, toggle minimization + // If only one windows is present toggle minimization, but only when trigggered with the + // simple click action (no modifiers, no middle click). + if (windows.length == 1 && !modifiers && button == 1) { + let w = windows[0]; + if (this.app == focusedApp) { + // Window is raised, minimize it + this._minimizeWindow(w); + } else { + // Window is minimized, raise it + Main.activateWindow(w); + } + // Launch overview when multiple windows are present + // TODO: only show current app windows when gnome shell API will allow it + } else { + shouldHideOverview = false; + Main.overview.toggle(); + } + break; + + case clickAction.CYCLE_WINDOWS: + if (!Main.overview._shown){ + if (this.app == focusedApp) + this._cycleThroughWindows(); + else { + // Activate the first window + let w = windows[0]; + Main.activateWindow(w); + } + } + else + this.app.activate(); + break; + + case clickAction.LAUNCH: + this.launchNewWindow(); + break; + + case clickAction.PREVIEWS: + if (!Main.overview._shown) { + // If only one windows is present just switch to it, but only when trigggered with the + // simple click action (no modifiers, no middle click). + if (windows.length == 1 && !modifiers && button == 1) { + let w = windows[0]; + Main.activateWindow(w); + } else + this._windowPreviews(); + } + else { + this.app.activate(); + } + break; + + case clickAction.QUIT: + this.closeAllWindows(); + break; + + case clickAction.SKIP: + let w = windows[0]; + Main.activateWindow(w); + break; + } + } + else { + this.launchNewWindow(); + } + + // Hide overview except when action mode requires it + if(shouldHideOverview) { + Main.overview.hide(); + } + }, + + shouldShowTooltip: function() { + return this.actor.hover && (!this._menu || !this._menu.isOpen) && + (!this._previewMenu || !this._previewMenu.isOpen); + }, + + _windowPreviews: function() { + if (!this._previewMenu) { + this._previewMenuManager = new PopupMenu.PopupMenuManager(this); + + this._previewMenu = new WindowPreview.WindowPreviewMenu(this, this._dtdSettings); + + this._previewMenuManager.addMenu(this._previewMenu); + + this._previewMenu.connect('open-state-changed', Lang.bind(this, function(menu, isPoppedUp) { + if (!isPoppedUp) + this._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(this, function() { + this._previewMenu.close(); + })); + this._previewMenu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + + } + + if (this._previewMenu.isOpen) + this._previewMenu.close(); + else + this._previewMenu.popup(); + + return false; + }, + + // Try to do the right thing when attempting to launch a new window of an app. In + // particular, if the application doens't allow to launch a new window, activate + // the existing window instead. + launchNewWindow: function(p) { + let appInfo = this.app.get_app_info(); + let actions = appInfo.list_actions(); + if (this.app.can_open_new_window()) { + this.animateLaunch(); + // This is used as a workaround for a bug resulting in no new windows being opened + // for certain running applications when calling open_new_window(). + // + // https://bugzilla.gnome.org/show_bug.cgi?id=756844 + // + // Similar to what done when generating the popupMenu entries, if the application provides + // a "New Window" action, use it instead of directly requesting a new window with + // open_new_window(), which fails for certain application, notably Nautilus. + if (actions.indexOf('new-window') == -1) { + this.app.open_new_window(-1); + } + else { + let i = actions.indexOf('new-window'); + if (i !== -1) + this.app.launch_action(actions[i], global.get_current_time(), -1); + } + } + else { + // Try to manually activate the first window. Otherwise, when the app is activated by + // switching to a different workspace, a launch spinning icon is shown and disappers only + // after a timeout. + let windows = this.app.get_windows(); + if (windows.length > 0) + Main.activateWindow(windows[0]) + else + this.app.activate(); + } + }, + + _updateCounterClass: function() { + let maxN = 4; + this._nWindows = Math.min(this.getInterestingWindows().length, maxN); + + for (let i = 1; i <= maxN; i++) { + let className = 'running' + i; + if (i != this._nWindows) + this.actor.remove_style_class_name(className); + else + this.actor.add_style_class_name(className); + } + + if (this._dots) + this._dots.queue_repaint(); + }, + + _drawCircles: function(area, side) { + let borderColor, borderWidth, bodyColor; + + if (!this._dtdSettings.get_boolean('apply-custom-theme') + && this._dtdSettings.get_boolean('custom-theme-running-dots') + && this._dtdSettings.get_boolean('custom-theme-customize-running-dots')) { + borderColor = Clutter.color_from_string(this._dtdSettings.get_string('custom-theme-running-dots-border-color'))[1]; + borderWidth = this._dtdSettings.get_int('custom-theme-running-dots-border-width'); + bodyColor = Clutter.color_from_string(this._dtdSettings.get_string('custom-theme-running-dots-color'))[1]; + } + else { + // Re-use the style - background color, and border width and color - + // of the default dot + let themeNode = this._dot.get_theme_node(); + borderColor = themeNode.get_border_color(side); + borderWidth = themeNode.get_border_width(side); + bodyColor = themeNode.get_background_color(); + } + + let [width, height] = area.get_surface_size(); + let cr = area.get_context(); + + // Draw the required numbers of dots + // Define the radius as an arbitrary size, but keep large enough to account + // for the drawing of the border. + let radius = Math.max(width/22, borderWidth/2); + let padding = 0; // distance from the margin + let spacing = radius + borderWidth; // separation between the dots + let n = this._nWindows; + + cr.setLineWidth(borderWidth); + Clutter.cairo_set_source_color(cr, borderColor); + + switch (side) { + case St.Side.TOP: + cr.translate((width - (2*n)*radius - (n-1)*spacing)/2, padding); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + cr.arc((2*i+1)*radius + i*spacing, radius + borderWidth/2, radius, 0, 2*Math.PI); + } + break; + + case St.Side.BOTTOM: + cr.translate((width - (2*n)*radius - (n-1)*spacing)/2, height - padding); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + cr.arc((2*i+1)*radius + i*spacing, -radius - borderWidth/2, radius, 0, 2*Math.PI); + } + break; + + case St.Side.LEFT: + cr.translate(padding, (height - (2*n)*radius - (n-1)*spacing)/2); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + cr.arc(radius + borderWidth/2, (2*i+1)*radius + i*spacing, radius, 0, 2*Math.PI); + } + break; + + case St.Side.RIGHT: + cr.translate(width - padding , (height - (2*n)*radius - (n-1)*spacing)/2); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + cr.arc(-radius - borderWidth/2, (2*i+1)*radius + i*spacing, radius, 0, 2*Math.PI); + } + break; + } + + cr.strokePreserve(); + + Clutter.cairo_set_source_color(cr, bodyColor); + cr.fill(); + cr.$dispose(); + }, + + _numberOverlay: function() { + // Add label for a Hot-Key visual aid + this._numberOverlayLabel = new St.Label(); + this._numberOverlayBin = new St.Bin({ + child: this._numberOverlayLabel, + x_align: St.Align.START, y_align: St.Align.START, + x_expand: true, y_expand: true + }); + this._numberOverlayLabel.add_style_class_name('number-overlay'); + this._numberOverlayOrder = -1; + this._numberOverlayBin.hide(); + + this._iconContainer.add_child(this._numberOverlayBin); + + }, + + updateNumberOverlay: function() { + // We apply an overall scale factor that might come from a HiDPI monitor. + // Clutter dimensions are in physical pixels, but CSS measures are in logical + // pixels, so make sure to consider the scale. + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + // Set the font size to something smaller than the whole icon so it is + // still visible. The border radius is large to make the shape circular + let [minWidth, natWidth] = this._iconContainer.get_preferred_width(-1); + let font_size = Math.round(Math.max(12, 0.3*natWidth) / scaleFactor); + let size = Math.round(font_size*1.2); + this._numberOverlayLabel.set_style( + 'font-size: ' + font_size + 'px;' + + 'border-radius: ' + this.icon.iconSize + 'px;' + + 'width: ' + size + 'px; height: ' + size +'px;' + ); + }, + + setNumberOverlay: function(number) { + this._numberOverlayOrder = number; + this._numberOverlayLabel.set_text(number.toString()); + }, + + toggleNumberOverlay: function(activate) { + if (activate && this._numberOverlayOrder > -1) { + this.updateNumberOverlay(); + this._numberOverlayBin.show(); + } + else + this._numberOverlayBin.hide(); + }, + + _minimizeWindow: function(param) { + // Param true make all app windows minimize + let windows = this.getInterestingWindows(); + let current_workspace = global.screen.get_active_workspace(); + for (let i = 0; i < windows.length; i++) { + let w = windows[i]; + if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()) { + w.minimize(); + // Just minimize one window. By specification it should be the + // focused window on the current workspace. + if(!param) + break; + } + } + }, + + // By default only non minimized windows are activated. + // This activates all windows in the current workspace. + _activateAllWindows: function() { + // First activate first window so workspace is switched if needed. + // We don't do this if isolation is on! + if (!this._dtdSettings.get_boolean('isolate-workspaces') && + !this._dtdSettings.get_boolean('isolate-monitors')) + this.app.activate(); + + // then activate all other app windows in the current workspace + let windows = this.getInterestingWindows(); + let activeWorkspace = global.screen.get_active_workspace_index(); + + if (windows.length <= 0) + return; + + let activatedWindows = 0; + + for (let i = windows.length - 1; i >= 0; i--) { + if (windows[i].get_workspace().index() == activeWorkspace) { + Main.activateWindow(windows[i]); + activatedWindows++; + } + } + }, + + //This closes all windows of the app. + closeAllWindows: function() { + let windows = this.getInterestingWindows(); + for (let i = 0; i < windows.length; i++) + windows[i].delete(global.get_current_time()); + }, + + _cycleThroughWindows: function(reversed) { + // Store for a little amount of time last clicked app and its windows + // since the order changes upon window interaction + let MEMORY_TIME=3000; + + let app_windows = this.getInterestingWindows(); + + if (app_windows.length <1) + return + + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + recentlyClickedAppLoopId = Mainloop.timeout_add(MEMORY_TIME, this._resetRecentlyClickedApp); + + // If there isn't already a list of windows for the current app, + // or the stored list is outdated, use the current windows list. + let monitorIsolation = this._dtdSettings.get_boolean('isolate-monitors'); + if (!recentlyClickedApp || + recentlyClickedApp.get_id() != this.app.get_id() || + recentlyClickedAppWindows.length != app_windows.length || + (recentlyClickedAppMonitor != this.monitorIndex && monitorIsolation)) { + recentlyClickedApp = this.app; + recentlyClickedAppWindows = app_windows; + recentlyClickedAppMonitor = this.monitorIndex; + recentlyClickedAppIndex = 0; + } + + if (reversed) { + recentlyClickedAppIndex--; + if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; + } else { + recentlyClickedAppIndex++; + } + let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; + let window = recentlyClickedAppWindows[index]; + + Main.activateWindow(window); + }, + + _resetRecentlyClickedApp: function() { + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + recentlyClickedAppLoopId=0; + recentlyClickedApp =null; + recentlyClickedAppWindows = null; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitor = -1; + + return false; + }, + + // Filter out unnecessary windows, for instance + // nautilus desktop window. + getInterestingWindows: function() { + return getInterestingWindows(this.app, this._dtdSettings, this.monitorIndex); + } +}); +/** + * Extend AppIconMenu + * + * - Pass settings to the constructor + * - set popup arrow side based on dash orientation + * - Add close windows option based on quitfromdash extension + * (https://github.com/deuill/shell-extension-quitfromdash) + * - Add open windows thumbnails instead of list + * - update menu when application windows change + */ +const MyAppIconMenu = new Lang.Class({ + Name: 'DashToDock.MyAppIconMenu', + Extends: AppDisplay.AppIconMenu, + + _init: function(source, settings) { + let side = Utils.getPosition(settings); + + // Damm it, there has to be a proper way of doing this... + // As I can't call the parent parent constructor (?) passing the side + // parameter, I overwite what I need later + this.parent(source); + + // Change the initialized side where required. + this._arrowSide = side; + this._boxPointer._arrowSide = side; + this._boxPointer._userArrowSide = side; + + this._dtdSettings = settings; + }, + + _redisplay: function() { + this.removeAll(); + + if (this._dtdSettings.get_boolean('show-windows-preview')) { + // Display the app windows menu items and the separator between windows + // of the current desktop and other windows. + + this._allWindowsMenuItem = new PopupMenu.PopupSubMenuMenuItem(__('All Windows'), false); + this._allWindowsMenuItem.actor.hide(); + this.addMenuItem(this._allWindowsMenuItem); + + if (!this._source.app.is_window_backed()) { + this._appendSeparator(); + + let appInfo = this._source.app.get_app_info(); + let actions = appInfo.list_actions(); + if (this._source.app.can_open_new_window() && + actions.indexOf('new-window') == -1) { + this._newWindowMenuItem = this._appendMenuItem(_("New Window")); + this._newWindowMenuItem.connect('activate', Lang.bind(this, function() { + if (this._source.app.state == Shell.AppState.STOPPED) + this._source.animateLaunch(); + + this._source.app.open_new_window(-1); + this.emit('activate-window', null); + })); + this._appendSeparator(); + } + + + if (AppDisplay.discreteGpuAvailable && + this._source.app.state == Shell.AppState.STOPPED && + actions.indexOf('activate-discrete-gpu') == -1) { + this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card")); + this._onDiscreteGpuMenuItem.connect('activate', Lang.bind(this, function() { + if (this._source.app.state == Shell.AppState.STOPPED) + this._source.animateLaunch(); + + this._source.app.launch(0, -1, true); + this.emit('activate-window', null); + })); + } + + for (let i = 0; i < actions.length; i++) { + let action = actions[i]; + let item = this._appendMenuItem(appInfo.get_action_name(action)); + item.connect('activate', Lang.bind(this, function(emitter, event) { + this._source.app.launch_action(action, event.get_time(), -1); + this.emit('activate-window', null); + })); + } + + let canFavorite = global.settings.is_writable('favorite-apps'); + + if (canFavorite) { + this._appendSeparator(); + + let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id()); + + if (isFavorite) { + let item = this._appendMenuItem(_("Remove from Favorites")); + item.connect('activate', Lang.bind(this, function() { + let favs = AppFavorites.getAppFavorites(); + favs.removeFavorite(this._source.app.get_id()); + })); + } else { + let item = this._appendMenuItem(_("Add to Favorites")); + item.connect('activate', Lang.bind(this, function() { + let favs = AppFavorites.getAppFavorites(); + favs.addFavorite(this._source.app.get_id()); + })); + } + } + + if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) { + this._appendSeparator(); + let item = this._appendMenuItem(_("Show Details")); + item.connect('activate', Lang.bind(this, function() { + let id = this._source.app.get_id(); + let args = GLib.Variant.new('(ss)', [id, '']); + Gio.DBus.get(Gio.BusType.SESSION, null, + function(o, res) { + let bus = Gio.DBus.get_finish(res); + bus.call('org.gnome.Software', + '/org/gnome/Software', + 'org.gtk.Actions', 'Activate', + GLib.Variant.new('(sava{sv})', + ['details', [args], null]), + null, 0, -1, null, null); + Main.overview.hide(); + }); + })); + } + } + + } else { + this.parent(); + } + + // quit menu + this._appendSeparator(); + this._quitfromDashMenuItem = this._appendMenuItem(_("Quit")); + this._quitfromDashMenuItem.connect('activate', Lang.bind(this, function() { + this._source.closeAllWindows(); + })); + + this.update(); + }, + + // update menu content when application windows change. This is desirable as actions + // acting on windows (closing) are performed while the menu is shown. + update: function() { + + if(this._dtdSettings.get_boolean('show-windows-preview')){ + + let windows = this._source.getInterestingWindows(); + + // update, show or hide the quit menu + if ( windows.length > 0) { + let quitFromDashMenuText = ""; + if (windows.length == 1) + this._quitfromDashMenuItem.label.set_text(_("Quit")); + else + this._quitfromDashMenuItem.label.set_text(_("Quit") + ' ' + windows.length + ' ' + _("Windows")); + + this._quitfromDashMenuItem.actor.show(); + + } else { + this._quitfromDashMenuItem.actor.hide(); + } + + // update, show, or hide the allWindows menu + // Check if there are new windows not already displayed. In such case, repopulate the allWindows + // menu. Windows removal is already handled by each preview being connected to the destroy signal + let old_windows = this._allWindowsMenuItem.menu._getMenuItems().map(function(item){ + return item._window; + }); + + let new_windows = windows.filter(function(w) {return old_windows.indexOf(w) < 0;}); + if (new_windows.length > 0) { + this._populateAllWindowMenu(windows); + + // Try to set the width to that of the submenu. + // TODO: can't get the actual size, getting a bit less. + // Temporary workaround: add 15px to compensate + this._allWindowsMenuItem.actor.width = this._allWindowsMenuItem.menu.actor.width + 15; + + } + + // The menu is created hidden and never hidded after being shown. Instead, a singlal + // connected to its items destroy will set is insensitive if no more windows preview are shown. + if (windows.length > 0){ + this._allWindowsMenuItem.actor.show(); + this._allWindowsMenuItem.setSensitive(true); + } + + // Update separators + this._getMenuItems().forEach(Lang.bind(this, this._updateSeparatorVisibility)); + } + + + }, + + _populateAllWindowMenu: function(windows) { + + this._allWindowsMenuItem.menu.removeAll(); + + if (windows.length > 0) { + + let activeWorkspace = global.screen.get_active_workspace(); + let separatorShown = windows[0].get_workspace() != activeWorkspace; + + for (let i = 0; i < windows.length; i++) { + let window = windows[i]; + if (!separatorShown && window.get_workspace() != activeWorkspace) { + this._allWindowsMenuItem.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + separatorShown = true; + } + + let item = new WindowPreview.WindowPreviewMenuItem(window); + this._allWindowsMenuItem.menu.addMenuItem(item); + item.connect('activate', Lang.bind(this, function() { + this.emit('activate-window', window); + })); + + // This is to achieve a more gracefull transition when the last windows is closed. + item.connect('destroy', Lang.bind(this, function() { + if(this._allWindowsMenuItem.menu._getMenuItems().length == 1) // It's still counting the item just going to be destroyed + this._allWindowsMenuItem.setSensitive(false); + })); + } + } + }, +}); +Signals.addSignalMethods(MyAppIconMenu.prototype); + +// Filter out unnecessary windows, for instance +// nautilus desktop window. +function getInterestingWindows(app, settings, monitorIndex) { + let windows = app.get_windows().filter(function(w) { + return !w.skip_taskbar; + }); + + // When using workspace isolation, we filter out windows + // that are not in the current workspace + if (settings.get_boolean('isolate-workspaces')) + windows = windows.filter(function(w) { + return w.get_workspace().index() == global.screen.get_active_workspace_index(); + }); + + if (settings.get_boolean('isolate-monitors')) + windows = windows.filter(function(w) { + return w.get_monitor() == monitorIndex; + }); + + return windows; +} + +/** + * Extend ShowAppsIcon + * + * - Pass settings to the constructor + * - set label position based on dash orientation + * - implement a popupMenu based on the AppIcon code + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this ugly pattern. + */ +function extendShowAppsIcon(showAppsIcon, settings) { + showAppsIcon._dtdSettings = settings; + /* the variable equivalent to toggleButton has a different name in the appIcon class + (actor): duplicate reference to easily reuse appIcon methods */ + showAppsIcon.actor = showAppsIcon.toggleButton; + + // Re-use appIcon methods + showAppsIcon._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; + showAppsIcon._setPopupTimeout = AppDisplay.AppIcon.prototype._setPopupTimeout; + showAppsIcon._onButtonPress = AppDisplay.AppIcon.prototype._onButtonPress; + showAppsIcon._onKeyboardPopupMenu = AppDisplay.AppIcon.prototype._onKeyboardPopupMenu; + showAppsIcon._onLeaveEvent = AppDisplay.AppIcon.prototype._onLeaveEvent; + showAppsIcon._onTouchEvent = AppDisplay.AppIcon.prototype._onTouchEvent; + showAppsIcon._onMenuPoppedDown = AppDisplay.AppIcon.prototype._onMenuPoppedDown; + + + // No action on clicked (showing of the appsview is controlled elsewhere) + showAppsIcon._onClicked = function(actor, button) { + showAppsIcon._removeMenuTimeout(); + }; + + showAppsIcon.actor.connect('leave-event', Lang.bind(showAppsIcon, showAppsIcon._onLeaveEvent)); + showAppsIcon.actor.connect('button-press-event', Lang.bind(showAppsIcon, showAppsIcon._onButtonPress)); + showAppsIcon.actor.connect('touch-event', Lang.bind(showAppsIcon, showAppsIcon._onTouchEvent)); + showAppsIcon.actor.connect('clicked', Lang.bind(showAppsIcon, showAppsIcon._onClicked)); + showAppsIcon.actor.connect('popup-menu', Lang.bind(showAppsIcon, showAppsIcon._onKeyboardPopupMenu)); + + showAppsIcon._menu = null; + showAppsIcon._menuManager = new PopupMenu.PopupMenuManager(showAppsIcon); + showAppsIcon._menuTimeoutId = 0; + + showAppsIcon.showLabel = itemShowLabel; + + showAppsIcon.popupMenu = function() { + showAppsIcon._removeMenuTimeout(); + showAppsIcon.actor.fake_release(); + + if (!showAppsIcon._menu) { + showAppsIcon._menu = new MyShowAppsIconMenu(showAppsIcon, showAppsIcon._dtdSettings); + showAppsIcon._menu.connect('open-state-changed', Lang.bind(showAppsIcon, function(menu, isPoppedUp) { + if (!isPoppedUp) + showAppsIcon._onMenuPoppedDown(); + })); + let id = Main.overview.connect('hiding', Lang.bind(showAppsIcon, function() { + showAppsIcon._menu.close(); + })); + showAppsIcon._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + showAppsIcon._menuManager.addMenu(showAppsIcon._menu); + } + + showAppsIcon.emit('menu-state-changed', true); + + showAppsIcon.actor.set_hover(true); + showAppsIcon._menu.popup(); + showAppsIcon._menuManager.ignoreRelease(); + showAppsIcon.emit('sync-tooltip'); + + return false; + }; + + Signals.addSignalMethods(showAppsIcon); +} + +/** + * A menu for the showAppsIcon + */ +const MyShowAppsIconMenu = new Lang.Class({ + Name: 'DashToDock.ShowAppsIconMenu', + Extends: MyAppIconMenu, + + _redisplay: function() { + this.removeAll(); + + /* Translators: %s is "Settings", which is automatically translated. You + can also translate the full message if this fits better your language. */ + let name = __('Dash to Dock %s').format(_('Settings')) + let item = this._appendMenuItem(name); + + item.connect('activate', function () { + Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); + }); + } +}); + +/** + * This function is used for both extendShowAppsIcon and extendDashItemContainer + */ +function itemShowLabel() { + // Check if the label is still present at all. When switching workpaces, the + // item might have been destroyed in between. + if (!this._labelText || this.label.get_stage() == null) + return; + + this.label.set_text(this._labelText); + this.label.opacity = 0; + this.label.show(); + + let [stageX, stageY] = this.get_transformed_position(); + let node = this.label.get_theme_node(); + + let itemWidth = this.allocation.x2 - this.allocation.x1; + let itemHeight = this.allocation.y2 - this.allocation.y1; + + let labelWidth = this.label.get_width(); + let labelHeight = this.label.get_height(); + + let x, y, xOffset, yOffset; + + let position = Utils.getPosition(this._dtdSettings); + this._isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); + let labelOffset = node.get_length('-x-offset'); + + switch (position) { + case St.Side.LEFT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = stageX + this.get_width() + xOffset; + break; + case St.Side.RIGHT: + yOffset = Math.floor((itemHeight - labelHeight) / 2); + y = stageY + yOffset; + xOffset = labelOffset; + x = Math.round(stageX) - labelWidth - xOffset; + break; + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + case St.Side.BOTTOM: + yOffset = labelOffset; + y = stageY - labelHeight - yOffset; + xOffset = Math.floor((itemWidth - labelWidth) / 2); + x = stageX + xOffset; + break; + } + + // keep the label inside the screen border + // Only needed fot the x coordinate. + + // Leave a few pixel gap + let gap = 5; + let monitor = Main.layoutManager.findMonitorForActor(this); + if (x - monitor.x < gap) + x += monitor.x - x + labelOffset; + else if (x + labelWidth > monitor.x + monitor.width - gap) + x -= x + labelWidth - (monitor.x + monitor.width) + gap; + + this.label.set_position(x, y); + Tweener.addTween(this.label, { + opacity: 255, + time: DASH_ITEM_LABEL_SHOW_TIME, + transition: 'easeOutQuad', + }); +} diff --git a/package/convenience.js b/package/convenience.js new file mode 100644 index 0000000..9c912bf --- /dev/null +++ b/package/convenience.js @@ -0,0 +1,74 @@ +/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/* + * Part of this file comes from gnome-shell-extensions: + * http://git.gnome.org/browse/gnome-shell-extensions/ + */ + +const Gettext = imports.gettext; +const Gio = imports.gi.Gio; + +const Config = imports.misc.config; +const ExtensionUtils = imports.misc.extensionUtils; + +/** + * initTranslations: + * @domain: (optional): the gettext domain to use + * + * Initialize Gettext to load translations from extensionsdir/locale. + * If @domain is not provided, it will be taken from metadata['gettext-domain'] + */ +function initTranslations(domain) { + let extension = ExtensionUtils.getCurrentExtension(); + + domain = domain || extension.metadata['gettext-domain']; + + // Check if this extension was built with "make zip-file", and thus + // has the locale files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell + let localeDir = extension.dir.get_child('locale'); + if (localeDir.query_exists(null)) + Gettext.bindtextdomain(domain, localeDir.get_path()); + else + Gettext.bindtextdomain(domain, Config.LOCALEDIR); +} + +/** + * getSettings: + * @schema: (optional): the GSettings schema id + * + * Builds and return a GSettings schema for @schema, using schema files + * in extensionsdir/schemas. If @schema is not provided, it is taken from + * metadata['settings-schema']. + */ +function getSettings(schema) { + let extension = ExtensionUtils.getCurrentExtension(); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // Check if this extension was built with "make zip-file", and thus + // has the schema files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell (and therefore schemas are available + // in the standard folders) + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + else + schemaSource = GioSSS.get_default(); + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error('Schema ' + schema + ' could not be found for extension ' + + extension.metadata.uuid + '. Please check your installation.'); + + return new Gio.Settings({ + settings_schema: schemaObj + }); +} diff --git a/package/dash.js b/package/dash.js new file mode 100644 index 0000000..593185a --- /dev/null +++ b/package/dash.js @@ -0,0 +1,1180 @@ +// -*- 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 Lang = imports.lang; +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 Tweener = imports.ui.tweener; +const Util = imports.misc.util; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; +const AppIcons = Me.imports.appIcons; + +let DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME; +let DASH_ITEM_LABEL_HIDE_TIME = Dash.DASH_ITEM_LABEL_HIDE_TIME; +let DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; + +/** + * Extend DashItemContainer + * + * - Pass settings to the constructor + * - set label position based on dash orientation + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this ugly pattern. + */ +function extendDashItemContainer(dashItemContainer, settings) { + dashItemContainer._dtdSettings = settings; + dashItemContainer.showLabel = AppIcons.itemShowLabel; +} + +/** + * This class is a fork of the upstream DashActor class (ui.dash.js) + * + * Summary of changes: + * - passed settings to class as parameter + * - modified chldBox calculations for when 'show-apps-at-top' option is checked + * - handle horizontal dash + */ +const MyDashActor = new Lang.Class({ + Name: 'DashToDock.MyDashActor', + + _init: function(settings) { + // a prefix is required to avoid conflicting with the parent class variable + this._dtdSettings = settings; + this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL); + + this._position = Utils.getPosition(settings); + this._isHorizontal = ((this._position == St.Side.TOP) || + (this._position == St.Side.BOTTOM)); + + let layout = new Clutter.BoxLayout({ + orientation: this._isHorizontal ? Clutter.Orientation.HORIZONTAL : Clutter.Orientation.VERTICAL + }); + + this.actor = new Shell.GenericContainer({ + name: 'dash', + layout_manager: layout, + clip_to_allocation: true + }); + this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); + this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight)); + this.actor.connect('allocate', Lang.bind(this, this._allocate)); + + this.actor._delegate = this; + }, + + _allocate: function(actor, box, flags) { + let contentBox = box; + let availWidth = contentBox.x2 - contentBox.x1; + let availHeight = contentBox.y2 - contentBox.y1; + + let [appIcons, showAppsButton] = actor.get_children(); + let [showAppsMinHeight, showAppsNatHeight] = showAppsButton.get_preferred_height(availWidth); + let [showAppsMinWidth, showAppsNatWidth] = showAppsButton.get_preferred_width(availHeight); + + let offset_x = this._isHorizontal?showAppsNatWidth:0; + let offset_y = this._isHorizontal?0:showAppsNatHeight; + + let childBox = new Clutter.ActorBox(); + if ((this._dtdSettings.get_boolean('show-apps-at-top') && !this._isHorizontal) + || (this._dtdSettings.get_boolean('show-apps-at-top') && !this._rtl) + || (!this._dtdSettings.get_boolean('show-apps-at-top') && this._isHorizontal && this._rtl)) { + childBox.x1 = contentBox.x1 + offset_x; + childBox.y1 = contentBox.y1 + offset_y; + childBox.x2 = contentBox.x2; + childBox.y2 = contentBox.y2; + appIcons.allocate(childBox, flags); + + childBox.y1 = contentBox.y1; + childBox.x1 = contentBox.x1; + childBox.x2 = contentBox.x1 + showAppsNatWidth; + childBox.y2 = contentBox.y1 + showAppsNatHeight; + showAppsButton.allocate(childBox, flags); + } + else { + childBox.x1 = contentBox.x1; + childBox.y1 = contentBox.y1; + childBox.x2 = contentBox.x2 - offset_x; + childBox.y2 = contentBox.y2 - offset_y; + appIcons.allocate(childBox, flags); + + childBox.x2 = contentBox.x2; + childBox.y2 = contentBox.y2; + childBox.x1 = contentBox.x2 - showAppsNatWidth; + childBox.y1 = contentBox.y2 - showAppsNatHeight; + showAppsButton.allocate(childBox, flags); + } + }, + + _getPreferredWidth: function(actor, forHeight, alloc) { + // We want to request the natural height of all our children + // as our natural height, so we chain up to StWidget (which + // then calls BoxLayout), but we only request the showApps + // button as the minimum size + + let [, natWidth] = this.actor.layout_manager.get_preferred_width(this.actor, forHeight); + + let themeNode = this.actor.get_theme_node(); + let [, showAppsButton] = this.actor.get_children(); + let [minWidth, ] = showAppsButton.get_preferred_height(forHeight); + + alloc.min_size = minWidth; + alloc.natural_size = natWidth; + + }, + + _getPreferredHeight: function(actor, forWidth, alloc) { + // We want to request the natural height of all our children + // as our natural height, so we chain up to StWidget (which + // then calls BoxLayout), but we only request the showApps + // button as the minimum size + + let [, natHeight] = this.actor.layout_manager.get_preferred_height(this.actor, forWidth); + + let themeNode = this.actor.get_theme_node(); + let [, showAppsButton] = this.actor.get_children(); + let [minHeight, ] = showAppsButton.get_preferred_height(forWidth); + + alloc.min_size = minHeight; + alloc.natural_size = natHeight; + } +}); + +const baseIconSizes = [16, 22, 24, 32, 48, 64, 96, 128]; + +/** + * This class is a fork of the upstream dash class (ui.dash.js) + * + * Summary of changes: + * - disconnect global signals adding a destroy method; + * - play animations even when not in overview mode + * - set a maximum icon size + * - show running and/or favorite applications + * - emit a custom signal when an app icon is added + * - hide showApps label when the custom menu is shown. + * - add scrollview + * ensure actor is visible on keyfocus inseid the scrollview + * - add 128px icon size, might be usefull for hidpi display + * - sync minimization application target position. + * - keep running apps ordered. + */ +const MyDash = new Lang.Class({ + Name: 'DashToDock.MyDash', + + _init: function(settings, monitorIndex) { + this._maxHeight = -1; + this.iconSize = 64; + this._availableIconSizes = baseIconSizes; + this._shownInitially = false; + + this._dtdSettings = settings; + this._monitorIndex = monitorIndex; + this._position = Utils.getPosition(settings); + this._isHorizontal = ((this._position == St.Side.TOP) || + (this._position == St.Side.BOTTOM)); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._dragPlaceholder = null; + this._dragPlaceholderPos = -1; + this._animatingPlaceholdersCount = 0; + this._showLabelTimeoutId = 0; + this._resetHoverTimeoutId = 0; + this._ensureAppIconVisibilityTimeoutId = 0; + this._labelShowing = false; + + this._containerObject = new MyDashActor(settings); + this._container = this._containerObject.actor; + this._scrollView = new St.ScrollView({ + name: 'dashtodockDashScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: false + }); + + this._scrollView.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); + + this._box = new St.BoxLayout({ + vertical: !this._isHorizontal, + clip_to_allocation: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START + }); + this._box._delegate = this; + this._container.add_actor(this._scrollView); + this._scrollView.add_actor(this._box); + + this._showAppsIcon = new Dash.ShowAppsIcon(); + AppIcons.extendShowAppsIcon(this._showAppsIcon, this._dtdSettings); + this._showAppsIcon.childScale = 1; + this._showAppsIcon.childOpacity = 255; + this._showAppsIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(this._showAppsIcon); + + let appsIcon = this._showAppsIcon; + appsIcon.connect('menu-state-changed', Lang.bind(this, function(appsIcon, opened) { + this._itemMenuStateChanged(appsIcon, opened); + })); + + this.showAppsButton = this._showAppsIcon.toggleButton; + + this._container.add_actor(this._showAppsIcon); + + let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; + this.actor = new St.Bin({ + child: this._container, + y_align: St.Align.START, + x_align: rtl ? St.Align.END : St.Align.START + }); + + if (this._isHorizontal) { + this.actor.connect('notify::width', Lang.bind(this, function() { + if (this._maxHeight != this.actor.width) + this._queueRedisplay(); + this._maxHeight = this.actor.width; + })); + } + else { + this.actor.connect('notify::height', Lang.bind(this, function() { + if (this._maxHeight != this.actor.height) + this._queueRedisplay(); + this._maxHeight = this.actor.height; + })); + } + + // Update minimization animation target position on allocation of the + // container and on scrollview change. + this._box.connect('notify::allocation', Lang.bind(this, this._updateAppsIconGeometry)); + let scrollViewAdjustment = this._isHorizontal ? this._scrollView.hscroll.adjustment : this._scrollView.vscroll.adjustment; + scrollViewAdjustment.connect('notify::value', Lang.bind(this, this._updateAppsIconGeometry)); + + this._workId = Main.initializeDeferredWork(this._box, Lang.bind(this, this._redisplay)); + + this._settings = new Gio.Settings({ + schema_id: 'org.gnome.shell' + }); + + this._appSystem = Shell.AppSystem.get_default(); + + this._signalsHandler.add([ + this._appSystem, + 'installed-changed', + Lang.bind(this, function() { + AppFavorites.getAppFavorites().reload(); + this._queueRedisplay(); + }) + ], [ + AppFavorites.getAppFavorites(), + 'changed', + Lang.bind(this, this._queueRedisplay) + ], [ + this._appSystem, + 'app-state-changed', + Lang.bind(this, this._queueRedisplay) + ], [ + Main.overview, + 'item-drag-begin', + Lang.bind(this, this._onDragBegin) + ], [ + Main.overview, + 'item-drag-end', + Lang.bind(this, this._onDragEnd) + ], [ + Main.overview, + 'item-drag-cancelled', + Lang.bind(this, this._onDragCancelled) + ]); + }, + + destroy: function() { + this._signalsHandler.destroy(); + }, + + _onScrollEvent: function(actor, event) { + // If scroll is not used because the icon is resized, let the scroll event propagate. + if (!this._dtdSettings.get_boolean('icon-size-fixed')) + return Clutter.EVENT_PROPAGATE; + + // 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 ((this._position == St.Side.LEFT && event_x <= 1) + || (this._position == St.Side.RIGHT && event_x >= actor_w - 2) + || (this._position == St.Side.TOP && event_y <= 1) + || (this._position == St.Side.BOTTOM && event_y >= actor_h - 2)) + return Clutter.EVENT_PROPAGATE; + + // reset timeout to avid conflicts with the mousehover event + if (this._ensureAppIconVisibilityTimeoutId > 0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + + // Skip to avoid double events mouse + if (event.is_pointer_emulated()) + return Clutter.EVENT_STOP; + + let adjustment, delta; + + if (this._isHorizontal) + adjustment = this._scrollView.get_hscroll_bar().get_adjustment(); + else + adjustment = this._scrollView.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; + // Also consider horizontal component, for instance touchpad + if (this._isHorizontal) + delta += dx * increment; + break; + } + + adjustment.set_value(adjustment.get_value() + delta); + + return Clutter.EVENT_STOP; + }, + + _onDragBegin: function() { + this._dragCancelled = false; + this._dragMonitor = { + dragMotion: Lang.bind(this, this._onDragMotion) + }; + DND.addDragMonitor(this._dragMonitor); + + if (this._box.get_n_children() == 0) { + this._emptyDropTarget = new Dash.EmptyDropTargetItem(); + this._box.insert_child_at_index(this._emptyDropTarget, 0); + this._emptyDropTarget.show(true); + } + }, + + _onDragCancelled: function() { + this._dragCancelled = true; + this._endDrag(); + }, + + _onDragEnd: function() { + if (this._dragCancelled) + return; + + this._endDrag(); + }, + + _endDrag: function() { + this._clearDragPlaceholder(); + this._clearEmptyDropTarget(); + this._showAppsIcon.setDragApp(null); + DND.removeDragMonitor(this._dragMonitor); + }, + + _onDragMotion: function(dragEvent) { + let app = Dash.getAppFromSource(dragEvent.source); + if (app == null) + return DND.DragMotionResult.CONTINUE; + + let showAppsHovered = this._showAppsIcon.contains(dragEvent.targetActor); + + if (!this._box.contains(dragEvent.targetActor) || showAppsHovered) + this._clearDragPlaceholder(); + + if (showAppsHovered) + this._showAppsIcon.setDragApp(app); + else + this._showAppsIcon.setDragApp(null); + + return DND.DragMotionResult.CONTINUE; + }, + + _appIdListToHash: function(apps) { + let ids = {}; + for (let i = 0; i < apps.length; i++) + ids[apps[i].get_id()] = apps[i]; + return ids; + }, + + _queueRedisplay: function() { + Main.queueDeferredWork(this._workId); + }, + + _hookUpLabel: function(item, appIcon) { + item.child.connect('notify::hover', Lang.bind(this, function() { + this._syncLabel(item, appIcon); + })); + + let id = Main.overview.connect('hiding', Lang.bind(this, function() { + this._labelShowing = false; + item.hideLabel(); + })); + item.child.connect('destroy', function() { + Main.overview.disconnect(id); + }); + + if (appIcon) { + appIcon.connect('sync-tooltip', Lang.bind(this, function() { + this._syncLabel(item, appIcon); + })); + } + }, + + _createAppItem: function(app) { + let appIcon = new AppIcons.MyAppIcon(this._dtdSettings, app, this._monitorIndex, + { setSizeManually: true, + showLabel: false }); + if (appIcon._draggable) { + appIcon._draggable.connect('drag-begin', Lang.bind(this, function() { + appIcon.actor.opacity = 50; + })); + appIcon._draggable.connect('drag-end', Lang.bind(this, function() { + appIcon.actor.opacity = 255; + })); + } + + appIcon.connect('menu-state-changed', Lang.bind(this, function(appIcon, opened) { + this._itemMenuStateChanged(item, opened); + })); + + let item = new Dash.DashItemContainer(); + + extendDashItemContainer(item, this._dtdSettings); + item.setChild(appIcon.actor); + + appIcon.actor.connect('notify::hover', Lang.bind(this, function() { + if (appIcon.actor.hover) { + this._ensureAppIconVisibilityTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, function() { + ensureActorVisibleInScrollView(this._scrollView, appIcon.actor); + this._ensureAppIconVisibilityTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + } + else { + if (this._ensureAppIconVisibilityTimeoutId > 0) { + Mainloop.source_remove(this._ensureAppIconVisibilityTimeoutId); + this._ensureAppIconVisibilityTimeoutId = 0; + } + } + })); + + appIcon.actor.connect('clicked', Lang.bind(this, function(actor) { + ensureActorVisibleInScrollView(this._scrollView, actor); + })); + + appIcon.actor.connect('key-focus-in', Lang.bind(this, function(actor) { + let [x_shift, y_shift] = ensureActorVisibleInScrollView(this._scrollView, actor); + + // This signal is triggered also by mouse click. The popup menu is opened at the original + // coordinates. Thus correct for the shift which is going to be applied to the scrollview. + if (appIcon._menu) { + appIcon._menu._boxPointer.xOffset = -x_shift; + appIcon._menu._boxPointer.yOffset = -y_shift; + } + })); + + // Override default AppIcon label_actor, now the + // accessible_name is set at DashItemContainer.setLabelText + appIcon.actor.label_actor = null; + item.setLabelText(app.get_name()); + + appIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(item, appIcon); + + return item; + }, + + /** + * Return an array with the "proper" appIcons currently in the dash + */ + _getAppIcons: function() { + // Only consider children which are "proper" + // icons (i.e. ignoring drag placeholders) and which are not + // animating out (which means they will be destroyed at the end of + // the animation) + let iconChildren = this._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.icon && + !actor.animatingOut; + }); + + let appIcons = iconChildren.map(function(actor) { + return actor.child._delegate; + }); + + return appIcons; + }, + + _updateAppsIconGeometry: function() { + let appIcons = this._getAppIcons(); + appIcons.forEach(function(icon) { + icon.updateIconGeometry(); + }); + }, + + _itemMenuStateChanged: function(item, opened) { + // When the menu closes, it calls sync_hover, which means + // that the notify::hover handler does everything we need to. + if (opened) { + if (this._showLabelTimeoutId > 0) { + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + } + + item.hideLabel(); + } + else { + // I want to listen from outside when a menu is closed. I used to + // add a custom signal to the appIcon, since gnome 3.8 the signal + // calling this callback was added upstream. + this.emit('menu-closed'); + } + }, + + _syncLabel: function(item, appIcon) { + let shouldShow = appIcon ? appIcon.shouldShowTooltip() : item.child.get_hover(); + + if (shouldShow) { + if (this._showLabelTimeoutId == 0) { + let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; + this._showLabelTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, function() { + this._labelShowing = true; + item.showLabel(); + this._showLabelTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel'); + if (this._resetHoverTimeoutId > 0) { + Mainloop.source_remove(this._resetHoverTimeoutId); + this._resetHoverTimeoutId = 0; + } + } + } + else { + if (this._showLabelTimeoutId > 0) + Mainloop.source_remove(this._showLabelTimeoutId); + this._showLabelTimeoutId = 0; + item.hideLabel(); + if (this._labelShowing) { + this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT, Lang.bind(this, function() { + this._labelShowing = false; + this._resetHoverTimeoutId = 0; + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing'); + } + } + }, + + _adjustIconSize: function() { + // For the icon size, we only consider children which are "proper" + // icons (i.e. ignoring drag placeholders) and which are not + // animating out (which means they will be destroyed at the end of + // the animation) + let iconChildren = this._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.icon && + !actor.animatingOut; + }); + + iconChildren.push(this._showAppsIcon); + + if (this._maxHeight == -1) + return; + + // Check if the container is present in the stage. This avoids critical + // errors when unlocking the screen + if (!this._container.get_stage()) + return; + + let themeNode = this._container.get_theme_node(); + let maxAllocation = new Clutter.ActorBox({ + x1: 0, + y1: 0, + x2: this._isHorizontal ? this._maxHeight : 42 /* whatever */, + y2: this._isHorizontal ? 42 : this._maxHeight + }); + let maxContent = themeNode.get_content_box(maxAllocation); + let availHeight; + if (this._isHorizontal) + availHeight = maxContent.x2 - maxContent.x1; + else + availHeight = maxContent.y2 - maxContent.y1; + let spacing = themeNode.get_length('spacing'); + + let firstButton = iconChildren[0].child; + let firstIcon = firstButton._delegate.icon; + + let minHeight, natHeight, minWidth, natWidth; + + // Enforce the current icon size during the size request + firstIcon.setIconSize(this.iconSize); + [minHeight, natHeight] = firstButton.get_preferred_height(-1); + [minWidth, natWidth] = firstButton.get_preferred_width(-1); + + let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + let iconSizes = this._availableIconSizes.map(function(s) { + return s * scaleFactor; + }); + + // Subtract icon padding and box spacing from the available height + if (this._isHorizontal) + availHeight -= iconChildren.length * (natWidth - this.iconSize * scaleFactor) + + (iconChildren.length - 1) * spacing; + else + availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) + + (iconChildren.length - 1) * spacing; + + let availSize = availHeight / iconChildren.length; + + + let newIconSize = this._availableIconSizes[0]; + for (let i = 0; i < iconSizes.length; i++) { + if (iconSizes[i] < availSize) + newIconSize = this._availableIconSizes[i]; + } + + if (newIconSize == this.iconSize) + return; + + let oldIconSize = this.iconSize; + this.iconSize = newIconSize; + this.emit('icon-size-changed'); + + let scale = oldIconSize / newIconSize; + for (let i = 0; i < iconChildren.length; i++) { + let icon = iconChildren[i].child._delegate.icon; + + // Set the new size immediately, to keep the icons' sizes + // in sync with this.iconSize + icon.setIconSize(this.iconSize); + + // Don't animate the icon size change when the overview + // is transitioning, or when initially filling + // the dash + if (Main.overview.animationInProgress || + !this._shownInitially) + continue; + + let [targetWidth, targetHeight] = icon.icon.get_size(); + + // Scale the icon's texture to the previous size and + // tween to the new size + icon.icon.set_size(icon.icon.width * scale, + icon.icon.height * scale); + + Tweener.addTween(icon.icon, + { width: targetWidth, + height: targetHeight, + time: DASH_ANIMATION_TIME, + transition: 'easeOutQuad', + }); + } + }, + + _redisplay: function() { + let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); + + let running = this._appSystem.get_running(); + if (this._dtdSettings.get_boolean('isolate-workspaces') || + this._dtdSettings.get_boolean('isolate-monitors')) { + // When using isolation, we filter out apps that have no windows in + // the current workspace + let settings = this._dtdSettings; + let monitorIndex = this._monitorIndex; + running = running.filter(function(_app) { + return AppIcons.getInterestingWindows(_app, settings, monitorIndex).length != 0; + }); + } + + let children = this._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.app; + }); + // Apps currently in the dash + let oldApps = children.map(function(actor) { + return actor.child._delegate.app; + }); + // Apps supposed to be in the dash + let newApps = []; + + if (this._dtdSettings.get_boolean('show-favorites')) { + for (let id in favorites) + newApps.push(favorites[id]); + } + + // We reorder the running apps so that they don't change position on the + // dash with every redisplay() call + if (this._dtdSettings.get_boolean('show-running')) { + // First: add the apps from the oldApps list that are still running + for (let i = 0; i < oldApps.length; i++) { + let index = running.indexOf(oldApps[i]); + if (index > -1) { + let app = running.splice(index, 1)[0]; + if (this._dtdSettings.get_boolean('show-favorites') && (app.get_id() in favorites)) + continue; + newApps.push(app); + } + } + // Second: add the new apps + for (let i = 0; i < running.length; i++) { + let app = running[i]; + if (this._dtdSettings.get_boolean('show-favorites') && (app.get_id() in favorites)) + continue; + newApps.push(app); + } + } + + // Figure out the actual changes to the list of items; we iterate + // over both the list of items currently in the dash and the list + // of items expected there, and collect additions and removals. + // Moves are both an addition and a removal, where the order of + // the operations depends on whether we encounter the position + // where the item has been added first or the one from where it + // was removed. + // There is an assumption that only one item is moved at a given + // time; when moving several items at once, everything will still + // end up at the right position, but there might be additional + // additions/removals (e.g. it might remove all the launchers + // and add them back in the new order even if a smaller set of + // additions and removals is possible). + // If above assumptions turns out to be a problem, we might need + // to use a more sophisticated algorithm, e.g. Longest Common + // Subsequence as used by diff. + + let addedItems = []; + let removedActors = []; + + let newIndex = 0; + let oldIndex = 0; + while ((newIndex < newApps.length) || (oldIndex < oldApps.length)) { + // No change at oldIndex/newIndex + if (oldApps[oldIndex] && oldApps[oldIndex] == newApps[newIndex]) { + oldIndex++; + newIndex++; + continue; + } + + // App removed at oldIndex + if (oldApps[oldIndex] && (newApps.indexOf(oldApps[oldIndex]) == -1)) { + removedActors.push(children[oldIndex]); + oldIndex++; + continue; + } + + // App added at newIndex + if (newApps[newIndex] && (oldApps.indexOf(newApps[newIndex]) == -1)) { + let newItem = this._createAppItem(newApps[newIndex]); + addedItems.push({ app: newApps[newIndex], + item: newItem, + pos: newIndex }); + newIndex++; + continue; + } + + // App moved + let insertHere = newApps[newIndex + 1] && (newApps[newIndex + 1] == oldApps[oldIndex]); + let alreadyRemoved = removedActors.reduce(function(result, actor) { + let removedApp = actor.child._delegate.app; + return result || removedApp == newApps[newIndex]; + }, false); + + if (insertHere || alreadyRemoved) { + let newItem = this._createAppItem(newApps[newIndex]); + addedItems.push({ + app: newApps[newIndex], + item: newItem, + pos: newIndex + removedActors.length + }); + newIndex++; + } + else { + removedActors.push(children[oldIndex]); + oldIndex++; + } + } + + for (let i = 0; i < addedItems.length; i++) + this._box.insert_child_at_index(addedItems[i].item, + addedItems[i].pos); + + for (let i = 0; i < removedActors.length; i++) { + let item = removedActors[i]; + + // Don't animate item removal when the overview is transitioning + if (!Main.overview.animationInProgress) + item.animateOutAndDestroy(); + else + item.destroy(); + } + + this._adjustIconSize(); + + for (let i = 0; i < addedItems.length; i++) + // Emit a custom signal notifying that a new item has been added + this.emit('item-added', addedItems[i]); + + // Skip animations on first run when adding the initial set + // of items, to avoid all items zooming in at once + + let animate = this._shownInitially && + !Main.overview.animationInProgress; + + 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(); + + // This is required for icon reordering when the scrollview is used. + this._updateAppsIconGeometry(); + + // This will update the size, and the corresponding number for each icon + this._updateNumberOverlay(); + }, + + _updateNumberOverlay: function() { + let appIcons = this._getAppIcons(); + let counter = 1; + appIcons.forEach(function(icon) { + if (counter < 10){ + icon.setNumberOverlay(counter); + counter++; + } + else if (counter == 10) { + icon.setNumberOverlay(0); + counter++; + } + else { + // No overlay after 10 + icon.setNumberOverlay(-1); + } + icon.updateNumberOverlay(); + }); + + }, + + toggleNumberOverlay: function(activate) { + let appIcons = this._getAppIcons(); + appIcons.forEach(function(icon) { + icon.toggleNumberOverlay(activate); + }); + }, + + setIconSize: function(max_size, doNotAnimate) { + let max_allowed = baseIconSizes[baseIconSizes.length-1]; + max_size = Math.min(max_size, max_allowed); + + if (this._dtdSettings.get_boolean('icon-size-fixed')) + this._availableIconSizes = [max_size]; + else { + this._availableIconSizes = baseIconSizes.filter(function(val) { + return (val<max_size); + }); + this._availableIconSizes.push(max_size); + } + + if (doNotAnimate) + this._shownInitially = false; + + this._queueRedisplay(); + }, + + /** + * Reset the displayed apps icon to mantain the correct order when changing + * show favorites/show running settings + */ + resetAppIcons: function() { + let children = this._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.icon; + }); + for (let i = 0; i < children.length; i++) { + let item = children[i]; + item.destroy(); + } + + // to avoid ugly animations, just suppress them like when dash is first loaded. + this._shownInitially = false; + this._redisplay(); + + }, + + _clearDragPlaceholder: function() { + if (this._dragPlaceholder) { + this._animatingPlaceholdersCount++; + this._dragPlaceholder.animateOutAndDestroy(); + this._dragPlaceholder.connect('destroy', Lang.bind(this, function() { + this._animatingPlaceholdersCount--; + })); + this._dragPlaceholder = null; + } + this._dragPlaceholderPos = -1; + }, + + _clearEmptyDropTarget: function() { + if (this._emptyDropTarget) { + this._emptyDropTarget.animateOutAndDestroy(); + this._emptyDropTarget = null; + } + }, + + handleDragOver: function(source, actor, x, y, time) { + let app = Dash.getAppFromSource(source); + + // Don't allow favoriting of transient apps + if (app == null || app.is_window_backed()) + return DND.DragMotionResult.NO_DROP; + + if (!this._settings.is_writable('favorite-apps') || !this._dtdSettings.get_boolean('show-favorites')) + return DND.DragMotionResult.NO_DROP; + + let favorites = AppFavorites.getAppFavorites().getFavorites(); + let numFavorites = favorites.length; + + let favPos = favorites.indexOf(app); + + let children = this._box.get_children(); + let numChildren = children.length; + let boxHeight = 0; + for (let i = 0; i < numChildren; i++) + boxHeight += this._isHorizontal?children[i].width:children[i].height; + + // Keep the placeholder out of the index calculation; assuming that + // the remove target has the same size as "normal" items, we don't + // need to do the same adjustment there. + if (this._dragPlaceholder) { + boxHeight -= this._isHorizontal?this._dragPlaceholder.width:this._dragPlaceholder.height; + numChildren--; + } + + let pos; + if (!this._emptyDropTarget) { + pos = Math.floor((this._isHorizontal?x:y) * numChildren / boxHeight); + if (pos > numChildren) + pos = numChildren; + } + else + pos = 0; // always insert at the top when dash is empty + + // Take into account childredn position in rtl + if (this._isHorizontal && (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)) + pos = numChildren - pos; + + if ((pos != this._dragPlaceholderPos) && (pos <= numFavorites) && (this._animatingPlaceholdersCount == 0)) { + this._dragPlaceholderPos = pos; + + // Don't allow positioning before or after self + if ((favPos != -1) && (pos == favPos || pos == favPos + 1)) { + this._clearDragPlaceholder(); + return DND.DragMotionResult.CONTINUE; + } + + // If the placeholder already exists, we just move + // it, but if we are adding it, expand its size in + // an animation + let fadeIn; + if (this._dragPlaceholder) { + this._dragPlaceholder.destroy(); + fadeIn = false; + } + else + fadeIn = true; + + this._dragPlaceholder = new Dash.DragPlaceholderItem(); + this._dragPlaceholder.child.set_width (this.iconSize); + this._dragPlaceholder.child.set_height (this.iconSize / 2); + this._box.insert_child_at_index(this._dragPlaceholder, + this._dragPlaceholderPos); + this._dragPlaceholder.show(fadeIn); + // Ensure the next and previous icon are visible when moving the placeholder + // (I assume there's room for both of them) + if (this._dragPlaceholderPos > 1) + ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[this._dragPlaceholderPos-1]); + if (this._dragPlaceholderPos < this._box.get_children().length-1) + ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[this._dragPlaceholderPos+1]); + } + + // Remove the drag placeholder if we are not in the + // "favorites zone" + if (pos > numFavorites) + this._clearDragPlaceholder(); + + if (!this._dragPlaceholder) + return DND.DragMotionResult.NO_DROP; + + let srcIsFavorite = (favPos != -1); + + if (srcIsFavorite) + return DND.DragMotionResult.MOVE_DROP; + + return DND.DragMotionResult.COPY_DROP; + }, + + /** + * Draggable target interface + */ + acceptDrop: function(source, actor, x, y, time) { + let app = Dash.getAppFromSource(source); + + // Don't allow favoriting of transient apps + if (app == null || app.is_window_backed()) + return false; + + if (!this._settings.is_writable('favorite-apps') || !this._dtdSettings.get_boolean('show-favorites')) + return false; + + let id = app.get_id(); + + let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); + + let srcIsFavorite = (id in favorites); + + let favPos = 0; + let children = this._box.get_children(); + for (let i = 0; i < this._dragPlaceholderPos; i++) { + if (this._dragPlaceholder && (children[i] == this._dragPlaceholder)) + continue; + + let childId = children[i].child._delegate.app.get_id(); + if (childId == id) + continue; + if (childId in favorites) + favPos++; + } + + // No drag placeholder means we don't wan't to favorite the app + // and we are dragging it to its original position + if (!this._dragPlaceholder) + return true; + + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { + let appFavorites = AppFavorites.getAppFavorites(); + if (srcIsFavorite) + appFavorites.moveFavoriteToPos(id, favPos); + else + appFavorites.addFavoriteAtPos(id, favPos); + return false; + })); + + return true; + }, + + showShowAppsButton: function() { + this.showAppsButton.visible = true + this.showAppsButton.set_width(-1) + this.showAppsButton.set_height(-1) + }, + + hideShowAppsButton: function() { + this.showAppsButton.hide() + this.showAppsButton.set_width(0) + this.showAppsButton.set_height(0) + } +}); + +Signals.addSignalMethods(MyDash.prototype); + +/** + * This is a copy of the same function in utils.js, but also adjust horizontal scrolling + * and perform few further cheks on the current value to avoid changing the values when + * it would be clamp to the current one in any case. + * Return the amount of shift applied + */ +function ensureActorVisibleInScrollView(scrollView, actor) { + let adjust_v = true; + let adjust_h = true; + + let vadjustment = scrollView.vscroll.adjustment; + let hadjustment = scrollView.hscroll.adjustment; + let [vvalue, vlower, vupper, vstepIncrement, vpageIncrement, vpageSize] = vadjustment.get_values(); + let [hvalue, hlower, hupper, hstepIncrement, hpageIncrement, hpageSize] = hadjustment.get_values(); + + let [hvalue0, vvalue0] = [hvalue, vvalue]; + + let voffset = 0; + let hoffset = 0; + let fade = scrollView.get_effect('fade'); + if (fade) { + voffset = fade.vfade_offset; + hoffset = fade.hfade_offset; + } + + let box = actor.get_allocation_box(); + let y1 = box.y1, y2 = box.y2, x1 = box.x1, x2 = box.x2; + + let parent = actor.get_parent(); + while (parent != scrollView) { + if (!parent) + throw new Error('Actor not in scroll view'); + + let box = parent.get_allocation_box(); + y1 += box.y1; + y2 += box.y1; + x1 += box.x1; + x2 += box.x1; + parent = parent.get_parent(); + } + + if (y1 < vvalue + voffset) + vvalue = Math.max(0, y1 - voffset); + else if (vvalue < vupper - vpageSize && y2 > vvalue + vpageSize - voffset) + vvalue = Math.min(vupper -vpageSize, y2 + voffset - vpageSize); + + if (x1 < hvalue + hoffset) + hvalue = Math.max(0, x1 - hoffset); + else if (hvalue < hupper - hpageSize && x2 > hvalue + hpageSize - hoffset) + hvalue = Math.min(hupper - hpageSize, x2 + hoffset - hpageSize); + + if (vvalue !== vvalue0) { + Tweener.addTween(vadjustment, { value: vvalue, + time: Util.SCROLL_TIME, + transition: 'easeOutQuad' + }); + } + + if (hvalue !== hvalue0) { + Tweener.addTween(hadjustment, + { value: hvalue, + time: Util.SCROLL_TIME, + transition: 'easeOutQuad' }); + } + + return [hvalue- hvalue0, vvalue - vvalue0]; +} diff --git a/package/debian/changelog b/package/debian/changelog new file mode 100644 index 0000000..8ebc09f --- /dev/null +++ b/package/debian/changelog @@ -0,0 +1,72 @@ +gnome-shell-extension-dashtodock (60-2) testing; urgency=medium + + * Changed distribution + + -- Davisson Paulino <dhpaulino@gmail.com> Mon, 25 Sep 2017 10:33:48 -0300 + +gnome-shell-extension-dashtodock (60-1) unstable; urgency=medium + + * New upstream release + + -- Jonathan Carter <jcarter@linux.com> Mon, 10 Jul 2017 10:22:45 +0200 + +gnome-shell-extension-dashtodock (59-3) unstable; urgency=medium + + * Don't attempt to build gschemas in rules (Closes: #867448) + * Add Testsuite field to debian/control + + -- Jonathan Carter <jcarter@linux.com> Thu, 06 Jul 2017 19:46:40 +0200 + +gnome-shell-extension-dashtodock (59-2) unstable; urgency=medium + + * Upload to unstable (no changes) + + -- Jonathan Carter <jcarter@linux.com> Wed, 05 Jul 2017 15:41:30 +0200 + +gnome-shell-extension-dashtodock (59-1) experimental; urgency=medium + + * New upstream release + * Improvements to install paths (thanks Fran Glais and Jeremy Bicha) + * Update standards version to 4.0.0 + + -- Jonathan Carter <jcarter@linux.com> Thu, 08 Jun 2017 19:38:10 +0200 + +gnome-shell-extension-dashtodock (57-1) unstable; urgency=medium + + * New upstream release + + -- Jonathan Carter <jcarter@linux.com> Mon, 27 Mar 2017 12:42:33 +0200 + +gnome-shell-extension-dashtodock (56-1) unstable; urgency=medium + + * New upstream release + * Remove unneeded dependency on ${shlibs:Depends} + * Remove fix-install-path patch (accepted upstream) + + -- Jonathan Carter <jcarter@linux.com> Tue, 07 Feb 2017 13:50:55 +0200 + +gnome-shell-extension-dashtodock (55-4) unstable; urgency=medium + + * Depend on gir1.2-clutter-1.0 (Closes: #848662) + + -- Jonathan Carter <jcarter@linux.com> Mon, 23 Jan 2017 14:31:20 +0200 + +gnome-shell-extension-dashtodock (55-3) unstable; urgency=medium + + * Re-apply path fix patch (Closes: #844963) + * Upgrade debian/watch to version 4 + + -- Jonathan Carter <jcarter@linux.com> Wed, 16 Nov 2016 09:07:36 +0200 + +gnome-shell-extension-dashtodock (55-2) unstable; urgency=medium + + * Fix install file to install compiled schema properly + * Bump compat level to 10 (no changes) + + -- Jonathan Carter <jcarter@linux.com> Mon, 14 Nov 2016 13:00:41 +0200 + +gnome-shell-extension-dashtodock (55-1) unstable; urgency=medium + + * Initial release (Closes: 829185) + + -- Jonathan Carter <jcarter@linux.com> Mon, 03 Oct 2016 09:22:40 +0200 diff --git a/package/debian/compat b/package/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/package/debian/compat @@ -0,0 +1 @@ +9 diff --git a/package/debian/control b/package/debian/control new file mode 100644 index 0000000..1a3351e --- /dev/null +++ b/package/debian/control @@ -0,0 +1,25 @@ +Source: gnome-shell-extension-dashtodock +Section: gnome +Priority: optional +Maintainer: Jonathan Carter <jcarter@linux.com> +Build-Depends: debhelper (>=9), libglib2.0-bin (>=2.48) +Standards-Version: 3.9.8 +Homepage: https://micheleg.github.io/dash-to-dock/ +Vcs-Git: https://gitlab.com/highvoltage/gnome-shell-extension-dashtodock-packaging.git +Vcs-Browser: https://gitlab.com/highvoltage/gnome-shell-extension-dashtodock-packaging/tree/master +Testsuite: autopkgtest + +Package: gnome-shell-extension-dashtodock +Architecture: all +Depends: ${misc:Depends}, gnome-shell (>= 3.16), gir1.2-clutter-1.0 +Description: dash-to-dock extension for GNOME shell + Dash to dock extension is an enhanced dash for GNOME Shell. It moves the + default dash out of the overview and transforms it in a dock for an easier + launching of applications and a faster switching between windows and + workspaces without leaving the desktop view improving the workflow in your + system. + . + It supports autohide and intellihide modes as well as a fixed mode. + Optional features are available in the extension settings. The extension + is themes friendly. + diff --git a/package/debian/copyright b/package/debian/copyright new file mode 100644 index 0000000..42395c1 --- /dev/null +++ b/package/debian/copyright @@ -0,0 +1,91 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: dash-to-dock +Source: https://github.com/micheleg/dash-to-dock + +Files: * +Copyright: 2016-2017 Michele <micxgx@gmail.com> +License: GPL-2+ + +Files: po/zh_CN.po +Copyright: 2013 tuhaihe <1132321739qq@gmail.com> + 2015-2016 绿色圣光 <lishaohui.qd@163.com> +License: GPL-2+ + +Files: po/tr.po +Copyright: 2015 Mustafa Akgün <mustafa.akgun@gmail.com> + 2016 Çağatay Yiğit Şahin <cyigitsahin@outlook.com> +License: GPL-2+ + +Files: po/sv.po +Copyright: 2016 Anders Jonsson <anders.jonsson@norsjovallen.se> +License: GPL-2+ + +Files: po/sk.po +Copyright: 2016 Dušan Kazik <prescott66@gmail.com> +License: GPL-2+ + +Files: po/ru.po +Copyright: 2015-2016 Ivan Komaritsyn <vantu5z@mail.ru> +License: GPL-2+ + +Files: po/pt_BR.po +Copyright: 2012 Carlos Alberto Junior Spohr Poletto <carlos.spohr@gmail.com> + 2016 Fábio Nogueira <fnogueira@gnome.org> +License: GPL-2+ + +Files: po/pt.po +Copyright: 2012 Carlos Alberto Junior Spohr Poletto <carlos.spohr@gmail.com> +License: GPL-2+ + +Files: po/pl.po +Copyright: 2012-2016 Piotr Sokół <psokol.l10n@gmail.com> +License: GPL-2+ + +Files: po/nl.po +Copyright: 2014 Michele <micxgx@gmail.com> + 2014 Morris Jobke <hey@morrisjobke.de> + 2012 Jonatan Zeidler <jonatan_zeidler@hotmail.de> + 2012 jonius <jonatan_zeidler@gmx.de> + 2015 Heimen Stoffels <vistausss@outlook.com> +License: GPL-2+ + +Files: po/ja.po +Copyright: 2013 Jiro Matsuzawa <jmatsuzawa@gnome.org> + 2014-2016 Debonne Hooties <debonne.hooties@gmail.com> +License: GPL-2+ + +Files: po/es.po +Copyright: 2015 Hugo Olabera <hugolabe@gmail.com> +License: GPL-2+ + +Files: po/de.po +Copyright: 2014 Michele <micxgx@gmail.com> + 2014 Morris Jobke <hey@morrisjobke.de> + 2012 Jonatan Zeidler <jonatan_zeidler@hotmail.de> + 2012 jonius <jonatan_zeidler@gmx.de> +License: GPL-2+ + +Files: po/cs.po +Copyright: 2015 Jiří Doubravský <jiri.doubravsky@gmail.com> +License: GPL-2+ + +Files: debian/* +Copyright: 2016-2017 Jonathan Carter <jcater@linux.com> +License: GPL-2+ + +License: GPL-2+ + This package 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 package 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, see <https://www.gnu.org/licenses/> + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". diff --git a/package/debian/docs b/package/debian/docs new file mode 100644 index 0000000..b43bf86 --- /dev/null +++ b/package/debian/docs @@ -0,0 +1 @@ +README.md diff --git a/package/debian/install b/package/debian/install new file mode 100644 index 0000000..e1ef024 --- /dev/null +++ b/package/debian/install @@ -0,0 +1 @@ +schemas/org.gnome.shell.extensions.dash-to-dock.gschema.xml usr/share/glib-2.0/schemas diff --git a/package/debian/patches/makefile-clean-translations b/package/debian/patches/makefile-clean-translations new file mode 100644 index 0000000..9515ed1 --- /dev/null +++ b/package/debian/patches/makefile-clean-translations @@ -0,0 +1,20 @@ +Description: Add translations to cleanup in makefile + Upstream makefile doesn not clean up translations. + Modified to fix this. + . + gnome-shell-extension-dashtodock (53-1) unstable; urgency=medium + . + * Initial release (Closes: 829185) +Author: Jonathan Carter <jcarter@linux.com> +Bug-Debian: https://bugs.debian.org/829185 + +--- gnome-shell-extension-dashtodock-53.orig/Makefile ++++ gnome-shell-extension-dashtodock-53/Makefile +@@ -24,6 +24,7 @@ all: extension + + clean: + rm -f ./schemas/gschemas.compiled ++ rm -f ./po/*.mo + + extension: ./schemas/gschemas.compiled $(MSGSRC:.po=.mo) + diff --git a/package/debian/patches/series b/package/debian/patches/series new file mode 100644 index 0000000..6b7b386 --- /dev/null +++ b/package/debian/patches/series @@ -0,0 +1 @@ +makefile-clean-translations diff --git a/package/debian/rules b/package/debian/rules new file mode 100755 index 0000000..0bda0b7 --- /dev/null +++ b/package/debian/rules @@ -0,0 +1,13 @@ +#!/usr/bin/make -f + +include /usr/share/dpkg/pkg-info.mk +BASEDIR=debian/gnome-shell-extension-dashtodock/usr/share/gnome-shell/extensions/dash-to-dock@micxgx.gmail.com + +%: + dh $@ + +override_dh_install: + dh_install + sed -i 's/"version": ""/"version": $(DEB_VERSION_UPSTREAM)/' $(BASEDIR)/metadata.json; + rm -f $(BASEDIR)/COPYING + rm -rf $(BASEDIR)/schemas diff --git a/package/debian/source/format b/package/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/package/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/package/debian/watch b/package/debian/watch new file mode 100644 index 0000000..58b82be --- /dev/null +++ b/package/debian/watch @@ -0,0 +1,3 @@ +version=4 +https://github.com/micheleg/dash-to-dock/tags .*/extensions.gnome.org-v?(\d\S*)\.tar\.gz + diff --git a/package/docking.js b/package/docking.js new file mode 100644 index 0000000..08707b4 --- /dev/null +++ b/package/docking.js @@ -0,0 +1,1909 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Clutter = imports.gi.Clutter; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const Lang = imports.lang; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; +const Params = imports.misc.params; + +const Main = imports.ui.main; +const Dash = imports.ui.dash; +const IconGrid = imports.ui.iconGrid; +const Overview = imports.ui.overview; +const OverviewControls = imports.ui.overviewControls; +const PointerWatcher = imports.ui.pointerWatcher; +const Tweener = imports.ui.tweener; +const Signals = imports.signals; +const ViewSelector = imports.ui.viewSelector; +const WorkspaceSwitcherPopup= imports.ui.workspaceSwitcherPopup; +const Layout = imports.ui.layout; +const LayoutManager = imports.ui.main.layoutManager; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const Utils = Me.imports.utils; +const Intellihide = Me.imports.intellihide; +const Theming = Me.imports.theming; +const MyDash = Me.imports.dash; + +const DOCK_DWELL_CHECK_INTERVAL = 100; + +const State = { + HIDDEN: 0, + SHOWING: 1, + SHOWN: 2, + HIDING: 3 +}; + +const scrollAction = { + DO_NOTHING: 0, + CYCLE_WINDOWS: 1, + SWITCH_WORKSPACE: 2 +}; + +/** + * A simple St.Widget with one child whose allocation takes into account the + * slide out of its child via the _slidex parameter ([0:1]). + * + * Required since I want to track the input region of this container which is + * based on its allocation even if the child overlows the parent actor. By doing + * this the region of the dash that is slideout is not steling anymore the input + * regions making the extesion usable when the primary monitor is the right one. + * + * The slidex parameter can be used to directly animate the sliding. The parent + * must have a WEST (SOUTH) anchor_point to achieve the sliding to the RIGHT (BOTTOM) + * side. + * + * It can't be an extended object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use the Shell.GenericContainer pattern. +*/ +const DashSlideContainer = new Lang.Class({ + Name: 'DashToDock.DashSlideContainer', + + _init: function(params) { + // Default local params + let localDefaults = { + side: St.Side.LEFT, + initialSlideValue: 1 + } + + let localParams = Params.parse(params, localDefaults, true); + + if (params) { + // Remove local params before passing the params to the parent + // constructor to avoid errors. + let prop; + for (prop in localDefaults) { + if ((prop in params)) + delete params[prop]; + } + } + + this.actor = new Shell.GenericContainer(params); + this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); + this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight)); + this.actor.connect('allocate', Lang.bind(this, this._allocate)); + + this.actor._delegate = this; + + this._child = null; + + // slide parameter: 1 = visible, 0 = hidden. + this._slidex = localParams.initialSlideValue; + this._side = localParams.side; + this._slideoutSize = 0; // minimum size when slided out + }, + + _allocate: function(actor, box, flags) { + if (this._child == null) + return; + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let [minChildWidth, minChildHeight, natChildWidth, natChildHeight] = + this._child.get_preferred_size(); + + let childWidth = natChildWidth; + let childHeight = natChildHeight; + + let childBox = new Clutter.ActorBox(); + + let slideoutSize = this._slideoutSize; + + if (this._side == St.Side.LEFT) { + childBox.x1 = (this._slidex -1) * (childWidth - slideoutSize); + childBox.x2 = slideoutSize + this._slidex*(childWidth - slideoutSize); + childBox.y1 = 0; + childBox.y2 = childBox.y1 + childHeight; + } + else if ((this._side == St.Side.RIGHT) || (this._side == St.Side.BOTTOM)) { + childBox.x1 = 0; + childBox.x2 = childWidth; + childBox.y1 = 0; + childBox.y2 = childBox.y1 + childHeight; + } + else if (this._side == St.Side.TOP) { + childBox.x1 = 0; + childBox.x2 = childWidth; + childBox.y1 = (this._slidex -1) * (childHeight - slideoutSize); + childBox.y2 = slideoutSize + this._slidex * (childHeight - slideoutSize); + } + + this._child.allocate(childBox, flags); + this._child.set_clip(-childBox.x1, -childBox.y1, + -childBox.x1+availWidth, -childBox.y1 + availHeight); + }, + + /** + * Just the child width but taking into account the slided out part + */ + _getPreferredWidth: function(actor, forHeight, alloc) { + let [minWidth, natWidth] = this._child.get_preferred_width(forHeight); + if ((this._side == St.Side.LEFT) || (this._side == St.Side.RIGHT)) { + minWidth = (minWidth - this._slideoutSize) * this._slidex + this._slideoutSize; + natWidth = (natWidth - this._slideoutSize) * this._slidex + this._slideoutSize; + } + + alloc.min_size = minWidth; + alloc.natural_size = natWidth; + }, + + /** + * Just the child height but taking into account the slided out part + */ + _getPreferredHeight: function(actor, forWidth, alloc) { + let [minHeight, natHeight] = this._child.get_preferred_height(forWidth); + if ((this._side == St.Side.TOP) || (this._side == St.Side.BOTTOM)) { + minHeight = (minHeight - this._slideoutSize) * this._slidex + this._slideoutSize; + natHeight = (natHeight - this._slideoutSize) * this._slidex + this._slideoutSize; + } + alloc.min_size = minHeight; + alloc.natural_size = natHeight; + }, + + /** + * I was expecting it to be a virtual function... stil I don't understand + * how things work. + */ + add_child: function(actor) { + // I'm supposed to have only on child + if (this._child !== null) + this.actor.remove_child(actor); + + this._child = actor; + this.actor.add_child(actor); + }, + + set slidex(value) { + this._slidex = value; + this._child.queue_relayout(); + }, + + get slidex() { + return this._slidex; + } +}); + +const DockedDash = new Lang.Class({ + Name: 'DashToDock.DockedDash', + + _init: function(settings, monitorIndex) { + this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL); + + // Load settings + this._settings = settings; + this._monitorIndex = monitorIndex; + // Connect global signals + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._bindSettingsChanges(); + + this._position = Utils.getPosition(settings); + this._isHorizontal = ((this._position == St.Side.TOP) || (this._position == St.Side.BOTTOM)); + + // Temporary ignore hover events linked to autohide for whatever reason + this._ignoreHover = false; + this._oldignoreHover = null; + // This variables are linked to the settings regardles of autohide or intellihide + // being temporary disable. Get set by _updateVisibilityMode; + this._autohideIsEnabled = null; + this._intellihideIsEnabled = null; + this._fixedIsEnabled = null; + + // Create intellihide object to monitor windows overlapping + this._intellihide = new Intellihide.Intellihide(this._settings, this._monitorIndex); + + // initialize dock state + this._dockState = State.HIDDEN; + + // Put dock on the required monitor + this._monitor = Main.layoutManager.monitors[this._monitorIndex]; + + // this store size and the position where the dash is shown; + // used by intellihide module to check window overlap. + this.staticBox = new Clutter.ActorBox(); + + // Initialize pressure barrier variables + this._canUsePressure = false; + this._pressureBarrier = null; + this._barrier = null; + this._removeBarrierTimeoutId = 0; + + // Initialize dwelling system variables + this._dockDwelling = false; + this._dockWatch = null; + this._dockDwellUserTime = 0; + this._dockDwellTimeoutId = 0 + + // Create a new dash object + this.dash = new MyDash.MyDash(this._settings, this._monitorIndex); + + if (!this._settings.get_boolean('show-show-apps-button')) + this.dash.hideShowAppsButton(); + + // Create the main actor and the containers for sliding in and out and + // centering, turn on track hover + + let positionStyleClass = ['top', 'right', 'bottom', 'left']; + // This is the centering actor + this.actor = new St.Bin({ + name: 'dashtodockContainer', + reactive: false, + style_class: positionStyleClass[this._position], + x_align: this._isHorizontal?St.Align.MIDDLE:St.Align.START, + y_align: this._isHorizontal?St.Align.START:St.Align.MIDDLE + }); + this.actor._delegate = this; + + // This is the sliding actor whose allocation is to be tracked for input regions + this._slider = new DashSlideContainer({ + side: this._position, + initialSlideValue: 0 + }); + + // This is the actor whose hover status us tracked for autohide + this._box = new St.BoxLayout({ + name: 'dashtodockBox', + reactive: true, + track_hover: true + }); + this._box.connect('notify::hover', Lang.bind(this, this._hoverChanged)); + + // Create and apply height constraint to the dash. It's controlled by this.actor height + this.constrainSize = new Clutter.BindConstraint({ + source: this.actor, + coordinate: this._isHorizontal?Clutter.BindCoordinate.WIDTH:Clutter.BindCoordinate.HEIGHT + }); + this.dash.actor.add_constraint(this.constrainSize); + + this._signalsHandler.add([ + Main.overview, + 'item-drag-begin', + Lang.bind(this, this._onDragStart) + ], [ + Main.overview, + 'item-drag-end', + Lang.bind(this, this._onDragEnd) + ], [ + Main.overview, + 'item-drag-cancelled', + Lang.bind(this, this._onDragEnd) + ], [ + // update when workarea changes, for instance if other extensions modify the struts + //(like moving th panel at the bottom) + global.screen, + 'workareas-changed', + Lang.bind(this, this._resetPosition) + ], [ + Main.overview, + 'showing', + Lang.bind(this, this._onOverviewShowing) + ], [ + Main.overview, + 'hiding', + Lang.bind(this, this._onOverviewHiding) + ], [ + // Hide on appview + Main.overview.viewSelector, + 'page-changed', + Lang.bind(this, this._pageChanged) + ], [ + Main.overview.viewSelector, + 'page-empty', + Lang.bind(this, this._onPageEmpty) + ], [ + // Ensure the ShowAppsButton status is kept in sync + Main.overview.viewSelector._showAppsButton, + 'notify::checked', + Lang.bind(this, this._syncShowAppsButtonToggled) + ], [ + global.screen, + 'in-fullscreen-changed', + Lang.bind(this, this._updateBarrier) + ], [ + // Monitor windows overlapping + this._intellihide, + 'status-changed', + Lang.bind(this, this._updateDashVisibility) + ], [ + // Keep dragged icon consistent in size with this dash + this.dash, + 'icon-size-changed', + Lang.bind(this, function() { + Main.overview.dashIconSize = this.dash.iconSize; + }) + ], [ + // This duplicate the similar signal which is in owerview.js. + // Being connected and thus executed later this effectively + // overwrite any attempt to use the size of the default dash + //which given the customization is usually much smaller. + // I can't easily disconnect the original signal + Main.overview._controls.dash, + 'icon-size-changed', + Lang.bind(this, function() { + Main.overview.dashIconSize = this.dash.iconSize; + }) + ]); + + this._injectionsHandler = new Utils.InjectionsHandler(); + this._themeManager = new Theming.ThemeManager(this._settings, this.actor, this.dash); + + // Since the actor is not a topLevel child and its parent is now not added to the Chrome, + // the allocation change of the parent container (slide in and slideout) doesn't trigger + // anymore an update of the input regions. Force the update manually. + this.actor.connect('notify::allocation', + Lang.bind(Main.layoutManager, Main.layoutManager._queueUpdateRegions)); + + this.dash._container.connect('allocation-changed', Lang.bind(this, this._updateStaticBox)); + this._slider.actor.connect(this._isHorizontal ? 'notify::x' : 'notify::y', Lang.bind(this, this._updateStaticBox)); + + // sync hover after a popupmenu is closed + this.dash.connect('menu-closed', Lang.bind(this, function() { + this._box.sync_hover(); + })); + + // Load optional features that need to be activated for one dock only + if (this._monitorIndex == this._settings.get_int('preferred-monitor')) + this._enableExtraFeatures(); + // Load optional features that need to be activated once per dock + this._optionalScrollWorkspaceSwitch(); + + // Delay operations that require the shell to be fully loaded and with + // user theme applied. + + this._paintId = this.actor.connect('paint', Lang.bind(this, this._initialize)); + + // Manage the which is used to reserve space in the overview for the dock + // Add and additional dashSpacer positioned according to the dash positioning. + // It gets restored on extension unload. + this._dashSpacer = new OverviewControls.DashSpacer(); + this._dashSpacer.setDashActor(this._box); + + if (this._position == St.Side.LEFT) + Main.overview._controls._group.insert_child_at_index(this._dashSpacer, this._rtl ? -1 : 0); // insert on first + else if (this._position == St.Side.RIGHT) + Main.overview._controls._group.insert_child_at_index(this._dashSpacer, this._rtl ? 0 : -1); // insert on last + else if (this._position == St.Side.TOP) + Main.overview._overview.insert_child_at_index(this._dashSpacer, 0); + else if (this._position == St.Side.BOTTOM) + Main.overview._overview.insert_child_at_index(this._dashSpacer, -1); + + // Add dash container actor and the container to the Chrome. + this.actor.set_child(this._slider.actor); + this._slider.add_child(this._box); + this._box.add_actor(this.dash.actor); + + // Add aligning container without tracking it for input region + Main.uiGroup.add_child(this.actor); + + if (this._settings.get_boolean('dock-fixed')) { + // Note: tracking the fullscreen directly on the slider actor causes some hiccups when fullscreening + // windows of certain applications + Main.layoutManager._trackActor(this.actor, {affectsInputRegion: false, trackFullscreen: true}); + Main.layoutManager._trackActor(this._slider.actor, {affectsStruts: true}); + } + else + Main.layoutManager._trackActor(this._slider.actor); + + // Set initial position + this._resetDepth(); + this._resetPosition(); + }, + + _initialize: function() { + if (this._paintId > 0) { + this.actor.disconnect(this._paintId); + this._paintId=0; + } + + this.dash.setIconSize(this._settings.get_int('dash-max-icon-size'), true); + + // Apply custome css class according to the settings + this._themeManager.updateCustomTheme(); + + // Since Gnome 3.8 dragging an app without having opened the overview before cause the attemp to + //animate a null target since some variables are not initialized when the viewSelector is created + if (Main.overview.viewSelector._activePage == null) + Main.overview.viewSelector._activePage = Main.overview.viewSelector._workspacesPage; + + this._updateVisibilityMode(); + + // In case we are already inside the overview when the extension is loaded, + // for instance on unlocking the screen if it was locked with the overview open. + if (Main.overview.visibleTarget) { + this._onOverviewShowing(); + this._pageChanged(); + } + + // Setup pressure barrier (GS38+ only) + this._updatePressureBarrier(); + this._updateBarrier(); + + // setup dwelling system if pressure barriers are not available + this._setupDockDwellIfNeeded(); + }, + + destroy: function() { + // Disconnect global signals + this._signalsHandler.destroy(); + // The dash, intellihide and themeManager have global signals as well internally + this.dash.destroy(); + this._intellihide.destroy(); + this._themeManager.destroy(); + + this._injectionsHandler.destroy(); + + // Destroy main clutter actor: this should be sufficient removing it and + // destroying all its children + this.actor.destroy(); + + // Remove barrier timeout + if (this._removeBarrierTimeoutId > 0) + Mainloop.source_remove(this._removeBarrierTimeoutId); + + // Remove existing barrier + this._removeBarrier(); + + // Remove pointer watcher + if (this._dockWatch) { + PointerWatcher.getPointerWatcher()._removeWatch(this._dockWatch); + this._dockWatch = null; + } + + // Remove the dashSpacer + this._dashSpacer.destroy(); + + // Restore legacyTray position + this._resetLegacyTray(); + + }, + + _bindSettingsChanges: function() { + this._signalsHandler.add([ + this._settings, + 'changed::scroll-action', + Lang.bind(this, function() { + this._optionalScrollWorkspaceSwitch(); + }) + ], [ + this._settings, + 'changed::dash-max-icon-size', + Lang.bind(this, function() { + this.dash.setIconSize(this._settings.get_int('dash-max-icon-size')); + }) + ], [ + this._settings, + 'changed::icon-size-fixed', + Lang.bind(this, function() { + this.dash.setIconSize(this._settings.get_int('dash-max-icon-size')); + }) + ], [ + this._settings, + 'changed::show-favorites', + Lang.bind(this, function() { + this.dash.resetAppIcons(); + }) + ], [ + this._settings, + 'changed::show-running', + Lang.bind(this, function() { + this.dash.resetAppIcons(); + }) + ], [ + this._settings, + 'changed::show-apps-at-top', + Lang.bind(this, function() { + this.dash.resetAppIcons(); + }) + ], [ + this._settings, + 'changed::show-show-apps-button', + Lang.bind(this, function() { + if (this._settings.get_boolean('show-show-apps-button')) + this.dash.showShowAppsButton(); + else + this.dash.hideShowAppsButton(); + }) + ], [ + this._settings, + 'changed::dock-fixed', + Lang.bind(this, function() { + if (this._settings.get_boolean('dock-fixed')) { + Main.layoutManager._untrackActor(this.actor); + Main.layoutManager._trackActor(this.actor, {affectsInputRegion: false, trackFullscreen: true}); + Main.layoutManager._untrackActor(this._slider.actor); + Main.layoutManager._trackActor(this._slider.actor, {affectsStruts: true}); + } else { + Main.layoutManager._untrackActor(this.actor); + Main.layoutManager._untrackActor(this._slider.actor); + Main.layoutManager._trackActor(this._slider.actor); + } + + this._resetPosition(); + + // Add or remove barrier depending on if dock-fixed + this._updateBarrier(); + + this._updateVisibilityMode(); + }) + ], [ + this._settings, + 'changed::intellihide', + Lang.bind(this, this._updateVisibilityMode) + ], [ + this._settings, + 'changed::intellihide-mode', + Lang.bind(this, function() { + this._intellihide.forceUpdate(); + }) + ], [ + this._settings, + 'changed::autohide', + Lang.bind(this, function() { + this._updateVisibilityMode(); + this._updateBarrier(); + }) + ], [ + this._settings, + 'changed::autohide-in-fullscreen', + Lang.bind(this, this._updateBarrier) + ], + [ + this._settings, + 'changed::extend-height', + Lang.bind(this, this._resetPosition) + ], [ + this._settings, + 'changed::height-fraction', + Lang.bind(this, this._resetPosition) + ], [ + this._settings, + 'changed::require-pressure-to-show', + Lang.bind(this, function() { + // Remove pointer watcher + if (this._dockWatch) { + PointerWatcher.getPointerWatcher()._removeWatch(this._dockWatch); + this._dockWatch = null; + } + this._setupDockDwellIfNeeded(); + this._updateBarrier(); + }) + ], [ + this._settings, + 'changed::pressure-threshold', + Lang.bind(this, function() { + this._updatePressureBarrier(); + this._updateBarrier(); + }) + ]); + + }, + + /** + * This is call when visibility settings change + */ + _updateVisibilityMode: function() { + if (this._settings.get_boolean('dock-fixed')) { + this._fixedIsEnabled = true; + this._autohideIsEnabled = false; + this._intellihideIsEnabled = false; + } + else { + this._fixedIsEnabled = false; + this._autohideIsEnabled = this._settings.get_boolean('autohide') + this._intellihideIsEnabled = this._settings.get_boolean('intellihide') + } + + if (this._intellihideIsEnabled) + this._intellihide.enable(); + else + this._intellihide.disable(); + + this._updateDashVisibility(); + }, + + /** + * Show/hide dash based on, in order of priority: + * overview visibility + * fixed mode + * intellihide + * autohide + * overview visibility + */ + _updateDashVisibility: function() { + if (Main.overview.visibleTarget) + return; + + if (this._fixedIsEnabled) { + this._removeAnimations(); + this._animateIn(this._settings.get_double('animation-time'), 0); + } + else if (this._intellihideIsEnabled) { + if (this._intellihide.getOverlapStatus()) { + this._ignoreHover = false; + // Do not hide if autohide is enabled and mouse is hover + if (!this._box.hover || !this._autohideIsEnabled) + this._animateOut(this._settings.get_double('animation-time'), 0); + } + else { + this._ignoreHover = true; + this._removeAnimations(); + this._animateIn(this._settings.get_double('animation-time'), 0); + } + } + else { + if (this._autohideIsEnabled) { + this._ignoreHover = false; + global.sync_pointer(); + + if (this._box.hover) + this._animateIn(this._settings.get_double('animation-time'), 0); + else + this._animateOut(this._settings.get_double('animation-time'), 0); + } + else + this._animateOut(this._settings.get_double('animation-time'), 0); + } + }, + + _onOverviewShowing: function() { + this._ignoreHover = true; + this._intellihide.disable(); + this._removeAnimations(); + this._animateIn(this._settings.get_double('animation-time'), 0); + }, + + _onOverviewHiding: function() { + this._ignoreHover = false; + this._intellihide.enable(); + this._updateDashVisibility(); + }, + + _hoverChanged: function() { + if (!this._ignoreHover) { + // Skip if dock is not in autohide mode for instance because it is shown + // by intellihide. + if (this._autohideIsEnabled) { + if (this._box.hover) + this._show(); + else + this._hide(); + } + } + }, + + _show: function() { + if ((this._dockState == State.HIDDEN) || (this._dockState == State.HIDING)) { + if (this._dockState == State.HIDING) + // suppress all potential queued hiding animations - i.e. added to Tweener but not started, + // always give priority to show + this._removeAnimations(); + + this.emit('showing'); + this._animateIn(this._settings.get_double('animation-time'), 0); + } + }, + + _hide: function() { + // If no hiding animation is running or queued + if ((this._dockState == State.SHOWN) || (this._dockState == State.SHOWING)) { + let delay; + + if (this._dockState == State.SHOWING) + //if a show already started, let it finish; queue hide without removing the show. + // to obtain this I increase the delay to avoid the overlap and interference + // between the animations + delay = this._settings.get_double('hide-delay') + this._settings.get_double('animation-time'); + else + delay = this._settings.get_double('hide-delay'); + + this.emit('hiding'); + this._animateOut(this._settings.get_double('animation-time'), delay); + } + }, + + _animateIn: function(time, delay) { + this._dockState = State.SHOWING; + + Tweener.addTween(this._slider, { + slidex: 1, + time: time, + delay: delay, + transition: 'easeOutQuad', + onComplete: Lang.bind(this, function() { + this._dockState = State.SHOWN; + // Remove barrier so that mouse pointer is released and can access monitors on other side of dock + // NOTE: Delay needed to keep mouse from moving past dock and re-hiding dock immediately. This + // gives users an opportunity to hover over the dock + if (this._removeBarrierTimeoutId > 0) + Mainloop.source_remove(this._removeBarrierTimeoutId); + this._removeBarrierTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, this._removeBarrier)); + }) + }); + }, + + _animateOut: function(time, delay) { + this._dockState = State.HIDING; + Tweener.addTween(this._slider, { + slidex: 0, + time: time, + delay: delay , + transition: 'easeOutQuad', + onComplete: Lang.bind(this, function() { + this._dockState = State.HIDDEN; + this._updateBarrier(); + }) + }); + }, + + /** + * Dwelling system based on the GNOME Shell 3.14 messageTray code. + */ + _setupDockDwellIfNeeded: function() { + // If we don't have extended barrier features, then we need + // to support the old tray dwelling mechanism. + if (!global.display.supports_extended_barriers() || !this._settings.get_boolean('require-pressure-to-show')) { + let pointerWatcher = PointerWatcher.getPointerWatcher(); + this._dockWatch = pointerWatcher.addWatch(DOCK_DWELL_CHECK_INTERVAL, Lang.bind(this, this._checkDockDwell)); + this._dockDwelling = false; + this._dockDwellUserTime = 0; + } + }, + + _checkDockDwell: function(x, y) { + + let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor.index) + let shouldDwell; + // Check for the correct screen edge, extending the sensitive area to the whole workarea, + // minus 1 px to avoid conflicting with other active corners. + if (this._position == St.Side.LEFT) + shouldDwell = (x == this._monitor.x) && (y > workArea.y) && (y < workArea.y + workArea.height); + else if (this._position == St.Side.RIGHT) + shouldDwell = (x == this._monitor.x + this._monitor.width - 1) && (y > workArea.y) && (y < workArea.y + workArea.height); + else if (this._position == St.Side.TOP) + shouldDwell = (y == this._monitor.y) && (x > workArea.x) && (x < workArea.x + workArea.width); + else if (this._position == St.Side.BOTTOM) + shouldDwell = (y == this._monitor.y + this._monitor.height - 1) && (x > workArea.x) && (x < workArea.x + workArea.width); + + if (shouldDwell) { + // We only set up dwell timeout when the user is not hovering over the dock + // already (!this._box.hover). + // The _dockDwelling variable is used so that we only try to + // fire off one dock dwell - if it fails (because, say, the user has the mouse down), + // we don't try again until the user moves the mouse up and down again. + if (!this._dockDwelling && !this._box.hover && (this._dockDwellTimeoutId == 0)) { + // Save the interaction timestamp so we can detect user input + let focusWindow = global.display.focus_window; + this._dockDwellUserTime = focusWindow ? focusWindow.user_time : 0; + + this._dockDwellTimeoutId = Mainloop.timeout_add(this._settings.get_double('show-delay') * 1000, + Lang.bind(this, this._dockDwellTimeout)); + GLib.Source.set_name_by_id(this._dockDwellTimeoutId, '[dash-to-dock] this._dockDwellTimeout'); + } + this._dockDwelling = true; + } + else { + this._cancelDockDwell(); + this._dockDwelling = false; + } + }, + + _cancelDockDwell: function() { + if (this._dockDwellTimeoutId != 0) { + Mainloop.source_remove(this._dockDwellTimeoutId); + this._dockDwellTimeoutId = 0; + } + }, + + _dockDwellTimeout: function() { + this._dockDwellTimeoutId = 0; + + if (!this._settings.get_boolean('autohide-in-fullscreen') && this._monitor.inFullscreen) + return GLib.SOURCE_REMOVE; + + // We don't want to open the tray when a modal dialog + // is up, so we check the modal count for that. When we are in the + // overview we have to take the overview's modal push into account + if (Main.modalCount > (Main.overview.visible ? 1 : 0)) + return GLib.SOURCE_REMOVE; + + // If the user interacted with the focus window since we started the tray + // dwell (by clicking or typing), don't activate the message tray + let focusWindow = global.display.focus_window; + let currentUserTime = focusWindow ? focusWindow.user_time : 0; + if (currentUserTime != this._dockDwellUserTime) + return GLib.SOURCE_REMOVE; + + // Reuse the pressure version function, the logic is the same + this._onPressureSensed(); + return GLib.SOURCE_REMOVE; + }, + + _updatePressureBarrier: function() { + this._canUsePressure = global.display.supports_extended_barriers(); + let pressureThreshold = this._settings.get_double('pressure-threshold'); + + // Remove existing pressure barrier + if (this._pressureBarrier) { + this._pressureBarrier.destroy(); + this._pressureBarrier = null; + } + + if (this._barrier) { + this._barrier.destroy(); + this._barrier = null; + } + + // Create new pressure barrier based on pressure threshold setting + if (this._canUsePressure) { + this._pressureBarrier = new Layout.PressureBarrier(pressureThreshold, this._settings.get_double('show-delay')*1000, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW); + this._pressureBarrier.connect('trigger', Lang.bind(this, function(barrier) { + if (!this._settings.get_boolean('autohide-in-fullscreen') && this._monitor.inFullscreen) + return; + this._onPressureSensed(); + })); + } + }, + + /** + * handler for mouse pressure sensed + */ + _onPressureSensed: function() { + if (Main.overview.visibleTarget) + return; + + // In case the mouse move away from the dock area before hovering it, in such case the leave event + // would never be triggered and the dock would stay visible forever. + let triggerTimeoutId = Mainloop.timeout_add(250, Lang.bind(this, function() { + triggerTimeoutId = 0; + + let [x, y, mods] = global.get_pointer(); + let shouldHide = true; + switch (this._position) { + case St.Side.LEFT: + if (x <= this.staticBox.x2 && + x >= this._monitor.x && + y >= this._monitor.y && + y <= this._monitor.y + this._monitor.height) { + shouldHide = false; + } + break; + case St.Side.RIGHT: + if (x >= this.staticBox.x1 && + x <= this._monitor.x + this._monitor.width && + y >= this._monitor.y && + y <= this._monitor.y + this._monitor.height) { + shouldHide = false; + } + break; + case St.Side.TOP: + if (x >= this._monitor.x && + x <= this._monitor.x + this._monitor.width && + y <= this.staticBox.y2 && + y >= this._monitor.y) { + shouldHide = false; + } + break; + case St.Side.BOTTOM: + if (x >= this._monitor.x && + x <= this._monitor.x + this._monitor.width && + y >= this.staticBox.y1 && + y <= this._monitor.y + this._monitor.height) { + shouldHide = false; + } + } + if (shouldHide) { + this._hoverChanged(); + return GLib.SOURCE_REMOVE; + } + else { + return GLib.SOURCE_CONTINUE; + } + + })); + + this._show(); + }, + + /** + * Remove pressure barrier + */ + _removeBarrier: function() { + if (this._barrier) { + if (this._pressureBarrier) + this._pressureBarrier.removeBarrier(this._barrier); + this._barrier.destroy(); + this._barrier = null; + } + this._removeBarrierTimeoutId = 0; + return false; + }, + + /** + * Update pressure barrier size + */ + _updateBarrier: function() { + // Remove existing barrier + this._removeBarrier(); + + // The barrier needs to be removed in fullscreen with autohide disabled, otherwise the mouse can + // get trapped on monitor. + if (this._monitor.inFullscreen && !this._settings.get_boolean('autohide-in-fullscreen')) + return + + // Manually reset pressure barrier + // This is necessary because we remove the pressure barrier when it is triggered to show the dock + if (this._pressureBarrier) { + this._pressureBarrier._reset(); + this._pressureBarrier._isTriggered = false; + } + + // Create new barrier + // The barrier extends to the whole workarea, minus 1 px to avoid conflicting with other active corners + // Note: dash in fixed position doesn't use pressure barrier. + if (this._canUsePressure && this._autohideIsEnabled && this._settings.get_boolean('require-pressure-to-show')) { + let x1, x2, y1, y2, direction; + let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor.index) + + if (this._position == St.Side.LEFT) { + x1 = this._monitor.x + 1; + x2 = x1; + y1 = workArea.y + 1; + y2 = workArea.y + workArea.height - 1; + direction = Meta.BarrierDirection.POSITIVE_X; + } + else if (this._position == St.Side.RIGHT) { + x1 = this._monitor.x + this._monitor.width - 1; + x2 = x1; + y1 = workArea.y + 1; + y2 = workArea.y + workArea.height - 1; + direction = Meta.BarrierDirection.NEGATIVE_X; + } + else if (this._position == St.Side.TOP) { + x1 = workArea.x + 1; + x2 = workArea.x + workArea.width - 1; + y1 = this._monitor.y; + y2 = y1; + direction = Meta.BarrierDirection.POSITIVE_Y; + } + else if (this._position == St.Side.BOTTOM) { + x1 = workArea.x + 1; + x2 = workArea.x + workArea.width - 1; + y1 = this._monitor.y + this._monitor.height; + y2 = y1; + direction = Meta.BarrierDirection.NEGATIVE_Y; + } + + this._barrier = new Meta.Barrier({ + display: global.display, + x1: x1, + x2: x2, + y1: y1, + y2: y2, + directions: direction + }); + if (this._pressureBarrier) + this._pressureBarrier.addBarrier(this._barrier); + } + }, + + _isPrimaryMonitor: function() { + return (this._monitorIndex == Main.layoutManager.primaryIndex); + }, + + _resetPosition: function() { + // Ensure variables linked to settings are updated. + this._updateVisibilityMode(); + + let extendHeight = this._settings.get_boolean('extend-height'); + + // Note: do not use the workarea coordinates in the direction on which the dock is placed, + // to avoid a loop [position change -> workArea change -> position change] with + // fixed dock. + let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitorIndex); + + // Reserve space for the dash on the overview + // if the dock is on the primary monitor + if (this._isPrimaryMonitor()) + this._dashSpacer.show(); + else + // No space is required in the overview of the dash + this._dashSpacer.hide(); + + let fraction = this._settings.get_double('height-fraction'); + + if (extendHeight) + fraction = 1; + else if ((fraction < 0) || (fraction > 1)) + fraction = 0.95; + + let anchor_point; + + if (this._isHorizontal) { + this.actor.width = Math.round( fraction * workArea.width); + + let pos_y; + if (this._position == St.Side.BOTTOM) { + pos_y = this._monitor.y + this._monitor.height; + anchor_point = Clutter.Gravity.SOUTH_WEST; + } + else { + pos_y = this._monitor.y; + anchor_point = Clutter.Gravity.NORTH_WEST; + } + + this.actor.move_anchor_point_from_gravity(anchor_point); + this.actor.x = workArea.x + Math.round((1 - fraction) / 2 * workArea.width); + this.actor.y = pos_y; + + if (extendHeight) { + this.dash._container.set_width(this.actor.width); + this.actor.add_style_class_name('extended'); + } + else { + this.dash._container.set_width(-1); + this.actor.remove_style_class_name('extended'); + } + } + else { + this.actor.height = Math.round(fraction * workArea.height); + + let pos_x; + if (this._position == St.Side.RIGHT) { + pos_x = this._monitor.x + this._monitor.width; + anchor_point = Clutter.Gravity.NORTH_EAST; + } + else { + pos_x = this._monitor.x; + anchor_point = Clutter.Gravity.NORTH_WEST; + } + + this.actor.move_anchor_point_from_gravity(anchor_point); + this.actor.x = pos_x; + this.actor.y = workArea.y + Math.round((1 - fraction) / 2 * workArea.height); + + if (extendHeight) { + this.dash._container.set_height(this.actor.height); + this.actor.add_style_class_name('extended'); + } + else { + this.dash._container.set_height(-1); + this.actor.remove_style_class_name('extended'); + } + } + + this._y0 = this.actor.y; + + this._adjustLegacyTray(); + }, + + // Set the dash at the correct depth in z + _resetDepth: function() { + // Keep the dash below the modalDialogGroup and the legacyTray + if (Main.legacyTray && Main.legacyTray.actor) + Main.layoutManager.uiGroup.set_child_below_sibling(this.actor, Main.legacyTray.actor); + else + Main.layoutManager.uiGroup.set_child_below_sibling(this.actor, Main.layoutManager.modalDialogGroup); + }, + + _adjustLegacyTray: function() { + let use_work_area = true; + + if (this._fixedIsEnabled && !this._settings.get_boolean('extend-height') + && this._isPrimaryMonitor() + && ((this._position == St.Side.BOTTOM) || (this._position == St.Side.LEFT))) + use_work_area = false; + + Main.legacyTray.actor.clear_constraints(); + let constraint = new Layout.MonitorConstraint({ + primary: true, + work_area: use_work_area + }); + Main.legacyTray.actor.add_constraint(constraint); + }, + + _resetLegacyTray: function() { + Main.legacyTray.actor.clear_constraints(); + let constraint = new Layout.MonitorConstraint({ + primary: true, + work_area: true + }); + Main.legacyTray.actor.add_constraint(constraint); + }, + + _updateStaticBox: function() { + this.staticBox.init_rect( + this.actor.x + this._slider.actor.x - (this._position == St.Side.RIGHT ? this._box.width : 0), + this.actor.y + this._slider.actor.y - (this._position == St.Side.BOTTOM ? this._box.height : 0), + this._box.width, + this._box.height + ); + + this._intellihide.updateTargetBox(this.staticBox); + }, + + _removeAnimations: function() { + Tweener.removeTweens(this._slider); + }, + + _onDragStart: function() { + // The dash need to be above the top_window_group, otherwise it doesn't + // accept dnd of app icons when not in overiew mode. + Main.layoutManager.uiGroup.set_child_above_sibling(this.actor, global.top_window_group); + this._oldignoreHover = this._ignoreHover; + this._ignoreHover = true; + this._animateIn(this._settings.get_double('animation-time'), 0); + }, + + _onDragEnd: function() { + // Restore drag default dash stack order + this._resetDepth(); + if (this._oldignoreHover !== null) + this._ignoreHover = this._oldignoreHover; + this._oldignoreHover = null; + this._box.sync_hover(); + if (Main.overview._shown) + this._pageChanged(); + }, + + _pageChanged: function() { + let activePage = Main.overview.viewSelector.getActivePage(); + let dashVisible = (activePage == ViewSelector.ViewPage.WINDOWS || + activePage == ViewSelector.ViewPage.APPS); + + if (dashVisible) + this._animateIn(this._settings.get_double('animation-time'), 0); + else + this._animateOut(this._settings.get_double('animation-time'), 0); + }, + + _onPageEmpty: function() { + /* The dash spacer is required only in the WINDOWS view if in the default position. + * The 'page-empty' signal is emitted in between a change of view, + * signalling the spacer can be added and removed without visible effect, + * as it's done for the upstream dashSpacer. + * + * Moreover, hiding the spacer ensure the appGrid allocaton is triggered. + * This matter as the appview spring animation is triggered by to first reallocaton of the appGrid, + * (See appDisplay.js, line 202 on GNOME Shell 3.14: + * this._grid.actor.connect('notify::allocation', ...) + * which in turn seems to be triggered by changes in the other actors in the overview. + * Normally, as far as I could understand, either the dashSpacer being hidden or the workspacesThumbnails + * sliding out would trigger the allocation. However, with no stock dash + * and no thumbnails, which happen if the user configured only 1 and static workspace, + * the animation out of icons is not played. + */ + + let activePage = Main.overview.viewSelector.getActivePage(); + this._dashSpacer.visible = (this._isHorizontal || activePage == ViewSelector.ViewPage.WINDOWS); + }, + + /** + * Show dock and give key focus to it + */ + _onAccessibilityFocus: function() { + this._box.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); + this._animateIn(this._settings.get_double('animation-time'), 0); + }, + + /** + * Keep ShowAppsButton status in sync with the overview status + */ + _syncShowAppsButtonToggled: function() { + let status = Main.overview.viewSelector._showAppsButton.checked; + if (this.dash.showAppsButton.checked !== status) + this.dash.showAppsButton.checked = status; + }, + + // Optional features to be enabled only for the main Dock + _enableExtraFeatures: function() { + // Restore dash accessibility + Main.ctrlAltTabManager.addGroup( + this.dash.actor, _('Dash'), 'user-bookmarks-symbolic', + {focusCallback: Lang.bind(this, this._onAccessibilityFocus)}); + }, + + /** + * Switch workspace by scrolling over the dock + */ + _optionalScrollWorkspaceSwitch: function() { + let label = 'optionalScrollWorkspaceSwitch'; + + function isEnabled() { + return this._settings.get_enum('scroll-action') === scrollAction.SWITCH_WORKSPACE; + } + + this._settings.connect('changed::scroll-action', Lang.bind(this, function() { + if (Lang.bind(this, isEnabled)()) + Lang.bind(this, enable)(); + else + Lang.bind(this, disable)(); + })); + + if (Lang.bind(this, isEnabled)()) + Lang.bind(this, enable)(); + + function enable() { + this._signalsHandler.removeWithLabel(label); + + this._signalsHandler.addWithLabel(label, [ + this._box, + 'scroll-event', + Lang.bind(this, onScrollEvent) + ]); + + this._optionalScrollWorkspaceSwitchDeadTimeId = 0; + } + + function disable() { + this._signalsHandler.removeWithLabel(label); + + if (this._optionalScrollWorkspaceSwitchDeadTimeId > 0) { + Mainloop.source_remove(this._optionalScrollWorkspaceSwitchDeadTimeId); + this._optionalScrollWorkspaceSwitchDeadTimeId = 0; + } + } + + // This was inspired to desktop-scroller@obsidien.github.com + function onScrollEvent(actor, event) { + // When in overview change workscape only in windows view + if (Main.overview.visible && Main.overview.viewSelector.getActivePage() !== ViewSelector.ViewPage.WINDOWS) + return false; + + let activeWs = global.screen.get_active_workspace(); + let direction = null; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + direction = Meta.MotionDirection.UP; + break; + case Clutter.ScrollDirection.DOWN: + direction = Meta.MotionDirection.DOWN; + break; + case Clutter.ScrollDirection.SMOOTH: + let [dx, dy] = event.get_scroll_delta(); + if (dy < 0) + direction = Meta.MotionDirection.UP; + else if (dy > 0) + direction = Meta.MotionDirection.DOWN; + break; + } + + if (direction !== null) { + // Prevent scroll events from triggering too many workspace switches + // by adding a 250ms deadtime between each scroll event. + // Usefull on laptops when using a touchpad. + + // During the deadtime do nothing + if (this._optionalScrollWorkspaceSwitchDeadTimeId > 0) + return false; + else + this._optionalScrollWorkspaceSwitchDeadTimeId = Mainloop.timeout_add(250, Lang.bind(this, function() { + this._optionalScrollWorkspaceSwitchDeadTimeId = 0; + })); + + let ws; + + ws = activeWs.get_neighbor(direction) + + if (Main.wm._workspaceSwitcherPopup == null) + Main.wm._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup(); + // Set the actor non reactive, so that it doesn't prevent the + // clicks events from reaching the dash actor. I can't see a reason + // why it should be reactive. + Main.wm._workspaceSwitcherPopup.actor.reactive = false; + Main.wm._workspaceSwitcherPopup.connect('destroy', function() { + Main.wm._workspaceSwitcherPopup = null; + }); + + // Do not show wokspaceSwithcer in overview + if (!Main.overview.visible) + Main.wm._workspaceSwitcherPopup.display(direction, ws.index()); + Main.wm.actionMoveWorkspace(ws); + + return true; + } + else + return false; + } + }, + + _activateApp: function(appIndex) { + let children = this.dash._box.get_children().filter(function(actor) { + return actor.child && + actor.child._delegate && + actor.child._delegate.app; + }); + + // Apps currently in the dash + let apps = children.map(function(actor) { + return actor.child._delegate; + }); + + // Activate with button = 1, i.e. same as left click + let button = 1; + if (appIndex < apps.length) + apps[appIndex].activate(button); + } + +}); + +Signals.addSignalMethods(DockedDash.prototype); + +/* + * Handle keybaord shortcuts + */ +const KeyboardShortcuts = new Lang.Class({ + + Name: 'DashToDock.KeyboardShortcuts', + + _numHotkeys: 10, + + _init: function(settings, allDocks){ + + this._settings = settings; + this._allDocks = allDocks; + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._hotKeysEnabled = false; + if (this._settings.get_boolean('hot-keys')) + this._enableHotKeys(); + + this._signalsHandler.add([ + this._settings, + 'changed::hot-keys', + Lang.bind(this, function() { + if (this._settings.get_boolean('hot-keys')) + Lang.bind(this, this._enableHotKeys)(); + else + Lang.bind(this, this._disableHotKeys)(); + }) + ]); + + this._optionalNumberOverlay(); + }, + + destroy: function (){ + // Remove keybindings + this._disableHotKeys(); + this._disableExtraShortcut(); + this._signalsHandler.destroy(); + }, + + _enableHotKeys: function() { + if (this._hotKeysEnabled) + return; + + // Setup keyboard bindings for dash elements + let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-', // Regular numbers + 'app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-']; // Key-pad numbers + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) { + let appNum = i; + Main.wm.addKeybinding(key + (i + 1), this._settings, + Meta.KeyBindingFlags.NONE, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, + Lang.bind(this, function() { + this._allDocks[0]._activateApp(appNum); + this._showOverlay(); + })); + } + }, this); + + this._hotKeysEnabled = true; + }, + + _disableHotKeys: function() { + if (!this._hotKeysEnabled) + return; + + let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-', // Regular numbers + 'app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-']; // Key-pad numbers + keys.forEach( function(key) { + for (let i = 0; i < this._numHotkeys; i++) + Main.wm.removeKeybinding(key + (i + 1)); + }, this); + + this._hotKeysEnabled = false; + }, + + _optionalNumberOverlay: function() { + this._shortcutIsSet = false; + // Enable extra shortcut if either 'overlay' or 'show-dock' are true + if (this._settings.get_boolean('hot-keys') && + (this._settings.get_boolean('hotkeys-overlay') || this._settings.get_boolean('hotkeys-show-dock'))) + this._enableExtraShortcut(); + + this._signalsHandler.add([ + this._settings, + 'changed::hot-keys', + Lang.bind(this, this._checkHotkeysOptions) + ], [ + this._settings, + 'changed::hotkeys-overlay', + Lang.bind(this, this._checkHotkeysOptions) + ], [ + this._settings, + 'changed::hotkeys-show-dock', + Lang.bind(this, this._checkHotkeysOptions) + ]); + }, + + _checkHotkeysOptions: function() { + if (this._settings.get_boolean('hot-keys') && + (this._settings.get_boolean('hotkeys-overlay') || this._settings.get_boolean('hotkeys-show-dock'))) + this._enableExtraShortcut(); + else + this._disableExtraShortcut(); + }, + + _enableExtraShortcut: function() { + if (!this._shortcutIsSet) { + Main.wm.addKeybinding('shortcut', this._settings, + Meta.KeyBindingFlags.NONE, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, + Lang.bind(this, this._showOverlay)); + this._shortcutIsSet = true; + } + }, + + _disableExtraShortcut: function() { + if (this._shortcutIsSet) { + Main.wm.removeKeybinding('shortcut'); + this._shortcutIsSet = false; + } + }, + + _showOverlay: function() { + for (let i = 0; i < this._allDocks.length; i++) { + let dock = this._allDocks[i]; + if (dock._settings.get_boolean('hotkeys-overlay')) + dock.dash.toggleNumberOverlay(true); + + // Restart the counting if the shortcut is pressed again + if (dock._numberOverlayTimeoutId) { + Mainloop.source_remove(dock._numberOverlayTimeoutId); + dock._numberOverlayTimeoutId = 0; + } + + // Hide the overlay/dock after the timeout + let timeout = dock._settings.get_double('shortcut-timeout') * 1000; + dock._numberOverlayTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(dock, function() { + dock._numberOverlayTimeoutId = 0; + dock.dash.toggleNumberOverlay(false); + // Hide the dock again if necessary + dock._updateDashVisibility(); + })); + + // Show the dock if it is hidden + if (dock._settings.get_boolean('hotkeys-show-dock')) { + let showDock = (dock._intellihideIsEnabled || dock._autohideIsEnabled); + if (showDock) + dock._show(); + } + } + } + +}); + +/** + * Isolate overview to open new windows for inactive apps + * Note: the future implementaion is not fully contained here. Some bits are around in other methods of other classes. + * This class just take care of enabling/disabling the option. + */ +const WorkspaceIsolation = new Lang.Class({ + + Name: 'DashToDock.WorkspaceIsolation', + + _init: function(settings, allDocks) { + + this._settings = settings; + this._allDocks = allDocks; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._injectionsHandler = new Utils.InjectionsHandler(); + + this._signalsHandler.add([ + this._settings, + 'changed::isolate-workspaces', + Lang.bind(this, function() { + this._allDocks.forEach(function(dock) { + dock.dash.resetAppIcons(); + }); + if (this._settings.get_boolean('isolate-workspaces') || + this._settings.get_boolean('isolate-monitors')) + Lang.bind(this, this._enable)(); + else + Lang.bind(this, this._disable)(); + }) + ],[ + this._settings, + 'changed::isolate-monitors', + Lang.bind(this, function() { + this._allDocks.forEach(function(dock) { + dock.dash.resetAppIcons(); + }); + if (this._settings.get_boolean('isolate-workspaces') || + this._settings.get_boolean('isolate-monitors')) + Lang.bind(this, this._enable)(); + else + Lang.bind(this, this._disable)(); + }) + ]); + + if (this._settings.get_boolean('isolate-workspaces') || + this._settings.get_boolean('isolate-monitors')) + this._enable(); + + }, + + _enable: function() { + + // ensure I never double-register/inject + // although it should never happen + this._disable(); + + this._allDocks.forEach(function(dock) { + this._signalsHandler.addWithLabel('isolation', [ + global.screen, + 'restacked', + Lang.bind(dock.dash, dock.dash._queueRedisplay) + ], [ + global.window_manager, + 'switch-workspace', + Lang.bind(dock.dash, dock.dash._queueRedisplay) + ]); + + // This last signal is only needed for monitor isolation, as windows + // might migrate from one monitor to another without triggering 'restacked' + if (this._settings.get_boolean('isolate-monitors')) + this._signalsHandler.addWithLabel('isolation', [ + global.screen, + 'window-entered-monitor', + Lang.bind(dock.dash, dock.dash._queueRedisplay) + ]); + + }, this); + + // here this is the Shell.App + function IsolatedOverview() { + // These lines take care of Nautilus for icons on Desktop + let windows = this.get_windows().filter(function(w) { + return w.get_workspace().index() == global.screen.get_active_workspace_index(); + }); + if (windows.length == 1) + if (windows[0].skip_taskbar) + return this.open_new_window(-1); + + if (this.is_on_workspace(global.screen.get_active_workspace())) + return Main.activateWindow(windows[0]); + return this.open_new_window(-1); + } + + this._injectionsHandler.addWithLabel('isolation', [ + Shell.App.prototype, + 'activate', + IsolatedOverview + ]); + }, + + _disable: function () { + this._signalsHandler.removeWithLabel('isolation'); + this._injectionsHandler.removeWithLabel('isolation'); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._injectionsHandler.destroy(); + } + +}); + + +const DockManager = new Lang.Class({ + Name: 'DashToDock.DockManager', + + _init: function() { + this._settings = Convenience.getSettings('org.gnome.shell.extensions.dash-to-dock'); + this._oldDash = Main.overview._dash; + /* Array of all the docks created */ + this._allDocks = []; + this._createDocks(); + + // status variable: true when the overview is shown through the dash + // applications button. + this._forcedOverview = false; + + // Connect relevant signals to the toggling function + this._bindSettingsChanges(); + }, + + _toggle: function() { + this._deleteDocks(); + this._createDocks(); + this.emit('toggled'); + }, + + _bindSettingsChanges: function() { + // Connect relevant signals to the toggling function + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._signalsHandler.add([ + global.screen, + 'monitors-changed', + Lang.bind(this, this._toggle) + ], [ + this._settings, + 'changed::multi-monitor', + Lang.bind(this, this._toggle) + ], [ + this._settings, + 'changed::preferred-monitor', + Lang.bind(this, this._toggle) + ], [ + this._settings, + 'changed::dock-position', + Lang.bind(this, this._toggle) + ], [ + this._settings, + 'changed::extend-height', + Lang.bind(this, this._adjustPanelCorners) + ], [ + this._settings, + 'changed::dock-fixed', + Lang.bind(this, this._adjustPanelCorners) + ]); + }, + + _createDocks: function() { + + this._preferredMonitorIndex = this._settings.get_int('preferred-monitor'); + // In case of multi-monitor, we consider the dock on the primary monitor to be the preferred (main) one + // regardless of the settings + // The dock goes on the primary monitor also if the settings are incosistent (e.g. desired monitor not connected). + if (this._settings.get_boolean('multi-monitor') || + this._preferredMonitorIndex < 0 || this._preferredMonitorIndex > Main.layoutManager.monitors.length - 1 + ) { + this._preferredMonitorIndex = Main.layoutManager.primaryIndex; + } else { + // Gdk and shell monitors numbering differ at least under wayland: + // While the primary monitor appears to be always index 0 in Gdk, + // the shell can assign a different number (Main.layoutManager.primaryMonitor) + // This ensure the indexing in the settings (Gdk) and in the shell are matched, + // i.e. that we start counting from the primaryMonitorIndex + this._preferredMonitorIndex = (Main.layoutManager.primaryIndex + this._preferredMonitorIndex) % Main.layoutManager.monitors.length ; + } + + // First we create the main Dock, to get the extra features to bind to this one + let dock = new DockedDash(this._settings, this._preferredMonitorIndex); + this._mainShowAppsButton = dock.dash.showAppsButton; + this._allDocks.push(dock); + + // connect app icon into the view selector + dock.dash.showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled)); + + // Make the necessary changes to Main.overview._dash + this._prepareMainDash(); + + // Adjust corners if necessary + this._adjustPanelCorners(); + + if (this._settings.get_boolean('multi-monitor')) { + let nMon = Main.layoutManager.monitors.length; + for (let iMon = 0; iMon < nMon; iMon++) { + if (iMon == this._preferredMonitorIndex) + continue; + let dock = new DockedDash(this._settings, iMon); + this._allDocks.push(dock); + // connect app icon into the view selector + dock.dash.showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled)); + } + } + + // Load optional features. We load *after* the docks are created, since + // we need to connect the signals to all dock instances. + this._workspaceIsolation = new WorkspaceIsolation(this._settings, this._allDocks); + this._keyboardShortcuts = new KeyboardShortcuts(this._settings, this._allDocks); + }, + + _prepareMainDash: function() { + // Pretend I'm the dash: meant to make appgrd swarm animation come from the + // right position of the appShowButton. + Main.overview._dash = this._allDocks[0].dash; + + // set stored icon size to the new dash + Main.overview.dashIconSize = this._allDocks[0].dash.iconSize; + + // Hide usual Dash + Main.overview._controls.dash.actor.hide(); + + // Also set dash width to 1, so it's almost not taken into account by code + // calculaing the reserved space in the overview. The reason to keep it at 1 is + // to allow its visibility change to trigger an allocaion of the appGrid which + // in turn is triggergin the appsIcon spring animation, required when no other + // actors has this effect, i.e in horizontal mode and without the workspaceThumnails + // 1 static workspace only) + Main.overview._controls.dash.actor.set_width(1); + }, + + _deleteDocks: function() { + // Remove extra features + this._workspaceIsolation.destroy(); + this._keyboardShortcuts.destroy(); + + // Delete all docks + let nDocks = this._allDocks.length; + for (let i = nDocks-1; i >= 0; i--) { + this._allDocks[i].destroy(); + this._allDocks.pop(); + } + }, + + _restoreDash: function() { + Main.overview._controls.dash.actor.show(); + Main.overview._controls.dash.actor.set_width(-1); //reset default dash size + // This force the recalculation of the icon size + Main.overview._controls.dash._maxHeight = -1; + + // reset stored icon size to the default dash + Main.overview.dashIconSize = Main.overview._controls.dash.iconSize; + + Main.overview._dash = this._oldDash; + }, + + _onShowAppsButtonToggled: function(button) { + // Sync the status of the default appButtons. Only if the two statuses are + // different, that means the user interacted with the extension provided + // application button, cutomize the behaviour. Otherwise the shell has changed the + // status (due to the _syncShowAppsButtonToggled function below) and it + // has already performed the desired action. + + let animate = this._settings.get_boolean('animate-show-apps'); + let selector = Main.overview.viewSelector; + + if (selector._showAppsButton.checked !== button.checked) { + // find visible view + let visibleView; + Main.overview.viewSelector.appDisplay._views.every(function(v, index) { + if (v.view.actor.visible) { + visibleView = index; + return false; + } + else + return true; + }); + + if (button.checked) { + // force spring animation triggering.By default the animation only + // runs if we are already inside the overview. + if (!Main.overview._shown) { + this._forcedOverview = true; + let view = Main.overview.viewSelector.appDisplay._views[visibleView].view; + let grid = view._grid; + if (animate) { + // Animate in the the appview, hide the appGrid to avoiud flashing + // Go to the appView before entering the overview, skipping the workspaces. + // Do this manually avoiding opacity in transitions so that the setting of the opacity + // to 0 doesn't get overwritten. + Main.overview.viewSelector._activePage.opacity = 0; + Main.overview.viewSelector._activePage.hide(); + Main.overview.viewSelector._activePage = Main.overview.viewSelector._appsPage; + Main.overview.viewSelector._activePage.show(); + grid.actor.opacity = 0; + + // The animation has to be trigered manually because the AppDisplay.animate + // method is waiting for an allocation not happening, as we skip the workspace view + // and the appgrid could already be allocated from previous shown. + // It has to be triggered after the overview is shown as wrong coordinates are obtained + // otherwise. + let overviewShownId = Main.overview.connect('shown', Lang.bind(this, function() { + Main.overview.disconnect(overviewShownId); + Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { + grid.actor.opacity = 255; + grid.animateSpring(IconGrid.AnimationDirection.IN, this._allDocks[0].dash.showAppsButton); + })); + })); + } + else { + Main.overview.viewSelector._activePage = Main.overview.viewSelector._appsPage; + Main.overview.viewSelector._activePage.show(); + grid.actor.opacity = 255; + } + + } + + // Finally show the overview + selector._showAppsButton.checked = true; + Main.overview.show(); + } + else { + if (this._forcedOverview) { + // force exiting overview if needed + + if (animate) { + // Manually trigger springout animation without activating the + // workspaceView to avoid the zoomout animation. Hide the appPage + // onComplete to avoid ugly flashing of original icons. + let view = Main.overview.viewSelector.appDisplay._views[visibleView].view; + let grid = view._grid; + view.animate(IconGrid.AnimationDirection.OUT, Lang.bind(this, function() { + Main.overview.viewSelector._appsPage.hide(); + Main.overview.hide(); + selector._showAppsButton.checked = false; + this._forcedOverview = false; + })); + } + else { + Main.overview.hide(); + this._forcedOverview = false; + } + } + else { + selector._showAppsButton.checked = false; + this._forcedOverview = false; + } + } + } + + // whenever the button is unactivated even if not by the user still reset the + // forcedOverview flag + if (button.checked == false) + this._forcedOverview = false; + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._deleteDocks(); + this._revertPanelCorners(); + this._restoreDash(); + }, + + /** + * Adjust Panel corners + */ + _adjustPanelCorners: function() { + let position = Utils.getPosition(this._settings); + let isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); + let extendHeight = this._settings.get_boolean('extend-height'); + let fixedIsEnabled = this._settings.get_boolean('dock-fixed'); + let dockOnPrimary = this._settings.get_boolean('multi-monitor') || + this._preferredMonitorIndex == Main.layoutManager.primaryIndex; + + if (!isHorizontal && dockOnPrimary && extendHeight && fixedIsEnabled) { + Main.panel._rightCorner.actor.hide(); + Main.panel._leftCorner.actor.hide(); + } + else + this._revertPanelCorners(); + }, + + _revertPanelCorners: function() { + Main.panel._leftCorner.actor.show(); + Main.panel._rightCorner.actor.show(); + } +}); +Signals.addSignalMethods(DockManager.prototype); diff --git a/package/extension.js b/package/extension.js new file mode 100644 index 0000000..86ef700 --- /dev/null +++ b/package/extension.js @@ -0,0 +1,21 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Docking = Me.imports.docking; +const Convenience = Me.imports.convenience; + +let dockManager; + +function init() { + Convenience.initTranslations('dashtodock'); +} + +function enable() { + dockManager = new Docking.DockManager(); +} + +function disable() { + dockManager.destroy(); + + dockManager=null; +} diff --git a/package/intellihide.js b/package/intellihide.js new file mode 100644 index 0000000..0d9fabd --- /dev/null +++ b/package/intellihide.js @@ -0,0 +1,323 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const GLib = imports.gi.GLib; +const Lang = imports.lang; +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 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; + */ +const Intellihide = new Lang.Class({ + Name: 'DashToDock.Intellihide', + + _init: function(settings, monitorIndex) { + // Load settings + this._settings = 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', + Lang.bind(this, this._windowCreated) + ], [ + // triggered for instance when the window list order changes, + // included when the workspace is switched + global.screen, + 'restacked', + Lang.bind(this, this._checkOverlap) + ], [ + // 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', + Lang.bind(this, this._checkOverlap) + ], [ + // update wne monitor changes, for instance in multimonitor when monitor are attached + global.screen, + 'monitors-changed', + Lang.bind(this, this._checkOverlap ) + ]); + }, + + destroy: function() { + // Disconnect global signals + this._signalsHandler.destroy(); + + // Remove residual windows signals + this.disable(); + }, + + enable: function() { + this._isEnabled = true; + this._status = OverlapStatus.UNDEFINED; + global.get_window_actors().forEach(function(wa) { + this._addWindowSignals(wa); + }, this); + this._doCheckOverlap(); + }, + + disable: function() { + 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: function(display, metaWindow) { + this._addWindowSignals(metaWindow.get_compositor_private()); + }, + + _addWindowSignals: function(wa) { + if (!this._handledWindow(wa)) + return; + let signalId = wa.connect('allocation-changed', Lang.bind(this, this._checkOverlap, wa.get_meta_window())); + this._trackedWindows.set(wa, signalId); + wa.connect('destroy', Lang.bind(this, this._removeWindowSignals)); + }, + + _removeWindowSignals: function(wa) { + if (this._trackedWindows.get(wa)) { + wa.disconnect(this._trackedWindows.get(wa)); + this._trackedWindows.delete(wa); + } + + }, + + updateTargetBox: function(box) { + this._targetBox = box; + this._checkOverlap(); + }, + + forceUpdate: function() { + this._status = OverlapStatus.UNDEFINED; + this._doCheckOverlap(); + }, + + getOverlapStatus: function() { + return (this._status == OverlapStatus.TRUE); + }, + + _checkOverlap: function() { + 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, Lang.bind(this, function() { + this._doCheckOverlap(); + if (this._checkOverlapTimeoutContinue) { + this._checkOverlapTimeoutContinue = false; + return GLib.SOURCE_CONTINUE; + } else { + this._checkOverlapTimeoutId = 0; + return GLib.SOURCE_REMOVE; + } + })); + }, + + _doCheckOverlap: function() { + + 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: function(wa) { + let meta_win = wa.get_meta_window(); + if (!this._handledWindow(wa)) + return false; + + let currentWorkspace = global.screen.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 (this._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: function(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); diff --git a/package/media/logo.svg b/package/media/logo.svg new file mode 100644 index 0000000..eebd0b1 --- /dev/null +++ b/package/media/logo.svg @@ -0,0 +1,528 @@ +<?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> diff --git a/package/media/screenshot.jpg b/package/media/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1707cce7f457bab069efbadcb32a2e5b51c7d17e GIT binary patch literal 148723 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 M*^wCi(*FNV0DVY+v;Y7A literal 0 HcmV?d00001 diff --git a/package/metadata.json b/package/metadata.json new file mode 100644 index 0000000..0ab15c6 --- /dev/null +++ b/package/metadata.json @@ -0,0 +1,10 @@ +{ +"shell-version": ["3.18", "3.20", "3.22", "3.24"], +"uuid": "dash-to-dock@micxgx.gmail.com", +"name": "Dash to Dock", +"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.", +"original-author": "micxgx@gmail.com", +"url": "https://micheleg.github.io/dash-to-dock/", +"gettext-domain": "dashtodock", +"version": -1 +} diff --git a/package/po/ar.po b/package/po/ar.po new file mode 100644 index 0000000..1ef4b36 --- /dev/null +++ b/package/po/ar.po @@ -0,0 +1,554 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2015-04-18 18:01+0100\n" +"Last-Translator: Jean-Baptiste Le Cz <jb.lecoz@gmail.com>\n" +"Language-Team: Faissal Chamekh <chamfay@gmail.com>\n" +"Language: ar_DZ\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Generator: Poedit 1.7.5\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "الشاشة الرئيسية" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "الشاشة الثانوية" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "يمين" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "يسار" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "تخصيص الإخفاء التلقائي" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "العودة للافتراضي" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "أظهر التطبيقات قيد التشغيل" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "خصّص الإعتام" + +#: prefs.js:514 +#, fuzzy +msgid "Customize running indicators" +msgstr "أظهر التطبيقات قيد التشغيل" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "" + +#: Settings.ui.h:1 +#, fuzzy +msgid "Customize indicator style" +msgstr "خصّص الإعتام" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "أظهر المرساة فوق" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "زمن الاختفاء (ثا)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "حدث Shift+Click" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "صغّر النافذة" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "صغّر النافذة" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "شغّل نسخة جديدة" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "التبديل بين النوافذ" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "حدث النقر" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "حدث Shift+Click" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "أظهر المرساة فوق" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "الشاشة الثانوية" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "الموضع على الشاشة" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "أسفل" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "أعلى" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "إخفاء المرساة عندما تحجب نافذة التطبيق الحالي. تخصيصات أكثر متوفرة." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "إخفاء تلقائي ذكي" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "حدّ حجم المرساة" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "نمط الشريط: تمديد إلى حواف الشاشة" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "حدّ حجم الأيقونة" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "حجم أيقونات ثابت: استعمل التمرير لكشف أيقونات أخرى" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "الموضع والحجم" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "أظهر التطبيقات المفضّلة" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "أظهر التطبيقات قيد التشغيل" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "أظهر أيقونة التطبيقات أولا" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "" + +#: Settings.ui.h:44 +#, fuzzy +msgid "Animate <i>Show Applications</i>." +msgstr "أظهر أيقونة التطبيقات أولا" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +#, fuzzy +msgid "Behaviour when clicking on the icon of a running application." +msgstr "التصرّف عن النقر على أيقونة التطبيق قيد التشغيل." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "حدث النقر" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "صغّر" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "صغّر النافذة" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "التصرّف عن النقر على أيقونة التطبيق قيد التشغيل." + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "حدث النقر" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "لا تفعل شيئا" + +#: Settings.ui.h:55 +#, fuzzy +msgid "Switch workspace" +msgstr "تبديل مساحة عمل واحدة في نفس الوقت" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "السلوك" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "استعمل السمة المضمّنة" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "تقليص المرساة" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "أظهر نقطة لكل نوافذة من التطبيق." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "أظهر مؤشرات عدد النوافذ" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "ضبط إعتام خلفية المرساة." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "خصّص الإعتام" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "العتمة" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "المظهر" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "الإصدار:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "أنشئ من طرف" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">هذا البرنامج يأتي بدون أي ضمانات.\n" +"لمزيد من المعلومات أنظر <a href=\"https://www.gnu.org/licenses/old-licenses/" +"gpl-2.0.html\">رخصة غنو العمومية، الإصدارة 2 فما فوق.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "حول" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "أظهر المرساة بتمرير الفأرة على حافة النافذة" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "إخفاء تلقائي" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "اضغط للإظهار: يتطلب ضغطا لإظهار المرساة" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "إظهار المرساة عندما لا تحجب نوافذ التطبيق." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "" + +#: Settings.ui.h:86 +#, fuzzy +msgid "Only maximized windows" +msgstr "صغّر النافذة" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "مدة التحريك (ثا)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "زمن الظهور (ثا)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "عتبة الضغط" + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "بدّل مساحة العمل عند التمرير فوق المرساة" + +#~ msgid "Main Settings" +#~ msgstr "الخصائص الأساسية" + +#~ msgid "Dock Position" +#~ msgstr "موضع المرساة" + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "المرساة ثابتة وظاهرة دائما" + +#~ msgid "Show delay [ms]" +#~ msgstr "تأخير الظهور (ميلي ثانية)" + +#~ msgid "Hide delay [ms]" +#~ msgstr "تأخير الإخفاء (ميلي ثانية)" + +#~ msgid "Application based intellihide" +#~ msgstr "إخفاء تلقائي على حسب التطبيق" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "أظهر المرساة في الشاشة الحالية (إن وُصلت)" + +#~ msgid "Primary (default)" +#~ msgstr "الأساسية (الافتراضي)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "الارتفاع الأقصى" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "تمديد (تجريبي)" + +#~ msgid "Maximum icon size" +#~ msgstr "الحجم الأقصى للأيقونة" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "ميزات إضافية" + +#~ msgid "Deadtime between each workspace switching [ms]" +#~ msgstr "الوقت بين تبديل كل مساحة عمل" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "مساحة بعرض 1 بكسل فقط قريبة من حافة الشاشة هي النشطة" + +#~ msgid "All the area of the dock is active" +#~ msgstr "جميع مناطق المرساة نشطة" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "خصّص حدث النقر على الفأرة" + +#~ msgid "Action on clicking on running app" +#~ msgstr "الحدث عن النقر على تطبيق قيد التشغيل" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "" +#~ "تصغير النافذة عند النقر مع shift (الضغط المزدوج بالنسبة لكل نوافذ التطبيق)" + +#~ msgid "Make message tray insensitive to mouse events" +#~ msgstr "اجعل رسالة التنبيه غير حساسة لأحداث الفأرة" + +#~ msgid "Appearence and Themes" +#~ msgstr "المظهر والسمة" + +#~ msgid "" +#~ "A customized theme is built in the extension. This is meant to work with " +#~ "the default Adwaita theme: the dash is shrunk to save space, its " +#~ "background transparency reduced, and custom indicators for the number of " +#~ "windows of each application are added." +#~ msgstr "" +#~ "تم تضمين سمة مخصّصة للإضافة، هذا يعني أنها تعمل مع السمة الافتراضية " +#~ "Adwaita: تقليص المرساة لكسب مساحة، إنقاص شفافيتها، كذلك تم إضافة مؤشرات " +#~ "لعدد نوافذ التطبيق." + +#~ msgid "" +#~ "Alternatively, for a better integration with custom themes, each " +#~ "customization can be applied indipendently" +#~ msgstr "بدلا من هذا، لتكاملية أفضل مع سمات مخصّصة، كل تخصيص يطبّق على حدة" + +#~ msgid "Shrink the dash size by reducing padding" +#~ msgstr "مساحة المرساة بإنقاص الحشو" + +#~ msgid "Only when in autohide" +#~ msgstr "Seulement en mode masquage intelligent" diff --git a/package/po/cs.po b/package/po/cs.po new file mode 100644 index 0000000..2132485 --- /dev/null +++ b/package/po/cs.po @@ -0,0 +1,460 @@ +# Translation for cs +# Copyright (C) 2014 Michele +# This file is distributed under the same license as the dash-to-dock package. +# Jiří Doubravský <jiri.doubravsky@gmail.com>, 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2015-05-21 21:17+0100\n" +"Last-Translator: Jiří Doubravský <jiri.doubravsky@gmail.com>\n" +"Language-Team: CZECH <jiri.doubravsky@gmail.com>\n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.7.5\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Primární obrazovka" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Sekundární obrazovka" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Vpravo" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Vlevo" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Přizpůsobení chytrého skrývání" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Vrátit výchozí nastavení" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Zobrazit spuštěné aplikace" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Volitelná průhlednost" + +#: prefs.js:514 +#, fuzzy +msgid "Customize running indicators" +msgstr "Zobrazit spuštěné aplikace" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Uhýbat oknům" + +#: Settings.ui.h:1 +#, fuzzy +msgid "Customize indicator style" +msgstr "Volitelná průhlednost" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Kde zobrazit dok" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Odklad skrývání (s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Pokud zvolíte minimalizaci, dvojté poklepání minimalizuje všechna okna " +"aplikace." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Shift+Klik akce" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "Minimalizovat okno" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimalizovat okno" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Otevřít nové okno" + +#: Settings.ui.h:17 +#, fuzzy +msgid "Cycle through windows" +msgstr "Přepínat mezi existujícími okny" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Akce klepnutím" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Shift+Klik akce" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Kde zobrazit dok" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Sekundární obrazovka" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Umístění na obrazovce" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Dole" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Nahoře" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Skývat dok automaticky kdykoliv by překážel otevřenému oknu aktivní " +"aplikace. Více možností k dispozici." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Chytré skrývání" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Maximální velikost doku" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Režim zobrazení: roztáhnout od kraje ke kraji" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Maximální velikost ikon" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Neměnná velikost ikon: rolováním je možné zobrazit další" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Umístění a velikost" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Zobrazit oblíbené aplikace" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Zobrazit spuštěné aplikace" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "<i>Zobrazit tlačítko všech aplikací</i> jako první" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Přesunout tlačítko přístupu ke všem aplikacím na začátek" + +#: Settings.ui.h:44 +#, fuzzy +msgid "Animate <i>Show Applications</i>." +msgstr "<i>Zobrazit tlačítko všech aplikací</i> jako první" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +#, fuzzy +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Akce klepnutím na ikonu běžící aplikace" + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Akce klepnutím" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimalizovat" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Minimalizovat okno" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Akce klepnutím na ikonu běžící aplikace" + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Akce klepnutím" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Nedělat nic" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Chování" + +#: Settings.ui.h:57 +#, fuzzy +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "Výchozí motiv doku nebo alternativní přizpůsobitelný motiv." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Použít výchozí motiv doku" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Prostorově méně náročné zobrazení, zmenšením volného místa kolem ikon" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Zmenšit panel" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Zobrazit pod ikonou tečku indikující každé otevřené okno aplikace." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Zobrazit indikátory počtu oken" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Nastavit průhlednost panelu." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Volitelná průhlednost" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Průhlednost" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Vzhled" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "verze:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "" +"Verplaatst de dash naar buiten het activiteitenoverzicht zodat het een dock " +"wordt" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Autor " + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Na tento program NEJSOU POSKYTOVÁNY ZÁRUKY.\n" +"Podrobněji viz <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0." +"html\">GNU General Public License, verze 2 nebo pozdější</a>.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "O tomto doplňku" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Zobrazit dok najetím myši ke kraji obrazovky." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Automatické skrývání" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Zatlač: k zobrazení doku je potřeba na kraj přitlačit" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Zobrazit dok, kdykoliv sám nepřekáží spuštěným aplikacím" + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Uhýbat oknům" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Uhýbat oknům" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "" + +#: Settings.ui.h:86 +#, fuzzy +msgid "Only maximized windows" +msgstr "Minimalizovat okno" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Délka efektů (s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Odklad zobrazení (s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Míra tlaku (px)" + +#, fuzzy +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Oblast po okrajích doku a tlačítko zobrazení všech aplikací jsou aktivní." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Přepínat pracovní plochy kolečkem myši nad dokem." + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Brát v úvahu jen okna aktivní aplikace" diff --git a/package/po/de.po b/package/po/de.po new file mode 100644 index 0000000..3844359 --- /dev/null +++ b/package/po/de.po @@ -0,0 +1,589 @@ +# Translation for de +# Copyright (C) 2014 Michele +# This file is distributed under the same license as the dash-to-dock package. +# Morris Jobke <hey@morrisjobke.de>, 2014. +# Jonatan Zeidler <jonatan_zeidler@hotmail.de>, 2012 +# jonius <jonatan_zeidler@gmx.de>, 2012 +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2015-10-29 14:54-0300\n" +"Last-Translator: Jonatan Zeidler <jonatan_zeidler@gmx.de>\n" +"Language-Team: jonius <jonatan_zeidler@gmx.de>\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.7.7\n" + +# Konjugation wegen Stellung im Satz +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Primärer Anzeige" + +# Konjugation wegen Stellung im Satz +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Sekundärer Anzeige" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Rechts" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Links" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Automatisches Ausblenden anpassen" + +# Verwende Übersetzung aus Nautilus +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Auf Vorgaben zurücksetzen" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Laufende Anwendungen anzeigen" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Transparenz anpassen" + +#: prefs.js:514 +#, fuzzy +msgid "Customize running indicators" +msgstr "Laufende Anwendungen anzeigen" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Alle Fenstern" + +#: Settings.ui.h:1 +#, fuzzy +msgid "Customize indicator style" +msgstr "Transparenz anpassen" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Dock anzeigen auf" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Ausblende-Verzögerung in s" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Wenn auf »Minimieren« eingestellt, können durch Doppelklick alle Fenster der " +"Anwendung gleichzeitig minimiert werden." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Wirkung bei Umschalttaste + Mausklick" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "Minimieren" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimieren" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Neues Fenster" + +# Vielleicht einen Tick besser als „umschalten“? +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Zwischen den Fenstern der Anwendung wechseln" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Wirkung bei Mausklick" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Wirkung bei Umschalttaste + Mausklick" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Dock anzeigen auf" + +# Konjugation wegen Stellung im Satz +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Sekundärer Anzeige" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Position auf Bildschirm" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Unten" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Oben" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Das Dock automatisch ausblenden, falls es ein Fenster der laufenden " +"Anwendung überlagert. Einstellungen können weiter verfeinert werden." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Automatisch ausblenden" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Maximale Dockgröße" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Panelmodus: bis zu Bildschirmkanten ausdehnen" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Maximale Icongröße" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Feste Icongröße: andere Icons durch Scrollen sichtbar machen" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Position und Größe" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Favoriten anzeigen" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Laufende Anwendungen anzeigen" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Falls deaktiviert, sind diese Einstellungen über das Optimierungswerkzeug " +"oder die Erweiterungsseite erreichbar." + +# Durchkopplung von Kompositum +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "Symbol <i>Anwendungen anzeigen</i> anzeigen" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Anwendungen-anzeigen-Button an den Anfang verschieben." + +# Durchkopplung von Kompositum +#: Settings.ui.h:44 +#, fuzzy +msgid "Animate <i>Show Applications</i>." +msgstr "Symbol <i>Anwendungen anzeigen</i> anzeigen" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Verhalten bei Mausklick auf das Icon einer laufenden Anwendung." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Wirkung bei Mausklick" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimieren" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Minimieren" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Verhalten bei Mausklick auf das Icon einer laufenden Anwendung." + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Wirkung bei Mausklick" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Nichts tun" + +#: Settings.ui.h:55 +#, fuzzy +msgid "Switch workspace" +msgstr "Nur eine Arbeitsfläche pro Scrollen weiterschalten" + +# Verwende Übersetzung aus Nautilus +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Verhalten" + +#: Settings.ui.h:57 +#, fuzzy +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Einige Anpassungen, durch die das Dock besser in das standardmäßige GNOME-" +"Thema eingepasst werden soll. Alternativ können im Folgenden besondere " +"Einstellungen vorgenommen werden." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Angepasstes Thema dieser Erweiterung nutzen" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Platz sparen, indem Innenabstand und Eckenradius verkleinert werden." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Dash verkleinern" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Für jedes Fenster einer Anwendung einen kleinen Indikator einblenden." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Indikatoren für Fensterzahl" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Die Hintergrundtransparenz des Docks einstellen." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Transparenz anpassen" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Transparenz" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Erscheinungsbild" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "Version: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Verwandelt das Dash aus dem Übersichtsmodus in ein Dock" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Erstellt von" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Internetseite" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Für dieses Programm besteht KEINERLEI GARANTIE.\n" +" Details finden Sie in der <a href=\"https://www.gnu.org/licenses/old-" +"licenses/gpl-2.0.html\">GNU General Public License, Version 2 oder später</" +"a>.</span>" + +# Verwende Übersetzung aus Nautilus +#: Settings.ui.h:77 +msgid "About" +msgstr "Info" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Dock einblenden, wenn Mauszeiger an Bildschirmkante anliegt." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Automatisch verstecken" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "" +"Anstoßen erforderlich: Dock nur einblenden, wenn Mauszeiger schnell gegen " +"Bildschirmkante stößt" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Dock einblenden, falls es keine Anwendungsfenster überlagert." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Fenstern ausweichen" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Alle Fenster" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Nur Anwendungsfenster mit Fokus" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Nur maximierte Fenster" + +# Nach DIN 1313 werden Einheiten nicht in Klammern gesetzt +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Animationsdauer in s" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0,000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Einblende-Verzögerung in s" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Stoßschwellwert" + +#, fuzzy +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Falls es zu viele Symbole auf dem Dock werden, dann bleibt nur " +#~ "<i>Anwendungen anzeigen</i> aktiv." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Arbeitsfläche durch Scrollen wechseln" + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Nur Fenster der fokussierten Anwendung einbeziehen" + +#~ msgid "Main Settings" +#~ msgstr "Grundeinstellungen" + +#~ msgid "Dock Position" +#~ msgstr "Dock-Position" + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "Das Dock hat eine feste Position und ist immer sichtbar" + +#~ msgid "Show delay [ms]" +#~ msgstr "Einblendeverzögerung [ms]" + +#~ msgid "Hide delay [ms]" +#~ msgstr "Ausblendeverzögerung [ms]" + +#~ msgid "Application based intellihide" +#~ msgstr "Anwendungsbasiertes intelligentes Verstecken" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "Zeige Dock auf folgendem Monitor (falls angeschlossen)" + +#~ msgid "Primary (default)" +#~ msgstr "Primäranzeige (Standard)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "Maximale Höhe" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "Komplette Höhe (experimentell und fehlerbehaftet)" + +#~ msgid "Maximum icon size" +#~ msgstr "Maximale Symbolgröße" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "Optionale Funktionen" + +#~ msgid "Deadtime between each workspace switching [ms]" +#~ msgstr "Stillstandszeit zwischen Arbeitsflächenwechsel [ms]" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "Nur einen 1 Pixel-breiten Bereich am Rand nutzen" + +#~ msgid "All the area of the dock is active" +#~ msgstr "Den gesamten Bereich des Docks nutzen" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "Aktion bei Mausklick anpassen" + +#~ msgid "Action on clicking on running app" +#~ msgstr "Aktion beim Klicken auf eine laufende Anwendung" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "" +#~ "Fenster mit Shift+Klick minimieren (Doppelklick für alle Fenster der " +#~ "Anwendung)" + +#~ msgid "Appearence and Themes" +#~ msgstr "Erscheinungsbild und Themen" + +#~ msgid "" +#~ "A customized theme is built in the extension. This is meant to work with " +#~ "the default Adwaita theme: the dash is shrunk to save space, its " +#~ "background transparency reduced, and custom indicators for the number of " +#~ "windows of each application are added." +#~ msgstr "" +#~ "Ein angepasstes Thema ist in dieser Erweiterung enthalten. Es ist für das " +#~ "Vorgabe-Adwaita-Thema gedacht: Das Dash ist schmaler, um Platz zu sparen, " +#~ "die Hintergrundtransparenz ist reduziert und für jede Anwendung wird ein " +#~ "Indikator für die Anzahl der Fenster eingefügt." + +#~ msgid "" +#~ "Alternatively, for a better integration with custom themes, each " +#~ "customization can be applied indipendently" +#~ msgstr "" +#~ "Alternativ können für eine bessere Integration Anpassungen vorgenommen " +#~ "werden" + +#~ msgid "Shrink the dash size by reducing padding" +#~ msgstr "Das Dash schmaler machen durch Verkleinern des Abstands zum Rand" + +#~ msgid "Apply custom theme (work only with the default Adwaita theme)" +#~ msgstr "" +#~ "Benutzerdefiniertes Theme verwenden (funktioniert nur mit dem Standard-" +#~ "Adwaita-Theme)" diff --git a/package/po/el.po b/package/po/el.po new file mode 100644 index 0000000..a20d295 --- /dev/null +++ b/package/po/el.po @@ -0,0 +1,442 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2017-05-17 15:40+0300\n" +"Last-Translator: \n" +"Language-Team: Δημήτριος-Ρωμανός Ησαΐας <dirosissaias@cosmotemail.gr>\n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Κυρίως οθόνη" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Δευτερεύουσα οθόνη " + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Δεξιά" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Αριστερά" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Εξατομίκευση έξυπνης απόκρυψης" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Επαναφορά στις προεπιλογές" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "Προβολή της μπάρας και της αρίθμησης εφαρμογών" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Προσαρμογή συμπεριφοράς μεσαίου κλικ" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Προσαρμογή δεικτών τρεχόντων εφαρμογών" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Όλα τα παράθυρα" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Προσαρμογή του στυλ του δείκτη" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Χρώμα" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Χρώμα περιγράμματος" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Πλάτος περιγράμματος" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Αρίθμηση εφαρμογών" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" +"Προσωρινή εμφάνιση της αρίθμησης των εφαρμογών πάνω από τα εικονίδια που " +"αντιστοιχεί στη συντόμευση πληκτρολογίου." + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "Προβολή της μπάρας αν είναι κρυμμένη" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" +"Αν η αυτόματη απόκρυψη είναι σε χρήση, η μπάρα θα εμφανίζεται σύντομα με την " +"χρήση της συντόμευσης." + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Συντόμευση για τις παραπάνω επιλογές" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Σύνταξη: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Καθυστέρηση απόκρυψης" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Όταν είναι ρυθμισμένο στην ελαχιστοποίηση, το διπλό κλικ ελαχιστοποιεί όλα " +"τα παράθυρα της εφαρμογής." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Λειτουργία του Shift+Click" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Ανύψωση παραθύρου" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Ελαχιστοποίηση παραθύρου" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Νέο παράθυρο" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Περιήγηση στα ανοικτά παράθυρα" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Έξοδος" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "Συμπεριφορά μεσαίου κλικ." + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Λειτουργία του μεσαίου κλικ" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "Συμπεριφορά Shift+Μεσαίο κλικ." + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Λειτουργία του Shift+Μεσαίο κλικ" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Εμφάνιση της μπάρας στην" + +#: Settings.ui.h:24 +msgid "Show on all monitors." +msgstr "Εμφάνιση σε όλες τις οθόνες." + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Θέση στην οθόνη" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Κάτω" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Πάνω" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Απόκρυψη της μπάρας όταν εμποδίζει ένα παράθυρο της τρέχουσας εφαρμογής. Πιο " +"εξειδικευμένες επιλογές είναι επίσης διαθέσιμες." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Έξυπνη απόκρυψη" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Περιορισμός μεγέθους μπάρας" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Λειτουργιά πάνελ: επέκταση της μπάρας ως τις άκρες της οθόνης" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Περιορισμός μεγέθους εικονιδίων" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "" +"Σταθερό μέγεθος εικονιδίων: κύλιση για την εμφάνιση περαιτέρω εικονιδίων" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Θέση και μέγεθος" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Εμφάνιση αγαπημένων εφαρμογών" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Εμφάνιση εκτελούμενων εφαρμογών" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Απομόνωση χώρων εργασίας." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Εμφάνιση προεπισκόπησης ανοικτών παραθύρων." + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Αν είναι απενεργοποιημένο, αυτές οι ρυθμίσεις είναι προσβάσιμες από το " +"εργαλείο μικρορυθμίσεων του GNOME ή την ιστοσελίδα των επεκτάσεων." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Εμφάνιση εικονιδίου <i>Εφαρμογών</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Μετακίνηση του πλήκτρου εφαρμογών στην αρχή της μπάρας." + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Ενεργοποίηση γραφικών κατά την <i>Εμφάνιση Εφαρμογών</i>." + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Εκκινητές" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Ενεργοποίηση του Super+(0-9) ως συντόμευση για την ενεργοποίηση εφαρμογών. " +"Μπορεί επίσης να χρησιμοποιηθεί με το Shift και το Ctrl." + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Χρήση συντομεύσεων πληκτρολογίου για την ενεργοποίηση εφαρμογών" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Συμπεριφορά κατά το κλικ σε εικονίδιο τρέχουσας εφαρμογής." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Συμπεριφορά κλικ" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Ελαχιστοποίηση" + +#: Settings.ui.h:51 +msgid "Minimize or overview" +msgstr "Ελαχιστοποίηση ή επισκόπηση" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Συμπεριφορά κατά την κύλιση σε εικονίδιο τρέχουσας εφαρμογής." + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Συμπεριφορά κύλισης" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Καμία δράση" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Αλλαγή χώρου εργασίας" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Συμπεριφορά" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Μερικές προσαρμογές στοχεύουν στο να ενοποιήσουν την μπάρα με το " +"προκαθορισμένο θέμα του GNOME. Εναλλακτικά, ειδικές επιλογές μπορούν να " +"ενεργοποιηθούν παρακάτω." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Χρήση ενσωματωμένου θέματος" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Εξοικονόμηση χώρου μειώνοντας τα κενά και τα περιθώρια." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Σμίκρυνση της μπάρας" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Εμφανίζει μία τελεία για κάθε παράθυρο της εφαρμογής." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Εμφάνιση μετρητή παραθύρων" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Ορισμός χρώματος φόντου της μπάρας." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Προσαρμογή του χρώματος της μπάρας" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Αλλαγή της αδιαφάνειας του φόντου της μπάρας." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Προσαρμογή αδιαφάνειας" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Αδιαφάνεια" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "Εξαναγκασμός ευθείας γωνίας\n" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Εμφάνιση" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "έκδοση: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "" +"Μετακινεί το ταμπλώ και εκτός της προεπισκόπησης μετατρέποντάς το σε μπάρα " +"εφαρμογών" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Δημιουργήθηκε από" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Ιστοσελίδα" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Αυτό πρόγραμμα παρέχεται χωρίς ΑΠΟΛΥΤΩΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ.\n" +"Για λεπτομέρειες δείτε την <a href=\"https://www.gnu.org/licenses/old-" +"licenses/gpl-2.0.html\">Γενική δημόσια άδεια GNU, έκδοση 2 ή νεότερη.</a> </" +"span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Περί" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Εμφάνιση της μπάρας όταν το ποντίκι πηγαίνει στην άκρη της οθόνης." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Αυτόματη απόκρυψη" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Πίεση για εμφάνιση: απαιτείται πίεση για την εμφάνιση της μπάρας" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Ενεργοποίηση σε λειτουργία πλήρους οθόνης" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Εμφάνιση της μπάρας όταν δεν εμποδίζει τα παράθυρά των εφαρμογών." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Αποφυγή παραθύρων" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Όλα τα παράθυρα" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Μόνο τα παράθυρα της εστιασμένης εφαρμογής" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Μόνο μεγιστοποιημένα παράθυρα" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Διάρκεια γραφικών" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Χρονικό όριο εμφάνισης" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Ελάχιστη πίεση" diff --git a/package/po/es.po b/package/po/es.po new file mode 100644 index 0000000..a678419 --- /dev/null +++ b/package/po/es.po @@ -0,0 +1,438 @@ +# Dash to Dock spanish translation. +# This file is distributed under the same license as the Dash to Dock package. +# Hugo Olabera <hugolabe@gmail.com>, 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-30 17:27-0400\n" +"PO-Revision-Date: 2017-02-17 12:11+0100\n" +"Last-Translator: Hugo Olabera <hugolabe@gmail.com>\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Pantalla principal" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Pantalla secundaria" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Derecha" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Izquierda" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Opciones de auto ocultado" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Restaurar" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "Mostrar el dock y el número de aplicación" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Personalizar comportamiento del botón central" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Personalizar indicadores de ejecución" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Todas las ventanas" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Personalizar estilo del indicador" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Color" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Color del borde" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Grosor del borde" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Número de aplicación" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" +"Al usar atajos, mostrar momentáneamente el número de aplicación sobre los " +"íconos." + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "Mostrar el dock si está oculto" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" +"Si auto-ocultar está activado, el dock aparecerá momentáneamente al usar el " +"atajo." + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Atajo para las opciones de arriba" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Sintaxis: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Tiempo de ocultación" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Cuando está seleccionado minimizar, doble click minimiza todas las ventanas " +"de la aplicación." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Acción de Mayúsculas+Click" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Elevar ventana" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimizar ventana" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Lanzar una nueva instancia" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Alternar entre ventanas" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Salir" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "Comportamiento del botón central" + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Acción del botón central" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportamiento para Mayúsculas+Botón-Central" + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Acción de Mayúsculas+Botón-Central" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Mostrar el dock en" + +#: Settings.ui.h:24 +msgid "Show on all monitors." +msgstr "Mostrar en todas las pantallas." + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Posición en pantalla" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Abajo" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Arriba" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Ocultar el dock cuando cubre una ventana de la aplicación activa. Otras " +"opciones disponibles." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Auto ocultado inteligente" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Tamaño máximo del dock" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Modo panel: extender hasta los bordes de la pantalla" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Tamaño máximo de los iconos" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Tamaño fijo de los iconos: desplazarse para mostrar otros" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Posición y tamaño" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Mostrar aplicaciones favoritas" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Mostrar aplicaciones en ejecución" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Aislar los espacios de trabajo." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Mostrar vista rápida de ventanas." + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Si está deshabilitado, estas opciones están accesibles desde gnome-tweak-" +"tool o desde el sitio web de extensiones." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Mostrar el icono <i>Mostrar aplicaciones</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Mover el botón de aplicaciones al comienzo del dock" + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Animar <i>Mostrar aplicaciones</i>" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Lanzadores" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Habilitar Súper+(0-9) como atajos para activar aplicaciones. También puede " +"ser usado junto con Mayús y Ctrl." + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Usar atajos de teclado para activar aplicaciones" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Comportamiento al pulsar el icono de una aplicación en ejecución" + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Acción del Click" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimizar" + +#: Settings.ui.h:51 +msgid "Minimize or overview" +msgstr "Minimizar o vista de actividades" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Comportamiento al usar scroll sobre el icono de una aplicación." + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Acción de scroll" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "No hacer nada" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Cambiar de espacio de trabajo." + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Comportamiento" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Utilizar el tema predeterminado de GNOME. Alternativamente, pueden elegirse " +"ciertas opciones más abajo." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Utilizar el tema por defecto" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Reducir los márgenes para ganar espacio" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Encoger el dock" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Mostrar un punto por cada ventana de la aplicación." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Mostrar contador de ventanas" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Escoger el color de fondo del dock." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Personalizar el color del dock" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Ajustar la opacidad del fondo del dock." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Personalizar opacidad" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Opacidad" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "Forzar esquinas rectas\n" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Apariencia" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "versión: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "" +"Mueve el panel fuera de la vista de actividades trasformándolo en un dock" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Creado por" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Sitio web" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Este programa viene SIN NINGUNA GARANTÍA.\n" +"Consulte la <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">Licencia Pública General de GNU, versión 2 o posterior</a> para obtener " +"más detalles.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Acerca de" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Mostrar el dock al mover el puntero al borde de la pantalla" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Auto ocultar" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Empujar para mostrar: requiere hacer presión para mostrar el dock" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Habilitar en modo pantalla completa" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Mostrar el dock cuando no cubra otras ventanas de aplicaciones" + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Auto ocultado inteligente" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Todas las ventanas" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Sólo las ventanas de la aplicación activa" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Sólo las ventanas maximizadas" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Duración de la animación" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Tiempo de aparición" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Nivel de presión" diff --git a/package/po/fr.po b/package/po/fr.po new file mode 100644 index 0000000..4982ab2 --- /dev/null +++ b/package/po/fr.po @@ -0,0 +1,438 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-30 17:27-0400\n" +"PO-Revision-Date: 2017-04-17 10:31+0200\n" +"Last-Translator: Thomas GONET <th.gonet@gmail.com>\n" +"Language-Team: Jean-Baptiste Le Cz <jb.lecoz@gmail.com>\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7.1\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Moniteur principal" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Moniteur secondaire" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Droite" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Gauche" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Personnalisation du masquage automatique" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Restaurer la configuration par défaut" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "Afficher le dock et le numéro d'application" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Personnaliser le comportement du clic milieu" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Régler les indicateurs de fenêtres" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Toutes les fenêtres" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Régler le style des indicateurs" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Couleur" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Couleur de la bordure" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Épaisseur de la bordure" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Numéro d'application" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" +"Afficher temporairement les numéros d'application sur les icônes, " +"correspondant au raccourci clavier." + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "Afficher le dock s'il est caché" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" +"Si le masquage automatique est actif, le dock apparaîtra temporairement lors " +"de l'utilisation du raccourci." + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Raccourci pour les options dessus" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Syntaxe: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Délai de masquage (s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Quand réglé sur Minimiser, double-cliquer minimise toutes les fenêtres de " +"l'application." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Action Shift+Clic" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Faire apparaître la fenêtre" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimiser la fenêtre" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Lancer une nouvelle fenêtre" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Cycler sur les fenêtres" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Quitter" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "Comportement pour le clic milieu" + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Action du clic milieu" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportement pour Shift+Clic milieu" + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Action de Shift+Clic milieu" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Afficher le dock sur le" + +#: Settings.ui.h:24 +msgid "Show on all monitors." +msgstr "Afficher sur tous les écrans." + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Position sur l'écran" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Bas" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Haut" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Cache le dock quand il gêne l'application principale. D'autres paramètres " +"plus spécifiques sont disponibles." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Masquage intelligent" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Taille maximum du dock" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Mode barre: étendre aux bords de l'écran" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Taille maximum des icônes" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Taille des icônes fixe: faire défiler pour voir les autres icônes" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Position et taille" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Afficher les applications favorites" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Afficher les applications en cours" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Isoler les espaces de travail." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Afficher des aperçus de fenêtres." + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Si désactivés, ces paramètres sont accessibles via gnome-tweak-tool ou le " +"site d'extension GNOME." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Afficher le raccourci <i>Afficher les Applications</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "" +"Placer le raccourci <i>Afficher les Applications</i> en première position" + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Animer le raccourci <i>Afficher les Applications</i>" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Lanceurs" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Activer Super+(0-9) comme raccourcis pour activer les applications. On peut " +"l'utiliser aussi avec Shift et Ctrl." + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Utiliser des raccourcis clavier pour activer les applications" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Comportement du clic sur l'icône d'une application ouverte." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Action du clic" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimiser la fenêtre" + +#: Settings.ui.h:51 +msgid "Minimize or overview" +msgstr "Minimiser ou lancer l'exposé" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Comportement lors du défilement sur l'icône d'une application." + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Action du défilement" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Ne rien faire" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Changer d'espace de travail" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Comportement" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Assortir le dock avec le thème par défaut. Sinon, vous pouvez personnaliser " +"quelques paramètres ci-dessous." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Utiliser le thème par défaut" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Réduire la taille des marges pour gagner de la place." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Réduire les marges" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Afficher un point pour chaque fenêtre ouverte de l'application." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Afficher un compteur de fenêtres" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Choisir la couleur de fond du dock." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Changer la couleur du dock" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Régler l'opacité en fond du dock." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Régler l'opacité du dock" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Opacité" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "Forcer des coins droits\n" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Apparence" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "Version: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Place le dash hors de l'aperçu des fenêtres, le transformant en dock" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Conçu par" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Site web" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Ce programme est distribué SANS AUCUNE GARANTIE.\n" +"Consultez la <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">Licence Générale Publique GNU version 2 ou plus récente</a> pour plus " +"d'informations.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "À propos" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Afficher le dock en survolant le bord de l'écran." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Masquage automatique" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Pousser pour Afficher: requiert une pression pour afficher le dock" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Activer en mode plein-écran" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Afficher le dock quand il ne gêne pas les fenêtres." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Masquage automatique intelligent" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Toutes les fenêtres" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Seulement la fenêtre de l'application active" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Seulement les fenêtres maximisées" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Durée de l'animation (s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Délai d'apparition (s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Seuil de pression" diff --git a/package/po/hu.po b/package/po/hu.po new file mode 100644 index 0000000..7c91908 --- /dev/null +++ b/package/po/hu.po @@ -0,0 +1,440 @@ +# Hungarian translation for dash-to-dock. +# Copyright (C) 2017 Free Software Foundation, Inc. +# This file is distributed under the same license as the dash-to-dock package. +# +# Balázs Úr <urbalazs@gmail.com>, 2017. +msgid "" +msgstr "" +"Project-Id-Version: dash-to-dock master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2017-04-10 22:02+0100\n" +"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n" +"Language-Team: Hungarian <openscope@googlegroups.com>\n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Elsődleges kijelző" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Másodlagos kijelző" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Jobb" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Bal" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Intelligens automatikus elrejtés személyre szabása" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Visszaállítás az alapértékekre" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "A dokk és az alkalmazás számainak megjelenítése" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Középső kattintás viselkedésének személyre szabása" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Futásjelzők személyre szabása" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Összes Ablak" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Jelző stílusának személyre szabása" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Szín" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Szegély színe" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Szegély szélessége" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Szám rátét" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" +"Az alkalmazás számainak átmeneti megjelenítése az ikonok fölött a " +"gyorsbillentyűnek megfelelően." + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "A dokk megjelenítése, ha el van rejtve" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" +"Az automatikus elrejtés használatakor a dokk meg fog jelenni egy rövid ideig " +"a gyorsbillentyű megnyomásakor." + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Gyorsbillentyűk a fenti beállításokhoz" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Szintaxis: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Elrejtési időkorlát (mp)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Ha minimalizálásra van állítva, akkor a dupla kattintás az alkalmazás összes " +"ablakát minimalizálja." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Shift + kattintás művelet" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Ablak előre hozása" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Ablak minimalizálása" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Új példány indítása" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Ablakok körbeléptetése" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Kilépés" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "A középső kattintás viselkedése." + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Középső kattintás művelet" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "A Shift + középső kattintás viselkedése." + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Shift + középső kattintás művelet" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "A dokk megjelenítése" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Másodlagos kijelző" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Elhelyezkedés a képernyőn" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Lent" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Fent" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"A dokk elrejtése, amikor az aktuális alkalmazás ablakát akadályozza. További " +"finombeállítások is elérhetők." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Intelligens automatikus elrejtés" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Dokk méretkorlátja" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Panel mód: kiterjesztés a képernyő széléig" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Ikon méretkorlátja" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Rögzített ikonméret: görgetés egyéb ikonok felfedéséhez" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Elhelyezkedés és méret" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Kedvenc alkalmazások megjelenítése" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Futó alkalmazások megjelenítése" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Munkaterületek elkülönítése." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Nyitott ablakok előnézeteinek megjelenítése." + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Ha le van tiltva, akkor ezek a beállítások elérhetők a GNOME finomhangoló " +"eszközből vagy a kiegészítők weboldaláról." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "<i>Alkalmazások</i> ikon megjelenítése" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Az alkalmazások gombjának áthelyezése a dokk elejére." + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "<i>Alkalmazások megjelenítése</i> animálása." + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Indítok" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Szuper + (0-9) engedélyezése gyorsbillentyűként az alkalmazások " +"aktiválásához. Használható a Shift és a Ctrl billentyűkkel együtt is." + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Gyorsbillentyűk használata az alkalmazások aktiválásához" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Viselkedés egy futó alkalmazás ikonjára való kattintáskor." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Kattintás művelet" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimalizálás" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Ablak minimalizálása" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Viselkedés egy alkalmazás ikonján való görgetéskor." + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Görgetési művelet" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Ne tegyen semmit" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Munkaterület váltása" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Viselkedés" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Néhány személyre szabás célja, hogy integrálja a dokkot az alapértelmezett " +"GNOME témába. Alternatív esetben bizonyos beállítások engedélyezhetők lent." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Beépített téma használata" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Helymegtakarítás a kitöltés és a szegély sugarának csökkentésével." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "A dash zsugorítása" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Egy pont megjelenítése az alkalmazás minden ablakánál." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Ablakszámlálók jelzőinek megjelenítése" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "A dash háttérszínének beállítása." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "A dash színének személyre szabása" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "A dash háttér átlátszatlanságának finomhangolása." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Átlátszatlanság személyre szabása" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Átlátszatlanság" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "Egyenes sarok kényszerítése\n" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Megjelenés" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "verzió: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Áthelyezi a dasht az áttekintőn kívülre egy dokká alakítva azt" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Létrehozta" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Weboldal" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Ehhez a programhoz SEMMILYEN GARANCIA NEM JÁR.\n" +"Nézze meg a <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html " +"\">GNU General Public License 2. vagy későbbi verzióját</a> a részletekért.</" +"span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Névjegy" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "A dokk megjelenítése a képernyő szélére történő egér rámutatással." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Automatikus elrejtés" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Nyomás a megjelenítéshez: nyomást igényel a dokk megjelenítéséhez" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Engedélyezés teljes képernyős módban" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "A dokk megjelenítése, amikor nem akadályozza az alkalmazás ablakait." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Ablakok kikerülése" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Összes ablak" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Csak a kijelölt alkalmazások ablakai" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Csak a maximalizált ablakok" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Animáció időtartama (mp)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0,000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Megjelenítési időkorlát (mp)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Nyomás küszöbszintje" diff --git a/package/po/it.po b/package/po/it.po new file mode 100644 index 0000000..6744588 --- /dev/null +++ b/package/po/it.po @@ -0,0 +1,453 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash-to-Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2017-06-04 12:59+0100\n" +"Last-Translator: Giuseppe Pignataro (Fastbyte01) <rogepix@gmail.com>\n" +"Language-Team: Italian <micxgx@gmail.com>\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.11\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Monitor primario" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Monitor secondario" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Destra" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Sinistra" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Personalizzazione nascondimento automatico intelligente" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Ripristina a predefinito" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "Mostra applicazioni in esecuzione" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Personalizza comportamento clic centrale" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Personalizza indicatori in esecuzione" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Tutte le finestre" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Personalizza stile indicatori" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Colore" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Colore bordo" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Larghezza bordo" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Indicatore numerico in sovraimpressione" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" +"Mostra brevemente il numero corrispondente alla scorciatoia sull'icona " +"dell'applicazione." + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "Mostra dock se nascosta" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" +"Con nascondimento automatico intelligente, la dock viene mostrata per un " +"istante quando la scorciatoia è attivata" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Scorciatoia" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Formato: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Timeout nascondimento (s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Quando impostati su minimizza, un doppio clic minimizza tutte le finestre " +"dell'applicazione." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Azione Shift+Clic" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Solleva finestra" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimizza finestra" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Lancia nuova istanza" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Passa attraverso le finestre" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Chiudi" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "Comportamento per Clic-centrale" + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Azione Clic-centrale" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportamento per Shift+Clic-centrale" + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Azione Shift+Clic-centrale" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Mostra dock sul" + +#: Settings.ui.h:24 +msgid "Show on all monitors." +msgstr "Mostra su tutti gli schermi" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Posizione sullo schermo" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Basso" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Alto" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Nasconde la dock quando questa ostruisce una finestra dell'applicazione " +"corrente. Sono disponibili maggiori impostazioni." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Autohide intelligente" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Limite dimensione dock" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Modalità pannello: si estende fino al bordo dello schermo" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Limite dimensione icone" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Dimensione icona fissa: scorri per rivelare le altre icone" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Posizione e dimensione" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Mostra applicazioni preferite" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Mostra applicazioni in esecuzione" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Isola spazi di lavoro." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Mostra anteprime delle finestre aperte" + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Se disabilitate, queste impostazioni sono accessibili da gnome-tweak-tool o " +"dal sito web delle estensioni." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Mostra icona <i>Applicazioni</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Sposta il pulsante delle applicazioni all'inizio della dock." + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Anima <i>Mostra Applicazioni</i>." + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Icone delle applicazoni" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Attiva Super+(0-9) come scorciatoie per attivare le applicazioni. Funziona " +"anche con Shift e Ctrl" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Usa scorciatoie da tastiera per attivare le applicazioni." + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "" +"Comportamento quando si fa clic sull'icona di una applicazione in esecuzione." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Azione clic" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimizza" + +#: Settings.ui.h:51 +msgid "Minimize or overview" +msgstr "Minimizza o mostra attività" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "" +"Comportamento quando si fa clic sull'icona di una applicazione in esecuzione." + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Azione clic" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Non fare nulla" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Cambia spazio di lavoro." + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Comportamento" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Poche personalizzazioni significative per integrare la dock con il tema di " +"default di GNOME. In alternativa, delle opzioni specifiche possono essere " +"abilitate qui sotto." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Usa teme integrato" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Salva spazio riducendo il margine e il raggio dei bordi." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Riduci la dash" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Mostra un punto per ogni finestra dell'applicazione." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Mostra indicatore numerico delle finestra" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Imposta il colore di sfondo della dash." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Personalizza il colore della dash" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Personalizza l'opacità dello sfondo della dash." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Personalizza opacità" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Opacità" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Aspetto" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "versione:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Sposta la dash fuori dalla panoramica trasformandola in una dock" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Creata da " + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Sito web" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Questo programma viene dato senza ASSOLUTAMENTE NESSUNA " +"GARANZIA.\n" +"Vedi la <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, versione 2 o successiva</a> per maggiori " +"dettagli.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Info su" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Mostra la dock passando con il mouse sul bordo dello schermo" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Nascondi automaticamente" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Premi per vedere: richiede una pressione per mostrare la dock" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Abilità in modalità a schermo intero" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "" +"Mostra la dock quando questa non ostruisce le finestre dell'applicazione." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Schive finestre" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Tutte le finestre" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Solo le finestre delle applicazione a fuoco" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Solo le finestre massimizzate" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Durata Animazione (s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Timeout rivelazione (s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Soglia pressione" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Con la dimensione fissa delle icone, solo il bordo della dock e l'icona " +#~ "<i> Mostra Applicazioni</i> sono attive." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Cambia spazio di lavoro scorrendo sulla dock" diff --git a/package/po/ja.po b/package/po/ja.po new file mode 100644 index 0000000..20acd17 --- /dev/null +++ b/package/po/ja.po @@ -0,0 +1,458 @@ +# Dash to Dock master ja.po +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the dash-to-dock package. +# Jiro Matsuzawa <jmatsuzawa@gnome.org>, 2013. +# Debonne Hooties <debonne.hooties@gmail.com>, 2014-2016. +# +msgid "" +msgstr "" +"Project-Id-Version: dash-to-dock master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2016-04-03 17:02+0900\n" +"Last-Translator: Debonne Hooties <debonne.hooties@gmail.com>\n" +"Language-Team: Safranjoepe (an unofficial team of Japanese) <>\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "プライマリーモニター" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "セカンダリーモニター" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "右" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "左" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "インテリジェント表示の設定" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "既定値にリセット" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "実行中アプリケーションの表示" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "表示スタイルの設定" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "インジケーターの表示設定" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "すべてのウィンドウが対象" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "表示スタイルの設定" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "ボディ色" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "縁取り色" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "縁取り幅" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "ドックを表示するモニター" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "非表示までのタイムアウト (秒)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"[ウィンドウの最小化] に設定したときは、アイコンをダブルクリックするとそのアプ" +"リケーションのウィンドウをすべて最小化します。" + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Shift+クリック時のアクション" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "ウィンドウの最小化" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "ウィンドウの最小化" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "新しいウィンドウを開く" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "ウィンドウの切り替え" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "クリック時のアクション" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Shift+クリック時のアクション" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "ドックを表示するモニター" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "セカンダリーモニター" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "表示位置" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "下" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "上" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"開いているウィンドウの邪魔にならないようドックの表示/非表示を自動的に切り替え" +"ます。より洗練された表示設定も可能です。" + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "インテリジェント表示" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "ドックサイズの上限" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "パネルモード(画面の端までドックを拡張)" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "アイコンサイズの上限" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "アイコンサイズの固定(隠れたアイコンはスクロールで表示)" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "位置とサイズ" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "お気に入りアプリケーションの表示" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "実行中アプリケーションの表示" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"オフにしたときは、gnome-tweak-tool または拡張機能ウェブサイトを経由してこの設" +"定ダイアログにアクセスします。" + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "[アプリケーションを表示する] アイコンの表示" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "ドックの先頭(最上段または左端)に表示" + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "アニメーションしながらアプリケーション一覧を表示" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "実行中アプリケーションのアイコンをクリックしたときの動作を指定します。" + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "クリック時のアクション" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "ウィンドウの最小化" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "ウィンドウの最小化" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "実行中アプリケーションのアイコンをクリックしたときの動作を指定します。" + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "クリック時のアクション" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "何もしない" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "動作" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"この設定がオンのときは、お使いのGNOMEテーマとの調和を図るためカスタマイズは無" +"効になります。オフのときには以下のカスタマイズが可能です。" + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "ビルトインテーマの使用" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "境界線の太さとパディングを減らして表示域を小さくします。" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Dashの縮小表示" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "アプリケーションウィンドウの数をドットで表示します。" + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "ウィンドウ数インジケーターの表示" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Dash背景の不透明度を調整します。" + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "不透明度の調整" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "不透明度" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "外観" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "バージョン: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Dashをドック化してアクティビティ画面以外でもDash操作を可能にします。" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "作者:" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "ウェブページ" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">このプログラムに<b>保証は一切ありません</b>。\n" +"詳しくは <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU一般公衆ライセンス(GPL)バージョン2</a> またはそれ以降のバージョンをご" +"覧ください。</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "情報" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "" +"ドックを表示したいとき、ポインターを画面端に移動するとドックが表示されます。" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "オンデマンド表示" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "" +"押し込んで表示(画面外にポインターを移動するようにマウスを動かして表示)" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "フルスクリーンモード時でも表示" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "" +"ドックを常に表示しますが、アプリケーションウィンドウと重なるときは表示しませ" +"ん。" + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "ウィンドウ重なり防止" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "すべてのウィンドウが対象" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "フォーカスされたアプリケーションのウィンドウが対象" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "最大化されたウィンドウが対象" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "アニメーション表示時間 (秒)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "表示までのタイムアウト (秒)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "押し込み量 (ピクセル)" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "アイコンサイズを固定しているときは、ドックの端または [アプリケーションを表" +#~ "示する] アイコン上でのスクロールのみが有効です。" + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "ドック上でスクロールしたらワークスペースを切り替える" diff --git a/package/po/nl.po b/package/po/nl.po new file mode 100644 index 0000000..8cedf7d --- /dev/null +++ b/package/po/nl.po @@ -0,0 +1,581 @@ +# Translation for de +# Copyright (C) 2014 Michele +# This file is distributed under the same license as the dash-to-dock package. +# Morris Jobke <hey@morrisjobke.de>, 2014. +# Jonatan Zeidler <jonatan_zeidler@hotmail.de>, 2012 +# jonius <jonatan_zeidler@gmx.de>, 2012 +# Heimen Stoffels <vistausss@outlook.com>, 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2015-05-14 14:26+0200\n" +"Last-Translator: Heimen Stoffels <vistausss@outlook.com>\n" +"Language-Team: Nederlands <vistausss@outlook.com>\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Gtranslator 2.91.7\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Eerste beeldscherm" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Tweede beeldscherm" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Rechts" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Links" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Voorkeuren voor intelligente verbergmodus" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Herstellen naar standaardwaarden" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Geopende applicaties weergeven" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Doorzichtigheid aanpassen" + +#: prefs.js:514 +#, fuzzy +msgid "Customize running indicators" +msgstr "Geopende applicaties weergeven" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Vensters ontwijken" + +#: Settings.ui.h:1 +#, fuzzy +msgid "Customize indicator style" +msgstr "Doorzichtigheid aanpassen" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Het dock weergeven op" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Verberginterval (s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Indien gekozen voor minimaliseren zal dubbelklikken alle vensters van de " +"huidige applicatie minimaliseren." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Shift+Klik-actie" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "Venster minimalisren" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Venster minimalisren" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Nieuw proces openen" + +#: Settings.ui.h:17 +#, fuzzy +msgid "Cycle through windows" +msgstr "Schakelen tussen vensters" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Klikactie" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Shift+Klik-actie" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Het dock weergeven op" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Tweede beeldscherm" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Positie op het scherm" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Onderaan" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Bovenaan" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Het dock verbergen wanneer het een venster van de huidige applicatie in de " +"weg zit. Er zijn gedetailleerde instellingen hiervoor beschikbaar." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Intelligente verbergmodus" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Maximale dockgrootte" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Paneelmodus: uitrekken tot aan de schermrand" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Maximale pictogramgrootte" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "" +"Vastgezette pictogramgrootte: scroll om meer pictogrammen weer te geven" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Positie en grootte" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Favoriete applicaties weergeven" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Geopende applicaties weergeven" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "<i>Applicaties weergeven</i>-pictogram aan het begin" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Verplaatst de applicaties-knop naar het begin van het dock." + +#: Settings.ui.h:44 +#, fuzzy +msgid "Animate <i>Show Applications</i>." +msgstr "<i>Applicaties weergeven</i>-pictogram aan het begin" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +#, fuzzy +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Gedrag van het klikken op het pictogram van een geopende applicatie." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Klikactie" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimaliseren" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Venster minimalisren" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Gedrag van het klikken op het pictogram van een geopende applicatie." + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Klikactie" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Niets doen" + +#: Settings.ui.h:55 +#, fuzzy +msgid "Switch workspace" +msgstr "Nur eine Arbeitsfläche pro Scrollen weiterschalten" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Gedrag" + +#: Settings.ui.h:57 +#, fuzzy +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Enkele aanpassingen die bedoeld zijn om het dock te integreren met het " +"standaard GNOME-thema. In plaats daarvan kunt specifieke opties hieronder " +"inschakelen." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Ingebouwd thema gebruiken" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Bespaar ruimte door de radius van de dikte en rand te verkleinen." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "De dash verkleinen" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Een stip weergeven voor elk venster van de applicatie." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Indicatoren van de vensterteller weergeven" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "De doorzichtigheid van de dash-achtergrond aanpassen." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Doorzichtigheid aanpassen" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Doorzichtigheid" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Uiterlijk" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "versie:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "" +"Verplaatst de dash naar buiten het activiteitenoverzicht zodat het een dock " +"wordt" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Gecreëerd door" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Dit programma wordt geleverd ZONDER ENIGE GARANTIE.\n" +"Bekijk de <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, versie 2 of nieuwer</a> voor details.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Over" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Het dock weergeven door de muiscursor op de schermrand te plaatsen" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Automatisch verbergen" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Weergeven middels druk: druk toepassen om het dock weer te geven" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Het dock weergeven wanneer het geen applicatievensters in de weg zit." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Vensters ontwijken" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Vensters ontwijken" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "" + +#: Settings.ui.h:86 +#, fuzzy +msgid "Only maximized windows" +msgstr "Venster minimalisren" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Animatieduur (s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Weergaveinterval (s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Drukwaarde (px)" + +#, fuzzy +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Het gebied nabij de schermrand en de <i>Applicaties weergeven</i>-knop " +#~ "zijn actief." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Van werkblad wisselen door te scrollen op het dock" + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Alleen vensters van de huidige gefocuste applicatie overwegen" + +#~ msgid "Main Settings" +#~ msgstr "Grundeinstellungen" + +#~ msgid "Dock Position" +#~ msgstr "Dock-Position" + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "Das Dock hat eine feste Position und ist immer sichtbar" + +#~ msgid "Show delay [ms]" +#~ msgstr "Einblendeverzögerung [ms]" + +#~ msgid "Hide delay [ms]" +#~ msgstr "Ausblendeverzögerung [ms]" + +#~ msgid "Application based intellihide" +#~ msgstr "Anwendungsbasiertes intelligentes Verstecken" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "Zeige Dock auf folgendem Monitor (falls angeschlossen)" + +#~ msgid "Primary (default)" +#~ msgstr "Primäranzeige (Standard)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "Maximale Höhe" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "Komplette Höhe (experimentell und fehlerbehaftet)" + +#~ msgid "Maximum icon size" +#~ msgstr "Maximale Symbolgröße" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "Optionale Funktionen" + +#~ msgid "Deadtime between each workspace switching [ms]" +#~ msgstr "Stillstandszeit zwischen Arbeitsflächenwechsel [ms]" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "Nur einen 1 Pixel-breiten Bereich am Rand nutzen" + +#~ msgid "All the area of the dock is active" +#~ msgstr "Den gesamten Bereich des Docks nutzen" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "Aktion bei Mausklick anpassen" + +#~ msgid "Action on clicking on running app" +#~ msgstr "Aktion beim Klicken auf eine laufende Anwendung" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "" +#~ "Fenster mit Shift+Klick minimieren (Doppelklick für alle Fenster der " +#~ "Anwendung)" + +#~ msgid "Appearence and Themes" +#~ msgstr "Erscheinungsbild und Themen" + +#~ msgid "" +#~ "A customized theme is built in the extension. This is meant to work with " +#~ "the default Adwaita theme: the dash is shrunk to save space, its " +#~ "background transparency reduced, and custom indicators for the number of " +#~ "windows of each application are added." +#~ msgstr "" +#~ "Ein angepasstes Thema ist in dieser Erweiterung enthalten. Es ist für das " +#~ "Vorgabe-Adwaita-Thema gedacht: Das Dash ist schmaler, um Platz zu sparen, " +#~ "die Hintergrundtransparenz ist reduziert und für jede Anwendung wird ein " +#~ "Indikator für die Anzahl der Fenster eingefügt." + +#~ msgid "" +#~ "Alternatively, for a better integration with custom themes, each " +#~ "customization can be applied indipendently" +#~ msgstr "" +#~ "Alternativ können für eine bessere Integration Anpassungen vorgenommen " +#~ "werden" + +#~ msgid "Shrink the dash size by reducing padding" +#~ msgstr "Das Dash schmaler machen durch Verkleinern des Abstands zum Rand" + +#~ msgid "Apply custom theme (work only with the default Adwaita theme)" +#~ msgstr "" +#~ "Benutzerdefiniertes Theme verwenden (funktioniert nur mit dem Standard-" +#~ "Adwaita-Theme)" diff --git a/package/po/pl.po b/package/po/pl.po new file mode 100644 index 0000000..39eae9d --- /dev/null +++ b/package/po/pl.po @@ -0,0 +1,564 @@ +# Polish translation for dash-to-dock GNOME Shell extension +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the dash-to-dock package. +# +# Piotr Sokół <psokol.l10n@gmail.com>, 2012, 2013, 2015, 2016, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: 55\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2017-04-09 09:44+0200\n" +"Last-Translator: Piotr Sokół <psokol.l10n@gmail.com>\n" +"Language-Team: polski <>\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bits\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Podstawowy" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Drugorzędny" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Prawo" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Lewo" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Dostosowanie automatycznego ukrywania" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Przywróć domyślne" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "Wyświetlanie doku i numerów programów" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Dostosowanie działania przycisków myszy" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Dostosowanie wskaźników okien" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Wszystkie okna" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Dostosowanie stylu wskaźników" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Kolor" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Kolor obramowania" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Szerokość obramowania" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Nakładka z numerem" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "Wyświetla chwilowo na ikonach numery programów powiązane ze skrótami" + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "Wyświetlenie ukrytego doku" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "Wyświetla chwilowo dok po wciśnięciu skrótu klawiszowego" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Skrót klawiszowy dla powyższych poleceń" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Składnia: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Czas ukrywania (s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Wybranie zminimalizowania okna, umożliwia minimalizowanie wszystkich okien " +"programu dwukrotnym kliknięciem" + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Kliknięcia lewym przyciskiem + Shift" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Przywrócenie okna" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Zminimalizowanie okna" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Otwarcie nowego okna" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Przełączenie pomiędzy oknami" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Zakończenie działania" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "Konfiguruje działanie kliknięcia środkowym przyciskiem myszy" + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Kliknięcie środkowym przyciskiem" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" +"Konfiguruje działanie kliknięcia środkowym przyciskiem myszy z przytrzymanym " +"klawiszem Shift" + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Kliknięcie środkowym przyciskiem + Shift" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Ekran wyświetlania doku" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Drugorzędny" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Położenie na ekranie" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Dół" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Góra" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Ukrywa dok jeśli zakrywa okno bieżącego programu. Dostępnych jest więcej " +"szczegółowych opcji." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Inteligentne ukrywanie" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Ograniczenie rozmiaru doku" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Tryb panelu: rozciągnięcie do krawędzi ekranu" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Ograniczenie rozmiaru ikon" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Ustalony rozmiar ikon: odsłanianie ikon przewijaniem" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Położenie i rozmiar" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Ulubione programy" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Uruchomione programy" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Izolowanie obszarów roboczych" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Podgląd otwartych okien" + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Przełącza widoczność przycisku programów. Można też skonfigurować za pomocą " +"narzędzia dostrajania lub witryny internetowej z rozszerzeniami." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Przycisk <i>Wyświetl programy</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Przemieszczenie przycisku programów na początek doku" + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Animowanie przycisku <i>Wyświetl programy</i>" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Aktywatory" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Używa skrótu Super+(0-9) do uruchomienia aktywatorów. Można użyć z " +"modyfikatorem Shift lub Ctrl." + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Uruchamianie aktywatorów skrótami klawiszowymi" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Określa działanie kliknięcia ikony uruchomionego programu" + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Działanie kliknięcia" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Zminimalizowanie okna" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Zminimalizowanie okna" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Określa działanie przewijania kółkiem ikony programu" + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Działanie przewijania" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Brak" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Przełączenie obszaru roboczego" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Zachowanie" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Integruje dok z domyślnym stylem GNOME przy użyciu kilku ustawień. " +"Opcjonalnie ustawienia te można określić poniżej." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Użycie zintegrowanego stylu" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "" +"Zmniejsza zajmowaną powierzchnię redukując\n" +"odległość od krawędzi i jej zaokrąglenie" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Zmniejszenie kokpitu" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Wyświetla kropkę dla każdego okna programu" + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Wskaźniki ilości okien" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Ustala wybrany kolor tła kokpitu" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Kolor kokpitu" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Modyfikuje przezroczystość tła kokpitu" + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Dostosowanie przezroczystości tła" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Nieprzezroczystość" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "Kąty proste narożników\n" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Wygląd" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "wersja: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Przemieszcza kokpit z widoku podglądu do doku" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Autor:" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Strona internetowa" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Niniejszy program rozpowszechniany jest bez " +"jakiejkolwiek gwarancji.\n" +"Więcej informacji: <a href=\"https://www.gnu.org/licenses/old-licenses/" +"gpl-2.0.html\">Powszechna licencja publiczna GNU, wersja 2 lub późniejsza</" +"a>.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "O programie" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Wyświetla dok po przemieszczeniu wskaźnika myszy do krawędzi ekranu" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Automatyczne ukrywanie" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Wymagany nacisk do wyświetlenia doku" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Wyświetlanie na pełnym ekranie" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Wyświetla dok jeśli nie zakrywa okien programu" + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Ukrywanie przed oknami" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Wszystkie okna" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Tylko aktywne okna programu" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Tylko zmaksymalizowane okna" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Czas animacji (s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Czas wyświetlania (s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Próg nacisku" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "W przypadku ustalonego rozmiaru ikon, używa jedynie obszaru krawędzi doku " +#~ "i przycisku <i>Wyświetl programy</i>." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Przełączanie obszarów roboczych przewijaniem doku" + +#~ msgid "Main Settings" +#~ msgstr "Ogólne" + +#~ msgid "Dock Position" +#~ msgstr "Położenie paska" + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "Zawsze widoczny pasek" + +#~ msgid "Show delay [ms]" +#~ msgstr "Opóźnienie wysuwania [ms]" + +#~ msgid "Hide delay [ms]" +#~ msgstr "Opóźnienie ukrywania [ms]" + +#~ msgid "Application based intellihide" +#~ msgstr "Ukrywanie tylko przed uaktywnionymi oknami" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "Wyświetlanie paska na podłączonym ekranie" + +#~ msgid "Primary (default)" +#~ msgstr "Podstawowy (domyślnie)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "Maksymalna wysokość" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "Rozciągnięcie (opcja eksperymentalna)" + +#~ msgid "Maximum icon size" +#~ msgstr "Maksymalny rozmiar ikony" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "Dodatkowe" + +#~ msgid "Deadtime between each workspace switching [ms]" +#~ msgstr "Opóźnienie przełączenia pomiędzy obszarami roboczymi [ms]" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "" +#~ "Ograniczenie aktywnego obszaru do szerokości 1 piksela od krawędzi ekranu" + +#~ msgid "All the area of the dock is active" +#~ msgstr "Aktywny cały obszar paska" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "Dostosowanie kliknięcia przyciskiem myszy" + +#~ msgid "Action on clicking on running app" +#~ msgstr "Działanie kliknięcia ikony uruchomionego programu" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "" +#~ "Minimalizowanie okien kliknięciem z przytrzymanym klawiszem shift\n" +#~ "(dwukrotne kliknięcie minimalizuje wszystkie okna programu)" + +#~ msgid "Appearence and Themes" +#~ msgstr "Wygląd" + +#~ msgid "" +#~ "A customized theme is built in the extension. This is meant to work with " +#~ "the default Adwaita theme: the dash is shrunk to save space, its " +#~ "background transparency reduced, and custom indicators for the number of " +#~ "windows of each application are added." +#~ msgstr "" +#~ "Wraz z rozszerzeniem udostępniony jest zmodyfikowany styl paska, " +#~ "zaprojektowany do działania z domyślnym stylem Adwaita: pasek został " +#~ "zmniejszony, zredukowano jego przezroczystość i dodano wskaźniki ilości " +#~ "okien programów." + +#~ msgid "" +#~ "Alternatively, for a better integration with custom themes, each " +#~ "customization can be applied indipendently" +#~ msgstr "" +#~ "Dla lepszego dopasowania do stylu, każdą z cech można dostosować " +#~ "niezależnie." + +#~ msgid "Shrink the dash size by reducing padding" +#~ msgstr "Zmniejszenie odległości krawędzi" + +#~ msgid "Only when in autohide" +#~ msgstr "Włączenie tylko podczas automatycznego ukrywania" diff --git a/package/po/pt.po b/package/po/pt.po new file mode 100644 index 0000000..f4209c8 --- /dev/null +++ b/package/po/pt.po @@ -0,0 +1,526 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Carlos Alberto Junior Spohr Poletto <carlos.spohr@gmail.com>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2012-12-20 20:45+1100\n" +"Last-Translator: Carlos Alberto Junior Spohr Poletto <carlos." +"spohr@gmail>com>\n" +"Language-Team: Carlos Alberto Junior Spohr Poletto <carlos.spohr@gmail>\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Portuguese\n" +"X-Poedit-Country: Portugal\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Mostrar aplicações em execução" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Alterar a opacidade do fundo do dock" + +#: prefs.js:514 +#, fuzzy +msgid "Customize running indicators" +msgstr "Mostrar aplicações em execução" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "" + +#: Settings.ui.h:1 +#, fuzzy +msgid "Customize indicator style" +msgstr "Alterar a opacidade do fundo do dock" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "Minimizar" + +#: Settings.ui.h:15 +#, fuzzy +msgid "Minimize window" +msgstr "Minimizar" + +#: Settings.ui.h:16 +#, fuzzy +msgid "Launch new instance" +msgstr "Abrir uma nova janela" + +#: Settings.ui.h:17 +#, fuzzy +msgid "Cycle through windows" +msgstr "Percorrer janelas de aplicativos" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "" + +#: Settings.ui.h:24 +msgid "Show on all monitors." +msgstr "" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" + +#: Settings.ui.h:31 +#, fuzzy +msgid "Intelligent autohide" +msgstr "Ocultação inteligente" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "" + +#: Settings.ui.h:37 +#, fuzzy +msgid "Show favorite applications" +msgstr "Mostrar ícones das aplicações favoritas" + +#: Settings.ui.h:38 +#, fuzzy +msgid "Show running applications" +msgstr "Mostrar aplicações em execução" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "Mostrar aplicações em execução" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "" + +#: Settings.ui.h:44 +#, fuzzy +msgid "Animate <i>Show Applications</i>." +msgstr "Mostrar aplicações em execução" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "" + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimizar" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Minimizar" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "" + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "" + +#: Settings.ui.h:54 +#, fuzzy +msgid "Do nothing" +msgstr "Não faça nada (padrão)" + +#: Settings.ui.h:55 +#, fuzzy +msgid "Switch workspace" +msgstr "Trocar de espaço de trabalho um por vez" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "" + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +#, fuzzy +msgid "Tune the dash background opacity." +msgstr "Alterar a opacidade do fundo do dock" + +#: Settings.ui.h:66 +#, fuzzy +msgid "Customize opacity" +msgstr "Alterar a opacidade do fundo do dock" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Opacidade" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" + +#: Settings.ui.h:77 +msgid "About" +msgstr "" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Masquage automatique" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "" + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "" + +#: Settings.ui.h:86 +#, fuzzy +msgid "Only maximized windows" +msgstr "Minimizar" + +#: Settings.ui.h:87 +#, fuzzy +msgid "Animation duration (s)" +msgstr "Tempo da animação [ms]" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "" + +#, fuzzy +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Trocar de espaço de trabalho quando scrolar o mouse sobre o dock" + +#~ msgid "Main Settings" +#~ msgstr "Configurações principais" + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "O Dock está fixo e sempre visível" + +#~ msgid "Show delay [ms]" +#~ msgstr "Mostrar delay [ms]" + +#~ msgid "Hide delay [ms]" +#~ msgstr "Ocultar delay [ms]" + +#~ msgid "Application based intellihide" +#~ msgstr "Ocultação inteligente por aplicação" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "Mostrar o dock nos monitores abaixo (se anexados)" + +#~ msgid "Primary (default)" +#~ msgstr "Primário (por padrão)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "Altura máxima" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "Expandir (experimental e bugada)" + +#~ msgid "Maximum icon size" +#~ msgstr "Tamanho máximo dos ícones" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "Recursos opcionais" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "" +#~ "Somente uma área de 1px de largura na borda da tela quando estiver ativa" + +#~ msgid "All the area of the dock is active" +#~ msgstr "Toda a área quando o dock estiver ativo" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "Alterar configurações do click do mouse" + +#~ msgid "Action on clicking on running app" +#~ msgstr "Ações de clique em aplicações em execução" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "" +#~ "Minimizar a janela com shift+click (clique duplo para todas as janelas de " +#~ "aplicação)" + +#~ msgid "Only when in autohide" +#~ msgstr "Somente quando estiver em auto-esconder" diff --git a/package/po/pt_BR.po b/package/po/pt_BR.po new file mode 100644 index 0000000..9545d01 --- /dev/null +++ b/package/po/pt_BR.po @@ -0,0 +1,555 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Carlos Alberto Junior Spohr Poletto <carlos.spohr@gmail.com>, 2012. +# Fábio Nogueira <fnogueira@gnome.org>, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2017-04-16 23:10-0300\n" +"Last-Translator: Fábio Nogueira <fnogueira@gnome.org>\n" +"Language-Team: Português do Brasil\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.1\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Monitor primário" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Monitor secundário" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Direita" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Esquerda" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Configuração da ocultação inteligente" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Restaurar o padrão" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "Exibir o dock e os números dos aplicativos" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Customizar o comportamento do clique do botão do meio" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Customizar os indicadores de execução" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Todas as Janelas" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Customizar o estilo do indicador" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Cor" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Cor da borda" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Tamanho da borda" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Sobreposição de número" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" +"Mostrar temporariamente os números dos aplicativos sobre os ícones, " +"correspondentes ao atalho." + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "Exibir o dock se este estiver oculto" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" +"Se utilizar a ocultação, o dock será exibido por um curto período de tempo " +"ao acionar o atalho." + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Atalho para as opções acima" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Sintaxe: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Ocultar tempo limite [s]" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Quando minimizar, o duplo clique minizará todas as janelas dos aplicativos" + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Ação do Shift+Clique" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Aumentar janela" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimizar janela" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Iniciar nova instância" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Percorrer através das janelas" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Sair" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "Comportamento do Clique do botão do meio." + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Ação do clique do botão do meio" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportamento para Shift + Clique do botão do meio." + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Ação do Shift+Clique do botão do meio" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Exibir o dock" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Monitor secundário" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Posição na tela" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Embaixo" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Em cima" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Ocultar o dock quando o mesmo sobrepor a janela do aplicativo em uso. " +"Definições mais aperfeiçoadas estão disponíveis." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Ocultação inteligente" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Tamanho limite do dock" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Modo do painel: estender até a borda da tela" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Tamanho limite do ícone" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Tamanho do ícone fixo: use o scroll do mouse para revelar outro ícone" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Posição e tamanho" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Mostrar aplicativos favoritos" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Mostrar aplicativos em execução" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Isolar espaços de trabalho." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Mostrar pré-visualizações de janelas abertas." + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Se desabilitado, essas configurações estão acessíveis através do gnome-tweak-" +"tool ou no site da extensão." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Exibir ícone dos <i>Aplicativos</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Mover o botão de aplicativos para o início do dock." + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "<i>Mostrar aplicativos</i> com efeitos." + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Lançadores" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Habilita tecla Super+(0-9) como atalhos para ativar aplicativos. Também pode " +"ser usado junto com Shift e Ctrl." + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Usar atalhos de teclado para ativar aplicativos" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Comportamento ao clicar sobre o ícone de um aplicativo em execução." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Ação do clique" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimizar" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Minimizar janela" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Comportamento ao rolar sobre o ícone de um aplicativo." + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Ação da rolagem" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Não fazer nada" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Alternar espaço de trabalho" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Comportamento" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Algumas personalizações se destinam a integrar o dock com o tema padrão do " +"GNOME. Alternativamente, as opções específicas podem ser ativadas abaixo." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Usar o tema do sistema" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Economizar espaço reduzindo preenchimento e a borda arredondada" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Encolher o dash" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Mostrar um ponto para cada janela do aplicativo" + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Mostrar indicadores de contador de janelas" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Define a cor de fundo para o dash." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Customizar a cor do dash" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Ajustar a opacidade do fundo do dash." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Customizar opacidade" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Opacidade" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "Forçar canto reto\n" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Aparência" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "versão:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Mover o dash para fora da visão geral transformando-o em dock" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Criado por" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Página Web" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Este programa é distribuido SEM QUALQUER GARANTIA.\n" +"Veja em <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, versão 2 ou posterior</a> para maiores " +"detalhes.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Sobre" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Mostrar o dock quando o mouse pairar sobre a tela." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Ocultação" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Empurrar para mostrar: requer pressão para mostrar o dock" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Habilitar modo tela cheia" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Mostrar o dock quando nenhum aplicativo sobrepor o mesmo." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Esconder janela" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Todas as janelas" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Apenas janelas de aplicativos em foco" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Somente janelas maximizadas" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Tempo da animação [s]" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Mostrar tempo limite [s]" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Limite de pressão" + +#~ msgid "New Window" +#~ msgstr "Nova janela" + +#~ msgid "Launch using Dedicated Graphics Card" +#~ msgstr "Inicia utilizando uma placa gráfica dedicada" + +#~ msgid "Remove from Favorites" +#~ msgstr "Remover dos favoritos" + +#~ msgid "Add to Favorites" +#~ msgstr "Adicionar aos favoritos" + +#~ msgid "Show Details" +#~ msgstr "Exibir detalhes" + +#~ msgid "Windows" +#~ msgstr "Janelas" + +#~ msgid "Settings" +#~ msgstr "Configurações" + +#~ msgid "Dash" +#~ msgstr "Dash" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Com o tamanho do ícone fixo, somente a borda do dock e o ícone <i>Mostrar " +#~ "aplicativos</i> são ativados." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "" +#~ "Trocar de área de trabalho quando usar o scroll do mouse sobre o dock" + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Considere apenas janelas de aplicativos em uso." + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "O Dock está fixo e sempre visível" + +#~ msgid "Show delay [ms]" +#~ msgstr "Mostrar delay [ms]" + +#~ msgid "Hide delay [ms]" +#~ msgstr "Ocultar delay [ms]" + +#~ msgid "Application based intellihide" +#~ msgstr "Ocultação inteligente por aplicação" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "Mostrar o dock nos monitores abaixo (se anexados)" + +#~ msgid "Primary (default)" +#~ msgstr "Primário (por padrão)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "Altura máxima" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "Expandir (experimental e bugada)" + +#~ msgid "Maximum icon size" +#~ msgstr "Tamanho máximo dos ícones" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "Recursos opcionais" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "" +#~ "Somente uma área de 1px de largura na borda da tela quando estiver ativa" + +#~ msgid "All the area of the dock is active" +#~ msgstr "Toda a área quando o dock estiver ativo" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "Alterar configurações do click do mouse" + +#~ msgid "Action on clicking on running app" +#~ msgstr "Ações de clique em aplicações em execução" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "" +#~ "Minimizar a janela com shift+click (clique duplo para todas as janelas de " +#~ "aplicação)" + +#~ msgid "Only when in autohide" +#~ msgstr "Somente quando estiver em auto-esconder" diff --git a/package/po/ru.po b/package/po/ru.po new file mode 100644 index 0000000..ad19a5f --- /dev/null +++ b/package/po/ru.po @@ -0,0 +1,564 @@ +# Russian translation for dash-to-dock GNOME Shell extension +# Ivan Komaritsyn <vantu5z@mail.ru>, 2015, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: dash-to-dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2017-04-28 13:26+0300\n" +"Last-Translator: Ivan Komaritsyn <vantu5z@mail.ru>\n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Основной монитор" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Дополнительный монитор" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Справа" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Слева" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Настройка автоскрытия" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Сбросить настройки" + +#: prefs.js:386 +msgid "Show dock and application numbers" +msgstr "Показывать количество запущенных приложений" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "Настройка действий для средней кнопки мыши" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Настройка индикаторов запуска" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Все окна" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Настроить стиль индикатора" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Цвет" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Цвет границы" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Ширина границы" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "Отображение номера" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" +"Временно показывать номера приложений рядом с иконками, при нажатии " +"сочетания клавиш." + +#: Settings.ui.h:7 +msgid "Show the dock if it is hidden" +msgstr "Показать Док, если он скрыт" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" +"Если используется автоматическое скрытие, то Док кратковреммено появится при " +"обработке сочетания клавиш." + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "Сочетания клавиш для указанных параметров" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "Синтаксис: <Shift>, <Ctrl>, <Alt>, <Super>" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Задержка скрытия (сек.)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Если установлено на «Минимизировать», то двойной клик минимизирует все окна " +"данного приложения." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Действие по Shift+Click" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "Показать окно" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Минимизировать окно" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Открыть новое окно" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Переключить окно приложения" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "Выйти" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "Действие по нажатию средней кнопки мыши." + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "Действие по Middle-Click" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "Действие по нажатию Shift + средняя кнопка мыши." + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Действие по Shift+Middle-Click" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Показывать Док на" + +#: Settings.ui.h:24 +msgid "Show on all monitors." +msgstr "Показывать на всех мониторах." + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Расположение на экране" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Снизу" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Сверху" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Скрывать Док, если он перекрывается окном активного приложения. Доступны " +"дополнительные настройки." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Интеллектуальное скрытие" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Ограничение размера Дока" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Режим панели: Док растянут по всей стороне экрана" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Ограничение размера иконок" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "" +"Фиксированный размер иконок: используйте прокрутку для доступа к нужному " +"приложению" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Положение и размер" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Показывать избранные приложения" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Показывать запущенные приложения" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Для текущего рабочего стола." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "Показывать миниатюры открытых окон." + +#: Settings.ui.h:41 +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Если отключено, то эти настройки доступны в gnome-tweak-tool или через сайт " +"дополнений." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Показывать иконку <i>«Приложения»</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Расположить кнопку «Приложения» с другой стороны Дока." + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Анимация при показе <i>«Приложений»</i>" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "Команды" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Включить сочетания клавиш Super+(0-9) для выбора приложений. Также может " +"быть использовано совместно с Shift и Ctrl." + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "Использовать сочетания клавиш для выбора приложений" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Поведение при нажатии на иконку запущенного приложения." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Действие по нажатию" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Минимизировать" + +#: Settings.ui.h:51 +msgid "Minimize or overview" +msgstr "Минимизация или обзор" + +#: Settings.ui.h:52 +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Поведение при прокрутке на иконке приложения." + +#: Settings.ui.h:53 +msgid "Scroll action" +msgstr "Действие при прокрутке" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Ничего не делать" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "Переключить рабочий стол" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Поведение" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Сбалансированные настройки для интеграции Дока с темой Gnome по умолчанию. " +"Ниже можно установить настройки вручную." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Использовать встроенную тему" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "" +"Экономия рабочего пространства за счёт уменьшения промежутков и " +"использования скругленных углов." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Сжать Док" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Отображает точку для каждого окна приложения." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Показывать индикаторы количества окон" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Вобор цвета фона для панели." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Настроить цвет Дока" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Настройка прозрачности фона Дока." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Настроить прозрачность" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Непрозрачность" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "Не скруглять углы\n" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Внешний вид" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "версия: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Показывает панель из режима «Обзор» в виде дока" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Автор" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Домашняя страница" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Эта программа распространяется БЕЗ КАКИХ ЛИБО " +"ГАРАНТИЙ.\n" +"Смотри <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, версия 2 или позднее</a> для информации.</" +"span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "О дополнении" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Показывать Док при подведении мыши к стороне экрана." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Автоматическое скрытие" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Давление для появления: требуется давление для открытия Дока" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Включить для полноэкранного режима" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Скрывать Док, когда он перекрыт окнами приложений" + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Перекрытие окнами" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Все окна" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Только активное окно приложения" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Только развёрнутые окна" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Время анимации (сек.)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Задержка открытия (сек.)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Порог давления" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "При фиксированном размере иконок приложений активна только область иконки " +#~ "<i>«Приложения»</i> и край дока." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Переключать рабочие столы при прокрутке на Доке" + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Применить только к активным окнам приложений" + +#~ msgid "Main Settings" +#~ msgstr "Основные настройки" + +#~ msgid "Dock Position" +#~ msgstr "Расположение Дока" + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "Док зафиксирован и всегда виден" + +#~ msgid "Show delay [ms]" +#~ msgstr "Задержка перед появлением [мс]" + +#~ msgid "Hide delay [ms]" +#~ msgstr "Задержка перед скрытием [мс]" + +#~ msgid "Application based intellihide" +#~ msgstr "Интеллектуальное скрытие действует только для активных окон" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "Показывать Док на дополнительном мониторе (если подключен)" + +#~ msgid "Primary (default)" +#~ msgstr "Главный (по умолчанию)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "Максимальная высота" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "Расширяемый (экспериментально и неустойчиво)" + +#~ msgid "Maximum icon size" +#~ msgstr "Максимальный размер иконки" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "Дополнительные функции" + +#~ msgid "Deadtime between each workspace switching [ms]" +#~ msgstr "Задержка между каждым переключением [мс]" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "Активная область - 1 пиксель от края экрана" + +#~ msgid "All the area of the dock is active" +#~ msgstr "Активен весь Док" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "Настроить действия по нажатию мыши" + +#~ msgid "Action on clicking on running app" +#~ msgstr "Действие по нажатию на иконку запущенного приложения" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "" +#~ "Минимизировать окно при shift+click (двойное нажатие скрывает все окна " +#~ "приложений)" + +#~ msgid "Make message tray insensitive to mouse events" +#~ msgstr "Сделать область сообщений нечувствительной к мыши" + +#~ msgid "Appearence and Themes" +#~ msgstr "Внешний вид и Темы" + +#~ msgid "" +#~ "A customized theme is built in the extension. This is meant to work with " +#~ "the default Adwaita theme: the dash is shrunk to save space, its " +#~ "background transparency reduced, and custom indicators for the number of " +#~ "windows of each application are added." +#~ msgstr "" +#~ "Тема встроена в расширение. Она оптимизирована для темы Adwaita по " +#~ "умолчанию: Док уменьшен, чтобы сохранить пространство; прозрачность фона " +#~ "снижена; включены индикаторы количества окон для каждого приложения." + +#~ msgid "" +#~ "Alternatively, for a better integration with custom themes, each " +#~ "customization can be applied indipendently" +#~ msgstr "" +#~ "Для большей интеграции с пользовательской темой, каждый параметр можно " +#~ "настроить независимо" + +#~ msgid "Shrink the dash size by reducing padding" +#~ msgstr "Уменьшить Док за счёт промежутков" diff --git a/package/po/sk.po b/package/po/sk.po new file mode 100644 index 0000000..5f9997e --- /dev/null +++ b/package/po/sk.po @@ -0,0 +1,454 @@ +# Slovak translation of dash-to-dock. +# Copyright (C) 2016 Dušan Kazik +# This file is distributed under the same license as the PACKAGE package. +# Dušan Kazik <prescott66@gmail.com>, 2015, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2016-07-15 12:48+0200\n" +"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n" +"Language-Team: \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7.1\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Hlavnom monitore" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Vedľajšom monitore" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Vpravo" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Vľavo" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Prispôsobenie inteligentného automatického skrývania" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Obnoviť pôvodné" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Zobraziť spustené aplikácie" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Prispôsobenie štýlu indikátorov" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Prispôsobenie " + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Všetky okná" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Prispôsobenie štýlu indikátorov" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Farba" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Farba okraja" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Šírka okraja" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Zobraziť dok na" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Časový limit na skrytie (s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Keď je nastavené na minimalizovanie, dvojklik minimalizuje všetky okná " +"aplikácie." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Akcia Shift+Kliknutie" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "Minimalizovať okno" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimalizovať okno" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Spustiť novú inštanciu" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Striedať okná" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Akcia po kliknutí" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Akcia Shift+Kliknutie" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Zobraziť dok na" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Vedľajšom monitore" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Pozícia na obrazovke" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Na spodku" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Na vrchu" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Skryť dok, keď zasahuje do okna aktuálnej aplikácie. Sú dostupné " +"podrobnejšie nastavenia." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Inteligentné automatické skrývanie" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Limit veľkosti doku" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Režim panelu: roztiahnutie k hranám obrazovky" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Limit veľkosti ikôn" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Pevná veľkosť ikôn: rolovaním odhalíte ostatné ikony" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Pozícia a veľkosť" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Zobraziť obľúbené aplikácie" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Zobraziť spustené aplikácie" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "Oddelené pracovné priestory." + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Ak je voľba zakázaná, nastavenia sú dostupné z nástroja na vyladenie " +"nastavení prostredia Gnome alebo webovej stránky rozšírenia." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Zobraziť ikonu <i>Aplikácie</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Premiestni tlačidlo aplikácií na začiatok doku." + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Animovať položku <i>Zobraziť aplikácie</i>." + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Správanie pri kliknutí na ikonu spustenej aplikácie." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Akcia po kliknutí" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimalizovať" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Minimalizovať okno" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Správanie pri kliknutí na ikonu spustenej aplikácie." + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Akcia po kliknutí" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Nevykonať nič" + +#: Settings.ui.h:55 +#, fuzzy +msgid "Switch workspace" +msgstr "Oddelené pracovné priestory." + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Správanie" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Niekoľko úprav na integrovanie doku s predvolenou témou prostredia GNOME. " +"Alternatívne môžu byť povolené špecifické voľby nižšie." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Použiť zabudovanú tému" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Ušetrí miesto zmenšením rádiusu odsadenia a okrajov." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Zmenšiť panel" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Zobrazí bodku za každé okno aplikácie." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Zobraziť indikátory počítadiel okien" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Nastaví farbu pozadia panelu." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Prispôsobenie farby panelu" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Vyladí krytie pozadia panelu." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Prispôsobenie krytia" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Krytie" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Vzhľad" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "Verzia: c" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Presunie panel z prehľadu transformovaním do doku" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Vytvoril" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Webová stránka" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Tento program je ABSOLÚTNE BEZ ZÁRUKY.\n" +"Pre viac podrobností si pozrite <a href=\"https://www.gnu.org/licenses/old-" +"licenses/gpl-2.0.html\">Licenciu GNU General Public, verzie 2 alebo novšiu</" +"a>.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "O rozšírení" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Zobrazí dok prejdením myši na hranu obrazovky." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Automatické skrytie" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Zobraziť stlačením: vyžaduje tlak na zobrazenie doku" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Povoliť v režime na celú obrazovku" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Zobrazí dok, keď nebude zasahovať do okien aplikácií." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Vyhýbať sa oknám" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Všetky okná" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Iba zamerané okná aplikácií" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Iba maximalizované okná" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Trvanie animácie (s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Zobraziť časový limit (s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Medza tlaku" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "S pevnou veľkosťou ikon je aktívna iba hrana doku a ikona <i>Zobraziť " +#~ "aplikácie</i>." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Prepínať pracovné priestory rolovaním na doku" diff --git a/package/po/sr.po b/package/po/sr.po new file mode 100644 index 0000000..76e659e --- /dev/null +++ b/package/po/sr.po @@ -0,0 +1,465 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2015-07-29 18:11+0200\n" +"Last-Translator: Слободан Терзић <Xabre@archlinux.info>\n" +"Language-Team: \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.2\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "примарном монитору" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "секундарном монитору" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "десно" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "лево" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Поставке интелигентног самосакривања" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Поврати основно" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Приказ покренутих програма" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Прилагоћавање прозирности" + +#: prefs.js:514 +#, fuzzy +msgid "Customize running indicators" +msgstr "Приказ покренутих програма" + +#: appIcons.js:804 +#, fuzzy +msgid "All Windows" +msgstr "Избегавање розора" + +#: Settings.ui.h:1 +#, fuzzy +msgid "Customize indicator style" +msgstr "Прилагоћавање прозирности" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Прикажи док на" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Застој скривања" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Кад је постављено на минимизовање, дупли клик минимизује све прозоре " +"програма." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Радња шифт+клика" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "минимиуј прозор" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "минимиуј прозор" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "покрени нови примерак" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "кружење кроз прозоре" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Радња клика" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Радња шифт+клика" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Прикажи док на" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "секундарном монитору" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Позиција на екрану" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "дно" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "врх" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Сакриј док када је на путу прозора тренутног програма. Доступне су финије " +"поставке." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Интелигентно самосакривање" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Ограничење величине дока" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Режим панела: проширен до ивица екрана" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Ограничење величине икона" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Устаљена величина икона: клизајте за друге иконе" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Позиција и величина" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Приказ омиљених програма" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Приказ покренутих програма" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Уколико је онемогућено, ове поставке су доступне кроз алатку за лицкање или " +"веб сајт проширења." + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "Приказ иконе <i>Прикажи програме</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Помери дугме програма на почетак дока" + +#: Settings.ui.h:44 +#, fuzzy +msgid "Animate <i>Show Applications</i>." +msgstr "Приказ иконе <i>Прикажи програме</i>" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Понашање при клику на покренути програм." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Радња клика" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "минимизуј" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "минимиуј прозор" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Понашање при клику на покренути програм." + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Радња клика" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "ништа" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Понашање" + +#: Settings.ui.h:57 +#, fuzzy +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Неколико поставки је намењено уграђивању дока у основну тему Гнома. " +"Алтернативно, посебне поставке се могу уредити испод." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Користи уграђену тему" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Чува простор сужавањем попуне и опсега ивица." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Скупи плочу" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Приказује тачку за сваки прозор програма." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Приказ индикаторa бројача прозора." + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Прилагоди прозирност позадине плоче." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Прилагоћавање прозирности" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Прозирност" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Изглед" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "верзија:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Помера плочу из глобалног приказа, претварајући је у док" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Направи" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Веб страница" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Овај програм се доставља БЕЗ ИКАКВИХ ГАРАНЦИЈА.\n" +"Погледајте <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">ГНУову Општу Јавну лиценцу, верзија 2 или каснија</a>, за детаље.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "О програму" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Прикажи док прелазом миша пеко ивице екрана." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Самоскривање" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Приказ притиском: захтева притисак за приказ дока" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Приказује док када није на путу прозорима програма." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Избегавање розора" + +#: Settings.ui.h:84 +#, fuzzy +msgid "All windows" +msgstr "Избегавање розора" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "" + +#: Settings.ui.h:86 +#, fuzzy +msgid "Only maximized windows" +msgstr "минимиуј прозор" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Трајање(а) анимације" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0,000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Застој приказивања" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Праг притиска" + +#, fuzzy +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Ако се иконе преклапају на доку, приказује се само икона <i>Прикажи " +#~ "програме</i>." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Промена радног простора клизањем по доку" + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Разматрај само прозор фокусираног програма" diff --git a/package/po/sr@latin.po b/package/po/sr@latin.po new file mode 100644 index 0000000..6c01f54 --- /dev/null +++ b/package/po/sr@latin.po @@ -0,0 +1,464 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2015-07-29 18:11+0200\n" +"Last-Translator: Slobodan Terzić <Xabre@archlinux.info>\n" +"Language-Team: \n" +"Language: sr@latin\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.2\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "primarnom monitoru" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "sekundarnom monitoru" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "desno" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "levo" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Postavke inteligentnog samosakrivanja" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Povrati osnovno" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Prikaz pokrenutih programa" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Prilagoćavanje prozirnosti" + +#: prefs.js:514 +#, fuzzy +msgid "Customize running indicators" +msgstr "Prikaz pokrenutih programa" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Izbegavanje rozora" + +#: Settings.ui.h:1 +#, fuzzy +msgid "Customize indicator style" +msgstr "Prilagoćavanje prozirnosti" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Prikaži dok na" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Zastoj skrivanja" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Kad je postavljeno na minimizovanje, dupli klik minimizuje sve prozore " +"programa." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Radnja šift+klika" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "minimiuj prozor" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "minimiuj prozor" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "pokreni novi primerak" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "kruženje kroz prozore" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Radnja klika" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Radnja šift+klika" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Prikaži dok na" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "sekundarnom monitoru" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Pozicija na ekranu" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "dno" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "vrh" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Sakrij dok kada je na putu prozora trenutnog programa. Dostupne su finije " +"postavke." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Inteligentno samosakrivanje" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Ograničenje veličine doka" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Režim panela: proširen do ivica ekrana" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Ograničenje veličine ikona" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Ustaljena veličina ikona: klizajte za druge ikone" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Pozicija i veličina" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Prikaz omiljenih programa" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Prikaz pokrenutih programa" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Ukoliko je onemogućeno, ove postavke su dostupne kroz alatku za lickanje ili " +"veb sajt proširenja." + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "Prikaz ikone <i>Prikaži programe</i>" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Pomeri dugme programa na početak doka" + +#: Settings.ui.h:44 +#, fuzzy +msgid "Animate <i>Show Applications</i>." +msgstr "Prikaz ikone <i>Prikaži programe</i>" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Ponašanje pri kliku na pokrenuti program." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Radnja klika" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "minimizuj" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "minimiuj prozor" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Ponašanje pri kliku na pokrenuti program." + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Radnja klika" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "ništa" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Ponašanje" + +#: Settings.ui.h:57 +#, fuzzy +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Nekoliko postavki je namenjeno ugrađivanju doka u osnovnu temu Gnoma. " +"Alternativno, posebne postavke se mogu urediti ispod." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Koristi ugrađenu temu" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Čuva prostor sužavanjem popune i opsega ivica." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Skupi ploču" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Prikazuje tačku za svaki prozor programa." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Prikaz indikatora brojača prozora." + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Prilagodi prozirnost pozadine ploče." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Prilagoćavanje prozirnosti" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Prozirnost" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Izgled" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "verzija:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Pomera ploču iz globalnog prikaza, pretvarajući je u dok" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Napravi" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Veb stranica" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Ovaj program se dostavlja BEZ IKAKVIH GARANCIJA.\n" +"Pogledajte <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNUovu Opštu Javnu licencu, verzija 2 ili kasnija</a>, za detalje.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "O programu" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Prikaži dok prelazom miša peko ivice ekrana." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Samoskrivanje" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Prikaz pritiskom: zahteva pritisak za prikaz doka" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Prikazuje dok kada nije na putu prozorima programa." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Izbegavanje rozora" + +#: Settings.ui.h:84 +#, fuzzy +msgid "All windows" +msgstr "Izbegavanje rozora" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "" + +#: Settings.ui.h:86 +#, fuzzy +msgid "Only maximized windows" +msgstr "minimiuj prozor" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Trajanje(a) animacije" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0,000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Zastoj prikazivanja" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Prag pritiska" + +#, fuzzy +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Ako se ikone preklapaju na doku, prikazuje se samo ikona <i>Prikaži " +#~ "programe</i>." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Promena radnog prostora klizanjem po doku" + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Razmatraj samo prozor fokusiranog programa" diff --git a/package/po/sv.po b/package/po/sv.po new file mode 100644 index 0000000..db33fb2 --- /dev/null +++ b/package/po/sv.po @@ -0,0 +1,452 @@ +# Swedish translation for dash-to-dock. +# Copyright © 2016 dash-to-dock's COPYRIGHT HOLDER +# This file is distributed under the same license as the dash-to-dock package. +# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2016-07-01 18:37+0200\n" +"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n" +"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.8\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Primär skärm" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "Sekundär skärm " + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Höger" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Vänster" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Anpassning av intelligent automatiskt döljande" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Återställ till standardvärden" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Visa körande program" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Anpassa indikatorstil" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Anpassa körningsindikatorer" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Alla fönster" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Anpassa indikatorstil" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Färg" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Kantfärg" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Kantbredd" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Visa dockan på" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Tidsgräns för att dölja (s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Då inställd till minimera så minimerar dubbelklick alla fönster för " +"programmet." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Skift+klick-åtgärd" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "Minimera fönster" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Minimera fönster" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Starta ny instans" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Växla mellan fönster" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Klickåtgärd" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Skift+klick-åtgärd" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Visa dockan på" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "Sekundär skärm " + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Position på skärmen" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Nederkant" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Överkant" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Dölj dockan då den är i vägen för ett fönster för det aktuella programmet. " +"Mer förfinade inställningar finns tillgängliga." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Intelligent automatiskt döljande" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Storleksgräns för docka" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Panelläge: sträck ut till skärmkanten" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Storleksgräns för ikoner" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Fast ikonstorlek: rulla för att avslöja andra ikoner" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Position och storlek" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Visa favoritprogram" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Visa körande program" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Om inaktiverad är dessa inställningar tillgängliga från gnome-tweak-tool " +"eller webbplatsen för utökningar." + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "Visa <i>Program</i>-ikon" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Flytta programknappen till början på dockan." + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "Animera <i>Visa program</i>." + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Beteende då ikonen för ett körande program klickas på." + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Klickåtgärd" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Minimera" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Minimera fönster" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Beteende då ikonen för ett körande program klickas på." + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Klickåtgärd" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Gör ingenting" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Beteende" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Några anpassningar för att integrera dockan med GNOME:s standardtema. " +"Alternativt kan specifika alternativ aktiveras nedan." + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Använd inbyggt tema" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Spara utrymme genom att minska utfyllnad och kantradie." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Krymp snabbstartspanelen" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Visa en punkt för varje fönster för programmet." + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Visa fönsterräknarindikatorer" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "Ställ in bakgrundsfärg för snabbstartspanelen." + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "Anpassa färgen för snabbstartspanelen" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Justera opacitet för bakgrunden till snabbstartspanelen." + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Anpassa opacitet" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Opacitet" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Utseende" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "version: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "" +"Flyttar snabbstartspanelen från översiktsvyn och förvandlar den till en docka" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Skapat av" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Webbsida" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Detta program kommer HELT UTAN GARANTI.\n" +"Se <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html\">GNU " +"General Public License, version 2 eller senare</a> för detaljer.</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Om" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Visa dockan genom att hovra musen över skärmkanten." + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Dölj automatiskt" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Tryck för att visa: kräv tryck för att visa dockan" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Aktivera i helskärmsläge" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Visa dockan då den inte är i vägen för programfönster." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Undvik fönster" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Alla fönster" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Endast fokuserade programs fönster" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Endast maximerade fönster" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Längd på animering (s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Tidsgräns för att visa (s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Tröskelvärde för tryck" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Med fast ikonstorlek är endast kanten på dockan och <i>Visa program</i>-" +#~ "ikonen aktiva." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Växla arbetsyta genom att rulla på dockan" diff --git a/package/po/tr.po b/package/po/tr.po new file mode 100644 index 0000000..757f07f --- /dev/null +++ b/package/po/tr.po @@ -0,0 +1,457 @@ +# Turkish Translation. +# Copyright (C) 2015 +# This file is distributed under the same license with main package. +# Mustafa Akgün <mustafa.akgun@gmail.com>, 2015. +# Çağatay Yiğit Şahin <cyigitsahin@outlook.com>, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2016-09-04 21:25+0300\n" +"Last-Translator: Çağatay Yiğit Şahin <cyigitsahin@outlook.com>\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Gtranslator 2.91.7\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "Ana Ekran" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "İkincil Ekran" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "Sağ" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "Sol" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "Akıllı otomatik saklama ayarları" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "Öntanımlı ayarlara geri dön" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "Çalışan uygulamaları göster" + +#: prefs.js:443 +#, fuzzy +msgid "Customize middle-click behavior" +msgstr "Panel biçemini ayarla" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "Çalışan uygulamaları göster" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "Bütün pencereler" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "Panel biçemini ayarla" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "Renk" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "Çerçeve rengi" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "Çerçeve genişliği" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "Panelde göster" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "Gecikme zaman aşımı(s)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"En küçüğe ayarlandığında, tüm uygulama pencerelerini küçültmek için çift " +"tıklayın." + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Shift+Tıkla hareketi" + +#: Settings.ui.h:14 +#, fuzzy +msgid "Raise window" +msgstr "Pencereyi küçült" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "Pencereyi küçült" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "Yeni durumu başlat" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "Penceler döngüsü" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "" + +#: Settings.ui.h:20 +#, fuzzy +msgid "Middle-Click action" +msgstr "Hareket için tıkla" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "" + +#: Settings.ui.h:22 +#, fuzzy +msgid "Shift+Middle-Click action" +msgstr "Shift+Tıkla hareketi" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "Panelde göster" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "İkincil Ekran" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "Ekrandaki konumu" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "Alt" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "Üst" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"Etkin uygulamanın penceresini engellediğinde paneli gizle. Daha ileri " +"ayarlar mevcuttur." + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "Akıllı otogizleme" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Panel ölçü sınırı" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "Panel modu: Ekran köşelerine genişlet" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "Simge ölçü sınırı" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "Sabit simge ölçüsü: Diğer simgeleri görmek için kaydır" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "Konum ve ölçü" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "Kullanılan uygulamaları göster" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "Çalışan uygulamaları göster" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "" +"Eğer engellenmiş ise, bu ayarlara Gnome-tweak-tool ile veya Gnome extension " +"sitesinden ulaşılabilir." + +#: Settings.ui.h:42 +#, fuzzy +msgid "Show <i>Applications</i> icon" +msgstr "<i>Uygulamaları Göster</i> simgesini göster" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "Uygulamalar düğmesini panelin başlangıcına taşı " + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "<i>Uygulamaları Göster</i> simgesini göster" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Çalışan uygulama simgesine tıkladığındaki davranış" + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "Hareket için tıkla" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "Küçült" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "Pencereyi küçült" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "Çalışan uygulama simgesine tıkladığındaki davranış" + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "Hareket için tıkla" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "Hiçbir şey yapma" + +#: Settings.ui.h:55 +msgid "Switch workspace" +msgstr "" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "Davranış" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"Varsayılan GNOME temasıyla bütünleşme için birkaç kişiselleştirme. Tercihen, " +"belirli ayarlar aşağıdan etkinleştirilebilir" + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "Varsayılan temayı kullan" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "Yer kazanmak için dolguyu ve kenar çevresini azalt." + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "Paneli daralt" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "Uygulamanın her penceresi için bir nokta göster" + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "Pencere sayacını göster" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "Panel arkaplanının saydamlığını ayarla" + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "Saydamlığı ayarla" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "Saydamlık" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "Görünüm" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "Sürüm: " + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "Paneli genel görünümden ana ekrana taşır" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "Tarafından oluşturulmuştur:" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "Web sayfası" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">Bu yazılım kesinlikle garantisiz olarak gelmektedir..\n" +"Detayları görüntülemek için <a href=\"https://www.gnu.org/licenses/old-" +"licenses/gpl-2.0.html\">GNU Genel Halk Lisansı, sürüm 2 veya üstü</a> " +"tıklayın</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "Hakkında" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "Fare Ekran köşeleri üzerinde iken paneli göster. " + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "Otogizleme" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "Göstermek için it: Panelin gösterilmesi icin etki gerektirir." + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "Tam ekran modunda etkinleştir" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "Uygulama penceresini engellemediğinde paneli göster." + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "Pencereleri atlat" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "Bütün pencereler" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "Sadece odaklanan uygulamanın pencereleri" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "Sadece büyütülen pencereler" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "Animasyon süresi(s)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "Zaman aşımını göster(s)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "Etki eşiği" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "Simge boyutu sabitlenmişse, sadece panelin kenarları ve <i>Uygulamaları " +#~ "Göster</i> simgesi etkindir." + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "Panel üzerinde kaydırarak çalışma alanını değiştir" + +#~ msgid "Only consider windows of the focused application" +#~ msgstr "Sadece açık olan uygulama penceresini dikkate al" diff --git a/package/po/zh_CN.po b/package/po/zh_CN.po new file mode 100644 index 0000000..c0a743b --- /dev/null +++ b/package/po/zh_CN.po @@ -0,0 +1,524 @@ +# Simplified Chinese translation of dash-to-dock +# Copyright (C) 2013 tuhaihe +# This file is distributed under the same license as the dash-to-dock package. +# tuhaihe <1132321739qq@gmail.com>, 2013. +# 绿色圣光 <lishaohui.qd@163.com>, 2015, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Dock\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-04 12:35+0100\n" +"PO-Revision-Date: 2016-10-02 23:45+0800\n" +"Last-Translator: 绿色圣光 <lishaohui.qd@163.com>\n" +"Language-Team: Chinese (Simplified) <>\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Gtranslator 2.91.7\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: prefs.js:113 +msgid "Primary monitor" +msgstr "主显示器" + +#: prefs.js:122 prefs.js:129 +msgid "Secondary monitor " +msgstr "副显示器" + +#: prefs.js:154 Settings.ui.h:29 +msgid "Right" +msgstr "右侧" + +#: prefs.js:155 Settings.ui.h:26 +msgid "Left" +msgstr "左侧" + +#: prefs.js:205 +msgid "Intelligent autohide customization" +msgstr "智能自动隐藏自定义" + +#: prefs.js:212 prefs.js:393 prefs.js:450 +msgid "Reset to defaults" +msgstr "重置为默认值" + +#: prefs.js:386 +#, fuzzy +msgid "Show dock and application numbers" +msgstr "显示正在运行的应用程序" + +#: prefs.js:443 +msgid "Customize middle-click behavior" +msgstr "自定义中键点击行为" + +#: prefs.js:514 +msgid "Customize running indicators" +msgstr "自定义“运行中”指示器" + +#: appIcons.js:804 +msgid "All Windows" +msgstr "所有窗口" + +#: Settings.ui.h:1 +msgid "Customize indicator style" +msgstr "自定义指示器样式" + +#: Settings.ui.h:2 +msgid "Color" +msgstr "颜色" + +#: Settings.ui.h:3 +msgid "Border color" +msgstr "边框颜色" + +#: Settings.ui.h:4 +msgid "Border width" +msgstr "边框宽度" + +#: Settings.ui.h:5 +msgid "Number overlay" +msgstr "" + +#: Settings.ui.h:6 +msgid "" +"Temporarily show the application numbers over the icons, corresponding to " +"the shortcut." +msgstr "" + +#: Settings.ui.h:7 +#, fuzzy +msgid "Show the dock if it is hidden" +msgstr "显示 dock 于" + +#: Settings.ui.h:8 +msgid "" +"If using autohide, the dock will appear for a short time when triggering the " +"shortcut." +msgstr "" + +#: Settings.ui.h:9 +msgid "Shortcut for the options above" +msgstr "" + +#: Settings.ui.h:10 +msgid "Syntax: <Shift>, <Ctrl>, <Alt>, <Super>" +msgstr "" + +#: Settings.ui.h:11 +msgid "Hide timeout (s)" +msgstr "隐藏超时时间(秒)" + +#: Settings.ui.h:12 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "当设置为最小化时,双击会最小化应用程序的所有窗口。" + +#: Settings.ui.h:13 +msgid "Shift+Click action" +msgstr "Shift+点击动作" + +#: Settings.ui.h:14 +msgid "Raise window" +msgstr "提升窗口" + +#: Settings.ui.h:15 +msgid "Minimize window" +msgstr "最小化窗口" + +#: Settings.ui.h:16 +msgid "Launch new instance" +msgstr "启动新实例" + +#: Settings.ui.h:17 +msgid "Cycle through windows" +msgstr "在窗口间循环" + +#: Settings.ui.h:18 +msgid "Quit" +msgstr "退出" + +#: Settings.ui.h:19 +msgid "Behavior for Middle-Click." +msgstr "中键点击的行为。" + +#: Settings.ui.h:20 +msgid "Middle-Click action" +msgstr "中键点击动作" + +#: Settings.ui.h:21 +msgid "Behavior for Shift+Middle-Click." +msgstr "Shift+中键点击的行为" + +#: Settings.ui.h:22 +msgid "Shift+Middle-Click action" +msgstr "Shift+中键点击动作" + +#: Settings.ui.h:23 +msgid "Show the dock on" +msgstr "显示 dock 于" + +#: Settings.ui.h:24 +#, fuzzy +msgid "Show on all monitors." +msgstr "副显示器" + +#: Settings.ui.h:25 +msgid "Position on screen" +msgstr "屏幕中的位置" + +#: Settings.ui.h:27 +msgid "Bottom" +msgstr "底部" + +#: Settings.ui.h:28 +msgid "Top" +msgstr "顶部" + +#: Settings.ui.h:30 +msgid "" +"Hide the dock when it obstructs a window of the the current application. " +"More refined settings are available." +msgstr "" +"当 dock 会挡住当前应用程序的某个窗口时,将其隐藏。点击右侧设置按钮可以设置更" +"多细节。" + +#: Settings.ui.h:31 +msgid "Intelligent autohide" +msgstr "智能隐藏" + +#: Settings.ui.h:32 +msgid "Dock size limit" +msgstr "Dock 大小限制" + +#: Settings.ui.h:33 +msgid "Panel mode: extend to the screen edge" +msgstr "面板模式:延伸到屏幕边缘" + +#: Settings.ui.h:34 +msgid "Icon size limit" +msgstr "图标大小限制" + +#: Settings.ui.h:35 +msgid "Fixed icon size: scroll to reveal other icons" +msgstr "固定图标大小:滚动显示其它图标" + +#: Settings.ui.h:36 +msgid "Position and size" +msgstr "位置和大小" + +#: Settings.ui.h:37 +msgid "Show favorite applications" +msgstr "显示收藏的应用程序" + +#: Settings.ui.h:38 +msgid "Show running applications" +msgstr "显示正在运行的应用程序" + +#: Settings.ui.h:39 +msgid "Isolate workspaces." +msgstr "隔离工作区。" + +#: Settings.ui.h:40 +msgid "Show open windows previews." +msgstr "" + +#: Settings.ui.h:41 +#, fuzzy +msgid "" +"If disabled, these settings are accessible from gnome-tweak-tool or the " +"extension website." +msgstr "禁用之后,可以通过 gnome-tweak-tool 或者扩展网站来访问设置。" + +#: Settings.ui.h:42 +msgid "Show <i>Applications</i> icon" +msgstr "显示“<i>应用程序</i>”图标" + +#: Settings.ui.h:43 +msgid "Move the applications button at the beginning of the dock." +msgstr "将应用程序按钮移至 dock 的起始位置。" + +#: Settings.ui.h:44 +msgid "Animate <i>Show Applications</i>." +msgstr "动画“<i>显示应用程序</i>”。" + +#: Settings.ui.h:45 +msgid "Launchers" +msgstr "" + +#: Settings.ui.h:46 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" + +#: Settings.ui.h:47 +msgid "Use keyboard shortcuts to activate apps" +msgstr "" + +#: Settings.ui.h:48 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "点击一个正在运行的应用程序图标时的行为。" + +#: Settings.ui.h:49 +msgid "Click action" +msgstr "点击动作" + +#: Settings.ui.h:50 +msgid "Minimize" +msgstr "最小化" + +#: Settings.ui.h:51 +#, fuzzy +msgid "Minimize or overview" +msgstr "最小化窗口" + +#: Settings.ui.h:52 +#, fuzzy +msgid "Behaviour when scrolling on the icon of an application." +msgstr "点击一个正在运行的应用程序图标时的行为。" + +#: Settings.ui.h:53 +#, fuzzy +msgid "Scroll action" +msgstr "点击动作" + +#: Settings.ui.h:54 +msgid "Do nothing" +msgstr "无动作" + +#: Settings.ui.h:55 +#, fuzzy +msgid "Switch workspace" +msgstr "一次切换一个工作区" + +#: Settings.ui.h:56 +msgid "Behavior" +msgstr "行为" + +#: Settings.ui.h:57 +msgid "" +"Few customizations meant to integrate the dock with the default GNOME theme. " +"Alternatively, specific options can be enabled below." +msgstr "" +"几个自定义项可以将 dock 整合到默认 GNOME 主题中。或者,也可以启动下面的几个特" +"殊选项。" + +#: Settings.ui.h:58 +msgid "Use built-in theme" +msgstr "使用内置主题" + +#: Settings.ui.h:59 +msgid "Save space reducing padding and border radius." +msgstr "减小填充和边框半径以节省空间。" + +#: Settings.ui.h:60 +msgid "Shrink the dash" +msgstr "收缩 dash" + +#: Settings.ui.h:61 +msgid "Show a dot for each windows of the application." +msgstr "为应用程序的每个窗口显示一个点。" + +#: Settings.ui.h:62 +msgid "Show windows counter indicators" +msgstr "显示窗口个数指示器" + +#: Settings.ui.h:63 +msgid "Set the background color for the dash." +msgstr "设置 dash 的背景颜色。" + +#: Settings.ui.h:64 +msgid "Customize the dash color" +msgstr "自定义 dash 颜色" + +#: Settings.ui.h:65 +msgid "Tune the dash background opacity." +msgstr "调整 dash 的背景透明度。" + +#: Settings.ui.h:66 +msgid "Customize opacity" +msgstr "自定义透明度" + +#: Settings.ui.h:67 +msgid "Opacity" +msgstr "不透明度" + +#: Settings.ui.h:68 +msgid "Force straight corner\n" +msgstr "" + +#: Settings.ui.h:70 +msgid "Appearance" +msgstr "外观" + +#: Settings.ui.h:71 +msgid "version: " +msgstr "版本:" + +#: Settings.ui.h:72 +msgid "Moves the dash out of the overview transforming it in a dock" +msgstr "让 dash 跳出概览之外,转化为一个 dock" + +#: Settings.ui.h:73 +msgid "Created by" +msgstr "作者:" + +#: Settings.ui.h:74 +msgid "Webpage" +msgstr "网站主页" + +#: Settings.ui.h:75 +msgid "" +"<span size=\"small\">This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" +"\">GNU General Public License, version 2 or later</a> for details.</span>" +msgstr "" +"<span size=\"small\">本程序不提供任何担保。\n" +"参见 <a href=\"https://www.gnu.org/licenses/old-licenses/gpl-2.0.html\">GNU " +"通用公共许可证,第二版或更高版本</a>以了解更多细节。</span>" + +#: Settings.ui.h:77 +msgid "About" +msgstr "关于" + +#: Settings.ui.h:78 +msgid "Show the dock by mouse hover on the screen edge." +msgstr "鼠标移至屏幕边缘时显示 dock" + +#: Settings.ui.h:79 +msgid "Autohide" +msgstr "自动隐藏" + +#: Settings.ui.h:80 +msgid "Push to show: require pressure to show the dock" +msgstr "推压以显示:需要一定压力来显示 dock" + +#: Settings.ui.h:81 +msgid "Enable in fullscreen mode" +msgstr "在全屏模式下启用" + +#: Settings.ui.h:82 +msgid "Show the dock when it doesn't obstruct application windows." +msgstr "在不妨碍应用程序窗口时,显示 dock。" + +#: Settings.ui.h:83 +msgid "Dodge windows" +msgstr "避开窗口" + +#: Settings.ui.h:84 +msgid "All windows" +msgstr "所有窗口" + +#: Settings.ui.h:85 +msgid "Only focused application's windows" +msgstr "仅焦点程序窗口" + +#: Settings.ui.h:86 +msgid "Only maximized windows" +msgstr "仅最大化窗口" + +#: Settings.ui.h:87 +msgid "Animation duration (s)" +msgstr "动画持续时间(秒)" + +#: Settings.ui.h:88 +msgid "0.000" +msgstr "0.000" + +#: Settings.ui.h:89 +msgid "Show timeout (s)" +msgstr "显示超时时间(秒)" + +#: Settings.ui.h:90 +msgid "Pressure threshold" +msgstr "压力阈值" + +#~ msgid "" +#~ "With fixed icon size, only the edge of the dock and the <i>Show " +#~ "Applications</i> icon are active." +#~ msgstr "" +#~ "如果固定了图标大小,只有 dock 边缘和“<i>显示应用程序</i>”图标会激活该功" +#~ "能。" + +#~ msgid "Switch workspace by scrolling on the dock" +#~ msgstr "通过滚动 dock 来切换工作区" + +#~ msgid "Main Settings" +#~ msgstr "主设置" + +#~ msgid "Dock is fixed and always visible" +#~ msgstr "Dock 固定且总是可见" + +#~ msgid "Show delay [ms]" +#~ msgstr "显示延迟(毫秒)" + +#~ msgid "Hide delay [ms]" +#~ msgstr "隐藏延迟(毫秒)" + +#~ msgid "Application based intellihide" +#~ msgstr "应用程序基于智能隐藏" + +#~ msgid "Show the dock on following monitor (if attached)" +#~ msgstr "Dock 将在如下显示器显示(如果已连接)" + +#~ msgid "Primary (default)" +#~ msgstr "主显示器(默认)" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "Max height" +#~ msgstr "最大高度" + +#~ msgid "Expand (experimental and buggy)" +#~ msgstr "全部展开(实验阶段且存在问题)" + +#~ msgid "Maximum icon size" +#~ msgstr "最大图标尺寸" + +#~ msgid "16" +#~ msgstr "16" + +#~ msgid "24" +#~ msgstr "24" + +#~ msgid "32" +#~ msgstr "32" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "64" +#~ msgstr "64" + +#~ msgid "Optional features" +#~ msgstr "可选功能" + +#~ msgid "Only a 1px wide area close to the screen edge is active" +#~ msgstr "仅当靠近屏幕边缘1像素宽区域时启用" + +#~ msgid "All the area of the dock is active" +#~ msgstr "Dock 全部区域时启用" + +#~ msgid "Customize actions on mouse click" +#~ msgstr "自定义鼠标点击动作" + +#~ msgid "Action on clicking on running app" +#~ msgstr "点击正在运行程序的动作" + +#~ msgid "Minimize window on shift+click (double click for all app windows)" +#~ msgstr "当按下“Shift+单击”(双击适用于全部程序窗口)时最小化窗口" + +#~ msgid "Only when in autohide" +#~ msgstr "仅当自动隐藏时" diff --git a/package/prefs.js b/package/prefs.js new file mode 100644 index 0000000..5f1f378 --- /dev/null +++ b/package/prefs.js @@ -0,0 +1,705 @@ +// -*- 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 Lang = imports.lang; +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 Convenience = Me.imports.convenience; + +const SCALE_UPDATE_TIMEOUT = 500; +const DEFAULT_ICONS_SIZES = [ 128, 96, 64, 48, 32, 24, 16 ]; + +/** + * 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', []); + } +} + +const Settings = new Lang.Class({ + Name: 'DashToDock.Settings', + + _init: function() { + this._settings = Convenience.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 = this._builder.get_object('settings_notebook'); + + // 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(Lang.bind(this, this._connector)); + }, + + /** + * Connect signals + */ + _connector: function(builder, object, signal, handler) { + object.connect(signal, Lang.bind(this, this._SignalHandler[handler])); + }, + + _bindSettings: function() { + // 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', Lang.bind(this, function() { + + 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', Lang.bind(this, function(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-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', Lang.bind (this, function(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', Lang.bind (this, function(widget) { + this._settings.set_enum('scroll-action', widget.get_active()); + })); + + this._builder.get_object('shift_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_enum('shift-click-action', widget.get_active()); + })); + + this._builder.get_object('middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_enum('middle-click-action', widget.get_active()); + })); + this._builder.get_object('shift_middle_click_action_combo').connect('changed', Lang.bind (this, function(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', Lang.bind(this, function() { + + 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', Lang.bind(this, function() {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', Lang.bind(this, function(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', Lang.bind(this, function() { + + 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', Lang.bind(this, function(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); + + this._settings.bind('custom-theme-running-dots', + this._builder.get_object('running_dots_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + this._settings.bind('custom-theme-running-dots', + this._builder.get_object('running_dots_advance_settings_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + // Create dialog for running dots advanced settings + this._builder.get_object('running_dots_advance_settings_button').connect('clicked', Lang.bind(this, function() { + + 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('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', Lang.bind(this, function(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', Lang.bind(this, function(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', Lang.bind(this, function(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', Lang.bind(this, function(button) { + let rgba = button.get_rgba(); + let css = rgba.to_string(); + let hexString = cssHexString(css); + this._settings.set_string('background-color', hexString); + })); + + this._settings.bind('opaque-background', this._builder.get_object('customize_opacity_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); + this._builder.get_object('custom_opacity_scale').set_value(this._settings.get_double('background-opacity')); + this._settings.bind('opaque-background', this._builder.get_object('custom_opacity'), 'sensitive', 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()); + }, + + /** + * Object containing all signals defined in the glade file + */ + _SignalHandler: { + dock_display_combo_changed_cb: function(combo) { + this._settings.set_int('preferred-monitor', this._monitors[combo.get_active()]); + }, + + position_top_button_toggled_cb: function(button) { + if (button.get_active()) + this._settings.set_enum('dock-position', 0); + }, + + position_right_button_toggled_cb: function(button) { + if (button.get_active()) + this._settings.set_enum('dock-position', 1); + }, + + position_bottom_button_toggled_cb: function(button) { + if (button.get_active()) + this._settings.set_enum('dock-position', 2); + }, + + position_left_button_toggled_cb: function(button) { + if (button.get_active()) + this._settings.set_enum('dock-position', 3); + }, + + icon_size_combo_changed_cb: function(combo) { + this._settings.set_int('dash-max-icon-size', this._allIconSizes[combo.get_active()]); + }, + + dock_size_scale_format_value_cb: function(scale, value) { + return Math.round(value*100)+ ' %'; + }, + + dock_size_scale_value_changed_cb: function(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, Lang.bind(this, function() { + this._settings.set_double('height-fraction', scale.get_value()); + this._dock_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + }, + + icon_size_scale_format_value_cb: function(scale, value) { + return value+ ' px'; + }, + + icon_size_scale_value_changed_cb: function(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, Lang.bind(this, function() { + 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: function(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, Lang.bind(this, function() { + this._settings.set_double('background-opacity', scale.get_value()); + this._opacity_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + }, + + custom_opacity_scale_format_value_cb: function(scale, value) { + return Math.round(value*100) + ' %'; + }, + + all_windows_radio_button_toggled_cb: function(button) { + if (button.get_active()) + this._settings.set_enum('intellihide-mode', 0); + }, + + focus_application_windows_radio_button_toggled_cb: function(button) { + if (button.get_active()) + this._settings.set_enum('intellihide-mode', 1); + }, + + maximized_windows_radio_button_toggled_cb: function(button) { + if (button.get_active()) + this._settings.set_enum('intellihide-mode', 2); + } + } +}); + +function init() { + Convenience.initTranslations(); +} + +function buildPrefsWidget() { + let settings = new Settings(); + let widget = settings.widget; + widget.show_all(); + return widget; +} diff --git a/package/schemas/org.gnome.shell.extensions.dash-to-dock.gschema.xml b/package/schemas/org.gnome.shell.extensions.dash-to-dock.gschema.xml new file mode 100644 index 0000000..0f43bd7 --- /dev/null +++ b/package/schemas/org.gnome.shell.extensions.dash-to-dock.gschema.xml @@ -0,0 +1,713 @@ +<?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='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> + <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 type="b" name="opaque-background"> + <default>false</default> + <summary>Dash background is opaque</summary> + <description>Makes the background of the dash opaque improving readability when in autohide mode.</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-running-dots"> + <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-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="customize-click"> + <default>true</default> + <summary>Customize click behaviour</summary> + <description>Customize action on various mouse events</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 shit+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="app-ctrl-hotkey-kp-1" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_1']]]></default> + <summary>Keybinding to launch 1st dash app</summary> + <description> + Keybinding to launch 1st app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-2" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_2']]]></default> + <summary>Keybinding to launch 2nd dash app</summary> + <description> + Keybinding to launch 2nd app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-3" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_3']]]></default> + <summary>Keybinding to launch 3rd dash app</summary> + <description> + Keybinding to launch 3rd app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-4" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_4']]]></default> + <summary>Keybinding to launch 4th dash app</summary> + <description> + Keybinding to launch 4th app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-5" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_5']]]></default> + <summary>Keybinding to launch 5th dash app</summary> + <description> + Keybinding to launch 5th app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-6" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_6']]]></default> + <summary>Keybinding to launch 6th dash app</summary> + <description> + Keybinding to launch 6th app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-7" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_7']]]></default> + <summary>Keybinding to launch 7th dash app</summary> + <description> + Keybinding to launch 7th app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-8" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_8']]]></default> + <summary>Keybinding to launch 8th dash app</summary> + <description> + Keybinding to launch 8th app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-9" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_9']]]></default> + <summary>Keybinding to launch 9th dash app</summary> + <description> + Keybinding to launch 9th app. + </description> + </key> + <key name="app-ctrl-hotkey-kp-10" type="as"> + <default><![CDATA[['<Ctrl><Super>KP_0']]]></default> + <summary>Keybinding to launch 10th dash app</summary> + <description> + Keybinding to launch 10th app. + </description> + </key> + <key name="app-shift-hotkey-kp-1" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-2" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-3" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-4" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-5" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-6" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-7" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-8" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-9" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-10" type="as"> + <default><![CDATA[['<Shift><Super>KP_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-kp-1" type="as"> + <default><![CDATA[['<Super>KP_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-kp-2" type="as"> + <default><![CDATA[['<Super>KP_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-kp-3" type="as"> + <default><![CDATA[['<Super>KP_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-kp-4" type="as"> + <default><![CDATA[['<Super>KP_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-kp-5" type="as"> + <default><![CDATA[['<Super>KP_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-kp-6" type="as"> + <default><![CDATA[['<Super>KP_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-kp-7" type="as"> + <default><![CDATA[['<Super>KP_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-kp-8" type="as"> + <default><![CDATA[['<Super>KP_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-kp-9" type="as"> + <default><![CDATA[['<Super>KP_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-kp-10" type="as"> + <default><![CDATA[['<Super>KP_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> + </schema> +</schemalist> diff --git a/package/stylesheet.css b/package/stylesheet.css new file mode 100644 index 0000000..6e9bf38 --- /dev/null +++ b/package/stylesheet.css @@ -0,0 +1,109 @@ +/* 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; + border-radius: 0px 9px 9px 0px; +} + + +#dashtodockContainer.shrink.right #dash, +#dashtodockContainer.dashtodock.right #dash { + border-right: 0px; + border-radius: 9px 0px 0px 9px; +} + + +#dashtodockContainer.shrink.top #dash, +#dashtodockContainer.dashtodock.top #dash { + border-top: 0px; + border-radius: 0px 0px 9px 9px; +} + +#dashtodockContainer.shrink.bottom #dash, +#dashtodockContainer.dashtodock.bottom #dash { + border-bottom: 0px; + border-radius: 9px 9px 0px 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.1); +} + +#dashtodockContainer.dashtodock #dash { + background: #2e3436; +} + +#dashtodockContainer .number-overlay { + color: rgba(255,255,255,1); + background-color: rgba(0,0,0,0.8); + text-align: center; +} + +#dashtodockPreviewSeparator.popup-separator-menu-item-horizontal { + width: 1px; + height: auto; + border-right-width: 1px; + margin: 32px 0px; +} diff --git a/package/theming.js b/package/theming.js new file mode 100644 index 0000000..0a306b4 --- /dev/null +++ b/package/theming.js @@ -0,0 +1,293 @@ +// -*- 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 Lang = imports.lang; +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 Tweener = imports.ui.tweener; +const Util = imports.misc.util; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; + +/** + * Manage theme customization and custom theme support + */ +const ThemeManager = new Lang.Class({ + Name: 'DashToDock.ThemeManager', + + _init: function(settings, actor, dash) { + this._settings = settings; + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._bindSettingsChanges(); + this._actor = actor; + this._dash = 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._signalsHandler.add([ + // When theme changes re-obtain default background color + St.ThemeContext.get_for_stage (global.stage), + 'changed', + Lang.bind(this, this.updateCustomTheme) + ], [ + // update :overview pseudoclass + Main.overview, + 'showing', + Lang.bind(this, this._onOverviewShowing) + ], [ + Main.overview, + 'hiding', + Lang.bind(this, this._onOverviewHiding) + ]); + + this._updateCustomStyleClasses(); + + // destroy themeManager when the managed actor is destroyed (e.g. extension unload) + // in order to disconnect signals + this._actor.connect('destroy', Lang.bind(this, this.destroy)); + + }, + + destroy: function() { + this._signalsHandler.destroy(); + }, + + _onOverviewShowing: function() { + this._actor.add_style_pseudo_class('overview'); + }, + + _onOverviewHiding: function() { + this._actor.remove_style_pseudo_class('overview'); + }, + + _updateDashOpacity: function() { + let newAlpha = this._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: function() { + // 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(this._settings); + let side = position + 2; + if (side > 3) + side = Math.abs(side - 4); + + let borderColor = themeNode.get_border_color(side); + + return [backgroundColor, borderColor]; + }, + + _updateDashColor: function() { + if (this._settings.get_boolean('custom-background-color')) { + let [backgroundColor, borderColor] = this._getDefaultColors(); + + if (backgroundColor==null) + return; + + let newAlpha = Math.round(backgroundColor.alpha/2.55)/100; + if (this._settings.get_boolean('opaque-background')) + newAlpha = this._settings.get_double('background-opacity'); + + let newColor = Clutter.color_from_string(this._settings.get_string('background-color'))[1]; + this._customizedBackground = 'rgba(' + + newColor.red + ',' + + newColor.green + ',' + + newColor.blue + ',' + + newAlpha + ')'; + + this._customizedBorder = this._customizedBackground; + } + }, + + _updateCustomStyleClasses: function() { + if (this._settings.get_boolean('apply-custom-theme')) + this._actor.add_style_class_name('dashtodock'); + else + this._actor.remove_style_class_name('dashtodock'); + + if (this._settings.get_boolean('custom-theme-shrink')) + this._actor.add_style_class_name('shrink'); + else + this._actor.remove_style_class_name('shrink'); + + if (this._settings.get_boolean('custom-theme-running-dots')) + 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 (!this._settings.get_boolean('apply-custom-theme')) { + if (this._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: function() { + this._updateCustomStyleClasses(); + this._updateDashOpacity(); + this._updateDashColor(); + this._adjustTheme(); + this._dash._redisplay(); + }, + + /** + * Reimported back and adapted from atomdock + */ + _adjustTheme: function() { + // 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; + + // Remove prior style edits + this._dash._container.set_style(null); + + // If built-in theme is enabled do nothing else + if (this._settings.get_boolean('apply-custom-theme')) + return; + + let newStyle = ''; + let position = Utils.getPosition(this._settings); + + if (!this._settings.get_boolean('custom-theme-shrink')) { + // 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 + if (this._settings.get_boolean('opaque-background') || this._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: function() { + let keys = ['opaque-background', + '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([ + this._settings, + 'changed::' + key, + Lang.bind(this, this.updateCustomTheme) + ]); + }, this); + } +}); diff --git a/package/utils.js b/package/utils.js new file mode 100644 index 0000000..b98fe45 --- /dev/null +++ b/package/utils.js @@ -0,0 +1,123 @@ +const Clutter = imports.gi.Clutter; +const Lang = imports.lang; +const St = imports.gi.St; + +/** + * Simplify global signals and function injections handling + * abstract class + */ +const BasicHandler = new Lang.Class({ + Name: 'DashToDock.BasicHandler', + + _init: function() { + this._storage = new Object(); + }, + + add: function(/* 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: function() { + for( let label in this._storage ) + this.removeWithLabel(label); + }, + + addWithLabel: function(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++) { + this._storage[label].push( this._create(arguments[i])); + } + }, + + removeWithLabel: function(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: function(item) { + throw new Error('no implementation of _create in ' + this); + }, + + /** + * Correctly delete single element + */ + _remove: function(item) { + throw new Error('no implementation of _remove in ' + this); + } +}); + +/** + * Manage global signals + */ +const GlobalSignalsHandler = new Lang.Class({ + Name: 'DashToDock.GlobalSignalHandler', + Extends: BasicHandler, + + _create: function(item) { + let object = item[0]; + let event = item[1]; + let callback = item[2] + let id = object.connect(event, callback); + + return [object, id]; + }, + + _remove: function(item) { + item[0].disconnect(item[1]); + } +}); + +/** + * Manage function injection: both instances and prototype can be overridden + * and restored + */ +const InjectionsHandler = new Lang.Class({ + Name: 'DashToDock.InjectionsHandler', + Extends: BasicHandler, + + _create: function(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: function(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(settings) { + let position = 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; +} diff --git a/package/windowPreview.js b/package/windowPreview.js new file mode 100644 index 0000000..4f84b4d --- /dev/null +++ b/package/windowPreview.js @@ -0,0 +1,595 @@ +/* + * 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 Lang = imports.lang; +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 Tweener = imports.ui.tweener; +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 WindowPreviewMenu = new Lang.Class({ + Name: 'WindowPreviewMenu', + Extends: PopupMenu.PopupMenu, + + _init: function(source, settings) { + this._dtdSettings = settings; + + let side = Utils.getPosition(settings); + + this.parent(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', Lang.bind(this, function () { + if (!this._source.actor.mapped) + this.close(); + })); + this._destroyId = this._source.actor.connect('destroy', Lang.bind(this, this.destroy)); + + Main.uiGroup.add_actor(this.actor); + + // Change the initialized side where required. + this._arrowSide = side; + this._boxPointer._arrowSide = side; + this._boxPointer._userArrowSide = side; + + this._previewBox = new WindowPreviewList(this._source, this._dtdSettings); + this.addMenuItem(this._previewBox); + }, + + _redisplay: function() { + this._previewBox._shownInitially = false; + this._previewBox._redisplay(); + }, + + popup: function() { + 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'); + } + }, + + destroy: function () { + if (this._mappedId) + this._source.actor.disconnect(this._mappedId); + + if (this._destroyId) + this._source.actor.disconnect(this._destroyId); + + this.parent(); + } + +}); + +const WindowPreviewList = new Lang.Class({ + Name: 'WindowPreviewMenuSection', + Extends: PopupMenu.PopupMenuSection, + + _init: function(source, settings) { + this._dtdSettings = settings; + + this.parent(); + + this.actor = new St.ScrollView({ name: 'dashtodockWindowScrollview', + hscrollbar_policy: Gtk.PolicyType.AUTOMATIC, + vscrollbar_policy: Gtk.PolicyType.AUTOMATIC, + enable_mouse_scrolling: true }); + + this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent )); + + let position = Utils.getPosition(this._dtdSettings); + 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, Lang.bind(this, this._redisplay)); + + this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); + this._stateChangedId = this.app.connect('windows-changed', + Lang.bind(this, + this._queueRedisplay)); + }, + + _queueRedisplay: function () { + Main.queueDeferredWork(this._redisplayId); + }, + + _onScrollEvent: function(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: function() { + this.app.disconnect(this._stateChangedId); + this._stateChangedId = 0; + }, + + _createPreviewItem: function(window) { + let preview = new WindowPreviewMenuItem(window); + return preview; + }, + + _redisplay: function () { + // Remove separator + let nonWinItem = this._getMenuItems().filter(function(actor) { + return !actor._window; + }); + for (let i = 0; i < nonWinItem.length; i++) { + let item = nonWinItem[i]; + item.destroy(); + } + + 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 + let newWin = this._source.getInterestingWindows().sort(this.sortWindowsCompareFunction); + + 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(); + } + + // Separate windows from other workspaces + let ws_index = global.screen.get_active_workspace_index(); + let separator_index = 0; + for (let i = 0; i < newWin.length; i++) + if (newWin[i].get_workspace().index() == ws_index) + separator_index++; + + if (separator_index > 0 && separator_index !== newWin.length) { + let separatorItem = new PopupMenu.PopupSeparatorMenuItem(); + if (this.isHorizontal) { + separatorItem._separator.set_x_expand(false); + separatorItem._separator.set_y_expand(true); + separatorItem._separator.set_name('dashtodockPreviewSeparator'); + separatorItem._separator.add_style_class_name('popup-separator-menu-item-horizontal'); + separatorItem._separator.set_x_align(Clutter.ActorAlign.CENTER); + separatorItem._separator.set_y_align(Clutter.ActorAlign.FILL); + } + this.addMenuItem(separatorItem, separator_index); + } + + // 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); + }, + + isAnimatingOut: function() { + return this.actor.get_children().reduce(function(result, actor) { + return result || actor.animatingOut; + }, false); + }, + + sortWindowsCompareFunction: function(windowA, windowB) { + let ws_index = global.screen.get_active_workspace_index(); + let winA_inActiveWS = windowA.get_workspace().index() == ws_index; + let winB_inActiveWS = windowB.get_workspace().index() == ws_index; + + // Only change the order if winA is not in the current WS, while winB is + if (!winA_inActiveWS && winB_inActiveWS) + return 1; + + return 0; + } +}); + +const WindowPreviewMenuItem = new Lang.Class({ + Name: 'WindowPreviewMenuItem', + Extends: PopupMenu.PopupBaseMenuItem, + + _init: function(window, params) { + this._window = window; + this._destroyId = 0; + this._windowAddedId = 0; + params = Params.parse(params, { style_class: 'app-well-preview-menu-item' }); + this.parent(params); + + 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: 5px'); + + this.closeButton = new St.Button({ style_class: 'window-close', + x_expand: true, + y_expand: true}); + this.closeButton.set_x_align(Clutter.ActorAlign.END); + this.closeButton.set_y_align(Clutter.ActorAlign.START); + + + this.closeButton.opacity = 0; + this.closeButton.connect('clicked', Lang.bind(this, this._closeWindow)); + + 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', Lang.bind(this, function() { + 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.actor.add_actor(box); + + this.actor.connect('enter-event', + Lang.bind(this, this._onEnter)); + this.actor.connect('leave-event', + Lang.bind(this, this._onLeave)); + this.actor.connect('key-focus-in', + Lang.bind(this, this._onEnter)); + this.actor.connect('key-focus-out', + Lang.bind(this, this._onLeave)); + + this._cloneTexture(window); + + }, + + _cloneTexture: function(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_texture().get_size()[0]) { + let id = Mainloop.idle_add(Lang.bind(this, + function () { + // Check if there's still a point in getting the texture, + // otherwise this could go on indefinitely + if (this.actor && metaWin.get_workspace()) + this._cloneTexture(metaWin); + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(id, '[dash-to-dock] this._cloneTexture'); + return; + } + + let windowTexture = mutterWindow.get_texture(); + let [width, height] = windowTexture.get_size(); + + let scale = Math.min(1.0, PREVIEW_MAX_WIDTH/width, PREVIEW_MAX_HEIGHT/height); + + let clone = new Clutter.Clone ({ source: windowTexture, + 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', Lang.bind(this, function() { + 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); + }, + + _windowCanClose: function() { + return this._window.can_close() && + !this._hasAttachedDialogs(); + }, + + _closeWindow: function(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', + Lang.bind(this, + this._onWindowAdded)); + + this.deleteAllWindows(); + }, + + deleteAllWindows: function() { + // 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: function(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 id = Mainloop.idle_add(Lang.bind(this, + function() { + this.emit('activate'); + return GLib.SOURCE_REMOVE; + })); + GLib.Source.set_name_by_id(id, '[dash-to-dock] this.emit'); + } + }, + + _hasAttachedDialogs: function() { + // count trasient windows + let n=0; + this._window.foreach_transient(function(){n++;}); + return n>0; + }, + + _onEnter: function() { + this._showCloseButton(); + return Clutter.EVENT_PROPAGATE; + }, + + _onLeave: function() { + if (!this._cloneBin.has_pointer && + !this.closeButton.has_pointer) + this._hideCloseButton(); + + return Clutter.EVENT_PROPAGATE; + }, + + _idleToggleCloseButton: function() { + this._idleToggleCloseId = 0; + + if (!this._cloneBin.has_pointer && + !this.closeButton.has_pointer) + this._hideCloseButton(); + + return GLib.SOURCE_REMOVE; + }, + + _showCloseButton: function() { + + if (this._windowCanClose()) { + this.closeButton.show(); + Tweener.addTween(this.closeButton, + { opacity: 255, + time: Workspace.CLOSE_BUTTON_FADE_TIME, + transition: 'easeOutQuad' }); + } + }, + + _hideCloseButton: function() { + Tweener.addTween(this.closeButton, + { opacity: 0, + time: Workspace.CLOSE_BUTTON_FADE_TIME, + transition: 'easeInQuad' }); + }, + + show: function(animate) { + let fullWidth = this.actor.get_width(); + + this.actor.opacity = 0; + this.actor.set_width(0); + + let time = animate ? 0.25 : 0; + Tweener.addTween(this.actor, + { opacity: 255, + width: fullWidth, + time: time, + transition: 'easeInOutQuad' + }); + }, + + _animateOutAndDestroy: function() { + Tweener.addTween(this.actor, + { opacity: 0, + time: 0.25, + }); + + Tweener.addTween(this.actor, + { height: 0, + width: 0, + time: 0.25, + delay: 0.25, + onCompleteScope: this, + onComplete: function() { + this.actor.destroy(); + } + }); + }, + + activate: function() { + this._getTopMenu().close(); + Main.activateWindow(this._window); + }, + + _onDestroy: function() { + + this.parent(); + + 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; + } + } + +}); + -- GitLab