From 2b373180100d5dc66a37ea003dad0b916abcd795 Mon Sep 17 00:00:00 2001 From: Artyom Zorin Date: Wed, 21 Jul 2021 13:26:56 +0100 Subject: [PATCH] Fixed notification badge sizing on 200% scaled displays --- .gitignore | 7 + Makefile | 96 + README.md | 2 +- Settings.ui | 3159 +++++++++++++++++ appIcons.js | 1736 +++++++++ convenience.js | 136 +- debian/changelog | 328 ++ debian/control | 13 + debian/copyright | 73 + debian/install | 1 + debian/rules | 9 + debian/source/format | 1 + extension.js | 229 +- img/show-desktop-symbolic.svg | 198 ++ intellihide.js | 441 +++ metadata.json | 7 +- overview.js | 396 +++ panel.js | 1446 ++++++++ panelManager.js | 927 +++++ panelPositions.js | 73 + panelStyle.js | 176 + po/af.po | 14 + po/an.po | 17 + po/ar.po | 17 + po/as.po | 17 + po/ast.po | 14 + po/az.po | 11 + po/be.po | 17 + po/be@latin.po | 11 + po/bg.po | 17 + po/bn.po | 14 + po/bn_IN.po | 17 + po/bo.po | 11 + po/br.po | 11 + po/bs.po | 17 + po/ca.po | 17 + po/ca@valencia.po | 17 + po/ckb.po | 14 + po/crh.po | 14 + po/cs.po | 1311 +++++++ po/cy.po | 11 + po/da.po | 17 + po/de.po | 1297 +++++++ po/dz.po | 11 + po/el.po | 17 + po/eo.po | 17 + po/es.po | 1343 +++++++ po/et.po | 17 + po/eu.po | 17 + po/fa.po | 17 + po/fi.po | 17 + po/fr.po | 1426 ++++++++ po/fur.po | 17 + po/ga.po | 17 + po/gd.po | 17 + po/gl.po | 1312 +++++++ po/gu.po | 17 + po/he.po | 17 + po/hi.po | 17 + po/hr.po | 17 + po/hu.po | 1305 +++++++ po/id.po | 17 + po/is.po | 17 + po/it.po | 1433 ++++++++ po/ja.po | 1455 ++++++++ po/ka.po | 11 + po/kab.po | 11 + po/kk.po | 609 ++++ po/km.po | 11 + po/kn.po | 17 + po/ko.po | 17 + po/ku.po | 11 + po/ky.po | 14 + po/li.po | 11 + po/ln.po | 11 + po/lt.po | 17 + po/lv.po | 17 + po/mai.po | 11 + po/mg.po | 11 + po/mjw.po | 14 + po/mk.po | 14 + po/ml.po | 17 + po/mn.po | 11 + po/mr.po | 17 + po/ms.po | 17 + po/nb.po | 17 + po/nds.po | 11 + po/ne.po | 17 + po/nl.po | 17 + po/nn.po | 14 + po/oc.po | 17 + po/or.po | 17 + po/pa.po | 17 + po/pl.po | 1321 +++++++ po/ps.po | 11 + po/pt.po | 17 + po/pt_BR.po | 475 +++ po/ro.po | 17 + po/ru.po | 1419 ++++++++ po/si.po | 14 + po/sk.po | 17 + po/sl.po | 17 + po/sq.po | 11 + po/sr.po | 17 + po/sr@latin.po | 17 + po/sv.po | 1296 +++++++ po/ta.po | 17 + po/te.po | 17 + po/tg.po | 17 + po/th.po | 17 + po/tr.po | 1319 +++++++ po/ug.po | 17 + po/uk.po | 461 +++ po/vi.po | 17 + po/yo.po | 11 + po/zh_CN.po | 1311 +++++++ po/zh_HK.po | 17 + po/zh_TW.po | 1079 ++++++ prefs.js | 1037 ++++++ progress.js | 600 ++++ proximity.js | 265 ++ ...shell.extensions.zorin-taskbar.gschema.xml | 777 ++++ secondaryMenu.js | 87 - stylesheet.css | 115 +- taskbar.js | 1662 ++++----- transparency.js | 175 + utils.js | 1035 ++++++ windowPreview.js | 1588 ++++++--- 128 files changed, 36429 insertions(+), 1754 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 Settings.ui create mode 100644 appIcons.js create mode 100644 debian/changelog create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/install create mode 100755 debian/rules create mode 100644 debian/source/format create mode 100644 img/show-desktop-symbolic.svg create mode 100644 intellihide.js mode change 100755 => 100644 metadata.json create mode 100644 overview.js create mode 100644 panel.js create mode 100755 panelManager.js create mode 100644 panelPositions.js create mode 100644 panelStyle.js create mode 100644 po/af.po create mode 100644 po/an.po create mode 100644 po/ar.po create mode 100644 po/as.po create mode 100644 po/ast.po create mode 100644 po/az.po create mode 100644 po/be.po create mode 100644 po/be@latin.po create mode 100644 po/bg.po create mode 100644 po/bn.po create mode 100644 po/bn_IN.po create mode 100644 po/bo.po create mode 100644 po/br.po create mode 100644 po/bs.po create mode 100644 po/ca.po create mode 100644 po/ca@valencia.po create mode 100644 po/ckb.po create mode 100644 po/crh.po create mode 100644 po/cs.po create mode 100644 po/cy.po create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/dz.po create mode 100644 po/el.po create mode 100644 po/eo.po create mode 100644 po/es.po create mode 100644 po/et.po create mode 100644 po/eu.po create mode 100644 po/fa.po create mode 100644 po/fi.po create mode 100644 po/fr.po create mode 100644 po/fur.po create mode 100644 po/ga.po create mode 100644 po/gd.po create mode 100644 po/gl.po create mode 100644 po/gu.po create mode 100644 po/he.po create mode 100644 po/hi.po create mode 100644 po/hr.po create mode 100644 po/hu.po create mode 100644 po/id.po create mode 100644 po/is.po create mode 100644 po/it.po create mode 100644 po/ja.po create mode 100644 po/ka.po create mode 100644 po/kab.po create mode 100644 po/kk.po create mode 100644 po/km.po create mode 100644 po/kn.po create mode 100644 po/ko.po create mode 100644 po/ku.po create mode 100644 po/ky.po create mode 100644 po/li.po create mode 100644 po/ln.po create mode 100644 po/lt.po create mode 100644 po/lv.po create mode 100644 po/mai.po create mode 100644 po/mg.po create mode 100644 po/mjw.po create mode 100644 po/mk.po create mode 100644 po/ml.po create mode 100644 po/mn.po create mode 100644 po/mr.po create mode 100644 po/ms.po create mode 100644 po/nb.po create mode 100644 po/nds.po create mode 100644 po/ne.po create mode 100644 po/nl.po create mode 100644 po/nn.po create mode 100644 po/oc.po create mode 100644 po/or.po create mode 100644 po/pa.po create mode 100644 po/pl.po create mode 100644 po/ps.po create mode 100644 po/pt.po create mode 100644 po/pt_BR.po create mode 100644 po/ro.po create mode 100644 po/ru.po create mode 100644 po/si.po create mode 100644 po/sk.po create mode 100644 po/sl.po create mode 100644 po/sq.po create mode 100644 po/sr.po create mode 100644 po/sr@latin.po create mode 100644 po/sv.po create mode 100644 po/ta.po create mode 100644 po/te.po create mode 100644 po/tg.po create mode 100644 po/th.po create mode 100644 po/tr.po create mode 100644 po/ug.po create mode 100644 po/uk.po create mode 100644 po/vi.po create mode 100644 po/yo.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_HK.po create mode 100644 po/zh_TW.po create mode 100644 prefs.js create mode 100644 progress.js create mode 100644 proximity.js create mode 100644 schemas/org.gnome.shell.extensions.zorin-taskbar.gschema.xml delete mode 100644 secondaryMenu.js create mode 100644 transparency.js create mode 100644 utils.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..55b741a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.~ +*~ +gschemas.compiled +zorin-taskbar@zorinos.com*.zip +*.mo +po/zorin-taskbar.pot +Settings.ui.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f63d3c0 --- /dev/null +++ b/Makefile @@ -0,0 +1,96 @@ +# Basic Makefile + +UUID = zorin-taskbar@zorinos.com +BASE_MODULES = extension.js stylesheet.css metadata.json COPYING README.md +EXTRA_MODULES = appIcons.js convenience.js panel.js panelManager.js proximity.js intellihide.js progress.js panelPositions.js panelStyle.js overview.js taskbar.js transparency.js windowPreview.js prefs.js utils.js Settings.ui +EXTRA_IMAGES = show-desktop-symbolic.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 = zorin-taskbar@zorinos.com + +# The command line passed variable VERSION is used to set the version string +# in the metadata and in the generated zip-file. +ifdef VERSION +else + VERSION = 40 +endif + +ifdef TARGET + FILESUFFIX = _v$(VERSION)_$(TARGET) +else + FILESUFFIX = _v$(VERSION) +endif + +all: extension + +clean: + rm -f ./schemas/gschemas.compiled + +extension: ./schemas/gschemas.compiled $(MSGSRC:.po=.mo) + +./schemas/gschemas.compiled: ./schemas/org.gnome.shell.extensions.zorin-taskbar.gschema.xml + glib-compile-schemas ./schemas/ + +potfile: ./po/zorin-taskbar.pot + +mergepo: potfile + for l in $(MSGSRC); do \ + msgmerge -U $$l ./po/zorin-taskbar.pot; \ + done; + +./po/zorin-taskbar.pot: $(TOLOCALIZE) Settings.ui + mkdir -p po + xgettext -k_ -kN_ -o po/zorin-taskbar.pot --package-name "Zorin Taskbar" $(TOLOCALIZE) + intltool-extract --type=gettext/glade Settings.ui + xgettext -k_ -kN_ --join-existing -o po/zorin-taskbar.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)$(FILESUFFIX).zip" . + mv _build/$(UUID)$(FILESUFFIX).zip ./ + -rm -fR _build + +_build: all + -rm -fR ./_build + mkdir -p _build + cp $(BASE_MODULES) $(EXTRA_MODULES) _build + +ifeq ($(TARGET),ego) + find _build -name '*.js' -exec sed -i '/\/\/!start-update/,/\/\/!end-update/d' {} + +endif + + mkdir -p _build/img + cd img ; cp $(EXTRA_IMAGES) ../_build/img/ + 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/zorin-taskbar.mo; \ + done; +ifneq ($(and $(COMMIT),$(VERSION)),) + sed -i 's/"version": [[:digit:]][[:digit:]]*/"version": $(VERSION),\n"commit": "$(COMMIT)"/' _build/metadata.json; +else ifneq ($(VERSION),) + sed -i 's/"version": [[:digit:]][[:digit:]]*/"version": $(VERSION)/' _build/metadata.json; +endif diff --git a/README.md b/README.md index 5958c6c..723edaf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # Zorin Taskbar The official taskbar for Zorin OS. -Based on the [Dash to Dock](https://github.com/micheleg/dash-to-dock) Gnome Shell extension by micheleg. +Based on the [Dash to Panel](https://github.com/home-sweet-gnome/dash-to-panel) Gnome Shell extension and the [Dash to Dock](https://github.com/micheleg/dash-to-dock) extension by micheleg. diff --git a/Settings.ui b/Settings.ui new file mode 100644 index 0000000..5a73bb0 --- /dev/null +++ b/Settings.ui @@ -0,0 +1,3159 @@ + + + + + + True + False + 12 + 12 + 12 + 12 + vertical + + + True + False + 0 + in + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + When set to minimize, double clicking minimizes all the windows of the application. + True + 40 + 0 + + + + 0 + 1 + + + + + True + False + True + Shift+Click action + 0 + + + 0 + 0 + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + + 1 + 0 + 2 + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Middle-Click. + True + 40 + 0 + + + + 0 + 1 + + + + + True + False + True + Middle-Click action + 0 + + + 0 + 0 + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + + 1 + 0 + 2 + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behavior for Shift+Middle-Click. + True + 40 + 0 + + + + 0 + 1 + + + + + True + False + True + Shift+Middle-Click action + 0 + + + 0 + 0 + + + + + True + False + center + + Raise windows + Minimize window + Launch new instance + Cycle through windows + Cycle windows + minimize + Toggle single / Preview multiple + Quit + + + + 1 + 0 + 2 + + + + + + + + + + + False + True + 0 + + + + + 1000 + 10 + 100 + + + True + False + vertical + + + True + False + 0 + in + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Maximum width (px) of the application titles (default is 160) + 0 + + + 0 + 0 + + + + + True + True + end + 4 + 0 + group_apps_label_max_width_adjustment + True + + + 1 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use a fixed width for the application titles + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + True + False + True + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + True + 40 + 0 + + + + 0 + 1 + 2 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Use the favorite icons as application launchers + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + + + False + True + 0 + + + + + True + False + vertical + + + True + False + 0 + in + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Floating rounded theme + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + True + + + True + False + True + Only hide the panel when it is obstructed by windows + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + True + False + 12 + 4 + + + True + False + True + The panel hides from + 0 + + + 0 + 0 + + + + + True + False + center + + All windows + Focused windows + Maximized windows + + + + 1 + 0 + + + + + 0 + 1 + 2 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Require pressure at the edge of the screen to reveal the panel + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Allow the panel to be revealed while in fullscreen mode + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Only hide secondary panels (requires multi-monitors option) + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>i + + + 1 + 0 + 2 + + + + + True + False + True + Keyboard shortcut to reveal and hold the panel + 0 + + + 0 + 0 + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + + 0 + 1 + + + + + + + + + + + False + True + 0 + + + + + 0.33 + 1 + 0.01 + 0.1 + + + 1000 + 10 + 50 + + + 50 + 500 + 10 + 50 + + + 100 + 5 + 10 + + + 100 + 800 + 10 + 50 + + + True + True + in + 460 + 208 + + + True + False + True + True + natural + natural + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Middle click on the preview to close the window + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Window previews preferred size (px) + True + 0 + + + 0 + 0 + 3 + + + + + True + True + end + 4 + 100 + preview_size_adjustment + True + 100 + + + 2 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable window peeking + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + True + False + True + When hovering over a window preview for some time, the window gets distinguished. + True + 40 + 0 + + + + 0 + 1 + 2 + + + + + + + + + + + + + True + False + 12 + 12 + 12 + 12 + vertical + + + True + False + 0 + in + + + True + False + none + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Super + Super + Alt + + + + 1 + 0 + 2 + + + + + True + False + True + Hotkeys prefix + 0 + + + 0 + 0 + + + + + True + False + Hotkeys will either be Super+Number or Super+Alt+Num + True + 40 + 0 + + + + 0 + 1 + + + + + + + + + 100 + 80 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + center + + Never + Show temporarily + Always visible + + + + 1 + 0 + 2 + + + + + True + False + True + Number overlay + 0 + + + 0 + 0 + + + + + True + False + Temporarily show the application numbers over the icons when using the hotkeys. + True + 40 + 0 + + + + 0 + 1 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + center + 12 + e.g. <Super>q + + + 1 + 0 + 2 + + + + + True + False + True + Shortcut to show the overlay for 2 seconds + 0 + + + 0 + 0 + + + + + True + False + Syntax: <Shift>, <Ctrl>, <Alt>, <Super> + True + 40 + 0 + + + + 0 + 1 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show window previews on hotkey + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + 2 + + + + + True + False + True + Show previews when the application have multiple instances + True + 40 + 0 + + + + 0 + 1 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + end + center + + Number row + Numeric keypad + Both + + + + 1 + 0 + 2 + + + + + True + False + True + Hotkeys are activated with + 0 + + + 0 + 0 + + + + + True + False + Select which keyboard number keys are used to activate the hotkeys + True + 40 + 0 + + + + 0 + 1 + + + + + + + + + + + False + True + 0 + + + + + True + False + vertical + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + True + end + center + + + 1 + 0 + + + + + True + False + True + Override escape key and return to desktop + True + 0 + + + 0 + 0 + + + + + + + False + True + 0 + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Animate <i>Show Applications</i>. + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + False + True + 1 + + + + + True + False + vertical + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Date + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + False + True + 0 + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Weekday + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + False + True + 1 + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Seconds + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + False + True + 2 + + + + + 1 + 40 + 1 + 10 + + + True + False + vertical + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Show Desktop icon + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + True + 0 + + + 0 + 0 + + + + + True + True + end + 4 + 1 + show_showdesktop_width_adjustment + True + 1 + + + 1 + 0 + + + + + + + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Reveal the desktop when hovering the Show Desktop button + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + False + True + 2 + + + + + 100 + 5 + 10 + + + True + True + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + in + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 6 + 6 + 32 + + + True + False + Panel Size +(default is 48) + 0 + + + 0 + 0 + + + + + True + True + baseline + True + panel_size_adjustment + 0 + 0 + right + + + + + 1 + 0 + + + + + + + + + + + + + + False + True + 0 + + + + + True + False + 0 + in + + + True + False + none + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Panel Intellihide + True + 0 + + + 0 + 0 + + + + + True + False + 6 + + + True + True + True + center + center + 0.46000000834465027 + + + True + False + emblem-system-symbolic + + + + + + False + True + 0 + + + + + True + True + end + center + + + False + True + 1 + + + + + 1 + 0 + 2 + + + + + True + False + True + Hide and reveal the panel according to preferences + True + 40 + 0 + + + + 0 + 1 + + + + + + + + + + + + + + False + True + 1 + + + + + True + False + 0 + in + + + True + False + none + + + True + True + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Override panel theme background opacity + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + True + False + 12 + 12 + 6 + + + True + False + True + Panel background opacity (%) + True + 0 + + + 0 + 0 + + + + + True + True + end + center + 0 + trans_opacity_adjustment + + + 1 + 0 + + + + + 0 + 1 + 2 + + + + + False + True + 0 + + + + + + + + + + + + + + False + True + 2 + + + + + 1 + + + + + True + False + Style + + + 1 + False + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + in + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + False + True + Display panels on all monitors + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 0 + + + + + + + + + + + + + + False + True + 0 + + + + + True + False + 0 + in + + + True + False + vertical + + + True + False + 12 + 12 + 12 + 12 + + + True + False + True + Order and positions on monitor + 0 + + + 0 + 0 + + + + + True + False + center + + + 1 + 0 + + + + + Apply changes to all monitors + True + True + False + 12 + True + + + 0 + 1 + + + + + True + False + 12 + 18 + 6 + 32 + + + True + False + True + Panel screen position + 0 + + + False + True + 0 + + + + + True + False + 32 + + + Bottom + True + True + False + center + center + 0 + True + True + + + + False + True + 0 + + + + + Top + True + True + False + center + center + 0 + bottom + True + position_bottom_button + + + + False + True + 1 + + + + + Left + True + True + False + center + center + 0 + bottom + True + position_bottom_button + + + + False + True + 2 + + + + + Right + True + True + False + center + center + 0 + bottom + True + position_bottom_button + + + + False + True + 3 + + + + + False + True + 1 + + + + + 0 + 2 + 2 + + + + + + + + False + True + 0 + + + + + True + False + 12 + 6 + none + + + False + True + 1 + + + + + + + + + + False + True + 2 + + + + + + + True + False + Position + + + False + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + True + False + 0 + in + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + + 1 + 0 + + + + + True + False + True + Show favorite applications + 0 + + + 0 + 0 + + + + + True + False + True + Show running applications + 0 + + + 0 + 2 + + + + + True + True + end + center + + + 1 + 2 + + + + + True + True + end + center + + + 1 + 1 + + + + + True + False + True + Show favorite applications on secondary panels + True + 0 + + + 0 + 1 + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 4 + 32 + + + True + False + 6 + + + True + True + True + center + center + 0.46000000834465027 + + + True + False + emblem-system-symbolic + + + + + + False + True + 0 + + + + + True + True + end + center + + + False + True + 1 + + + + + 1 + 0 + + + + + True + False + True + Show window previews on hover + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 1 + + + + + True + False + True + Show tooltip on hover + True + 0 + + + 0 + 1 + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 6 + 32 + + + True + True + end + center + + + 1 + 0 + + + + + True + False + True + Isolate Workspaces + True + 0 + + + 0 + 0 + + + + + True + True + end + center + + + 1 + 1 + + + + + True + False + True + Isolate monitors + True + 0 + + + 0 + 1 + + + + + + + + + 100 + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Ungroup applications + True + 0 + + + 0 + 0 + + + + + True + False + 6 + + + True + True + True + center + center + 0.46000000834465027 + + + True + False + emblem-system-symbolic + + + + + + False + True + 0 + + + + + True + True + end + center + + + False + True + 1 + + + + + 1 + 0 + + + + + + + + + + + + + + False + True + 0 + + + + + 2 + + + + + True + False + Behavior + + + 2 + False + + + + + True + False + 24 + 24 + 24 + 24 + vertical + 24 + + + False + 0 + in + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Behaviour when clicking on the icon of a running application. + True + 0 + + + + 0 + 1 + + + + + True + False + True + Click action + 0 + + + 0 + 0 + + + + + True + False + 6 + + + True + True + True + center + + + True + False + emblem-system-symbolic + + + + + + False + True + 0 + + + + + True + False + center + + Cycle windows + minimize + Cycle through windows + Toggle single / Preview multiple + Toggle windows + Raise windows + Launch new instance + + + + False + True + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + False + True + 0 + + + + + False + 0 + in + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 16 + 6 + + + True + False + vertical + + + True + False + True + Scroll icon action + 0 + + + False + True + 0 + + + + + True + False + True + Behavior when mouse scrolling over an application icon. + True + 0 + + + + False + True + 1 + + + + + 0 + 1 + + + + + True + False + center + True + + Do nothing + Cycle windows + + + + 2 + 1 + + + + + + + + + + + + + + False + True + 1 + + + + + True + False + 0 + in + + + True + False + none + + + True + True + + + True + False + 12 + 12 + 12 + 12 + 32 + + + True + False + True + Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl. + True + True + 0 + + + + 0 + 1 + + + + + True + False + True + Use hotkeys to activate apps + 0 + + + 0 + 0 + + + + + True + False + 6 + + + True + True + True + center + center + 0.46000000834465027 + + + True + False + emblem-system-symbolic + + + + + + False + True + 0 + + + + + True + True + end + center + + + False + True + 1 + + + + + 1 + 0 + 2 + + + + + + + + + + + + + + False + True + 3 + + + + + 3 + + + + + True + False + Action + + + 3 + False + + + + diff --git a/appIcons.js b/appIcons.js new file mode 100644 index 0000000..e04de07 --- /dev/null +++ b/appIcons.js @@ -0,0 +1,1736 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + * Some code was also adapted from the upstream Gnome Shell source code. + */ + + +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 Config = imports.misc.config; +const AppDisplay = imports.ui.appDisplay; +const AppFavorites = imports.ui.appFavorites; +const Dash = imports.ui.dash; +const DND = imports.ui.dnd; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; +const PopupMenu = imports.ui.popupMenu; +const Util = imports.misc.util; +const Workspace = imports.ui.workspace; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Progress = Me.imports.progress; +const _ = imports.gettext.domain(Utils.TRANSLATION_DOMAIN).gettext; + +//timeout names +const T1 = 'setStyleTimeout'; +const T2 = 'mouseScrollTimeout'; +const T3 = 'showDotsTimeout'; +const T4 = 'overviewWindowDragEndTimeout'; +const T5 = 'switchWorkspaceTimeout'; +const T6 = 'displayProperIndicatorTimeout'; + +const SCROLL_ICON_DELAY = 0; +const DOT_SIZE = 3; + +//right padding defined for .overview-label in stylesheet.css +const TITLE_RIGHT_PADDING = 8; + +let LABEL_GAP = 5; +let MAX_INDICATORS = 4; +var DEFAULT_PADDING_SIZE = 4; + +let DOT_STYLE = { + DOTS: "DOTS", + SQUARES: "SQUARES", + DASHES: "DASHES", + SEGMENTED: "SEGMENTED", + CILIORA: "CILIORA", + METRO: "METRO", + SOLID: "SOLID" +} + +let DOT_POSITION = { + TOP: "TOP", + BOTTOM: "BOTTOM", + LEFT: 'LEFT', + RIGHT: 'RIGHT' +} + +let recentlyClickedAppLoopId = 0; +let recentlyClickedApp = null; +let recentlyClickedAppWindows = null; +let recentlyClickedAppIndex = 0; +let recentlyClickedAppMonitorIndex; + +let tracker = Shell.WindowTracker.get_default(); +let menuRedisplayFunc = !!AppDisplay.AppIconMenu.prototype._rebuildMenu ? '_rebuildMenu' : '_redisplay'; + +/** + * Extend AppIcon + * + * - 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 + * + */ + +var taskbarAppIcon = Utils.defineClass({ + Name: 'ZorinTaskbar.TaskbarAppIcon', + Extends: AppDisplay.AppIcon, + ParentConstrParams: [[0, 'app'], [2]], + + _init: function(appInfo, panel, iconParams, previewMenu, iconAnimator) { + this.dtpPanel = panel; + this._nWindows = 0; + this.window = appInfo.window; + this.isLauncher = appInfo.isLauncher; + this._previewMenu = previewMenu; + this.iconAnimator = iconAnimator; + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + // Fix touchscreen issues before the listener is added by the parent constructor. + this._onTouchEvent = function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) { + // Open the popup menu on long press. + this._setPopupTimeout(); + } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { + // Activate/launch the application. + this.activate(1); + this._removeMenuTimeout(); + } + // Disable dragging via touch screen as it's buggy as hell. Not perfect for tablet users, but the alternative is way worse. + // Also, EVENT_PROPAGATE launches applications twice with this solution, so this.activate(1) above must only be called if there's already a window. + return Clutter.EVENT_STOP; + }; + // Hack for missing TOUCH_END event. + this._onLeaveEvent = function(actor, event) { + this.actor.fake_release(); + if (this._menuTimeoutId != 0) this.activate(1); // Activate/launch the application if TOUCH_END didn't fire. + this._removeMenuTimeout(); + }; + + this.callParent('_init', appInfo.app, iconParams); + + Utils.wrapActor(this.icon); + Utils.wrapActor(this); + + this._dot.set_width(0); + this._isGroupApps = Me.settings.get_boolean('group-apps'); + + this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); + this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); + this._dtpIconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), style: getIconContainerStyle(panel.checkIfVertical()) }); + + this.actor.remove_actor(this._iconContainer); + + this._dtpIconContainer.add_child(this._iconContainer); + + if (appInfo.window) { + let box = new St.BoxLayout(); + + this._windowTitle = new St.Label({ + y_align: Clutter.ActorAlign.CENTER, + x_align: Clutter.ActorAlign.START, + style_class: 'overview-label' + }); + + this._updateWindowTitle(); + this._updateWindowTitleStyle(); + + this._scaleFactorChangedId = Utils.getStageTheme().connect('changed', () => this._updateWindowTitleStyle()); + + box.add_child(this._dtpIconContainer); + box.add_child(this._windowTitle); + + this._dotsContainer.add_child(box); + } else { + this._dotsContainer.add_child(this._dtpIconContainer); + } + + this._container.add_child(this._dotsContainer); + this.actor.set_child(this._container); + + if (panel.checkIfVertical()) { + this.actor.set_width(panel.geom.w); + } + + // 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._setAppIconPadding(); + this._showDots(); + + this._focusWindowChangedId = global.display.connect('notify::focus-window', + Lang.bind(this, this._onFocusAppChanged)); + + this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; + this._stateChangedId = this.app.connect('windows-changed', Lang.bind(this, this.onWindowsChanged)); + + if (!this.window) { + if (Me.settings.get_boolean('isolate-monitors')) { + this._windowEnteredMonitorId = Utils.DisplayWrapper.getScreen().connect('window-entered-monitor', this.onWindowEnteredOrLeft.bind(this)); + this._windowLeftMonitorId = Utils.DisplayWrapper.getScreen().connect('window-left-monitor', this.onWindowEnteredOrLeft.bind(this)); + } + + this._titleWindowChangeId = 0; + this._minimizedWindowChangeId = 0; + } else { + this._titleWindowChangeId = this.window.connect('notify::title', + Lang.bind(this, this._updateWindowTitle)); + + this._minimizedWindowChangeId = this.window.connect('notify::minimized', + Lang.bind(this, this._updateWindowTitleStyle)); + } + + this._scrollEventId = this.actor.connect('scroll-event', this._onMouseScroll.bind(this)); + + this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', + Lang.bind(this, this._onOverviewWindowDragEnd)); + + this._switchWorkspaceId = global.window_manager.connect('switch-workspace', + Lang.bind(this, this._onSwitchWorkspace)); + + this._hoverChangeId = this.actor.connect('notify::hover', () => this._onAppIconHoverChanged()); + + this._dtpSettingsSignalIds = [ + Me.settings.connect('changed::panel-positions', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-focused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-style-unfocused', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::dot-color-dominant', Lang.bind(this, this._settingsChangeRefresh)), + Me.settings.connect('changed::group-apps-label-max-width', Lang.bind(this, this._updateWindowTitleStyle)), + Me.settings.connect('changed::group-apps-use-fixed-width', Lang.bind(this, this._updateWindowTitleStyle)) + ] + + this.forcedOverview = false; + + this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); + + this._numberOverlay(); + }, + + getDragActor: function() { + return this.app.create_icon_texture(this.dtpPanel.taskbar.iconSize); + }, + + shouldShowTooltip: function() { + if (!Me.settings.get_boolean('show-tooltip') || + (!this.isLauncher && Me.settings.get_boolean("show-window-previews") && + this.getAppIconInterestingWindows().length > 0)) { + return false; + } else { + return this.actor.hover && !this.window && + (!this._menu || !this._menu.isOpen) && + (this._previewMenu.getCurrentAppIcon() !== this); + } + }, + + _onAppIconHoverChanged: function() { + if (!Me.settings.get_boolean('show-window-previews') || + (!this.window && !this._nWindows)) { + return; + } + + if (this.actor.hover) { + this._previewMenu.requestOpen(this); + } else { + this._previewMenu.requestClose(); + } + }, + + _onDestroy: function() { + this.callParent('_onDestroy'); + this._destroyed = true; + + this._timeoutsHandler.destroy(); + + this._previewMenu.close(true); + + // Disconect global signals + // stateChangedId is already handled by parent) + + if(this._overviewWindowDragEndId) + Main.overview.disconnect(this._overviewWindowDragEndId); + + if(this._focusWindowChangedId) + global.display.disconnect(this._focusWindowChangedId); + + if(this._titleWindowChangeId) + this.window.disconnect(this._titleWindowChangeId); + + if(this._minimizedWindowChangeId) + this.window.disconnect(this._minimizedWindowChangeId); + + if (this._windowEnteredMonitorId) { + Utils.DisplayWrapper.getScreen().disconnect(this._windowEnteredMonitorId); + Utils.DisplayWrapper.getScreen().disconnect(this._windowLeftMonitorId); + } + + if(this._switchWorkspaceId) + global.window_manager.disconnect(this._switchWorkspaceId); + + if(this._scaleFactorChangedId) + Utils.getStageTheme().disconnect(this._scaleFactorChangedId); + + if (this._hoverChangeId) { + this.actor.disconnect(this._hoverChangeId); + } + + if (this._scrollEventId) { + this.actor.disconnect(this._scrollEventId); + } + + for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { + Me.settings.disconnect(this._dtpSettingsSignalIds[i]); + } + }, + + onWindowsChanged: function() { + this._updateWindows(); + this.updateIcon(); + }, + + onWindowEnteredOrLeft: function() { + if (this._checkIfFocusedApp()) { + this._updateWindows(); + this._displayProperIndicator(); + } + }, + + updateTitleStyle: function() { + this._updateWindowTitleStyle(); + }, + + // Update indicator and target for minimization animation + updateIcon: 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.window ? [this.window] : this.getAppIconInterestingWindows(true); + windows.forEach(function(w) { + w.set_icon_geometry(rect); + }); + }, + + _onMouseScroll: function(actor, event) { + let scrollAction = Me.settings.get_string('scroll-icon-action'); + + if (scrollAction === 'NOTHING' || (!this.window && !this._nWindows)) { + return; + } + + let direction = Utils.getMouseScrollDirection(event); + + if (direction && !this._timeoutsHandler.getId(T2)) { + this._timeoutsHandler.add([T2, SCROLL_ICON_DELAY, () => {}]); + + let windows = this.getAppIconInterestingWindows(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + Utils.activateSiblingWindow(windows, direction, this.window); + } + }, + + _showDots: function() { + // Just update style if dots already exist + if (this._focusedDots && this._unfocusedDots) { + this._updateWindows(); + return; + } + + if (!this._isGroupApps) { + this._focusedDots = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + visible: false + }); + + let mappedId = this.actor.connect('notify::mapped', () => { + this._displayProperIndicator(); + this.actor.disconnect(mappedId); + }); + } else { + this._focusedDots = new St.DrawingArea(), + this._unfocusedDots = new St.DrawingArea(); + this._focusedDots._tweeningToSize = null, + this._unfocusedDots._tweeningToSize = null; + + this._focusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._focusedDots, Me.settings.get_string('dot-style-focused'), true); + this._displayProperIndicator(); + })); + + this._unfocusedDots.connect('repaint', Lang.bind(this, function() { + if(this._dashItemContainer.animatingOut) { + // don't draw and trigger more animations if the icon is in the middle of + // being added to the panel + return; + } + this._drawRunningIndicator(this._unfocusedDots, Me.settings.get_string('dot-style-unfocused'), false); + this._displayProperIndicator(); + })); + + this._dotsContainer.add_child(this._unfocusedDots); + + this._updateWindows(); + + this._timeoutsHandler.add([T3, 0, () => { + this._resetDots(); + this._displayProperIndicator(); + }]); + } + + this._dotsContainer.add_child(this._focusedDots); + }, + + _resetDots: function() { + let position = this.dtpPanel.panelManager.panelPositions[this.dtpPanel.monitor.index] || Me.settings.get_string('panel-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + [this._focusedDots, this._unfocusedDots].forEach(d => { + d._tweeningToSize = null; + d.set_size(-1, -1); + d.x_expand = d.y_expand = false; + + d[isHorizontalDots ? 'width' : 'height'] = 1; + d[(isHorizontalDots ? 'y' : 'x') + '_expand'] = true; + }); + }, + + _settingsChangeRefresh: function() { + if (this._isGroupApps) { + this._updateWindows(); + this._resetDots(); + this._focusedDots.queue_repaint(); + this._unfocusedDots.queue_repaint(); + } + + this._displayProperIndicator(true); + }, + + _updateWindowTitleStyle: function() { + if (this._windowTitle) { + let useFixedWidth = Me.settings.get_boolean('group-apps-use-fixed-width'); + let variableWidth = !useFixedWidth || this.dtpPanel.checkIfVertical() || this.dtpPanel.taskbar.fullScrollView; + let scaleFactor = Utils.getScaleFactor(); + let maxLabelWidth = Me.settings.get_int('group-apps-label-max-width') * scaleFactor; + + this._windowTitle[(maxLabelWidth > 0 ? 'show' : 'hide')](); + + this._windowTitle.clutter_text.natural_width = useFixedWidth ? maxLabelWidth : 0; + this._windowTitle.clutter_text.natural_width_set = useFixedWidth; + this._windowTitle.set_width(variableWidth ? -1 : maxLabelWidth + TITLE_RIGHT_PADDING * scaleFactor); + + this._windowTitle.set_style((useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;')); + } + }, + + _updateWindowTitle: function() { + if (this._windowTitle.text != this.window.title) { + this._windowTitle.text = (this.window.title ? this.window.title : this.app.get_name()).replace(/\r?\n|\r/g, '').trim(); + + if (this._focusedDots) { + this._displayProperIndicator(); + } + } + }, + + _setIconStyle: function(isFocused) { + let inlineStyle = 'margin: 0;'; + + if(this._dotsContainer.get_style() != inlineStyle && this._dotsContainer.mapped) { + if (!this._isGroupApps) { + //when the apps are ungrouped, set the style synchronously so the icons don't jump around on taskbar redraw + this._dotsContainer.set_style(inlineStyle); + } else if (!this._timeoutsHandler.getId(T1)) { + //graphical glitches if i dont set this on a timeout + this._timeoutsHandler.add([T1, 0, () => this._dotsContainer.set_style(inlineStyle)]); + } + } + }, + + _checkIfFocusedApp: function() { + return tracker.focus_app == this.app; + }, + + _checkIfMonitorHasFocus: function() { + return global.display.focus_window && + (!Me.settings.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. + !Me.settings.get_boolean('isolate-monitors') || + global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); + }, + + _setAppIconPadding: function() { + let padding = getIconPadding(); + let margin = Taskbar.APPICON_MARGIN; + + this.actor.set_style('padding:' + (this.dtpPanel.checkIfVertical() ? margin + 'px 0' : '0 ' + margin + 'px;')); + this._iconContainer.set_style('padding: ' + padding + 'px;'); + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + + if (this._draggable) { + this._draggable.fakeRelease(); + } + + if (this.isDragged) { + return; + } + + if (!this._menu) { + this._menu = new taskbarSecondaryMenu(this, this.dtpPanel); + this._menu.connect('activate-window', Lang.bind(this, function (menu, window) { + this.activateWindow(window, Me.settings); + })); + this._menu.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._menu.close(); })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + + this._menuManager.addMenu(this._menu); + } + + this.emit('menu-state-changed', true); + + this._previewMenu.close(true); + + this.actor.set_hover(true); + this._menu.actor.add_style_class_name('zorintaskbarSecondaryMenu'); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + _onFocusAppChanged: function(windowTracker) { + this._displayProperIndicator(true); + }, + + _onOverviewWindowDragEnd: function(windowTracker) { + this._timeoutsHandler.add([T4, 0, () => this._displayProperIndicator()]); + }, + + _onSwitchWorkspace: function(windowTracker) { + if (this._isGroupApps) { + this._timeoutsHandler.add([T5, 0, () => this._displayProperIndicator(true)]); + } else { + this._displayProperIndicator(); + } + }, + + _displayProperIndicator: function (force) { + let isFocused = this._isFocusedWindow(); + let position = this.dtpPanel.panelManager.panelPositions[this.dtpPanel.monitor.index] || Me.settings.get_string('panel-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + + this._setIconStyle(isFocused); + + if(!this._isGroupApps) { + if (this.window && isFocused) { + let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; + + this._focusedDots.set_size(0, 0); + this._focusedDots[isHorizontalDots ? 'height' : 'width'] = this._getRunningIndicatorSize(); + + this._focusedDots.y_align = this._focusedDots.x_align = Clutter.ActorAlign.FILL; + this._focusedDots[(isHorizontalDots ? 'y' : 'x') + '_align'] = align; + this._focusedDots.background_color = this._getRunningIndicatorColor(isFocused); + this._focusedDots.show(); + } else if (this._focusedDots.visible) { + this._focusedDots.hide(); + } + } else { + let sizeProp = isHorizontalDots ? 'width' : 'height'; + let containerSize = this._container[sizeProp]; + let focusedDotStyle = Me.settings.get_string('dot-style-focused'); + let unfocusedDotStyle = Me.settings.get_string('dot-style-unfocused'); + let focusedIsWide = this._isWideDotStyle(focusedDotStyle); + let unfocusedIsWide = this._isWideDotStyle(unfocusedDotStyle); + + let newFocusedDotsSize = 0; + let newFocusedDotsOpacity = 0; + let newUnfocusedDotsSize = 0; + let newUnfocusedDotsOpacity = 0; + + isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + this._timeoutsHandler.add([T6, 0, () => { + if (!this._destroyed) { + if(isFocused) + this.actor.add_style_class_name('focused'); + else + this.actor.remove_style_class_name('focused'); + } + }]); + + if(focusedIsWide) { + newFocusedDotsSize = (isFocused && this._nWindows > 0) ? containerSize : 0; + newFocusedDotsOpacity = 255; + } else { + newFocusedDotsSize = containerSize; + newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; + } + + if(unfocusedIsWide) { + newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? containerSize : 0; + newUnfocusedDotsOpacity = 255; + } else { + newUnfocusedDotsSize = containerSize; + newUnfocusedDotsOpacity = (!isFocused && this._nWindows > 0) ? 255 : 0; + } + + // Only animate if... + // going from a wide style to a narrow style indicator or vice-versa + // OR going from an open app to a closed app or vice versa + if((focusedIsWide != unfocusedIsWide) || + (this._focusedDots[sizeProp] != newUnfocusedDotsSize || this._unfocusedDots[sizeProp] != newFocusedDotsSize)) { + this._animateDotDisplay(this._focusedDots, newFocusedDotsSize, this._unfocusedDots, newUnfocusedDotsOpacity, force, sizeProp); + this._animateDotDisplay(this._unfocusedDots, newUnfocusedDotsSize, this._focusedDots, newFocusedDotsOpacity, force, sizeProp); + } else { + this._focusedDots.opacity = newFocusedDotsOpacity; + this._unfocusedDots.opacity = newUnfocusedDotsOpacity; + this._focusedDots[sizeProp] = newFocusedDotsSize; + this._unfocusedDots[sizeProp] = newUnfocusedDotsSize; + } + } + }, + + _animateDotDisplay: function (dots, newSize, otherDots, newOtherOpacity, force, sizeProp) { + if((dots[sizeProp] != newSize && dots._tweeningToSize !== newSize) || force) { + let tweenOpts = { + time: Taskbar.DASH_ANIMATION_TIME, + transition: 'easeInOutCubic', + onComplete: Lang.bind(this, function() { + if(newOtherOpacity > 0) + otherDots.opacity = newOtherOpacity; + dots._tweeningToSize = null; + }) + }; + + if(newOtherOpacity == 0) + otherDots.opacity = newOtherOpacity; + + tweenOpts[sizeProp] = newSize; + dots._tweeningToSize = newSize; + + Utils.animate(dots, tweenOpts); + } + }, + + _isFocusedWindow: function() { + let focusedWindow = global.display.focus_window; + + while (focusedWindow) { + if (focusedWindow == this.window) { + return true; + } + + focusedWindow = focusedWindow.get_transient_for(); + } + + return false; + }, + + _isWideDotStyle: function(dotStyle) { + return dotStyle == DOT_STYLE.SEGMENTED || + dotStyle == DOT_STYLE.CILIORA || + dotStyle == DOT_STYLE.METRO || + dotStyle == DOT_STYLE.SOLID; + }, + + _isThemeProvidingIndicator: function () { + // This is an attempt to determine if the theme is providing their own + // running indicator by way of a border image on the icon, for example in + // the theme Ciliora + return (this.icon.actor.get_stage() && + this.icon.actor.get_theme_node().get_border_image()); + }, + + activate: function(button, handleAsGrouped) { + let event = Clutter.get_current_event(); + let modifiers = event ? event.get_state() : 0; + + // 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.callParent('activate', 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 = Me.settings.get_string('shift-middle-click-action'); + else + buttonAction = Me.settings.get_string('middle-click-action'); + } + else if (button && button == 1) { + if (modifiers & Clutter.ModifierType.SHIFT_MASK) + buttonAction = Me.settings.get_string('shift-click-action'); + else + buttonAction = Me.settings.get_string('click-action'); + } + + let appCount = this.getAppIconInterestingWindows().length; + let previewedAppIcon = this._previewMenu.getCurrentAppIcon(); + this._previewMenu.close(true); + + // 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 && appCount > 0; + + // We customize the action only when the application is already running + if (appIsRunning && !this.isLauncher) { + if (this.window && !handleAsGrouped) { + //ungrouped applications behaviors + switch (buttonAction) { + case 'RAISE': case 'CYCLE': case 'CYCLE-MIN': case 'MINIMIZE': case 'TOGGLE-SHOWPREVIEW': + if (!Main.overview._shown && + (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'CYCLE-MIN') && + (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { + this.window.minimize(); + } else { + Main.activateWindow(this.window); + } + + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "QUIT": + this.window.delete(global.get_current_time()); + break; + } + } else { + //grouped application behaviors + let monitor = this.dtpPanel.monitor; + let appHasFocus = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); + + switch (buttonAction) { + case "RAISE": + activateAllWindows(this.app, monitor); + break; + + case "LAUNCH": + this._launchNewInstance(); + break; + + case "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 (appHasFocus || 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 all_windows = (button == 1 && ! modifiers) || event.get_click_count() > 1; + minimizeWindow(this.app, all_windows, monitor); + } + else + activateAllWindows(this.app, monitor); + } + else + this.app.activate(); + break; + + case "CYCLE": + if (!Main.overview._shown){ + if (appHasFocus) + cycleThroughWindows(this.app, false, false, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "CYCLE-MIN": + if (!Main.overview._shown){ + if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) + cycleThroughWindows(this.app, false, true, monitor); + else { + activateFirstWindow(this.app, monitor); + } + } + else + this.app.activate(); + break; + case "TOGGLE-SHOWPREVIEW": + if (!Main.overview._shown) { + if (appCount == 1) { + if (appHasFocus) + minimizeWindow(this.app, false, monitor); + else + activateFirstWindow(this.app, monitor); + } else { + if (event.get_click_count() > 1) { + // minimize all windows if double clicked + minimizeWindow(this.app, true, monitor); + } else if (previewedAppIcon != this) { + this._previewMenu.open(this); + } + + this.emit('sync-tooltip'); + } + } + else + this.app.activate(); + break; + + case "QUIT": + closeAllWindows(this.app, monitor); + break; + } + } + } + else { + this._launchNewInstance(); + } + + Main.overview.hide(); + }, + + _launchNewInstance: function() { + if (this.app.can_open_new_window()) { + let appActions = this.app.get_app_info().list_actions(); + let newWindowIndex = appActions.indexOf('new-window'); + + this.animateLaunch(); + + if (newWindowIndex < 0) { + this.app.open_new_window(-1); + } else { + this.app.launch_action(appActions[newWindowIndex], global.get_current_time(), -1); + } + } else { + let windows = this.window ? [this.window] : this.app.get_windows(); + + if (windows.length) { + Main.activateWindow(windows[0]); + } else { + this.app.activate(); + } + } + }, + + _updateWindows: function() { + let windows = [this.window]; + + if (!this.window) { + windows = this.getAppIconInterestingWindows(); + + this._nWindows = windows.length; + + for (let i = 1; i <= MAX_INDICATORS; i++){ + let className = 'running'+i; + if(i != this._nWindows) + this.actor.remove_style_class_name(className); + else + this.actor.add_style_class_name(className); + } + } + + this._previewMenu.update(this, windows); + }, + + _getRunningIndicatorCount: function() { + return Math.min(this._nWindows, MAX_INDICATORS); + }, + + _getRunningIndicatorSize: function() { + return DOT_SIZE * Utils.getScaleFactor(); + }, + + _getRunningIndicatorColor: function(isFocused) { + let color; + const fallbackColor = new Clutter.Color({ red: 82, green: 148, blue: 226, alpha: 255 }); + + if (Me.settings.get_boolean('dot-color-dominant')) { + let dce = new Utils.DominantColorExtractor(this.app); + let palette = dce._getColorPalette(); + if (palette) { + color = Clutter.color_from_string(palette.original)[1]; + } else { // unable to determine color, fall back to theme + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + } else { + // Re-use the style - background color, and border width and color - + // of the default dot + let themeNode = this._dot.get_theme_node(); + color = themeNode.get_background_color(); + + // theme didn't provide one, use a default + if(color.alpha == 0) color = fallbackColor; + } + + return color; + }, + + _drawRunningIndicator: function(area, type, isFocused) { + let n = this._getRunningIndicatorCount(); + + if (!n) { + return; + } + + let position = this.dtpPanel.panelManager.panelPositions[this.dtpPanel.monitor.index] || Me.settings.get_string('panel-position'); + let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; + let bodyColor = this._getRunningIndicatorColor(isFocused); + let [areaWidth, areaHeight] = area.get_surface_size(); + let cr = area.get_context(); + let size = this._getRunningIndicatorSize(); + + let areaSize = areaWidth; + let startX = 0; + let startY = 0; + + if (isHorizontalDots) { + if (position == DOT_POSITION.BOTTOM) { + startY = areaHeight - size; + } + } else { + areaSize = areaHeight; + + if (position == DOT_POSITION.RIGHT) { + startX = areaWidth - size; + } + } + + if (type == DOT_STYLE.SOLID || type == DOT_STYLE.METRO) { + if (type == DOT_STYLE.SOLID || n <= 1) { + cr.translate(startX, startY); + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [areaSize, size] : [size, areaSize])); + cr.fill(); + } else { + let blackenedLength = (1 / 48) * areaSize; // need to scale with the SVG for the stacked highlight + let darkenedLength = isFocused ? (2 / 48) * areaSize : (10 / 48) * areaSize; + let blackenedColor = bodyColor.shade(.3); + let darkenedColor = bodyColor.shade(.7); + let solidDarkLength = areaSize - darkenedLength; + let solidLength = solidDarkLength - blackenedLength; + + cr.translate(startX, startY); + + Clutter.cairo_set_source_color(cr, bodyColor); + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [solidLength, size] : [size, solidLength])); + cr.fill(); + Clutter.cairo_set_source_color(cr, blackenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidLength, 0, 1, size] : [0, solidLength, size, 1]); + cr.fill(); + Clutter.cairo_set_source_color(cr, darkenedColor); + cr.newSubPath(); + cr.rectangle.apply(cr, isHorizontalDots ? [solidDarkLength, 0, darkenedLength, size] : [0, solidDarkLength, size, darkenedLength]); + cr.fill(); + } + } else { + let spacing = Math.ceil(areaSize / 18); // separation between the indicators + let length; + let dist; + let indicatorSize; + let translate; + let preDraw = () => {}; + let draw; + let drawDash = (i, dashLength) => { + dist = i * dashLength + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0, dashLength, size] : [0, dist, size, dashLength])); + }; + + switch (type) { + case DOT_STYLE.CILIORA: + spacing = size; + length = areaSize - (size * (n - 1)) - (spacing * (n - 1)); + translate = () => cr.translate(startX, startY); + preDraw = () => { + cr.newSubPath(); + cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [length, size] : [size, length])); + }; + draw = i => { + dist = length + (i * spacing) + ((i - 1) * size); + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DOTS: + let radius = size / 2; + + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = (2 * i + 1) * radius + i * spacing; + cr.arc.apply(cr, (isHorizontalDots ? [dist, radius] : [radius, dist]).concat([radius, 0, 2 * Math.PI])); + }; + break; + case DOT_STYLE.SQUARES: + translate = () => { + indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => { + dist = i * size + i * spacing; + cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); + }; + break; + case DOT_STYLE.DASHES: + length = Math.floor(areaSize / 4) - spacing; + translate = () => { + indicatorSize = Math.floor((areaSize - n * length - (n - 1) * spacing) / 2); + cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); + } + draw = i => drawDash(i, length); + break; + case DOT_STYLE.SEGMENTED: + length = Math.ceil((areaSize - ((n - 1) * spacing)) / n); + translate = () => cr.translate(startX, startY); + draw = i => drawDash(i, length); + break; + } + + translate(); + + Clutter.cairo_set_source_color(cr, bodyColor); + preDraw(); + for (let i = 0; i < n; i++) { + cr.newSubPath(); + draw(i); + } + cr.fill(); + } + + cr.$dispose(); + }, + + _numberOverlay: function() { + // Add label for a Hot-Key visual aid + this._numberOverlayLabel = new St.Label({ style_class: 'badge' }); + this._numberOverlayBin = new St.Bin({ + child: this._numberOverlayLabel, y: 2 + }); + this._numberOverlayLabel.add_style_class_name('number-overlay'); + this._numberOverlayOrder = -1; + this._numberOverlayBin.hide(); + + this._dtpIconContainer.add_child(this._numberOverlayBin); + }, + + updateHotkeyNumberOverlay: function() { + this.updateNumberOverlay(this._numberOverlayBin, true); + }, + + updateNumberOverlay: function(bin, fixedSize) { + // 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. + // 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._dtpIconContainer.get_preferred_width(-1); + let font_size = Math.round(Math.max(12, 0.2 * natWidth) / Utils.getScaleFactor()); + let size = Math.round(font_size * 1.3); + let label = bin.child; + let style = 'font-size: ' + font_size + 'px;' + + 'border-radius: ' + this.icon.iconSize + 'px;' + + 'height: ' + size +'px;'; + + if (fixedSize) { + style += 'width: ' + size + 'px;'; + } else { + style += 'padding: 0.2em 0.5em;'; + } + + bin.x = 2; + label.set_style(style); + }, + + setNumberOverlay: function(number) { + this._numberOverlayOrder = number; + this._numberOverlayLabel.set_text(number.toString()); + }, + + toggleNumberOverlay: function(activate) { + if (activate && this._numberOverlayOrder > -1) + this._numberOverlayBin.show(); + else + this._numberOverlayBin.hide(); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + this._previewMenu.close(true); + } + + return DND.DragMotionResult.CONTINUE; + }, + + // Disable all DnD methods on gnome-shell 3.34 + _onDragBegin: function() {}, + _onDragEnd: function() {}, + acceptDrop: function() { return false; }, + + getAppIconInterestingWindows: function(isolateMonitors) { + return getInterestingWindows(this.app, this.dtpPanel.monitor, isolateMonitors); + } +}); +taskbarAppIcon.prototype.scaleAndFade = taskbarAppIcon.prototype.undoScaleAndFade = () => {}; + +function minimizeWindow(app, param, monitor){ + // Param true make all app windows minimize + let windows = getInterestingWindows(app, monitor); + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().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. + */ +function activateAllWindows(app, monitor){ + + // First activate first window so workspace is switched if needed, + // then activate all other app windows in the current workspace. + let windows = getInterestingWindows(app, monitor); + let w = windows[0]; + Main.activateWindow(w); + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + + if (windows.length <= 0) + return; + + for (let i = windows.length - 1; i >= 0; i--){ + if (windows[i].get_workspace().index() == activeWorkspace){ + Main.activateWindow(windows[i]); + } + } +} + +function activateFirstWindow(app, monitor){ + + let windows = getInterestingWindows(app, monitor); + Main.activateWindow(windows[0]); +} + +function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { + // 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 = getInterestingWindows(app, monitor); + + if(shouldMinimize) + app_windows.push("MINIMIZE"); + + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId = Mainloop.timeout_add(MEMORY_TIME, 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. + if (!recentlyClickedApp || + recentlyClickedApp.get_id() != app.get_id() || + recentlyClickedAppWindows.length != app_windows.length || + recentlyClickedAppMonitorIndex != monitor.index) { + recentlyClickedApp = app; + recentlyClickedAppWindows = app_windows; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = monitor.index; + } + + if (reversed) { + recentlyClickedAppIndex--; + if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; + } else { + recentlyClickedAppIndex++; + } + let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; + + if(recentlyClickedAppWindows[index] === "MINIMIZE") + minimizeWindow(app, true, monitor); + else + Main.activateWindow(recentlyClickedAppWindows[index]); +} + +function resetRecentlyClickedApp() { + if (recentlyClickedAppLoopId > 0) + Mainloop.source_remove(recentlyClickedAppLoopId); + + recentlyClickedAppLoopId=0; + recentlyClickedApp =null; + recentlyClickedAppWindows = null; + recentlyClickedAppIndex = 0; + recentlyClickedAppMonitorIndex = null; + + return false; +} + +function closeAllWindows(app, monitor) { + let windows = getInterestingWindows(app, monitor); + for (let i = 0; i < windows.length; i++) + windows[i].delete(global.get_current_time()); +} + +// Filter out unnecessary windows, for instance +// nautilus desktop window. +function getInterestingWindows(app, monitor, isolateMonitors) { + let windows = app.get_windows().filter(function(w) { + return !w.skip_taskbar; + }); + + // When using workspace or monitor isolation, we filter out windows + // that are not in the current workspace or on the same monitor as the appicon + if (Me.settings.get_boolean('isolate-workspaces')) + windows = windows.filter(function(w) { + return w.get_workspace().index() == Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); + }); + + if (monitor && Me.settings.get_boolean('multi-monitors') && (isolateMonitors || Me.settings.get_boolean('isolate-monitors'))) { + windows = windows.filter(function(w) { + return w.get_monitor() == monitor.index; + }); + } + + return windows; +} + +function cssHexTocssRgba(cssHex, opacity) { + var bigint = parseInt(cssHex.slice(1), 16); + var r = (bigint >> 16) & 255; + var g = (bigint >> 8) & 255; + var b = bigint & 255; + + return 'rgba(' + [r, g, b].join(',') + ',' + opacity + ')'; +} + +function getIconPadding() { + let panelSize = Me.settings.get_int('panel-size'); + let padding = Taskbar.APPICON_PADDING; + let availSize = panelSize - Taskbar.MIN_ICON_SIZE - panelSize % 2; + + if (padding * 2 > availSize) { + padding = availSize * .5; + } + + return padding; +} + +/** + * Extend AppIconMenu + * + * - set popup arrow side based on taskbar orientation + * - Add close windows option based on quitfromdash extension + * (https://github.com/deuill/shell-extension-quitfromdash) + */ + +var taskbarSecondaryMenu = Utils.defineClass({ + Name: 'ZorinTaskbar.SecondaryMenu', + Extends: AppDisplay.AppIconMenu, + ParentConstrParams: [[0]], + + _init: function(source, panel) { + // 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.callParent('_init', source); + + let side = panel.getPosition(); + // Change the initialized side where required. + this._arrowSide = side; + this._boxPointer._arrowSide = side; + this._boxPointer._userArrowSide = side; + }, + + // helper function for the quit windows abilities + _closeWindowInstance: function(metaWindow) { + metaWindow.delete(global.get_current_time()); + }, + + _dtpRedisplay: function(parentFunc) { + this.callParent(parentFunc); + + // prepend items from the appMenu (for native gnome apps) + let appMenu = this._source.app.menu; + if(appMenu) { + let remoteMenu = new imports.ui.remoteMenu.RemoteMenu(this._source.actor, this._source.app.menu, this._source.app.action_group); + let appMenuItems = remoteMenu._getMenuItems(); + for(var i = 0, l = appMenuItems.length || 0; i < l; ++i) { + let menuItem = appMenuItems[i]; + let labelText = menuItem.actor.label_actor.text; + if(labelText == _("New Window") || labelText == _("Quit")) + continue; + + if(menuItem instanceof PopupMenu.PopupSeparatorMenuItem) + continue; + + // this ends up getting called multiple times, and bombing due to the signal id's being invalid + // on a 2nd pass. disconnect the base handler and attach our own that wraps the id's in if statements + menuItem.disconnect(menuItem._popupMenuDestroyId) + menuItem._popupMenuDestroyId = menuItem.connect('destroy', Lang.bind(this, function(menuItem) { + if(menuItem._popupMenuDestroyId) { + menuItem.disconnect(menuItem._popupMenuDestroyId); + menuItem._popupMenuDestroyId = 0; + } + if(menuItem._activateId) { + menuItem.disconnect(menuItem._activateId); + menuItem._activateId = 0; + } + if(menuItem._activeChangeId) { + menuItem.disconnect(menuItem._activeChangeId); + menuItem._activeChangeId = 0; + } + if(menuItem._sensitiveChangeId) { + menuItem.disconnect(menuItem._sensitiveChangeId); + menuItem._sensitiveChangeId = 0; + } + this.disconnect(menuItem._parentSensitiveChangeId); + if (menuItem == this._activeMenuItem) + this._activeMenuItem = null; + })); + + menuItem.actor.get_parent().remove_child(menuItem.actor); + if(menuItem instanceof PopupMenu.PopupSubMenuMenuItem) { + let newSubMenuMenuItem = new PopupMenu.PopupSubMenuMenuItem(labelText); + let appSubMenuItems = menuItem.menu._getMenuItems(); + for(let appSubMenuIdx in appSubMenuItems){ + let subMenuItem = appSubMenuItems[appSubMenuIdx]; + subMenuItem.actor.get_parent().remove_child(subMenuItem.actor); + newSubMenuMenuItem.menu.addMenuItem(subMenuItem); + } + this.addMenuItem(newSubMenuMenuItem, i); + } else + this.addMenuItem(menuItem, i); + } + + if(i > 0) { + let separator = new PopupMenu.PopupSeparatorMenuItem(); + this.addMenuItem(separator, i); + } + } + + // quit menu + let app = this._source.app; + let window = this._source.window; + let count = window ? 1 : getInterestingWindows(app).length; + if ( count > 0) { + this._appendSeparator(); + let quitFromTaskbarMenuText = ""; + if (count == 1) + quitFromTaskbarMenuText = _("Quit"); + else + quitFromTaskbarMenuText = _("Quit") + ' ' + count + ' ' + _("Windows"); + + this._quitfromTaskbarMenuItem = this._appendMenuItem(quitFromTaskbarMenuText); + this._quitfromTaskbarMenuItem.connect('activate', Lang.bind(this, function() { + let app = this._source.app; + let windows = window ? [window] : app.get_windows(); + for (i = 0; i < windows.length; i++) { + this._closeWindowInstance(windows[i]) + } + })); + } + } +}); +Signals.addSignalMethods(taskbarSecondaryMenu.prototype); +adjustMenuRedisplay(taskbarSecondaryMenu.prototype); + +/** + * This function is used for extendDashItemContainer + */ +function ItemShowLabel() { + if (!this._labelText) + 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 position = this._dtpPanel.getPosition(); + let labelOffset = node.get_length('-x-offset'); + + let xOffset = Math.floor((itemWidth - labelWidth) / 2); + let x = stageX + xOffset + let y = stageY + (itemHeight - labelHeight) * .5; + + switch(position) { + case St.Side.TOP: + y = stageY + labelOffset + itemHeight; + break; + case St.Side.BOTTOM: + y = stageY - labelHeight - labelOffset; + break; + case St.Side.LEFT: + x = stageX + labelOffset + itemWidth; + break; + case St.Side.RIGHT: + x = stageX - labelWidth - labelOffset; + break; + } + + // keep the label inside the screen border + // Only needed for the x coordinate. + + // Leave a few pixel gap + let gap = LABEL_GAP; + 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(Math.round(x), Math.round(y)); + + let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; + + if (duration > 1) { + duration /= 1000; + } + + Utils.animate(this.label, { + opacity: 255, + time: duration, + transition: 'easeOutQuad', + }); +}; + +/** + * A wrapper class around the ShowAppsIcon class. + * + * - Pass settings to the constructor + * - set label position based on dash orientation (Note, I am reusing most machinery of the appIcon class) + * - implement a popupMenu based on the AppIcon code (Note, I am reusing most machinery of the appIcon class) + * + * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. + * thus use this pattern where the real showAppsIcon object is encaptulated, and a reference to it will be properly wired upon + * use of this class in place of the original showAppsButton. + * + */ +var ShowAppsIconWrapper = Utils.defineClass({ + Name: 'ZorinTaskbar.ShowAppsIconWrapper', + + _init: function(dtpPanel) { + this.realShowAppsIcon = new Dash.ShowAppsIcon(); + + Utils.wrapActor(this.realShowAppsIcon); + Utils.wrapActor(this.realShowAppsIcon.toggleButton); + + /* the variable equivalent to toggleButton has a different name in the appIcon class + (actor): duplicate reference to easily reuse appIcon methods */ + this.actor = this.realShowAppsIcon.toggleButton; + this.realShowAppsIcon.show(false); + + // Re-use appIcon methods + this._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; + this._setPopupTimeout = AppDisplay.AppIcon.prototype._setPopupTimeout; + this._onKeyboardPopupMenu = AppDisplay.AppIcon.prototype._onKeyboardPopupMenu; + + // No action on clicked (showing of the appsview is controlled elsewhere) + this._onClicked = Lang.bind(this, function(actor, button) { + this._removeMenuTimeout(); + }); + + this.actor.connect('leave-event', Lang.bind(this, this._onLeaveEvent)); + this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); + this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent)); + this.actor.connect('clicked', Lang.bind(this, this._onClicked)); + this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu)); + + this._menu = null; + this._menuManager = new PopupMenu.PopupMenuManager(this.actor); + this._menuTimeoutId = 0; + + this.realShowAppsIcon._dtpPanel = dtpPanel; + Taskbar.extendDashItemContainer(this.realShowAppsIcon); + + this.realShowAppsIcon.icon.createIcon = function(size) { + this._iconActor = new St.Icon({ icon_name: 'view' + (Config.PACKAGE_VERSION < '3.20' ? '' : '-app') + '-grid-symbolic', + icon_size: size, + style_class: 'show-apps-icon', + track_hover: true }); + + return this._iconActor; + }; + + this.setShowAppsPadding(); + }, + + _onButtonPress: function(_actor, event) { + let button = event.get_button(); + if (button == 1) { + this._setPopupTimeout(); + } else if (button == 3) { + this.popupMenu(); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; + }, + + _onLeaveEvent: function(_actor, _event) { + this.actor.fake_release(); + this._removeMenuTimeout(); + }, + + _onTouchEvent: function(actor, event) { + if (event.type() == Clutter.EventType.TOUCH_BEGIN) + this._setPopupTimeout(); + + return Clutter.EVENT_PROPAGATE; + }, + + _onMenuPoppedDown: function() { + this._menu.sourceActor = this.actor; + this.actor.sync_hover(); + this.emit('menu-state-changed', false); + }, + + setShowAppsPadding: function() { + let padding = getIconPadding(); + + this.actor.set_style('padding:' + padding + 'px;'); + }, + + createMenu: function() { + if (!this._menu) { + this._menu = new MyShowAppsIconMenu(this.actor, this.realShowAppsIcon._dtpPanel); + this._menu.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._menu.close(); + })); + this._menu.actor.connect('destroy', function() { + Main.overview.disconnect(id); + }); + this._menuManager.addMenu(this._menu); + } + }, + + popupMenu: function() { + this._removeMenuTimeout(); + this.actor.fake_release(); + this.createMenu(this.actor); + + //this.emit('menu-state-changed', true); + + this.actor.set_hover(true); + this._menu.popup(); + this._menuManager.ignoreRelease(); + this.emit('sync-tooltip'); + + return false; + }, + + shouldShowTooltip: function() { + return Me.settings.get_boolean('show-tooltip') && + (this.actor.hover && (!this._menu || !this._menu.isOpen)); + }, + + destroy: function() { + this.realShowAppsIcon.destroy(); + } +}); +Signals.addSignalMethods(ShowAppsIconWrapper.prototype); + +/** + * A menu for the showAppsIcon + */ +var MyShowAppsIconMenu = Utils.defineClass({ + Name: 'ZorinTaskbar.ShowAppsIconMenu', + Extends: taskbarSecondaryMenu, + ParentConstrParams: [[0], [1]], + + _dtpRedisplay: function() { + this.removeAll(); + + // Only add menu entries for commands that exist in path + function _appendItem(obj, info) { + if (Utils.checkIfCommandExists(info.cmd[0])) { + let item = obj._appendMenuItem(_(info.title)); + + item.connect('activate', function() { + Util.spawn(info.cmd); + }); + return item; + } + + return null; + } + + function _appendList(obj, commandList, titleList) { + if (commandList.length != titleList.length) { + return; + } + + for (var entry = 0; entry < commandList.length; entry++) { + _appendItem(obj, { + title: titleList[entry], + cmd: commandList[entry].split(' ') + }); + } + } + + _appendItem(this, { + title: 'System Monitor', + cmd: ['gnome-system-monitor'] + }); + + _appendItem(this, { + title: 'Files', + cmd: ['nautilus'] + }); + + _appendItem(this, { + title: 'Settings', + cmd: ['gnome-control-center'] + }); + + _appendItem(this, { + title: 'Zorin Appearance', + cmd: ['zorin-appearance'] + }); + + _appendList( + this, + Me.settings.get_strv('panel-context-menu-commands'), + Me.settings.get_strv('panel-context-menu-titles') + ) + + this._appendSeparator(); + + let lockTaskbarMenuItem = this._appendMenuItem(Me.settings.get_boolean('taskbar-locked') ? _('Unlock taskbar') : _('Lock taskbar')); + lockTaskbarMenuItem.connect('activate', () => { + Me.settings.set_boolean('taskbar-locked', !Me.settings.get_boolean('taskbar-locked')); + }); + + let settingsMenuItem = this._appendMenuItem(_('Taskbar Settings')); + settingsMenuItem.connect('activate', function () { + let command = ["gnome-shell-extension-prefs"]; + + if (Config.PACKAGE_VERSION > '3.36') { + command = ["gnome-extensions", "prefs"]; + } + + Util.spawn(command.concat([Me.metadata.uuid])); + }); + + if(this._source._dtpPanel) { + this._appendSeparator(); + let item = this._appendMenuItem(this._source._dtpPanel._restoreWindowList ? _('Restore Windows') : _('Show Desktop')); + item.connect('activate', Lang.bind(this._source._dtpPanel, this._source._dtpPanel._onShowDesktopButtonPress)); + } + } +}); +adjustMenuRedisplay(MyShowAppsIconMenu.prototype); + +function adjustMenuRedisplay(menuProto) { + menuProto[menuRedisplayFunc] = function() { this._dtpRedisplay(menuRedisplayFunc) }; +} + +var getIconContainerStyle = function(isVertical) { + let style = 'padding: '; + + if (Me.settings.get_boolean('group-apps')) { + style += (isVertical ? '0;' : '0 ' + DEFAULT_PADDING_SIZE + 'px;'); + } else { + style += (isVertical ? '' : '0 ') + DEFAULT_PADDING_SIZE + 'px;'; + } + + return style; +} diff --git a/convenience.js b/convenience.js index 0918d5c..8971c5b 100644 --- a/convenience.js +++ b/convenience.js @@ -1,10 +1,9 @@ /* - * Taskbar: A taskbar extension for the Gnome panel. - * Copyright (C) 2016 Zorin OS + * This file is part of the Zorin Taskbar extension for Zorin OS. * * 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 3 of the License, or + * 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, @@ -17,87 +16,74 @@ * * * Credits: - * This file is based on code from the Dash to Dock extension by micheleg. + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension * Some code was also adapted from the upstream Gnome Shell source code. */ +const Config = imports.misc.config; +const ExtensionUtils = imports.misc.extensionUtils; +const Gettext = imports.gettext; +const Gio = imports.gi.Gio; -const Lang = imports.lang; +/** + * 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']; -// simplify global signals and function injections handling -// abstract class -const BasicHandler = new Lang.Class({ - Name: 'Taskbar.BasicHandler', + // 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); +} - _init: function(){ - this._storage = new Object(); - }, +/** + * 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(); - add: function(/*unlimited 3-long array arguments*/){ + schema = schema || extension.metadata['settings-schema']; - // 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); - }, + const GioSSS = Gio.SettingsSchemaSource; - destroy: function() { - for( let label in this._storage ) - this.removeWithLabel(label); - }, + // 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(); - addWithLabel: function( label /* plus unlimited 3-long array arguments*/) { + 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.'); - 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: 'Taskbar.GlobalSignalsHandler', - 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]); - } -}); + return new Gio.Settings({ + settings_schema: schemaObj + }); +} diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..672aabe --- /dev/null +++ b/debian/changelog @@ -0,0 +1,328 @@ +gnome-shell-extension-zorin-taskbar (40.17) focal; urgency=medium + + * Fixed notification badge sizing on 200% scaled displays + + -- Artyom Zorin Wed, 21 Jul 2021 13:00:25 +0100 + +gnome-shell-extension-zorin-taskbar (40.16) focal; urgency=medium + + * Fixed bug that caused the panel to disappear after locking the + screen while fullscreen content is playing + + -- Artyom Zorin Wed, 02 Jun 2021 20:24:27 +0100 + +gnome-shell-extension-zorin-taskbar (40.15) focal; urgency=medium + + * Updated translations + + -- Artyom Zorin Sun, 23 May 2021 20:32:41 +0100 + +gnome-shell-extension-zorin-taskbar (40.14) focal; urgency=medium + + * Fixed new translations + + -- Artyom Zorin Sun, 23 May 2021 20:26:18 +0100 + +gnome-shell-extension-zorin-taskbar (40.13) focal; urgency=medium + + * Added new translations and made the main panel always appear on the + primary display + + -- Artyom Zorin Sun, 23 May 2021 20:03:46 +0100 + +gnome-shell-extension-zorin-taskbar (40.12) focal; urgency=medium + + * Updated Russian and Japanese translations + + -- Artyom Zorin Wed, 05 May 2021 20:10:48 +0100 + +gnome-shell-extension-zorin-taskbar (40.11) focal; urgency=medium + + * No longer animates disposed icons + + -- Artyom Zorin Tue, 06 Apr 2021 13:13:47 +0100 + +gnome-shell-extension-zorin-taskbar (40.10) focal; urgency=medium + + * Added Zorin Appearance link to taskbar right-click menu + + -- Artyom Zorin Tue, 23 Mar 2021 19:36:07 +0000 + +gnome-shell-extension-zorin-taskbar (40.9) focal; urgency=medium + + * Removed Terminal from right-click menu + + -- Artyom Zorin Mon, 22 Mar 2021 15:38:20 +0000 + +gnome-shell-extension-zorin-taskbar (40.8) focal; urgency=medium + + * Removed dot style settings and moved Intellihide to Style tab in + prefs + + -- Artyom Zorin Sun, 21 Mar 2021 15:08:03 +0000 + +gnome-shell-extension-zorin-taskbar (40.7) focal; urgency=medium + + * Removed style override for app-well-app items + + -- Artyom Zorin Sun, 21 Feb 2021 20:00:12 +0000 + +gnome-shell-extension-zorin-taskbar (40.6) focal; urgency=medium + + * Improved styling of progress bars + + -- Artyom Zorin Sun, 21 Feb 2021 15:54:07 +0000 + +gnome-shell-extension-zorin-taskbar (40.5) focal; urgency=medium + + * Re-based on upstream as at commit + e4a71fa014b565171c93d15f436be9c3599b11fb + + -- Artyom Zorin Sun, 21 Feb 2021 15:22:52 +0000 + +gnome-shell-extension-zorin-taskbar (40.4) focal; urgency=medium + + * Updated notification badge overlay and limited minimum panel size to + 24px + + -- Artyom Zorin Sun, 21 Feb 2021 15:02:09 +0000 + +gnome-shell-extension-zorin-taskbar (40.3) focal; urgency=medium + + * Increased border radius of floating panel and preview container + + -- Artyom Zorin Sun, 21 Feb 2021 00:50:25 +0000 + +gnome-shell-extension-zorin-taskbar (40.2) focal; urgency=medium + + * Imporved visibility of window previews by styling them with the dash- + label class + + -- Artyom Zorin Thu, 31 Dec 2020 18:34:46 +0000 + +gnome-shell-extension-zorin-taskbar (40.1) focal; urgency=medium + + * Added floating rounded theme when using Intellihide + + -- Artyom Zorin Wed, 30 Dec 2020 00:44:32 +0000 + +gnome-shell-extension-zorin-taskbar (40) focal; urgency=medium + + * Re-based on upstream version 40 as at commit + 48a69e529614d1da456802b818e7d7f0d4d1d642 + + -- Artyom Zorin Mon, 28 Dec 2020 22:08:11 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.11) bionic; urgency=medium + + * Set variables to 0 on destroy in taskbar.js + + -- Artyom Zorin Tue, 19 Feb 2019 18:35:40 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.10) bionic; urgency=medium + + * Fixed bugs with windowPreview peek mode + + -- Artyom Zorin Fri, 15 Feb 2019 00:13:19 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.9) bionic; urgency=medium + + * Fixed touch support in Gnome Shell 3.30 and made touching an app + icon show its window preview if more than one window is opened + + -- Artyom Zorin Thu, 14 Feb 2019 13:27:40 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.8) bionic; urgency=medium + + * Added definition check when getting taskbar icons + + -- Artyom Zorin Tue, 05 Feb 2019 18:17:32 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.7) bionic; urgency=medium + + * Fixed _dragInfo definition check + + -- Artyom Zorin Tue, 05 Feb 2019 14:45:45 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.6) bionic; urgency=medium + + * Fixed name of Taskbar Actor + + -- Artyom Zorin Sat, 12 Jan 2019 18:35:19 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.5) bionic; urgency=medium + + * Re-based on Dash to Panel as at commit + b6094fdaec89349cc6f3e0da887d19fdf3db1c60 + + -- Artyom Zorin Sat, 12 Jan 2019 16:02:44 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.4) bionic; urgency=medium + + * Re-based on Dash to Panel as at commit + 6e53889082eef4eed9cdc1c496e90a6f8450d1fd + + -- Artyom Zorin Fri, 11 Jan 2019 16:41:36 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.3) bionic; urgency=medium + + * Re-based on Dash to Panel as at commit + 8e715c7b07d30bfe0858a1eb93638c653b8bd268 + + -- Artyom Zorin Tue, 08 Jan 2019 18:46:52 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.2) bionic; urgency=medium + + * Re-based on Dash to Panel as at commit + dcd8a017e2a9ae66518ade2ae7a74d9836dd3633 + + -- Artyom Zorin Thu, 03 Jan 2019 14:27:47 +0000 + +gnome-shell-extension-zorin-taskbar (2.0.1) bionic; urgency=medium + + * Updated URL in metadata.json + + -- Artyom Zorin Mon, 31 Dec 2018 14:27:13 +0000 + +gnome-shell-extension-zorin-taskbar (2.0) bionic; urgency=medium + + * Re-based on Dash to Panel commit + e2eeb0290152bdf9ea3a9643ce6d36d8ba12813d + + -- Artyom Zorin Sun, 30 Dec 2018 18:44:22 +0000 + +gnome-shell-extension-zorin-taskbar (1.4.4) xenial; urgency=medium + + * Re-based on Dash to Panel version 13 + + -- Artyom Zorin Wed, 07 Mar 2018 15:16:36 +0000 + +gnome-shell-extension-zorin-taskbar (1.4.3) xenial; urgency=medium + + * Fixed window preview issue with Remmina + + -- Artyom Zorin Tue, 06 Mar 2018 22:37:07 +0000 + +gnome-shell-extension-zorin-taskbar (1.4.2) xenial; urgency=medium + + * Various bug fixes + + -- Artyom Zorin Tue, 06 Mar 2018 20:44:12 +0000 + +gnome-shell-extension-zorin-taskbar (1.4.1) xenial; urgency=medium + + * Added more required imports + + -- Artyom Zorin Tue, 06 Mar 2018 11:22:48 +0000 + +gnome-shell-extension-zorin-taskbar (1.4) xenial; urgency=medium + + * Re-based on Dash to Panel version 12 + + -- Artyom Zorin Tue, 06 Mar 2018 01:25:06 +0000 + +gnome-shell-extension-zorin-taskbar (1.3) xenial; urgency=medium + + * Added opacify peek on window preview hover + + -- Artyom Zorin Fri, 28 Jul 2017 00:40:19 +0100 + +gnome-shell-extension-zorin-taskbar (1.2.1) xenial; urgency=medium + + * Removed window preview opening animation + + -- Artyom Zorin Fri, 14 Apr 2017 20:05:44 +0100 + +gnome-shell-extension-zorin-taskbar (1.2) xenial; urgency=medium + + * Re-based on Dash to Panel commit + 1415cbdf5cadff94f4d9483b4b77676a3a2ea8d1 + + -- Artyom Zorin Tue, 11 Apr 2017 22:16:41 +0100 + +gnome-shell-extension-zorin-taskbar (1.1.5) xenial; urgency=medium + + * Enabled opening animations for window previews + + -- Artyom Zorin Thu, 12 Jan 2017 11:54:50 +0000 + +gnome-shell-extension-zorin-taskbar (1.1.4) xenial; urgency=medium + + * App running indicators now appear on top when the panel is on top + and bug fixes + + -- Artyom Zorin Wed, 11 Jan 2017 12:46:23 +0000 + +gnome-shell-extension-zorin-taskbar (1.1.3) xenial; urgency=medium + + * Fixed another high CPU usage issue – credit to jderose9 + + -- Artyom Zorin Tue, 10 Jan 2017 22:01:51 +0000 + +gnome-shell-extension-zorin-taskbar (1.1.2) xenial; urgency=medium + + * Reduced CPU usage – credit to jderose9 – and improved the + responsiveness of DPI changes + + -- Artyom Zorin Tue, 10 Jan 2017 12:40:58 +0000 + +gnome-shell-extension-zorin-taskbar (1.1.1) xenial; urgency=medium + + * Removed window preview menu enter timeout to fix keygrab focus + lockup bug and make the taskbar experience faster + + -- Artyom Zorin Sun, 08 Jan 2017 20:02:26 +0000 + +gnome-shell-extension-zorin-taskbar (1.1) xenial; urgency=medium + + * Added full support for HiDPI displays + + -- Artyom Zorin Mon, 02 Jan 2017 00:28:46 +0000 + +gnome-shell-extension-zorin-taskbar (1.0.6) xenial; urgency=medium + + * Fixed a number of memory leaks in the Window Preview code + + -- Artyom Zorin Tue, 27 Dec 2016 15:53:08 +0000 + +gnome-shell-extension-zorin-taskbar (1.0.5) xenial; urgency=medium + + * Updated copyright notices + + -- Artyom Zorin Fri, 04 Nov 2016 14:34:48 +0000 + +gnome-shell-extension-zorin-taskbar (1.0.4) xenial; urgency=medium + + * Disconnected signals + + -- Artyom Zorin Sun, 23 Oct 2016 13:43:35 +0100 + +gnome-shell-extension-zorin-taskbar (1.0.3) xenial; urgency=medium + + * Fixed Work ID issue + + -- Artyom Zorin Thu, 20 Oct 2016 22:59:07 +0100 + +gnome-shell-extension-zorin-taskbar (1.0.2) xenial; urgency=medium + + * Ready for public use in Zorin OS 12 + + -- Artyom Zorin Sun, 18 Sep 2016 20:24:18 +0100 + +gnome-shell-extension-zorin-taskbar (1.0.1) xenial; urgency=medium + + * Updated copyright notice + + -- Zorin OS Mon, 12 Sep 2016 19:23:04 +0100 + +gnome-shell-extension-zorin-taskbar (1.0) xenial; urgency=medium + + * Initial stable release + + -- Zorin OS Sat, 03 Sep 2016 23:19:10 +0100 + +gnome-shell-extension-zorin-taskbar (0.9) xenial; urgency=low + + * Pre-release + + -- Zorin OS Fri, 02 Sep 2016 10:47:51 -0400 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..6b74b66 --- /dev/null +++ b/debian/control @@ -0,0 +1,13 @@ +Source: gnome-shell-extension-zorin-taskbar +Section: gnome +Priority: optional +Maintainer: Artyom Zorin +Build-Depends: debhelper-compat (= 12), libglib2.0-bin, zip +Standards-Version: 4.5.0 +Rules-Requires-Root: no + +Package: gnome-shell-extension-zorin-taskbar +Architecture: all +Depends: ${misc:Depends}, gnome-shell (>= 3.18) +Description: Zorin Taskbar extension + A taskbar extension for the Zorin Desktop environment. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..039a346 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,73 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: gnome-shell-extension-zorin-taskbar + +Files: * +Copyright: 2016-2020, Jason DeRose (https://github.com/jderose9) + 2016-2020, Zorin OS Technologies Ltd. +License: GPL-2+ + +Files: po/cs.po +Copyright: 2017-2018 Milan Zink +License: GPL-2+ + +Files: po/es.po +Copyright: 2017 Fran Glais +License: GPL-2+ + +Files: po/gl.po +Copyright: 2020 Fran Dieguez +License: GPL-2+ + +Files: po/pt_BR.po +Copyright: 2017 Fábio Nogueira +License: GPL-2+ + +Files: po/ru.po +Copyright: 2017 Alex Gluck +License: GPL-2+ + +Files: po/hu.po +Copyright: 2017 Balázs Úr +License: GPL-2+ + +Files: po/it.po +Copyright: 2018 Enrico Bella +License: GPL-2+ + +Files: po/ja.po +Copyright: 2017-2018 Shinichirou Yamada + 2018 sicklylife.jp +License: GPL-2+ + +Files: po/kk.po +Copyright: 2017 Baurzhan Muftakhidinov +License: GPL-2+ + +Files: po/zh_CN.po + po/zh_TW.po +Copyright: 2017 Boyuan Yang <073plan@gmail.com> +License: GPL-2+ + +Files: po/tr.po +Copyright: 2018 Serdar Sağlam +License: GPL-2+ + +Files: debian/* +Copyright: 2017-2020 Jonathan Carter +License: GPL-2+ + +License: GPL-2+ + 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. + . + 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, see . + . + On Debian systems, the complete text of the GNU General + Public License can be found in `/usr/share/common-licenses/GPL-2'. diff --git a/debian/install b/debian/install new file mode 100644 index 0000000..6a4cf89 --- /dev/null +++ b/debian/install @@ -0,0 +1 @@ +schemas/org.gnome.shell.extensions.zorin-taskbar.gschema.xml usr/share/glib-2.0/schemas diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..897d1f9 --- /dev/null +++ b/debian/rules @@ -0,0 +1,9 @@ +#!/usr/bin/make -f + +%: + dh $@ + +override_dh_install: + dh_install + rm -f debian/gnome-shell-extension-zorin-taskbar/usr/share/gnome-shell/extensions/zorin-taskbar@zorinos.com/COPYING + rm -f debian/gnome-shell-extension-zorin-taskbar/usr/share/gnome-shell/extensions/zorin-taskbar@zorinos.com/README.md diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/extension.js b/extension.js index 80ea801..94a7ad4 100644 --- a/extension.js +++ b/extension.js @@ -1,10 +1,9 @@ /* - * Taskbar: A taskbar extension for the Gnome panel. - * Copyright (C) 2016 Zorin OS + * This file is part of the Zorin Taskbar extension for Zorin OS. * * 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 3 of the License, or + * 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, @@ -15,151 +14,127 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg. - * Some code was also adapted from the upstream Gnome Shell source code. */ -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Clutter = imports.gi.Clutter; -const Convenience = Me.imports.convenience; -const Taskbar = Me.imports.taskbar; -const Lang = imports.lang; const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const Lang = imports.lang; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const WindowManager = imports.ui.windowManager; +const ExtensionUtils = imports.misc.extensionUtils; +const Mainloop = imports.mainloop; +const Signals = imports.signals; -let appMenu; -let container; -let panel; -let panelConnectId; -let signalsHandler; -let taskbar; +const Me = ExtensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const PanelManager = Me.imports.panelManager; +const Utils = Me.imports.utils; + +const ZORIN_DASH_UUID = 'zorin-dash@zorinos.com'; + +let panelManager; +let oldDash; +let extensionChangedHandler; +let disabledZorinDash; +let extensionSystem = (Main.extensionManager || imports.ui.extensionSystem); function init() { + Convenience.initTranslations(Utils.TRANSLATION_DOMAIN); + + //create an object that persists until gnome-shell is restarted, even if the extension is disabled + Me.persistentStorage = {}; } function enable() { - panel = Main.panel; - container = panel._leftBox; - appMenu = panel.statusArea['appMenu']; + // The Zorin Dash extension might get enabled after this extension + extensionChangedHandler = extensionSystem.connect('extension-state-changed', (data, extension) => { + if (extension.uuid === ZORIN_DASH_UUID && extension.state === 1) { + _enable(); + } + }); - panelConnectId = panel.actor.connect('allocate', allocate); - container.remove_child(appMenu.container); - taskbar = new Taskbar.taskbar(); - Main.overview.dashIconSize = taskbar.iconSize; + //create a global object that can emit signals and conveniently expose functionalities to other extensions + global.zorinTaskbar = {}; + Signals.addSignalMethods(global.zorinTaskbar); + + _enable(); +} - container.insert_child_at_index( taskbar.actor, 2 ); +function _enable() { + let zorinDash = Main.extensionManager ? + Main.extensionManager.lookup(ZORIN_DASH_UUID) : //gnome-shell >= 3.33.4 + ExtensionUtils.extensions[ZORIN_DASH_UUID]; - // 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; + if (zorinDash && zorinDash.stateObj && zorinDash.stateObj.dockManager) { + // Disable Zorin Dash + let extensionOrder = (extensionSystem.extensionOrder || extensionSystem._extensionOrder); - // sync hover after a popupmenu is closed - taskbar.connect('menu-closed', Lang.bind(this, function(){container.sync_hover();})); + Utils.getStageTheme().get_theme().unload_stylesheet(zorinDash.stylesheet); + zorinDash.stateObj.disable(); + disabledZorinDash = true; + zorinDash.state = 2; //ExtensionState.DISABLED + extensionOrder.splice(extensionOrder.indexOf(ZORIN_DASH_UUID), 1); - signalsHandler = new Convenience.GlobalSignalsHandler(); - signalsHandler.add( - // Keep dragged icon consistent in size with this dash - [ - taskbar, - 'icon-size-changed', - Lang.bind(this, function() { - Main.overview.dashIconSize = taskbar.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 = taskbar.iconSize; - }) - ] + //reset to prevent conflicts with the zorin-dash + if (panelManager) { + disable(true); + } + } + + if (panelManager) return; //already initialized + + Me.settings = Convenience.getSettings('org.gnome.shell.extensions.zorin-taskbar'); + Me.desktopSettings = Convenience.getSettings('org.gnome.desktop.interface'); + + panelManager = new PanelManager.dtpPanelManager(); + + panelManager.enable(); + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(this, function() { + panelManager.primaryPanel.taskbar.popupFocusedAppSecondaryMenu(); + }), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP ); - } -function disable() { - signalsHandler.destroy(); - container.remove_child(taskbar.actor); - container.add_child(appMenu.container); - taskbar.destroy(); - panel.actor.disconnect(panelConnectId); - - // reset stored icon size to the default dash - Main.overview.dashIconSize = Main.overview._controls.dash.iconSize; - - appMenu = null; - container = null; - panel = null; - panelConnectId = null; - signalsHandler = null; - taskbar = null; + // Pretend I'm the dash: meant to make appgrd swarm animation come from the + // right position of the appShowButton. + oldDash = Main.overview._dash; + Main.overview._dash = panelManager.primaryPanel.taskbar; } -function allocate(actor, box, flags) { - let allocWidth = box.x2 - box.x1; - let allocHeight = box.y2 - box.y1; +function disable(reset) { + panelManager.disable(); + Main.overview._dash = oldDash; + Me.settings.run_dispose(); + Me.desktopSettings.run_dispose(); - let [leftMinWidth, leftNaturalWidth] = panel._leftBox.get_preferred_width(-1); - let [centerMinWidth, centerNaturalWidth] = panel._centerBox.get_preferred_width(-1); - let [rightMinWidth, rightNaturalWidth] = panel._rightBox.get_preferred_width(-1); + delete Me.settings; + oldDash = null; + panelManager = null; + + Utils.removeKeybinding('open-application-menu'); + Utils.addKeybinding( + 'open-application-menu', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Lang.bind(Main.wm, Main.wm._toggleAppMenu), + Shell.ActionMode.NORMAL | Shell.ActionMode.POPUP + ); - let sideWidth = allocWidth - rightNaturalWidth - centerNaturalWidth; + if (!reset) { + extensionSystem.disconnect(extensionChangedHandler); + delete global.zorinTaskbar; - let childBox = new Clutter.ActorBox(); - - childBox.y1 = 0; - childBox.y2 = allocHeight; - if (panel.actor.get_text_direction() == Clutter.TextDirection.RTL) { - childBox.x1 = allocWidth - Math.min(Math.floor(sideWidth), leftNaturalWidth); - childBox.x2 = allocWidth; - } else { - childBox.x1 = 0; - childBox.x2 = sideWidth; + // Re-enable Zorin Dash if it was disabled by Zorin Taskbar + if (disabledZorinDash && Main.sessionMode.allowExtensions) { + (extensionSystem._callExtensionEnable || extensionSystem.enableExtension).call(extensionSystem, ZORIN_DASH_UUID); + } } - panel._leftBox.allocate(childBox, flags); - - childBox.y1 = 0; - childBox.y2 = allocHeight; - if (panel.actor.get_text_direction() == Clutter.TextDirection.RTL) { - childBox.x1 = rightNaturalWidth; - childBox.x2 = childBox.x1 + centerNaturalWidth; - } else { - childBox.x1 = allocWidth - centerNaturalWidth - rightNaturalWidth; - childBox.x2 = childBox.x1 + centerNaturalWidth; - } - panel._centerBox.allocate(childBox, flags); - - childBox.y1 = 0; - childBox.y2 = allocHeight; - if (panel.actor.get_text_direction() == Clutter.TextDirection.RTL) { - childBox.x1 = 0; - childBox.x2 = rightNaturalWidth; - } else { - childBox.x1 = allocWidth - rightNaturalWidth; - childBox.x2 = allocWidth; - } - panel._rightBox.allocate(childBox, flags); - - let [cornerMinWidth, cornerWidth] = panel._leftCorner.actor.get_preferred_width(-1); - let [cornerMinHeight, cornerHeight] = panel._leftCorner.actor.get_preferred_width(-1); - childBox.x1 = 0; - childBox.x2 = cornerWidth; - childBox.y1 = allocHeight; - childBox.y2 = allocHeight + cornerHeight; - panel._leftCorner.actor.allocate(childBox, flags); - - let [cornerMinWidth, cornerWidth] = panel._rightCorner.actor.get_preferred_width(-1); - let [cornerMinHeight, cornerHeight] = panel._rightCorner.actor.get_preferred_width(-1); - childBox.x1 = allocWidth - cornerWidth; - childBox.x2 = allocWidth; - childBox.y1 = allocHeight; - childBox.y2 = allocHeight + cornerHeight; - panel._rightCorner.actor.allocate(childBox, flags); } diff --git a/img/show-desktop-symbolic.svg b/img/show-desktop-symbolic.svg new file mode 100644 index 0000000..d4ef792 --- /dev/null +++ b/img/show-desktop-symbolic.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + image/svg+xml + + Paper Symbolic Icon Theme + + + + + + + + + + + + + Paper Symbolic Icon Theme + + + + + + + + + + + + + + + + + + + + + + diff --git a/intellihide.js b/intellihide.js new file mode 100644 index 0000000..bdba85b --- /dev/null +++ b/intellihide.js @@ -0,0 +1,441 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Panel extension + */ + +const Lang = imports.lang; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +var GrabHelper = imports.ui.grabHelper; +const Layout = imports.ui.layout; +const Main = imports.ui.main; +const OverviewControls = imports.ui.overviewControls; +const PointerWatcher = imports.ui.pointerWatcher; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +var INTELLIHIDE_PRESSURE_THRESHOLD = 100; +var INTELLIHIDE_PRESSURE_TIME = 1000; +var INTELLIHIDE_ANIMATION_TIME = 200; +var INTELLIHIDE_CLOSE_DELAY = 400; +var INTELLIHIDE_ENABLE_START_DELAY = 2000; + +//timeout intervals +const CHECK_POINTER_MS = 200; +const CHECK_GRAB_MS = 400; +const POST_ANIMATE_MS = 50; +const MIN_UPDATE_MS = 250; + +//timeout names +const T1 = 'checkGrabTimeout'; +const T2 = 'limitUpdateTimeout'; +const T3 = 'postAnimateTimeout'; +const T4 = 'panelBoxClipTimeout'; + +var SIDE_CONTROLS_ANIMATION_TIME = OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / (OverviewControls.SIDE_CONTROLS_ANIMATION_TIME > 1 ? 1000 : 1); + +var Hold = { + NONE: 0, + TEMPORARY: 1, + PERMANENT: 2 +}; + +var Intellihide = Utils.defineClass({ + Name: 'ZorinTaskbar.Intellihide', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this._panelBox = dtpPanel.panelBox; + this._panelManager = dtpPanel.panelManager; + this._proximityManager = this._panelManager.proximityManager; + this._holdStatus = Hold.NONE; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._intellihideChangedId = Me.settings.connect('changed::intellihide', () => this._changeEnabledStatus()); + this._intellihideOnlySecondaryChangedId = Me.settings.connect('changed::intellihide-only-secondary', () => this._changeEnabledStatus()); + + this.enabled = false; + this._changeEnabledStatus(); + }, + + enable: function() { + this.enabled = true; + this._monitor = this._dtpPanel.monitor; + this._animationDestination = -1; + this._pendingUpdate = false; + this._hoveredOut = false; + this._windowOverlap = false; + this._translationProp = 'translation_' + (this._dtpPanel.checkIfVertical() ? 'x' : 'y'); + + this._panelBox.translation_y = 0; + this._panelBox.translation_x = 0; + + this._setTrackPanel(true); + this._bindGeneralSignals(); + + if (Me.settings.get_boolean('intellihide-hide-from-windows')) { + this._proximityWatchId = this._proximityManager.createWatch( + this._panelBox.get_parent(), + Proximity.Mode[Me.settings.get_string('intellihide-behaviour')], + 0, 0, + overlap => { + this._windowOverlap = overlap; + this._queueUpdatePanelPosition(); + } + ); + } + + this._setRevealMechanism(); + this._queueUpdatePanelPosition(); + this._toggleFloatingRoundedTheme(); + }, + + disable: function(reset) { + if (this._proximityWatchId) { + this._proximityManager.removeWatch(this._proximityWatchId); + } + + this._setTrackPanel(false); + + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + + this._removeRevealMechanism(); + + this._revealPanel(!reset); + + this.enabled = false; + + if (this._panelBox.has_style_class_name('floating')) { + this._panelBox.remove_style_class_name('floating'); + + this._resetPanelGeometry(); + } + }, + + destroy: function() { + Me.settings.disconnect(this._intellihideChangedId); + Me.settings.disconnect(this._intellihideOnlySecondaryChangedId); + + if (this.enabled) { + this.disable(); + } + }, + + toggle: function() { + this[this._holdStatus & Hold.PERMANENT ? 'release' : 'revealAndHold'](Hold.PERMANENT); + }, + + revealAndHold: function(holdStatus) { + if (this.enabled && !this._holdStatus) { + this._revealPanel(); + } + + this._holdStatus |= holdStatus; + }, + + release: function(holdStatus) { + this._holdStatus -= holdStatus; + + if (this.enabled && !this._holdStatus) { + this._queueUpdatePanelPosition(); + } + }, + + reset: function() { + this.disable(true); + this.enable(); + }, + + _toggleFloatingRoundedTheme: function() { + if (Me.settings.get_boolean('intellihide-floating-rounded-theme')) { + if (!this._panelBox.has_style_class_name('floating')) + this._panelBox.add_style_class_name('floating'); + } else { + if (this._panelBox.has_style_class_name('floating')) + this._panelBox.remove_style_class_name('floating'); + } + + this._resetPanelGeometry(); + }, + + _resetPanelGeometry: function() { + this._dtpPanel.geom = this._dtpPanel.getGeometry(); + this._dtpPanel._setPanelGhostSize(); + this._dtpPanel._setPanelPosition(); + this._dtpPanel.dynamicTransparency.updateExternalStyle(); + }, + + _changeEnabledStatus: function() { + let intellihide = Me.settings.get_boolean('intellihide'); + let onlySecondary = Me.settings.get_boolean('intellihide-only-secondary'); + let enabled = intellihide && !(this._dtpPanel.isPrimary && onlySecondary); + + if (this.enabled !== enabled) { + this[enabled ? 'enable' : 'disable'](); + } + }, + + _bindGeneralSignals: function() { + this._signalsHandler.add( + [ + this._dtpPanel.taskbar, + 'menu-closed', + () => this._panelBox.sync_hover() + ], + [ + Me.settings, + [ + 'changed::intellihide-use-pressure', + 'changed::intellihide-hide-from-windows', + 'changed::intellihide-behaviour' + ], + () => this.reset() + ], + [ + Me.settings, + [ + 'changed::intellihide-floating-rounded-theme' + ], + () => this._toggleFloatingRoundedTheme() + ], + [ + this._panelBox, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._dtpPanel.taskbar.previewMenu, + 'open-state-changed', + () => this._queueUpdatePanelPosition() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._queueUpdatePanelPosition() + ] + ); + }, + + _onHoverChanged: function() { + this._hoveredOut = !this._panelBox.hover; + this._queueUpdatePanelPosition(); + }, + + _setTrackPanel: function(enable) { + let trackedIndex = Main.layoutManager._findActor(this._panelBox); + let actorData = Main.layoutManager._trackedActors[trackedIndex] + + actorData.affectsStruts = !enable; + actorData.trackFullscreen = !enable; + + this._panelBox.track_hover = enable; + this._panelBox.reactive = enable; + this._panelBox.visible = enable ? enable : this._panelBox.visible; + + Main.layoutManager._queueUpdateRegions(); + }, + + _setRevealMechanism: function() { + if (global.display.supports_extended_barriers() && Me.settings.get_boolean('intellihide-use-pressure')) { + this._edgeBarrier = this._createBarrier(); + this._pressureBarrier = new Layout.PressureBarrier( + INTELLIHIDE_PRESSURE_THRESHOLD, + INTELLIHIDE_PRESSURE_TIME, + Shell.ActionMode.NORMAL + ); + this._pressureBarrier.addBarrier(this._edgeBarrier); + this._signalsHandler.add([this._pressureBarrier, 'trigger', () => this._queueUpdatePanelPosition(true)]); + } else { + this._pointerWatch = PointerWatcher.getPointerWatcher() + .addWatch(CHECK_POINTER_MS, (x, y) => this._checkMousePointer(x, y)); + } + }, + + _removeRevealMechanism: function() { + if (this._pointerWatch) { + PointerWatcher.getPointerWatcher()._removeWatch(this._pointerWatch); + } + + if (this._pressureBarrier) { + this._pressureBarrier.destroy(); + this._edgeBarrier.destroy(); + } + }, + + _createBarrier: function() { + let position = this._dtpPanel.geom.position; + let opts = { display: global.display }; + + if (this._dtpPanel.checkIfVertical()) { + opts.y1 = this._monitor.y; + opts.y2 = this._monitor.y + this._monitor.height; + opts.x1 = opts.x2 = this._monitor.x; + } else { + opts.x1 = this._monitor.x; + opts.x2 = this._monitor.x + this._monitor.width; + opts.y1 = opts.y2 = this._monitor.y; + } + + if (position == St.Side.TOP) { + opts.directions = Meta.BarrierDirection.POSITIVE_Y; + } else if (position == St.Side.BOTTOM) { + opts.y1 = opts.y2 = opts.y1 + this._monitor.height; + opts.directions = Meta.BarrierDirection.NEGATIVE_Y; + } else if (position == St.Side.LEFT) { + opts.directions = Meta.BarrierDirection.POSITIVE_X; + } else { + opts.x1 = opts.x2 = opts.x1 + this._monitor.width; + opts.directions = Meta.BarrierDirection.NEGATIVE_X; + } + + return new Meta.Barrier(opts); + }, + + _checkMousePointer: function(x, y) { + let position = this._dtpPanel.geom.position; + + if (!this._panelBox.hover && !Main.overview.visible && + ((position == St.Side.TOP && y <= this._monitor.y + 1) || + (position == St.Side.BOTTOM && y >= this._monitor.y + this._monitor.height - 1) || + (position == St.Side.LEFT && x <= this._monitor.x + 1) || + (position == St.Side.RIGHT && x >= this._monitor.x + this._monitor.width - 1)) && + ((x >= this._monitor.x && x < this._monitor.x + this._monitor.width) && + (y >= this._monitor.y && y < this._monitor.y + this._monitor.height))) { + this._queueUpdatePanelPosition(true); + } + }, + + _queueUpdatePanelPosition: function(fromRevealMechanism) { + if (!fromRevealMechanism && this._timeoutsHandler.getId(T2) && !Main.overview.visible) { + //unless this is a mouse interaction or entering/leaving the overview, limit the number + //of updates, but remember to update again when the limit timeout is reached + this._pendingUpdate = true; + } else if (!this._holdStatus) { + this._checkIfShouldBeVisible(fromRevealMechanism) ? this._revealPanel() : this._hidePanel(); + this._timeoutsHandler.add([T2, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + } + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdatePanelPosition(); + } + }, + + _checkIfShouldBeVisible: function(fromRevealMechanism) { + if (Main.overview.visibleTarget || this._dtpPanel.taskbar.previewMenu.opened || + this._panelBox.get_hover() || this._checkIfGrab()) { + return true; + } + + if (fromRevealMechanism) { + let mouseBtnIsPressed = global.get_pointer()[2] & Clutter.ModifierType.BUTTON1_MASK; + + //the user is trying to reveal the panel + if (this._monitor.inFullscreen && !mouseBtnIsPressed) { + return Me.settings.get_boolean('intellihide-show-in-fullscreen'); + } + + return !mouseBtnIsPressed; + } + + if (!Me.settings.get_boolean('intellihide-hide-from-windows')) { + return this._panelBox.hover; + } + + return !this._windowOverlap; + }, + + _checkIfGrab: function() { + if (GrabHelper._grabHelperStack.some(gh => gh._owner == this._dtpPanel.panel.actor)) { + //there currently is a grab on a child of the panel, check again soon to catch its release + this._timeoutsHandler.add([T1, CHECK_GRAB_MS, () => this._queueUpdatePanelPosition()]); + + return true; + } + }, + + _revealPanel: function(immediate) { + if (!this._panelBox.visible) { + this._panelBox.visible = true; + this._dtpPanel.taskbar._shownInitially = false; + } + + this._animatePanel(0, immediate); + }, + + _hidePanel: function(immediate) { + let position = this._dtpPanel.geom.position; + let size = this._panelBox[position == St.Side.LEFT || position == St.Side.RIGHT ? 'width' : 'height']; + let coefficient = position == St.Side.TOP || position == St.Side.LEFT ? -1 : 1; + + this._animatePanel(size * coefficient, immediate); + }, + + _animatePanel: function(destination, immediate) { + let animating = Utils.isAnimating(this._panelBox, this._translationProp); + + if (!((animating && destination === this._animationDestination) || + (!animating && destination === this._panelBox[this._translationProp]))) { + //the panel isn't already at, or animating to the asked destination + if (animating) { + Utils.stopAnimations(this._panelBox); + } + + this._animationDestination = destination; + + if (immediate) { + this._panelBox[this._translationProp] = destination; + this._panelBox.visible = !destination; + } else { + let tweenOpts = { + //when entering/leaving the overview, use its animation time instead of the one from the settings + time: Main.overview.visible ? + SIDE_CONTROLS_ANIMATION_TIME : + INTELLIHIDE_ANIMATION_TIME * 0.001, + //only delay the animation when hiding the panel after the user hovered out + delay: destination != 0 && this._hoveredOut ? INTELLIHIDE_CLOSE_DELAY * 0.001 : 0, + transition: 'easeOutQuad', + onComplete: () => { + this._panelBox.visible = !destination; + Main.layoutManager._queueUpdateRegions(); + this._timeoutsHandler.add([T3, POST_ANIMATE_MS, () => this._queueUpdatePanelPosition()]); + } + }; + + tweenOpts[this._translationProp] = destination; + Utils.animate(this._panelBox, tweenOpts); + } + } + + this._hoveredOut = false; + }, +}); diff --git a/metadata.json b/metadata.json old mode 100755 new mode 100644 index ecbb294..361cb74 --- a/metadata.json +++ b/metadata.json @@ -2,7 +2,8 @@ "extension-id": "zorin-taskbar", "uuid": "zorin-taskbar@zorinos.com", "name": "Zorin Taskbar", -"description": "The official taskbar for Zorin OS.", -"shell-version": [ "3.18" ], -"url": "https://github.com/ZorinOS/zorin-taskbar" +"description": "A taskbar extension for the Zorin Desktop environment.", +"shell-version": [ "3.18", "3.20", "3.22", "3.24", "3.26", "3.28", "3.30", "3.32", "3.34", "3.36", "3.38" ], +"gettext-domain": "zorin-taskbar", +"version": 9999 } diff --git a/overview.js b/overview.js new file mode 100644 index 0000000..3c4d44e --- /dev/null +++ b/overview.js @@ -0,0 +1,396 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Intellihide = Me.imports.intellihide; +const Utils = Me.imports.utils; + +const Clutter = imports.gi.Clutter; +const Lang = imports.lang; +const Main = imports.ui.main; +const Shell = imports.gi.Shell; +const Gtk = imports.gi.Gtk; +const Gdk = imports.gi.Gdk; +const Gio = imports.gi.Gio; +const Mainloop = imports.mainloop; +const IconGrid = imports.ui.iconGrid; +const ViewSelector = imports.ui.viewSelector; + +const Meta = imports.gi.Meta; + +const GS_HOTKEYS_KEY = 'switch-to-application-'; +const OVERLAY_TIMEOUT = 750; +const SHORTCUT_TIMEOUT = 2000; + +//timeout names +const T1 = 'swipeEndTimeout'; + +var dtpOverview = Utils.defineClass({ + Name: 'ZorinTaskbar.Overview', + + _init: function() { + this._numHotkeys = 10; + this._timeoutsHandler = new Utils.TimeoutsHandler(); + }, + + enable : function(panel) { + this._panel = panel; + this.taskbar = panel.taskbar; + + this._injectionsHandler = new Utils.InjectionsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._optionalWorkspaceIsolation(); + this._optionalHotKeys(); + this._optionalNumberOverlay(); + this._toggleDash(); + }, + + disable: function () { + this._signalsHandler.destroy(); + this._injectionsHandler.destroy(); + + this._toggleDash(true); + + // Remove key bindings + this._disableHotKeys(); + this._disableExtraShortcut(); + }, + + _toggleDash: function(visible) { + // To hide the dash, set its 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) + + if (visible === undefined) { + visible = false; + } + + let visibilityFunc = visible ? 'show' : 'hide'; + let width = visible ? -1 : 1; + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + + overviewControls.dash.actor[visibilityFunc](); + overviewControls.dash.actor.set_width(width); + + // This force the recalculation of the icon size + overviewControls.dash._maxHeight = -1; + }, + + /** + * Isolate overview to open new windows for inactive apps + */ + _optionalWorkspaceIsolation: function() { + let label = 'optionalWorkspaceIsolation'; + + this._signalsHandler.add([ + Me.settings, + 'changed::isolate-workspaces', + Lang.bind(this, function() { + this._panel.panelManager.allPanels.forEach(p => p.taskbar.resetAppIcons()); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + else + Lang.bind(this, disable)(); + }) + ]); + + if (Me.settings.get_boolean('isolate-workspaces')) + Lang.bind(this, enable)(); + + function enable() { + this._injectionsHandler.removeWithLabel(label); + + this._injectionsHandler.addWithLabel(label, [ + Shell.App.prototype, + 'activate', + IsolatedOverview + ]); + + this._signalsHandler.removeWithLabel(label); + + this._signalsHandler.addWithLabel(label, [ + global.window_manager, + 'switch-workspace', + () => this._panel.panelManager.allPanels.forEach(p => p.taskbar.handleIsolatedWorkspaceSwitch()) + ]); + } + + function disable() { + this._signalsHandler.removeWithLabel(label); + this._injectionsHandler.removeWithLabel(label); + } + + function IsolatedOverview() { + // These lines take care of Nautilus for icons on Desktop + let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = this.get_windows().filter(w => w.get_workspace().index() == activeWorkspace.index()); + + if (windows.length > 0 && + (!(windows.length == 1 && windows[0].skip_taskbar) || + this.is_on_workspace(activeWorkspace))) + return Main.activateWindow(windows[0]); + + return this.open_new_window(-1); + } + }, + + // Hotkeys + _activateApp: function(appIndex) { + let seenApps = {}; + let apps = []; + + this.taskbar._getAppIcons().forEach(function(appIcon) { + if (!seenApps[appIcon.app]) { + apps.push(appIcon); + } + + seenApps[appIcon.app] = (seenApps[appIcon.app] || 0) + 1; + }); + + this._showOverlay(); + + if (appIndex < apps.length) { + let appIcon = apps[appIndex]; + let seenAppCount = seenApps[appIcon.app]; + let windowCount = appIcon.window || appIcon._hotkeysCycle ? seenAppCount : appIcon._nWindows; + + if (Me.settings.get_boolean('shortcut-previews') && windowCount > 1 && + !(Clutter.get_current_event().get_state() & ~(Clutter.ModifierType.MOD1_MASK | Clutter.ModifierType.MOD4_MASK))) { //ignore the alt (MOD1_MASK) and super key (MOD4_MASK) + if (this._hotkeyPreviewCycleInfo && this._hotkeyPreviewCycleInfo.appIcon != appIcon) { + this._endHotkeyPreviewCycle(); + } + + if (!this._hotkeyPreviewCycleInfo) { + this._hotkeyPreviewCycleInfo = { + appIcon: appIcon, + currentWindow: appIcon.window, + keyFocusOutId: appIcon.actor.connect('key-focus-out', () => appIcon.actor.grab_key_focus()), + capturedEventId: global.stage.connect('captured-event', (actor, e) => { + if (e.type() == Clutter.EventType.KEY_RELEASE && e.get_key_symbol() == (Clutter.KEY_Super_L || Clutter.Super_L)) { + this._endHotkeyPreviewCycle(true); + } + + return Clutter.EVENT_PROPAGATE; + }) + }; + + appIcon._hotkeysCycle = appIcon.window; + appIcon.window = null; + appIcon._previewMenu.open(appIcon); + appIcon.actor.grab_key_focus(); + } + + appIcon._previewMenu.focusNext(); + } else { + // Activate with button = 1, i.e. same as left click + let button = 1; + this._endHotkeyPreviewCycle(); + appIcon.activate(button, true); + } + } + }, + + _endHotkeyPreviewCycle: function(focusWindow) { + if (this._hotkeyPreviewCycleInfo) { + global.stage.disconnect(this._hotkeyPreviewCycleInfo.capturedEventId); + this._hotkeyPreviewCycleInfo.appIcon.actor.disconnect(this._hotkeyPreviewCycleInfo.keyFocusOutId); + + if (focusWindow) { + this._hotkeyPreviewCycleInfo.appIcon._previewMenu.activateFocused(); + } + + this._hotkeyPreviewCycleInfo.appIcon.window = this._hotkeyPreviewCycleInfo.currentWindow; + delete this._hotkeyPreviewCycleInfo.appIcon._hotkeysCycle; + this._hotkeyPreviewCycleInfo = 0; + } + }, + + _optionalHotKeys: function() { + this._hotKeysEnabled = false; + if (Me.settings.get_boolean('hot-keys')) + this._enableHotKeys(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys')) + Lang.bind(this, this._enableHotKeys)(); + else + Lang.bind(this, this._disableHotKeys)(); + }) + ]); + }, + + _resetHotkeys: function() { + this._disableHotKeys(); + this._enableHotKeys(); + }, + + _enableHotKeys: function() { + if (this._hotKeysEnabled) + return; + + //3.32 introduced app hotkeys, disable them to prevent conflicts + if (Main.wm._switchToApplication) { + for (let i = 1; i < 10; ++i) { + Utils.removeKeybinding(GS_HOTKEYS_KEY + i); + } + } + + // Setup keyboard bindings for taskbar elements + let shortcutNumKeys = Me.settings.get_string('shortcut-num-keys'); + let bothNumKeys = shortcutNumKeys == 'BOTH'; + let keys = []; + + if (bothNumKeys || shortcutNumKeys == 'NUM_ROW') { + keys.push('app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-'); // Regular numbers + } + + if (bothNumKeys || shortcutNumKeys == 'NUM_KEYPAD') { + keys.push('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; + + Utils.addKeybinding(key + (i + 1), Me.settings, () => this._activateApp(appNum)); + } + }, this); + + this._hotKeysEnabled = true; + + if (Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(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++) { + Utils.removeKeybinding(key + (i + 1)); + } + }, this); + + if (Main.wm._switchToApplication) { + let gsSettings = new Gio.Settings({ schema_id: imports.ui.windowManager.SHELL_KEYBINDINGS_SCHEMA }); + + for (let i = 1; i < 10; ++i) { + Utils.addKeybinding(GS_HOTKEYS_KEY + i, gsSettings, Main.wm._switchToApplication.bind(Main.wm)); + } + } + + this._hotKeysEnabled = false; + + this.taskbar.toggleNumberOverlay(false); + }, + + _optionalNumberOverlay: function() { + // Enable extra shortcut + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + + this._signalsHandler.add([ + Me.settings, + 'changed::hot-keys', + Lang.bind(this, this._checkHotkeysOptions) + ], [ + Me.settings, + 'changed::hotkeys-overlay-combo', + Lang.bind(this, function() { + if (Me.settings.get_boolean('hot-keys') && Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.taskbar.toggleNumberOverlay(true); + else + this.taskbar.toggleNumberOverlay(false); + }) + ], [ + Me.settings, + 'changed::shortcut-num-keys', + () => this._resetHotkeys() + ]); + }, + + _checkHotkeysOptions: function() { + if (Me.settings.get_boolean('hot-keys')) + this._enableExtraShortcut(); + else + this._disableExtraShortcut(); + }, + + _enableExtraShortcut: function() { + Utils.addKeybinding('shortcut', Me.settings, () => this._showOverlay(true)); + }, + + _disableExtraShortcut: function() { + Utils.removeKeybinding('shortcut'); + }, + + _showOverlay: function(overlayFromShortcut) { + //wait for intellihide timeout initialization + if (!this._panel.intellihide) { + return; + } + + // Restart the counting if the shortcut is pressed again + if (this._numberOverlayTimeoutId) { + Mainloop.source_remove(this._numberOverlayTimeoutId); + this._numberOverlayTimeoutId = 0; + } + + let hotkey_option = Me.settings.get_string('hotkeys-overlay-combo'); + + if (hotkey_option === 'NEVER') + return; + + if (hotkey_option === 'TEMPORARILY' || overlayFromShortcut) + this.taskbar.toggleNumberOverlay(true); + + this._panel.intellihide.revealAndHold(Intellihide.Hold.TEMPORARY); + + let timeout = OVERLAY_TIMEOUT; + + if (overlayFromShortcut) { + timeout = SHORTCUT_TIMEOUT; + } + + // Hide the overlay/dock after the timeout + this._numberOverlayTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, function() { + this._numberOverlayTimeoutId = 0; + + if (hotkey_option != 'ALWAYS') { + this.taskbar.toggleNumberOverlay(false); + } + + this._panel.intellihide.release(Intellihide.Hold.TEMPORARY); + })); + } +}); diff --git a/panel.js b/panel.js new file mode 100644 index 0000000..701c8d7 --- /dev/null +++ b/panel.js @@ -0,0 +1,1446 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const Gtk = imports.gi.Gtk; +const Gi = imports._gi; +const Gio = imports.gi.Gio; +const AppIcons = Me.imports.appIcons; +const Utils = Me.imports.utils; +const Taskbar = Me.imports.taskbar; +const Pos = Me.imports.panelPositions; +const PanelStyle = Me.imports.panelStyle; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const Dash = imports.ui.dash; +const CtrlAltTab = imports.ui.ctrlAltTab; +const Panel = imports.ui.panel; +const PanelMenu = imports.ui.panelMenu; +const St = imports.gi.St; +const GLib = imports.gi.GLib; +const Meta = imports.gi.Meta; +const Pango = imports.gi.Pango; +const DND = imports.ui.dnd; +const Shell = imports.gi.Shell; +const PopupMenu = imports.ui.popupMenu; +const IconGrid = imports.ui.iconGrid; +const ViewSelector = imports.ui.viewSelector; +const DateMenu = imports.ui.dateMenu; +const Volume = imports.ui.status.volume; +const Progress = Me.imports.progress; + +const Intellihide = Me.imports.intellihide; +const Transparency = Me.imports.transparency; +const _ = imports.gettext.domain(Me.imports.utils.TRANSLATION_DOMAIN).gettext; + +let tracker = Shell.WindowTracker.get_default(); +var panelBoxes = ['_leftBox', '_centerBox', '_rightBox']; + +var SHOW_DESKTOP_ICON = Me.path + '/img/show-desktop-symbolic.svg'; + +//timeout names +const T1 = 'startDynamicTransparencyTimeout'; +const T2 = 'startIntellihideTimeout'; +const T3 = 'allocationThrottleTimeout'; +const T4 = 'showDesktopTimeout'; +const T5 = 'trackerFocusAppTimeout'; +const T6 = 'waitPanelBoxAllocation'; + +const SHOW_SHOWDESKTOP_DELAY = 1000; +const SHOW_SHOWDESKTOP_TIME = 200; + +var dtpPanel = Utils.defineClass({ + Name: 'ZorinTaskbar-Panel', + Extends: St.Widget, + + _init: function(panelManager, monitor, panelBox, isStandalone) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); + + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this.panelManager = panelManager; + this.panelStyle = new PanelStyle.dtpPanelStyle(); + + this.monitor = monitor; + this.panelBox = panelBox; + + // when the original gnome-shell top panel is kept, all panels are "standalone", + // so in this case use isPrimary to get the panel on the primary dtp monitor, which + // might be different from the system's primary monitor. + this.isStandalone = isStandalone; + this.isPrimary = !isStandalone; + + this._sessionStyle = null; + this._unmappedButtons = []; + this._elementGroups = []; + this.cornerSize = 0; + + let position = this.getPosition(); + + if (isStandalone) { + this.panel = new dtpSecondaryPanel({ name: 'panel', reactive: true }); + this.statusArea = this.panel.statusArea = {}; + + Utils.wrapActor(this.panel); + + //next 3 functions are needed by other extensions to add elements to the secondary panel + this.panel.addToStatusArea = function(role, indicator, position, box) { + return Main.panel.addToStatusArea.call(this, role, indicator, position, box); + }; + + this.panel._addToPanelBox = function(role, indicator, position, box) { + Main.panel._addToPanelBox.call(this, role, indicator, position, box); + }; + + this.panel._onMenuSet = function(indicator) { + Main.panel._onMenuSet.call(this, indicator); + }; + + this._leftBox = this.panel._leftBox = new St.BoxLayout({ name: 'panelLeft' }); + this._centerBox = this.panel._centerBox = new St.BoxLayout({ name: 'panelCenter' }); + this._rightBox = this.panel._rightBox = new St.BoxLayout({ name: 'panelRight' }); + + this.menuManager = this.panel.menuManager = new PopupMenu.PopupMenuManager(this.panel); + + this._setPanelMenu('aggregateMenu', dtpSecondaryAggregateMenu, this.panel.actor); + this._setPanelMenu('dateMenu', DateMenu.DateMenuButton, this.panel.actor); + this._setPanelMenu('activities', Panel.ActivitiesButton, this.panel.actor); + + this.panel.add_child(this._leftBox); + this.panel.add_child(this._centerBox); + this.panel.add_child(this._rightBox); + } else { + this.panel = Main.panel; + this.statusArea = Main.panel.statusArea; + this.menuManager = Main.panel.menuManager; + + panelBoxes.forEach(p => this[p] = Main.panel[p]); + + ['activities', 'aggregateMenu', 'dateMenu'].forEach(b => { + let container = this.statusArea[b].container; + let parent = container.get_parent(); + + container._dtpOriginalParent = parent; + parent ? parent.remove_child(container) : null; + this.panel.actor.add_child(container); + }); + } + + // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of + // its behavior is handled by the taskbar, but its positioning is done at the panel level + this.showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this); + this.panel.actor.add_child(this.showAppsIconWrapper.realShowAppsIcon); + + this.panel.actor._delegate = this; + + Utils.wrapActor(this.statusArea.activities); + + this.add_child(this.panel.actor); + + if (Main.panel._onButtonPress || Main.panel._tryDragWindow) { + this._signalsHandler.add([ + this.panel.actor, + [ + 'button-press-event', + 'touch-event' + ], + this._onButtonPress.bind(this) + ]); + } + + if (Main.panel._onKeyPress) { + this._signalsHandler.add([this.panel.actor, 'key-press-event', Main.panel._onKeyPress.bind(this)]); + } + + Main.ctrlAltTabManager.addGroup(this, _("Top Bar")+" "+ monitor.index, 'focus-top-bar-symbolic', + { sortGroup: CtrlAltTab.SortGroup.TOP }); + }, + + enable : function() { + let position = this.getPosition(); + + if (this.statusArea.aggregateMenu) { + Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll = 1; + } + + this.geom = this.getGeometry(); + + // The overview uses the panel height as a margin by way of a "ghost" transparent Clone + // This pushes everything down, which isn't desired when the panel is moved to the bottom + // I'm adding a 2nd ghost panel and will resize the top or bottom ghost depending on the panel position + this._myPanelGhost = new Clutter.Actor({ + x: this.geom.x, + y: this.geom.y , + reactive: false, + opacity: 0 + }); + + let isTop = this.geom.position == St.Side.TOP; + + if (isTop) { + this.panel._leftCorner = this.panel._leftCorner || new Panel.PanelCorner(St.Side.LEFT); + this.panel._rightCorner = this.panel._rightCorner || new Panel.PanelCorner(St.Side.RIGHT); + + Main.overview._overview.insert_child_at_index(this._myPanelGhost, 0); + } else { + let overviewControls = Main.overview._overview._controls || Main.overview._controls; + + if (this.geom.position == St.Side.BOTTOM) { + Main.overview._overview.add_actor(this._myPanelGhost); + } else if (this.geom.position == St.Side.LEFT) { + overviewControls._group.insert_child_at_index(this._myPanelGhost, 0); + } else { + overviewControls._group.add_actor(this._myPanelGhost); + } + } + + if (this.panel._leftCorner) { + Utils.wrapActor(this.panel._leftCorner); + Utils.wrapActor(this.panel._rightCorner); + + if (isTop) { + if (this.isStandalone) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + } else if (Config.PACKAGE_VERSION >= '3.32') { + this.panel.actor.remove_child(this.panel._leftCorner.actor); + this.panel.actor.remove_child(this.panel._rightCorner.actor); + } + } + + this._setPanelPosition(); + + if (!this.isStandalone) { + if (this.panel.vfunc_allocate) { + this._panelConnectId = 0; + Utils.hookVfunc(this.panel.__proto__, 'allocate', (box, flags) => this._mainPanelAllocate(0, box, flags)); + } else { + this._panelConnectId = this.panel.actor.connect('allocate', (actor, box, flags) => this._mainPanelAllocate(actor, box, flags)); + } + + // remove the extra space before the clock when the message-indicator is displayed + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', () => [0,0]); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', () => [0,0]); + } + } + + if (!DateMenu.IndicatorPad && this.statusArea.dateMenu) { + //3.36 switched to a size constraint applied on an anonymous child + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints = indicatorPad.get_constraints(); + indicatorPad.clear_constraints(); + } + + // The main panel's connection to the "allocate" signal is competing with this extension + // trying to move the centerBox over to the right, creating a never-ending cycle. + // Since we don't have the ID to disconnect that handler, wrap the allocate() function + // it calls instead. If the call didn't originate from this file, ignore it. + panelBoxes.forEach(b => { + this[b].allocate = (box, flags, isFromZorinTaskbar) => { + if (isFromZorinTaskbar) { + Utils.allocate(this[b], box, flags, true); + } + } + }); + + this.menuManager._oldChangeMenu = this.menuManager._changeMenu; + this.menuManager._changeMenu = (menu) => { + this.menuManager._oldChangeMenu(menu); + }; + + if (this.statusArea.appMenu) { + this._leftBox.remove_child(this.statusArea.appMenu.container); + } + + this.dynamicTransparency = new Transparency.DynamicTransparency(this); + + this.taskbar = new Taskbar.taskbar(this); + + this.panel.actor.add_child(this.taskbar.actor); + + this._setAppmenuVisible(false); + this._setShowDesktopButton(true); + + this._setAllocationMap(); + + this.panel.actor.add_style_class_name('zorintaskbarMainPanel ' + this.getOrientation()); + + // 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._setPanelGhostSize(); + + this._timeoutsHandler.add([T2, Intellihide.INTELLIHIDE_ENABLE_START_DELAY, () => this.intellihide = new Intellihide.Intellihide(this)]); + + this._signalsHandler.add( + // this is to catch changes to the theme or window scale factor + [ + Utils.getStageTheme(), + 'changed', + () => (this._resetGeometry(), this._setShowDesktopButtonStyle()), + ], + [ + // sync hover after a popupmenu is closed + this.taskbar, + 'menu-closed', + Lang.bind(this, function(){this.panel.actor.sync_hover();}) + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._adjustForOverview() + ], + [ + Main.overview, + 'hidden', + () => { + if (this.isPrimary) { + //reset the primary monitor when exiting the overview + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this.statusArea.activities.actor, + 'captured-event', + (actor, e) => { + if (e.type() == Clutter.EventType.BUTTON_PRESS || e.type() == Clutter.EventType.TOUCH_BEGIN) { + //temporarily use as primary the monitor on which the activities btn was clicked + this.panelManager.setFocusedMonitor(this.monitor, true); + } + } + ], + [ + this._centerBox, + 'actor-added', + () => this._onBoxActorAdded(this._centerBox) + ], + [ + this._rightBox, + 'actor-added', + () => this._onBoxActorAdded(this._rightBox) + ], + [ + Main.layoutManager, + 'startup-complete', + () => this._resetGeometry() + ] + ); + + this._bindSettingsChanges(); + + this.panelStyle.enable(this); + + if (this.checkIfVertical()) { + this._signalsHandler.add([ + this.panelBox, + 'notify::visible', + () => { + if (this.panelBox.visible) { + this._refreshVerticalAlloc(); + } + } + ]); + + this._setSearchEntryOffset(this.geom.w); + + if (this.statusArea.dateMenu) { + this._formatVerticalClock(); + + this._signalsHandler.add([ + this.statusArea.dateMenu._clock, + 'notify::clock', + () => this._formatVerticalClock() + ]); + } + } + + // Since we are usually visible but not usually changing, make sure + // most repaint requests don't actually require us to repaint anything. + // This saves significant CPU when repainting the screen. + this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); + + this._initProgressManager(); + }, + + disable: function () { + this.panelStyle.disable(); + + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + this._disablePanelCornerSignals(); + + this.panel.actor.remove_child(this.taskbar.actor); + this._setAppmenuVisible(false); + + if (this.intellihide) { + this.intellihide.destroy(); + } + + this.dynamicTransparency.destroy(); + + this.progressManager.destroy(); + + this.taskbar.destroy(); + this.showAppsIconWrapper.destroy(); + + this.menuManager._changeMenu = this.menuManager._oldChangeMenu; + + this._myPanelGhost.get_parent().remove_actor(this._myPanelGhost); + this._setSearchEntryOffset(0); + + panelBoxes.forEach(b => delete this[b].allocate); + this._unmappedButtons.forEach(a => this._disconnectVisibleId(a)); + + if (this._dateMenuIndicatorPadContraints && this.statusArea.dateMenu) { + let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); + + this._dateMenuIndicatorPadContraints.forEach(c => indicatorPad.add_constraint(c)); + } + + this._setVertical(this.panel.actor, false); + + if (!this.isStandalone) { + this.statusArea.dateMenu._clockDisplay.text = this.statusArea.dateMenu._clock.clock; + + ['vertical', 'horizontal', 'zorintaskbarMainPanel'].forEach(c => this.panel.actor.remove_style_class_name(c)); + + if (!Main.sessionMode.isLocked) { + [['activities', 0], ['aggregateMenu', -1], ['dateMenu', 0]].forEach(b => { + let container = this.statusArea[b[0]].container; + let originalParent = container._dtpOriginalParent; + + this.panel.actor.remove_child(container); + originalParent ? originalParent.insert_child_at_index(container, b[1]) : null; + delete container._dtpOriginalParent; + }); + + if (this.statusArea.appMenu) { + this._leftBox.add_child(this.statusArea.appMenu.container); + } + } + + if (!this.panel._leftCorner.actor.mapped) { + this.panel.actor.add_child(this.panel._leftCorner.actor); + this.panel.actor.add_child(this.panel._rightCorner.actor); + } + + this._setShowDesktopButton(false); + + delete Utils.getIndicators(this.statusArea.aggregateMenu._volume)._dtpIgnoreScroll; + + if (DateMenu.IndicatorPad) { + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_width', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_width); + Utils.hookVfunc(DateMenu.IndicatorPad.prototype, 'get_preferred_height', DateMenu.IndicatorPad.prototype.vfunc_get_preferred_height); + } + + if (this._panelConnectId) { + this.panel.actor.disconnect(this._panelConnectId); + } else { + Utils.hookVfunc(this.panel.__proto__, 'allocate', this.panel.__proto__.vfunc_allocate); + } + + this.panel.actor._delegate = this.panel; + } else { + this._removePanelMenu('dateMenu'); + this._removePanelMenu('aggregateMenu'); + this._removePanelMenu('activities'); + } + + Main.ctrlAltTabManager.removeGroup(this); + }, + + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) { + + // open overview so they can choose a window for focusing + // and ultimately dropping dragged item onto + if(Main.overview.shouldToggleByCornerOrButton()) + Main.overview.show(); + } + + return DND.DragMotionResult.CONTINUE; + }, + + getPosition: function() { + //for now, use the previous "global" position setting as default. The 'panel-position' should be deleted in the future + let position = this.panelManager.panelPositions[this.monitor.index] || Me.settings.get_string('panel-position'); + + if (position == Pos.TOP) { + return St.Side.TOP; + } else if (position == Pos.RIGHT) { + return St.Side.RIGHT; + } else if (position == Pos.BOTTOM) { + return St.Side.BOTTOM; + } + + return St.Side.LEFT; + }, + + checkIfVertical: function() { + let position = this.getPosition(); + + return (position == St.Side.LEFT || position == St.Side.RIGHT); + }, + + getOrientation: function() { + return (this.checkIfVertical() ? 'vertical' : 'horizontal'); + }, + + updateElementPositions: function() { + let panelPositions = this.panelManager.panelsElementPositions[this.monitor.index] || Pos.defaults; + + this._updateGroupedElements(panelPositions); + + this._disablePanelCornerSignals(); + + if (this.getPosition() == St.Side.TOP) { + let visibleElements = panelPositions.filter(pp => pp.visible); + let connectCorner = (corner, button) => { + corner._button = button; + corner._buttonStyleChangedSignalId = button.connect('style-changed', () => { + corner.set_style_pseudo_class(button.get_style_pseudo_class()); + }); + } + + if (visibleElements[0].element == Pos.ACTIVITIES_BTN) { + connectCorner(this.panel._leftCorner, this.statusArea.activities); + } + + if (visibleElements[visibleElements.length - 1].element == Pos.SYSTEM_MENU) { + connectCorner(this.panel._rightCorner, this.statusArea.aggregateMenu); + } + } + + this.panel.actor.hide(); + this.panel.actor.show(); + }, + + _updateGroupedElements: function(panelPositions) { + let previousPosition = 0; + let previousCenteredPosition = 0; + let currentGroup = -1; + + this._elementGroups = []; + + panelPositions.forEach(pos => { + let allocationMap = this.allocationMap[pos.element]; + + if (allocationMap.actor) { + allocationMap.actor.visible = pos.visible; + + if (!pos.visible) { + return; + } + + let currentPosition = pos.position; + let isCentered = Pos.checkIfCentered(currentPosition); + + if (currentPosition == Pos.STACKED_TL && previousPosition == Pos.STACKED_BR) { + currentPosition = Pos.STACKED_BR; + } + + if (!previousPosition || + (previousPosition == Pos.STACKED_TL && currentPosition != Pos.STACKED_TL) || + (previousPosition != Pos.STACKED_BR && currentPosition == Pos.STACKED_BR) || + (isCentered && previousPosition != currentPosition && previousPosition != Pos.STACKED_BR)) { + this._elementGroups[++currentGroup] = { elements: [], index: this._elementGroups.length, expandableIndex: -1 }; + previousCenteredPosition = 0; + } + + if (pos.element == Pos.TASKBAR) { + this._elementGroups[currentGroup].expandableIndex = this._elementGroups[currentGroup].elements.length; + } + + if (isCentered && !this._elementGroups[currentGroup].isCentered) { + this._elementGroups[currentGroup].isCentered = 1; + previousCenteredPosition = currentPosition; + } + + this._elementGroups[currentGroup].position = previousCenteredPosition || currentPosition; + this._elementGroups[currentGroup].elements.push(allocationMap); + + allocationMap.position = currentPosition; + previousPosition = currentPosition; + } + }); + }, + + _disablePanelCornerSignals: function() { + if (this.panel._rightCorner && this.panel._rightCorner._buttonStyleChangedSignalId) { + this.panel._rightCorner._button.disconnect(this.panel._rightCorner._buttonStyleChangedSignalId); + delete this.panel._rightCorner._buttonStyleChangedSignalId; + } + + if (this.panel._leftCorner && this.panel._leftCorner._buttonStyleChangedSignalId) { + this.panel._leftCorner._button.disconnect(this.panel._leftCorner._buttonStyleChangedSignalId); + delete this.panel._leftCorner._buttonStyleChangedSignalId; + } + }, + + _bindSettingsChanges: function() { + let isVertical = this.checkIfVertical(); + + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::panel-size', + 'changed::group-apps' + ], + () => this._resetGeometry() + ], + [ + Me.settings, + [ + 'changed::showdesktop-button-width', + 'changed::show-showdesktop-icon' + ], + () => this._setShowDesktopButtonStyle() + ], + [ + Me.desktopSettings, + 'changed::clock-format', + () => { + this._clockFormat = null; + + if (isVertical) { + this._formatVerticalClock(); + } + } + ], + [ + Me.settings, + 'changed::progress-show-bar', + () => this._initProgressManager() + ], + [ + Me.settings, + 'changed::progress-show-count', + () => this._initProgressManager() + ] + ); + + if (isVertical) { + this._signalsHandler.add([Me.settings, 'changed::group-apps-label-max-width', () => this._resetGeometry()]); + } + }, + + _setPanelMenu: function(propName, constr, container) { + if (!this.statusArea[propName]) { + this.statusArea[propName] = this._getPanelMenu(propName, constr); + this.menuManager.addMenu(this.statusArea[propName].menu); + container.insert_child_at_index(this.statusArea[propName].container, 0); + } + }, + + _removePanelMenu: function(propName) { + if (this.statusArea[propName]) { + let parent = this.statusArea[propName].container.get_parent(); + + if (parent) { + parent.remove_actor(this.statusArea[propName].container); + } + + //calling this.statusArea[propName].destroy(); is buggy for now, gnome-shell never + //destroys those panel menus... + //since we can't destroy the menu (hence properly disconnect its signals), let's + //store it so the next time a panel needs one of its kind, we can reuse it instead + //of creating a new one + let panelMenu = this.statusArea[propName]; + + this.menuManager.removeMenu(panelMenu.menu); + Me.persistentStorage[propName].push(panelMenu); + this.statusArea[propName] = null; + } + }, + + _getPanelMenu: function(propName, constr) { + Me.persistentStorage[propName] = Me.persistentStorage[propName] || []; + + if (!Me.persistentStorage[propName].length) { + Me.persistentStorage[propName].push(new constr()); + } + + return Me.persistentStorage[propName].pop(); + }, + + _setPanelGhostSize: function() { + this._myPanelGhost.set_size(this.width, this.checkIfVertical() ? 1 : this.height); + }, + + _setSearchEntryOffset: function(offset) { + if (this.isPrimary) { + //In the overview, when the panel is vertical the search-entry is the only element + //that doesn't natively take into account the size of a side dock, as it is always + //centered relatively to the monitor. This looks misaligned, adjust it here so it + //is centered like the rest of the overview elements. + let paddingSide = this.getPosition() == St.Side.LEFT ? 'left' : 'right'; + let scaleFactor = Utils.getScaleFactor(); + let style = offset ? 'padding-' + paddingSide + ':' + (offset / scaleFactor) + 'px;' : null; + let searchEntry = Main.overview._searchEntry || Main.overview._overview._searchEntry; + + searchEntry.get_parent().set_style(style); + } + }, + + _adjustForOverview: function() { + let isFocusedMonitor = this.panelManager.checkIfFocusedMonitor(this.monitor); + let isOverview = !!Main.overview.visibleTarget; + let isOverviewFocusedMonitor = isOverview && isFocusedMonitor; + let isShown = !isOverview || isOverviewFocusedMonitor; + + this.panelBox[isShown ? 'show' : 'hide'](); + + if (isOverview) { + this._myPanelGhost[isOverviewFocusedMonitor ? 'show' : 'hide'](); + + if (isOverviewFocusedMonitor) { + Utils.getPanelGhost().set_size(1, this.geom.position == St.Side.TOP ? 0 : 32); + } + } + }, + + _resetGeometry: function() { + this.geom = this.getGeometry(); + this._setPanelGhostSize(); + this._setPanelPosition(); + this.taskbar.resetAppIcons(true); + this.dynamicTransparency.updateExternalStyle(); + + if (this.intellihide && this.intellihide.enabled) { + this.intellihide.reset(); + } + + if (this.checkIfVertical()) { + this.showAppsIconWrapper.realShowAppsIcon.toggleButton.set_width(this.geom.w); + this._refreshVerticalAlloc(); + this._setSearchEntryOffset(this.geom.w); + } + }, + + getGeometry: function() { + let scaleFactor = Utils.getScaleFactor(); + let panelBoxTheme = this.panelBox.get_theme_node(); + let lrPadding = panelBoxTheme.get_padding(St.Side.RIGHT) + panelBoxTheme.get_padding(St.Side.LEFT); + let topPadding = panelBoxTheme.get_padding(St.Side.TOP); + let tbPadding = topPadding + panelBoxTheme.get_padding(St.Side.BOTTOM); + let position = this.getPosition(); + let gsTopPanelOffset = 0; + let x = 0, y = 0; + let w = 0, h = 0; + + this.dtpSize = Me.settings.get_int('panel-size') * scaleFactor; + + if (this.checkIfVertical()) { + if (!Me.settings.get_boolean('group-apps')) { + // add window title width and side padding of _dtpIconContainer when vertical + this.dtpSize += Me.settings.get_int('group-apps-label-max-width') + AppIcons.DEFAULT_PADDING_SIZE * 2 / scaleFactor; + } + + this.sizeFunc = 'get_preferred_height', + this.fixedCoord = { c1: 'x1', c2: 'x2' }, + this.varCoord = { c1: 'y1', c2: 'y2' }; + + w = this.dtpSize; + h = this.monitor.height - tbPadding - gsTopPanelOffset; + } else { + this.sizeFunc = 'get_preferred_width'; + this.fixedCoord = { c1: 'y1', c2: 'y2' }; + this.varCoord = { c1: 'x1', c2: 'x2' }; + + w = this.monitor.width - lrPadding; + h = this.dtpSize; + } + + if (position == St.Side.TOP || position == St.Side.LEFT) { + x = this.monitor.x; + y = this.monitor.y + gsTopPanelOffset; + } else if (position == St.Side.RIGHT) { + x = this.monitor.x + this.monitor.width - this.dtpSize - lrPadding; + y = this.monitor.y + gsTopPanelOffset; + } else { //BOTTOM + x = this.monitor.x; + y = this.monitor.y + this.monitor.height - this.dtpSize - tbPadding; + } + + return { + x: x, y: y, + w: w, h: h, + lrPadding: lrPadding, + tbPadding: tbPadding, + position: position + }; + }, + + _setAllocationMap: function() { + this.allocationMap = {}; + let setMap = (name, actor, isBox) => this.allocationMap[name] = { + actor: actor, + isBox: isBox || 0, + box: new Clutter.ActorBox() + }; + + setMap(Pos.SHOW_APPS_BTN, this.showAppsIconWrapper.realShowAppsIcon); + setMap(Pos.ACTIVITIES_BTN, this.statusArea.activities ? this.statusArea.activities.container : 0); + setMap(Pos.LEFT_BOX, this._leftBox, 1); + setMap(Pos.TASKBAR, this.taskbar.actor); + setMap(Pos.CENTER_BOX, this._centerBox, 1); + setMap(Pos.DATE_MENU, this.statusArea.dateMenu.container); + setMap(Pos.SYSTEM_MENU, this.statusArea.aggregateMenu.container); + setMap(Pos.RIGHT_BOX, this._rightBox, 1); + setMap(Pos.DESKTOP_BTN, this._showDesktopButton); + }, + + _mainPanelAllocate: function(actor, box, flags) { + Utils.setAllocation(this.panel.actor, box, flags); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + + let fixed = 0; + let centeredMonitorGroup; + let panelAlloc = new Clutter.ActorBox({ x1: 0, y1: 0, x2: this.geom.w, y2: this.geom.h }); + let assignGroupSize = (group, update) => { + group.size = 0; + group.tlOffset = 0; + group.brOffset = 0; + + group.elements.forEach(element => { + if (!update) { + element.box[this.fixedCoord.c1] = panelAlloc[this.fixedCoord.c1]; + element.box[this.fixedCoord.c2] = panelAlloc[this.fixedCoord.c2]; + element.natSize = element.actor[this.sizeFunc](-1)[1]; + } + + if (!group.isCentered || Pos.checkIfCentered(element.position)) { + group.size += element.natSize; + } else if (element.position == Pos.STACKED_TL) {  + group.tlOffset += element.natSize; + } else { // Pos.STACKED_BR + group.brOffset += element.natSize; + } + }); + + if (group.isCentered) { + group.size += Math.max(group.tlOffset, group.brOffset) * 2; + group.tlOffset = Math.max(group.tlOffset - group.brOffset, 0); + } + }; + let allocateGroup = (group, tlLimit, brLimit) => { + let startPosition = tlLimit; + let currentPosition = 0; + + if (group.expandableIndex >= 0) { + let availableSize = brLimit - tlLimit; + let expandable = group.elements[group.expandableIndex]; + let i = 0; + let l = this._elementGroups.length; + let tlSize = 0; + let brSize = 0; + + if (centeredMonitorGroup && (centeredMonitorGroup != group || expandable.position != Pos.CENTERED_MONITOR)) { + if (centeredMonitorGroup.index < group.index || (centeredMonitorGroup == group && expandable.position == Pos.STACKED_TL)) { + i = centeredMonitorGroup.index; + } else { + l = centeredMonitorGroup.index; + } + } + + for (; i < l; ++i) { + let refGroup = this._elementGroups[i]; + + if (i < group.index && (!refGroup.fixed || refGroup[this.varCoord.c2] > tlLimit)) { + tlSize += refGroup.size; + } else if (i > group.index && (!refGroup.fixed || refGroup[this.varCoord.c1] < brLimit)) { + brSize += refGroup.size; + } + } + + if (group.isCentered) { + availableSize -= Math.max(tlSize, brSize) * 2; + } else { + availableSize -= tlSize + brSize; + } + + if (availableSize < group.size) { + expandable.natSize -= (group.size - availableSize) * (group.isCentered && !Pos.checkIfCentered(expandable.position) ? .5 : 1); + assignGroupSize(group, true); + } + } + + if (group.isCentered) { + startPosition = tlLimit + (brLimit - tlLimit - group.size) * .5; + } else if (group.position == Pos.STACKED_BR) { + startPosition = brLimit - group.size; + } + + currentPosition = group.tlOffset + startPosition; + + group.elements.forEach(element => { + element.box[this.varCoord.c1] = Math.round(currentPosition); + element.box[this.varCoord.c2] = Math.round((currentPosition += element.natSize)); + + if (element.isBox) { + return element.actor.allocate(element.box, flags, true); + } + + Utils.allocate(element.actor, element.box, flags, false); + }); + + group[this.varCoord.c1] = startPosition; + group[this.varCoord.c2] = currentPosition; + group.fixed = 1; + ++fixed; + }; + + Utils.allocate(this.panel.actor, panelAlloc, flags); + + this._elementGroups.forEach(group => { + group.fixed = 0; + + assignGroupSize(group); + + if (group.position == Pos.CENTERED_MONITOR) { + centeredMonitorGroup = group; + } + }); + + if (centeredMonitorGroup) { + allocateGroup(centeredMonitorGroup, panelAlloc[this.varCoord.c1], panelAlloc[this.varCoord.c2]); + } + + let iterations = 0; //failsafe + while (fixed < this._elementGroups.length && ++iterations < 10) { + for (let i = 0, l = this._elementGroups.length; i < l; ++i) { + let group = this._elementGroups[i]; + + if (group.fixed) { + continue; + } + + let prevGroup = this._elementGroups[i - 1]; + let nextGroup = this._elementGroups[i + 1]; + let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : + centeredMonitorGroup && group.index > centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c2] : panelAlloc[this.varCoord.c1]; + let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : + centeredMonitorGroup && group.index < centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c1] : panelAlloc[this.varCoord.c2]; + + if (group.position == Pos.STACKED_TL) { + allocateGroup(group, panelAlloc[this.varCoord.c1], nextLimit); + } else if (group.position == Pos.STACKED_BR) { + allocateGroup(group, prevLimit, panelAlloc[this.varCoord.c2]); + } else if ((!prevGroup || prevGroup.fixed) && (!nextGroup || nextGroup.fixed)) { // CENTERED + allocateGroup(group, prevLimit, nextLimit); + } + } + } + + if (this.geom.position == St.Side.TOP) { + let childBoxLeftCorner = new Clutter.ActorBox(); + let childBoxRightCorner = new Clutter.ActorBox(); + let currentCornerSize = this.cornerSize; + let panelAllocFixedSize = box[this.fixedCoord.c2] - box[this.fixedCoord.c1]; + + [ , this.cornerSize] = this.panel._leftCorner.actor[this.sizeFunc](-1); + childBoxLeftCorner[this.varCoord.c1] = 0; + childBoxLeftCorner[this.varCoord.c2] = this.cornerSize; + childBoxLeftCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxLeftCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + childBoxRightCorner[this.varCoord.c1] = box[this.varCoord.c2] - this.cornerSize; + childBoxRightCorner[this.varCoord.c2] = box[this.varCoord.c2]; + childBoxRightCorner[this.fixedCoord.c1] = panelAllocFixedSize; + childBoxRightCorner[this.fixedCoord.c2] = panelAllocFixedSize + this.cornerSize; + + Utils.allocate(this.panel._leftCorner.actor, childBoxLeftCorner, flags); + Utils.allocate(this.panel._rightCorner.actor, childBoxRightCorner, flags); + + if (this.cornerSize != currentCornerSize) { + this._setPanelClip(); + } + } + }, + + _setPanelPosition: function() { + let clipContainer = this.panelBox.get_parent(); + + this.set_size(this.geom.w, this.geom.h); + clipContainer.set_position(this.geom.x, this.geom.y); + + this._setVertical(this.panel.actor, this.checkIfVertical()); + + // styles for theming + Object.keys(St.Side).forEach(p => { + let cssName = 'zorintaskbar' + p.charAt(0) + p.slice(1).toLowerCase(); + + this.panel.actor[(St.Side[p] == this.geom.position ? 'add' : 'remove') + '_style_class_name'](cssName); + }); + + this._setPanelClip(clipContainer); + + Main.layoutManager._updateHotCorners(); + Main.layoutManager._updatePanelBarrier(this); + }, + + _setPanelClip: function(clipContainer) { + clipContainer = clipContainer || this.panelBox.get_parent(); + this._timeoutsHandler.add([T6, 0, () => Utils.setClip(clipContainer, clipContainer.x, clipContainer.y, this.panelBox.width, this.panelBox.height + this.cornerSize)]); + }, + + _onButtonPress: function(actor, event) { + let type = event.type(); + let isPress = type == Clutter.EventType.BUTTON_PRESS; + let button = isPress ? event.get_button() : -1; + let [stageX, stageY] = event.get_coords(); + + if (button == 3 && global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, stageX, stageY) == this.panel.actor) { + //right click on an empty part of the panel, temporarily borrow and display the showapps context menu + Main.layoutManager.setDummyCursorGeometry(stageX, stageY, 0, 0); + + this.showAppsIconWrapper.createMenu(); + this.showAppsIconWrapper._menu.sourceActor = Main.layoutManager.dummyCursor; + this.showAppsIconWrapper.popupMenu(); + + return Clutter.EVENT_STOP; + } else if (Main.modalCount > 0 || event.get_source() != actor || + (!isPress && type != Clutter.EventType.TOUCH_BEGIN) || + (isPress && button != 1)) { + return Clutter.EVENT_PROPAGATE; + } + + let params = this.checkIfVertical() ? [stageY, 'y', 'height'] : [stageX, 'x', 'width']; + let dragWindow = this._getDraggableWindowForPosition.apply(this, params.concat(['maximized_' + this.getOrientation() + 'ly'])); + + if (!dragWindow) + return Clutter.EVENT_PROPAGATE; + + global.display.begin_grab_op(dragWindow, + Meta.GrabOp.MOVING, + false, /* pointer grab */ + true, /* frame action */ + button, + event.get_state(), + event.get_time(), + stageX, stageY); + + return Clutter.EVENT_STOP; + }, + + _getDraggableWindowForPosition: function(stageCoord, coord, dimension, maximizedProp) { + let workspace = Utils.getCurrentWorkspace(); + let allWindowsByStacking = global.display.sort_windows_by_stacking( + workspace.list_windows() + ).reverse(); + + return Utils.find(allWindowsByStacking, metaWindow => { + let rect = metaWindow.get_frame_rect(); + + return metaWindow.get_monitor() == this.monitor.index && + metaWindow.showing_on_its_workspace() && + metaWindow.get_window_type() != Meta.WindowType.DESKTOP && + metaWindow[maximizedProp] && + stageCoord > rect[coord] && stageCoord < rect[coord] + rect[dimension]; + }); + }, + + _onBoxActorAdded: function(box) { + if (this.checkIfVertical()) { + this._setVertical(box, true); + } + }, + + _refreshVerticalAlloc: function() { + this._setVertical(this._centerBox, true); + this._setVertical(this._rightBox, true); + this._formatVerticalClock(); + }, + + _setVertical: function(actor, isVertical) { + let _set = (actor, isVertical) => { + if (!actor || actor instanceof Dash.DashItemContainer) { + return; + } + + if (actor instanceof St.BoxLayout) { + actor.vertical = isVertical; + } else if ((actor._delegate || actor) instanceof PanelMenu.ButtonBox && actor != this.statusArea.appMenu) { + let child = actor.get_first_child(); + + if (isVertical && !actor.visible && !actor._dtpVisibleId) { + this._unmappedButtons.push(actor); + actor._dtpVisibleId = actor.connect('notify::visible', () => { + this._disconnectVisibleId(actor); + this._refreshVerticalAlloc(); + }); + actor._dtpDestroyId = actor.connect('destroy', () => this._disconnectVisibleId(actor)); + } + + if (child) { + let [, natWidth] = actor.get_preferred_width(-1); + + child.x_align = Clutter.ActorAlign[isVertical ? 'CENTER' : 'START']; + actor.set_width(isVertical ? this.dtpSize : -1); + isVertical = isVertical && (natWidth > this.dtpSize); + actor[(isVertical ? 'add' : 'remove') + '_style_class_name']('vertical'); + } + } + + actor.get_children().forEach(c => _set(c, isVertical)); + }; + + _set(actor, false); + _set(actor, isVertical); + }, + + _disconnectVisibleId: function(actor) { + actor.disconnect(actor._dtpVisibleId); + actor.disconnect(actor._dtpDestroyId); + + delete actor._dtpVisibleId; + delete actor._dtpDestroyId; + + this._unmappedButtons.splice(this._unmappedButtons.indexOf(actor), 1); + }, + + _setAppmenuVisible: function(isVisible) { + let parent; + let appMenu = this.statusArea.appMenu; + + if(appMenu) + parent = appMenu.container.get_parent(); + + if (parent) { + parent.remove_child(appMenu.container); + } + + if (isVisible && appMenu) { + this._leftBox.insert_child_above(appMenu.container, null); + } + }, + + _formatVerticalClock: function() { + // https://github.com/GNOME/gnome-desktop/blob/master/libgnome-desktop/gnome-wall-clock.c#L310 + if (this.statusArea.dateMenu) { + let datetime = this.statusArea.dateMenu._clock.clock; + let datetimeParts = datetime.split(' '); + let time = datetimeParts[1]; + let clockText = this.statusArea.dateMenu._clockDisplay.clutter_text; + let setClockText = text => { + let stacks = text instanceof Array; + let separator = '\n‧‧\n'; + + clockText.set_text((stacks ? text.join(separator) : text).trim()); + clockText.set_use_markup(stacks); + clockText.get_allocation_box(); + + return !clockText.get_layout().is_ellipsized(); + }; + + if (clockText.ellipsize == Pango.EllipsizeMode.NONE) { + //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back + clockText.ellipsize = Pango.EllipsizeMode.END; + } + + if (!time) { + datetimeParts = datetime.split(' '); + time = datetimeParts.pop(); + datetimeParts = [datetimeParts.join(' '), time]; + } + + if (!setClockText(datetime) && + !setClockText(datetimeParts) && + !setClockText(time)) { + let timeParts = time.split('∶'); + + if (!this._clockFormat) { + this._clockFormat = Me.desktopSettings.get_string('clock-format'); + } + + if (this._clockFormat == '12h') { + timeParts.push.apply(timeParts, timeParts.pop().split(' ')); + } + + setClockText(timeParts); + } + } + }, + + _setShowDesktopButton: function (add) { + if (add) { + if(this._showDesktopButton) + return; + + this._showDesktopButton = new St.Bin({ style_class: 'panel-button', + reactive: true, + can_focus: true, + // x_fill: true, + // y_fill: true, + track_hover: true }); + + this._showDesktopButton.icon = new St.Icon({ gicon: Gio.icon_new_for_string(SHOW_DESKTOP_ICON), style_class: 'system-status-icon' }); + + this._setShowDesktopButtonStyle(); + + this._showDesktopButton.connect('button-press-event', () => this._onShowDesktopButtonPress()); + this._showDesktopButton.connect('enter-event', () => { + if (Me.settings.get_boolean('show-showdesktop-hover')) { + this._timeoutsHandler.add([T4, SHOW_SHOWDESKTOP_DELAY, () => { + this._hiddenDesktopWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + this._toggleWorkspaceWindows(true, this._hiddenDesktopWorkspace); + }]); + } + }); + + this._showDesktopButton.connect('leave-event', () => { + if (Me.settings.get_boolean('show-showdesktop-hover')) { + if (this._timeoutsHandler.getId(T4)) { + this._timeoutsHandler.remove(T4); + } else if (this._hiddenDesktopWorkspace) { + this._toggleWorkspaceWindows(false, this._hiddenDesktopWorkspace); + } +  } + }); + + this.panel.actor.add_child(this._showDesktopButton); + } else { + if(!this._showDesktopButton) + return; + + this.panel.actor.remove_child(this._showDesktopButton); + this._showDesktopButton.destroy(); + this._showDesktopButton = null; + } + }, + + _setShowDesktopButtonStyle: function() { + let rgb = this._getBackgroundBrightness() ? "rgba(55, 55, 55, .2)" : "rgba(200, 200, 200, .2)"; + + for (let i = 0; i < this._showDesktopButton.get_children().length; i++) { + if (this._showDesktopButton.get_children()[i] == this._showDesktopButton.icon) { + this._showDesktopButton.remove_actor(this._showDesktopButton.icon); + } + } + + if (this._showDesktopButton) { + if (Me.settings.get_boolean('show-showdesktop-icon')) { + this._showDesktopButton.add_actor(this._showDesktopButton.icon); + + let buttonSize = Me.settings.get_int('showdesktop-button-width') + 'px'; + let isVertical = this.checkIfVertical(); + let buttonPadding = isVertical ? buttonSize + ' 0;' : '0 ' + buttonSize + ';'; + + this._showDesktopButton.set_style('padding: ' + buttonPadding); + } else { + let buttonSize = Me.settings.get_int('showdesktop-button-width') + 'px;'; + let isVertical = this.checkIfVertical(); + + let style = "border: 0 solid " + rgb + "; padding: 0;"; + style += isVertical ? 'border-top-width:1px;height:' + buttonSize : 'border-left-width:1px;width:' + buttonSize; + + this._showDesktopButton.set_style(style); + this._showDesktopButton[(isVertical ? 'x' : 'y') + '_expand'] = true; + } + } + }, + + // _getBackgroundBrightness: return true if panel has a bright background color + _getBackgroundBrightness: function() { + return Utils.checkIfColorIsBright(this.dynamicTransparency.backgroundColorRgb); + }, + + _toggleWorkspaceWindows: function(hide, workspace) { + let time = SHOW_SHOWDESKTOP_TIME * .001; + + workspace.list_windows().forEach(w => { + if (!w.minimized) { + let tweenOpts = { + opacity: hide ? 0 : 255, + time: time, + transition: 'easeOutQuad' + }; + + Utils.animateWindowOpacity(w.get_compositor_private(), tweenOpts); + } + }); + }, + + _onShowDesktopButtonPress: function() { + let label = 'trackerFocusApp'; + + this._signalsHandler.removeWithLabel(label); + this._timeoutsHandler.remove(T5); + + if(this._restoreWindowList && this._restoreWindowList.length) { + this._timeoutsHandler.remove(T4); + + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows(); + this._restoreWindowList.forEach(function(w) { + if(windows.indexOf(w) > -1) + Main.activateWindow(w); + }); + this._restoreWindowList = null; + } else { + let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + let windows = current_workspace.list_windows().filter(function (w) { + return w.showing_on_its_workspace() && !w.skip_taskbar; + }); + windows = global.display.sort_windows_by_stacking(windows); + + windows.forEach(function(w) { + w.minimize(); + }); + + this._restoreWindowList = windows; + + this._timeoutsHandler.add([T5, 20, () => this._signalsHandler.addWithLabel( + label, + [ + tracker, + 'notify::focus-app', + () => this._restoreWindowList = null + ] + )]); + } + + Main.overview.hide(); + }, + + _initProgressManager: function() { + if(!this.progressManager && (Me.settings.get_boolean('progress-show-bar') || Me.settings.get_boolean('progress-show-count'))) + this.progressManager = new Progress.ProgressManager(); + }, +}); + +var dtpSecondaryPanel = Utils.defineClass({ + Name: 'ZorinTaskbar-SecondaryPanel', + Extends: St.Widget, + + _init: function(params) { + this.callParent('_init', params); + }, + + vfunc_allocate: function(box, flags) { + Utils.setAllocation(this, box, flags); + } +}); + +var dtpSecondaryAggregateMenu = Utils.defineClass({ + Name: 'ZorinTaskbar-SecondaryAggregateMenu', + Extends: PanelMenu.Button, + + _init: function() { + this.callParent('_init', 0.0, C_("System menu in the top bar", "System"), false); + + Utils.wrapActor(this); + + this.menu.actor.add_style_class_name('aggregate-menu'); + + let menuLayout = new Panel.AggregateLayout(); + this.menu.box.set_layout_manager(menuLayout); + + this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); + this.actor.add_child(this._indicators); + + this._power = new imports.ui.status.power.Indicator(); + this._volume = new imports.ui.status.volume.Indicator(); + this._brightness = new imports.ui.status.brightness.Indicator(); + this._system = new imports.ui.status.system.Indicator(); + + if (Config.PACKAGE_VERSION >= '3.28') { + this._thunderbolt = new imports.ui.status.thunderbolt.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._thunderbolt)); + } + + if (Config.PACKAGE_VERSION < '3.37') { + this._screencast = new imports.ui.status.screencast.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._screencast)); + } + + if (Config.PACKAGE_VERSION >= '3.24') { + this._nightLight = new imports.ui.status.nightLight.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._nightLight)); + } + + if (Config.HAVE_NETWORKMANAGER && Config.PACKAGE_VERSION >= '3.24') { + this._network = new imports.ui.status.network.NMApplet(); + this._indicators.add_child(Utils.getIndicators(this._network)); + } + + if (Config.HAVE_BLUETOOTH) { + this._bluetooth = new imports.ui.status.bluetooth.Indicator(); + this._indicators.add_child(Utils.getIndicators(this._bluetooth)); + } + + this._indicators.add_child(Utils.getIndicators(this._volume)); + this._indicators.add_child(Utils.getIndicators(this._power)); + + this.menu.addMenuItem(this._volume.menu); + this._volume._volumeMenu._readOutput(); + this._volume._volumeMenu._readInput(); + + this.menu.addMenuItem(this._brightness.menu); + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + if (this._network) { + this.menu.addMenuItem(this._network.menu); + } + + if (this._bluetooth) { + this.menu.addMenuItem(this._bluetooth.menu); + } + + this.menu.addMenuItem(this._power.menu); + this._power._sync(); + + if (this._nightLight) { + this.menu.addMenuItem(this._nightLight.menu); + } + + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this.menu.addMenuItem(this._system.menu); + + menuLayout.addSizeChild(this._power.menu.actor); + menuLayout.addSizeChild(this._system.menu.actor); + }, +}); diff --git a/panelManager.js b/panelManager.js new file mode 100755 index 0000000..865dc45 --- /dev/null +++ b/panelManager.js @@ -0,0 +1,927 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + * + * Code to re-anchor the panel was taken from Thoma5 BottomPanel: + * https://github.com/Thoma5/gnome-shell-extension-bottompanel + * + * Pattern for moving clock based on Frippery Move Clock by R M Yorston + * http://frippery.org/extensions/ + * + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Overview = Me.imports.overview; +const Panel = Me.imports.panel; +const Pos = Me.imports.panelPositions; +const Proximity = Me.imports.proximity; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +const Config = imports.misc.config; +const Lang = imports.lang; +const Gi = imports._gi; +const GLib = imports.gi.GLib; +const Clutter = imports.gi.Clutter; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; + +const AppDisplay = imports.ui.appDisplay; +const BoxPointer = imports.ui.boxpointer; +const Dash = imports.ui.dash; +const IconGrid = imports.ui.iconGrid; +const LookingGlass = imports.ui.lookingGlass; +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const Layout = imports.ui.layout; +const WM = imports.ui.windowManager; +const WorkspacesView = imports.ui.workspacesView; + +var dtpPanelManager = Utils.defineClass({ + Name: 'ZorinTaskbar.PanelManager', + + _init: function() { + this.overview = new Overview.dtpOverview(); + this.panelsElementPositions = {}; + + this._saveMonitors(); + + Utils.getAppDisplayViews().forEach(v => { + Utils.wrapActor(v.view); + Utils.wrapActor(v.view._grid); + }); + }, + + enable: function(reset) { + this.panelPositions = Pos.getSettingsPositions(Me.settings, 'panel-positions'); + this.dtpPrimaryMonitor = Main.layoutManager.primaryMonitor; // The real primary monitor should always have the main panel + this.proximityManager = new Proximity.ProximityManager(); + + Utils.wrapActor(Main.panel); + Utils.wrapActor(Main.overview.dash || 0); + + this.primaryPanel = this._createPanel(this.dtpPrimaryMonitor, false); + this.allPanels = [ this.primaryPanel ]; + + this.overview.enable(this.primaryPanel); + + if (Me.settings.get_boolean('multi-monitors')) { + Main.layoutManager.monitors.filter(m => m != this.dtpPrimaryMonitor).forEach(m => { + this.allPanels.push(this._createPanel(m, true)); + }); + } + + global.zorinTaskbar.panels = this.allPanels; + global.zorinTaskbar.emit('panels-created'); + + this.allPanels.forEach(p => { + let panelPosition = p.getPosition(); + let leftOrRight = (panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT); + + p.panelBox.set_size( + leftOrRight ? -1 : p.geom.w + p.geom.lrPadding, + leftOrRight ? p.geom.h + p.geom.tbPadding : -1 + ); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => this._adjustPanelMenuButton(pmb, p.monitor, panelPosition)); + + p.taskbar.iconAnimator.start(); + }); + + //in 3.32, BoxPointer now inherits St.Widget + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + let panelManager = this; + + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', function(forWidth) { + let alloc = { min_size: 0, natural_size: 0 }; + + [alloc.min_size, alloc.natural_size] = this.vfunc_get_preferred_height(forWidth); + + return panelManager._getBoxPointerPreferredHeight(this, alloc); + }); + } + + this._updatePanelElementPositions(); + this.setFocusedMonitor(this.dtpPrimaryMonitor); + + if (this.primaryPanel.checkIfVertical()) { + Main.wm._getPositionForDirection = newGetPositionForDirection; + } + + if (reset) return; + + this._oldViewSelectorAnimateIn = Main.overview.viewSelector._animateIn; + Main.overview.viewSelector._animateIn = Lang.bind(this.primaryPanel, newViewSelectorAnimateIn); + this._oldViewSelectorAnimateOut = Main.overview.viewSelector._animateOut; + Main.overview.viewSelector._animateOut = Lang.bind(this.primaryPanel, newViewSelectorAnimateOut); + + if (Config.PACKAGE_VERSION > '3.35.1') { + this._oldDoSpringAnimation = AppDisplay.BaseAppView.prototype._doSpringAnimation; + AppDisplay.BaseAppView.prototype._doSpringAnimation = newDoSpringAnimation; + } + + this._oldUpdatePanelBarrier = Main.layoutManager._updatePanelBarrier; + Main.layoutManager._updatePanelBarrier = (panel) => { + let panelUpdates = panel ? [panel] : this.allPanels; + + panelUpdates.forEach(p => newUpdatePanelBarrier.call(Main.layoutManager, p)); + }; + Main.layoutManager._updatePanelBarrier(); + + this._oldUpdateHotCorners = Main.layoutManager._updateHotCorners; + Main.layoutManager._updateHotCorners = Lang.bind(Main.layoutManager, newUpdateHotCorners); + Main.layoutManager._updateHotCorners(); + + if (Main.layoutManager._interfaceSettings) { + this._enableHotCornersId = Main.layoutManager._interfaceSettings.connect('changed::enable-hot-corners', () => Main.layoutManager._updateHotCorners()); + } + + this._oldOverviewRelayout = Main.overview._relayout; + Main.overview._relayout = Lang.bind(Main.overview, this._newOverviewRelayout); + + this._oldUpdateWorkspacesViews = Main.overview.viewSelector._workspacesDisplay._updateWorkspacesViews; + Main.overview.viewSelector._workspacesDisplay._updateWorkspacesViews = Lang.bind(Main.overview.viewSelector._workspacesDisplay, this._newUpdateWorkspacesViews); + + this._oldGetShowAppsButton = Main.overview.getShowAppsButton; + Main.overview.getShowAppsButton = this._newGetShowAppsButton.bind(this); + + this._needsDashItemContainerAllocate = !Dash.DashItemContainer.prototype.hasOwnProperty('vfunc_allocate'); + + if (this._needsDashItemContainerAllocate) { + Utils.hookVfunc(Dash.DashItemContainer.prototype, 'allocate', this._newDashItemContainerAllocate); + } + + // 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; + + LookingGlass.LookingGlass.prototype._oldResize = LookingGlass.LookingGlass.prototype._resize; + LookingGlass.LookingGlass.prototype._resize = _newLookingGlassResize; + + LookingGlass.LookingGlass.prototype._oldOpen = LookingGlass.LookingGlass.prototype.open; + LookingGlass.LookingGlass.prototype.open = _newLookingGlassOpen; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + if (Config.PACKAGE_VERSION > '3.35.9') { + let currentAppsView; + + this._oldAnimateIconPosition = IconGrid.animateIconPosition; + IconGrid.animateIconPosition = newAnimateIconPosition.bind(this); + + this._signalsHandler.add( + [ + Utils.DisplayWrapper.getScreen(), + 'window-entered-monitor', + () => this._needsIconAllocate = 1 + ] + ); + + Utils.getAppDisplayViews().forEach(v => { + if (!v.control || v.control.has_style_pseudo_class('checked')) { + currentAppsView = v; + } + + if (v.control) { + this._signalsHandler.add( + [ + v.control, + 'clicked', + () => { + this._needsIconAllocate = currentAppsView != v; + currentAppsView = v; + } + ] + ); + } + + this._signalsHandler.add( + [ + v.view, + 'notify::visible', + () => this._needsIconAllocate = !(currentAppsView != v && !v.view.visible) + ], + [ + v.view._grid, + 'animation-done', + () => this._needsIconAllocate = 0 + ] + ); + }); + } + + //listen settings + this._signalsHandler.add( + [ + Me.settings, + [ + 'changed::multi-monitors', + 'changed::isolate-monitors', + 'changed::panel-positions' + ], + () => this._reset() + ], + [ + Me.settings, + 'changed::panel-element-positions', + () => this._updatePanelElementPositions() + ], + [ + Me.settings, + 'changed::intellihide-key-toggle-text', + () => this._setKeyBindings(true) + ], + [ + Utils.DisplayWrapper.getMonitorManager(), + 'monitors-changed', + () => { + if (Main.layoutManager.primaryMonitor) { + this._saveMonitors(); + this._reset(); + } + } + ] + ); + + Panel.panelBoxes.forEach(c => this._signalsHandler.add( + [Main.panel[c], 'actor-added', (parent, child) => this._adjustPanelMenuButton(this._getPanelMenuButton(child), this.primaryPanel.monitor, this.primaryPanel.getPosition())] + )); + + this._setKeyBindings(true); + }, + + disable: function(reset) { + this.overview.disable(); + this.proximityManager.destroy(); + + this.allPanels.forEach(p => { + p.taskbar.iconAnimator.pause(); + + this._findPanelMenuButtons(p.panelBox).forEach(pmb => { + if (pmb.menu._boxPointer._dtpGetPreferredHeightId) { + pmb.menu._boxPointer._container.disconnect(pmb.menu._boxPointer._dtpGetPreferredHeightId); + } + + pmb.menu._boxPointer.sourceActor = pmb.menu._boxPointer._dtpSourceActor; + delete pmb.menu._boxPointer._dtpSourceActor; + pmb.menu._boxPointer._userArrowSide = St.Side.TOP; + }) + + this._removePanelBarriers(p); + + p.disable(); + + let clipContainer = p.panelBox.get_parent(); + + Main.layoutManager._untrackActor(p.panelBox); + Main.layoutManager.removeChrome(clipContainer); + + if (p.isStandalone) { + p.panelBox.destroy(); + } else { + p.panelBox.remove_child(p); + p.remove_child(p.panel.actor); + p.panelBox.add(p.panel.actor); + + p.panelBox.set_position(clipContainer.x, clipContainer.y); + + clipContainer.remove_child(p.panelBox); + Main.layoutManager.addChrome(p.panelBox, { affectsStruts: true, trackFullscreen: true }); + } + }); + + if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { + Utils.hookVfunc(BoxPointer.BoxPointer.prototype, 'get_preferred_height', BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height); + } + + delete Main.wm._getPositionForDirection; + + if (Main.layoutManager.primaryMonitor) { + Main.layoutManager.panelBox.set_position(Main.layoutManager.primaryMonitor.x, Main.layoutManager.primaryMonitor.y); + Main.layoutManager.panelBox.set_size(Main.layoutManager.primaryMonitor.width, -1); + } + + if (reset) return; + + this._setKeyBindings(false); + + this._signalsHandler.destroy(); + + Main.layoutManager._updateHotCorners = this._oldUpdateHotCorners; + Main.layoutManager._updateHotCorners(); + + if (this._enableHotCornersId) { + Main.layoutManager._interfaceSettings.disconnect(this._enableHotCornersId); + } + + Main.layoutManager._updatePanelBarrier = this._oldUpdatePanelBarrier; + Main.layoutManager._updatePanelBarrier(); + + Main.overview.viewSelector._animateIn = this._oldViewSelectorAnimateIn; + Main.overview.viewSelector._animateOut = this._oldViewSelectorAnimateOut; + + Main.overview._relayout = this._oldOverviewRelayout; + Main.overview._relayout(); + + Main.overview.viewSelector._workspacesDisplay._updateWorkspacesViews = this._oldUpdateWorkspacesViews; + + Utils.getPanelGhost().set_size(-1, -1); + + if (this._needsDashItemContainerAllocate) { + Utils.hookVfunc(Dash.DashItemContainer.prototype, 'allocate', function(box, flags) { this.vfunc_allocate(box, flags); }); + } + + if (this._oldDoSpringAnimation) { + AppDisplay.BaseAppView.prototype._doSpringAnimation = this._oldDoSpringAnimation; + } + + if (this._oldAnimateIconPosition) { + IconGrid.animateIconPosition = this._oldAnimateIconPosition; + } + + LookingGlass.LookingGlass.prototype._resize = LookingGlass.LookingGlass.prototype._oldResize; + delete LookingGlass.LookingGlass.prototype._oldResize; + + LookingGlass.LookingGlass.prototype.open = LookingGlass.LookingGlass.prototype._oldOpen; + delete LookingGlass.LookingGlass.prototype._oldOpen + }, + + setFocusedMonitor: function(monitor, ignoreRelayout) { + this._needsIconAllocate = 1; + + if (!this.checkIfFocusedMonitor(monitor)) { + Main.overview.viewSelector._workspacesDisplay._primaryIndex = monitor.index; + + Main.overview._overview.clear_constraints(); + Main.overview._overview.add_constraint(new Layout.MonitorConstraint({ index: monitor.index })); + + if (ignoreRelayout) return; + + this._newOverviewRelayout.call(Main.overview); + } + }, + + _saveMonitors: function() { + //Mutter meta_monitor_manager_get_primary_monitor (global.display.get_primary_monitor()) doesn't return the same + //monitor as GDK gdk_screen_get_primary_monitor (imports.gi.Gdk.Screen.get_default().get_primary_monitor()). + //Since the Mutter function is what's used in gnome-shell and we can't access it from the settings dialog, store + //the monitors information in a setting so we can use the same monitor indexes as the ones in gnome-shell + let primaryIndex = Main.layoutManager.primaryIndex; + let monitors = [primaryIndex]; + + Main.layoutManager.monitors.filter(m => m.index != primaryIndex).forEach(m => monitors.push(m.index)); + Me.settings.set_value('available-monitors', new GLib.Variant('ai', monitors)); + }, + + checkIfFocusedMonitor: function(monitor) { + return Main.overview.viewSelector._workspacesDisplay._primaryIndex == monitor.index; + }, + + _createPanel: function(monitor, isStandalone) { + let panelBox; + let panel; + let clipContainer = new Clutter.Actor(); + + if (isStandalone) { + panelBox = new St.BoxLayout({ name: 'panelBox' }); + } else { + panelBox = Main.layoutManager.panelBox; + Main.layoutManager._untrackActor(panelBox); + panelBox.remove_child(Main.panel.actor); + Main.layoutManager.removeChrome(panelBox); + } + + Main.layoutManager.addChrome(clipContainer, { affectsInputRegion: false }); + clipContainer.add_child(panelBox); + Main.layoutManager.trackChrome(panelBox, { trackFullscreen: true, affectsStruts: true, affectsInputRegion: true }); + + panel = new Panel.dtpPanel(this, monitor, panelBox, isStandalone); + panelBox.add(panel); + panel.enable(); + + panelBox.visible = true; + if (monitor.inFullscreen) { + panelBox.hide(); + } + panelBox.set_position(0, 0); + + return panel; + }, + + _reset: function() { + this.disable(true); + this.allPanels = []; + this.enable(true); + }, + + _updatePanelElementPositions: function() { + this.panelsElementPositions = Pos.getSettingsPositions(Me.settings, 'panel-element-positions'); + this.allPanels.forEach(p => p.updateElementPositions()); + }, + + _adjustPanelMenuButton: function(button, monitor, arrowSide) { + if (button) { + Utils.wrapActor(button); + button.menu._boxPointer._dtpSourceActor = button.menu._boxPointer.sourceActor; + button.menu._boxPointer.sourceActor = button.actor; + button.menu._boxPointer._userArrowSide = arrowSide; + button.menu._boxPointer._dtpInPanel = 1; + + if (!button.menu._boxPointer.vfunc_get_preferred_height) { + button.menu._boxPointer._dtpGetPreferredHeightId = button.menu._boxPointer._container.connect('get-preferred-height', (actor, forWidth, alloc) => { + this._getBoxPointerPreferredHeight(button.menu._boxPointer, alloc, monitor); + }); + } + } + }, + + _getBoxPointerPreferredHeight: function(boxPointer, alloc, monitor) { + if (boxPointer._dtpInPanel && boxPointer.sourceActor && Me.settings.get_boolean('intellihide')) { + monitor = monitor || Main.layoutManager.findMonitorForActor(boxPointer.sourceActor); + let panel = Utils.find(global.zorinTaskbar.panels, p => p.monitor == monitor); + let excess = alloc.natural_size + panel.dtpSize + 10 - monitor.height; // 10 is arbitrary + + if (excess > 0) { + alloc.natural_size -= excess; + } + } + + return [alloc.min_size, alloc.natural_size]; + }, + + _findPanelMenuButtons: function(container) { + let panelMenuButtons = []; + let panelMenuButton; + + let find = parent => parent.get_children().forEach(c => { + if ((panelMenuButton = this._getPanelMenuButton(c))) { + panelMenuButtons.push(panelMenuButton); + } + + find(c); + }); + + find(container); + + return panelMenuButtons; + }, + + _removePanelBarriers: function(panel) { + if (panel.isStandalone && panel._rightPanelBarrier) { + panel._rightPanelBarrier.destroy(); + } + + if (panel._leftPanelBarrier) { + panel._leftPanelBarrier.destroy(); + delete panel._leftPanelBarrier; + } + }, + + _getPanelMenuButton: function(obj) { + return obj._delegate && obj._delegate instanceof PanelMenu.Button ? obj._delegate : 0; + }, + + _setKeyBindings: function(enable) { + let keys = { + 'intellihide-key-toggle': () => this.allPanels.forEach(p => p.intellihide.toggle()) + }; + + Object.keys(keys).forEach(k => { + Utils.removeKeybinding(k); + + if (enable) { + Utils.addKeybinding(k, Me.settings, keys[k], Shell.ActionMode.NORMAL); + } + }); + }, + + _newOverviewRelayout: function() { + // To avoid updating the position and size of the workspaces + // we just hide the overview. The positions will be updated + // when it is next shown. + this.hide(); + + let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.overview.viewSelector._workspacesDisplay._primaryIndex); + + this._coverPane.set_position(0, workArea.y); + this._coverPane.set_size(workArea.width, workArea.height); + + this._updateBackgrounds(); + }, + + _newUpdateWorkspacesViews: function() { + for (let i = 0; i < this._workspacesViews.length; i++) + this._workspacesViews[i].destroy(); + + this._workspacesViews = []; + + let monitors = Main.layoutManager.monitors; + + for (let i = 0; i < monitors.length; i++) { + let workspaces; + let view; + if (this._workspacesOnlyOnPrimary && i != Main.layoutManager.primaryIndex) { + view = new WorkspacesView.ExtraWorkspaceView(i); + view.getActiveWorkspace = view.getActiveWorkspace || function() { return this._workspace; }; + workspaces = [view._workspace]; + } else { + view = new WorkspacesView.WorkspacesView(i, this._scrollAdjustment || 0); + workspaces = view._workspaces; + } + + Utils.wrapActor(view); + view.actor.connect('scroll-event', this._onScrollEvent.bind(this)); + if (i == Main.layoutManager.primaryIndex && view.scrollAdjustment) { + this._scrollAdjustment = view.scrollAdjustment; + this._scrollAdjustment.connect('notify::value', + this._scrollValueChanged.bind(this)); + } + + workspaces.forEach(w => w.setFullGeometry = geom => w._fullGeometry = geom); + this._workspacesViews.push(view); + } + + this._workspacesViews.forEach(wv => Main.layoutManager.overviewGroup.add_actor(wv.actor)); + + if (this._syncWorkspacesFullGeometry) { + //gnome-shell 3.36.4 + if (this._fullGeometry) + this._syncWorkspacesFullGeometry(); + if (this._actualGeometry) + this._syncWorkspacesActualGeometry(); + } else if (this._updateWorkspacesFullGeometry) { + this._updateWorkspacesFullGeometry(); + this._updateWorkspacesActualGeometry(); + } + }, + + _newGetShowAppsButton: function() { + let focusedMonitorIndex = Utils.findIndex(this.allPanels, p => this.checkIfFocusedMonitor(p.monitor)); + + return this.allPanels[focusedMonitorIndex].taskbar.showAppsButton; + }, + + _newDashItemContainerAllocate: function(box, flags) { + if (this.child == null) + return; + + Utils.setAllocation(this, box, flags); + + let availWidth = box.x2 - box.x1; + let availHeight = box.y2 - box.y1; + let [minChildWidth, minChildHeight, natChildWidth, natChildHeight] = this.child.get_preferred_size(); + let [childScaleX, childScaleY] = this.child.get_scale(); + + let childWidth = Math.min(natChildWidth * childScaleX, availWidth); + let childHeight = Math.min(natChildHeight * childScaleY, availHeight); + let childBox = new Clutter.ActorBox(); + + childBox.x1 = (availWidth - childWidth) / 2; + childBox.y1 = (availHeight - childHeight) / 2; + childBox.x2 = childBox.x1 + childWidth; + childBox.y2 = childBox.y1 + childHeight; + + Utils.allocate(this.child, childBox, flags); + }, +}); + +// This class drives long-running icon animations, to keep them running in sync +// with each other. +var IconAnimator = Utils.defineClass({ + Name: 'ZorinTaskbar.IconAnimator', + + _init: function(actor) { + this._count = 0; + this._started = false; + this._animations = { + dance: [], + }; + this._timeline = new Clutter.Timeline({ + duration: 3000, + repeat_count: -1, + }); + + /* Just use the construction property when no need to support 3.36 */ + if (this._timeline.set_actor) + this._timeline.set_actor(actor); + + this._timeline.connect('new-frame', () => { + const progress = this._timeline.get_progress(); + const danceRotation = progress < 1/6 ? 15*Math.sin(progress*24*Math.PI) : 0; + const dancers = this._animations.dance; + for (let i = 0, iMax = dancers.length; i < iMax; i++) { + dancers[i].target.rotation_angle_z = danceRotation; + } + }); + }, + + destroy: function() { + this._timeline.stop(); + this._timeline = null; + for (const name in this._animations) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + pair.target.disconnect(pair.targetDestroyId); + } + } + this._animations = null; + }, + + pause: function() { + if (this._started && this._count > 0) { + this._timeline.stop(); + } + this._started = false; + }, + + start: function() { + if (!this._started && this._count > 0) { + this._timeline.start(); + } + this._started = true; + }, + + addAnimation: function(target, name) { + const targetDestroyId = target.connect('destroy', () => this.removeAnimation(target, name)); + this._animations[name].push({ target, targetDestroyId }); + if (this._started && this._count === 0) { + this._timeline.start(); + } + this._count++; + }, + + removeAnimation: function(target, name) { + const pairs = this._animations[name]; + for (let i = 0, iMax = pairs.length; i < iMax; i++) { + const pair = pairs[i]; + if (pair.target === target) { + target.disconnect(pair.targetDestroyId); + pairs.splice(i, 1); + this._count--; + if (this._started && this._count === 0) { + this._timeline.stop(); + } + return; + } + } + } +}); + +function newViewSelectorAnimateIn(oldPage) { + if (oldPage) + oldPage.hide(); + + let vs = Main.overview.viewSelector; + + vs.emit('page-empty'); + + vs._activePage.show(); + + if (vs._activePage == vs._appsPage && oldPage == vs._workspacesPage) { + // Restore opacity, in case we animated via _fadePageOut + vs._activePage.opacity = 255; + let animate = Me.settings.get_boolean('animate-show-apps'); + if(animate) + vs.appDisplay.animate(IconGrid.AnimationDirection.IN); + } else { + vs._fadePageIn(); + } +} + +function newViewSelectorAnimateOut(page) { + let oldPage = page; + let vs = Main.overview.viewSelector; + + if (page == vs._appsPage && + vs._activePage == vs._workspacesPage && + !Main.overview.animationInProgress) { + let animate = Me.settings.get_boolean('animate-show-apps'); + if(animate) + vs.appDisplay.animate(IconGrid.AnimationDirection.OUT, Lang.bind(this, + function() { + vs._animateIn(oldPage) + })); + else + vs._animateIn(oldPage) + } else { + vs._fadePageOut(page); + } +} + +function newGetPositionForDirection(direction, fromWs, toWs) { + let [xDest, yDest] = WM.WindowManager.prototype._getPositionForDirection(direction, fromWs, toWs); + + if (direction == Meta.MotionDirection.UP || + direction == Meta.MotionDirection.UP_LEFT || + direction == Meta.MotionDirection.UP_RIGHT) { + yDest -= Main.panel.height; + } else if (direction != Meta.MotionDirection.LEFT && + direction != Meta.MotionDirection.RIGHT) { + yDest += Main.panel.height; + } + + return [xDest, yDest]; +} + +function newDoSpringAnimation(animationDirection) { + this._grid.opacity = 255; + this._grid.animateSpring(animationDirection, Main.overview.getShowAppsButton()); +} + +function newAnimateIconPosition(icon, box, flags, nChangedIcons) { + if (this._needsIconAllocate) { + Utils.allocate(icon, box, flags); + return; + } + + return this._oldAnimateIconPosition(icon, box, flags, nChangedIcons);; +} + +function newUpdateHotCorners() { + // destroy old hot corners + this.hotCorners.forEach(function(corner) { + if (corner) + corner.destroy(); + }); + this.hotCorners = []; + + //global.settings is ubuntu specific setting to disable the hot corner (Tweak tool > Top Bar > Activities Overview Hot Corner) + //this._interfaceSettings is for the setting to disable the hot corner introduced in gnome-shell 3.34 + if ((global.settings.list_keys().indexOf('enable-hot-corners') >= 0 && !global.settings.get_boolean('enable-hot-corners')) || + (this._interfaceSettings && !this._interfaceSettings.get_boolean('enable-hot-corners'))) { + this.emit('hot-corners-changed'); + return; + } + + // build new hot corners + for (let i = 0; i < this.monitors.length; i++) { + let panel = Utils.find(global.zorinTaskbar.panels, p => p.monitor.index == i); + let panelPosition = panel ? panel.getPosition() : St.Side.BOTTOM; + let panelTopLeft = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT; + let monitor = this.monitors[i]; + let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x; + let cornerY = monitor.y; + + let haveTopLeftCorner = true; + + // If the panel is on the bottom, unless this is explicitly forced, don't add a topleft + // hot corner unless it is actually a top left panel. Otherwise, it stops the mouse + // as you are dragging across. In the future, maybe we will automatically move the + // hotcorner to the bottom when the panel is positioned at the bottom + if (i != this.primaryIndex || !panelTopLeft) { + // Check if we have a top left (right for RTL) corner. + // I.e. if there is no monitor directly above or to the left(right) + let besideX = this._rtl ? monitor.x + 1 : cornerX - 1; + let besideY = cornerY; + let aboveX = cornerX; + let aboveY = cornerY - 1; + + for (let j = 0; j < this.monitors.length; j++) { + if (i == j) + continue; + let otherMonitor = this.monitors[j]; + if (besideX >= otherMonitor.x && + besideX < otherMonitor.x + otherMonitor.width && + besideY >= otherMonitor.y && + besideY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + if (aboveX >= otherMonitor.x && + aboveX < otherMonitor.x + otherMonitor.width && + aboveY >= otherMonitor.y && + aboveY < otherMonitor.y + otherMonitor.height) { + haveTopLeftCorner = false; + break; + } + } + } + + if (haveTopLeftCorner) { + let corner = new Layout.HotCorner(this, monitor, cornerX, cornerY); + + corner.setBarrierSize = size => corner.__proto__.setBarrierSize.call(corner, Math.min(size, 32)); + corner.setBarrierSize(panel ? panel.dtpSize : 32); + this.hotCorners.push(corner); + } else { + this.hotCorners.push(null); + } + } + + this.emit('hot-corners-changed'); +} + +function newUpdatePanelBarrier(panel) { + let barriers = { + _rightPanelBarrier: [(panel.isStandalone ? panel : this)], + _leftPanelBarrier: [panel] + }; + + Object.keys(barriers).forEach(k => { + let obj = barriers[k][0]; + + if (obj[k]) { + obj[k].destroy(); + obj[k] = null; + } + }); + + if (!this.primaryMonitor || !panel.panelBox.height) { + return; + } + + let barrierSize = Math.min(10, panel.panelBox.height); + let fixed1 = panel.monitor.y; + let fixed2 = panel.monitor.y + barrierSize; + + if (panel.checkIfVertical()) { + barriers._rightPanelBarrier.push(panel.monitor.y + panel.monitor.height, Meta.BarrierDirection.POSITIVE_Y); + barriers._leftPanelBarrier.push(panel.monitor.y, Meta.BarrierDirection.NEGATIVE_Y); + } else { + barriers._rightPanelBarrier.push(panel.monitor.x + panel.monitor.width, Meta.BarrierDirection.NEGATIVE_X); + barriers._leftPanelBarrier.push(panel.monitor.x, Meta.BarrierDirection.POSITIVE_X); + } + + switch (panel.getPosition()) { + //values are initialized as St.Side.TOP + case St.Side.BOTTOM: + fixed1 = panel.monitor.y + panel.monitor.height - barrierSize; + fixed2 = panel.monitor.y + panel.monitor.height; + break; + case St.Side.LEFT: + fixed1 = panel.monitor.x; + fixed2 = panel.monitor.x + barrierSize; + break; + case St.Side.RIGHT: + fixed1 = panel.monitor.x + panel.monitor.width; + fixed2 = panel.monitor.x + panel.monitor.width - barrierSize; + break; + } + + //remove left barrier if it overlaps one of the hotcorners + for (let k in this.hotCorners) { + let hc = this.hotCorners[k]; + + if (hc && hc._monitor == panel.monitor && + ((fixed1 == hc._x || fixed2 == hc._x) || fixed1 == hc._y || fixed2 == hc._y)) { + delete barriers._leftPanelBarrier; + break; + } + } + + Object.keys(barriers).forEach(k => { + let barrierOptions = { + display: global.display, + directions: barriers[k][2] + }; + + barrierOptions[panel.varCoord.c1] = barrierOptions[panel.varCoord.c2] = barriers[k][1]; + barrierOptions[panel.fixedCoord.c1] = fixed1; + barrierOptions[panel.fixedCoord.c2] = fixed2; + + barriers[k][0][k] = new Meta.Barrier(barrierOptions); + }); +} + +function _newLookingGlassResize() { + let primaryMonitorPanel = Utils.find(global.zorinTaskbar.panels, p => p.monitor == Main.layoutManager.primaryMonitor); + let topOffset = primaryMonitorPanel.getPosition() == St.Side.TOP ? primaryMonitorPanel.dtpSize + 8 : 32; + + this._oldResize(); + Utils.wrapActor(this); + Utils.wrapActor(this._objInspector); + + this._hiddenY = Main.layoutManager.primaryMonitor.y + topOffset - this.actor.height; + this._targetY = this._hiddenY + this.actor.height; + this.actor.y = this._hiddenY; + + this._objInspector.actor.set_position(this.actor.x + Math.floor(this.actor.width * 0.1), this._targetY + Math.floor(this.actor.height * 0.1)); +} + +function _newLookingGlassOpen() { + if (this._open) + return; + + this._resize(); + this._oldOpen(); +} diff --git a/panelPositions.js b/panelPositions.js new file mode 100644 index 0000000..af766a4 --- /dev/null +++ b/panelPositions.js @@ -0,0 +1,73 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Panel extension + */ + +var SHOW_APPS_BTN = 'showAppsButton'; +var ACTIVITIES_BTN = 'activitiesButton'; +var TASKBAR = 'taskbar'; +var DATE_MENU = 'dateMenu'; +var SYSTEM_MENU = 'systemMenu'; +var LEFT_BOX = 'leftBox'; +var CENTER_BOX = 'centerBox'; +var RIGHT_BOX = 'rightBox'; +var DESKTOP_BTN = 'desktopButton'; + +var STACKED_TL = 'stackedTL'; +var STACKED_BR = 'stackedBR'; +var CENTERED = 'centered'; +var CENTERED_MONITOR = 'centerMonitor'; + +var TOP = 'TOP'; +var BOTTOM = 'BOTTOM'; +var LEFT = 'LEFT'; +var RIGHT = 'RIGHT'; + +var defaults = [ + { element: LEFT_BOX, visible: true, position: STACKED_TL }, + { element: SHOW_APPS_BTN, visible: false, position: STACKED_TL }, + { element: ACTIVITIES_BTN, visible: true, position: STACKED_TL }, + { element: TASKBAR, visible: true, position: STACKED_TL }, + { element: CENTER_BOX, visible: true, position: STACKED_BR }, + { element: RIGHT_BOX, visible: true, position: STACKED_BR }, + { element: SYSTEM_MENU, visible: true, position: STACKED_BR }, + { element: DATE_MENU, visible: true, position: STACKED_BR }, + { element: DESKTOP_BTN, visible: false, position: STACKED_BR }, +]; + +var optionDialogFunctions = {}; + +optionDialogFunctions[SHOW_APPS_BTN] = '_showShowAppsButtonOptions'; +optionDialogFunctions[DATE_MENU] = '_showDateMenuOptions'; +optionDialogFunctions[DESKTOP_BTN] = '_showDesktopButtonOptions'; + +function getSettingsPositions(settings, setting) { + var positions = null; + + try { + positions = JSON.parse(settings.get_string(setting)); + } catch(e) { + log('Error parsing positions: ' + e.message); + } + + return positions; +} + +function checkIfCentered(position) { + return position == CENTERED || position == CENTERED_MONITOR; +} diff --git a/panelStyle.js b/panelStyle.js new file mode 100644 index 0000000..8e68a71 --- /dev/null +++ b/panelStyle.js @@ -0,0 +1,176 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Panel extension + * Ideas for recursing child actors and assigning inline styles + * are based on code from the StatusAreaHorizontalSpacing extension + * https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension + * mathematical.coffee@gmail.com + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const ExtensionUtils = imports.misc.extensionUtils; +const Lang = imports.lang; +const Main = imports.ui.main; +const Mainloop = imports.mainloop; +const St = imports.gi.St; +const Shell = imports.gi.Shell; + +const Panel = Me.imports.panel; +const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; + +var dtpPanelStyle = Utils.defineClass({ + Name: 'ZorinTaskbar.PanelStyle', + + _init: function() { + + }, + + enable : function(panel) { + this.panel = panel; + + this._applyStyles(); + }, + + disable: function () { + this._removeStyles(); + }, + + _applyStyles: function() { + this._rightBoxOperations = []; + + // center box has been moved next to the right box and will be treated the same + this._centerBoxOperations = this._rightBoxOperations; + + this._leftBoxOperations = []; + + this._applyStylesRecursively(); + + /* connect signal */ + this._rightBoxActorAddedID = this.panel._rightBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._rightBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._rightBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._centerBoxActorAddedID = this.panel._centerBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._centerBoxOperations.length && !this._ignoreAddedChild) + this._recursiveApply(actor, this._centerBoxOperations); + + this._ignoreAddedChild = 0; + }) + ); + this._leftBoxActorAddedID = this.panel._leftBox.connect('actor-added', + Lang.bind(this, function (container, actor) { + if(this._leftBoxOperations.length) + this._recursiveApply(actor, this._leftBoxOperations); + }) + ); + }, + + _removeStyles: function() { + /* disconnect signal */ + if (this._rightBoxActorAddedID) + this.panel._rightBox.disconnect(this._rightBoxActorAddedID); + if (this._centerBoxActorAddedID) + this.panel._centerBox.disconnect(this._centerBoxActorAddedID); + if (this._leftBoxActorAddedID) + this.panel._leftBox.disconnect(this._leftBoxActorAddedID); + + this._restoreOriginalStyle(this.panel._rightBox); + this._restoreOriginalStyle(this.panel._centerBox); + this._restoreOriginalStyle(this.panel._leftBox); + + this._applyStylesRecursively(true); + }, + + _applyStylesRecursively: function(restore) { + /*recurse actors */ + if(this._rightBoxOperations.length) { + // add the system menu as we move it from the rightbox to the panel to position it independently + let children = this.panel._rightBox.get_children().concat([this.panel.statusArea.aggregateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._rightBoxOperations, restore); + } + + if(this._centerBoxOperations.length) { + // add the date menu as we move it from the centerbox to the panel to position it independently + let children = this.panel._centerBox.get_children().concat([this.panel.statusArea.dateMenu.container]); + for(let i in children) + this._recursiveApply(children[i], this._centerBoxOperations, restore); + } + + if(this._leftBoxOperations.length) { + let children = this.panel._leftBox.get_children(); + for(let i in children) + this._recursiveApply(children[i], this._leftBoxOperations, restore); + } + }, + + _recursiveApply: function(actor, operations, restore) { + for(let i in operations) { + let o = operations[i]; + if(o.compareFn(actor)) + if(restore) + o.restoreFn ? o.restoreFn(actor) : this._restoreOriginalStyle(actor); + else + o.applyFn(actor, i); + } + + if(actor.get_children) { + let children = actor.get_children(); + for(let i in children) { + this._recursiveApply(children[i], operations, restore); + } + } + }, + + _restoreOriginalStyle: function(actor) { + if (actor._dtp_original_inline_style !== undefined) { + actor.set_style(actor._dtp_original_inline_style); + delete actor._dtp_original_inline_style; + delete actor._dtp_style_overrides; + } + + if (actor.has_style_class_name('panel-button')) { + this._refreshPanelButton(actor); + } + }, + + _refreshPanelButton: function(actor) { + if (actor.visible && imports.misc.config.PACKAGE_VERSION >= '3.34.0') { + //force gnome 3.34+ to refresh (having problem with the -natural-hpadding) + let parent = actor.get_parent(); + let children = parent.get_children(); + let actorIndex = 0; + + if (children.length > 1) { + actorIndex = children.indexOf(actor); + } + + this._ignoreAddedChild = [this.panel._centerBox, this.panel._rightBox].indexOf(parent) >= 0; + + parent.remove_child(actor); + parent.insert_child_at_index(actor, actorIndex); + } + } + +}); diff --git a/po/af.po b/po/af.po new file mode 100644 index 0000000..4781f01 --- /dev/null +++ b/po/af.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: af\n" + +msgid "Files" +msgstr "Lêers" + +msgid "Settings" +msgstr "Instellings" diff --git a/po/an.po b/po/an.po new file mode 100644 index 0000000..7c1e239 --- /dev/null +++ b/po/an.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: an\n" + +msgid "System Monitor" +msgstr "Monitor d'o sistema" + +msgid "Files" +msgstr "Fichers" + +msgid "Settings" +msgstr "Configuración" diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 0000000..9bfdbac --- /dev/null +++ b/po/ar.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ar\n" + +msgid "System Monitor" +msgstr "مرقاب النّظام" + +msgid "Files" +msgstr "الملفات" + +msgid "Settings" +msgstr "الإعدادات" diff --git a/po/as.po b/po/as.po new file mode 100644 index 0000000..8e37193 --- /dev/null +++ b/po/as.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: as\n" + +msgid "System Monitor" +msgstr "চিস্টেম মনিটৰ" + +msgid "Files" +msgstr "ফাইলসমূহ" + +msgid "Settings" +msgstr "সংহতিসমূহ" diff --git a/po/ast.po b/po/ast.po new file mode 100644 index 0000000..6c07a01 --- /dev/null +++ b/po/ast.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ast\n" + +msgid "System Monitor" +msgstr "Monitor del Sistema" + +msgid "Files" +msgstr "Ficheros" diff --git a/po/az.po b/po/az.po new file mode 100644 index 0000000..13bf6c1 --- /dev/null +++ b/po/az.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: az\n" + +msgid "System Monitor" +msgstr "Sistem İzləyicisi" diff --git a/po/be.po b/po/be.po new file mode 100644 index 0000000..68c52e9 --- /dev/null +++ b/po/be.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: be\n" + +msgid "System Monitor" +msgstr "Сістэмны назіральнік" + +msgid "Files" +msgstr "Файлы" + +msgid "Settings" +msgstr "Настройкі" diff --git a/po/be@latin.po b/po/be@latin.po new file mode 100644 index 0000000..f807a24 --- /dev/null +++ b/po/be@latin.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: be@latin\n" + +msgid "System Monitor" +msgstr "Systemny naziralnik" diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..fbc2a60 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: bg\n" + +msgid "System Monitor" +msgstr "Наблюдение на системата" + +msgid "Files" +msgstr "Файлове" + +msgid "Settings" +msgstr "Настройки" diff --git a/po/bn.po b/po/bn.po new file mode 100644 index 0000000..6534976 --- /dev/null +++ b/po/bn.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: bn\n" + +msgid "System Monitor" +msgstr "সিস্টেম পর্যবেক্ষক" + +msgid "Files" +msgstr "ফাইল" diff --git a/po/bn_IN.po b/po/bn_IN.po new file mode 100644 index 0000000..30f4dc3 --- /dev/null +++ b/po/bn_IN.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: bn_IN\n" + +msgid "System Monitor" +msgstr "System Monitor" + +msgid "Files" +msgstr "ফাইল" + +msgid "Settings" +msgstr "সেটিং" diff --git a/po/bo.po b/po/bo.po new file mode 100644 index 0000000..e24e310 --- /dev/null +++ b/po/bo.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: bo\n" + +msgid "Files" +msgstr "ཡིག་ཆ" diff --git a/po/br.po b/po/br.po new file mode 100644 index 0000000..e4b1629 --- /dev/null +++ b/po/br.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: br\n" + +msgid "Settings" +msgstr "Arventennoù" diff --git a/po/bs.po b/po/bs.po new file mode 100644 index 0000000..4dcfbf5 --- /dev/null +++ b/po/bs.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: bs\n" + +msgid "System Monitor" +msgstr "Nadzor sistema" + +msgid "Files" +msgstr "Datoteke" + +msgid "Settings" +msgstr "Postavke" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..2b471d0 --- /dev/null +++ b/po/ca.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ca\n" + +msgid "System Monitor" +msgstr "Monitor del sistema" + +msgid "Files" +msgstr "Fitxers" + +msgid "Settings" +msgstr "Paràmetres" diff --git a/po/ca@valencia.po b/po/ca@valencia.po new file mode 100644 index 0000000..3b4423c --- /dev/null +++ b/po/ca@valencia.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ca-valencia\n" + +msgid "System Monitor" +msgstr "Monitor del sistema" + +msgid "Files" +msgstr "Fitxers" + +msgid "Settings" +msgstr "Paràmetres" diff --git a/po/ckb.po b/po/ckb.po new file mode 100644 index 0000000..8b30d48 --- /dev/null +++ b/po/ckb.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ckb\n" + +msgid "Files" +msgstr "پەڕگەکان" + +msgid "Settings" +msgstr "ڕێكخستنەكان" diff --git a/po/crh.po b/po/crh.po new file mode 100644 index 0000000..f925ab8 --- /dev/null +++ b/po/crh.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: crh\n" + +msgid "Files" +msgstr "Dosyeler" + +msgid "Settings" +msgstr "Ayarlar" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..6887e06 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,1311 @@ +# Dash to panel. +# Copyright (C) 2018 +# This file is distributed under the same license as the dash-to-panel package. +# Milan Zink , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-11 09:28+0200\n" +"PO-Revision-Date: 2019-10-11 09:33+0200\n" +"Last-Translator: Milan Zink \n" +"Language-Team: \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 2.2.4\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Nahoře, ikony dole" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "Vlevo, ikony vpravo" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Nahoře, ikony ukotveny uprostřed" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "Vlevo, ikony uprostřed" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Nahoře, plovoucí ikony" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "Vlevo, plovoucí ikony" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Uprostřed, na střed monitoru" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Uprostřed, plovoucí" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Uprostřed, plovoucí" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "Nad ikonami" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "Vlevo od ikon" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "Dole pod ikonami" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "Vpravo od ikon" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "Nad systémovou oblastí" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "Vlevo od systémové oblasti" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "Pod systémovou oblastí" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "Vpravo od systémové oblasti" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "Nad seznamem úloh" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "Vlevo od seznamu úloh" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "Pod seznamem úloh" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "Vpravo od seznamu úloh" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "Výška tlačítka plochy (px)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "Šířka tlačítka plochy (px)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Nastavení indikátoru běžících aplikací" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1078 prefs.js:1325 prefs.js:1409 prefs.js:1474 +#: prefs.js:1510 prefs.js:1607 prefs.js:1641 prefs.js:1683 +msgid "Reset to defaults" +msgstr "Nastavit výchozí hodnoty" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Default (Primární monitor)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Monitor " + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Nastavení více monitorů" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Dynamická průhlednost" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Nastavení inteligentního skrývaní (Intellihide)" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "Zobrazit ikonu aplikací" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "Nastavení plochy" + +#: prefs.js:1071 +msgid "Window preview options" +msgstr "Nastavení náhledu oken" + +#: prefs.js:1318 +msgid "Ungrouped application options" +msgstr "Nastavení neseskupených aplikací" + +#: prefs.js:1402 +msgid "Customize middle-click behavior" +msgstr "Akce prostředního tlačítko myši" + +#: prefs.js:1467 +msgid "Customize panel scroll behavior" +msgstr "Chování prostředního tlačítko myši nad panelem" + +#: prefs.js:1503 +msgid "Customize icon scroll behavior" +msgstr "Nastavit chování prostředního tlačítko myši" + +#: prefs.js:1600 +msgid "Advanced hotkeys options" +msgstr "Nastavení dalších klávesových zkratek" + +#: prefs.js:1634 +msgid "Secondary Menu Options" +msgstr "Nastavení sekundárního menu" + +#: prefs.js:1676 Settings.ui.h:223 +msgid "Advanced Options" +msgstr "Pokročilá nastavení" + +#: prefs.js:1763 +msgid "Export settings" +msgstr "Exportovat nastavení" + +#: prefs.js:1780 +msgid "Import settings" +msgstr "Importovat nastavení" + +#: appIcons.js:1380 +msgid "Show Details" +msgstr "Zobrazit detaily" + +#: appIcons.js:1398 +msgid "New Window" +msgstr "Nové okno" + +#: appIcons.js:1398 appIcons.js:1458 appIcons.js:1460 Settings.ui.h:10 +msgid "Quit" +msgstr "Ukončit" + +#: appIcons.js:1460 +msgid "Windows" +msgstr "Okna" + +#: appIcons.js:1684 +msgid "Power options" +msgstr "Možnosti napájení" + +#: appIcons.js:1689 +msgid "Event logs" +msgstr "Události" + +#: appIcons.js:1694 +msgid "System" +msgstr "Systém" + +#: appIcons.js:1699 +msgid "Device Management" +msgstr "Spáva zařízení" + +#: appIcons.js:1704 +msgid "Disk Management" +msgstr "Správa disků" + +#: appIcons.js:1711 +msgid "Terminal" +msgstr "Terminál" + +#: appIcons.js:1716 +msgid "System Monitor" +msgstr "Sledování systému" + +#: appIcons.js:1721 +msgid "Files" +msgstr "Soubory" + +#: appIcons.js:1726 +msgid "Settings" +msgstr "Nastavení" + +#: appIcons.js:1733 +msgid "Unlock taskbar" +msgstr "Odemknout panel úloh" + +#: appIcons.js:1733 +msgid "Lock taskbar" +msgstr "Zamknout panel úloh" + +#: appIcons.js:1738 +msgid "Taskbar Settings" +msgstr "Nastavení panel úloh" + +#: appIcons.js:1745 +msgid "Restore Windows" +msgstr "Obnovit okna" + +#: appIcons.js:1745 +msgid "Show Desktop" +msgstr "Zobrazit plochu" + +#: update.js:58 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "Verze %s (%s) je dostupná" + +#: update.js:59 +msgid "Details" +msgstr "Zobrazit detaily" + +#: update.js:60 +msgid "Update" +msgstr "Aktualizace" + +#: update.js:63 +msgid "Already up to date" +msgstr "Používáte aktuální verzi" + +#: update.js:148 +msgid "Update successful, please log out/in" +msgstr "Aktualizace proběhla, je nutné se odhlásit a přihlásit" + +#: update.js:149 +msgid "Log out" +msgstr "Odhlásit" + +#: update.js:153 +msgid "Update successful, please restart GNOME Shell" +msgstr "Aktualizace proběhla, restartujte GNOME Shell" + +#: update.js:154 +msgid "Restart GNOME Shell" +msgstr "Restartovat GNOME Shell..." + +#: update.js:154 +msgid "Restarting GNOME Shell..." +msgstr "Restartuji GNOME Shell..." + +#: update.js:160 +msgid "Error: " +msgstr "Chyba: " + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Zatím nedostupné!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Pokud je nastavena minimalizace, pak budou minimalizováno všechna okna " +"aplikace." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Akce při Shift+Click" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Okno do popředí" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Minimalizovat okno" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Spustit nové okno aplikace" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Procházet okna" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Procházet okna a minimalizovat" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Přepnout náhled jedno/více" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Chování při stisku prostředního tlačítka." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Prostřední tlačítko myši" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Shift + prostřední tlačítko myši." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Akce při Shift + prostřední tlačítko myši" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Oddělit monitory" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Zobrazit oblíbené aplikace na všech monitorech" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Zobrazit hodiny na všech monitorech" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Zobrazit stavovou nabídku na všech monitorech" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Zobrazit položky menu aplikace" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Zobrazit menu Detail" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Zvýraznit aplikaci v popředí" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Hlavní barva ikony" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Vlastní barva" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Průhlednost zvýraznění" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "Výška indikátoru aplikace (px)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Hlavní barva ikony - Přepsat nastavení vzhledu" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Barva indikátoru - Přepsat nastavení vzhledu" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 otevřené okno (nebo neseskupené)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Nastavit pro všechny" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 otevřená okna" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 otevřená okna" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4 a více otevřených oken" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Použít jinou pro okna v pozadí" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Velikost fontu (px) titulku aplikace (výchozí 14)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Velikost fontu titulku aplikace" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "zdědit nastavení tématu" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normální" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "tenčí" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "tučný" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "tučnější" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Barva fontu (px) titulku aplikace" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Maximální šířka titulku aplikace (výchozí 160)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Použít pevnou šířku titulku aplikací" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Titulky aplikací mají stejnou šířku, i když je text kratší. Maximální " +"hodnota je použita pro všechny." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Zobrazit indikátor aplikací na pozadí" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "Použít ikony oblíbených aplikací jako spouštěče" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Skrýt panel pouze při překrytí okny aplikací " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "Skrývání panelu pro" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Všechna okna" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Okna v popředí" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Maximalizovaná okna" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Vyžaduje podržení myši u okraje obrazovky pro zobrazení panelu" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Citlivost okraje obrazovky při držení myši (px)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Doba držení myši (ms)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Povolit zobrazení panelu v režimu celá obrazovka" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Skrýt pouze sekundární panely (pro více monitorů)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "např. i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Klávesová zkratka pro zobrazení panelu" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Syntaxe: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Rychlost animace zobrazení/skrytí panelu" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Zpoždění před skrytím panelu" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Zpoždění před skrytím při startu (ms)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Pauza před zobrazením náhledu (výchozí 100ms)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Trvání animace (ms)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Pauza před skrytím náhledu (výchozí 100ms)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Okamžitě po kliknutí na ikonu aplikace" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "Prostřední tlačítko myši zavře okno v režimu náhledu" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Velikost náhledu okna (px)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Poměr stran náhledu okna (výška)" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Okraje náhledu oken (px)" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "Pevný" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Poměr stran náhledu okna (šířka)" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Použít vlastní nastavení průhlednosti pro náhledy" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "Při vypnutí se použije hodnota průhlednosti panelu" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Pozice titulku a tlačítka zavření okna" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Dole" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Nahoře" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Zobrazit titulek okna v náhledech" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Velikost fontu (px) titulku aplikace" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Velikost fontu titulku aplikace" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Barva fontu (px) titulku aplikace" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Povolit režim náhledu okna" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "Rozlišit okna po delším zobrazení náhledu." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Povolit režim náhledu okna po (ms)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "Čas nečinnosti nad ikonou před přechodem do režimu náhledu okna." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Průhlednost režimu náhledu okna" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "Všechna okna, mimo aktivního, mají stejné nastavení průhlednosti." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Prodleva mezi skrolováním myší" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "Omezit počet událostí skrolování myší" + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Win" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Win + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Zkratka" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Zkratky budou buď Win+číslo nebo Win+Alt+číslo" + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Nikdy" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Zobrazit dočasně" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Vždy viditelné" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Zobrazit číslo" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "Dočasně zobrazit čísla aplikací při použití klávesových zkratek." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Schovat po (ms)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "např: q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Zkratka pro zobrazení přehledu" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Zobrazit náhled okna při najetí myši" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Zobrazit náhledy pokud má aplikace více otevřených oken" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Číslo řádku" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Numerická klávesnice" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "Oba" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Aktivovat klávesové zkratky pomocí" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "Vyberte které klávesy jsou použity k aktivaci klávesových zkratek" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Zobrazit ikonu aplikace" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Vyberte volbu 'Zobrazit ikonu aplikace'" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Vlastní nastavení zobrazení ikony aplikace" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "Zobrazit ikonu aplikací s mezerou (px)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Zobrazit pracovní plochu po najetí na tlačítko plochy" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Zpoždění před zobrazením plochy (ms)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Schovat po (ms)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "Nastavení průhlednosti panelu je ovlivněno" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Změnit průhlednost při přiblížení okna (px)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Změnit průhlednost (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Rychlost animace zobrazení/skrytí panelu" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Pozice panelu na obrazovce" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "Vlevo" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "Vpravo" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Pozice panelu" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Umístění hodin" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "Hlavní panel zobrazit na" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Zobrazit panel na všech monitorech" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Inteligentní skrývání (Intellihide)" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "Zobrazit/skrýt panel podle nastavení" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Umístění" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Výška panelu\n" +"(výchozí = 48)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Rozestup ikon aplikací\n" +"(výchozí = 8)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Okraje ikon aplikací\n" +"(výchozí = 4)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Pozice indikátoru" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Styl indikátoru běžících aplikací (v popředí)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Tečky" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Čtverce" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Čárkovaný" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Dělený" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Solid" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Styl indikátoru běžících aplikací (v pozadí)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "Vlastní barva pozadí panelu " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "Vlastní průhlednost panelu" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Průhlednost panelu (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Dynamická průhlednost" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "Změnit průhlednost při přiblížení okna" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "Vlastní nastavení barevného přechodu panelu " + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Horní barva barevného přechodu a průhlednost (%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Dolní barva barevného přechodu a průhlednost (%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Vzhled" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Zobrazit oblíbené aplikace" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Zobrazit spuštěné aplikace" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Zobrazit ikonu aplikací" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Animovat zobrazení aplikací." + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Zobrazit tlačítko aktivit" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Zobrazit tlačítko plochy" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Zobrazit tlačítko aplikací" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "Nabídka aplikace > Musí být povoleno v Gnome Tweak Tool" + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Zobrazit náhled okna při najetí myši" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Zobrazit tip okna při najetí myši" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Oddělit pracovní plochy" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Neseskupené aplikace" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Chování" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Chování při kliknutí na ikonu běžící aplikace." + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "Akce myši" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Přepínat okna" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Akce panelu při skrolování" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Chování prostředního tlačítko myši nad panelem" + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Akce kolečka myši" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Chování kolečka myši nad ikonu běžící aplikace." + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "Nedělat nic" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Přepnout plochu" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Procházet okna" + +#: Settings.ui.h:205 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Povolit klávesové zkratky Win+(0-9) ke spouštění aplikací. Lze použít v " +"kombinaci s Shift a Ctrl." + +#: Settings.ui.h:206 +msgid "Use hotkeys to activate apps" +msgstr "Použít klávesové zkratky pro spouštění aplikací" + +#: Settings.ui.h:207 +msgid "Action" +msgstr "Akce" + +#: Settings.ui.h:208 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "Stavové ikony - velikost fontu (0 = výchozí)" + +#: Settings.ui.h:210 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "Levý panel - velikost fontu (0 = výchozí)" + +#: Settings.ui.h:212 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Mezery mezi systémovými ikonami\n" +"(-1 = theme default)" + +#: Settings.ui.h:214 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Mezery mezi stavovými ikonami\n" +"(-1 = výchozí)" + +#: Settings.ui.h:216 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Odsazení vlevo\n" +"(-1 = výchozí)" + +#: Settings.ui.h:218 +msgid "Animate switching applications" +msgstr "Animovat přepínání oken" + +#: Settings.ui.h:219 +msgid "Animate launching new windows" +msgstr "Animovat spouštěná okna" + +#: Settings.ui.h:220 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Ponechat původní 'gnome-shell dash' (přehled úloh)" + +#: Settings.ui.h:221 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "Aktivovat tlačítka na panelu pouze po stisknutí" + +#: Settings.ui.h:222 +msgid "App icon secondary (right-click) menu" +msgstr "Nastavení pravého kliku na ikonu aplikace" + +#: Settings.ui.h:224 +msgid "Fine-Tune" +msgstr "Detailní nastavení" + +#: Settings.ui.h:225 +msgid "version: " +msgstr "verze: " + +#: Settings.ui.h:226 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:227 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Pomocí níže uvedených tlačítek vytvoříte exportujete nastavení do souboru. " +"Ten lze importovat na jiném počítači." + +#: Settings.ui.h:228 +msgid "Export and import settings" +msgstr "Export a Import nastavení" + +#: Settings.ui.h:229 +msgid "Export to file" +msgstr "Exportovat do souboru" + +#: Settings.ui.h:230 +msgid "Import from file" +msgstr "Importovat ze souboru" + +#: Settings.ui.h:231 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "Povolit aktualizace přímo z Github" + +#: Settings.ui.h:232 +msgid "Updates" +msgstr "Aktualizace" + +#: Settings.ui.h:233 +msgid "Periodically check for updates" +msgstr "Pravidelně kontrolovat aktualizace" + +#: Settings.ui.h:234 +msgid "Check now" +msgstr "Zkontrolovat teď" + +#: Settings.ui.h:235 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Pozor, nové verze nemusím být ještě " +"schváleny na portálu extensions.gnome.org! Dozvědět se víc" + +#: Settings.ui.h:236 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Tento program je nabízen bez jakýchkoli záruk.\n" +"Přečtěte si GNU General Public License, version 2 nebo novější verze." + +#: Settings.ui.h:238 +msgid "About" +msgstr "O rozšíření" + +#~ msgid "Highlight color" +#~ msgstr "Barva zvýraznění" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Skrýt náhled aplikace po odjetí myši (ms)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Náhled aplikací může mizet velmi rychle při velmi nízkých hodnotách. Při " +#~ "velkých hodnotách může naopak zůstávat i po najetí na jinou ikonu " +#~ "aplikace." + +#~ msgid "Middle click to close window" +#~ msgstr "Prostřední tlačítko myši zavře okno" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Šířka náhledu oken aplikací (px)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Výška náhledu oken aplikací (px)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Mezery náhledu oken aplikací (px)" + +#~ msgid "Natural" +#~ msgstr "Přirozené" + +#~ msgid "Left side of panel" +#~ msgstr "Vlevo na panelu" + +#~ msgid "Centered in content" +#~ msgstr "Na střed obsahu" + +#~ msgid "Github" +#~ msgstr "Github" + +msgid "Weekday" +msgstr "Den v týdnu" + +msgid "Date" +msgstr "Datum" + +msgid "Seconds" +msgstr "Sekundy" diff --git a/po/cy.po b/po/cy.po new file mode 100644 index 0000000..92eb46f --- /dev/null +++ b/po/cy.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: cy\n" + +msgid "System Monitor" +msgstr "Arsylwr System" diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..0a6eece --- /dev/null +++ b/po/da.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: da\n" + +msgid "System Monitor" +msgstr "Systemovervågning" + +msgid "Files" +msgstr "Filer" + +msgid "Settings" +msgstr "Indstillinger" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..4218436 --- /dev/null +++ b/po/de.po @@ -0,0 +1,1297 @@ +# 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 , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-04 20:47+0200\n" +"PO-Revision-Date: 2019-10-04 21:49+0200\n" +"Last-Translator: Jonatan Hatakeyama Zeidler \n" +"Language-Team: \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 2.2.4\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Oben, mit Erweiterungssymbolen nach unten eingeklappt" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "Links, mit Erweiterungssymbolen nach rechts eingeklappt" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Oben, mit fix zentrierten Erweiterungssymbolen" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "Links, mit fix zentrierten Erweiterungssymbolen" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Oben, mit beweglich zentrierten Erweiterungssymbolen" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "Links, mit beweglich zentrierten Erweiterungssymbolen" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Mitte, fest in der Bildschirmmitte" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Mitte, beweglich zwischen oberen und unteren Elementen" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Mitte, beweglich zwischen linken und rechten Elementen" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "Oberhalb der Erweiterungssymbole" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "Links der Erweiterungssymbole" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "Unterhalb der Erweiterungssymbole" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "Rechts der Erweiterungssymbole" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "Oberhalb der Systemindikatoren" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "Links der Systemindikatoren" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "Unterhalb der Systemindikatoren" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "Rechts der Systemindikatoren" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "Oberhalb der Anwendungsleiste" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "Links der Anwendungsleiste" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "Unterhalb der Anwendungsleiste" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "Rechts der Anwendungsleiste" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "Schreibtisch-Schaltflächenhöhe (px)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "Schreibtisch-Schaltflächenbreite (px)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Optionen Aktiv-Markierungen" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1078 prefs.js:1325 prefs.js:1409 prefs.js:1474 +#: prefs.js:1510 prefs.js:1607 prefs.js:1641 prefs.js:1683 +msgid "Reset to defaults" +msgstr "Zurücksetzen" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Vorgabe (Primärer Monitor)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Bildschirm " + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Optionen Mehrere Bildschirme" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Optionen Dynamische Deckkraft" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Optionen zum automatischen Ausblenden" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "Anwendungsoptionen anzeigen" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "Schreibtisch-Optionen anzeigen" + +#: prefs.js:1071 +msgid "Window preview options" +msgstr "Optionen Fenstervorschau" + +#: prefs.js:1318 +msgid "Ungrouped application options" +msgstr "Optionen nicht gruppierter Anwendungen" + +#: prefs.js:1402 +msgid "Customize middle-click behavior" +msgstr "Mittelklick-Verhalten anpassen" + +#: prefs.js:1467 +msgid "Customize panel scroll behavior" +msgstr "Leisten-Scroll-Verhalten anpassen" + +#: prefs.js:1503 +msgid "Customize icon scroll behavior" +msgstr "Symbol-Scroll-Verhalten anpassen" + +#: prefs.js:1600 +msgid "Advanced hotkeys options" +msgstr "Erweiterte Schnelltastenoptionen" + +#: prefs.js:1634 +msgid "Secondary Menu Options" +msgstr "Rechtsklickmenü-Optionen" + +#: prefs.js:1676 Settings.ui.h:223 +msgid "Advanced Options" +msgstr "Erweiterte Optionen" + +#: prefs.js:1763 +msgid "Export settings" +msgstr "Einstellungen exportieren" + +#: prefs.js:1780 +msgid "Import settings" +msgstr "Einstellungen importieren" + +#: appIcons.js:1380 +msgid "Show Details" +msgstr "Details anzeigen" + +#: appIcons.js:1398 +msgid "New Window" +msgstr "Neues Fenster" + +#: appIcons.js:1398 appIcons.js:1458 appIcons.js:1460 Settings.ui.h:10 +msgid "Quit" +msgstr "Schließen" + +#: appIcons.js:1460 +msgid "Windows" +msgstr "Fenster" + +#: appIcons.js:1684 +msgid "Power options" +msgstr "Energieoptionen" + +#: appIcons.js:1689 +msgid "Event logs" +msgstr "Ereignislogs" + +#: appIcons.js:1694 +msgid "System" +msgstr "System" + +#: appIcons.js:1699 +msgid "Device Management" +msgstr "Geräteverwaltung" + +#: appIcons.js:1704 +msgid "Disk Management" +msgstr "Festplattenverwaltung" + +#: appIcons.js:1711 +msgid "Terminal" +msgstr "Terminal" + +#: appIcons.js:1716 +msgid "System Monitor" +msgstr "Systemüberwachung" + +#: appIcons.js:1721 +msgid "Files" +msgstr "Dateien" + +#: appIcons.js:1726 +msgid "Settings" +msgstr "Einstellungen" + +#: appIcons.js:1733 +msgid "Unlock taskbar" +msgstr "Anwendungsleiste entsperren" + +#: appIcons.js:1733 +msgid "Lock taskbar" +msgstr "Anwendungsleiste sperren" + +#: appIcons.js:1738 +msgid "Taskbar Settings" +msgstr "Erweiterungseinstellungen" + +#: appIcons.js:1745 +msgid "Restore Windows" +msgstr "Fenster wiederherstellen" + +#: appIcons.js:1745 +msgid "Show Desktop" +msgstr "Schreibtisch anzeigen" + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Noch nichts!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Falls Minimieren eingestellt ist, minimiert ein Doppelklick alle Fenster der " +"Anwendung." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Aktion Umschalt+Klick" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Fenster nach vorne holen" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Fenster minimieren" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Neues Fenster öffnen" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Fenster durchwechseln" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Fenster durchwechseln + minimieren" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Einzelumschaltung / Vorschau mehrere" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Verhalten bei einem Mittelklick." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Aktion Mittelklick" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Aktion bei Umschalt+Mittelklick." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Aktion Umschalt+Mittelklick" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Bildschirme isolieren" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Favoriten auf allen Bildschirmen anzeigen" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Uhr auf allen Bildschirmen anzeigen" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Statusmenü auf allen Bildschirmen anzeigen" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Integriere Einträge aus Anwendungsmenü" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Details anzeigen-Menüeintrag" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Fokussierte Anwendung hervorheben" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Dominante Symbolfarbe" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Angepasste Farbe" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Deckkraft Hervorhebung" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "Symbolhöhe (px)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Symbolfarbe - Symbol Dominant" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Symbolfarbe - Thema überschreiben" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 Fenster offen (oder nicht gruppiert)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Auf alle anwenden" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 Fenster offen" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 Fenster offen" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4+ Fenster offen" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Andere für nicht fokussierte" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Schriftgröße (px) des Anwendungstitels (14 ist Vorgabe)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Schriftdicke der Anwendungstitel" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "Vom Thema übernehmen" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normal" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "dünner" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "dick" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "dicker" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Schriftfarbe des Anwendungstitels" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Maximale Breite (px) des Anwendungstitels (160 ist Vorgabe)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Feste Breite für Anwendungstitel nutzen" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Die Anwendungstitel haben alle die gleiche Breite, selbst wenn der Text " +"kürzer ist als die maximale Breite. Die maximale Breite wird als feste " +"Breite genutzt." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Läuft-Indikatoren auf nicht fokussierten Anwendungen anzeigen" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "Favoritensymbole als Anwendungsstarter nutzen" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Leiste nur bei Überschneidung mit Fenstern ausblenden " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "Die Leiste weicht aus" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Alle Fenster" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Fokussierte Fenster" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Maximierte Fenster" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Druckschwelle am Rand zum Einblenden der Leiste" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Benötigte Druckschwelle (px)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Benötigte Druckverzögerung (ms)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Einblenden der Leiste im Vollbildmodus erlauben" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Nur sekundäre Leisten ausblenden (benötigt Option Mehrere Bildschirme)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "z.B. i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Tastenkürzel zum Einblenden und Halten der Leiste" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Syntax: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Ein-/Ausblenddauer (ms)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Verzögerung vor dem Ausblenden (ms)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Verzögerung des automatischen Ausblendens beim Start (ms)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Verzögerung (ms) beim Einblenden (Standard ist 100)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Animationszeit (ms)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Verzögerung (ms) beim Ausblenden (Vorgabe ist 100)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Sofort beim Klick auf das Anwendungssymbol" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "Mittelklick auf Vorschau zum Schließen des Fensters" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Bevorzugte Fenstervorschaugröße (px)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Fenstervorschau Format Y (Höhe)" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Abstand Fenstervorschau (px)" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "Fest" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Fenstervorschau Format X (Breite)" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Angepasste Deckkraft für Vorschauhintergrund" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "" +"Falls deaktiviert, hat der Vorschauhintergrund die gleiche Deckkraft wie die " +"Leiste" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Schließenschaltfläche und Position Fenstertitel" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Unten" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Oben" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Fenstertitel in Vorschau anzeigen" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Schriftgröße (px) des Vorschauanwendungstitels" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Schriftdicke des Vorschauanwendungstitels" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Schriftfarbe des Vorschauanwendungstitels" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Fensterhervorhebung aktivieren" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Wenn der Mauszeiger über einer Fenstervorschau verweilt, wird das Fenster " +"hervorgehoben." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Zeitgrenze zur Aktivierung der Fensterhervorhebung (ms)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Verzögerung, während der der Mauszeiger über einer Fenstervorschau bleiben " +"muss, um die Fensterhervorhebung zu aktivieren." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Deckkraft Fensterhervorhebung" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"Die Deckkraft aller Fenster, außer dem hervorgehobenen, hat denselben Wert." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Verzögerung zwischen Maus-Scroll-Ereignissen (ms)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "Dieser Wert limitiert die Anzahl akzeptierter Maus-Scroll-Ereignisse." + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Schnelltasten-Präfix" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Schnelltasten sind entweder Super+Nummer oder Super+Alt+Nummer" + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Nie" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Vorübergehend anzeigen" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Immer sichtbar" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Nummern-Overlay" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Zeige Anwendungsnummern über Symbolen, während Schnelltasten gedrückt werden." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Ausblendeverzögerung (ms)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "z.B. q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Kürzel zum Anzeigen der Nummern für 2 Sekunden" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Fenstervorschau per Tastenkürzel einblenden" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Vorschau anzeigen, wenn Anwendungen mehrere Fenster hat" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Nummernreihe" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Zahlenfeld" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "Beide" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Schnelltasten aktivieren mit" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "Auswählen, welche Zahlenfeldtasten die Schnelltasten aktivieren" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Aktuelles Anwendungen anzeigen-Symbol" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Anwendungen anzeigen-Symbol auswählen" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Angepasstes Anwendungen anzeigen-Symbol" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "Seitenabstand bei Anwendungssymbolen anzeigen (px)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Schreibtisch zeigen, wenn Maus die Schreibtischschaltfläche berührt" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Verzögerung beim Zeigen des Schreibtischs (ms)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Ausblendedauer (ms)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "Die Deckkraft des Leistenhintergrunds wird beeinflusst durch" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Deckkraft ändern, wenn Fenster näher kommt als (px)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Deckkraft ändern zu (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Animationsdauer Änderung Deckkraft (ms)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Position der Leiste" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "Links" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "Rechts" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Position Anwendungsleiste" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Position der Uhr" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "Hauptleiste anzeigen auf" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Leisten auf allen Bildschirmen anzeigen" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Automatischen Ausblenden" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "Leiste entsprechend der Einstellungen ein-/ausblenden" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Position" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Leistengröße\n" +"(48 ist Standard)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Symbolabstand\n" +"(8 ist Standard)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Symbolabstand\n" +"(Vorgabewert ist 4)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Position Aktiv-Markierung" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Stil Aktiv-Markierung (fokussierte Anwendung)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Punkte" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Quadrate" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Striche" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Unterteilt" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Fest" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Stil Aktiv-Markierung (nicht fokussierte Anwendung)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "Leistenhintergrundfarbe des Themas überschreiben " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "Leistenhintergrunddeckkraft des Themas überschreiben" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Leistenhintergrunddeckkraft (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Dynamische Hintergrunddeckkraft" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "Deckkraft ändern, wenn Fenster der Leiste nahe kommt" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "Verlauf des Themas überschreiben " + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Obere Farbe und Deckkraft des Verlaufs (%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Untere Farbe und Deckkraft des Verlaufs (%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Stil" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Favoritensymbole anzeigen" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Laufende Anwendungen anzeigen" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Anwendungen-Symbol anzeigen" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Animation bei Anwendungen einblenden." + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Aktivitäten-Schaltfläche anzeigen" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Schreibtisch-Schaltfläche anzeigen" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Anwendungsmenü-Schaltläche anzeigen" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Obere Leiste > Anwendungsmenü anzeigen muss aktiviert sein im " +"Optimierungswerkzeug (Tweak Tool)" + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Fenstervorschau bei Berührung einblenden" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Kurzinfo bei Berührung" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Arbeitsflächen isolieren" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Anwendungen nicht gruppieren" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Verhalten" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Verhalten beim Anklicken des Symbols einer laufenden Anwendung." + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "Klickaktion" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Fenster umschalten" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Leisten-Scrollen" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Verhalten beim Scrollen über der Leiste." + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Symbol-Scrollen" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Verhalten beim Scrollen über ein Anwendungssymbol." + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "Nichts tun" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Arbeitsfläche wechseln" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Fenster durchwechseln" + +#: Settings.ui.h:205 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Super+(0-9) als Kürzel zum Aktivieren von Anwendungen nutzen. Kann auch mit " +"Strg und Umschalttaste genutzt werden." + +#: Settings.ui.h:206 +msgid "Use hotkeys to activate apps" +msgstr "Schnelltasten zum Aktivieren von Anwendungen nutzen" + +#: Settings.ui.h:207 +msgid "Action" +msgstr "Aktion" + +#: Settings.ui.h:208 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Schriftgröße Benachrichtigungsbereich\n" +"(0 = Themenstandard)" + +#: Settings.ui.h:210 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Schriftgröße linker Teil\n" +"(0 = Themenstandard)" + +#: Settings.ui.h:212 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Symbolabstand Benachrichtigungsbereich\n" +"(-1 = Themenstandard)" + +#: Settings.ui.h:214 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Statussymbolabstand\n" +"(-1 = Themenstandard)" + +#: Settings.ui.h:216 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "Elementabstand linker Teil" + +#: Settings.ui.h:218 +msgid "Animate switching applications" +msgstr "Wechsel zwischen Anwendungen animieren" + +#: Settings.ui.h:219 +msgid "Animate launching new windows" +msgstr "Öffnen von Anwendungen animieren" + +#: Settings.ui.h:220 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Originale Anwendungsleiste der GNOME Shell behalten (Übersicht)" + +#: Settings.ui.h:221 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "" +"Menüschaltflächen der Leiste (z.B. Datumsmenü) nur per Klick aktivieren" + +#: Settings.ui.h:222 +msgid "App icon secondary (right-click) menu" +msgstr "Anwendungsrechtsklickmenü" + +#: Settings.ui.h:224 +msgid "Fine-Tune" +msgstr "Feineinstellung" + +#: Settings.ui.h:225 +msgid "version: " +msgstr "Version: " + +#: Settings.ui.h:226 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:227 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Mit den Schaltflächen lässt sich eine Konfigdatei mit den aktuellen " +"Einstellungen erstellen, die sich auf einem anderen Rechner importieren " +"lässt." + +#: Settings.ui.h:228 +msgid "Export and import settings" +msgstr "Einstellungen ex- und importieren" + +#: Settings.ui.h:229 +msgid "Export to file" +msgstr "In Datei exportieren" + +#: Settings.ui.h:230 +msgid "Import from file" +msgstr "Aus Datei importieren" + +#: Settings.ui.h:231 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "" +"Erlaubt das Aktualisieren der Erweiterung direkt vom GitHub-Repository." + +#: Settings.ui.h:232 +msgid "Updates" +msgstr "Aktualisierungen" + +#: Settings.ui.h:233 +msgid "Periodically check for updates" +msgstr "Regelmäßig auf verfügbare Aktualisierungen prüfen" + +#: Settings.ui.h:234 +msgid "Check now" +msgstr "Jetzt prüfen" + +#: Settings.ui.h:235 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Achtung, diese offiziellen " +"Veröffentlichungen von Dash to Panel sind möglicherweise noch nicht von " +"extensions.gnome.org geprüft! Weiterlesen" + +#: Settings.ui.h:236 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Für dieses Programm besteht KEINERLEI GARANTIE.\n" +"Details unter GNU General Public License, version 2 or later" + +#: Settings.ui.h:238 +msgid "About" +msgstr "Info" + +#~ msgid "Highlight color" +#~ msgstr "Farbe Hervorhebung" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Verzögerung beim Ausblenden von Fenstervorschau (ms)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Wenn zu niedrig eingestellt, scheint die Fenstervorschau zu schnell zu " +#~ "schließen, wenn man versucht, mit der Maus die Vorschau anzuklicken. " +#~ "Falls zu hoch eingestellt, dann scheint die Fenstervorschau zu hängen, " +#~ "wenn man zum nächsten Fenster wechselt." + +#~ msgid "Middle click to close window" +#~ msgstr "Mittelklick zum Fensterschließen" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Breite der Fenstervorschau (px)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Höhe der Fenstervorschau (px)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Abstand zwischen Fenstervorschau (px)" + +#~ msgid "Natural" +#~ msgstr "Natürlich" + +#~ msgid "Left side of panel" +#~ msgstr "Linke Seite der Leiste" + +#~ msgid "Centered in content" +#~ msgstr "Am Inhalt zentriert" + +#~ msgid "Github" +#~ msgstr "Github" + +#~ msgid "Height (px)" +#~ msgstr "Höhe (px)" + +#~ msgid "Color - Override Theme" +#~ msgstr "Farbe - Thema überschreiben" + +#~ msgid "1 window open" +#~ msgstr "1 Fenster offen" + +msgid "Weekday" +msgstr "Wochentag" + +msgid "Date" +msgstr "Datum" + +msgid "Seconds" +msgstr "Sekunden" diff --git a/po/dz.po b/po/dz.po new file mode 100644 index 0000000..52dd59a --- /dev/null +++ b/po/dz.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: dz\n" + +msgid "System Monitor" +msgstr "རིམ་ལུགས་ལྟ་རྟོག་པ།" diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..ea56e0b --- /dev/null +++ b/po/el.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: el\n" + +msgid "System Monitor" +msgstr "Παρακολούθηση συστήματος" + +msgid "Files" +msgstr "Αρχεία" + +msgid "Settings" +msgstr "Ρυθμίσεις" diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 0000000..258d0bf --- /dev/null +++ b/po/eo.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: eo\n" + +msgid "System Monitor" +msgstr "Sistemmonitoro" + +msgid "Files" +msgstr "Dosieroj" + +msgid "Settings" +msgstr "Agordoj" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..5d2318e --- /dev/null +++ b/po/es.po @@ -0,0 +1,1343 @@ +# Dash to Panel Spanish translation. +# This file is distributed under the same license as the Dash to Panel package. +# Fran Glais , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-04-08 09:47-0400\n" +"PO-Revision-Date: 2017-02-17 12:11+0100\n" +"Last-Translator: Fran Glais \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:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Arriba, con iconos contraídos" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "A la izquierda, con iconos contraídos a la derecha" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Arriba, con iconos fijos centrados" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "A la izquierda, con iconos fijos centrados" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Arriba, con iconos flotantes centrados" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "A la izquierda, con iconos flotantes centrados" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Centrado, fijo en mitad del monitor" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Centrado, flotando entre los elementos superiores e inferiores" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Centrado, flotando entre los elementos de la izquierda y derecha" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "Arriba de los iconos" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "A la izquierda de los iconos" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "Abajo de los iconos" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "A la derecha de los iconos" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "Arriba de los indicadores del sistema" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "A la izquierda de los indicadores del sistema" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "Abajo de los indicadores del sistema" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "A la derecha de los indicadores del sistema" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "Arriba de la barra de tareas" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "A la izquierda de la barra de tareas" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "Abajo de la barra de tareas" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "A la derecha de la barra de tareas" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "Alto del botón Mostrar Escritorio (px)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "Ancho del botón Mostrar Escritorio (px)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Opciones del indicador de ejecución" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1084 prefs.js:1331 prefs.js:1415 prefs.js:1480 +#: prefs.js:1516 prefs.js:1613 prefs.js:1647 prefs.js:1689 +msgid "Reset to defaults" +msgstr "Restablecer los valores predeterminados" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Por defecto (Monitor principal)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Monitor " + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Opciones Muti-monitores" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Opciones de opacidad dinámica" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Opciones de ocultación inteligente" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "Mostrar las opciones de aplicación" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "Mostrar el Escritorio" + +#: prefs.js:1077 +msgid "Window preview options" +msgstr "Opciones de vista rápida de ventanas" + +#: prefs.js:1324 +msgid "Ungrouped application options" +msgstr "Opciones de ventanas no combinadas" + +#: prefs.js:1408 +msgid "Customize middle-click behavior" +msgstr "Personalizar comportamiento del botón central" + +#: prefs.js:1473 +msgid "Customize panel scroll behavior" +msgstr "Personalizar comportamiento del desplazamiento del panel" + +#: prefs.js:1509 +msgid "Customize icon scroll behavior" +msgstr "Personalizar comportamiento del desplazamiento de los iconos" + +#: prefs.js:1606 +msgid "Advanced hotkeys options" +msgstr "Opciones avanzadas de atajos de teclado" + +#: prefs.js:1640 +msgid "Secondary Menu Options" +msgstr "Opciones del menú secundario" + +#: prefs.js:1682 Settings.ui.h:226 +msgid "Advanced Options" +msgstr "Opciones avanzadas" + +#: prefs.js:1774 +msgid "Export settings" +msgstr "Exportar configuraciones" + +#: prefs.js:1791 +msgid "Import settings" +msgstr "Importar configuraciones" + +#: appIcons.js:1411 +msgid "Show Details" +msgstr "Mostrar detalles" + +#: appIcons.js:1429 +msgid "New Window" +msgstr "Ventana nueva" + +#: appIcons.js:1429 appIcons.js:1489 appIcons.js:1491 Settings.ui.h:10 +msgid "Quit" +msgstr "Salir" + +#: appIcons.js:1491 +msgid "Windows" +msgstr "Ventanas" + +#: appIcons.js:1745 +msgid "Power options" +msgstr "Energía" + +#: appIcons.js:1750 +msgid "Event logs" +msgstr "Registros" + +#: appIcons.js:1755 +msgid "System" +msgstr "Sistema" + +#: appIcons.js:1760 +msgid "Device Management" +msgstr "Pantallas" + +#: appIcons.js:1765 +msgid "Disk Management" +msgstr "Discos" + +#: appIcons.js:1773 +msgid "Terminal" +msgstr "Terminal" + +#: appIcons.js:1778 +msgid "System Monitor" +msgstr "Monitor del sistema" + +#: appIcons.js:1783 +msgid "Files" +msgstr "Carpeta personal" + +#: appIcons.js:1788 +msgid "Extensions" +msgstr "Extensiones" + +#: appIcons.js:1793 +msgid "Settings" +msgstr "Configuración" + +#: appIcons.js:1800 +msgid "Unlock taskbar" +msgstr "Desbloquear barra de tareas" + +#: appIcons.js:1800 +msgid "Lock taskbar" +msgstr "Bloquear barra de tareas" + +#: appIcons.js:1805 +msgid "Taskbar Settings" +msgstr "Opciones de barra de tareas" + +#: appIcons.js:1818 +msgid "Restore Windows" +msgstr "Restaurar ventanas" + +#: appIcons.js:1818 +msgid "Show Desktop" +msgstr "Mostrar el Escritorio" + +#: update.js:48 +msgid "Unavailable when installed from extensions.gnome.org" +msgstr "No disponible cuando se instala desde extensions.gnome.org" + +#: update.js:62 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "La versión %s (%s) está disponible" + +#: update.js:63 +msgid "Details" +msgstr "Mostrar detalles" + +#: update.js:64 +msgid "Update" +msgstr "Actualizar" + +#: update.js:67 +msgid "Already up to date" +msgstr "Ya está actualizado" + +#: update.js:75 +msgid "Error: " +msgstr "Error: " + +#: update.js:168 +msgid "Update successful, please log out/in" +msgstr "Actualización correcta, por favor, cierre e inicie sesión" + +#: update.js:169 +msgid "Log out" +msgstr "Cerrar sesión" + +#: update.js:173 +msgid "Update successful, please restart GNOME Shell" +msgstr "Actualización correcta, por favor, restaure GNOME Shell" + +#: update.js:174 +msgid "Restart GNOME Shell" +msgstr "Restarurar GNOME Shell" + +#: update.js:174 +msgid "Restarting GNOME Shell..." +msgstr "Restaurando GNOME Shel..." + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "¡Nada aún!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Cuando está seleccionado minimizar, doble pulsación minimiza todas las ventanas " +"de la aplicación." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Acción de Mayúsculas+Click" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Elevar ventanas" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Minimizar ventana" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Lanzar una nueva instancia" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Alternar entre ventanas" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Alternar ventanas y minimizar" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Alternar entre simple y vista rápida múltiple" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Comportamiento del botón central" + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Acción del botón central" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportamiento para Mayúsculas+Botón-Central" + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Acción de Mayúsculas+Botón-Central" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Aislar los espacios de trabajo" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Mostrar aplicaciones favoritas en todos los espacios de trabajo" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Mostrar reloj en todos los espacios de trabajo" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Mostrar el menú de estado en todos los espacios de trabajo" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Integrar los elementos del Menú de aplicación" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Mostrar detalles del menú de elementos" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Resaltar la aplicación activa" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Color del icono predominante" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Color personalizado" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Opacidad de resaltado" + +#: Settings.ui.h:25 +msgid "Indicator size (px)" +msgstr "Tamaño del indicador (px)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Color del indicador - Predominar el icono" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Color del indicador - Predominar sobre el tema" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 ventana abierta (o no combinada)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Aplicar a todo" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 ventanas abiertas" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 ventanas abiertas" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4 o más ventanas abiertas" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Usar diferente para desenfoque" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Tamaño de la fuente (px) para los títulos de aplicación (14 por defecto)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Tamaño de la fuente para los títulos de aplicación" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "heredado del tema" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normal" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "más fino" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "en negrita" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "más en negrita" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Color de letra de los títulos de aplicación" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Ancho máximo (px) de los títulos de aplicación (160 por defecto)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Usar ancho fijo para los títulos de aplicación" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Todos los títulos de aplicación tienen el mismo ancho, aun si el texto es " +"más corto que el ancho máximo. El ancho máximo es usado como valor fijo." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Estilo de los indicadores de ejecución (aplicación no enfocada)" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "Usar los iconos favoritos como lanzadores de aplicación" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Esconder el panel sólo cuando es obstruido por ventanas" + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "El panel se esconde de" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Todas las ventanas" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Ventanas activas" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Ventanas maximizadas" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Requerir presión en el borde de la pantalla para mostrar el panel" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Presión mínima requerida (px)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Tiempo de activación (ms)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "En modo pantalla completa, permitir que el panel sea mostrado" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Ocultar sólo los paneles secundarios (requiere opción multi-monitor)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "p.e. i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Atajos del teclado para mostrar y mantener el panel" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Sintáxis: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Duración de ocultar y mostrar animaciones (ms)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Tiempo antes de ocultar el panel (ms)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Tiempo antes de habilitar el panel inteligente (ms)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Tiempo (ms) antes de mostrar (100 por defecto)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Tiempo de la animación (ms)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Tiempo (ms) antes de ocultar (100 por defecto)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Pulsación inmediata en icono de aplicación" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "Usar el botón central en la vista rápida para cerrar la ventana" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Tamaño por defecto de las vistas rápidas (px)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Altura de la vista rápida de ventanas" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Relleno (px) de la vista rápida de ventanas" + +#: Settings.ui.h:71 +msgid "1" +msgstr "" + +#: Settings.ui.h:72 +msgid "2" +msgstr "" + +#: Settings.ui.h:73 +msgid "3" +msgstr "" + +#: Settings.ui.h:74 +msgid "4" +msgstr "" + +#: Settings.ui.h:75 +msgid "5" +msgstr "" + +#: Settings.ui.h:76 +msgid "6" +msgstr "" + +#: Settings.ui.h:77 +msgid "7" +msgstr "" + +#: Settings.ui.h:78 +msgid "8" +msgstr "" + +#: Settings.ui.h:79 +msgid "9" +msgstr "" + +#: Settings.ui.h:80 +msgid "10" +msgstr "" + +#: Settings.ui.h:81 +msgid "11" +msgstr "" + +#: Settings.ui.h:82 +msgid "12" +msgstr "" + +#: Settings.ui.h:83 +msgid "13" +msgstr "" + +#: Settings.ui.h:84 +msgid "14" +msgstr "" + +#: Settings.ui.h:85 +msgid "15" +msgstr "" + +#: Settings.ui.h:86 +msgid "16" +msgstr "" + +#: Settings.ui.h:87 +msgid "17" +msgstr "" + +#: Settings.ui.h:88 +msgid "18" +msgstr "" + +#: Settings.ui.h:89 +msgid "19" +msgstr "" + +#: Settings.ui.h:90 +msgid "20" +msgstr "" + +#: Settings.ui.h:91 +msgid "21" +msgstr "" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Anchura de la vista rápida de ventanas" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Usar opacidad personalizada para el fondo de las vistas rápidas" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "Si está deshabilitado, el fondo de las vistas rápidas tienen la misma opacidad que la del panel" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Botón de apagado y posición de los títulos" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Abajo" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Arriba" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Mostrar los títulos de las ventanas en las vistas rápidas" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Tamaño de letra (px) de los títulos de aplicación (14 por defecto)" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Color de letra de los títulos de aplicación" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Color de letra de los títulos de aplicación" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Habilitar ojeada rápida de ventana" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Al desplazar el ratón sobre una vista rápida de ventana, la ventana es " +"resaltada." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Tiempo para activar el modo de ojeada rápida (ms)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Tiempo de inactividad al desplazar el ratón sobre una vista rápida de " +"ventana para activar el modo de ojeada rápida." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Opacidad del modo de ojeada rápida" + +#: Settings.ui.h:109 +msgid "0" +msgstr "" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "Todas las ventanas excepto la resaltada tienen la misma opacidad fija." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Retraso entre eventos de desplazamiento del ratón (ms)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "Usar este valor para limitra el número de eventos de desplazamiento capturados del ratón" + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Súper" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Súper + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Prefijo de atajo de teclado" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Los atajos serán Súper+Núm. o Súper+Alt+Núm." + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Nunca" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Mostrar temporalmente" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Siempre visible" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Número de aplicación" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Al usar atajos, mostrar momentáneamente el número de aplicación sobre los " +"íconos." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Tiempo de ocultación (ms)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "p.e. q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Atajo para mostrar el número de aplicación por 2 segundos" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Mostrar vista rápida de ventanas al pasar con el ratón" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Mostrar vistas previas cuando la aplicación tiene múltiples instancias" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Fila numérica" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Teclado numérico" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "Ambos" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Usar atajos de teclado para activar aplicaciones" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "Selecciona qué teclas numéricas se usan para activar los atajos de teclado" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Icono actual de Mostrar aplicaciones" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Seleccionar un icono Mostrar aplicaciones" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Icono Mostrar aplicaciones personalizado" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "Tamaño de relleno (px) de Mostrar aplicaciones" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Mostrar escritorio al colocar el botón Mostrar Escritorio" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Tiempo antes de ocultar el panel (ms)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Tiempo de ocultación (ms)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "La opacidad del fondo del panel está afectada por" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Cambiar la opacidad cuando una ventana se aproxima (px)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Cambiar la opacidad a (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Duración de las animaciones (ms)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Posición del panel en la pantalla" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "A la izquierda" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "A la derecha" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Posición de la barra de tareas" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Posición del reloj" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "Mostrar el panel principal en" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Mostrar los paneles en todos los espacios de trabajo" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Ocultación inteligente del panel" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "Ocultar y mostrar el panel de acuerdo con las preferencias" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Posición" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Tamaño del panel\n" +"(48 por defecto)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Margen de los íconos\n" +"(8 por defecto)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Relleno de los íconos\n" +"(4 por defecto)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Posición de los indicadores de ejecución" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Estilo de los indicadores de ejecución (aplicación enfocada)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Puntos" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Cuadrados" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Guiones" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Segmentado" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Sólido" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Estilo de los indicadores de ejecución (aplicación no enfocada)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "Cambiar el color de fondo del tema del panel " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "Cambiar la opacidad de fondo del tema del panel" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Opacidad del fondo del panel (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Opacidad dinámica del fondo" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "Cambiar la opacidad cuando una ventana se aproxima al panel" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "Cambiar el gradiente del tema del panel" + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Color y opacidad del gradiente superior (%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Color y opacidad del gradiente inferior (%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Estilo" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Mostrar aplicaciones favoritas" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Mostrar aplicaciones en ejecución" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Mostrar el icono Aplicaciones" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Animar Mostrar Aplicaciones" + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Mostrar el botón Actividades" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Mostrar el botón Escritorio" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Mostrar el botón Menú de Aplicación" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Barra superior > Mostrar menú de aplicación habilitado en " +"Herramienta de retoques." + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Mostrar vista rápida de ventanas al pasar con el ratón" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Mostrar barra de herramientas al pasar con el ratón" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Aislar los espacios de trabajo" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Desagrupar aplicaciones" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Comportamiento" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Comportamiento al pulsar el ícono de una aplicación en ejecución" + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "Acción de pulsación" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Alternar ventanas" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Acción del panel de desplazamiento" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Comportamiento cuando el ratón de desplaza en el panel" + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Acción al desplazar iconos" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Comportamiento cuando el ratón se desplaza sobre el icono de una aplicación" + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "No hacer nada" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Cambiar espacio de trabajo" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Alternar entre ventanas" + +#: Settings.ui.h:205 +msgid "Change volume" +msgstr "Cambiar el volumen" + +#: Settings.ui.h:206 +msgid "Same as panel" +msgstr "La misma que el panel" + +#: Settings.ui.h:207 +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:208 +msgid "Use hotkeys to activate apps" +msgstr "Usar atajos de teclado para activar aplicaciones" + +#: Settings.ui.h:209 +msgid "Action" +msgstr "Acción" + +#: Settings.ui.h:210 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Tamaño de fuente en la bandeja del sistema\n" +"(0 = predeterminado)" + +#: Settings.ui.h:212 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Tamaño de fuente en la zona izquierda\n" +"(0 = predeterminado)" + +#: Settings.ui.h:214 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Separación en la bandeja del sistema\n" +"(-1 = predeterminado)" + +#: Settings.ui.h:216 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Separación de los íconos de estado\n" +"(-1 = predeterminado)" + +#: Settings.ui.h:218 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Separación en la zona izquierda\n" +"(-1 = predeterminado)" + +#: Settings.ui.h:220 +msgid "Animate switching applications" +msgstr "Animar al cambiar de aplicación" + +#: Settings.ui.h:221 +msgid "Animate launching new windows" +msgstr "Animar al abrir nuevas ventanas" + +#: Settings.ui.h:222 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Conservar el dash original de gnome-shell (vista principal)" + +#: Settings.ui.h:223 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "Activar los botones del menú del panel (p.e. menú de fecha) sólo al pulsar" + +#: Settings.ui.h:224 +msgid "Force Activities hot corner on primary monitor" +msgstr "Forzar las actividades de la esquina 'caliente' en el monitor principal" + +#: Settings.ui.h:225 +msgid "App icon secondary (right-click) menu" +msgstr "Menú secundario (click derecho) de aplicación" + +#: Settings.ui.h:227 +msgid "Fine-Tune" +msgstr "Retoques" + +#: Settings.ui.h:228 +msgid "version: " +msgstr "versión: " + +#: Settings.ui.h:229 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:230 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "Usar los botones de abajo para crear el fichero de configuración con tus preferencias" +"actuales para poder ser importadas de otra máquina." + +#: Settings.ui.h:231 +msgid "Export and import settings" +msgstr "Exportar e importar configuración" + +#: Settings.ui.h:232 +msgid "Export to file" +msgstr "Exportar a un fichero" + +#: Settings.ui.h:233 +msgid "Import from file" +msgstr "Importar de un fichero" + +#: Settings.ui.h:234 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "Esto te permite actualizar la extensión directamente del repositorio GitHub" + +#: Settings.ui.h:235 +msgid "Updates" +msgstr "Actualizaciones" + +#: Settings.ui.h:236 +msgid "Periodically check for updates" +msgstr "Comprobar periódicamente actualizaciones" + +#: Settings.ui.h:237 +msgid "Check now" +msgstr "Comprobar ahora" + +#: Settings.ui.h:238 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"¡Sé consciente de que estas versiones " +"oficiales de 'Dash to Panel' podrían no estar todavía revisadas en extensions.gnome.org!" +" Leer más" + +#: Settings.ui.h:239 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Este programa viene SIN NINGUNA GARANTÍA.\n" +"Consulte la Licencia Pública General de GNU, versión 2 o posterior para obtener " +"más detalles." + +#: Settings.ui.h:241 +msgid "About" +msgstr "Acerca de" + +#~ msgid "Highlight color" +#~ msgstr "Color de resaltado" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Tiempo para cerrar la vista rápida (ms)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Si el valor es muy chico, la ventana de vista rápida parecerá cerrarse " +#~ "muy rápidamente al intentar usar el menú. Si el valor es muy grande, la " +#~ "vista rápida no desaparecerá al ir a un ícono adyacente." + +#~ msgid "Middle click to close window" +#~ msgstr "Click central para cerrar ventana" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Ancho de las vistas rápidas de ventanas (px)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Altura de las vistas rápidas de ventanas (px)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Margen de las vistas rápidas de ventanas (px)" + +#~ msgid "Natural" +#~ msgstr "Natural" + +#~ msgid "Left side of panel" +#~ msgstr "Lado izquierdo del panel" + +#~ msgid "Centered in content" +#~ msgstr "Centrado en el contenido" + +#~ msgid "Github" +#~ msgstr "Github" + +msgid "Weekday" +msgstr "Día de la semana" + +msgid "Date" +msgstr "Fecha" + +msgid "Seconds" +msgstr "Segundos" diff --git a/po/et.po b/po/et.po new file mode 100644 index 0000000..bfd6b14 --- /dev/null +++ b/po/et.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: et\n" + +msgid "System Monitor" +msgstr "Süsteemijälgija" + +msgid "Files" +msgstr "Failid" + +msgid "Settings" +msgstr "Sätted" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..8ceaf5d --- /dev/null +++ b/po/eu.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: eu\n" + +msgid "System Monitor" +msgstr "Sistemaren monitorea" + +msgid "Files" +msgstr "Fitxategiak" + +msgid "Settings" +msgstr "Ezarpenak" diff --git a/po/fa.po b/po/fa.po new file mode 100644 index 0000000..80c0a80 --- /dev/null +++ b/po/fa.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: fa\n" + +msgid "System Monitor" +msgstr "پایشگر سامانه" + +msgid "Files" +msgstr "پرونده‌ها" + +msgid "Settings" +msgstr "تنظیمات" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..45f5c84 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: fi\n" + +msgid "System Monitor" +msgstr "Järjestelmän valvonta" + +msgid "Files" +msgstr "Tiedostot" + +msgid "Settings" +msgstr "Asetukset" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..2f76f1a --- /dev/null +++ b/po/fr.po @@ -0,0 +1,1426 @@ +# 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 , YEAR. +# Laurent Tréguier , 2019. +# Charles Gagnon , 2019-2020. +# +msgid "" +msgstr "" +"Project-Id-Version: unnamed project\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-07-12 07:39-0400\n" +"PO-Revision-Date: 2020-07-12 08:23-0400\n" +"Last-Translator: Charles Gagnon \n" +"Language-Team: French - Canada <>\n" +"Language: fr_CA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Gtranslator 3.36.0\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: prefs.js:206 +msgid "Show Desktop button height (px)" +msgstr "Hauteur du bouton Afficher le Bureau (px)" + +#: prefs.js:206 +msgid "Show Desktop button width (px)" +msgstr "Longueur du bouton Afficher le Bureau (px)" + +#: prefs.js:218 +msgid "Unavailable when gnome-shell top panel is present" +msgstr "Indisponible quand le panneau de gnome-shell est présent" + +#: prefs.js:293 +msgid "Show Applications button" +msgstr "Bouton Afficher les Applications" + +#: prefs.js:294 +msgid "Activities button" +msgstr "Bouton Activités" + +#: prefs.js:295 +msgid "Taskbar" +msgstr "Barre des tâches" + +#: prefs.js:296 +msgid "Date menu" +msgstr "Horloge" + +#: prefs.js:297 +msgid "System menu" +msgstr "Menu système" + +#: prefs.js:298 +msgid "Left box" +msgstr "Zone gauche" + +#: prefs.js:299 +msgid "Center box" +msgstr "Zone centre" + +#: prefs.js:300 +msgid "Right box" +msgstr "Zone droite" + +#: prefs.js:301 +msgid "Desktop button" +msgstr "Bouton Afficher le Bureau" + +#: prefs.js:307 +msgid "Move up" +msgstr "Déplacer vers le haut" + +#: prefs.js:309 +msgid "Move down" +msgstr "Déplacer vers le bas" + +#: prefs.js:311 +msgid "Visible" +msgstr "Visible" + +#: prefs.js:312 +msgid "Select element position" +msgstr "Sélectionner la position de l'élément" + +#: prefs.js:323 +msgid "Stacked to top" +msgstr "Empilé en haut" + +#: prefs.js:323 +msgid "Stacked to left" +msgstr "Empilé à gauche" + +#: prefs.js:324 +msgid "Stacked to bottom" +msgstr "Empilé en bas" + +#: prefs.js:324 +msgid "Stacked to right" +msgstr "Empilé à droite" + +#: prefs.js:325 +msgid "Centered" +msgstr "Centré" + +#: prefs.js:326 +msgid "Monitor Center" +msgstr "Centre de l'écran " + +#: prefs.js:345 +msgid "More options" +msgstr "Plus d'options" + +#: prefs.js:369 +msgid "Show Applications options" +msgstr "Options du bouton Afficher les Applications" + +#: prefs.js:376 prefs.js:433 prefs.js:576 prefs.js:894 prefs.js:1019 +#: prefs.js:1146 prefs.js:1405 prefs.js:1500 prefs.js:1565 prefs.js:1608 +#: prefs.js:1705 prefs.js:1739 prefs.js:1781 +msgid "Reset to defaults" +msgstr "Restaurer paramètres" + +#: prefs.js:426 +msgid "Show Desktop options" +msgstr "Options du bouton Afficher le Bureau" + +#: prefs.js:569 +msgid "Running Indicator Options" +msgstr "Options de l'indicateur d'activité" + +#: prefs.js:732 +msgid "Primary monitor" +msgstr "Écran principal" + +#: prefs.js:732 +msgid "Monitor " +msgstr "Écran " + +#: prefs.js:887 +msgid "Dynamic opacity options" +msgstr "Options d'opacité dynamique" + +#: prefs.js:1012 +msgid "Intellihide options" +msgstr "Options du masquage intelligent" + +#: prefs.js:1139 +msgid "Window preview options" +msgstr "Options de la prévisualisation" + +#: prefs.js:1398 +msgid "Ungrouped application options" +msgstr "Options des applications dégroupées" + +#: prefs.js:1493 +msgid "Customize middle-click behavior" +msgstr "Modifier l'action du clic de la molette" + +#: prefs.js:1558 +msgid "Customize panel scroll behavior" +msgstr "Modifier l'action du défilement de la souris sur le panneau" + +#: prefs.js:1601 +msgid "Customize icon scroll behavior" +msgstr "Modifier l'action du défilement de la souris sur une application" + +#: prefs.js:1698 +msgid "Advanced hotkeys options" +msgstr "Raccourcis avancés" + +#: prefs.js:1732 +msgid "Secondary Menu Options" +msgstr "Options du menu secondaire" + +#: prefs.js:1774 Settings.ui.h:226 +msgid "Advanced Options" +msgstr "Options avancées" + +#: prefs.js:1877 +msgid "Export settings" +msgstr "Exporter les paramètres" + +#: prefs.js:1894 +msgid "Import settings" +msgstr "Importer des paramètres" + +#: appIcons.js:1431 +msgid "Show Details" +msgstr "Afficher les détails" + +#: appIcons.js:1449 +msgid "New Window" +msgstr "Nouvelle fenêtre" + +#: appIcons.js:1449 appIcons.js:1509 appIcons.js:1511 Settings.ui.h:10 +msgid "Quit" +msgstr "Quitter" + +#: appIcons.js:1511 +msgid "Windows" +msgstr "Fenêtres" + +#: appIcons.js:1858 +msgid "Unlock taskbar" +msgstr "Déverrouiller la barre des tâches" + +#: appIcons.js:1858 +msgid "Lock taskbar" +msgstr "Verrouiller la barre des tâches" + +#: appIcons.js:1863 +msgid "Taskbar Settings" +msgstr "Paramètres de la barre des tâches" + +#: appIcons.js:1876 +msgid "Restore Windows" +msgstr "Restaurer les fenêtres" + +#: appIcons.js:1876 +msgid "Show Desktop" +msgstr "Afficher le bureau" + +#: update.js:48 +msgid "Unavailable when installed from extensions.gnome.org" +msgstr "Indisponible lorsqu'installé depuis extensions.gnome.org" + +#: update.js:62 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "La version %s (%s) est disponible" + +#: update.js:63 +msgid "Details" +msgstr "Détails" + +#: update.js:64 +msgid "Update" +msgstr "Mettre à jour" + +#: update.js:67 +msgid "Already up to date" +msgstr "Déjà à jour" + +#: update.js:75 +msgid "Error: " +msgstr "Erreur: " + +#: update.js:168 +msgid "Update successful, please log out/in" +msgstr "" +"Mise à jour complétée avec succès, veuillez fermer/ouvrir votre session" + +#: update.js:169 +msgid "Log out" +msgstr "Fermer la session" + +#: update.js:173 +msgid "Update successful, please restart GNOME Shell" +msgstr "Mise à jour complétée avec succès, veuillez redémarrer GNOME Shell" + +#: update.js:174 +msgid "Restart GNOME Shell" +msgstr "Redémarrer GNOME Shell" + +#: update.js:174 +msgid "Restarting GNOME Shell..." +msgstr "Redémarrage de GNOME Shell..." + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Rien pour l'instant !" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Quand minimiser est sélectionné, un double-clic réduit toutes les fenêtres " +"de l'application." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Action Maj+Clic" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Montrer les fenêtres" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Réduire la fenêtre" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Lancer une nouvelle instance" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Cycler sur les fenêtres" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Cycler sur les fenêtres + réduire" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Prévisualisation simple / multiple" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Comportement du clic molette." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Action clic molette" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportement pour Maj+Clic molette." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Action de Maj+Clic molette" + +#: Settings.ui.h:15 +msgid "Integrate AppMenu items" +msgstr "Intégrer les actions du Menu d'applications" + +#: Settings.ui.h:16 +msgid "Show Details menu item" +msgstr "Menu Afficher les détails" + +#: Settings.ui.h:17 +msgid "Highlight focused application" +msgstr "Surligner l'application active" + +#: Settings.ui.h:18 +msgid "Icon dominant color" +msgstr "Couleur d'icône dominante" + +#: Settings.ui.h:19 +msgid "Custom color" +msgstr "Couleur personnalisée" + +#: Settings.ui.h:20 +msgid "Highlight opacity" +msgstr "Opacité du surlignement" + +#: Settings.ui.h:21 +msgid "Indicator size (px)" +msgstr "Taille de l'indicateur (px)" + +#: Settings.ui.h:22 +msgid "Indicator color - Icon Dominant" +msgstr "Couleur de l'indicateur - Icône dominante" + +#: Settings.ui.h:23 +msgid "Indicator color - Override Theme" +msgstr "Couleur de l'indicateur - Remplacer le thème" + +#: Settings.ui.h:24 +msgid "1 window open (or ungrouped)" +msgstr "1 fenêtre ouverte (ou dégroupée)" + +#: Settings.ui.h:25 +msgid "Apply to all" +msgstr "Appliquer à tout" + +#: Settings.ui.h:26 +msgid "2 windows open" +msgstr "2 fenêtres ouvertes" + +#: Settings.ui.h:27 +msgid "3 windows open" +msgstr "3 fenêtres ouvertes" + +#: Settings.ui.h:28 +msgid "4+ windows open" +msgstr "4+ fenêtres ouvertes" + +#: Settings.ui.h:29 +msgid "Use different for unfocused" +msgstr "Style différent pour les applications inactives" + +#: Settings.ui.h:30 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Taille (px) du texte des titres d'application (défaut: 14)" + +#: Settings.ui.h:31 +msgid "Font weight of application titles" +msgstr "Épaisseur de la police du texte des titres d'application" + +#: Settings.ui.h:32 +msgid "inherit from theme" +msgstr "hériter du thème" + +#: Settings.ui.h:33 +msgid "normal" +msgstr "normale" + +#: Settings.ui.h:34 +msgid "lighter" +msgstr "plus légere" + +#: Settings.ui.h:35 +msgid "bold" +msgstr "grasse" + +#: Settings.ui.h:36 +msgid "bolder" +msgstr "plus grasse" + +#: Settings.ui.h:37 +msgid "Font color of the application titles" +msgstr "Couleur du texte des titres d'application" + +#: Settings.ui.h:38 +msgid "Font color of the minimized application titles" +msgstr "Couleur du texte des titres d'application de fenêtres minimisées" + +#: Settings.ui.h:39 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Longueur maximum (px) des titres d'application (défaut: 160)" + +#: Settings.ui.h:40 +msgid "Use a fixed width for the application titles" +msgstr "Utiliser une largeur fixe pour les titres d'application" + +#: Settings.ui.h:41 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Les titres d'application ont tous la même longueur, même si leur texte est " +"plus petit que la taille maximum. La valeur maximale de longueur est " +"utilisée comme longueur fixe." + +#: Settings.ui.h:42 +msgid "Display running indicators on unfocused applications" +msgstr "Afficher des indicateurs sur les applications an arrière-plan" + +#: Settings.ui.h:43 +msgid "Use the favorite icons as application launchers" +msgstr "Utiliser les applications favorites comme lanceurs" + +#: Settings.ui.h:44 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Ne cacher le panneau que lorsqu'il est au-dessus d'une fenêtre " + +#: Settings.ui.h:45 +msgid "The panel hides from" +msgstr "Le panneau se cache de" + +#: Settings.ui.h:46 +msgid "All windows" +msgstr "Toutes les fenêtres" + +#: Settings.ui.h:47 +msgid "Focused windows" +msgstr "Fenêtres au premier plan" + +#: Settings.ui.h:48 +msgid "Maximized windows" +msgstr "Fenêtres maximisées" + +#: Settings.ui.h:49 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Requérir une pression sur le bord de l'écran pour afficher le panneau" + +#: Settings.ui.h:50 +msgid "Required pressure threshold (px)" +msgstr "Seuil d'activation (px)" + +#: Settings.ui.h:51 +msgid "Required pressure timeout (ms)" +msgstr "Délai d'activation (ms)" + +#: Settings.ui.h:52 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Permettre au panneau d'être affiché en mode plein écran" + +#: Settings.ui.h:53 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Ne cacher que les panneaux secondaires (multi-moniteurs)" + +#: Settings.ui.h:54 +msgid "e.g. i" +msgstr "e.g. i" + +#: Settings.ui.h:55 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Raccourci clavier pour révéler et maintenir le panneau" + +#: Settings.ui.h:56 +msgid "Syntax: , , , " +msgstr "Syntaxe: , , , " + +#: Settings.ui.h:57 +msgid "Hide and reveal animation duration (ms)" +msgstr "Durée des animations d'affichage (ms)" + +#: Settings.ui.h:58 +msgid "Delay before hiding the panel (ms)" +msgstr "Délai avant le masquage du panneau (ms)" + +#: Settings.ui.h:59 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Délai avant l'activation du masquage intelligent (ms)" + +#: Settings.ui.h:60 +msgid "Time (ms) before showing (400 is default)" +msgstr "Temps (ms) avant d'afficher (400 par défaut)" + +#: Settings.ui.h:61 +msgid "Animation time (ms)" +msgstr "Durée d'animation (ms)" + +#: Settings.ui.h:62 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Temps (ms) avant de cacher (100 par défaut)" + +#: Settings.ui.h:63 +msgid "Immediate on application icon click" +msgstr "Immédiat au clic d'application" + +#: Settings.ui.h:64 +msgid "Middle click on the preview to close the window" +msgstr "Cliquez avec la molette sur la prévisualisation pour fermer la fenêtre" + +#: Settings.ui.h:65 +msgid "Window previews preferred size (px)" +msgstr "Taille des prévisualisations de fenêtres (px)" + +#: Settings.ui.h:66 +msgid "Window previews aspect ratio Y (height)" +msgstr "Ratio d'aspect des prévisualisations (hauteur)" + +#: Settings.ui.h:67 +msgid "Window previews padding (px)" +msgstr "Marge intérieure des prévisualisations (px)" + +#: Settings.ui.h:68 +msgid "1" +msgstr "1" + +#: Settings.ui.h:69 +msgid "2" +msgstr "2" + +#: Settings.ui.h:70 +msgid "3" +msgstr "3" + +#: Settings.ui.h:71 +msgid "4" +msgstr "4" + +#: Settings.ui.h:72 +msgid "5" +msgstr "5" + +#: Settings.ui.h:73 +msgid "6" +msgstr "6" + +#: Settings.ui.h:74 +msgid "7" +msgstr "7" + +#: Settings.ui.h:75 +msgid "8" +msgstr "8" + +#: Settings.ui.h:76 +msgid "9" +msgstr "9" + +#: Settings.ui.h:77 +msgid "10" +msgstr "10" + +#: Settings.ui.h:78 +msgid "11" +msgstr "11" + +#: Settings.ui.h:79 +msgid "12" +msgstr "12" + +#: Settings.ui.h:80 +msgid "13" +msgstr "13" + +#: Settings.ui.h:81 +msgid "14" +msgstr "14" + +#: Settings.ui.h:82 +msgid "15" +msgstr "15" + +#: Settings.ui.h:83 +msgid "16" +msgstr "16" + +#: Settings.ui.h:84 +msgid "17" +msgstr "17" + +#: Settings.ui.h:85 +msgid "18" +msgstr "18" + +#: Settings.ui.h:86 +msgid "19" +msgstr "19" + +#: Settings.ui.h:87 +msgid "20" +msgstr "200" + +#: Settings.ui.h:88 +msgid "21" +msgstr "21" + +#: Settings.ui.h:89 +msgid "Fixed" +msgstr "Fixé" + +#: Settings.ui.h:90 +msgid "Window previews aspect ratio X (width)" +msgstr "Ratio d'aspect des prévisualisations (largeur)" + +#: Settings.ui.h:91 +msgid "Use custom opacity for the previews background" +msgstr "Opacité personnalisée pour l'arrière plan des prévisualisations" + +#: Settings.ui.h:92 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "Si désactivé, les prévisualisations ont la même opacité que le panneau" + +#: Settings.ui.h:93 +msgid "Close button and header position" +msgstr "Bouton de fermeture et position de l'en-tête" + +#: Settings.ui.h:94 +msgid "Bottom" +msgstr "Bas" + +#: Settings.ui.h:95 +msgid "Top" +msgstr "Haut" + +#: Settings.ui.h:96 +msgid "Display window preview headers" +msgstr "Afficher le titre de la fenêtre dans la prévis." + +#: Settings.ui.h:97 +msgid "Font size (px) of the preview titles" +msgstr "Taille (px) du texte des prévisualisations" + +#: Settings.ui.h:98 +msgid "Font weight of the preview titles" +msgstr "Épaisseur du texte des titres de prévisualisation" + +#: Settings.ui.h:99 +msgid "Font color of the preview titles" +msgstr "Couleur du texte des titres de prévisualisation" + +#: Settings.ui.h:100 +msgid "Enable window peeking" +msgstr "Activer la vue de fenêtre" + +#: Settings.ui.h:101 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Le survol sur la prévisualisation de la fenêtre, pendant un certain temps, " +"la met en avant." + +#: Settings.ui.h:102 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Temps d'attente avant activation de la vue fenêtre" + +#: Settings.ui.h:103 +msgid "50" +msgstr "50" + +#: Settings.ui.h:104 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Temps d'inactivité pendant le survol de la prévisualisation d'une fenêtre " +"nécessaire pour activer la vue de la fenêtre." + +#: Settings.ui.h:105 +msgid "Window peeking mode opacity" +msgstr "Opacité de la vue de fenêtre" + +#: Settings.ui.h:106 +msgid "0" +msgstr "0" + +#: Settings.ui.h:107 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"Toutes les fenêtres, mis à part celle prévisualisée, ont leur opacité mise à " +"la même valeur." + +#: Settings.ui.h:108 +msgid "Delay between mouse scroll events (ms)" +msgstr "Délai entre les évènements de défilement de la souris (ms)" + +#: Settings.ui.h:109 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "" +"Utiliser cette valeur pour limiter le nombre d'évènements de défilement de " +"la souris (ms)" + +#: Settings.ui.h:110 +msgid "Show popup when changing workspace" +msgstr "Afficher l'indicateur de changement d'espace de travail" + +#: Settings.ui.h:111 +msgid "This affects workspace popup when scrolling on the panel only." +msgstr "" +"Affecte uniquement l'indicateur de changement d'espace de travail au " +"défilement de la souris sur le panneau." + +#: Settings.ui.h:112 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:113 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:114 +msgid "Hotkeys prefix" +msgstr "Préfixe raccourcis" + +#: Settings.ui.h:115 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Les raccourcis seront soit Super+Numéro soit Super+Alt+Numéro" + +#: Settings.ui.h:116 +msgid "Never" +msgstr "Jamais" + +#: Settings.ui.h:117 +msgid "Show temporarily" +msgstr "Afficher temporairement" + +#: Settings.ui.h:118 +msgid "Always visible" +msgstr "Toujours visible" + +#: Settings.ui.h:119 +msgid "Number overlay" +msgstr "Superposition des nombres" + +#: Settings.ui.h:120 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Afficher temporairement les numéros des applications par dessus les icônes " +"lors de l'utilisation des raccourcis." + +#: Settings.ui.h:121 +msgid "Hide timeout (ms)" +msgstr "Délai avant de cacher (ms)" + +#: Settings.ui.h:122 +msgid "e.g. q" +msgstr "e.g. q" + +#: Settings.ui.h:123 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Raccourci pour afficher la superposition pendant 2 secondes" + +#: Settings.ui.h:124 +msgid "Show window previews on hotkey" +msgstr "Afficher les aperçus des fenêtres lors de l'utilisation d'un raccourci" + +#: Settings.ui.h:125 +msgid "Show previews when the application have multiple instances" +msgstr "" +"Afficher les aperçus lorsque les applications possèdent plusieurs fenêtres" + +#: Settings.ui.h:126 +msgid "Number row" +msgstr "Rangée des chiffres" + +#: Settings.ui.h:127 +msgid "Numeric keypad" +msgstr "Pavé numérique" + +#: Settings.ui.h:128 +msgid "Both" +msgstr "Les deux" + +#: Settings.ui.h:129 +msgid "Hotkeys are activated with" +msgstr "Les raccourcis sont activés par" + +#: Settings.ui.h:130 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "" +"Sélectionner quelles touches numériques sont utilisées pour activer les " +"raccourcis" + +#: Settings.ui.h:131 +msgid "Current Show Applications icon" +msgstr "Icône Afficher les Applications actuelle" + +#: Settings.ui.h:132 +msgid "Select a Show Applications image icon" +msgstr "Sélectionner une icône Afficher les Applications" + +#: Settings.ui.h:133 +msgid "Custom Show Applications image icon" +msgstr "Icône d'affichage des applications personnalisée" + +#: Settings.ui.h:134 +msgid "Show Applications icon side padding (px)" +msgstr "Marge interne du bouton \"Afficher les Applications\"" + +#: Settings.ui.h:135 +msgid "Override escape key and return to desktop" +msgstr "" +"Remplacer l'action de la touche d'échappement et retourner sur le bureau" + +#: Settings.ui.h:136 +msgid "Animate Show Applications." +msgstr "Animer Afficher les applications." + +#: Settings.ui.h:137 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Révéler le bureau lors du survol du bouton \"Afficher le Bureau\"" + +#: Settings.ui.h:138 +msgid "Delay before revealing the desktop (ms)" +msgstr "Délai avant affichage du bureau (ms)" + +#: Settings.ui.h:139 +msgid "Fade duration (ms)" +msgstr "Durée du fondu (ms)" + +#: Settings.ui.h:140 +msgid "The panel background opacity is affected by" +msgstr "L'opacité de l'arrière-plan du panneau est affectée par" + +#: Settings.ui.h:141 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Changer l'opacité lorsqu'une fenêtre est plus proche que (px)" + +#: Settings.ui.h:143 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Changer l'opacité à (%)" + +#: Settings.ui.h:144 +msgid "Opacity change animation duration (ms)" +msgstr "Durée de l'animation de changement d'opacité (ms)" + +#: Settings.ui.h:145 +msgid "Display the main panel on" +msgstr "Afficher le panneau principal sur" + +#: Settings.ui.h:146 +msgid "Display panels on all monitors" +msgstr "Afficher le panneau principal sur tous les écrans" + +#: Settings.ui.h:147 +msgid "Panel Intellihide" +msgstr "Masquage intelligent du panneau" + +#: Settings.ui.h:148 +msgid "Hide and reveal the panel according to preferences" +msgstr "Afficher/Cacher le panneau selon les préférences" + +#: Settings.ui.h:149 +msgid "Order and positions on monitor" +msgstr "Ordre et positions de l'écran" + +#: Settings.ui.h:150 +msgid "Apply changes to all monitors" +msgstr "Appliquer les changements sur tous les écrans" + +#: Settings.ui.h:151 +msgid "Panel screen position" +msgstr "Position du panneau" + +#: Settings.ui.h:152 +msgid "Left" +msgstr "Gauche" + +#: Settings.ui.h:153 +msgid "Right" +msgstr "Droit" + +#: Settings.ui.h:154 +msgid "Position" +msgstr "Position" + +#: Settings.ui.h:155 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Taille du panneau\n" +"(la valeur par défaut est 48)" + +#: Settings.ui.h:157 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Marge ext. de l'icône d'application\n" +"(la valeur par défaut est 8)" + +#: Settings.ui.h:159 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Marge int. de l'icône d'application\n" +"(la valeur par défaut est 4)" + +#: Settings.ui.h:161 +msgid "Running indicator position" +msgstr "Position de l'indicateur d'activité" + +#: Settings.ui.h:162 +msgid "Running indicator style (Focused app)" +msgstr "Style de l'indicateur d'activité (Application active)" + +#: Settings.ui.h:163 +msgid "Dots" +msgstr "Points" + +#: Settings.ui.h:164 +msgid "Squares" +msgstr "Carrés" + +#: Settings.ui.h:165 +msgid "Dashes" +msgstr "Traits" + +#: Settings.ui.h:166 +msgid "Segmented" +msgstr "Segmenté" + +#: Settings.ui.h:167 +msgid "Solid" +msgstr "Solide" + +#: Settings.ui.h:168 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:169 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:170 +msgid "Running indicator style (Unfocused apps)" +msgstr "Style de l'indicateur d'activité (Applications inactives)" + +#: Settings.ui.h:171 +msgid "Override panel theme background color " +msgstr "Remplacer la couleur de fond du thème du panneau " + +#: Settings.ui.h:172 +msgid "Override panel theme background opacity" +msgstr "Remplacer l'opacité du thème du panneau" + +#: Settings.ui.h:174 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Opacité du fond du panneau" + +#: Settings.ui.h:175 +msgid "Dynamic background opacity" +msgstr "Opacité de fond dynamique" + +#: Settings.ui.h:176 +msgid "Change opacity when a window gets close to the panel" +msgstr "Changer l'opacité lorsqu'une fenêtre s'approche du panneau" + +#: Settings.ui.h:177 +msgid "Override panel theme gradient " +msgstr "Remplacer le gradient du thème du panneau " + +#: Settings.ui.h:179 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Couleur et opacité (%) du haut du gradient" + +#: Settings.ui.h:181 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Couleur et opacité (%) du bas du gradient" + +#: Settings.ui.h:182 +msgid "Style" +msgstr "Style" + +#: Settings.ui.h:183 +msgid "Show favorite applications" +msgstr "Afficher les applications favorites" + +#: Settings.ui.h:184 +msgid "Show running applications" +msgstr "Afficher les applications ouvertes" + +#: Settings.ui.h:185 +msgid "Show favorite applications on secondary panels" +msgstr "Afficher les applications favorites sur les panneaux secondaires" + +#: Settings.ui.h:186 +msgid "Show AppMenu button" +msgstr "Afficher le bouton Menu d'Applications" + +#: Settings.ui.h:187 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Barre supérieure > Afficher le menu de l'application doit être activé dans " +"Ajustements" + +#: Settings.ui.h:188 +msgid "Show window previews on hover" +msgstr "Afficher les aperçus des fenêtres lors du survol" + +#: Settings.ui.h:189 +msgid "Show tooltip on hover" +msgstr "Afficher les bulles d'info. lors du survol" + +#: Settings.ui.h:190 +msgid "Isolate Workspaces" +msgstr "Isoler les espaces de travail" + +#: Settings.ui.h:191 +msgid "Isolate monitors" +msgstr "Isoler les écrans" + +#: Settings.ui.h:192 +msgid "Ungroup applications" +msgstr "Dégrouper les applications" + +#: Settings.ui.h:193 +msgid "Behavior" +msgstr "Comportement" + +#: Settings.ui.h:194 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Comportement lors du clic sur l'icône d'une application lancée." + +#: Settings.ui.h:195 +msgid "Click action" +msgstr "Action du clic" + +#: Settings.ui.h:196 +msgid "Toggle windows" +msgstr "Basculer les fenêtres" + +#: Settings.ui.h:197 +msgid "Scroll panel action" +msgstr "Action du défilement de la souris sur le panneau" + +#: Settings.ui.h:198 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Comportement lors du défilement de la souris sur le panneau" + +#: Settings.ui.h:199 +msgid "Scroll icon action" +msgstr "Action du défilement de la souris sur une application" + +#: Settings.ui.h:200 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Comportement lors du défilement de la souris sur une application" + +#: Settings.ui.h:201 +msgid "Do nothing" +msgstr "Ne rien faire" + +#: Settings.ui.h:202 +msgid "Switch workspace" +msgstr "Défiler les espaces de travail" + +#: Settings.ui.h:203 +msgid "Cycle windows" +msgstr "Défiler les fenêtres" + +#: Settings.ui.h:204 +msgid "Change volume" +msgstr "Changer le volume" + +#: Settings.ui.h:205 +msgid "Same as panel" +msgstr "Comme le panneau" + +#: Settings.ui.h:206 +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 lancer les applications. Maj et " +"Ctrl peuvent aussi être utilisés." + +#: Settings.ui.h:207 +msgid "Use hotkeys to activate apps" +msgstr "Utiliser des raccourcis pour lancer les applications" + +#: Settings.ui.h:208 +msgid "Action" +msgstr "Action" + +#: Settings.ui.h:209 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Taille de la police\n" +"(0 = par défaut)" + +#: Settings.ui.h:211 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Taille de la police de la zone de gauche\n" +"(0 = par défaut)" + +#: Settings.ui.h:213 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Marge des éléments de la barre d'état\n" +"(-1 = par défaut)" + +#: Settings.ui.h:215 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Marge des icônes de statut\n" +"(-1 = par défaut)" + +#: Settings.ui.h:217 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Marge de la zone de gauche\n" +"(-1 = par défaut)" + +#: Settings.ui.h:219 +msgid "Animate switching applications" +msgstr "Animer le changement d'application" + +#: Settings.ui.h:220 +msgid "Animate launching new windows" +msgstr "Animer le lancement de nouvelles fenêtres" + +#: Settings.ui.h:221 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Garder le lanceur d'origine de gnome-shell (activités)" + +#: Settings.ui.h:222 +msgid "Force Activities hot corner on primary monitor" +msgstr "Forcer le coin actif des Activités sur l'écran principal" + +#: Settings.ui.h:223 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "Activer les menus du panneau seulement au clic" + +#: Settings.ui.h:224 +msgid "Keep original gnome-shell top panel" +msgstr "Garder le panneau d'origine de gnome-shell" + +#: Settings.ui.h:225 +msgid "App icon secondary (right-click) menu" +msgstr "Menu secondaire de l'application (clic droit)" + +#: Settings.ui.h:227 +msgid "Fine-Tune" +msgstr "Personnalisation" + +#: Settings.ui.h:228 +msgid "version: " +msgstr "version: " + +#: Settings.ui.h:229 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:230 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Utiliser les boutons ci-dessous pour créer un fichier de paramètres à partir " +"de vos préférences actuelles qui pourra être importé sur une autre machine." + +#: Settings.ui.h:231 +msgid "Export and import settings" +msgstr "Import et export de paramètres" + +#: Settings.ui.h:232 +msgid "Export to file" +msgstr "Exporter vers un fichier" + +#: Settings.ui.h:233 +msgid "Import from file" +msgstr "Importer à partir d'un fichier" + +#: Settings.ui.h:234 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "" +"Ceci vous permet de mettre l'extension à jour directement depuis GitHub" + +#: Settings.ui.h:235 +msgid "Updates" +msgstr "Mises à jour" + +#: Settings.ui.h:236 +msgid "Periodically check for updates" +msgstr "Vérifier périodiquement les mises à jour" + +#: Settings.ui.h:237 +msgid "Check now" +msgstr "Vérifier maintenant" + +#: Settings.ui.h:238 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Soyez avisé, ces versions " +"officielles de Dash to Panel n'ont peut-être pas encore été approuvées sur " +"extensions.gnome.org! En savoir plus" + +#: Settings.ui.h:239 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Ce programme est fourni SANS AUCUNE GARANTIE.\n" +"Pour plus de détails, visitez la Licence publique générale GNU, version 2 ou " +"ultérieure" + +#: Settings.ui.h:241 +msgid "About" +msgstr "À propos" + +#~ msgid "Top, with plugin icons collapsed to bottom" +#~ msgstr "En haut, et placer les icônes de plugins au bas" + +#~ msgid "Left, with plugin icons collapsed to right" +#~ msgstr "À gauche, et placer les icônes de plugins sur la droite" + +#~ msgid "Top, with fixed center plugin icons" +#~ msgstr "En haut, et fixer les icônes de plugins au centre" + +#~ msgid "Left, with fixed center plugin icons" +#~ msgstr "À gauche, et fixer les icônes de plugins au centre" + +#~ msgid "Top, with floating center plugin icons" +#~ msgstr "En haut, et laisser flotter les icônes de plugins au centre" + +#~ msgid "Left, with floating center plugin icons" +#~ msgstr "À gauche, et laisser flotter les icônes de plugins au centre" + +#~ msgid "Center, fixed in middle of monitor" +#~ msgstr "Centrer, et fixer au milieu de l'écran" + +#~ msgid "Center, floating between top and bottom elements" +#~ msgstr "Centrer, et laisser flotter entre les éléments du haut et du bas" + +#~ msgid "Center, floating between left and right elements" +#~ msgstr "Centrer, et laisser flotter entre les éléments à gauche et à droite" + +#~ msgid "Top of plugin icons" +#~ msgstr "En haut des icônes de plugins" + +#~ msgid "Left of plugin icons" +#~ msgstr "À gauche des icônes de plugins" + +#~ msgid "Bottom of plugin icons" +#~ msgstr "En bas des icônes de plugins" + +#~ msgid "Right of plugin icons" +#~ msgstr "À droite des icônes de plugins" + +#~ msgid "Top of system indicators" +#~ msgstr "En haut du menu système" + +#~ msgid "Left of system indicators" +#~ msgstr "À gauche du menu système" + +#~ msgid "Bottom of system indicators" +#~ msgstr "En bas du menu système" + +#~ msgid "Right of system indicators" +#~ msgstr "À droite du menu système" + +#~ msgid "Left of taskbar" +#~ msgstr "À gauche de la barre des tâches" + +#~ msgid "Bottom of taskbar" +#~ msgstr "En bas de la barre des tâches" + +#~ msgid "Right of taskbar" +#~ msgstr "À droite de la barre des tâches" + +#~ msgid "Multi-monitors options" +#~ msgstr "Options multi-écran" + +#~ msgid "Event logs" +#~ msgstr "Journaux d'évènements" + +#~ msgid "System" +#~ msgstr "Système" + +#~ msgid "Device Management" +#~ msgstr "Gestionnaire de périphériques" + +#~ msgid "Disk Management" +#~ msgstr "Gestionnaire de disques" + +#~ msgid "Terminal" +#~ msgstr "Terminal" + +#~ msgid "Extensions" +#~ msgstr "Extensions" + +#~ msgid "Display favorite applications on all monitors" +#~ msgstr "Afficher les applications favorites sur tous les écrans" + +#~ msgid "Display the clock on all monitors" +#~ msgstr "Afficher l'horloge sur tous les écrans" + +#~ msgid "Display the status menu on all monitors" +#~ msgstr "Afficher le menu système sur tous les écrans" + +#~ msgid "Taskbar position" +#~ msgstr "Position de la barre des tâches" + +#~ msgid "Clock location" +#~ msgstr "Position de l'horloge" + +#~ msgid "Show Applications icon" +#~ msgstr "Afficher l'icône Applications" + +#~ msgid "Highlight color" +#~ msgstr "Couleur de surlignement" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Délai de l'aperçu lorsqu'on quitte l'icône (ms)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Si trop bas, l'aperçu des fenêtres des applications actives peut sembler " +#~ "se fermer trop vite quand on essaie de cliquer sur l'aperçu. Si trop " +#~ "haut, l'aperçu peut rester trop longtemps quand on passe à une icône " +#~ "adjacente." + +#~ msgid "Middle click to close window" +#~ msgstr "Cliquez avec la molette pour fermer la fenêtre" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Largeur des aperçus des fenêtres lors du survol (px)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Hauteur des aperçus des fenêtres lors du survol (px)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Marge des prévisualisations (px)" + +#~ msgid "Natural" +#~ msgstr "Naturelle" + +#~ msgid "Left side of panel" +#~ msgstr "Côté gauche de la barre" + +#~ msgid "Centered in content" +#~ msgstr "Centré sur le contenu" + +#~ msgid "Github" +#~ msgstr "GitHub" + +msgid "Weekday" +msgstr "Jour de semaine" + +msgid "Date" +msgstr "Date" + +msgid "Seconds" +msgstr "Secondes" + +msgid "System Monitor" +msgstr "Moniteur système" + +msgid "Files" +msgstr "Fichiers" + +msgid "Settings" +msgstr "Paramètres" diff --git a/po/fur.po b/po/fur.po new file mode 100644 index 0000000..c187053 --- /dev/null +++ b/po/fur.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: fur\n" + +msgid "System Monitor" +msgstr "Monitor di sisteme" + +msgid "Files" +msgstr "File" + +msgid "Settings" +msgstr "Impostazions" diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..08719f2 --- /dev/null +++ b/po/ga.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ga\n" + +msgid "System Monitor" +msgstr "Monatóir an Chórais" + +msgid "Files" +msgstr "Comhaid" + +msgid "Settings" +msgstr "Socruithe" diff --git a/po/gd.po b/po/gd.po new file mode 100644 index 0000000..a053e58 --- /dev/null +++ b/po/gd.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: gd\n" + +msgid "System Monitor" +msgstr "Monatair an t-siostaim" + +msgid "Files" +msgstr "Faidhlichean" + +msgid "Settings" +msgstr "Roghainnean" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..4941be8 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,1312 @@ +# Dash to Panel Spanish translation. +# This file is distributed under the same license as the Dash to Panel package. +# Fran Dieguez , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: dash-to-panel\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-04-08 09:47-0400\n" +"PO-Revision-Date: 2020-10-05 23:24+0200\n" +"Last-Translator: Fran Dieguez \n" +"Language-Team: Galician >\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Gtranslator 3.36.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Arriba, coas iconas contraídas" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "Á esquerda, coas iconas contraídas á dereita" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Arriba, coas iconas fixas centradas" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "Á esquerda, coas iconas fixas centradas" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Arriba, coas iconas flotantes centradas" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "Á esquerda, coas iconas flotantes centradas" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Centrado, fixo no medio do monitor" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Centrado, flotando entre os elementos superiores e inferiores" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Centrado, flotando entre os elementos da esquerda e dereita" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "Enriba das iconas" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "Á esquerda das iconas" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "Embaixo das iconas" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "Á dereita das iconas" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "Enriba dos indicadores do sistema" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "Á esquerda dos indicadores do sistema" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "Embaixo dos indicadores do sistema" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "Á dereita dos indicadores do sistema" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "Enriba da barra de tarefas" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "Á esquerda da barra de tarefas" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "Embaixo da barra de tareas" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "Á dereita da barra de tareas" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "Alto do botón Mostrar Escritorio (px)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "Ancho do botón Mostrar Escritorio (px)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Opcións do indicador de execución" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1084 prefs.js:1331 prefs.js:1415 prefs.js:1480 +#: prefs.js:1516 prefs.js:1613 prefs.js:1647 prefs.js:1689 +msgid "Reset to defaults" +msgstr "Restabelecer os valores predeterminados" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Por defecto (Monitor principal)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Monitor" + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Opcións de multimonitores" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Opcións de opacidade dinámica" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Opcións de «Intellihide»" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "Mostrar as opciones de aplicación" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "Mostrar o Escritorio" + +#: prefs.js:1077 +msgid "Window preview options" +msgstr "Opcións de vista rápida de xanelas" + +#: prefs.js:1324 +msgid "Ungrouped application options" +msgstr "Opcións de xanelas non combinadas" + +#: prefs.js:1408 +msgid "Customize middle-click behavior" +msgstr "Personalizar comportamento do botón central" + +#: prefs.js:1473 +msgid "Customize panel scroll behavior" +msgstr "Personalizar comportamento do desplazamento do panel" + +#: prefs.js:1509 +msgid "Customize icon scroll behavior" +msgstr "Personalizar comportamento do desplazamento das iconas" + +#: prefs.js:1606 +msgid "Advanced hotkeys options" +msgstr "Opcións avanzadas de atallos de teclado" + +#: prefs.js:1640 +msgid "Secondary Menu Options" +msgstr "Opcións do menú secundario" + +#: prefs.js:1682 Settings.ui.h:226 +msgid "Advanced Options" +msgstr "Opcións avanzadas" + +#: prefs.js:1774 +msgid "Export settings" +msgstr "Exportar configuracións" + +#: prefs.js:1791 +msgid "Import settings" +msgstr "Importar configuracións" + +#: appIcons.js:1411 +msgid "Show Details" +msgstr "Mostrar detalles" + +#: appIcons.js:1429 +msgid "New Window" +msgstr "Xanela nova" + +#: appIcons.js:1429 appIcons.js:1489 appIcons.js:1491 Settings.ui.h:10 +msgid "Quit" +msgstr "Saír" + +#: appIcons.js:1491 +msgid "Windows" +msgstr "Xanelas" + +#: appIcons.js:1745 +msgid "Power options" +msgstr "Opcións de enerxía" + +#: appIcons.js:1750 +msgid "Event logs" +msgstr "Rexistros do sistema" + +#: appIcons.js:1755 +msgid "System" +msgstr "Sistema" + +#: appIcons.js:1760 +msgid "Device Management" +msgstr "Xestión de dispositivo" + +#: appIcons.js:1765 +msgid "Disk Management" +msgstr "Xestión de discos" + +#: appIcons.js:1773 +msgid "Terminal" +msgstr "Terminal" + +#: appIcons.js:1778 +msgid "System Monitor" +msgstr "Monitor do sistema" + +#: appIcons.js:1783 +msgid "Files" +msgstr "Ficheiros" + +#: appIcons.js:1788 +msgid "Extensions" +msgstr "Extensións" + +#: appIcons.js:1793 +msgid "Settings" +msgstr "Preferencias" + +#: appIcons.js:1800 +msgid "Unlock taskbar" +msgstr "Desbloquear barra de tarefas" + +#: appIcons.js:1800 +msgid "Lock taskbar" +msgstr "Bloquear barra de tarefas" + +#: appIcons.js:1805 +msgid "Taskbar Settings" +msgstr "Opcións de la barra de tarefas" + +#: appIcons.js:1818 +msgid "Restore Windows" +msgstr "Restaurar xanelas" + +#: appIcons.js:1818 +msgid "Show Desktop" +msgstr "Mostrar o Escritorio" + +#: update.js:48 +msgid "Unavailable when installed from extensions.gnome.org" +msgstr "Non dispoñíbel cando se instala desde extensions.gnome.org" + +#: update.js:62 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "A versión %s (%s) está dispoñíbel" + +#: update.js:63 +msgid "Details" +msgstr "Mostrar detalles" + +#: update.js:64 +msgid "Update" +msgstr "Actualizar" + +#: update.js:67 +msgid "Already up to date" +msgstr "Xa está actualizado" + +#: update.js:75 +msgid "Error: " +msgstr "Erro: " + +#: update.js:168 +msgid "Update successful, please log out/in" +msgstr "Actualización correcta, por favor, peche e inicie sesión" + +#: update.js:169 +msgid "Log out" +msgstr "Pechar sesión" + +#: update.js:173 +msgid "Update successful, please restart GNOME Shell" +msgstr "Actualización correcta, por favor, restaure GNOME Shell" + +#: update.js:174 +msgid "Restart GNOME Shell" +msgstr "Reiniciar GNOME Shell" + +#: update.js:174 +msgid "Restarting GNOME Shell..." +msgstr "Reiniciando GNOME Shel..." + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Aínda nada!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Cuando está a minimizar, doble pulsación minimiza todas as xanelas da " +"aplicación." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Acción de Maiúsculas+Click" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Elevar xanelas" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Minimizar xanelas" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Lanzar unha nova xanela" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Alternar entre xanelas" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Alternar xanelas e minimizar" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Trocar entre simple e vista rápida múltiple" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Comportamento do botón central" + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Acción do botón central" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportamento para Maiúsculas+Botón-Central" + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Acción de Maiúsculas+Botón-Central" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Illar os espazos de traballo" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Mostrar aplicacións favoritas en todos os espazos de traballo" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Mostrar reloxo en todos os espazos de traballo" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Mostrar o menú de estado en todos os espazos de traballo" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Integrar os elementos do Menú de aplicación" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Mostrar detalles do menú de elementos" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Realzar a aplicación activa" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Color da icona predominante" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Cor personalizado" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Opacidade de realzado" + +#: Settings.ui.h:25 +msgid "Indicator size (px)" +msgstr "Tamaño do indicador (px)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Cor do indicador - Predominar a icona" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Color do indicador - Predominar sobre o tema" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 xanela aberta (ou non combinada)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Aplicar a todo" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 xanelas abertas" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 xanelas abertas" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4+ xanelas abertas" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Usar diferente para desenfoque" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Tamaño da fonte (px) para os títulos de aplicación (14 por defecto)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Tamaño da fonte para os títulos de aplicación" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "herdado do tema" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normal" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "máis fino" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "en negriña" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "máis en negriña" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Cor de letra dos títulos de aplicación" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Ancho máximo (px) dos títulos de aplicación (160 por defecto)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Usar ancho fixo para os títulos de aplicación" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Todos os títulos de aplicación teñen o mesmo ancho, aínda se o seu texto é " +"máis curto que o ancho máximo. O ancho máximo é usado como valor fixo." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Estilo dos indicadores de execución (aplicación non enfocada)" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "Usar as iconas favoritas como lanzadores de aplicación" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Esconder o panel sólo cando é obstruido por xanelas" + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "O panel escóndese de" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Todas as xanelas" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Xanelas enfocadas" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Xanelas maximizadas" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Requirir presión no bordo da pantalla para mostrar o panel" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Presión mínima requirida (px)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Tempo de activación por presión (ms)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "En modo pantalla completa, permitir que o panel sexa mostrado" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Ocultar só os paneis secundarios (require opción multi-monitor)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "p.ex. i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Atallos do teclado para mostrar e manter o panel" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Sintaxe: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Duración de ocultar e mostrar animacións (ms)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Tempo antes de ocultar o panel (ms)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Tempo antes de activar o panel intelixente (ms)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Tempo (ms) antes de mostrar (100 por defecto)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Tempo da animación (ms)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Tempo (ms) antes de ocultar (100 por defecto)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Pulsación inmediata en icona de aplicación" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "Usar o botón central na vista rápida para cerrar a xanela" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Tamaño por defecto das vistas rápidas (px)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Altura da vista rápida de xanelas" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Recheo (px) da vista rápida de xanelas" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "Fixa" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Anchura da vista rápida de xanelas" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Usar opacidade personalizada para o fondo das vistas rápidas" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "" +"Se está desactivado, o fondo dos vistas rápidas teñen a mesma opacidade que " +"a do panel" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Botón de apagado e posición dos títulos" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Abaixo" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Enriba" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Mostrar os títulos das xanelas nas vistas rápidas" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Tamaño de letra (px) dos títulos de aplicación (14 por defecto)" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Color de letra dos títulos de aplicación" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Color de letra dos títulos de aplicación" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Activar ollada rápida de xanela" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Al desprazxar o rato sobre unha vista rápida de xanela, a xanela reálzase." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Tempo para activar o modo de ollada rápida (ms)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Tempo de inactividade ao desprazar o rato sobre unha vista rápida de xanela " +"para activar o modo de ollada rápida." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Opacidad do modo de ollada rápida" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "Todas as xanelas excepto a resaltada ten a mesma opacidade fixa." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Atraso entre eventos de desprazamento do rato (ms)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "" +"Usar este valor para limitar o número de eventos de desprazamento capturados " +"do rato" + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Prefixo de atallo de teclado" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Os atallos serán Super+Núm. ou Super+Alt+Núm." + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Nunca" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Mostrar temporalmente" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Sempre visíbel" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Número de aplicación" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Ao usar atallos, mostrar momentaneamente o número de aplicación sobre as " +"iconas." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Tempo de ocultación (ms)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "p.e. q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Atallo para mostrar o número de aplicación por 2 segundos" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Mostrar vista rápida de xanelas ao pasar co rato" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Mostrar vistas previas cando a aplicación ten múltiples instancias" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Fila numérica" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Teclado numérico" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "Ambos" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Usar atallos de teclado para activar aplicacións" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "" +"Selecciona qué teclas numéricas se usan para activar os atallos de teclado" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Icona actual de Mostrar aplicacións" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Seleccionar icona personalizada para Mostrar aplicacións" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Imaxe da icona personalizada de Mostrar aplicacións" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "Recheo lateral da icona de Mostrar aplicacións (px)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "" +"Mostrar escritorio ao colocar pasar por enriba do botón Mostrar Escritorio" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Tempo antes de mostrar o escritorio (ms)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Duración de esvaecemento (ms)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "A opacidade do fondo do panel está afectada por" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Cambiar a opacidade cando unha xanela se aproxima (px)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Cambiar a opacidade a (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Duración das animacións de cambio de opacidade (ms)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Posición do panel na pantalla" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "Á esquerda" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "Á dereita" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Posición da barra de tarefas" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Posición do reloxo" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "Mostrar o panel principal en" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Mostrar os paneles en todos os espazos de traballo" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Ocultación intelixente do panel" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "Ocultar e mostrar o panel de acordo coas preferencias" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Posición" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Tamaño do panel\n" +"(48 por defecto)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Marxe das iconas\n" +"(8 por defecto)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Recheo das iconas\n" +"(4 por defecto)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Posición dos indicadores de execución" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Estilo dos indicadores de execución (aplicación enfocada)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Puntos" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Cadrados" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Guións" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Segmentado" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Sólido" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Estilo dos indicadores de execución (aplicación non enfocada)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "Cambiar a cor de fondo do tema do panel " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "Cambiar a opacidade de fondo do tema do panel" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Opacidade do fondo do panel (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Opacidade dinámica do fondo" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "Cambiar a opacidade cando unha xanela se aproxima ao panel" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "Cambiar o gradiente do tema do panel" + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Color e opacidade do gradiente superior (%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Color e opacidadd do gradiente inferior (%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Estilo" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Mostrar aplicacións favoritas" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Mostrar aplicacións en execución" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Mostrar a icona de Aplicacións" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Animar Mostrar Aplicacións" + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Mostrar o botón Actividades" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Mostrar o botón Escritorio" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Mostrar o botón Menú de Aplicación" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Barra superior > Mostrar menú de aplicación habilitado en Ferramenta de " +"retoques." + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Mostrar vista rápida de xanelas ao pasar co rató" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Mostrar barra de ferramentas al pasar co rato" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Illar os espazos de traballo" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Desagrupar aplicacións" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Comportamento" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Comportamento ao pulsar a icona dunha aplicación en execución" + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "Acción de pulsación" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Trocar xanelas" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Acción do panel de desprazamento" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Comportamento cando o rato se desplaza no panel" + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Acción ao desplazar iconas" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Comportamento cando o rató se desplaza sobre a icona dunha aplicación" + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "Non facer nada" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Cambiar espazo de traballo" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Trocar entre xanelas" + +#: Settings.ui.h:205 +msgid "Change volume" +msgstr "Cambiar o volume" + +#: Settings.ui.h:206 +msgid "Same as panel" +msgstr "A mesma que o panel" + +#: Settings.ui.h:207 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Activar Super+(0-9) como atallos para activar aplicacións. Tamén pode ser " +"usado xunto con Maiús. e Ctrl." + +#: Settings.ui.h:208 +msgid "Use hotkeys to activate apps" +msgstr "Usar atallos de teclado para activar aplicacións" + +#: Settings.ui.h:209 +msgid "Action" +msgstr "Acción" + +#: Settings.ui.h:210 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Tamaño do tipo de letra na bandexa do sistema\n" +"(0 = predeterminado)" + +#: Settings.ui.h:212 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Tamaño do tipo de letra na zona esquerda\n" +"(0 = predeterminado)" + +#: Settings.ui.h:214 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Separación na bandexa do sistema\n" +"(-1 = predeterminado)" + +#: Settings.ui.h:216 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Separación das iconas de estado\n" +"(-1 = predeterminado)" + +#: Settings.ui.h:218 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Separación na zona esquerda\n" +"(-1 = predeterminado)" + +#: Settings.ui.h:220 +msgid "Animate switching applications" +msgstr "Animar ao cambiar de aplicación" + +#: Settings.ui.h:221 +msgid "Animate launching new windows" +msgstr "Animar ao abrir novas xanelas" + +#: Settings.ui.h:222 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Conservar o dash original de gnome-shell (vista principal)" + +#: Settings.ui.h:223 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "Activar os botóns do menú do panel (p.ex. menú de frecha) só ao pulsar" + +#: Settings.ui.h:224 +msgid "Force Activities hot corner on primary monitor" +msgstr "Forzar as actividades da esquina 'quente' no monitor principal" + +#: Settings.ui.h:225 +msgid "App icon secondary (right-click) menu" +msgstr "Menú secundario (clic dereito) de aplicación" + +#: Settings.ui.h:227 +msgid "Fine-Tune" +msgstr "Retoques" + +#: Settings.ui.h:228 +msgid "version: " +msgstr "versión: " + +#: Settings.ui.h:229 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:230 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Usar os botóns de abaixo para crear o fichero de configuración coas súas " +"preferencias actuais para poder ser importadas de outra máquina." + +#: Settings.ui.h:231 +msgid "Export and import settings" +msgstr "Exportar e importar configuración" + +#: Settings.ui.h:232 +msgid "Export to file" +msgstr "Exportar a un ficheiro" + +#: Settings.ui.h:233 +msgid "Import from file" +msgstr "Importar dun ficheiro" + +#: Settings.ui.h:234 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "" +"Isto permítelle actualizar a extensión directamente do repositorio GitHub" + +#: Settings.ui.h:235 +msgid "Updates" +msgstr "Actualizacións" + +#: Settings.ui.h:236 +msgid "Periodically check for updates" +msgstr "Comprobar periódicamente actualizacións" + +#: Settings.ui.h:237 +msgid "Check now" +msgstr "Comprobar agora" + +#: Settings.ui.h:238 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"¡Sé consciente de que estas versións " +"oficiais de 'Dash to Panel' poderían non estar todavía revisadas en " +"extensions.gnome.org! Ler máis" + +#: Settings.ui.h:239 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Este programa ven SEN NINGUNHA GARANTÍA.\n" +"Consulte a Licencia Pública General de GNU, versión 2 ou posterior para obtener " +"máis detalles." + +#: Settings.ui.h:241 +msgid "About" +msgstr "Acerca de" + +msgid "Weekday" +msgstr "Día da semana" + +msgid "Date" +msgstr "Data" + +msgid "Seconds" +msgstr "Segundos" diff --git a/po/gu.po b/po/gu.po new file mode 100644 index 0000000..b55ea4e --- /dev/null +++ b/po/gu.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: gu\n" + +msgid "System Monitor" +msgstr "સિસ્ટમ મૉનિટર" + +msgid "Files" +msgstr "ફાઇલો" + +msgid "Settings" +msgstr "સુયોજનો" diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..adb890b --- /dev/null +++ b/po/he.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: he\n" + +msgid "System Monitor" +msgstr "צג המערכת" + +msgid "Files" +msgstr "קבצים" + +msgid "Settings" +msgstr "הגדרות" diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 0000000..e352abc --- /dev/null +++ b/po/hi.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: hi\n" + +msgid "System Monitor" +msgstr "तंत्र मॉनीटर" + +msgid "Files" +msgstr "फ़ाइल" + +msgid "Settings" +msgstr "सेटिंग्स" diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..4098959 --- /dev/null +++ b/po/hr.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: hr\n" + +msgid "System Monitor" +msgstr "Nadgledatelj sustava" + +msgid "Files" +msgstr "Datoteke" + +msgid "Settings" +msgstr "Postavke" diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..1393930 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,1305 @@ +# Hungarian translation for dash-to-panel. +# Copyright (C) 2017, 2018, 2019 Free Software Foundation, Inc. +# This file is distributed under the same license as the dash-to-panel package. +# +# Balázs Úr , 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: GitHub\n" +"Report-Msgid-Bugs-To: https://github.com/home-sweet-gnome/dash-to-panel/issues" +"\n" +"POT-Creation-Date: 2019-10-12 22:22+0200\n" +"PO-Revision-Date: 2019-10-12 22:30+0200\n" +"Last-Translator: Balázs Úr \n" +"Language-Team: Hungarian\n" +"Language: hu\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: Lokalize 18.12.3\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Fent, a bővítményikonokkal lent összecsukva" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "Balra, a bővítményikonokkal jobbra összecsukva" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Fent, középen rögzített bővítményikonokkal" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "Balra, középen rögzített bővítményikonokkal" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Fent, középen lebegő bővítményikonokkal" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "Balra, középen lebegő bővítményikonokkal" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Középen, a kijelző közepén rögzítve" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Középen, a fenti és lenti elemek között lebegve" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Középen, a bal és jobb oldali elemek között lebegve" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "A bővítményikonok fölött" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "A bővítményikonoktól balra" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "A bővítményikonok alatt" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "A bővítményikonoktól jobbra" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "A rendszerjelzők fölött" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "A rendszerjelzőktől balra" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "A rendszerjelzők alatt" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "A rendszerjelzőktől jobbra" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "A feladatsáv fölött" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "A feladatsávtól balra" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "A feladatsáv alatt" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "A feladatsávtól jobbra" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "„Asztal megjelenítése” gomb magassága (képpont)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "„Asztal megjelenítése” gomb szélessége (képpont)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Futásjelző beállításai" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1078 prefs.js:1325 prefs.js:1409 prefs.js:1474 +#: prefs.js:1510 prefs.js:1607 prefs.js:1641 prefs.js:1683 +msgid "Reset to defaults" +msgstr "Visszaállítás az alapértékekre" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Default (Elsődleges kijelző)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Kijelző" + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Többkijelzős beállítások" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Dinamikus átlátszatlansági beállítások" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Intelligens elrejtés beállításai" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "„Alkalmazások megjelenítése” ikon beállításai" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "„Asztal megjelenítése” gomb beállításai" + +#: prefs.js:1071 +msgid "Window preview options" +msgstr "Ablakelőnézet beállításai" + +#: prefs.js:1318 +msgid "Ungrouped application options" +msgstr "Nem csoportosított alkalmazás beállításai" + +#: prefs.js:1402 +msgid "Customize middle-click behavior" +msgstr "Középső kattintás viselkedésének személyre szabása" + +#: prefs.js:1467 +msgid "Customize panel scroll behavior" +msgstr "Panel görgetési viselkedésének személyre szabása" + +#: prefs.js:1503 +msgid "Customize icon scroll behavior" +msgstr "Ikon görgetési viselkedésének személyre szabása" + +#: prefs.js:1600 +msgid "Advanced hotkeys options" +msgstr "Speciális gyorsbillentyű-beállítások" + +#: prefs.js:1634 +msgid "Secondary Menu Options" +msgstr "Másodlagos menü beállítások" + +#: prefs.js:1676 Settings.ui.h:223 +msgid "Advanced Options" +msgstr "Speciális beállítások" + +#: prefs.js:1763 +msgid "Export settings" +msgstr "Beállítások exportálása" + +#: prefs.js:1780 +msgid "Import settings" +msgstr "Beállítások importálása" + +#: appIcons.js:1380 +msgid "Show Details" +msgstr "Részletek megjelenítése" + +#: appIcons.js:1398 +msgid "New Window" +msgstr "Új ablak" + +#: appIcons.js:1398 appIcons.js:1458 appIcons.js:1460 Settings.ui.h:10 +msgid "Quit" +msgstr "Kilépés" + +#: appIcons.js:1460 +msgid "Windows" +msgstr "Ablakok" + +#: appIcons.js:1684 +msgid "Power options" +msgstr "Energiabeállítások" + +#: appIcons.js:1689 +msgid "Event logs" +msgstr "Eseménynaplók" + +#: appIcons.js:1694 +msgid "System" +msgstr "Rendszer" + +#: appIcons.js:1699 +msgid "Device Management" +msgstr "Eszközkezelés" + +#: appIcons.js:1704 +msgid "Disk Management" +msgstr "Lemezkezelés" + +#: appIcons.js:1711 +msgid "Terminal" +msgstr "Terminál" + +#: appIcons.js:1716 +msgid "System Monitor" +msgstr "Rendszerfigyelő" + +#: appIcons.js:1721 +msgid "Files" +msgstr "Fájlok" + +#: appIcons.js:1726 +msgid "Settings" +msgstr "Beállítások" + +#: appIcons.js:1733 +msgid "Unlock taskbar" +msgstr "Feladatsáv feloldása" + +#: appIcons.js:1733 +msgid "Lock taskbar" +msgstr "Feladatsáv zárolása" + +#: appIcons.js:1738 +msgid "Taskbar Settings" +msgstr "Feladatsáv beállításai" + +#: appIcons.js:1745 +msgid "Restore Windows" +msgstr "Ablakok visszaállítása" + +#: appIcons.js:1745 +msgid "Show Desktop" +msgstr "Asztal megjelenítése" + +#: update.js:58 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "%s (%s) verzió érhető el" + +#: update.js:59 +msgid "Details" +msgstr "Részletek" + +#: update.js:60 +msgid "Update" +msgstr "Frissítés" + +#: update.js:63 +msgid "Already up to date" +msgstr "Már naprakész" + +#: update.js:148 +msgid "Update successful, please log out/in" +msgstr "Sikeres frissítés, jelentkezzen ki és be" + +#: update.js:149 +msgid "Log out" +msgstr "Kijelentkezés" + +#: update.js:153 +msgid "Update successful, please restart GNOME Shell" +msgstr "Sikeres frissítés, indítsa újra a GNOME Shell környezetet" + +#: update.js:154 +msgid "Restart GNOME Shell" +msgstr "GNOME Shell újraindítása" + +#: update.js:154 +msgid "Restarting GNOME Shell..." +msgstr "GNOME Shell újraindítása…" + +#: update.js:160 +msgid "Error: " +msgstr "Hiba: " + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Még semmi!" + +#: Settings.ui.h:2 +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:3 +msgid "Shift+Click action" +msgstr "Shift + kattintás művelet" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Ablakok előtérbe hozása" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Ablak minimalizálása" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Új példány indítása" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Ablakok körbeléptetése" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Ablakok körbeléptetése + minimalizálás" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Önálló átkapcsolása / több előnézete" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "A középső kattintás viselkedése." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Középső kattintás művelet" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "A Shift + középső kattintás viselkedése." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Shift + középső kattintás művelet" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Kijelzők elszigetelése" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Kedvenc alkalmazások megjelenítése az összes kijelzőn" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Az óra megjelenítése az összes kijelzőn" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Az állapot menü megjelenítése az összes kijelzőn" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Alkalmazásmenü elemeinek integrálása" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Részletek megjelenítése menüpont" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Kijelölt alkalmazás kiemelése" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Ikon uralkodó színe" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Egyéni szín" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Kiemelés átlátszatlansága" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "Jelző magassága (képpont)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Jelző színe – ikon uralkodó szín" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Jelző színe – téma felülbírálása" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 nyitott ablak (vagy nem csoportosított)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Alkalmazás az összesre" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 nyitott ablak" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 nyitott ablak" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4+ nyitott ablak" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Eltérő használata a nem kijelölthöz" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Az alkalmazáscímek betűkészletmérete képpontban (alapértelmezetten 14)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Az alkalmazáscímek betűvastagsága" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "öröklés a témától" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normál" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "vékonyabb" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "félkövér" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "vastagabb" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Az alkalmazáscímek betűkészletszíne" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "" +"Az alkalmazáscímek legnagyobb szélessége képpontban (alapértelmezetten 160)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Rögzített szélesség használata az alkalmazáscímeknél" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Az összes alkalmazáscím ugyanolyan széles lesz még akkor is, ha a szövegük " +"rövidebb a legnagyobb szélességnél. A legnagyobb szélesség érték lesz " +"használva rögzített szélességként." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Futásjelzők megjelenítése nem kijelölt alkalmazásoknál" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "A kedvenc ikonok használata alkalmazásindítókként" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Csak akkor rejtse el a panelt, amikor akadályozzák az ablakok " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "A panel el van rejtve ettől" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Az összes ablak" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Kijelölt ablakok" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Maximalizált ablakok" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Nyomás szükséges a képernyő szélénél a panel előhozásához" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Szükséges nyomási küszöbszint (képpont)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Szükséges nyomási időkorlát (ezredmásodperc)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Lehetővé teszi a panelnek, hogy előjöjjön teljes képernyős módban" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Csak a másodlagos panel elrejtése (többmonitoros beállítást igényel)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "például i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Gyorsbillentyű a panel előhozásához és megtartásához" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Szintaxis: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Elrejtési és előhozási animáció időkorlátja (ezredmásodperc)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Késleltetés a panel elrejtése előtt (ezredmásodperc)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "" +"Az intelligens elrejtés indításkori engedélyezése előtti késleltetés " +"(ezredmásodperc)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Megjelenítés előtti idő (ezredmásodperc, alapérték: 100)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Animáció ideje (ezredmásodperc)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Elrejtés előtti idő (ezredmásodperc, alapértelmezetten 100)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Azonnal az alkalmazásikonra kattintáskor" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "Középső kattintás az előnézeten az ablak bezárásához" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Ablakelőnézetek előnyben részesített mérete (képpont)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Ablakelőnézetek Y képaránya (magasság)" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Ablakelőnézetek kitöltése (képpont)" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "Rögzített" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Ablakelőnézetek X képaránya (szélesség)" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Egyéni átlátszatlanság használata az előnézetek hátteréhez" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "" +"Ha le van tiltva, akkor az előnézetek háttere ugyanazzal az " +"átlátszatlansággal rendelkezik mint a panel" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Bezáró gomb és fejléc helyzete" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Lent" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Fent" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Ablakelőnézet fejléceinek megjelenítése" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Az előnézet címeinek betűmérete (képpont)" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Az előnézet címeinek betűvastagsága" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Az előnézet címeinek betűszíne" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Ablakbetekintés engedélyezése" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Amikor rámutat egy ablakelőnézetre egy ideig, az ablak megkülönböztethetővé " +"válik." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Ablakbetekintési módba lépés időkorlátja (ezredmásodperc)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Egy ablakelőnézet rámutatása közbeni tétlenség ideje, amely az " +"ablakbetekintési módba lépéshez szükséges." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Ablakbetekintési módba átlátszatlansága" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"A betekintett ablak kivételével az összes ablaknál a saját átlátszatlanság " +"ugyanarra az értékre van állítva." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Egérgörgetés-események közti késleltetés (ezredmásodperc)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "" +"Használja ezt az értéket a rögzített egérgörgetés-események számának " +"korlátozásához." + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Szuper" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Szuper + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Gyorsbillentyű-előtag" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "" +"A gyorsbillentyűk vagy Szuper + szám, vagy Szuper + Alt + szám lehetnek" + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Soha" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Megjelenítés átmenetileg" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Mindig látható" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Szám rátét" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Az alkalmazás számainak átmeneti megjelenítése az ikonok fölött a " +"gyorsbillentyűk használatakor." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Elrejtési időkorlát (ezredmásodperc)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "például q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Gyorsbillentyű a rátét megjelenítéséhez 2 másodpercre" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Ablakelőnézetek megjelenítése gyorsbillentyűvel" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Előnézetek megjelenítése, amikor az alkalmazásnak több példánya van" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Számsor" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Számbillentyűzet" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "Mindkettő" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Gyorsbillentyűk bekapcsolva ezzel" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "" +"Annak kiválasztása, hogy a billentyűzet mely számbillentyűi legyenek " +"használva a gyorsbillentyűk bekapcsolásához" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Jelenlegi „Alkalmazások megjelenítése” ikon" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Egy „Alkalmazások megjelenítése” képikon kiválasztása" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Egyéni „Alkalmazások megjelenítése” képikon" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "„Alkalmazások megjelenítése” ikon oldalsó kitöltése (képpont)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Az asztal előhozása, ha az „Asztal megjelenítése” gombra mutat" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Késleltetés az asztal előhozása előtt (ezredmásodperc)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Áttűnés időtartama (ezredmásodperc)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "A panel háttér-átlátszatlanságát a következő befolyásolja" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "" +"Átlátszatlanság megváltoztatása, amikor egy ablak közelebb kerül mint " +"(képpont)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Átlátszatlanság megváltoztatása erre (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Átlátszatlanságváltozás animációjának időtartama (ezredmásodperc)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Panel képernyő-pozíciója" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "Bal" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "Jobb" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Tálca helyzete" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Óra helye" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "A főpanel megjelenítése ezen" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Panelek megjelenítése az összes kijelzőn" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Panel intelligens elrejtése" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "A panel elrejtése vagy előhozása a beállítások szerint" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Pozíció" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Panelméret\n" +"(alapérték: 48)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Alkalmazásikon margó\n" +"(alapérték: 8)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Alkalmazásikon térköz\n" +"(alapérték: 4)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Futásjelző pozíciója" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Futásjelző stílusa (kijelölt alkalmazás)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Pontok" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Négyzetek" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Szaggatott vonalak" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Darabolt" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Tömör" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Futásjelző stílusa (nem kijelölt alkalmazások)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "A paneltéma háttérszínének felülbírálása" + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "A paneltéma háttér-átlátszatlanságának felülbírálása" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Panel háttér-átlátszatlansága (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Dinamikus háttér-átlátszatlanság" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "" +"Átlátszatlanság megváltoztatása, amikor egy ablak közel kerül a panelhez" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "A paneltéma színátmenetének felülbírálása" + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Színátmenet felső színe és átlátszatlansága (%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Színátmenet alsó színe és átlátszatlansága (%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Stílus" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Kedvenc alkalmazások megjelenítése" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Futó alkalmazások megjelenítése" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Alkalmazások ikon megjelenítése" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Alkalmazások megjelenítése animálása." + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Tevékenységek gomb megjelenítése" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Asztal gomb megjelenítése" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Alkalmazásmenü gomb megjelenítése" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"A felső sáv > Alkalmazásmenü megjelenítésének engedélyezve kell mennie a " +"finomhangoló eszközben" + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Ablakelőnézetek megjelenítése rámutatáskor" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Buboréksúgó megjelenítése rámutatáskor" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Munkaterületek elkülönítése" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Alkalmazások csoportosításának felbontása" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Viselkedés" + +#: Settings.ui.h:195 +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:196 +msgid "Click action" +msgstr "Kattintás művelet" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Ablakok átkapcsolása" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Panel görgetése művelet" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Viselkedés, ha az egeret görgetik a panel fölött." + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Ikon görgetése művelet" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Viselkedés, ha az egeret görgetik egy alkalmazásikon fölött." + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "Ne csináljon semmit" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Munkaterület váltása" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Ablakok léptetése" + +#: Settings.ui.h:205 +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:206 +msgid "Use hotkeys to activate apps" +msgstr "Gyorsbillentyűk használata az alkalmazások aktiválásához" + +#: Settings.ui.h:207 +msgid "Action" +msgstr "Művelet" + +#: Settings.ui.h:208 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Tálca betűmérete\n" +"(0 = téma alapértéke)" + +#: Settings.ui.h:210 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Bal doboz betűmérete\n" +"(0 = téma alapértéke)" + +#: Settings.ui.h:212 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Tálcaelem kitöltése\n" +"(-1 = téma alapértéke)" + +#: Settings.ui.h:214 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Állapotikon kitöltése\n" +"(-1 = téma alapértéke)" + +#: Settings.ui.h:216 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Bal doboz kitöltése\n" +"(-1 = téma alapértéke)" + +#: Settings.ui.h:218 +msgid "Animate switching applications" +msgstr "Alkalmazásváltások animálása" + +#: Settings.ui.h:219 +msgid "Animate launching new windows" +msgstr "Új ablakok indításának animálása" + +#: Settings.ui.h:220 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Eredeti gnome-shell dash megtartása (áttekintő)" + +#: Settings.ui.h:221 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "Panelmenü gombjainak (például dátum menü) aktiválása csak kattintáskor" + +#: Settings.ui.h:222 +msgid "App icon secondary (right-click) menu" +msgstr "Alkalmazásikon másodlagos (jobb kattintásos) menüje" + +#: Settings.ui.h:224 +msgid "Fine-Tune" +msgstr "Finomhangolás" + +#: Settings.ui.h:225 +msgid "version: " +msgstr "verzió: " + +#: Settings.ui.h:226 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:227 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Használja a lenti gombokat egy beállítási fájl létrehozásához a jelenlegi " +"beállításokból, amely importálható egy másik gépen." + +#: Settings.ui.h:228 +msgid "Export and import settings" +msgstr "Beállítások exportálása és importálása" + +#: Settings.ui.h:229 +msgid "Export to file" +msgstr "Exportálás fájlba" + +#: Settings.ui.h:230 +msgid "Import from file" +msgstr "Importálás fájlból" + +#: Settings.ui.h:231 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "" +"Ez lehetővé teszi a kiterjesztés frissítést közvetlenül a GitHub tárolóból." + +#: Settings.ui.h:232 +msgid "Updates" +msgstr "Frissítések" + +#: Settings.ui.h:233 +msgid "Periodically check for updates" +msgstr "Frissítések rendszeres ellenőrzése" + +#: Settings.ui.h:234 +msgid "Check now" +msgstr "Ellenőrzés most" + +#: Settings.ui.h:235 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Ne feledje, hogy ezeket a hivatalos " +"„Dash to Panel” kiterjesztéseket esetleg még nem vizsgálták felül az " +"extensions.gnome.org oldalon! Tudjon meg többet" + +#: Settings.ui.h:236 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Ehhez a programhoz SEMMILYEN GARANCIA NEM JÁR.\n" +"Nézze meg a GNU General Public License 2. vagy későbbi verzióját a részletekért.<" +"/span>" + +#: Settings.ui.h:238 +msgid "About" +msgstr "Névjegy" + +msgid "Weekday" +msgstr "Hétköznap" + +msgid "Date" +msgstr "Dátum" + +msgid "Seconds" +msgstr "Másodperc" diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..5445ecb --- /dev/null +++ b/po/id.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: id\n" + +msgid "System Monitor" +msgstr "Monitor Sistem" + +msgid "Files" +msgstr "Berkas" + +msgid "Settings" +msgstr "Pengaturan" diff --git a/po/is.po b/po/is.po new file mode 100644 index 0000000..dc6d9af --- /dev/null +++ b/po/is.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: is\n" + +msgid "System Monitor" +msgstr "Kerfisvakt" + +msgid "Files" +msgstr "Skrár" + +msgid "Settings" +msgstr "Stillingar" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..9025436 --- /dev/null +++ b/po/it.po @@ -0,0 +1,1433 @@ +# Dash to Panel Italian translation. +# This file is distributed under the same license as the Dash to Panel package. +# Enrico Bella , 2018. +# Kowalski7cc , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: kowalski.7cc@gmail.com\n" +"POT-Creation-Date: 2020-05-15 22:08+0200\n" +"PO-Revision-Date: 2020-05-15 23:12+0200\n" +"Last-Translator: l3nn4rt \n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Gtranslator 3.36.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: prefs.js:206 +msgid "Show Desktop button height (px)" +msgstr "Altezza tasto Mostra Desktop (px)" + +#: prefs.js:206 +msgid "Show Desktop button width (px)" +msgstr "Larghezza tasto Mostra Desktop (px)" + +#: prefs.js:218 +msgid "Unavailable when gnome-shell top panel is present" +msgstr "Non disponibile quando è presente il pannello superiore di gnome-shell" + +#: prefs.js:293 +msgid "Show Applications button" +msgstr "Pulsante Mostra Applicazioni" + +#: prefs.js:294 +msgid "Activities button" +msgstr "Pulsante Attività" + +#: prefs.js:295 +msgid "Taskbar" +msgstr "Taskbar" + +#: prefs.js:296 +msgid "Date menu" +msgstr "Data e ora" + +#: prefs.js:297 +msgid "System menu" +msgstr "Menu di sistema" + +#: prefs.js:298 +msgid "Left box" +msgstr "Contenitore di sinistra" + +#: prefs.js:299 +msgid "Center box" +msgstr "Contenitore centrale" + +#: prefs.js:300 +msgid "Right box" +msgstr "Contenitore di destra" + +#: prefs.js:301 +msgid "Desktop button" +msgstr "Pulsante Desktop" + +#: prefs.js:307 +msgid "Move up" +msgstr "Muovi verso l'alto" + +#: prefs.js:309 +msgid "Move down" +msgstr "Muovi verso il basso" + +#: prefs.js:311 +msgid "Visible" +msgstr "Visibile" + +#: prefs.js:312 +msgid "Select element position" +msgstr "Seleziona posizione dell'elemento" + +#: prefs.js:323 +msgid "Stacked to top" +msgstr "Allinea in alto" + +#: prefs.js:323 +msgid "Stacked to left" +msgstr "Allinea a sinistra" + +#: prefs.js:324 +msgid "Stacked to bottom" +msgstr "Allinea in basso" + +#: prefs.js:324 +msgid "Stacked to right" +msgstr "Allinea a destra" + +#: prefs.js:325 +msgid "Centered" +msgstr "Allinea al centro dello spazio disponibile" + +#: prefs.js:326 +msgid "Monitor Center" +msgstr "Allinea al centro dello schermo" + +#: prefs.js:345 +msgid "More options" +msgstr "Altre opzioni" + +#: prefs.js:369 +msgid "Show Applications options" +msgstr "Opzioni Mostra Applicazioni" + +#: prefs.js:376 prefs.js:433 prefs.js:576 prefs.js:894 prefs.js:1019 +#: prefs.js:1146 prefs.js:1405 prefs.js:1500 prefs.js:1565 prefs.js:1608 +#: prefs.js:1705 prefs.js:1739 prefs.js:1781 +msgid "Reset to defaults" +msgstr "Ripristina predefiniti" + +#: prefs.js:426 +msgid "Show Desktop options" +msgstr "Opzioni Mostra Desktop" + +#: prefs.js:569 +msgid "Running Indicator Options" +msgstr "Posizione indicatori di esecuzione" + +#: prefs.js:732 +msgid "Primary monitor" +msgstr "Schermo principale" + +#: prefs.js:732 +msgid "Monitor " +msgstr "Monitor " + +#: prefs.js:887 +msgid "Dynamic opacity options" +msgstr "Opzioni opacità dinamica" + +#: prefs.js:1012 +msgid "Intellihide options" +msgstr "Opzioni pannello Intellihide" + +#: prefs.js:1139 +msgid "Window preview options" +msgstr "Opzioni anteprima finestre" + +#: prefs.js:1398 +msgid "Ungrouped application options" +msgstr "Opzioni app non raggruppate" + +#: prefs.js:1493 +msgid "Customize middle-click behavior" +msgstr "Personalizza azioni clic centrale" + +#: prefs.js:1558 +msgid "Customize panel scroll behavior" +msgstr "Personalizza il comportamento di scorrimento sul pannello" + +#: prefs.js:1601 +msgid "Customize icon scroll behavior" +msgstr "Personalizza il comportamento di scorrimento sull'icona" + +#: prefs.js:1698 +msgid "Advanced hotkeys options" +msgstr "Opzioni avanzate scorciatoie" + +#: prefs.js:1732 +msgid "Secondary Menu Options" +msgstr "Opzioni menu secondario" + +#: prefs.js:1774 Settings.ui.h:226 +msgid "Advanced Options" +msgstr "Impostazioni avanzate" + +#: prefs.js:1877 +msgid "Export settings" +msgstr "Esporta impostazioni" + +#: prefs.js:1894 +msgid "Import settings" +msgstr "Importa impostazioni" + +#: appIcons.js:1431 +msgid "Show Details" +msgstr "Mostra dettagli" + +#: appIcons.js:1449 +msgid "New Window" +msgstr "Nuova finestra" + +#: appIcons.js:1449 appIcons.js:1509 appIcons.js:1511 Settings.ui.h:10 +msgid "Quit" +msgstr "Esci" + +#: appIcons.js:1511 +msgid "Windows" +msgstr "Finestre" + +#: appIcons.js:1860 +msgid "Unlock taskbar" +msgstr "Sblocca taskbar" + +#: appIcons.js:1860 +msgid "Lock taskbar" +msgstr "Blocca taskbar" + +#: appIcons.js:1865 +msgid "Taskbar Settings" +msgstr "Impostazioni del taskbar" + +#: appIcons.js:1878 +msgid "Restore Windows" +msgstr "Ripristina finestre" + +#: appIcons.js:1878 +msgid "Show Desktop" +msgstr "Mostra Desktop" + +#: update.js:48 +msgid "Unavailable when installed from extensions.gnome.org" +msgstr "Non disponibile quando installato da extensions.gnome.org" + +#: update.js:62 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "Disponibile la versione %s (%s)" + +#: update.js:63 +msgid "Details" +msgstr "Dettagli" + +#: update.js:64 +msgid "Update" +msgstr "Aggiorna" + +#: update.js:67 +msgid "Already up to date" +msgstr "Già aggiornato" + +#: update.js:75 +msgid "Error: " +msgstr "Errore: " + +#: update.js:168 +msgid "Update successful, please log out/in" +msgstr "Aggiornamento eseguito correttamente, disconnettiti accedi nuovamente" + +#: update.js:169 +msgid "Log out" +msgstr "Disconnettiti" + +#: update.js:173 +msgid "Update successful, please restart GNOME Shell" +msgstr "Aggiornamento riuscito, riavvia GNOME Shell" + +#: update.js:174 +msgid "Restart GNOME Shell" +msgstr "Riavvia GNOME Shell" + +#: update.js:174 +msgid "Restarting GNOME Shell..." +msgstr "Riavvio della shell GNOME ..." + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Ancora niente!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Quando impostato su minimizza, il doppio clic minimizza tutte le finestre " +"dell'app." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Azione Shift+Clic" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Solleva e visualizza finestra" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Minimizza finestra" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Apri una nuova istanza" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Cicla le finestre" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Cicla finestre + minimizza" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Commuta finestra singola e mostra anteprime" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Comportamento per clic-centrale." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Azione clic-centrale" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportamento per Shift+Clic-centrale." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Azione Shift+Clic-centrale" + +#: Settings.ui.h:15 +msgid "Integrate AppMenu items" +msgstr "Integra elementi AppMenu" + +#: Settings.ui.h:16 +msgid "Show Details menu item" +msgstr "Visualizza Mostra Dettagli" + +#: Settings.ui.h:17 +msgid "Highlight focused application" +msgstr "Evidenzia applicazione con focus" + +#: Settings.ui.h:18 +msgid "Icon dominant color" +msgstr "Colore dominante dell'icona" + +#: Settings.ui.h:19 +msgid "Custom color" +msgstr "Colore personalizzato" + +#: Settings.ui.h:20 +msgid "Highlight opacity" +msgstr "Opacità evidenziazione" + +#: Settings.ui.h:21 +msgid "Indicator size (px)" +msgstr "Dimensione indicatore (px)" + +#: Settings.ui.h:22 +msgid "Indicator color - Icon Dominant" +msgstr "Colore indicatore - Colore dominante dell'icona" + +#: Settings.ui.h:23 +msgid "Indicator color - Override Theme" +msgstr "Colore indicatore - Ignora il tema" + +#: Settings.ui.h:24 +msgid "1 window open (or ungrouped)" +msgstr "1 finestra aperta (o non raggruppata)" + +#: Settings.ui.h:25 +msgid "Apply to all" +msgstr "Applica a tutte" + +#: Settings.ui.h:26 +msgid "2 windows open" +msgstr "2 finestre aperte" + +#: Settings.ui.h:27 +msgid "3 windows open" +msgstr "3 finestre aperte" + +#: Settings.ui.h:28 +msgid "4+ windows open" +msgstr "4+ finestre aperte" + +#: Settings.ui.h:29 +msgid "Use different for unfocused" +msgstr "Personalizza per app senza focus" + +#: Settings.ui.h:30 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Dimensione font (px) dei titoli delle app (predef. 14)" + +#: Settings.ui.h:31 +msgid "Font weight of application titles" +msgstr "Stile font dei titoli delle applicazioni" + +#: Settings.ui.h:32 +msgid "inherit from theme" +msgstr "eredita dal tema" + +#: Settings.ui.h:33 +msgid "normal" +msgstr "normale" + +#: Settings.ui.h:34 +msgid "lighter" +msgstr "leggero" + +#: Settings.ui.h:35 +msgid "bold" +msgstr "grassetto" + +#: Settings.ui.h:36 +msgid "bolder" +msgstr "grosso" + +#: Settings.ui.h:37 +msgid "Font color of the application titles" +msgstr "Colore font dei titoli delle applicazioni" + +#: Settings.ui.h:38 +msgid "Font color of the minimized application titles" +msgstr "Colore font titoli delle applicazioni minimizzate" + +#: Settings.ui.h:39 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Larghezza massima (px) dei titoli delle app (predef. 160)" + +#: Settings.ui.h:40 +msgid "Use a fixed width for the application titles" +msgstr "Usa larghezza fissa per i titoli delle app" + +#: Settings.ui.h:41 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"I titoli delle applicazioni hanno la stessa larghezza anche se i testi sono " +"più corti della larghezza massima. Viene usato il valore di larghezza " +"massima." + +#: Settings.ui.h:42 +msgid "Display running indicators on unfocused applications" +msgstr "Mostra indicatori di esecuzione nelle app senza focus" + +#: Settings.ui.h:43 +msgid "Use the favorite icons as application launchers" +msgstr "Usa le icone dei Preferiti come lanciatori delle app" + +#: Settings.ui.h:44 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Nascondi pannello solo quando è ostruito dalle finestre " + +#: Settings.ui.h:45 +msgid "The panel hides from" +msgstr "Il pannello si nasconde con" + +#: Settings.ui.h:46 +msgid "All windows" +msgstr "Tutte le finestre" + +#: Settings.ui.h:47 +msgid "Focused windows" +msgstr "Finestre con focus" + +#: Settings.ui.h:48 +msgid "Maximized windows" +msgstr "Finestre massimizzate" + +#: Settings.ui.h:49 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Richiedi pressione a bordo schermo per mostrare il pannello" + +#: Settings.ui.h:50 +msgid "Required pressure threshold (px)" +msgstr "Soglia di pressione richiesta (px)" + +#: Settings.ui.h:51 +msgid "Required pressure timeout (ms)" +msgstr "Timeout pressione richiesta (ms)" + +#: Settings.ui.h:52 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Permetti al pannello di apparire quando in modalità fullscreen" + +#: Settings.ui.h:53 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Nascondi solo i pannelli secondari (richiede l'opzione multi-monitor)" + +#: Settings.ui.h:54 +msgid "e.g. i" +msgstr "es. i" + +#: Settings.ui.h:55 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Scorciatoie per mostrare e nascondere il pannello" + +#: Settings.ui.h:56 +msgid "Syntax: , , , " +msgstr "Sintassi: , , , " + +#: Settings.ui.h:57 +msgid "Hide and reveal animation duration (ms)" +msgstr "Durata animazione mostra/nascondi (ms)" + +#: Settings.ui.h:58 +msgid "Delay before hiding the panel (ms)" +msgstr "Ritardo prima di nascondere il pannello (ms)" + +#: Settings.ui.h:59 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Ritardo iniziale (ms) prima di abilitare intellihide" + +#: Settings.ui.h:60 +msgid "Time (ms) before showing (400 is default)" +msgstr "" +"Tempo (ms) prima della visualizzazione (400 è l'impostazione predefinita)" + +#: Settings.ui.h:61 +msgid "Animation time (ms)" +msgstr "Durata animazione (ms)" + +#: Settings.ui.h:62 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Tempo (ms) prima di nascondersi (100 è l'impostazione predefinita)" + +#: Settings.ui.h:63 +msgid "Immediate on application icon click" +msgstr "Immediatamente al clic sull'icona dell'applicazione" + +#: Settings.ui.h:64 +msgid "Middle click on the preview to close the window" +msgstr "Clic centrale sull'anteprima per chiudere la finestra" + +#: Settings.ui.h:65 +msgid "Window previews preferred size (px)" +msgstr "Dimensioni preferite delle anteprime delle finestre (px)" + +#: Settings.ui.h:66 +msgid "Window previews aspect ratio Y (height)" +msgstr "Proporzioni anteprime delle finestre Y (altezza)" + +#: Settings.ui.h:67 +msgid "Window previews padding (px)" +msgstr "Spaziatura anteprime finestre (px)" + +#: Settings.ui.h:68 +msgid "1" +msgstr "1" + +#: Settings.ui.h:69 +msgid "2" +msgstr "2" + +#: Settings.ui.h:70 +msgid "3" +msgstr "3" + +#: Settings.ui.h:71 +msgid "4" +msgstr "4" + +#: Settings.ui.h:72 +msgid "5" +msgstr "5" + +#: Settings.ui.h:73 +msgid "6" +msgstr "6" + +#: Settings.ui.h:74 +msgid "7" +msgstr "7" + +#: Settings.ui.h:75 +msgid "8" +msgstr "8" + +#: Settings.ui.h:76 +msgid "9" +msgstr "9" + +#: Settings.ui.h:77 +msgid "10" +msgstr "10" + +#: Settings.ui.h:78 +msgid "11" +msgstr "11" + +#: Settings.ui.h:79 +msgid "12" +msgstr "12" + +#: Settings.ui.h:80 +msgid "13" +msgstr "13" + +#: Settings.ui.h:81 +msgid "14" +msgstr "14" + +#: Settings.ui.h:82 +msgid "15" +msgstr "15" + +#: Settings.ui.h:83 +msgid "16" +msgstr "16" + +#: Settings.ui.h:84 +msgid "17" +msgstr "17" + +#: Settings.ui.h:85 +msgid "18" +msgstr "18" + +#: Settings.ui.h:86 +msgid "19" +msgstr "19" + +#: Settings.ui.h:87 +msgid "20" +msgstr "20" + +#: Settings.ui.h:88 +msgid "21" +msgstr "21" + +#: Settings.ui.h:89 +msgid "Fixed" +msgstr "Fisso" + +#: Settings.ui.h:90 +msgid "Window previews aspect ratio X (width)" +msgstr "Proporzioni anteprime delle finestre X (larghezza)" + +#: Settings.ui.h:91 +msgid "Use custom opacity for the previews background" +msgstr "Usa l'opacità personalizzata per lo sfondo delle anteprime" + +#: Settings.ui.h:92 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "" +"Se disabilitato, lo sfondo delle anteprime ha la stessa opacità del pannello" + +#: Settings.ui.h:93 +msgid "Close button and header position" +msgstr "Pulsante di chiusura e posizione dell'intestazione" + +#: Settings.ui.h:94 +msgid "Bottom" +msgstr "Basso" + +#: Settings.ui.h:95 +msgid "Top" +msgstr "Alto" + +#: Settings.ui.h:96 +msgid "Display window preview headers" +msgstr "Visualizza le intestazioni di anteprima della finestra" + +#: Settings.ui.h:97 +msgid "Font size (px) of the preview titles" +msgstr "Dimensione carattere (px) dei titoli di anteprima" + +#: Settings.ui.h:98 +msgid "Font weight of the preview titles" +msgstr "Dimensione del carattere dei titoli dell'anteprima" + +#: Settings.ui.h:99 +msgid "Font color of the preview titles" +msgstr "Colore del carattere dei titoli dell'anteprima" + +#: Settings.ui.h:100 +msgid "Enable window peeking" +msgstr "Abilita separazione finestre" + +#: Settings.ui.h:101 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "Restando sulla finestra per qualche istante, la finestra si separa." + +#: Settings.ui.h:102 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Timeout ingresso modalità finestra separata (ms)" + +#: Settings.ui.h:103 +msgid "50" +msgstr "50" + +#: Settings.ui.h:104 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Tempo di inattività sopra una finestra richiesto per entrare in modalità " +"separata." + +#: Settings.ui.h:105 +msgid "Window peeking mode opacity" +msgstr "Opacità modalità finestra separata" + +#: Settings.ui.h:106 +msgid "0" +msgstr "0" + +#: Settings.ui.h:107 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"Tutte le finestre, tranne quella visualizzata, hanno la stessa opacità." + +#: Settings.ui.h:108 +msgid "Delay between mouse scroll events (ms)" +msgstr "Ritardo tra gli eventi di scorrimento del mouse (ms)" + +#: Settings.ui.h:109 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "" +"Utilizzare questo valore per limitare il numero di eventi di scorrimento del " +"mouse acquisiti." + +#: Settings.ui.h:110 +msgid "Show popup when changing workspace" +msgstr "Mostra popup cambiando spazio di lavoro" + +#: Settings.ui.h:111 +msgid "This affects workspace popup when scrolling on the panel only." +msgstr "" +"Questo influisce sul popup spazi di lavoro solo quando si scorre sul pannello" + +#: Settings.ui.h:112 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:113 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:114 +msgid "Hotkeys prefix" +msgstr "Prefisso scorciatoie" + +#: Settings.ui.h:115 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Le scorciatoie saranno Super+Numero o Super+Alt+Numero" + +#: Settings.ui.h:116 +msgid "Never" +msgstr "Mai" + +#: Settings.ui.h:117 +msgid "Show temporarily" +msgstr "Temporanea" + +#: Settings.ui.h:118 +msgid "Always visible" +msgstr "Sempre visibile" + +#: Settings.ui.h:119 +msgid "Number overlay" +msgstr "Sovrimpressione numero" + +#: Settings.ui.h:120 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Mostra temporaneamente i numeri delle applicazioni sulle icone quando si " +"usano le scorciatoie." + +#: Settings.ui.h:121 +msgid "Hide timeout (ms)" +msgstr "Timeout visualizzazione (ms)" + +#: Settings.ui.h:122 +msgid "e.g. q" +msgstr "es. q" + +#: Settings.ui.h:123 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Scorciatoia per la sovrapposizione di 2 secondi" + +#: Settings.ui.h:124 +msgid "Show window previews on hotkey" +msgstr "Mostra anteprime finestre da hotkey" + +#: Settings.ui.h:125 +msgid "Show previews when the application have multiple instances" +msgstr "Mostra anteprime quando l'applicazione ha più istanze" + +#: Settings.ui.h:126 +msgid "Number row" +msgstr "Numero riga" + +#: Settings.ui.h:127 +msgid "Numeric keypad" +msgstr "Tastierino numerico" + +#: Settings.ui.h:128 +msgid "Both" +msgstr "Entrambi" + +#: Settings.ui.h:129 +msgid "Hotkeys are activated with" +msgstr "I tasti di scelta rapida sono attivati con" + +#: Settings.ui.h:130 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "" +"Seleziona la tipologia dei tasti numerici utilizzati per attivare i tasti di " +"scelta rapida" + +#: Settings.ui.h:131 +msgid "Current Show Applications icon" +msgstr "Icona Mostra Applicazioni attuale" + +#: Settings.ui.h:132 +msgid "Select a Show Applications image icon" +msgstr "Seleziona icona per Mostra Applicazioni" + +#: Settings.ui.h:133 +msgid "Custom Show Applications image icon" +msgstr "Icona Mostra Applicazioni personalizzata" + +#: Settings.ui.h:134 +msgid "Show Applications icon side padding (px)" +msgstr "Spaziatura a lato dell'icona Mostra Applicazioni (px)" + +#: Settings.ui.h:135 +msgid "Override escape key and return to desktop" +msgstr "" +"Sostituisci il tasto escape e ritorna al desktop anziché alla panoramica" + +#: Settings.ui.h:136 +msgid "Animate Show Applications." +msgstr "Animazione Mostra Applicazioni." + +#: Settings.ui.h:137 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "" +"Rivela il desktop quando si passa il cursore sul pulsante Mostra desktop" + +#: Settings.ui.h:138 +msgid "Delay before revealing the desktop (ms)" +msgstr "Ritardo prima di rivelare il desktop (ms)" + +#: Settings.ui.h:139 +msgid "Fade duration (ms)" +msgstr "Durata dissolvenza (ms)" + +#: Settings.ui.h:140 +msgid "The panel background opacity is affected by" +msgstr "L'opacità dello pannello è influenzato da" + +#: Settings.ui.h:141 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Cambia l'opacità quando una finestra è più vicina di (px)" + +#: Settings.ui.h:143 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Imposta opacità al (%)" + +#: Settings.ui.h:144 +msgid "Opacity change animation duration (ms)" +msgstr "Durata animazione cambio opacità (ms)" + +#: Settings.ui.h:145 +msgid "Display the main panel on" +msgstr "Mostra pannello principale su" + +#: Settings.ui.h:146 +msgid "Display panels on all monitors" +msgstr "Mostra pannelli su tutti i monitor" + +#: Settings.ui.h:147 +msgid "Panel Intellihide" +msgstr "Pannello Intellihide" + +#: Settings.ui.h:148 +msgid "Hide and reveal the panel according to preferences" +msgstr "Mostra e nascondi il pannello secondo le preferenze" + +#: Settings.ui.h:149 +msgid "Order and positions on monitor" +msgstr "Ordinamento e posizione sullo schermo" + +#: Settings.ui.h:150 +msgid "Apply changes to all monitors" +msgstr "Applica a tutti gli schermi" + +#: Settings.ui.h:151 +msgid "Panel screen position" +msgstr "Posizione pannello sullo schermo" + +#: Settings.ui.h:152 +msgid "Left" +msgstr "Sinistra" + +#: Settings.ui.h:153 +msgid "Right" +msgstr "Destra" + +#: Settings.ui.h:154 +msgid "Position" +msgstr "Posizione" + +#: Settings.ui.h:155 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Dimensione pannello\n" +"(predefinito 48)" + +#: Settings.ui.h:157 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Margine icone app\n" +"(predefinito 8)" + +#: Settings.ui.h:159 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Spaziatura icone app\n" +"(predefinito 4)" + +#: Settings.ui.h:161 +msgid "Running indicator position" +msgstr "Posizione indicatore di esecuzione" + +#: Settings.ui.h:162 +msgid "Running indicator style (Focused app)" +msgstr "Stile indicatore di esecuzione (app con focus)" + +#: Settings.ui.h:163 +msgid "Dots" +msgstr "Puntini" + +#: Settings.ui.h:164 +msgid "Squares" +msgstr "Quadrati" + +#: Settings.ui.h:165 +msgid "Dashes" +msgstr "Trattini" + +#: Settings.ui.h:166 +msgid "Segmented" +msgstr "Segmenti" + +#: Settings.ui.h:167 +msgid "Solid" +msgstr "Solidi" + +#: Settings.ui.h:168 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:169 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:170 +msgid "Running indicator style (Unfocused apps)" +msgstr "Stile indicatore di esecuzione (app senza focus)" + +#: Settings.ui.h:171 +msgid "Override panel theme background color " +msgstr "Ignora il colore di sfondo del pannello " + +#: Settings.ui.h:172 +msgid "Override panel theme background opacity" +msgstr "Ignora l'opacità del pannello" + +#: Settings.ui.h:174 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Opacità di sfondo del pannello (%)" + +#: Settings.ui.h:175 +msgid "Dynamic background opacity" +msgstr "Opacità di sfondo dinamica" + +#: Settings.ui.h:176 +msgid "Change opacity when a window gets close to the panel" +msgstr "Cambia l'opacità quando una finestra è vicina al pannello" + +#: Settings.ui.h:177 +msgid "Override panel theme gradient " +msgstr "Ignora gradiente del pannello " + +#: Settings.ui.h:179 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Colore superiore del gradiente e opacità (%)" + +#: Settings.ui.h:181 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Colore inferiore del gradiente e opacità (%)" + +#: Settings.ui.h:182 +msgid "Style" +msgstr "Stile" + +#: Settings.ui.h:183 +msgid "Show favorite applications" +msgstr "Mostra applicazioni preferite" + +#: Settings.ui.h:184 +msgid "Show running applications" +msgstr "Mostra le applicazioni in esecuzione" + +#: Settings.ui.h:185 +msgid "Show favorite applications on secondary panels" +msgstr "Mostra le applicazioni preferite sui pannelli secondari" + +#: Settings.ui.h:186 +msgid "Show AppMenu button" +msgstr "Mostra pulsante AppMenu" + +#: Settings.ui.h:187 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "In Estensioni deve essere abilitato il Menù dell'applicazione" + +#: Settings.ui.h:188 +msgid "Show window previews on hover" +msgstr "Mostra anteprime finestre al passaggio" + +#: Settings.ui.h:189 +msgid "Show tooltip on hover" +msgstr "Mostra suggerimento al passaggio" + +#: Settings.ui.h:190 +msgid "Isolate Workspaces" +msgstr "Isola spazi di lavoro" + +#: Settings.ui.h:191 +msgid "Isolate monitors" +msgstr "Isola monitor" + +#: Settings.ui.h:192 +msgid "Ungroup applications" +msgstr "Non raggruppare applicazioni" + +#: Settings.ui.h:193 +msgid "Behavior" +msgstr "Comportamento" + +#: Settings.ui.h:194 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Comportamento al clic sull'icona di un'app in esecuzione." + +#: Settings.ui.h:195 +msgid "Click action" +msgstr "Azione al clic" + +#: Settings.ui.h:196 +msgid "Toggle windows" +msgstr "Commuta le finestre" + +#: Settings.ui.h:197 +msgid "Scroll panel action" +msgstr "Azione scorrimento pannello" + +#: Settings.ui.h:198 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Comportamento durante lo scorrimento del mouse sul pannello." + +#: Settings.ui.h:199 +msgid "Scroll icon action" +msgstr "Azione scorrimento icona" + +#: Settings.ui.h:200 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "" +"Comportamento quando si scorre il mouse sopra l'icona di un'applicazione." + +#: Settings.ui.h:201 +msgid "Do nothing" +msgstr "Nessuna azione" + +#: Settings.ui.h:202 +msgid "Switch workspace" +msgstr "Cambia spazio di lavoro" + +#: Settings.ui.h:203 +msgid "Cycle windows" +msgstr "Cicla le finestre" + +#: Settings.ui.h:204 +msgid "Change volume" +msgstr "Cambia il volume" + +#: Settings.ui.h:205 +msgid "Same as panel" +msgstr "Stesso del pannello" + +#: Settings.ui.h:206 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Abilita Super+(0-9) come scorciatoia per attivare le app. Può essere usato " +"assieme a Shift e Ctrl." + +#: Settings.ui.h:207 +msgid "Use hotkeys to activate apps" +msgstr "Usa scorciatoie per attivare app" + +#: Settings.ui.h:208 +msgid "Action" +msgstr "Azioni" + +#: Settings.ui.h:209 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Dimens. Font Tray\n" +"(0 = predefinito)" + +#: Settings.ui.h:211 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Dimens. Font LeftBox\n" +"(0 = predefinito)" + +#: Settings.ui.h:213 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Spaziatura Icone Tray\n" +"(-1 = predefinito)" + +#: Settings.ui.h:215 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Spaziatura icone stato\n" +"(-1 = predefinito)" + +#: Settings.ui.h:217 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Spaziatura LeftBox\n" +"(-1 = predefinito)" + +#: Settings.ui.h:219 +msgid "Animate switching applications" +msgstr "Animazione passaggio tra applicazioni" + +#: Settings.ui.h:220 +msgid "Animate launching new windows" +msgstr "Animazione apertura nuove finestre" + +#: Settings.ui.h:221 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Mantieni dash originale di gnome-shell (schermata panoramica)" + +#: Settings.ui.h:222 +msgid "Force Activities hot corner on primary monitor" +msgstr "Forza angolo attivo delle attività sul monitor principale" + +#: Settings.ui.h:223 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "" +"Attiva i pulsanti del menu del pannello (ad es. Menu della data) solo al clic" + +#: Settings.ui.h:224 +msgid "Keep original gnome-shell top panel" +msgstr "Mantieni il pannello superiore della gnome-shell originale" + +#: Settings.ui.h:225 +msgid "App icon secondary (right-click) menu" +msgstr "Menu secondario (clic destro) delle icone" + +#: Settings.ui.h:227 +msgid "Fine-Tune" +msgstr "Perfeziona" + +#: Settings.ui.h:228 +msgid "version: " +msgstr "versione: " + +#: Settings.ui.h:229 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:230 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Usa i tasti qui sotto per salvare in un file le tue preferenze attuali che " +"potranno essere importate su altri computer." + +#: Settings.ui.h:231 +msgid "Export and import settings" +msgstr "Esporta e importa impostazioni" + +#: Settings.ui.h:232 +msgid "Export to file" +msgstr "Esporta su file" + +#: Settings.ui.h:233 +msgid "Import from file" +msgstr "Importa da file" + +#: Settings.ui.h:234 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "" +"Ciò consente di aggiornare l'estensione direttamente dal repository GitHub." + +#: Settings.ui.h:235 +msgid "Updates" +msgstr "Aggiornamenti" + +#: Settings.ui.h:236 +msgid "Periodically check for updates" +msgstr "Controlla periodicamente per gli aggiornamenti" + +#: Settings.ui.h:237 +msgid "Check now" +msgstr "Controlla ora" + +#: Settings.ui.h:238 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Attenzione, queste versioni " +"ufficiali di Dash to Panel potrebbero non essere ancora esaminate su " +"extensions.gnome.org! Leggi di più" + +#: Settings.ui.h:239 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Questo programma è fornito SENZA NESSUNA GARANZIA.\n" +"Vedere GNU General Public License, versione 2 o successive per dettagli." + +#: Settings.ui.h:241 +msgid "About" +msgstr "Informazioni su" + +msgid "Top, with plugin icons collapsed to bottom" +msgstr "In alto, con le icone dei plugin raggruppate in bassoa" + +msgid "Left, with plugin icons collapsed to right" +msgstr "A sinistra, con le icone dei plugin raggruppate a destra" + +msgid "Top, with fixed center plugin icons" +msgstr "In alto, con le icone dei plugin fisse al centro" + +msgid "Left, with fixed center plugin icons" +msgstr "A sinistra, con le icone dei plugin fisse al centro" + +msgid "Top, with floating center plugin icons" +msgstr "In cima, con le icone dei plugin flottanti al centro" + +msgid "Left, with floating center plugin icons" +msgstr "Sinistra, con le icone dei plugin flottanti al centro" + +msgid "Center, fixed in middle of monitor" +msgstr "Centrato, fisso al centro del monitor" + +msgid "Center, floating between top and bottom elements" +msgstr "Centrato, flottante tra elementi in cima e in basso" + +msgid "Center, floating between left and right elements" +msgstr "Centrato, flottante tra elementi a destra e sinistra" + +msgid "Top of plugin icons" +msgstr "In cima alle icone dei plugin" + +msgid "Left of plugin icons" +msgstr "Sinistra delle icone plugin" + +msgid "Bottom of plugin icons" +msgstr "In fondo alle icone dei plugin" + +msgid "Right of plugin icons" +msgstr "Destra delle icone plugin" + +msgid "Top of system indicators" +msgstr "In cima agli indicatori di sistema" + +msgid "Left of system indicators" +msgstr "Sinistra degli indicatori di sistema" + +msgid "Bottom of system indicators" +msgstr "In fondo agli indicatori di sistema" + +msgid "Right of system indicators" +msgstr "Destra degli indicatori di sistema" + +msgid "Left of taskbar" +msgstr "Sinistra della taskbar" + +msgid "Bottom of taskbar" +msgstr "In fondo alla taskbar" + +msgid "Right of taskbar" +msgstr "Destra della taskbar" + +msgid "Display the clock on additional panels" +msgstr "Mostra l'orologio su pannelli aggiuntivi" + +msgid "Display the clock on secondary panels" +msgstr "Visualizza l'orologio su pannelli secondari" + +msgid "Display the status menu on additional panels" +msgstr "Mostra il menu di stato su pannelli aggiuntivi" + +msgid "Display the status menu on secondary panels" +msgstr "Mostra il menu di stato su pannelli secondari" + +msgid "Taskbar position" +msgstr "Posizione taskbar" + +msgid "Clock location" +msgstr "Posizione orologio" + +msgid "" +"For the following 2 options, \"additional\" refers to panels that are " +"displayed in addition to the gnome-shell top panel." +msgstr "" +"Per le seguenti 2 opzioni, \"aggiuntivo\" si riferisce ai pannelli che " +"vengono visualizzati in aggiunta al pannello superiore di gnome-shell." + +msgid "Show Applications icon" +msgstr "Mostra icona Applicazioni" + +msgid "Multi-monitors options" +msgstr "Opzioni multi-monitor" + +msgid "Event logs" +msgstr "Registro degli eventi" + +msgid "System" +msgstr "Sistema" + +msgid "Device Management" +msgstr "Gestione dispositivi" + +msgid "Disk Management" +msgstr "Gestione disco" + +msgid "Terminal" +msgstr "Terminale" + +msgid "Extensions" +msgstr "Estensioni" + +msgid "Files" +msgstr "Esplora file" + +msgid "Settings" +msgstr "Impostazioni" + +msgid "Display favorite applications on all monitors" +msgstr "Mostra applicazioni preferite su tutti i monitor" + +msgid "Highlight color" +msgstr "Colore evidenziazione" + +msgid "Preview timeout on icon leave (ms)" +msgstr "Timeout anteprima uscendo dall'icona (ms)" + +msgid "" +"If set too low, the window preview of running applications may seem to " +"close too quickly when trying to enter the popup. If set too high, the " +"preview may linger too long when moving to an adjacent icon." +msgstr "" +"Se troppo basso, l'anteprima delle applicazioni in esecuzione potrebbe " +"chiudersi troppo presto quando si entra nel popup. Se troppo alto, " +"l'anteprima potrebbe persistere troppo a lungo quando si cambia icona." + +msgid "Middle click to close window" +msgstr "Clic centrale per chiudere la finestra" + +msgid "Width of the window previews (px)" +msgstr "Larghezza delle anteprime (px)" + +msgid "Height of the window previews (px)" +msgstr "Altezza delle anteprime (px)" + +msgid "Padding of the window previews (px)" +msgstr "Spaziatura delle anteprime (px)" + +msgid "Natural" +msgstr "Naturale" + +msgid "Left side of panel" +msgstr "A sinistra del pannello" + +msgid "Centered in content" +msgstr "Centrato nel contenuto" + +msgid "Github" +msgstr "GitHub" + +msgid "Weekday" +msgstr "Giorno della settimana" + +msgid "Date" +msgstr "Data" + +msgid "Seconds" +msgstr "Secondi" + +msgid "System Monitor" +msgstr "Monitor di sistema" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..5cb4292 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,1455 @@ +# Japanese translations for Dash to Panel. +# Copyright (C) 2017-2021 dash-to-panel's COPYRIGHT HOLDER +# This file is distributed under the same license as the dash-to-panel package. +# Shinichirou Yamada , 2017-2018. +# sicklylife , 2018-2021. +# Ryo Nakano , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-03 21:05+0900\n" +"PO-Revision-Date: 2021-01-03 21:52+0900\n" +"Last-Translator: sicklylife \n" +"Language-Team: 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" + +#: Settings.ui:43 +msgid "Nothing yet!" +msgstr "まだ何もありません!" + +#: Settings.ui:98 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"最小化に設定する場合、ダブルクリックでそのアプリケーションのすべてのウィンド" +"ウを最小化します。" + +#: Settings.ui:116 +msgid "Shift+Click action" +msgstr "Shift + クリックの動作" + +#: Settings.ui:130 Settings.ui:201 Settings.ui:272 Settings.ui:6529 +msgid "Raise windows" +msgstr "ウィンドウを最前面に移動" + +#: Settings.ui:131 Settings.ui:202 Settings.ui:273 +msgid "Minimize window" +msgstr "ウィンドウを最小化" + +#: Settings.ui:132 Settings.ui:203 Settings.ui:274 Settings.ui:6530 +msgid "Launch new instance" +msgstr "新規インスタンスを起動" + +#: Settings.ui:133 Settings.ui:204 Settings.ui:275 Settings.ui:6526 +msgid "Cycle through windows" +msgstr "ウィンドウを循環表示" + +#: Settings.ui:134 Settings.ui:205 Settings.ui:276 Settings.ui:6525 +msgid "Cycle windows + minimize" +msgstr "ウィンドウを循環 + 最小化" + +#: Settings.ui:135 Settings.ui:206 Settings.ui:277 Settings.ui:6527 +msgid "Toggle single / Preview multiple" +msgstr "ウィンドウが 1 つなら切り替え" + +#: Settings.ui:169 +msgid "Behavior for Middle-Click." +msgstr "中クリック時の挙動です。" + +#: Settings.ui:187 +msgid "Middle-Click action" +msgstr "中クリックの動作" + +#: Settings.ui:240 +msgid "Behavior for Shift+Middle-Click." +msgstr "Shift + 中クリック時の挙動です。" + +#: Settings.ui:258 +msgid "Shift+Middle-Click action" +msgstr "Shift + 中クリックの動作" + +#: Settings.ui:337 +msgid "Integrate AppMenu items" +msgstr "アプリケーションメニューの項目を統合" + +#: Settings.ui:383 +msgid "Show Details menu item" +msgstr "詳細を表示するメニュー項目を表示" + +#: Settings.ui:481 +msgid "Highlight focused application" +msgstr "フォーカスされたアプリをハイライト" + +#: Settings.ui:512 +msgid "Icon dominant color" +msgstr "アイコンのドミナントカラー" + +#: Settings.ui:537 +msgid "Custom color" +msgstr "カスタムカラー" + +#: Settings.ui:562 +msgid "Highlight opacity" +msgstr "ハイライトの不透明度" + +#: Settings.ui:614 +msgid "Indicator size (px)" +msgstr "インジケーターのサイズ (px)" + +#: Settings.ui:658 +msgid "Indicator color - Icon Dominant" +msgstr "インジケーターの色 - アイコンのドミナント" + +#: Settings.ui:704 +msgid "Indicator color - Override Theme" +msgstr "インジケーターの色 - テーマを上書き" + +#: Settings.ui:747 Settings.ui:933 +msgid "1 window open (or ungrouped)" +msgstr "ウィンドウを 1 つ開く (または非グループ化)" + +#: Settings.ui:762 Settings.ui:948 +msgid "Apply to all" +msgstr "すべてに適用" + +#: Settings.ui:798 Settings.ui:984 +msgid "2 windows open" +msgstr "ウィンドウを 2 つ開く" + +#: Settings.ui:811 Settings.ui:1009 +msgid "3 windows open" +msgstr "ウィンドウを 3 つ開く" + +#: Settings.ui:824 Settings.ui:1034 +msgid "4+ windows open" +msgstr "ウィンドウを 4 つ以上開く" + +#: Settings.ui:890 +msgid "Use different for unfocused" +msgstr "非フォーカスの場合は異なる色を使用" + +#: Settings.ui:1141 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "アプリケーションタイトルのフォントサイズ (px) (初期値は 14)" + +#: Settings.ui:1172 +msgid "Font weight of application titles" +msgstr "アプリケーションタイトルのフォントの幅" + +#: Settings.ui:1186 Settings.ui:2911 +msgid "inherit from theme" +msgstr "テーマに依存" + +#: Settings.ui:1187 Settings.ui:2912 +msgid "normal" +msgstr "普通" + +#: Settings.ui:1188 Settings.ui:2913 +msgid "lighter" +msgstr "細い" + +#: Settings.ui:1189 Settings.ui:2914 +msgid "bold" +msgstr "太い" + +#: Settings.ui:1190 Settings.ui:2915 +msgid "bolder" +msgstr "より太い" + +#: Settings.ui:1220 +msgid "Font color of the application titles" +msgstr "アプリケーションタイトルのフォントの色" + +#: Settings.ui:1263 +msgid "Font color of the minimized application titles" +msgstr "アプリケーションタイトルのフォントの色 (最小化時)" + +#: Settings.ui:1306 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "アプリケーションタイトルの最大幅 (px) (初期値は 160)" + +#: Settings.ui:1351 +msgid "Use a fixed width for the application titles" +msgstr "アプリケーションタイトルの幅を固定" + +#: Settings.ui:1376 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"アプリケーションタイトルが最大幅より短い場合でも、幅を維持します。最大幅の値" +"が固定幅の値として使用されます。" + +#: Settings.ui:1412 +msgid "Display running indicators on unfocused applications" +msgstr "フォーカスされていないアプリケーションのインジケーターを表示" + +#: Settings.ui:1454 +msgid "Use the favorite icons as application launchers" +msgstr "アプリケーションランチャーとしてお気に入りアイコンを使用" + +#: Settings.ui:1552 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "ウィンドウが重なっている場合にのみパネルを隠す " + +#: Settings.ui:1584 +msgid "The panel hides from" +msgstr "対象のウィンドウ" + +#: Settings.ui:1598 Settings.ui:4355 +msgid "All windows" +msgstr "すべてのウィンドウ" + +#: Settings.ui:1599 Settings.ui:4356 +msgid "Focused windows" +msgstr "フォーカスされたウィンドウ" + +#: Settings.ui:1600 Settings.ui:4357 +msgid "Maximized windows" +msgstr "最大化されたウィンドウ" + +#: Settings.ui:1638 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "マウスカーソルを画面端へ押し当てることでパネルを表示" + +#: Settings.ui:1670 +msgid "Required pressure threshold (px)" +msgstr "表示に必要な値 (px)" + +#: Settings.ui:1699 +msgid "Required pressure timeout (ms)" +msgstr "押し当てのタイムアウト (ミリ秒)" + +#: Settings.ui:1754 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "フルスクリーンモード時でのパネルの表示を許可" + +#: Settings.ui:1798 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "マルチモニター環境でセカンダリーパネルのみ隠す" + +#: Settings.ui:1841 +msgid "e.g. i" +msgstr "例: i" + +#: Settings.ui:1854 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "パネルを表示して固定するキーボードショートカット" + +#: Settings.ui:1866 Settings.ui:3641 +msgid "Syntax: , , , " +msgstr "シンタックス: " + +#: Settings.ui:1901 +msgid "Hide and reveal animation duration (ms)" +msgstr "表示/非表示アニメーションの長さ (ミリ秒)" + +#: Settings.ui:1947 +msgid "Delay before hiding the panel (ms)" +msgstr "パネルを隠す前の遅延 (ミリ秒)" + +#: Settings.ui:1994 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "起動時に Intellihide を有効にする前の遅延 (ミリ秒)" + +#: Settings.ui:2158 +msgid "Time (ms) before showing (400 is default)" +msgstr "表示までの時間 (ミリ秒) (初期値は 400)" + +#: Settings.ui:2172 +msgid "Animation time (ms)" +msgstr "アニメーション時間 (ミリ秒)" + +#: Settings.ui:2205 +msgid "Time (ms) before hiding (100 is default)" +msgstr "隠すまでの時間 (ミリ秒) (初期値は 100)" + +#: Settings.ui:2229 +msgid "Immediate on application icon click" +msgstr "アプリケーションアイコンをクリックしたら即隠す" + +#: Settings.ui:2285 +msgid "Middle click on the preview to close the window" +msgstr "プレビュー上での中クリックでウィンドウを閉じる" + +#: Settings.ui:2329 +msgid "Window previews preferred size (px)" +msgstr "ウィンドウプレビューの優先サイズ (px)" + +#: Settings.ui:2360 +msgid "Window previews aspect ratio Y (height)" +msgstr "ウィンドウプレビューの Y アスペクト比 (高さ)" + +#: Settings.ui:2375 +msgid "Window previews padding (px)" +msgstr "ウィンドウプレビューのパディング (px)" + +#: Settings.ui:2415 Settings.ui:2493 +msgid "1" +msgstr "1" + +#: Settings.ui:2416 Settings.ui:2494 +msgid "2" +msgstr "2" + +#: Settings.ui:2417 Settings.ui:2495 +msgid "3" +msgstr "3" + +#: Settings.ui:2418 Settings.ui:2496 +msgid "4" +msgstr "4" + +#: Settings.ui:2419 Settings.ui:2497 Settings.ui:2616 +msgid "5" +msgstr "5" + +#: Settings.ui:2420 Settings.ui:2498 +msgid "6" +msgstr "6" + +#: Settings.ui:2421 Settings.ui:2499 +msgid "7" +msgstr "7" + +#: Settings.ui:2422 Settings.ui:2500 +msgid "8" +msgstr "8" + +#: Settings.ui:2423 Settings.ui:2501 +msgid "9" +msgstr "9" + +#: Settings.ui:2424 Settings.ui:2502 +msgid "10" +msgstr "10" + +#: Settings.ui:2425 Settings.ui:2503 +msgid "11" +msgstr "11" + +#: Settings.ui:2426 Settings.ui:2504 +msgid "12" +msgstr "12" + +#: Settings.ui:2427 Settings.ui:2505 +msgid "13" +msgstr "13" + +#: Settings.ui:2428 Settings.ui:2506 +msgid "14" +msgstr "14" + +#: Settings.ui:2429 Settings.ui:2507 +msgid "15" +msgstr "15" + +#: Settings.ui:2430 Settings.ui:2508 +msgid "16" +msgstr "16" + +#: Settings.ui:2431 Settings.ui:2509 +msgid "17" +msgstr "17" + +#: Settings.ui:2432 Settings.ui:2510 +msgid "18" +msgstr "18" + +#: Settings.ui:2433 Settings.ui:2511 +msgid "19" +msgstr "19" + +#: Settings.ui:2434 Settings.ui:2512 +msgid "20" +msgstr "20" + +#: Settings.ui:2435 Settings.ui:2513 +msgid "21" +msgstr "21" + +#: Settings.ui:2446 Settings.ui:2524 +msgid "Fixed" +msgstr "固定" + +#: Settings.ui:2469 +msgid "Window previews aspect ratio X (width)" +msgstr "ウィンドウプレビューの X アスペクト比 (幅)" + +#: Settings.ui:2564 +msgid "Use custom opacity for the previews background" +msgstr "プレビューの背景にカスタム不透明度を使用" + +#: Settings.ui:2578 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "無効の場合、プレビューの背景はパネルの不透明度と同一になります" + +#: Settings.ui:2654 +msgid "Close button and header position" +msgstr "閉じるボタンとヘッダーの位置" + +#: Settings.ui:2671 Settings.ui:4859 Settings.ui:5224 +msgid "Bottom" +msgstr "下" + +#: Settings.ui:2689 Settings.ui:4878 Settings.ui:5241 +msgid "Top" +msgstr "上" + +#: Settings.ui:2735 +msgid "Display window preview headers" +msgstr "ウィンドウプレビューのヘッダーを表示" + +#: Settings.ui:2807 +msgid "Icon size (px) of the window preview" +msgstr "ウィンドウプレビューのアイコンサイズ (px)" + +#: Settings.ui:2821 +msgid "If disabled, the previews icon size will be based on headerbar size" +msgstr "無効の場合、ヘッダーバーのサイズを基準にしてアイコンサイズを設定します" + +#: Settings.ui:2869 +msgid "Font size (px) of the preview titles" +msgstr "プレビュータイトルのフォントサイズ (px)" + +#: Settings.ui:2896 +msgid "Font weight of the preview titles" +msgstr "プレビュータイトルのフォント幅" + +#: Settings.ui:2941 +msgid "Font color of the preview titles" +msgstr "プレビュータイトルのフォントの色" + +#: Settings.ui:2992 +msgid "Enable window peeking" +msgstr "ウィンドウの覗き見を有効化" + +#: Settings.ui:3018 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"ウィンドウのプレビューにしばらくの間マウスホバーし続けると、そのウィンドウ以" +"外が透明化されます。" + +#: Settings.ui:3043 +msgid "Enter window peeking mode timeout (ms)" +msgstr "ウィンドウ覗き見モードに入る時間 (ミリ秒)" + +#: Settings.ui:3057 +msgid "50" +msgstr "50" + +#: Settings.ui:3072 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"ウィンドウ覗き見モードに入るには、ウィンドウのプレビューにマウスホバーしたま" +"ま、しばらく動かさずに待つ必要があります。" + +#: Settings.ui:3104 +msgid "Window peeking mode opacity" +msgstr "ウィンドウ覗き見モードの不透明度" + +#: Settings.ui:3118 Settings.ui:3903 Settings.ui:4448 Settings.ui:5607 +#: Settings.ui:5825 Settings.ui:5863 +msgid "0" +msgstr "0" + +#: Settings.ui:3132 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"選択したウィンドウ以外のすべてのウィンドウの不透明度が、設定した値になりま" +"す。" + +#: Settings.ui:3212 Settings.ui:3300 +msgid "Delay between mouse scroll events (ms)" +msgstr "マウススクロールイベント間の遅延 (ミリ秒)" + +#: Settings.ui:3226 Settings.ui:3314 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "マウススクロールを検知した後、指定した時間スクロールに反応しません。" + +#: Settings.ui:3348 +msgid "Show popup when changing workspace" +msgstr "ワークスペース切り替え時にポップアップを表示" + +#: Settings.ui:3362 +msgid "This affects workspace popup when scrolling on the panel only." +msgstr "" +"これはパネル上でスクロールしたときのワークスペースのポップアップにのみ影響します。" + +#: Settings.ui:3444 +msgid "Super" +msgstr "Super" + +#: Settings.ui:3445 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui:3459 +msgid "Hotkeys prefix" +msgstr "ホットキーのプレフィックス" + +#: Settings.ui:3471 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "ホットキーは Super + 数字キー、Super + Alt + 数字キーのどちらかです。" + +#: Settings.ui:3509 +msgid "Never" +msgstr "表示しない" + +#: Settings.ui:3510 +msgid "Show temporarily" +msgstr "一時的に表示" + +#: Settings.ui:3511 +msgid "Always visible" +msgstr "常に表示" + +#: Settings.ui:3525 +msgid "Number overlay" +msgstr "番号の表示" + +#: Settings.ui:3537 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"ホットキー使用時、アプリケーションのアイコン上に番号を一時的に表示します。" + +#: Settings.ui:3586 +msgid "Hide timeout (ms)" +msgstr "非表示にするまでの時間 (ミリ秒)" + +#: Settings.ui:3616 +msgid "e.g. q" +msgstr "例: q" + +#: Settings.ui:3629 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "番号を 2 秒間表示するショートカットキー" + +#: Settings.ui:3676 +msgid "Show window previews on hotkey" +msgstr "ホットキーでウィンドウプレビューを表示" + +#: Settings.ui:3703 +msgid "Show previews when the application have multiple instances" +msgstr "アプリケーションのインスタンスが複数ある場合はプレビューを表示します" + +#: Settings.ui:3740 +msgid "Number row" +msgstr "数字キー" + +#: Settings.ui:3741 +msgid "Numeric keypad" +msgstr "テンキー" + +#: Settings.ui:3742 +msgid "Both" +msgstr "両方" + +#: Settings.ui:3756 +msgid "Hotkeys are activated with" +msgstr "ホットキーに使用するキー" + +#: Settings.ui:3768 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "キーボードのどちら側の数字キーをホットキーに使用するかを選択します" + +#: Settings.ui:3823 +msgid "Current Show Applications icon" +msgstr "現在のアプリケーション表示アイコン" + +#: Settings.ui:3853 +msgid "Select a Show Applications image icon" +msgstr "アプリケーション表示の画像アイコンを選択" + +#: Settings.ui:3865 +msgid "Custom Show Applications image icon" +msgstr "カスタムアイコン" + +#: Settings.ui:3916 +msgid "Show Applications icon side padding (px)" +msgstr "アプリケーション表示アイコンのパディング (px)" + +#: Settings.ui:3963 +msgid "Override escape key and return to desktop" +msgstr "Esc キーで直接デスクトップに戻る" + +#: Settings.ui:3999 +msgid "Animate Show Applications." +msgstr "アプリケーションの表示にアニメーションを使用" + +#: Settings.ui:4102 +msgid "Override Show Desktop line color" +msgstr "デスクトップ表示ボタンの境目の色を上書き" + +#: Settings.ui:4173 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "デスクトップ表示ボタンにマウスホバーでデスクトップを表示" + +#: Settings.ui:4204 +msgid "Delay before revealing the desktop (ms)" +msgstr "表示するまでの遅延時間 (ミリ秒)" + +#: Settings.ui:4234 +msgid "Fade duration (ms)" +msgstr "フェード時間 (ミリ秒)" + +#: Settings.ui:4341 +msgid "The panel background opacity is affected by" +msgstr "パネル背景の不透明度に影響を与えるウィンドウ" + +#: Settings.ui:4403 +msgid "Change opacity when a window gets closer than (px)" +msgstr "不透明度を変更するウィンドウの距離 (px)" + +#: Settings.ui:4433 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "不透明度を次に変更 (%)" + +#: Settings.ui:4496 +msgid "Opacity change animation duration (ms)" +msgstr "不透明度変更アニメーションの継続時間 (ミリ秒)" + +#: Settings.ui:4572 +msgid "Display the main panel on" +msgstr "メインパネルの表示" + +#: Settings.ui:4614 +msgid "Display panels on all monitors" +msgstr "すべてのモニターにパネルを表示" + +#: Settings.ui:4681 +msgid "Panel Intellihide" +msgstr "パネルの Intellihide" + +#: Settings.ui:4745 +msgid "Hide and reveal the panel according to preferences" +msgstr "パネルを自動的に隠したり表示したりします" + +#: Settings.ui:4798 +msgid "Order and positions on monitor" +msgstr "モニター上での順序と位置" + +#: Settings.ui:4819 +msgid "Apply changes to all monitors" +msgstr "変更内容をすべてのモニターに適用する" + +#: Settings.ui:4843 +msgid "Panel screen position" +msgstr "パネルの表示位置" + +#: Settings.ui:4898 Settings.ui:5259 +msgid "Left" +msgstr "左" + +#: Settings.ui:4918 Settings.ui:5276 +msgid "Right" +msgstr "右" + +#: Settings.ui:4991 +msgid "Position" +msgstr "位置" + +#: Settings.ui:5036 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"パネルのサイズ\n" +"(初期値は 48)" + +#: Settings.ui:5086 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"アプリのアイコンのマージン\n" +"(初期値は 8)" + +#: Settings.ui:5135 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"アプリのアイコンのパディング\n" +"(初期値は 4)" + +#: Settings.ui:5208 +msgid "Running indicator position" +msgstr "実行中インジケーターの位置" + +#: Settings.ui:5321 +msgid "Running indicator style (Focused app)" +msgstr "実行中インジケーターのスタイル (フォーカス)" + +#: Settings.ui:5365 Settings.ui:5426 +msgid "Dots" +msgstr "" + +#: Settings.ui:5366 Settings.ui:5427 +msgid "Squares" +msgstr "" + +#: Settings.ui:5367 Settings.ui:5428 +msgid "Dashes" +msgstr "" + +#: Settings.ui:5368 Settings.ui:5429 +msgid "Segmented" +msgstr "" + +#: Settings.ui:5369 Settings.ui:5430 +msgid "Solid" +msgstr "" + +#: Settings.ui:5370 Settings.ui:5431 +msgid "Ciliora" +msgstr "" + +#: Settings.ui:5371 Settings.ui:5432 +msgid "Metro" +msgstr "" + +#: Settings.ui:5410 +msgid "Running indicator style (Unfocused apps)" +msgstr "実行中インジケーターのスタイル (非フォーカス)" + +#: Settings.ui:5486 +msgid "Override panel theme background color " +msgstr "パネルテーマの背景色を上書き " + +#: Settings.ui:5559 +msgid "Override panel theme background opacity" +msgstr "パネルテーマ背景の不透明度を上書き" + +#: Settings.ui:5592 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "パネル背景の不透明度 (%)" + +#: Settings.ui:5626 +msgid "Dynamic background opacity" +msgstr "動的な背景透過" + +#: Settings.ui:5641 +msgid "Change opacity when a window gets close to the panel" +msgstr "パネルにウィンドウが近づいたら不透明度を変更します" + +#: Settings.ui:5748 +msgid "Override panel theme gradient " +msgstr "パネルテーマのグラデーションを上書き " + +#: Settings.ui:5781 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "グラデーションの開始色と不透明度 (%)" + +#: Settings.ui:5794 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "グラデーションの終了色と不透明度 (%)" + +#: Settings.ui:5910 +msgid "Style" +msgstr "スタイル" + +#: Settings.ui:5969 +msgid "Show favorite applications" +msgstr "お気に入りのアプリケーションを表示" + +#: Settings.ui:5982 +msgid "Show running applications" +msgstr "実行中のアプリケーションを表示" + +#: Settings.ui:6019 +msgid "Show favorite applications on secondary panels" +msgstr "お気に入りのアプリケーションをセカンダリーパネルに表示" + +#: Settings.ui:6064 +msgid "Show AppMenu button" +msgstr "アプリケーションメニューボタンを表示" + +#: Settings.ui:6078 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Tweak Tool で「トップバー」 > 「アプリケーションメニュー」を有効にする必要が" +"あります" + +#: Settings.ui:6164 +msgid "Show window previews on hover" +msgstr "マウスホバー時にウィンドウのプレビューを表示" + +#: Settings.ui:6190 +msgid "Show tooltip on hover" +msgstr "マウスホバー時にツールチップを表示" + +#: Settings.ui:6235 +msgid "Isolate Workspaces" +msgstr "アイコンをワークスペースごとに表示" + +#: Settings.ui:6261 +msgid "Isolate monitors" +msgstr "モニターを分離" + +#: Settings.ui:6306 +msgid "Click empty space to close overview" +msgstr "" +"オーバービュー画面で何もないところをクリックしたらデスクトップに戻る" + +#: Settings.ui:6338 +msgid "Ungroup applications" +msgstr "アプリケーションを非グループ化" + +#: Settings.ui:6421 +msgid "Behavior" +msgstr "挙動" + +#: Settings.ui:6466 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "起動しているアプリケーションのアイコンをクリックしたときの挙動です。" + +#: Settings.ui:6483 +msgid "Click action" +msgstr "クリック時の動作" + +#: Settings.ui:6528 +msgid "Toggle windows" +msgstr "ウィンドウを切り替え" + +#: Settings.ui:6587 +msgid "Scroll panel action" +msgstr "パネルスクロールの動作" + +#: Settings.ui:6601 +msgid "Behavior when mouse scrolling over the panel." +msgstr "パネル上でマウススクロールしたときの挙動です。" + +#: Settings.ui:6630 +msgid "Scroll icon action" +msgstr "アイコンスクロールの動作" + +#: Settings.ui:6644 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "アプリアイコン上でマウススクロールしたときの挙動です。" + +#: Settings.ui:6693 Settings.ui:6711 +msgid "Do nothing" +msgstr "何もしない" + +#: Settings.ui:6694 +msgid "Switch workspace" +msgstr "ワークスペースを切り替え" + +#: Settings.ui:6695 Settings.ui:6712 +msgid "Cycle windows" +msgstr "ウィンドウを循環表示" + +#: Settings.ui:6696 +msgid "Change volume" +msgstr "音量を変更" + +#: Settings.ui:6713 +msgid "Same as panel" +msgstr "パネルと同様" + +#: Settings.ui:6785 +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:6803 +msgid "Use hotkeys to activate apps" +msgstr "ホットキーを使用してアプリを起動" + +#: Settings.ui:6886 +msgid "Action" +msgstr "動作" + +#: Settings.ui:6933 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"トレイのフォントサイズ\n" +"(0 = テーマの既定値)" + +#: Settings.ui:6964 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"LeftBox のフォントサイズ\n" +"(0 = テーマの既定値)" + +#: Settings.ui:7037 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"トレイアイテムのパディング\n" +"(-1 = テーマの既定値)" + +#: Settings.ui:7068 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"ステータスアイコンのパディング\n" +"(-1 = テーマの既定値)" + +#: Settings.ui:7099 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"LeftBox のパディング\n" +"(-1 = テーマの既定値)" + +#: Settings.ui:7170 +msgid "Animate switching applications" +msgstr "アプリケーション切り替え時のアニメーション効果" + +#: Settings.ui:7207 +msgid "Animate launching new windows" +msgstr "新しいウィンドウを開くときのアニメーション効果" + +#: Settings.ui:7258 +msgid "Keep original gnome-shell dash (overview)" +msgstr "オリジナルの GNOME Shell Dash を維持 (オーバービュー画面)" + +#: Settings.ui:7283 +msgid "Force Activities hot corner on primary monitor" +msgstr "プライマリーモニターのアクティビティホットコーナーを強制" + +#: Settings.ui:7308 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "パネルの日付メニューやシステムメニューをクリック時のみ有効化" + +#: Settings.ui:7333 +msgid "Keep original gnome-shell top panel" +msgstr "オリジナルの GNOME Shell トップバーを維持" + +#: Settings.ui:7400 +msgid "App icon secondary (right-click) menu" +msgstr "アプリアイコンのセカンダリー (右クリック) メニュー" + +#: Settings.ui:7470 +msgid "Fine-Tune" +msgstr "微調整" + +#: Settings.ui:7516 +msgid "version: " +msgstr "バージョン: " + +#: Settings.ui:7546 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui:7599 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"以下のボタンを使用して現在の設定から設定ファイルを作成し、別のマシンにイン" +"ポートできます。" + +#: Settings.ui:7617 +msgid "Export and import settings" +msgstr "設定のエクスポートとインポート" + +#: Settings.ui:7627 +msgid "Export to file" +msgstr "ファイルにエクスポート" + +#: Settings.ui:7639 +msgid "Import from file" +msgstr "ファイルからインポート" + +#: Settings.ui:7695 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "GitHub のリポジトリから拡張機能を直接アップデートできます。" + +#: Settings.ui:7714 +msgid "Updates" +msgstr "アップデート" + +#: Settings.ui:7727 +msgid "Periodically check for updates" +msgstr "アップデートを定期的に確認" + +#: Settings.ui:7755 +msgid "Check now" +msgstr "今すぐ確認" + +#: Settings.ui:7779 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"この機能でアップデートされる Dash to " +"Panel は公式のものではありますが、まだ extensions.gnome.org でレビューされて" +"いない可能性があることにご注意ください! 詳細はこちら" + +#: Settings.ui:7811 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"このプログラムは全くの無保証です。\n" +"詳しくは GNU General Public License, version 2 またはそれ以降 " +"をご確認ください。" + +#: Settings.ui:7832 +msgid "About" +msgstr "Dash to Panel について" + +#: appIcons.js:1422 +msgid "Show Details" +msgstr "詳細を表示" + +#: appIcons.js:1440 +msgid "New Window" +msgstr "新しいウィンドウ" + +#: Settings.ui:136 Settings.ui:207 Settings.ui:278 appIcons.js:1440 +#: appIcons.js:1500 appIcons.js:1502 +msgid "Quit" +msgstr "終了" + +#: appIcons.js:1502 +msgid "Windows" +msgstr "個のウィンドウ" + +#: appIcons.js:1792 +msgid "Power options" +msgstr "電源オプション" + +#: appIcons.js:1797 +msgid "Event logs" +msgstr "イベントログ" + +#: appIcons.js:1802 +msgid "System" +msgstr "システム" + +#: appIcons.js:1807 +msgid "Device Management" +msgstr "デバイス管理" + +#: appIcons.js:1812 +msgid "Disk Management" +msgstr "ディスク管理" + +#: appIcons.js:1826 +msgid "Terminal" +msgstr "端末" + +#: appIcons.js:1831 +msgid "System Monitor" +msgstr "システムモニター" + +#: appIcons.js:1836 +msgid "Files" +msgstr "ファイル" + +#: appIcons.js:1841 +msgid "Extensions" +msgstr "拡張機能" + +#: appIcons.js:1846 +msgid "Settings" +msgstr "設定" + +#: appIcons.js:1851 +msgid "Unlock taskbar" +msgstr "タスクバーをロック解除" + +#: appIcons.js:1851 +msgid "Lock taskbar" +msgstr "タスクバーをロック" + +#: appIcons.js:1856 +msgid "Taskbar Settings" +msgstr "タスクバーの設定" + +#: appIcons.js:1869 +msgid "Restore Windows" +msgstr "ウィンドウを復元" + +#: appIcons.js:1869 +msgid "Show Desktop" +msgstr "デスクトップを表示" + +#: panel.js:201 +msgid "Top Bar" +msgstr "トップバー" + +#: prefs.js:206 +msgid "Show Desktop button height (px)" +msgstr "デスクトップ表示ボタンの高さ (px)" + +#: prefs.js:206 +msgid "Show Desktop button width (px)" +msgstr "デスクトップ表示ボタンの幅 (px)" + +#: prefs.js:218 +msgid "Unavailable when gnome-shell top panel is present" +msgstr "GNOME Shell のトップバーが表示されている場合は利用できません" + +#: prefs.js:293 +msgid "Show Applications button" +msgstr "アプリケーション表示ボタン" + +#: prefs.js:294 +msgid "Activities button" +msgstr "アクティビティボタン" + +#: prefs.js:295 +msgid "Taskbar" +msgstr "タスクバー" + +#: prefs.js:296 +msgid "Date menu" +msgstr "日付メニュー" + +#: prefs.js:297 +msgid "System menu" +msgstr "システムメニュー" + +#: prefs.js:298 +msgid "Left box" +msgstr "左ボックス" + +#: prefs.js:299 +msgid "Center box" +msgstr "中央ボックス" + +#: prefs.js:300 +msgid "Right box" +msgstr "右ボックス" + +#: prefs.js:301 +msgid "Desktop button" +msgstr "デスクトップボタン" + +#: prefs.js:307 +msgid "Move up" +msgstr "上へ移動" + +#: prefs.js:309 +msgid "Move down" +msgstr "下へ移動" + +#: prefs.js:311 +msgid "Visible" +msgstr "表示" + +#: prefs.js:312 +msgid "Select element position" +msgstr "要素の位置を選択してください" + +#: prefs.js:323 +msgid "Stacked to top" +msgstr "上寄せ" + +#: prefs.js:323 +msgid "Stacked to left" +msgstr "左寄せ" + +#: prefs.js:324 +msgid "Stacked to bottom" +msgstr "下寄せ" + +#: prefs.js:324 +msgid "Stacked to right" +msgstr "右寄せ" + +#: prefs.js:325 +msgid "Centered" +msgstr "中央" + +#: prefs.js:326 +msgid "Monitor Center" +msgstr "モニターの中央" + +#: prefs.js:345 +msgid "More options" +msgstr "その他のオプション" + +#: prefs.js:369 +msgid "Show Applications options" +msgstr "アプリケーション表示のオプション" + +#: prefs.js:376 prefs.js:433 prefs.js:576 prefs.js:894 prefs.js:1037 +#: prefs.js:1164 prefs.js:1450 prefs.js:1545 prefs.js:1610 prefs.js:1653 +#: prefs.js:1750 prefs.js:1784 prefs.js:1826 +msgid "Reset to defaults" +msgstr "初期設定に戻す" + +#: prefs.js:426 +msgid "Show Desktop options" +msgstr "デスクトップ表示のオプション" + +#: prefs.js:569 +msgid "Running Indicator Options" +msgstr "実行中インジケーターのオプション" + +#: prefs.js:732 +msgid "Primary monitor" +msgstr "プライマリーモニター" + +#: prefs.js:732 +msgid "Monitor " +msgstr "モニター " + +#: prefs.js:887 +msgid "Dynamic opacity options" +msgstr "動的不透明度のオプション" + +#: prefs.js:1030 +msgid "Intellihide options" +msgstr "Intellihide のオプション" + +#: prefs.js:1157 +msgid "Window preview options" +msgstr "ウィンドウプレビューのオプション" + +#: prefs.js:1443 +msgid "Ungrouped application options" +msgstr "アプリケーション非グループ化のオプション" + +#: prefs.js:1538 +msgid "Customize middle-click behavior" +msgstr "中クリックの挙動のカスタマイズ" + +#: prefs.js:1603 +msgid "Customize panel scroll behavior" +msgstr "パネルスクロールの挙動のカスタマイズ" + +#: prefs.js:1646 +msgid "Customize icon scroll behavior" +msgstr "アイコンスクロールの挙動のカスタマイズ" + +#: prefs.js:1743 +msgid "Advanced hotkeys options" +msgstr "高度なホットキーのオプション" + +#: prefs.js:1777 +msgid "Secondary Menu Options" +msgstr "右クリックメニューのオプション" + +#: Settings.ui:7448 prefs.js:1819 +msgid "Advanced Options" +msgstr "高度なオプション" + +#: prefs.js:1922 +msgid "Export settings" +msgstr "設定のエクスポート" + +#: prefs.js:1939 +msgid "Import settings" +msgstr "設定のインポート" + +#: update.js:48 +msgid "Unavailable when installed from extensions.gnome.org" +msgstr "extensions.gnome.org からインストールした場合は利用できません" + +#: update.js:62 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "バージョン %s (%s) が利用可能です" + +#: update.js:63 +msgid "Details" +msgstr "詳細" + +#: update.js:64 +msgid "Update" +msgstr "アップデート" + +#: update.js:67 +msgid "Already up to date" +msgstr "すでに最新です" + +#: update.js:75 +msgid "Error: " +msgstr "エラー: " + +#: update.js:168 +msgid "Update successful, please log out/in" +msgstr "アップデート成功: ログインしなおしてください" + +#: update.js:169 +msgid "Log out" +msgstr "ログアウト" + +#: update.js:173 +msgid "Update successful, please restart GNOME Shell" +msgstr "アップデート成功: GNOME Shell を再起動してください" + +#: update.js:174 +msgid "Restart GNOME Shell" +msgstr "GNOME Shell を再起動" + +#: update.js:174 +msgid "Restarting GNOME Shell..." +msgstr "GNOME Shell を再起動しています..." + +#: windowPreview.js:934 +msgid "Move to current Workspace" +msgstr "現在のワークスペースに移動" + +#~ msgid "Display favorite applications on all monitors" +#~ msgstr "すべてのモニターにお気に入りのアプリケーションを表示" + +#~ msgid "Display the clock on all monitors" +#~ msgstr "すべてのモニターに時計を表示" + +#~ msgid "Display the status menu on all monitors" +#~ msgstr "すべてのモニターにステータスメニューを表示" + +#~ msgid "Taskbar position" +#~ msgstr "タスクバーの位置" + +#~ msgid "Clock location" +#~ msgstr "時計の位置" + +#~ msgid "Show Applications icon" +#~ msgstr "アプリケーションアイコンを表示" + +#~ msgid "Top, with plugin icons collapsed to bottom" +#~ msgstr "上 (プラグインアイコンは下寄せ)" + +#~ msgid "Left, with plugin icons collapsed to right" +#~ msgstr "左 (プラグインアイコンは右寄せ)" + +#~ msgid "Top, with fixed center plugin icons" +#~ msgstr "上 (プラグインアイコンは中央に固定)" + +#~ msgid "Left, with fixed center plugin icons" +#~ msgstr "左 (プラグインアイコンは中央に固定)" + +#~ msgid "Top, with floating center plugin icons" +#~ msgstr "上 (プラグインアイコンは中央かつ非固定)" + +#~ msgid "Left, with floating center plugin icons" +#~ msgstr "左 (プラグインアイコンは中央かつ非固定)" + +#~ msgid "Center, fixed in middle of monitor" +#~ msgstr "中央 (モニターの中央に固定)" + +#~ msgid "Center, floating between top and bottom elements" +#~ msgstr "中央 (上側と下側のエレメント間に表示)" + +#~ msgid "Center, floating between left and right elements" +#~ msgstr "中央 (右側と左側のエレメント間に表示)" + +#~ msgid "Top of plugin icons" +#~ msgstr "プラグインアイコンの上" + +#~ msgid "Left of plugin icons" +#~ msgstr "プラグインアイコンの左" + +#~ msgid "Bottom of plugin icons" +#~ msgstr "プラグインアイコンの下" + +#~ msgid "Right of plugin icons" +#~ msgstr "プラグインアイコンの右" + +#~ msgid "Top of system indicators" +#~ msgstr "システムインジケーターの上" + +#~ msgid "Left of system indicators" +#~ msgstr "システムインジケーターの左" + +#~ msgid "Bottom of system indicators" +#~ msgstr "システムインジケーターの下" + +#~ msgid "Right of system indicators" +#~ msgstr "システムインジケーターの右" + +#~ msgid "Left of taskbar" +#~ msgstr "タスクバーの左" + +#~ msgid "Bottom of taskbar" +#~ msgstr "タスクバーの下" + +#~ msgid "Right of taskbar" +#~ msgstr "タスクバーの右" + +#~ msgid "Multi-monitors options" +#~ msgstr "マルチモニターのオプション" + +#~ msgid "Panel position" +#~ msgstr "パネルの位置" + +#~ msgid "Panel is shown on the Bottom or Top of the screen." +#~ msgstr "パネルは画面の下か上に表示されます。" + +#~ msgid "48" +#~ msgstr "48" + +#~ msgid "Panel size" +#~ msgstr "パネルのサイズ" + +#~ msgid "Set the size of the panel." +#~ msgstr "パネルのサイズをセットします。" + +#~ msgid "Dot position" +#~ msgstr "ドットの位置" + +#~ msgid "Running indicators are shown on the Bottom or Top of the screen." +#~ msgstr "実行中インジケーターは画面の下か上に表示されます。" + +#~ msgid "Style of the running indicator (focused)" +#~ msgstr "実行中インジケーターのスタイル (フォーカス)" + +#~ msgid "" +#~ "Style of the running indicator for the icon for the currently focused " +#~ "application" +#~ msgstr "" +#~ "現在フォーカスがあるアプリケーションのアイコンの実行中インジケーターのスタ" +#~ "イル" + +#~ msgid "Style of the running indicator (unfocused)" +#~ msgstr "実行中インジケーターのスタイル (非フォーカス)" + +#~ msgid "" +#~ "Style of the running indicator for the icon for applications which are " +#~ "not currently focused" +#~ msgstr "" +#~ "現在フォーカスがないアプリケーションのアイコンの実行中インジケーターのスタ" +#~ "イル" + +msgid "Weekday" +msgstr "曜日" + +msgid "Date" +msgstr "日付" + +msgid "Seconds" +msgstr "秒" diff --git a/po/ka.po b/po/ka.po new file mode 100644 index 0000000..5a635de --- /dev/null +++ b/po/ka.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ka\n" + +msgid "System Monitor" +msgstr "სისტემის მონიტორი" diff --git a/po/kab.po b/po/kab.po new file mode 100644 index 0000000..a09d2fd --- /dev/null +++ b/po/kab.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: kab\n" + +msgid "Settings" +msgstr "Iɣewwaṛen" diff --git a/po/kk.po b/po/kk.po new file mode 100644 index 0000000..6c6fc42 --- /dev/null +++ b/po/kk.po @@ -0,0 +1,609 @@ +# Kazakh translation for dash-to-panel +# Copyright (c) 2017 dash-to-panel authors. +# This file is distributed under the same license as the dash-to-panel package. +# Baurzhan Muftakhidinov , 2017-2018. +# +msgid "" +msgstr "" +"Project-Id-Version: dash-to-panel master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-02 21:29+0500\n" +"PO-Revision-Date: 2018-02-03 15:22+0500\n" +"Last-Translator: Baurzhan Muftakhidinov \n" +"Language-Team: Kazakh \n" +"Language: kk\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" +"X-Generator: Poedit 2.0.3\n" + +#: prefs.js:295 +msgid "Running Indicator Options" +msgstr "Орындалып тұрған индикатор баптаулары" + +#: prefs.js:302 prefs.js:447 prefs.js:499 prefs.js:608 prefs.js:684 +#: prefs.js:753 prefs.js:829 prefs.js:871 +msgid "Reset to defaults" +msgstr "Бастапқы мәндерге тастау" + +#: prefs.js:440 +msgid "Show Desktop options" +msgstr "Жұмыс үстел баптауларын көрсету" + +#: prefs.js:492 +msgid "Window preview options" +msgstr "Терезе кіші көрінісі баптаулары" + +#: prefs.js:601 +msgid "Ungrouped application options" +msgstr "Топталмаған қолданба баптаулары" + +#: prefs.js:677 +msgid "Customize middle-click behavior" +msgstr "Орта шерту әрекетін баптау" + +#: prefs.js:746 +msgid "Advanced hotkeys options" +msgstr "Кеңейтілген жарлық баптаулары" + +#: prefs.js:822 +msgid "Secondary Menu Options" +msgstr "Қосымша мәзір баптаулары" + +#: prefs.js:864 Settings.ui.h:113 +msgid "Advanced Options" +msgstr "Кеңейтілген баптаулар" + +#: appIcons.js:1179 +msgid "Show Details" +msgstr "Ақпаратын көрсету" + +#: appIcons.js:1198 +msgid "New Window" +msgstr "Жаңа терезе" + +#: appIcons.js:1198 appIcons.js:1260 appIcons.js:1262 Settings.ui.h:8 +msgid "Quit" +msgstr "Шығу" + +#: appIcons.js:1262 +msgid "Windows" +msgstr "Терезелер" + +#: appIcons.js:1421 +msgid "Taskbar Settings" +msgstr "Панелінің баптаулары" + +#: appIcons.js:1428 +msgid "Restore Windows" +msgstr "Терезелерді қалпына келтіру" + +#: appIcons.js:1428 +msgid "Show Desktop" +msgstr "Жұмыс үстелді көрсету" + +#: Settings.ui.h:1 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Қайыруға орнатылған кезде, қос шерту нәтижесінде қолданбаның барлық " +"терезелерін қайырады." + +#: Settings.ui.h:2 +msgid "Shift+Click action" +msgstr "Shift+Click әрекеті" + +#: Settings.ui.h:3 +msgid "Raise window" +msgstr "Терезені көтеру" + +#: Settings.ui.h:4 +msgid "Minimize window" +msgstr "Терезені минималды қылу" + +#: Settings.ui.h:5 +msgid "Launch new instance" +msgstr "Жаңа экземплярды жөнелту" + +#: Settings.ui.h:6 +msgid "Cycle through windows" +msgstr "Терезелер арасында циклмен ауысу" + +#: Settings.ui.h:7 +msgid "Cycle windows + minimize" +msgstr "Терезелер арасында циклмен ауысу + қайыру" + +#: Settings.ui.h:9 +msgid "Behavior for Middle-Click." +msgstr "Орта батырманың мінез-құлығы." + +#: Settings.ui.h:10 +msgid "Middle-Click action" +msgstr "Орта батырма әрекеті" + +#: Settings.ui.h:11 +msgid "Behavior for Shift+Middle-Click." +msgstr "Shift+Орта батырманың мінез-құлығы." + +#: Settings.ui.h:12 +msgid "Shift+Middle-Click action" +msgstr "Shift+Орта батырма әрекеті" + +#: Settings.ui.h:13 +msgid "Integrate AppMenu items" +msgstr "Қолданбалар мәзірі нәрселерін интеграциялау" + +#: Settings.ui.h:14 +msgid "Show Details menu item" +msgstr "Ақпаратын көрсету мәзір элементі" + +#: Settings.ui.h:15 +msgid "Highlight focused application" +msgstr "Фокустағы қолданбаларды түспен ерекшелеу" + +#: Settings.ui.h:16 +msgid "Highlight color" +msgstr "Ерекшелеу түсі" + +#: Settings.ui.h:17 +msgid "Highlight opacity" +msgstr "Ерекшелеудің мөлдірсіздігі" + +#: Settings.ui.h:18 +msgid "5" +msgstr "5" + +#: Settings.ui.h:19 +msgid "Indicator height (px)" +msgstr "Индикатор биіктігі (пикс)" + +#: Settings.ui.h:20 +msgid "0" +msgstr "0" + +#: Settings.ui.h:21 +msgid "Indicator color - Override Theme" +msgstr "Индикатор түсі - теманы үстінен басу" + +#: Settings.ui.h:22 +msgid "1 window open (or ungrouped)" +msgstr "1 терезе ашық (немесе топталмаған)" + +#: Settings.ui.h:23 +msgid "Apply to all" +msgstr "Барлығы үшін іске асыру" + +#: Settings.ui.h:24 +msgid "2 windows open" +msgstr "2 терезе ашық" + +#: Settings.ui.h:25 +msgid "3 windows open" +msgstr "3 терезе ашық" + +#: Settings.ui.h:26 +msgid "4+ windows open" +msgstr "4+ терезе ашық" + +#: Settings.ui.h:27 +msgid "Use different for unfocused" +msgstr "Фокустағы емес үшін басқаны қолдану" + +#: Settings.ui.h:28 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Қолданба атауының қарібі (пикс, бастапқы мәні 14)" + +#: Settings.ui.h:29 +msgid "Font color of the application titles" +msgstr "Қолданба атауының қаріп түсі" + +#: Settings.ui.h:30 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Қолданба атауының максималды ені (пикс, бастапқы мәні 160)" + +#: Settings.ui.h:31 +msgid "Use a fixed width for the application titles" +msgstr "Қолданба атауы үшін біркелкі енді қолдану" + +#: Settings.ui.h:32 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Қолданба атаулары үшін біркелкі енді қолдану, олардың мәтіні максималды " +"енінен кіші болса да. Максималды мәні тұрақты ені ретінде қолданылады." + +#: Settings.ui.h:33 +msgid "Display running indicators on unfocused applications" +msgstr "Фокустағы емес қолданбалардың орындалу индикаторын көрсету" + +#: Settings.ui.h:34 +msgid "Use the favorite icons as application launchers" +msgstr "Таңдамалы таңбашаларды қолданба жөнелткіштері ретінде қолдану" + +#: Settings.ui.h:35 +msgid "Preview timeout on icon leave (ms)" +msgstr "Таңбашадан кеткен кезде кіші көріністі көрсету уақыты (мс)" + +#: Settings.ui.h:36 +msgid "" +"If set too low, the window preview of running applications may seem to close " +"too quickly when trying to enter the popup. If set too high, the preview may " +"linger too long when moving to an adjacent icon." +msgstr "" +"Мәні тым аз болса, кіші көрініске өту талабын жасау кезінде орындалып тұрған " +"қолданбаның кіші көрінісі тым жылдам жабылуы мүмкін. Мәні тым үлкен болса, " +"көрші таңбашаға ауысу кезінде ағымдағы кіші көрініс ұзақ уақыт бойы " +"көрсетілуі мүмкін." + +#: Settings.ui.h:37 +msgid "Time (ms) before showing (100 is default)" +msgstr "Көрсету алдындағы уақыт (мс) (бастапқы шамасы 100)" + +#: Settings.ui.h:38 +msgid "Enable window peeking" +msgstr "Терезелерді анықтауды іске қосу" + +#: Settings.ui.h:39 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Курсор терезенің кіші көрінісі үстінен біраз уақыт бойы өтсе, ол терезе " +"анықталатын болады." + +#: Settings.ui.h:40 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Терезені анықтауды кідіріс уақытын енгізу (мс)" + +#: Settings.ui.h:41 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Терезені анықтау үшін курсор терезенің үстінен қанша уақыт бойы аялдау керек." + +#: Settings.ui.h:42 +msgid "Window peeking mode opacity" +msgstr "Терезелерді анықтау режимінің мөлдірсіздігі" + +#: Settings.ui.h:43 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"Анықталған терезеден басқаларының мөлдірсіздігі бастапқы шамасына тең болады." + +#: Settings.ui.h:44 +msgid "Middle click to close window" +msgstr "Терезені жабу үшін орта шерту" + +#: Settings.ui.h:45 +msgid "Middle click on the preview to close the window." +msgstr "Терезені жабу үшін кіші көріністе орта шерту." + +#: Settings.ui.h:46 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:47 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:48 +msgid "Hotkeys prefix" +msgstr "Ыстық пернелер префиксі" + +#: Settings.ui.h:49 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Ыстық пернелер Super+Сан or Super+Alt+Сан болады" + +#: Settings.ui.h:50 +msgid "Never" +msgstr "Ешқашан" + +#: Settings.ui.h:51 +msgid "Show temporarily" +msgstr "Уақытша көрсету" + +#: Settings.ui.h:52 +msgid "Always visible" +msgstr "Әрқашан көрінеді" + +#: Settings.ui.h:53 +msgid "Number overlay" +msgstr "Цифрлық оверлей" + +#: Settings.ui.h:54 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Ыстық пернелерді көрсету кезінде таңбашалардың үстінен өткізгенде қолданба " +"нөмірлерін уақытша көрсету." + +#: Settings.ui.h:55 +msgid "Hide timeout (ms)" +msgstr "Жасыру кідірісі (мс)" + +#: Settings.ui.h:56 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Оверлейді 2 секундқа көрсету үшін пернетақта жарлығы" + +#: Settings.ui.h:57 +msgid "Syntax: , , , " +msgstr "Синтаксисі: , , , " + +#: Settings.ui.h:58 +msgid "Show Desktop button width (px)" +msgstr "Жұмыс үстелі батырмасының (пикс)" + +#: Settings.ui.h:59 +msgid "Panel screen position" +msgstr "Панельдің экрандағы орны" + +#: Settings.ui.h:60 +msgid "Bottom" +msgstr "Төмен" + +#: Settings.ui.h:61 +msgid "Top" +msgstr "Жоғары" + +#: Settings.ui.h:62 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Панель өлшемі\n" +"(бастапқы мәні 48)" + +#: Settings.ui.h:64 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Қолданба таңбашасының шет өрісі\n" +"(бастапқы мәні 8)" + +#: Settings.ui.h:66 +msgid "Running indicator position" +msgstr "Орындалып тұрған индикатор орны" + +#: Settings.ui.h:67 +msgid "Running indicator style (Focused app)" +msgstr "Орындалып тұрған индикатордың стилі (фокустегі қолданба)" + +#: Settings.ui.h:68 +msgid "Dots" +msgstr "Нүктелер" + +#: Settings.ui.h:69 +msgid "Squares" +msgstr "Шаршылар" + +#: Settings.ui.h:70 +msgid "Dashes" +msgstr "Штрихтер" + +#: Settings.ui.h:71 +msgid "Segmented" +msgstr "Сегменттелген" + +#: Settings.ui.h:72 +msgid "Solid" +msgstr "Бүтін" + +#: Settings.ui.h:73 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:74 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:75 +msgid "Running indicator style (Unfocused apps)" +msgstr "Орындалып тұрған индикатордың стилі (фокустегі емес қолданба)" + +#: Settings.ui.h:76 +msgid "Clock location" +msgstr "Сағаттың орналасуы" + +#: Settings.ui.h:77 +msgid "Natural" +msgstr "Табиғи" + +#: Settings.ui.h:78 +msgid "Left of status menu" +msgstr "Қалып-күй мәзірінің сол жағы" + +#: Settings.ui.h:79 +msgid "Right of status menu" +msgstr "Қалып-күй мәзірінің оң жағы" + +#: Settings.ui.h:80 +msgid "Taskbar position" +msgstr "Тапсырмалар панелінің орны" + +#: Settings.ui.h:81 +msgid "Left side of panel" +msgstr "Панельдің сол жағы" + +#: Settings.ui.h:82 +msgid "Centered in monitor" +msgstr "Монитордың ортасында" + +#: Settings.ui.h:83 +msgid "Centered in content" +msgstr "Құраманың ортасында" + +#: Settings.ui.h:84 +msgid "Position and Style" +msgstr "Орны және стилі" + +#: Settings.ui.h:85 +msgid "Show favorite applications" +msgstr "Таңдамалы қолданбаларды көрсету" + +#: Settings.ui.h:86 +msgid "Show Applications icon" +msgstr "Қолданбалар таңбашасын көрсету" + +#: Settings.ui.h:87 +msgid "Animate Show Applications." +msgstr "Қолданбаларды көрсету анимациясын іске қосу." + +#: Settings.ui.h:88 +msgid "Show Activities button" +msgstr "Көрініс таңбашасын көрсету" + +#: Settings.ui.h:89 +msgid "Show Desktop button" +msgstr "Жұмыс үстелі батырмасын көрсету" + +#: Settings.ui.h:90 +msgid "Show AppMenu button" +msgstr "Қолданбалар мәзірі таңбашасын көрсету" + +#: Settings.ui.h:91 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Кеңейтілген баптаулар (Tweak) сайманында Үстіндегі панель >Қолданбалар " +"мәзірін көрсету іске қосылған болуы тиіс" + +#: Settings.ui.h:92 +msgid "Show window previews on hover" +msgstr "Курсор үстінен өткен кезде, терезенің кіші көрінісін көрсету" + +#: Settings.ui.h:93 +msgid "Isolate Workspaces" +msgstr "Жұмыс орындарын оқшаулау" + +#: Settings.ui.h:94 +msgid "Ungroup applications" +msgstr "Қолданбаларды топтаудан босату" + +#: Settings.ui.h:95 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Орындалып тұрған қолданбаның таңбашасына шерту кезіндегі мінез-құлығы." + +#: Settings.ui.h:96 +msgid "Click action" +msgstr "Шерту әрекеті" + +#: Settings.ui.h:97 +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:98 +msgid "Use hotkeys to activate apps" +msgstr "Қолданбаларды белсендіру үшін ыстық пернелерді қолдану" + +#: Settings.ui.h:99 +msgid "Behavior" +msgstr "Мінез-құлығы" + +#: Settings.ui.h:100 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Трей қарібінің өлшемі\n" +"(0 = теманың бастапқы өлшемі)" + +#: Settings.ui.h:102 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Сол жақ аймағының қаріп өлшемі\n" +"(0 = теманың бастапқы өлшемі)" + +#: Settings.ui.h:104 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Трейдегі нәрсенің шегінісі\n" +"(-1 = теманың бастапқы өлшемі)" + +#: Settings.ui.h:106 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Қалып-күй таңбашасының шегінісі\n" +"(-1 = теманың бастапқы өлшемі)" + +#: Settings.ui.h:108 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Сол жақ аймағының шегінісі\n" +"(-1 = теманың бастапқы өлшемі)" + +#: Settings.ui.h:110 +msgid "Animate switching applications" +msgstr "Қолданбаларды ауыстыру анимациясын іске қосу" + +#: Settings.ui.h:111 +msgid "Animate launching new windows" +msgstr "Қолданбаларды жөнелту анимациясын іске қосу" + +#: Settings.ui.h:112 +msgid "App icon secondary (right-click) menu" +msgstr "Қолданба таңбашысының қосалқы (оң жақпен шерту) мәзірі" + +#: Settings.ui.h:114 +msgid "Fine-Tune" +msgstr "Дәлдеп баптау" + +#: Settings.ui.h:115 +msgid "version: " +msgstr "нұсқасы: " + +#: Settings.ui.h:116 +msgid "Github" +msgstr "Github" + +#: Settings.ui.h:117 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Бұл бағдарлама ЕШҚАНДАЙ КЕПІЛДЕМЕСІЗ таратылады.\n" +"Көбірек білу үшін GNU General Public License, нұсқасы 2 немесе кейінірек " +"қараңыз." + +#: Settings.ui.h:119 +msgid "About" +msgstr "Осы туралы" + +msgid "Weekday" +msgstr "Жұмыс күні" + +msgid "Date" +msgstr "Күн" + +msgid "Seconds" +msgstr "Секундтар" + +msgid "System Monitor" +msgstr "Жүйелік бақылаушы" + +msgid "Files" +msgstr "Файлдар" + +msgid "Settings" +msgstr "Баптаулар" diff --git a/po/km.po b/po/km.po new file mode 100644 index 0000000..4e89ecf --- /dev/null +++ b/po/km.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: km\n" + +msgid "System Monitor" +msgstr "កម្មវិធី​ត្រួត​​ពិនិត្យ​ប្រព័ន្ធ" diff --git a/po/kn.po b/po/kn.po new file mode 100644 index 0000000..bc91122 --- /dev/null +++ b/po/kn.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: kn\n" + +msgid "System Monitor" +msgstr "ಗಣಕ ಮೇಲ್ವಿಚಾರಕ" + +msgid "Files" +msgstr "ಕಡತಗಳು" + +msgid "Settings" +msgstr "ಸಿದ್ಧತೆಗಳು" diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..3e69c48 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ko\n" + +msgid "System Monitor" +msgstr "시스템 정보" + +msgid "Files" +msgstr "파일" + +msgid "Settings" +msgstr "설정" diff --git a/po/ku.po b/po/ku.po new file mode 100644 index 0000000..b8ff265 --- /dev/null +++ b/po/ku.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ku\n" + +msgid "System Monitor" +msgstr "Temaşekerê Pergalê" diff --git a/po/ky.po b/po/ky.po new file mode 100644 index 0000000..1b83be5 --- /dev/null +++ b/po/ky.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ky\n" + +msgid "System Monitor" +msgstr "Тутум монитору" + +msgid "Files" +msgstr "Файлдар" diff --git a/po/li.po b/po/li.po new file mode 100644 index 0000000..5a70532 --- /dev/null +++ b/po/li.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: li\n" + +msgid "System Monitor" +msgstr "Prosesbeheer" diff --git a/po/ln.po b/po/ln.po new file mode 100644 index 0000000..0a962ea --- /dev/null +++ b/po/ln.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ln\n" + +msgid "Files" +msgstr "Ba Fisyé" diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..be77e1e --- /dev/null +++ b/po/lt.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: lt\n" + +msgid "System Monitor" +msgstr "Sistemos monitorius" + +msgid "Files" +msgstr "Failai" + +msgid "Settings" +msgstr "Nustatymai" diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..1779126 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: lv\n" + +msgid "System Monitor" +msgstr "Sistēmas pārraugs" + +msgid "Files" +msgstr "Datnes" + +msgid "Settings" +msgstr "Iestatījumi" diff --git a/po/mai.po b/po/mai.po new file mode 100644 index 0000000..f0c984d --- /dev/null +++ b/po/mai.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: mai\n" + +msgid "System Monitor" +msgstr "सिस्टम मानीटर" diff --git a/po/mg.po b/po/mg.po new file mode 100644 index 0000000..6a588b6 --- /dev/null +++ b/po/mg.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: mg\n" + +msgid "System Monitor" +msgstr "Mpanara-maso ny rafitra" diff --git a/po/mjw.po b/po/mjw.po new file mode 100644 index 0000000..b15ee5a --- /dev/null +++ b/po/mjw.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: mjw\n" + +msgid "System Monitor" +msgstr "System Monitor" + +msgid "Files" +msgstr "Files" diff --git a/po/mk.po b/po/mk.po new file mode 100644 index 0000000..2df79e1 --- /dev/null +++ b/po/mk.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: mk\n" + +msgid "System Monitor" +msgstr "Надгледувач на системот" + +msgid "Files" +msgstr "Датотеки" diff --git a/po/ml.po b/po/ml.po new file mode 100644 index 0000000..c751564 --- /dev/null +++ b/po/ml.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ml\n" + +msgid "System Monitor" +msgstr "സിസ്റ്റം നിരീക്ഷകന്‍" + +msgid "Files" +msgstr "ഫയലുകള്‍" + +msgid "Settings" +msgstr "സജ്ജീകരണങ്ങള്‍" diff --git a/po/mn.po b/po/mn.po new file mode 100644 index 0000000..247a596 --- /dev/null +++ b/po/mn.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: mn\n" + +msgid "System Monitor" +msgstr "Системийн монитор" diff --git a/po/mr.po b/po/mr.po new file mode 100644 index 0000000..6dfff6e --- /dev/null +++ b/po/mr.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: mr\n" + +msgid "System Monitor" +msgstr "प्रणाली मॉनिटर" + +msgid "Files" +msgstr "फाइल्स्" + +msgid "Settings" +msgstr "सेटिंग्ज" diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000..0461d0e --- /dev/null +++ b/po/ms.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ms\n" + +msgid "System Monitor" +msgstr "Pemantau Sistem" + +msgid "Files" +msgstr "Fail" + +msgid "Settings" +msgstr "Tetapan" diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..1c2d662 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: nb\n" + +msgid "System Monitor" +msgstr "Systemmonitor" + +msgid "Files" +msgstr "Filer" + +msgid "Settings" +msgstr "Innstillinger" diff --git a/po/nds.po b/po/nds.po new file mode 100644 index 0000000..c280bc7 --- /dev/null +++ b/po/nds.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: nds\n" + +msgid "System Monitor" +msgstr "Sysmonitor" diff --git a/po/ne.po b/po/ne.po new file mode 100644 index 0000000..1bd9172 --- /dev/null +++ b/po/ne.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ne\n" + +msgid "System Monitor" +msgstr "प्रणाली निगरानी" + +msgid "Files" +msgstr "फाइलहरू" + +msgid "Settings" +msgstr "सेटिङ" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..f1c1c62 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: nl\n" + +msgid "System Monitor" +msgstr "Systeemmonitor" + +msgid "Files" +msgstr "Bestanden" + +msgid "Settings" +msgstr "Instellingen" diff --git a/po/nn.po b/po/nn.po new file mode 100644 index 0000000..78de397 --- /dev/null +++ b/po/nn.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: nn\n" + +msgid "System Monitor" +msgstr "Systemovervakar" + +msgid "Files" +msgstr "Filer" diff --git a/po/oc.po b/po/oc.po new file mode 100644 index 0000000..e5ce514 --- /dev/null +++ b/po/oc.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: oc\n" + +msgid "System Monitor" +msgstr "Monitor sistèma" + +msgid "Files" +msgstr "Fichièrs" + +msgid "Settings" +msgstr "Paramètres" diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000..753a806 --- /dev/null +++ b/po/or.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: or\n" + +msgid "System Monitor" +msgstr "ତନ୍ତ୍ର ପ୍ରଦର୍ଶିକା" + +msgid "Files" +msgstr "ଫାଇଲଗୁଡିକ" + +msgid "Settings" +msgstr "ସେଟିଙ୍ଗଗୁଡିକ" diff --git a/po/pa.po b/po/pa.po new file mode 100644 index 0000000..5d390b4 --- /dev/null +++ b/po/pa.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: pa\n" + +msgid "System Monitor" +msgstr "ਸਿਸਟਮ ਨਿਗਰਾਨ" + +msgid "Files" +msgstr "ਫਾਇਲਾਂ" + +msgid "Settings" +msgstr "ਸੈਟਿੰਗ" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..52f2dfd --- /dev/null +++ b/po/pl.po @@ -0,0 +1,1321 @@ +# Dash to Panel polish translation +# Copyright (c) 2017 Dash to Panel authors. +# This file is distributed under the same license as the Dash to Panel package. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash to Panel\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-11 12:32+0200\n" +"PO-Revision-Date: 2019-10-11 12:34+0200\n" +"Last-Translator: Alex \n" +"Language-Team: \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Góra, ikony wtyczek wyrównane do prawej" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "Lewa, ikony wtyczek wyrównane do prawej" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Góra, ze stałym wyśrodkowaniem ikon wtyczek" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "Lewa, ze stałym wyśrodkowaniem ikon wtyczek" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Góra, ze swobodnym wyśrodkowaniem ikon wtyczek" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "Lewa, ze swobodnym wyśrodkowaniem ikon wtyczek" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Środek, ze stałym wyśrodkowaniem na monitorze" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Środek, z elementami swobodnymi między górą a dołem" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Środek, z elementami swobodnymi między lewą a prawą stroną" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "Górna strona ikon wtyczek" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "Lewa strona ikon wtyczek" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "Dolna strona ikon wtyczek" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "Prawa strona ikon wtyczek" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "Górna strona menu systemowego" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "Lewa strona menu systemowego" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "Dolna strona menu systemowego" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "Prawa strona menu systemowego" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "Górna strona paska zadań" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "Lewa strona paska zadań" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "Dolna strona paska zadań" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "Prawa strona paska zadań" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "Wysokość przycisku Pokaż pulpit (px)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "Szerokość przycisku Pokaż pulpit (px)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Opcje wskaźnika aktywnych programów" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1078 prefs.js:1325 prefs.js:1409 prefs.js:1474 +#: prefs.js:1510 prefs.js:1607 prefs.js:1641 prefs.js:1683 +msgid "Reset to defaults" +msgstr "Przywróć domyślne" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Domyślny (Główny monitor)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Monitor " + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Opcje wielu monitorów" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Opcje dynamicznej przeźroczystości" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Opcje inteligentnego ukrywania" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "Opcje wyświetlania programów" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "Pokaż opcje pulpitu" + +#: prefs.js:1071 +msgid "Window preview options" +msgstr "Opcje podglądu okna" + +#: prefs.js:1318 +msgid "Ungrouped application options" +msgstr "Opcje trybu listy" + +#: prefs.js:1402 +msgid "Customize middle-click behavior" +msgstr "Dostosuj działanie środkowego przycisku myszy" + +#: prefs.js:1467 +msgid "Customize panel scroll behavior" +msgstr "Dostosuj reakcję na przewijanie panelu" + +#: prefs.js:1503 +msgid "Customize icon scroll behavior" +msgstr "Dostosuj reakcję na przewijanie po ikonach" + +#: prefs.js:1600 +msgid "Advanced hotkeys options" +msgstr "Zaawansowane opcje skrótów klawiszowych" + +#: prefs.js:1634 +msgid "Secondary Menu Options" +msgstr "Opcje menu kontekstowego" + +#: prefs.js:1676 Settings.ui.h:223 +msgid "Advanced Options" +msgstr "Opcje zaawansowane" + +#: prefs.js:1763 +msgid "Export settings" +msgstr "Eksportuj ustawienia" + +#: prefs.js:1780 +msgid "Import settings" +msgstr "Importuj ustawienia" + +#: appIcons.js:1380 +msgid "Show Details" +msgstr "Pokaż szczegóły" + +#: appIcons.js:1398 +msgid "New Window" +msgstr "Nowe okno" + +#: appIcons.js:1398 appIcons.js:1458 appIcons.js:1460 Settings.ui.h:10 +msgid "Quit" +msgstr "Zamknięcie okna" + +#: appIcons.js:1460 +msgid "Windows" +msgstr "Okna" + +#: appIcons.js:1684 +msgid "Power options" +msgstr "Opcje zasilania" + +#: appIcons.js:1689 +msgid "Event logs" +msgstr "Zapis zdarzeń" + +#: appIcons.js:1694 +msgid "System" +msgstr "System" + +#: appIcons.js:1699 +msgid "Device Management" +msgstr "Zarządzanie urządzeniami" + +#: appIcons.js:1704 +msgid "Disk Management" +msgstr "Zarządzanie dyskami" + +#: appIcons.js:1711 +msgid "Terminal" +msgstr "Terminal" + +#: appIcons.js:1716 +msgid "System Monitor" +msgstr "Monitor procesów" + +#: appIcons.js:1721 +msgid "Files" +msgstr "Pliki" + +#: appIcons.js:1726 +msgid "Settings" +msgstr "Ustawienia" + +#: appIcons.js:1733 +msgid "Unlock taskbar" +msgstr "Odblokuj pasek zadań" + +#: appIcons.js:1733 +msgid "Lock taskbar" +msgstr "Zablokuj pasek zadań" + +#: appIcons.js:1738 +msgid "Taskbar Settings" +msgstr "Ustawienia pasek zadań" + +#: appIcons.js:1745 +msgid "Restore Windows" +msgstr "Przywróć okna" + +#: appIcons.js:1745 +msgid "Show Desktop" +msgstr "Pokaż pulpit" + +#: update.js:58 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "Wersja %s (%s) jest dostępna" + +#: update.js:59 +msgid "Details" +msgstr "Szczegóły" + +#: update.js:60 +msgid "Update" +msgstr "Aktualizacja" + +#: update.js:63 +msgid "Already up to date" +msgstr "Brak nowszej wersji" + +#: update.js:148 +msgid "Update successful, please log out/in" +msgstr "Aktualizacja zakończona pomyślnie, zaloguj się ponownie" + +#: update.js:149 +msgid "Log out" +msgstr "Wyloguj" + +#: update.js:153 +msgid "Update successful, please restart GNOME Shell" +msgstr "Aktualizacja zakończona pomyślnie, prosimy zrestartować powłokę GNOME" + +#: update.js:154 +msgid "Restart GNOME Shell" +msgstr "Zrestartuj powłokę GNOME" + +#: update.js:154 +msgid "Restarting GNOME Shell..." +msgstr "Restartowanie powłoki GNOME..." + +#: update.js:160 +msgid "Error: " +msgstr "Błąd: " + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Jeszcze nic!" + +#: Settings.ui.h:2 +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:3 +msgid "Shift+Click action" +msgstr "Kliknięcie lewym przyciskiem + Shift" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Przywróć okna" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Zminimalizowanie okna" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Uruchomienie nowego okna" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Przełączanie między oknami" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Przełączanie + zminimalizowanie okien" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Przełącz pojedyncze / Podejrzyj wiele" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Konfiguruje działanie kliknięcia środkowym przyciskiem." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Akcja środkowego przycisku" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "" +"Konfiguruje działanie kliknięcia środkowym przyciskiem z przytrzymanym " +"klawiszem Shift." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Kliknięcie środkowym przyciskiem + Shift" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Niezależne obszary robocze" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Ulubione programy na wszystkich monitorach" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Zegar na wszystkich monitorach" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Menu systemowe na wszystkich monitorach" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Zintegruj elementy menu programów" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Wyświetl szczegóły" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Podświetlaj ikonę aktywnego programu" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Dominujący kolor ikon" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Własny kolor" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Przeźroczystość podświetlenia" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "Wysokość wskaźnika (px)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Kolor wskaźnika - dominujący" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Kolor wskaźnika - nadpisanie motywu" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 otwarte okno (lub tryb listy)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Zastosuj do wszystkich" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 otwarte okna" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 otwarte okna" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4 i więcej otwartych okien" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Użyj innego dla pozostałych" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Wielkość czcionki etykiet (px) (domyślnie 14)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Grubość czcionki tytułów programów" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "dziedzicz po motywie" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "zwykła" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "cieńsza" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "pogrubiona" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "grubsza" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Kolor czcionki" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Maksymalna szerokość (px) etykiet (domyślnie 160)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Stała szerokości" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Wszystkie etykiety ikon będą miały tę samą szerokość, nawet jeśli ich teksty " +"są krótsze niż maksymalna szerokość. Wartość stałej szerokości jest taka, " +"jaka została podana w polu Maksymalna szerokość." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Pokazuj wskaźnik dla otwartych okien drugoplanowych" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "Oddziel ulubione od uruchomionych programów" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Ukryj panel tylko wtedy, gdy jest zasłonięty przez okna " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "Ukrywanie przed oknami" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Wszystkie okna" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Aktywne okna programu" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Zmaksymalizowane okna" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Wymagaj nacisku na krawędzi ekranu, aby odsłonić panel" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Próg nacisku (px)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Czas nacisku (ms)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Pozwól, aby panel został odsłonięty w trybie pełnoekranowym" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Ukryj wyłącznie drugorzędne panele (dla wielu monitorów)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "np. i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Skrót klawiszowy do ukrywania i odsłaniania panelu" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Składnia: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Czas trwania animacji ukrywania i odsłaniania (ms)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Opóźnienie ukrycia panelu (ms)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Opóźnienie przed aktywacją inteligentnego ukrywania (ms)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Opóźnienie (ms) przed pokazaniem (domyślnie 100)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Długość animacji (ms)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Opóźnienie ukrywania miniatur (domyślnie 100 ms)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Natychmiastowo po kliknięciu na ikonę aplikacji" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "" +"Kliknięcie środkowego przycisku myszy na podglądzie zamyka okno programu" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Preferowany rozmiar podglądu okna (px)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Proporcja wysokości podglądu okna" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Wewnętrzny odstęp w podglądzie okien (px)" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "Stałe" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Proporcja szerokości podglądu okna" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Własna przeźroczystość dla tła podglądu okna" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "" +"Jeśli wyłączone, podgląd okna będzie mieć taką samą przeźroczystość jak panel" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Położenie przycisku zamykania i nagłówka" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Dół" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Góra" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Wyświetlaj nagłówek w podglądzie okna" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Wielkość czcionki etykiet (px) etykiet podglądu" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Grubość czcionki etykiet podglądu" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Kolor czcionki etykiet podglądu" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Podgląd okien otwartych programów" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Po najechaniu kursorem na podgląd okna zostanie ono pokazane na tle " +"wszystkich otwartych okien programów." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Opóźnienie wyświetlania (ms)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Czas opóźnienia, po którym wyświetlony zostanie podgląd okien otwartych " +"programów." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Przeźroczystość podglądanych okien" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"Wszystkie okna, za wyjątkiem okna głównego, mają tą samą przeźroczystość." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Opóźnienie między przewijaniem myszą (ms)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "Użyj tą wartość by ograniczyć liczbę przechwyceń przewijania myszą." + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Prefiks dla skrótów klawiszowych" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Skrót może być aktywowany jako Super+Cyfra lub Super+Alt+Cyfra" + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Nigdy" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Przez chwilę" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Zawsze" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Pokazywanie cyfr" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "Podczas używania skrótów klawiszowych wyświetlaj cyfry nad ikonami ." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Opóźnienie ukrywania (ms)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "np. q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Skrót wyświetlający cyfry przez 2 sekundy" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Pokaż podgląd okna po wciśnięciu klawisza skrótu" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Pokaż podgląd, gdy aplikacja ma wiele instancji" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Rząd cyfr" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Klawiatura numeryczna" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "Obie" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Aktywacja skrótów klawiszowych wymaga" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "" +"Zaznacz które klawisze cyfr mają być używane do aktywacji skrótów " +"klawiszowych" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Aktualna ikona przycisku Pokaż programy" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Wybierz ikonę przycisku Pokaż programy" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Wybierz własną ikonę przycisku Pokaż programy" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "Wewnętrzny margines przycisku Pokaż programy (px)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Pokaż pulpit po najechaniu na przycisk Pokaż pulpit" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Opóźnienie przed ujawnieniem pulpitu (ms)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Opóźnienie ukrywania (ms)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "Przezroczystość panelu zależy od" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Zmień przezroczystość, gdy okno jest bliżej niż (px)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Zmień przeźroczystość na (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Czas trwania animacji przeźroczystości (ms)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Położenie panelu na ekranie" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "Lewo" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "Prawo" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Położenie paska zadań" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Położenie zegara" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "Wyświetl główny panel na" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Wyświetl panel na wszystkich monitorach" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Inteligentne ukrywanie panelu" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "Ukryj i odsłoń panel według preferencji" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Położenie" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Rozmiar panelu\n" +"(domyślnie 48)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Odstęp między\n" +"ikonami (domyślnie 8)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Wypełnienie wnętrza\n" +"ikony (domyślnie 4)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Pozycja wskaźnika aktywnych okien" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Wygląd wskaźnika (okno na pierwszym planie)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Kropki" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Kwadraty" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Kreski" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Segmenty" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Ciągły" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Wygląd wskaźnika (okno na drugim planie)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "Zastąp kolor panelu " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "Zastąp przeźroczystość panelu" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Przeźroczystość panelu (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Dynamiczna przeźroczystość" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "Zmiana przeźroczystości w kontakcie z oknem" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "Zastąp kolor panelu gradientem " + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Góra, kolor i przeźroczystość (%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Dół, kolor i przeźroczystość (%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Wygląd" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Pokaż ulubione programy" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Pokaż uruchomione programy" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Pokaż ikonę Programy" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Animuj pokazanie programów." + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Pokaż przycisk Podgląd" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Pokaż przycisk Pulpit" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Pokaż przycisk Menu programu" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "Górny pasek > Menu programu - musi być włączone w Dostrajanie" + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Pokaż podgląd okna po najechaniu myszą" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Pokaż szczegóły po najechaniu myszą" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Niezależne obszary robocze" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Tryb listy (nie scalaj ikon)" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Reakcja" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Reakcja na kliknięcie ikony aktywnego programu." + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "Działanie kliknięcia" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Przełącz okna" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Działanie przewijania na panelu" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Reakcja na przewijanie myszą nad panelem." + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Działanie przewijania na ikonie" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Reakcja na przewijanie myszą nad ikoną programu." + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "Nic nie rób" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Przełącz ekran roboczy" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Przełącz między oknami" + +#: Settings.ui.h:205 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Konfigurowanie skrótów uruchamiania programów\n" +"Super+(0-9) - możliwe użycie razem z Shift i Ctrl." + +#: Settings.ui.h:206 +msgid "Use hotkeys to activate apps" +msgstr "Skróty klawiszowe uruchamiania programów" + +#: Settings.ui.h:207 +msgid "Action" +msgstr "Działanie" + +#: Settings.ui.h:208 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Rozmiar czcionki zasobnika\n" +"(0 - domyślne motywu)" + +#: Settings.ui.h:210 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Rozmiar czcionki lewej strony panelu\n" +"(0 - domyślne motywu)" + +#: Settings.ui.h:212 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Odstęp elementów zasobnika\n" +"(-1 - domyślne motywu)" + +#: Settings.ui.h:214 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Odstęp elementów menu systemowego\n" +"(-1 - domyślne motywu)" + +#: Settings.ui.h:216 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Odstęp elementów lewej strony panelu\n" +"(-1 - domyślne motywu)" + +#: Settings.ui.h:218 +msgid "Animate switching applications" +msgstr "Animuj przełączenie programów" + +#: Settings.ui.h:219 +msgid "Animate launching new windows" +msgstr "Animuj uruchamianie nowych programów" + +#: Settings.ui.h:220 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Zachowaj oryginalny panel (podgląd)" + +#: Settings.ui.h:221 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "" +"Aktywuj przyciski menu panelu (np. menu kalendarza) tylko po kliknięciu" + +#: Settings.ui.h:222 +msgid "App icon secondary (right-click) menu" +msgstr "Menu kontekstowe programu (prawy przycisk myszy)" + +#: Settings.ui.h:224 +msgid "Fine-Tune" +msgstr "Dostrajanie" + +#: Settings.ui.h:225 +msgid "version: " +msgstr "wersja: " + +#: Settings.ui.h:226 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:227 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Użyj poniższych przycisków, aby utworzyć plik ustawień bieżącychpreferencji, " +"które można zaimportować na innym komputerze." + +#: Settings.ui.h:228 +msgid "Export and import settings" +msgstr "Ustawienia eksportu i importu" + +#: Settings.ui.h:229 +msgid "Export to file" +msgstr "Eksportuj do pliku" + +#: Settings.ui.h:230 +msgid "Import from file" +msgstr "Importuj z pliku" + +#: Settings.ui.h:231 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "" +"Ta opcja pozwala ci na zaktualizowanie wtyczki bezpośrednio z repozytorium " +"GitHub." + +#: Settings.ui.h:232 +msgid "Updates" +msgstr "Aktualizacje" + +#: Settings.ui.h:233 +msgid "Periodically check for updates" +msgstr "Sprawdzaj regularnie dostępność aktualizacji" + +#: Settings.ui.h:234 +msgid "Check now" +msgstr "Sprawdź teraz" + +#: Settings.ui.h:235 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Bądź świadom, że te oficjalne " +"wydania Dash to Panel mogły jeszcze nie przejść weryfikacji na extensions." +"gnome.org! Więcej " +"informacji" + +#: Settings.ui.h:236 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Tego programu nie obejmuje ABSOLUTNIE ŻADNA GWARANCJA.\n" +"Więcej informacji można znaleźć w licencji GNU General Public License, wersja 2 " +"lub nowsza." + +#: Settings.ui.h:238 +msgid "About" +msgstr "Informacje" + +#~ msgid "Highlight color" +#~ msgstr "Kolor podświetlenia" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Opóźnienie wygaszenia podglądu po opuszczeniu ikony (ms)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Ustawienie zbyt małej wartości może spowodować, że pogląd okien może " +#~ "zamykać się zbyt szybko, natomiast za duża wartość spowoduje długi czas " +#~ "wyświetlania podglądu po przejściu do sąsiedniej ikony." + +#~ msgid "Middle click to close window" +#~ msgstr "Zamknięcie okna poprzez kliknięcie środkowego przycisku" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Szerokość miniatury (px)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Wysokość miniatury (px)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Odstęp między miniaturami (px)" + +msgid "Weekday" +msgstr "Dzień tygodnia" + +msgid "Date" +msgstr "Data" + +msgid "Seconds" +msgstr "Sekundy" diff --git a/po/ps.po b/po/ps.po new file mode 100644 index 0000000..0f572c5 --- /dev/null +++ b/po/ps.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ps\n" + +msgid "System Monitor" +msgstr "غونډال ليدانی" diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 0000000..31eb000 --- /dev/null +++ b/po/pt.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: pt\n" + +msgid "System Monitor" +msgstr "Monitor de sistema" + +msgid "Files" +msgstr "Ficheiros" + +msgid "Settings" +msgstr "Definições" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..e85ddc1 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,475 @@ +# Dash to panel. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# F�bio Nogueira , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-04-16 22:54-0300\n" +"PO-Revision-Date: 2017-09-15 11:03-0300\n" +"Last-Translator: Fábio Nogueira \n" +"Language-Team: \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.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: appIcons.js:918 +msgid "Show Details" +msgstr "Exibir detalhes" + +#: appIcons.js:937 +msgid "New Window" +msgstr "Nova janela" + +#: appIcons.js:937 appIcons.js:998 appIcons.js:1000 Settings.ui.h:8 +msgid "Quit" +msgstr "Sair" + +#: appIcons.js:1000 +msgid "Windows" +msgstr "Janelas" + +#: appIcons.js:1159 +msgid "Taskbar Settings" +msgstr "Configurações da barra de tarefas" + +#: appIcons.js:1166 +msgid "Restore Windows" +msgstr "Restaurar janelas" + +#: appIcons.js:1166 +msgid "Show Desktop" +msgstr "Exibir área de trabalho" + +#: prefs.js:266 +msgid "Running Indicator Options" +msgstr "Opções do indicador de execução" + +#: prefs.js:273 prefs.js:433 prefs.js:498 prefs.js:566 prefs.js:608 +msgid "Reset to defaults" +msgstr "Restaurar o padrão" + +#: prefs.js:426 +msgid "Customize middle-click behavior" +msgstr "Personalizar o comportamento do clique-do-meio" + +#: prefs.js:491 +msgid "Advanced hotkeys options" +msgstr "Opções avançadas das teclas de atalho" + +#: prefs.js:559 +msgid "Secondary Menu Options" +msgstr "Opções do menu secundário" + +#: prefs.js:601 Settings.ui.h:85 +msgid "Advanced Options" +msgstr "Opções avançadas" + +#: Settings.ui.h:1 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Quando definido para minimizar, clicando duas vezes minimiza todas as " +"janelas da aplicação." + +#: Settings.ui.h:2 +msgid "Shift+Click action" +msgstr "Ação do Shift+clique" + +#: Settings.ui.h:3 +msgid "Raise window" +msgstr "Elevar a janela" + +#: Settings.ui.h:4 +msgid "Minimize window" +msgstr "Minimizar a janela" + +#: Settings.ui.h:5 +msgid "Launch new instance" +msgstr "Carregar nova instância" + +#: Settings.ui.h:6 +msgid "Cycle through windows" +msgstr "Percorrer as janelas" + +#: Settings.ui.h:7 +msgid "Cycle windows + minimize" +msgstr "Percorrer as janelas + minimizar" + +#: Settings.ui.h:9 +msgid "Behavior for Middle-Click." +msgstr "Comportamento do clique-do-meio." + +#: Settings.ui.h:10 +msgid "Middle-Click action" +msgstr "Ação do clique-do-meio" + +#: Settings.ui.h:11 +msgid "Behavior for Shift+Middle-Click." +msgstr "Comportamento para o Shift+Clique-do-meio." + +#: Settings.ui.h:12 +msgid "Shift+Middle-Click action" +msgstr "Ação do Shift+Clique-do-meio" + +#: Settings.ui.h:13 +msgid "Integrate AppMenu items" +msgstr "Itens integrados ao Menu de aplicativos" + +#: Settings.ui.h:14 +msgid "Show Details menu item" +msgstr "Item do menu Exibir detalhes" + +#: Settings.ui.h:15 +msgid "Highlight focused application" +msgstr "Destaque para o aplicativo em foco" + +#: Settings.ui.h:16 +msgid "Height (px)" +msgstr "Altura (px)" + +#: Settings.ui.h:17 +msgid "0" +msgstr "0" + +#: Settings.ui.h:18 +msgid "Color - Override Theme" +msgstr "Cor - Tema de sobreposição" + +#: Settings.ui.h:19 +msgid "1 window open" +msgstr "1 janela aberta" + +#: Settings.ui.h:20 +msgid "Apply to all" +msgstr "Aplicar para tudo" + +#: Settings.ui.h:21 +msgid "2 windows open" +msgstr "2 janelas abertas" + +#: Settings.ui.h:22 +msgid "3 windows open" +msgstr "3 janelas abertas" + +#: Settings.ui.h:23 +msgid "4+ windows open" +msgstr "4 ou + janelas abertas" + +#: Settings.ui.h:24 +msgid "Use different for unfocused" +msgstr "Utilizar uma diferente para o que não está focado" + +#: Settings.ui.h:25 +msgid "Preview timeout on icon leave (ms)" +msgstr "Tempo limite de pré-visualização sobre o ícone sair (ms)" + +#: Settings.ui.h:26 +msgid "" +"If set too low, the window preview of running applications may seem to close " +"too quickly when trying to enter the popup. If set too high, the preview may " +"linger too long when moving to an adjacent icon." +msgstr "" +"Se definido como muito baixo, a pré-visualização da janela de aplicativos em " +"execução pode fechar muito rapidamente ao tentar inserir o pop-up. Se " +"definido como muito alto, a visualização pode demorar muito tempo ao mover-" +"se para um ícone adjacente." + +#: Settings.ui.h:27 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:28 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:29 +msgid "Hotkeys prefix" +msgstr "Prefixo das teclas de atalho" + +#: Settings.ui.h:30 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "As teclas de atalho serão Super+Número ou Super+Alt+Número" + +#: Settings.ui.h:31 +msgid "Number overlay" +msgstr "Sobreposição de número" + +#: Settings.ui.h:32 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Exibe temporariamente os números das aplicações sobre os ícones ao usar as " +"teclas de atalho." + +#: Settings.ui.h:33 +msgid "Hide timeout (ms)" +msgstr "Ocultar tempo limite (ms)" + +#: Settings.ui.h:34 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Atalho para exibir a sobreposição por 2 segundos" + +#: Settings.ui.h:35 +msgid "Syntax: , , , " +msgstr "Sintaxe: , , , " + +#: Settings.ui.h:36 +msgid "Panel screen position" +msgstr "Posição da tela do painel" + +#: Settings.ui.h:37 +msgid "Bottom" +msgstr "Embaixo" + +#: Settings.ui.h:38 +msgid "Top" +msgstr "Topo" + +#: Settings.ui.h:39 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Tamanho do painel\n" +"(O padrão é 48)" + +#: Settings.ui.h:41 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Margem do ícone do Aplicativo\n" +"(O padrão é 8)" + +#: Settings.ui.h:43 +msgid "Running indicator position" +msgstr "Posição do indicador de execução" + +#: Settings.ui.h:44 +msgid "Running indicator style (Focused app)" +msgstr "Estilo do indicador de execução (Aplicativo em foco)" + +#: Settings.ui.h:45 +msgid "Dots" +msgstr "Pontos" + +#: Settings.ui.h:46 +msgid "Squares" +msgstr "Quadrados" + +#: Settings.ui.h:47 +msgid "Dashes" +msgstr "Traços" + +#: Settings.ui.h:48 +msgid "Segmented" +msgstr "Segmentado" + +#: Settings.ui.h:49 +msgid "Solid" +msgstr "Sólido" + +#: Settings.ui.h:50 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:51 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:52 +msgid "Running indicator style (Unfocused apps)" +msgstr "Estilo do indicador de execução (Aplicativos fora de foco)" + +#: Settings.ui.h:53 +msgid "Clock location" +msgstr "Local do relógio" + +#: Settings.ui.h:54 +msgid "Natural" +msgstr "Natural" + +#: Settings.ui.h:55 +msgid "Left of status menu" +msgstr "Esquerda do menu de status" + +#: Settings.ui.h:56 +msgid "Right of status menu" +msgstr "Direita do menu de status" + +#: Settings.ui.h:57 +msgid "Position and Style" +msgstr "Posição e Estilo" + +#: Settings.ui.h:58 +msgid "Show Applications icon" +msgstr "Mostrar ícone Aplicativos" + +#: Settings.ui.h:59 +msgid "Animate Show Applications." +msgstr "Mostrar aplicativos animado." + +#: Settings.ui.h:60 +msgid "Show Activities button" +msgstr "Mostrar botão Atividades" + +#: Settings.ui.h:61 +msgid "Show Desktop button" +msgstr "Mostrar botão Área de trabalho" + +#: Settings.ui.h:62 +msgid "Show AppMenu button" +msgstr "Mostrar botão Menu de aplicativos" + +#: Settings.ui.h:63 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Barra superior > Mostrar o Menu do aplicativos deve ser ativado na " +"Ferramenta de ajustes do GNOME" + +#: Settings.ui.h:64 +msgid "Show window previews on hover" +msgstr "Mostrar pré-visulização da janela ao pairar" + +#: Settings.ui.h:65 +msgid "Time (ms) before showing (100 is default)" +msgstr "Tempo (ms) antes de exibir (100 é o padrão)" + +#: Settings.ui.h:66 +msgid "Isolate Workspaces" +msgstr "Isolar Espaços de trabalho" + +#: Settings.ui.h:67 +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:68 +msgid "Click action" +msgstr "Ação do clique" + +#: Settings.ui.h:69 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Habilita o Super+(0-9) como atalho para os aplicativos. Isto pode ser usado " +"junto com Shift e Ctrl." + +#: Settings.ui.h:70 +msgid "Use hotkeys to activate apps" +msgstr "Utilizar teclas de atalho para ativar os aplicativos" + +#: Settings.ui.h:71 +msgid "Behavior" +msgstr "Comportamento" + +#: Settings.ui.h:72 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Tamanho da fonte da bandeja\n" +"(0 = padrão do tema)" + +#: Settings.ui.h:74 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Tamanho da fonte da caixa da esquerda\n" +"(0 = padrão do tema)" + +#: Settings.ui.h:76 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Preenchimento do ítem da bandeja\n" +"(-1 = padrão do tema)" + +#: Settings.ui.h:78 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Preenchimento do ícone de status\n" +"(-1 = padrão do tema)" + +#: Settings.ui.h:80 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Preenchimento da caixa da esquerda\n" +"(-1 = padrão do tema)" + +#: Settings.ui.h:82 +msgid "Animate switching applications" +msgstr "Animar alternações dos aplicativos" + +#: Settings.ui.h:83 +msgid "Animate launching new windows" +msgstr "Carregamento animado de novas janelas" + +#: Settings.ui.h:84 +msgid "App icon secondary (right-click) menu" +msgstr "Ícone do aplicativo do menu secundário (clique-direito)" + +#: Settings.ui.h:86 +msgid "Fine-Tune" +msgstr "Sintonia fina" + +#: Settings.ui.h:87 +msgid "version: " +msgstr "versão: " + +#: Settings.ui.h:88 +msgid "Github" +msgstr "Github" + +#: Settings.ui.h:89 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Este programa vem com ABSOLUTAMENTE NENHUMA GARANTIA.\n" +"Veja a Licença Pública Geral GNU, versão 2 ou posterior para maiores " +"detalhes." + +#: Settings.ui.h:91 +msgid "About" +msgstr "Sobre" + +#~ msgid "Panel Size" +#~ msgstr "Tamanho do painel" + +#~ msgid "Appearance" +#~ msgstr "Aparência" + +msgid "Weekday" +msgstr "Dia de semana" + +msgid "Date" +msgstr "Data" + +msgid "Seconds" +msgstr "Segundos" + +msgid "System Monitor" +msgstr "Monitor do sistema" + +msgid "Files" +msgstr "Arquivos" + +msgid "Settings" +msgstr "Configurações" diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000..6052606 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ro\n" + +msgid "System Monitor" +msgstr "Monitor de sistem" + +msgid "Files" +msgstr "Fișiere" + +msgid "Settings" +msgstr "Configurări" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..2e14ac5 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,1419 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2017 +# This file is distributed under the same license as the PACKAGE package. +# Alex Gluck , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-06 08:17-0300\n" +"PO-Revision-Date: 2020-11-06 13:38-0300\n" +"Last-Translator: vantu5z \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" +"X-Generator: Poedit 2.4.1\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:206 +msgid "Show Desktop button height (px)" +msgstr "Высота кнопки \"Рабочий стол\" (в пикселях)" + +#: prefs.js:206 +msgid "Show Desktop button width (px)" +msgstr "Ширина кнопки \"Рабочий стол\" (в пикселях)" + +#: prefs.js:218 +msgid "Unavailable when gnome-shell top panel is present" +msgstr "Недоступно, если включена верхняя панель GNOME" + +#: prefs.js:293 +msgid "Show Applications button" +msgstr "Кнопка \"Приложения\"" + +#: prefs.js:294 +msgid "Activities button" +msgstr "Кнопка \"Обзор\"" + +#: prefs.js:295 +msgid "Taskbar" +msgstr "Панель задач" + +#: prefs.js:296 +msgid "Date menu" +msgstr "Дата и время" + +#: prefs.js:297 +msgid "System menu" +msgstr "Системное меню" + +#: prefs.js:298 +msgid "Left box" +msgstr "Левый блок" + +#: prefs.js:299 +msgid "Center box" +msgstr "Центральный блок" + +#: prefs.js:300 +msgid "Right box" +msgstr "Правый блок" + +#: prefs.js:301 +msgid "Desktop button" +msgstr "Кнопка \"Рабочий стол\"" + +#: prefs.js:307 +msgid "Move up" +msgstr "Переместить выше" + +#: prefs.js:309 +msgid "Move down" +msgstr "Переместить ниже" + +#: prefs.js:311 +msgid "Visible" +msgstr "Видимый" + +#: prefs.js:312 +msgid "Select element position" +msgstr "Выбор позиции элемента" + +#: prefs.js:323 +msgid "Stacked to top" +msgstr "Сверху" + +#: prefs.js:323 +msgid "Stacked to left" +msgstr "Слева" + +#: prefs.js:324 +msgid "Stacked to bottom" +msgstr "Снизу" + +#: prefs.js:324 +msgid "Stacked to right" +msgstr "Справа" + +#: prefs.js:325 +msgid "Centered" +msgstr "По центру" + +#: prefs.js:326 +msgid "Monitor Center" +msgstr "Центр монитора" + +#: prefs.js:345 +msgid "More options" +msgstr "Дополнительные параметры" + +#: prefs.js:369 +msgid "Show Applications options" +msgstr "Настройка меню \"Приложения\"" + +#: prefs.js:376 prefs.js:433 prefs.js:576 prefs.js:894 prefs.js:1037 +#: prefs.js:1164 prefs.js:1450 prefs.js:1545 prefs.js:1610 prefs.js:1653 +#: prefs.js:1750 prefs.js:1784 prefs.js:1826 +msgid "Reset to defaults" +msgstr "По умолчанию" + +#: prefs.js:426 +msgid "Show Desktop options" +msgstr "Настройки кнопки \"Рабочий стол\"" + +#: prefs.js:569 +msgid "Running Indicator Options" +msgstr "Параметры индикации запущенных приложений" + +#: prefs.js:732 +msgid "Primary monitor" +msgstr "Основной монитор" + +#: prefs.js:732 +msgid "Monitor " +msgstr "Монитор " + +#: prefs.js:887 +msgid "Dynamic opacity options" +msgstr "Настройки динамической прозрачности" + +#: prefs.js:1030 +msgid "Intellihide options" +msgstr "Настройки автоскрытия" + +#: prefs.js:1157 +msgid "Window preview options" +msgstr "Настройки предпросмотра" + +#: prefs.js:1443 +msgid "Ungrouped application options" +msgstr "Отображение разгруппированных приложений" + +#: prefs.js:1538 +msgid "Customize middle-click behavior" +msgstr "Средняя кнопка мышки" + +#: prefs.js:1603 +msgid "Customize panel scroll behavior" +msgstr "Прокручивание панелей" + +#: prefs.js:1646 +msgid "Customize icon scroll behavior" +msgstr "Прокручивание значков" + +#: prefs.js:1743 +msgid "Advanced hotkeys options" +msgstr "Расширенные настройки горячих клавиш" + +#: prefs.js:1777 +msgid "Secondary Menu Options" +msgstr "Дополнительные настройки меню" + +#: prefs.js:1819 Settings.ui.h:230 +msgid "Advanced Options" +msgstr "Расширенные настройки" + +#: prefs.js:1922 +msgid "Export settings" +msgstr "Сохранение" + +#: prefs.js:1939 +msgid "Import settings" +msgstr "Загрузка" + +#: appIcons.js:1418 +msgid "Show Details" +msgstr "Показать подробности" + +#: appIcons.js:1436 +msgid "New Window" +msgstr "Новое окно" + +#: appIcons.js:1436 appIcons.js:1496 appIcons.js:1498 Settings.ui.h:10 +msgid "Quit" +msgstr "Выйти" + +#: appIcons.js:1498 +msgid "Windows" +msgstr "Окна" + +#: appIcons.js:1847 +msgid "Unlock taskbar" +msgstr "Открепить список задач" + +#: appIcons.js:1847 +msgid "Lock taskbar" +msgstr "Закрепить список задач" + +#: appIcons.js:1852 +msgid "Taskbar Settings" +msgstr "Настройки списка задач" + +#: appIcons.js:1865 +msgid "Restore Windows" +msgstr "Восстановить окна" + +#: appIcons.js:1865 +msgid "Show Desktop" +msgstr "Свернуть всё" + +#: update.js:48 +msgid "Unavailable when installed from extensions.gnome.org" +msgstr "Недоступно, если установлено из extensions.gnome.org" + +#: update.js:62 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "Доступна версия %s (%s)" + +#: update.js:63 +msgid "Details" +msgstr "Подробнее" + +#: update.js:64 +msgid "Update" +msgstr "Обновление" + +#: update.js:67 +msgid "Already up to date" +msgstr "Обновлений нет" + +#: update.js:75 +msgid "Error: " +msgstr "Ошибка: " + +#: update.js:168 +msgid "Update successful, please log out/in" +msgstr "Обновление успешно, перезайдите в систему" + +#: update.js:169 +msgid "Log out" +msgstr "Выход из системы" + +#: update.js:173 +msgid "Update successful, please restart GNOME Shell" +msgstr "Обновление успешно, перезапустите GNOME Shell" + +#: update.js:174 +msgid "Restart GNOME Shell" +msgstr "Перезапуск GNOME Shell" + +#: update.js:174 +msgid "Restarting GNOME Shell..." +msgstr "Перезапускаем GNOME Shell..." + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Пока пусто!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Если выбрано \"Свернуть окно\", двойной щелчок сворачивает все окна " +"приложения." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Действия для Shift+Щелчок" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Показать окно приложения" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Свернуть окно" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Запустить ещё одну копию" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Переключение между окнами" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Переключение между окнами + Свернуть" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Переключить одно / Просмотр нескольких" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Поведение для средней кнопки мыши." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Действие на нажатие средней кнопки" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Поведение для Shift+средняя_кнопка." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Действие на нажатие Shift+средняя_кнопка" + +#: Settings.ui.h:15 +msgid "Integrate AppMenu items" +msgstr "Интегрировать Меню Приложения" + +#: Settings.ui.h:16 +msgid "Show Details menu item" +msgstr "Меню Показать детали" + +#: Settings.ui.h:17 +msgid "Highlight focused application" +msgstr "Подсвечивать приложение в фокусе" + +#: Settings.ui.h:18 +msgid "Icon dominant color" +msgstr "Основной цвет значка" + +#: Settings.ui.h:19 +msgid "Custom color" +msgstr "Задать цвет" + +#: Settings.ui.h:20 +msgid "Highlight opacity" +msgstr "Прозрачность подсветки" + +#: Settings.ui.h:21 +msgid "Indicator size (px)" +msgstr "Размер индикатора (в пикселях)" + +#: Settings.ui.h:22 +msgid "Indicator color - Icon Dominant" +msgstr "Цвет индикатора по основному цвету значка" + +#: Settings.ui.h:23 +msgid "Indicator color - Override Theme" +msgstr "Переназначить цвета темы" + +#: Settings.ui.h:24 +msgid "1 window open (or ungrouped)" +msgstr "Когда одно окно открыто (или не сгруппировано)" + +#: Settings.ui.h:25 +msgid "Apply to all" +msgstr "Применить ко всем" + +#: Settings.ui.h:26 +msgid "2 windows open" +msgstr "Когда два окна открыто" + +#: Settings.ui.h:27 +msgid "3 windows open" +msgstr "Когда три окна открыто" + +#: Settings.ui.h:28 +msgid "4+ windows open" +msgstr "Когда четыре+ окна открыто" + +#: Settings.ui.h:29 +msgid "Use different for unfocused" +msgstr "Использовать другой когда не в фокусе" + +#: Settings.ui.h:30 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Размер шрифта (в пикселях) заголовка приложений (по умолчанию 14)" + +#: Settings.ui.h:31 +msgid "Font weight of application titles" +msgstr "Жирность шрифта заголовка приложений" + +#: Settings.ui.h:32 +msgid "inherit from theme" +msgstr "значение из темы" + +#: Settings.ui.h:33 +msgid "normal" +msgstr "средний" + +#: Settings.ui.h:34 +msgid "lighter" +msgstr "узкий" + +#: Settings.ui.h:35 +msgid "bold" +msgstr "жирный" + +#: Settings.ui.h:36 +msgid "bolder" +msgstr "самый жирный" + +#: Settings.ui.h:37 +msgid "Font color of the application titles" +msgstr "Цвет шрифта заголовка приложений" + +#: Settings.ui.h:38 +msgid "Font color of the minimized application titles" +msgstr "Цвет шрифта заголовка свернутых приложений" + +#: Settings.ui.h:39 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "" +"Максимальная ширина (в пикселях) заголовка приложений (по умолчанию 160)" + +#: Settings.ui.h:40 +msgid "Use a fixed width for the application titles" +msgstr "Использовать фиксированную ширину заголовков" + +#: Settings.ui.h:41 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Заголовки приложений имеют одинаковую ширину, даже если они короче " +"максимальной ширины. Максимальное значение ширины используется как " +"фиксированная ширина." + +#: Settings.ui.h:42 +msgid "Display running indicators on unfocused applications" +msgstr "Индикатор запущенного приложения, когда окно не в фокусе" + +#: Settings.ui.h:43 +msgid "Use the favorite icons as application launchers" +msgstr "Показывать избранные приложения" + +#: Settings.ui.h:44 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Скрывать только при наложении окон " + +#: Settings.ui.h:45 +msgid "The panel hides from" +msgstr "Скрывать панель с" + +#: Settings.ui.h:46 +msgid "All windows" +msgstr "Все окна" + +#: Settings.ui.h:47 +msgid "Focused windows" +msgstr "Окна в фокусе" + +#: Settings.ui.h:48 +msgid "Maximized windows" +msgstr "Развернутые окна" + +#: Settings.ui.h:49 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Требуется давление на краю экрана, чтобы открыть панель" + +#: Settings.ui.h:50 +msgid "Required pressure threshold (px)" +msgstr "Область у границы для показа панели (в пикселях)" + +#: Settings.ui.h:51 +msgid "Required pressure timeout (ms)" +msgstr "Задержка показа при приближении к краю (в мс)" + +#: Settings.ui.h:52 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Разрешить отображение панели в полноэкранном режиме" + +#: Settings.ui.h:53 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "" +"Скрывать дополнительные панели (требуется показ на нескольких мониторах)" + +#: Settings.ui.h:54 +msgid "e.g. i" +msgstr "например, i" + +#: Settings.ui.h:55 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Комбинация клавиш для показа панели" + +#: Settings.ui.h:56 +msgid "Syntax: , , , " +msgstr "Синтакс: , , , " + +#: Settings.ui.h:57 +msgid "Hide and reveal animation duration (ms)" +msgstr "Длительность анимации (в мс)" + +#: Settings.ui.h:58 +msgid "Delay before hiding the panel (ms)" +msgstr "Задержка перед скрытием панели (в мс)" + +#: Settings.ui.h:59 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Задержка на скрытие при запуске (в мс)" + +#: Settings.ui.h:60 +msgid "Time (ms) before showing (400 is default)" +msgstr "Задержка (в мс) перед показом (400 по умолчанию)" + +#: Settings.ui.h:61 +msgid "Animation time (ms)" +msgstr "Время анимации (в мс)" + +#: Settings.ui.h:62 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Задержка (в мс) перед скрытием (100 по умолчанию)" + +#: Settings.ui.h:63 +msgid "Immediate on application icon click" +msgstr "Сразу по переходу в приложение" + +#: Settings.ui.h:64 +msgid "Middle click on the preview to close the window" +msgstr "Нажатие средней кнопкой по предпросмотру закрывает окно" + +#: Settings.ui.h:65 +msgid "Window previews preferred size (px)" +msgstr "Предпочитаемый размер окна предпросмотра (пикселей)" + +#: Settings.ui.h:66 +msgid "Window previews aspect ratio Y (height)" +msgstr "Коэффициент по оси Y (высота)" + +#: Settings.ui.h:67 +msgid "Window previews padding (px)" +msgstr "Отступ окон между собой (пикселей)" + +#: Settings.ui.h:68 +msgid "1" +msgstr "1" + +#: Settings.ui.h:69 +msgid "2" +msgstr "2" + +#: Settings.ui.h:70 +msgid "3" +msgstr "3" + +#: Settings.ui.h:71 +msgid "4" +msgstr "4" + +#: Settings.ui.h:72 +msgid "5" +msgstr "5" + +#: Settings.ui.h:73 +msgid "6" +msgstr "6" + +#: Settings.ui.h:74 +msgid "7" +msgstr "7" + +#: Settings.ui.h:75 +msgid "8" +msgstr "8" + +#: Settings.ui.h:76 +msgid "9" +msgstr "9" + +#: Settings.ui.h:77 +msgid "10" +msgstr "10" + +#: Settings.ui.h:78 +msgid "11" +msgstr "11" + +#: Settings.ui.h:79 +msgid "12" +msgstr "12" + +#: Settings.ui.h:80 +msgid "13" +msgstr "13" + +#: Settings.ui.h:81 +msgid "14" +msgstr "14" + +#: Settings.ui.h:82 +msgid "15" +msgstr "15" + +#: Settings.ui.h:83 +msgid "16" +msgstr "16" + +#: Settings.ui.h:84 +msgid "17" +msgstr "17" + +#: Settings.ui.h:85 +msgid "18" +msgstr "18" + +#: Settings.ui.h:86 +msgid "19" +msgstr "19" + +#: Settings.ui.h:87 +msgid "20" +msgstr "20" + +#: Settings.ui.h:88 +msgid "21" +msgstr "21" + +#: Settings.ui.h:89 +msgid "Fixed" +msgstr "Закреплено" + +#: Settings.ui.h:90 +msgid "Window previews aspect ratio X (width)" +msgstr "Коэффициент по оси Y (ширина)" + +#: Settings.ui.h:91 +msgid "Use custom opacity for the previews background" +msgstr "Использовать прозрачность для окна предпросмотра" + +#: Settings.ui.h:92 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "Если отключено используется прозрачность из настроек панели" + +#: Settings.ui.h:93 +msgid "Close button and header position" +msgstr "Кнопка закрытия и заголовок" + +#: Settings.ui.h:94 +msgid "Bottom" +msgstr "Внизу" + +#: Settings.ui.h:95 +msgid "Top" +msgstr "Наверху" + +#: Settings.ui.h:96 +msgid "Display window preview headers" +msgstr "Показать заголовок окна" + +#: Settings.ui.h:97 +msgid "Icon size (px) of the window preview" +msgstr "Размер значка (в пикселях) в окне предпросмотра" + +#: Settings.ui.h:98 +msgid "If disabled, the previews icon size will be based on headerbar size" +msgstr "Если отключено будет использован размер значков по размеру заголовка" + +#: Settings.ui.h:99 +msgid "Font size (px) of the preview titles" +msgstr "Размер шрифта (в пикселях) для заголовка" + +#: Settings.ui.h:100 +msgid "Font weight of the preview titles" +msgstr "Жирность шрифта заголовка" + +#: Settings.ui.h:101 +msgid "Font color of the preview titles" +msgstr "Цвет шрифта заголовка" + +#: Settings.ui.h:102 +msgid "Enable window peeking" +msgstr "Переводить окно на передний план" + +#: Settings.ui.h:103 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "Выделение окна приложения при наведении на окно предпросмотра," + +#: Settings.ui.h:104 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Задержка перед помещением окна на передний план (в мс)" + +#: Settings.ui.h:105 +msgid "50" +msgstr "50" + +#: Settings.ui.h:106 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Время бездействия при наведении указателя на окно предпросмотра для перевода " +"окна на передний план." + +#: Settings.ui.h:107 +msgid "Window peeking mode opacity" +msgstr "Режим прозрачности выделенного окна" + +#: Settings.ui.h:108 +msgid "0" +msgstr "0" + +#: Settings.ui.h:109 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "Все окна, кроме выделенного, имеют прозрачность." + +#: Settings.ui.h:110 +msgid "Delay between mouse scroll events (ms)" +msgstr "Задержка между событиями вращения колесика мышки (мс)" + +#: Settings.ui.h:111 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "" +"Это значение ограничивает количество получаемых сообщений вращения колесика " +"мышки." + +#: Settings.ui.h:112 +msgid "Show popup when changing workspace" +msgstr "" + +#: Settings.ui.h:113 +msgid "This affects workspace popup when scrolling on the panel only." +msgstr "" + +#: Settings.ui.h:114 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:115 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:116 +msgid "Hotkeys prefix" +msgstr "Префикс горячих клавиш" + +#: Settings.ui.h:117 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "" +"Комбинации клавиш для приложений на панели либо Super+Number, либо Super+Alt" +"+Num" + +#: Settings.ui.h:118 +msgid "Never" +msgstr "Никогда" + +#: Settings.ui.h:119 +msgid "Show temporarily" +msgstr "Показать временно" + +#: Settings.ui.h:120 +msgid "Always visible" +msgstr "Всегда видимый" + +#: Settings.ui.h:121 +msgid "Number overlay" +msgstr "Наложение цифр" + +#: Settings.ui.h:122 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Временно показывать цифры на значках приложений при нажатии горячей клавиши." + +#: Settings.ui.h:123 +msgid "Hide timeout (ms)" +msgstr "Задержка скрытия (в мс)" + +#: Settings.ui.h:124 +msgid "e.g. q" +msgstr "например, q" + +#: Settings.ui.h:125 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Показать оверлей на значках на 2 секунды" + +#: Settings.ui.h:126 +msgid "Show window previews on hotkey" +msgstr "Предпросмотр приложений" + +#: Settings.ui.h:127 +msgid "Show previews when the application have multiple instances" +msgstr "Показывать предпросмотр приложений с несколькими экземплярами" + +#: Settings.ui.h:128 +msgid "Number row" +msgstr "Основной" + +#: Settings.ui.h:129 +msgid "Numeric keypad" +msgstr "Дополнительной" + +#: Settings.ui.h:130 +msgid "Both" +msgstr "Оба" + +#: Settings.ui.h:131 +msgid "Hotkeys are activated with" +msgstr "Используются горячие клавиши с клавиатуры" + +#: Settings.ui.h:132 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "Выберите какой набор цифровых кнопок используется для горячих клавиш" + +#: Settings.ui.h:133 +msgid "Current Show Applications icon" +msgstr "Текущий значок \"Приложения\"" + +#: Settings.ui.h:134 +msgid "Select a Show Applications image icon" +msgstr "Выбрать значок \"Приложения\"" + +#: Settings.ui.h:135 +msgid "Custom Show Applications image icon" +msgstr "Собственный значок \"Приложения\"" + +#: Settings.ui.h:136 +msgid "Show Applications icon side padding (px)" +msgstr "Отступ от значка (в пикселях)" + +#: Settings.ui.h:137 +msgid "Override escape key and return to desktop" +msgstr "" + +#: Settings.ui.h:138 +msgid "Animate Show Applications." +msgstr "Анимировать Показ списка приложений." + +#: Settings.ui.h:139 +msgid "Override Show Desktop line color" +msgstr "Выбрать цвет разделительной линии" + +#: Settings.ui.h:140 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Показать рабочий стол при наведении на кнопку" + +#: Settings.ui.h:141 +msgid "Delay before revealing the desktop (ms)" +msgstr "Задержка показа рабочего стола (в мс)" + +#: Settings.ui.h:142 +msgid "Fade duration (ms)" +msgstr "Задержка скрытия (в мс)" + +#: Settings.ui.h:143 +msgid "The panel background opacity is affected by" +msgstr "Влияние на прозрачность панели оказывают" + +#: Settings.ui.h:144 +msgid "Change opacity when a window gets closer than (px)" +msgstr "" +"Изменять прозрачность при приближении окна к панели ближе чем (в пикселях)" + +#: Settings.ui.h:146 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Изменять прозрачность на (%)" + +#: Settings.ui.h:147 +msgid "Opacity change animation duration (ms)" +msgstr "Скрыть и показать задержка анимации (в мс)" + +#: Settings.ui.h:148 +msgid "Display the main panel on" +msgstr "Показать панель на" + +#: Settings.ui.h:149 +msgid "Display panels on all monitors" +msgstr "Показать панель на всех мониторах" + +#: Settings.ui.h:150 +msgid "Panel Intellihide" +msgstr "Автоскрытие панели" + +#: Settings.ui.h:151 +msgid "Hide and reveal the panel according to preferences" +msgstr "Скрывать и показывать панель в зависимости от настроек" + +#: Settings.ui.h:152 +msgid "Order and positions on monitor" +msgstr "Порядок и расположение на мониторе" + +#: Settings.ui.h:153 +msgid "Apply changes to all monitors" +msgstr "Применить изменения ко всем мониторам" + +#: Settings.ui.h:154 +msgid "Panel screen position" +msgstr "Расположение панели на экране" + +#: Settings.ui.h:155 +msgid "Left" +msgstr "Слева" + +#: Settings.ui.h:156 +msgid "Right" +msgstr "Справа" + +#: Settings.ui.h:157 +msgid "Position" +msgstr "Расположение" + +#: Settings.ui.h:158 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Ширина панели\n" +"(По умолчанию 48 пикселей)" + +#: Settings.ui.h:160 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Отступ между значками приложений\n" +"(по умолчанию 8 пикселей)" + +#: Settings.ui.h:162 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Отступ вокруг значков приложений\n" +"(по умолчанию 4 пикселя)" + +#: Settings.ui.h:164 +msgid "Running indicator position" +msgstr "Позиция индикаторов запущенных приложений" + +#: Settings.ui.h:165 +msgid "Running indicator style (Focused app)" +msgstr "Индикатор запущенного приложения (когда в фокусе)" + +#: Settings.ui.h:166 +msgid "Dots" +msgstr "Точки" + +#: Settings.ui.h:167 +msgid "Squares" +msgstr "Квадраты" + +#: Settings.ui.h:168 +msgid "Dashes" +msgstr "Линии" + +#: Settings.ui.h:169 +msgid "Segmented" +msgstr "Сегменты" + +#: Settings.ui.h:170 +msgid "Solid" +msgstr "Жирные линии" + +#: Settings.ui.h:171 +msgid "Ciliora" +msgstr "Линии с точками" + +#: Settings.ui.h:172 +msgid "Metro" +msgstr "Метро" + +#: Settings.ui.h:173 +msgid "Running indicator style (Unfocused apps)" +msgstr "Индикатор запущенного приложения (когда в не фокусе)" + +#: Settings.ui.h:174 +msgid "Override panel theme background color " +msgstr "Цвет панели " + +#: Settings.ui.h:175 +msgid "Override panel theme background opacity" +msgstr "Прозрачность панели" + +#: Settings.ui.h:177 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Прозрачность панели (%)" + +#: Settings.ui.h:178 +msgid "Dynamic background opacity" +msgstr "Динамическая прозрачность" + +#: Settings.ui.h:179 +msgid "Change opacity when a window gets close to the panel" +msgstr "Изменять прозрачность при приближении окно к панели" + +#: Settings.ui.h:180 +msgid "Override panel theme gradient " +msgstr "Градиент панели " + +#: Settings.ui.h:182 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Значение цвета и прозрачности (%) сверху" + +#: Settings.ui.h:184 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Значение цвета и прозрачности (%) снизу" + +#: Settings.ui.h:185 +msgid "Style" +msgstr "Вид" + +#: Settings.ui.h:186 +msgid "Show favorite applications" +msgstr "Показывать избранные приложения" + +#: Settings.ui.h:187 +msgid "Show running applications" +msgstr "Показывать запущенные приложения" + +#: Settings.ui.h:188 +msgid "Show favorite applications on secondary panels" +msgstr "Показывать избранные приложения на вторичных панелях" + +#: Settings.ui.h:189 +msgid "Show AppMenu button" +msgstr "Показывать кнопку Меню приложения" + +#: Settings.ui.h:190 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Верхняя панель > Показать меню приложения, должно быть включено в Tweak Tool" + +#: Settings.ui.h:191 +msgid "Show window previews on hover" +msgstr "Показывать предпросмотр окон при наведении" + +#: Settings.ui.h:192 +msgid "Show tooltip on hover" +msgstr "Показывать подсказку при наведении" + +#: Settings.ui.h:193 +msgid "Isolate Workspaces" +msgstr "Изолировать рабочие столы" + +#: Settings.ui.h:194 +msgid "Isolate monitors" +msgstr "Изолировать мониторы" + +#: Settings.ui.h:195 +msgid "Click empty space to close overview" +msgstr "Закрывать обзор при щелчке на свободном месте" + +#: Settings.ui.h:196 +msgid "Ungroup applications" +msgstr "Разгруппировать приложения" + +#: Settings.ui.h:197 +msgid "Behavior" +msgstr "Поведение" + +#: Settings.ui.h:198 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Поведение при щелчке на значке запущенного приложения." + +#: Settings.ui.h:199 +msgid "Click action" +msgstr "Действие при щелчке" + +#: Settings.ui.h:200 +msgid "Toggle windows" +msgstr "Показать или свернуть" + +#: Settings.ui.h:201 +msgid "Scroll panel action" +msgstr "При прокрутке над панелью" + +#: Settings.ui.h:202 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Поведение при прокрутке колесиком мыши над панелью." + +#: Settings.ui.h:203 +msgid "Scroll icon action" +msgstr "При прокрутке над значком приложения" + +#: Settings.ui.h:204 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Поведение при прокрутке колесиком мыши над значком приложения." + +#: Settings.ui.h:205 +msgid "Do nothing" +msgstr "Ничего не делать" + +#: Settings.ui.h:206 +msgid "Switch workspace" +msgstr "Переключать рабочий стол" + +#: Settings.ui.h:207 +msgid "Cycle windows" +msgstr "Переключать окна" + +#: Settings.ui.h:208 +msgid "Change volume" +msgstr "Изменить громкость" + +#: Settings.ui.h:209 +msgid "Same as panel" +msgstr "Как на панеле" + +#: Settings.ui.h:210 +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:211 +msgid "Use hotkeys to activate apps" +msgstr "Использовать горячие клавиши для запуска приложений" + +#: Settings.ui.h:212 +msgid "Action" +msgstr "Действия" + +#: Settings.ui.h:213 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Размер шрифта в трее\n" +"(0 = значение из темы)" + +#: Settings.ui.h:215 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Размер шрифта левой панели\n" +"(0 = значение из темы)" + +#: Settings.ui.h:217 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Отступ между значками в трее\n" +"(-1 = значение из темы)" + +#: Settings.ui.h:219 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Значки статуса\n" +"(-1 = значение из темы)" + +#: Settings.ui.h:221 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Отступ левой панели\n" +"(0 = значение из темы)" + +#: Settings.ui.h:223 +msgid "Animate switching applications" +msgstr "Анимировать переключение приложений" + +#: Settings.ui.h:224 +msgid "Animate launching new windows" +msgstr "Анимировать запуск нового окна" + +#: Settings.ui.h:225 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Сохранить панель GNOME при показе приложений" + +#: Settings.ui.h:226 +msgid "Force Activities hot corner on primary monitor" +msgstr "" + +#: Settings.ui.h:227 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "" +"Активировать кнопки на панели меню (например, меню даты) только при нажатии " +"на кнопку" + +#: Settings.ui.h:228 +msgid "Keep original gnome-shell top panel" +msgstr "Сохранить верхнюю панель GNOME" + +#: Settings.ui.h:229 +msgid "App icon secondary (right-click) menu" +msgstr "Меню приложения по щелчку правой кнопкой мыши" + +#: Settings.ui.h:231 +msgid "Fine-Tune" +msgstr "Тонкая настройка" + +#: Settings.ui.h:232 +msgid "version: " +msgstr "версия: " + +#: Settings.ui.h:233 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:234 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Кнопками ниже можно сохранить текущие настройки в файл для загрузки на " +"другой машине." + +#: Settings.ui.h:235 +msgid "Export and import settings" +msgstr "Сохранение и загрузка настроек" + +#: Settings.ui.h:236 +msgid "Export to file" +msgstr "Сохранение настроек" + +#: Settings.ui.h:237 +msgid "Import from file" +msgstr "Загрузка настроек" + +#: Settings.ui.h:238 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "Позволяет обновлять приложение прямо с GitHub." + +#: Settings.ui.h:239 +msgid "Updates" +msgstr "Обновления" + +#: Settings.ui.h:240 +msgid "Periodically check for updates" +msgstr "Периодически проверять обновления" + +#: Settings.ui.h:241 +msgid "Check now" +msgstr "Проверить сейчас" + +#: Settings.ui.h:242 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Внимание! Хоть релизы и выходят " +"официально, они могут быть еще выложены на extensions.gnome.org! Прочитать" + +#: Settings.ui.h:243 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Эта программа поставляется без каких-либо гарантий.\n" +"Подробнее на GNU General Public License, version 2 or later" + +#: Settings.ui.h:245 +msgid "About" +msgstr "О приложении" + +#~ msgid "Top, with plugin icons collapsed to bottom" +#~ msgstr "Сверху, иконки плагинов снизу" + +#~ msgid "Left, with plugin icons collapsed to right" +#~ msgstr "Слева, иконки плагинов справа" + +#~ msgid "Top, with fixed center plugin icons" +#~ msgstr "Сверху, иконки плагинов по середине" + +#~ msgid "Left, with fixed center plugin icons" +#~ msgstr "Слева, иконки плагинов по середине" + +#~ msgid "Top, with floating center plugin icons" +#~ msgstr "Сверху, иконки плагинов по центру и не закреплены" + +#~ msgid "Left, with floating center plugin icons" +#~ msgstr "Слева, иконки плагинов по центру и не закреплены" + +#~ msgid "Center, fixed in middle of monitor" +#~ msgstr "По центру монитора" + +#~ msgid "Center, floating between top and bottom elements" +#~ msgstr "По центру между элементами сверху и снизу" + +#~ msgid "Center, floating between left and right elements" +#~ msgstr "По центру между элементами слева и справа" + +#~ msgid "Top of plugin icons" +#~ msgstr "Сверху от иконок плагинов" + +#~ msgid "Left of plugin icons" +#~ msgstr "Слева от иконок плагинов" + +#~ msgid "Bottom of plugin icons" +#~ msgstr "Снизу от иконок плагинов" + +#~ msgid "Right of plugin icons" +#~ msgstr "Справа от иконок плагинов" + +#~ msgid "Top of system indicators" +#~ msgstr "Сверху от системных индикаторов" + +#~ msgid "Left of system indicators" +#~ msgstr "Слева от системных индикаторов" + +#~ msgid "Bottom of system indicators" +#~ msgstr "Снизу от системных индикаторов" + +#~ msgid "Right of system indicators" +#~ msgstr "Справа от системных индикаторов" + +#~ msgid "Left of taskbar" +#~ msgstr "Слева от списка задач" + +#~ msgid "Bottom of taskbar" +#~ msgstr "Снизу от списка задач" + +#~ msgid "Right of taskbar" +#~ msgstr "Справа от списка задач" + +#~ msgid "Multi-monitors options" +#~ msgstr "Настройки для нескольких мониторов" + +#~ msgid "Event logs" +#~ msgstr "Просмотр логов" + +#~ msgid "System" +#~ msgstr "Система" + +#~ msgid "Device Management" +#~ msgstr "Управление устройствами" + +#~ msgid "Disk Management" +#~ msgstr "Управление дисками" + +#~ msgid "Terminal" +#~ msgstr "Терминал" + +#~ msgid "Display favorite applications on all monitors" +#~ msgstr "Показывать закрепленные приложения на всех мониторах" + +#~ msgid "Display the clock on all monitors" +#~ msgstr "Показывать часы на всех мониторах" + +#~ msgid "Display the status menu on all monitors" +#~ msgstr "Показывать системные индикаторы на всех мониторах" + +#~ msgid "Taskbar position" +#~ msgstr "Позиция панели задач на экране" + +#~ msgid "Clock location" +#~ msgstr "Позиция часов" + +#~ msgid "Show Applications icon" +#~ msgstr "Показывать иконку Программы" + +#~ msgid "Raise window" +#~ msgstr "Восстановить окно" + +#~ msgid "Highlight color" +#~ msgstr "Цвет подсветки" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Задержка превью в (мс)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Если установлено слишком маленькое значение, превью может исчезать " +#~ "слишком быстро. Если установлено слишком большое значение, превью может " +#~ "долго не скрываться и перекрывать соседние области." + +#~ msgid "Middle click to close window" +#~ msgstr "Средний клик закрывает окно" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Ширина окна в предпросмотре (в пикселях)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Высота окна в предпросмотре (в пикселях)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Отступ между окнами в предпросмотре (в пикселях)" + +msgid "Weekday" +msgstr "Будний день" + +msgid "Date" +msgstr "Дата" + +msgid "Seconds" +msgstr "Секунды" + +msgid "System Monitor" +msgstr "Системный монитор" + +msgid "Files" +msgstr "Файлы" + +msgid "Settings" +msgstr "Параметры" diff --git a/po/si.po b/po/si.po new file mode 100644 index 0000000..d8467ca --- /dev/null +++ b/po/si.po @@ -0,0 +1,14 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: si\n" + +msgid "System Monitor" +msgstr "පද්ධති නිරීක්‍ෂකය" + +msgid "Files" +msgstr "ගොනු" diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..9a54397 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: sk\n" + +msgid "System Monitor" +msgstr "Monitor systému" + +msgid "Files" +msgstr "Súbory" + +msgid "Settings" +msgstr "Nastavenia" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..51ec455 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: sl\n" + +msgid "System Monitor" +msgstr "Nadzornik sistema" + +msgid "Files" +msgstr "Datoteke" + +msgid "Settings" +msgstr "Nastavitve" diff --git a/po/sq.po b/po/sq.po new file mode 100644 index 0000000..0dd4747 --- /dev/null +++ b/po/sq.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: sq\n" + +msgid "System Monitor" +msgstr "Monitori i sistemit" diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..2234493 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: sr\n" + +msgid "System Monitor" +msgstr "Праћење система" + +msgid "Files" +msgstr "Датотеке" + +msgid "Settings" +msgstr "Подешавања" diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..df01de1 --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: sr\n" + +msgid "System Monitor" +msgstr "Praćenje sistema" + +msgid "Files" +msgstr "Datoteke" + +msgid "Settings" +msgstr "Podešavanja" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..7256b94 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,1296 @@ +# Copyright (C) Dash to Panel swedish translation +# This file is distributed under the same license as the Dash to Panel package. +# Translation author: Gleb Vassiljev , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-08 20:40+0200\n" +"PO-Revision-Date: 2020-03-11 21:21+0100\n" +"Last-Translator: Gleb Vassiljev \n" +"Language-Team: Svenska grenen av Translation Project \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 2.2.4\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Topp, med tilläggsikoner kollapsade till botten" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "Vänster, med tilläggsikoner kollapsade till höger" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Topp, med centrerade tilläggsikoner" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "Vänster, med centrerade tilläggsikoner" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Topp, med flytande centrerade tilläggsikoner" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "Vänster, med flytande centrerade tilläggsikoner" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Centrum, fixerade i mitten av skärmen" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Centrum, flytande mellan topp och botten elementer" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Centrum, flytande mellan vänster och höger elementer" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "Ovanför tilläggsikoner" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "Till vänster av tilläggsikoner" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "Under tilläggsikoner" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "Till höger om tilläggsikoner" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "Ovanför systemindikatorer" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "Till vänster om systemindikatorer" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "Under systemindikatorer" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "Till höger om systemindikatorer" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "Ovanför programfältet" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "Till vänster om programfältet" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "Under programfältet" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "Till höger om programfältet" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "Visa skrivbordsknapp höjd (px)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "Visa skrivbordsknapp bredd (px)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Inställningar för programsymboler" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1078 prefs.js:1325 prefs.js:1409 prefs.js:1474 +#: prefs.js:1510 prefs.js:1607 prefs.js:1641 prefs.js:1683 +msgid "Reset to defaults" +msgstr "Återställ till grundinställningar" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Förvalda (primära skärmar)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Bildskärm " + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Inställningar för flera bildskärmar" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Inställningar för dynamisk genomskinlighet" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Inställningar för automatisk döljande" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "Inställningar för Program-meny" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "Inställningar för skrivbordsknappen" + +#: prefs.js:1071 +msgid "Window preview options" +msgstr "Förhandsgranskning av programfönster inställningar" + +#: prefs.js:1318 +msgid "Ungrouped application options" +msgstr "Inställningar för icke grupperade program" + +#: prefs.js:1402 +msgid "Customize middle-click behavior" +msgstr "Anpassa mittenklick beteendet" + +#: prefs.js:1467 +msgid "Customize panel scroll behavior" +msgstr "Anpassa beteendet för panelbläddrande" + +#: prefs.js:1503 +msgid "Customize icon scroll behavior" +msgstr "Anpassa beteendet för bläddrande av ikoner" + +#: prefs.js:1600 +msgid "Advanced hotkeys options" +msgstr "Avancerade inställningar för snabbtangenter" + +#: prefs.js:1634 +msgid "Secondary Menu Options" +msgstr "Sekundära meny inställningar" + +#: prefs.js:1676 Settings.ui.h:223 +msgid "Advanced Options" +msgstr "Avancerade inställningar" + +#: prefs.js:1763 +msgid "Export settings" +msgstr "Exportera inställningar" + +#: prefs.js:1780 +msgid "Import settings" +msgstr "Importera inställningar" + +#: appIcons.js:1380 +msgid "Show Details" +msgstr "Visa detaljer" + +#: appIcons.js:1398 +msgid "New Window" +msgstr "Ny fönster" + +#: appIcons.js:1398 appIcons.js:1458 appIcons.js:1460 Settings.ui.h:10 +msgid "Quit" +msgstr "Avsluta" + +#: appIcons.js:1460 +msgid "Windows" +msgstr "Fönster" + +#: appIcons.js:1684 +msgid "Power options" +msgstr "Energi inställningar" + +#: appIcons.js:1689 +msgid "Event logs" +msgstr "Händelseloggar" + +#: appIcons.js:1694 +msgid "System" +msgstr "System" + +#: appIcons.js:1699 +msgid "Device Management" +msgstr "Administrering av enheter" + +#: appIcons.js:1704 +msgid "Disk Management" +msgstr "Administrering av diskar" + +#: appIcons.js:1711 +msgid "Terminal" +msgstr "Terminal" + +#: appIcons.js:1716 +msgid "System Monitor" +msgstr "Systemövervakning" + +#: appIcons.js:1721 +msgid "Files" +msgstr "Filer" + +#: appIcons.js:1726 +msgid "Settings" +msgstr "Inställningar" + +#: appIcons.js:1733 +msgid "Unlock taskbar" +msgstr "Lås upp aktivitetsfältet" + +#: appIcons.js:1733 +msgid "Lock taskbar" +msgstr "Lås aktivitetsfältet" + +#: appIcons.js:1738 +msgid "Taskbar Settings" +msgstr "Aktivitetsfältet inställningar" + +#: appIcons.js:1745 +msgid "Restore Windows" +msgstr "Återställ fönster" + +#: appIcons.js:1745 +msgid "Show Desktop" +msgstr "Visa skrivbordet" + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Ännu ingenting!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"När inställt på att minimera, dubbelklickande minimerar alla fönster av " +"programm." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Shift+klicka åtgärd" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Höja fönster" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Minimera fönster" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Starta en till förekomst av programmet" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Bläddra bland fönster" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Bläddra fönster + minimera" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Växla enskilda / Förhandsvisa flera" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Beteende för mittenklick." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Mittenklick åtgärd" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Beteende för Shift+mittenklick." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Shift+mittenklick åtgärd" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Isolera bildskärmar" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Visa favoritprogram på alla bildskärmar" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Visa klockan på alla bildskärmar" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Visa statusmeny på alla bildskärmar" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Integrera programmeny objekt" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Visa detaljer menyförval" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Belys fokuserade program" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Dominanta ikonfärgen" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Anpassad färg" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Belysningens genomskinlighet" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "Indikatorhöjd (px)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Indikatorfärg - dominant ikon" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Indikatorfärg - åsidosatt tema" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 fönster öppnad (eller inte grupperad)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Tillämpa för alla" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 fönster öppna" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 fönster öppna" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4+ fönster öppna" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Använd olika för icke fokuserade" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Typsnitt storlek (px) på programtitlar (förinställd på 14)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Typsnitt tjocklek av programtitlar" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "ärver från tema" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normal" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "tunnare" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "tjock" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "tjockare" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Typsnitt färg av programtitlar" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Maximal bredd (px) av programtitlar (förinställning är 160)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Använd fast bredd för programtitlar" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Programtitlar har samma bredd även om texten är kortare än den maximala " +"bredden. Den maximala vidden används som mått på fast bredd." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Visa körande indikatorer på ofokuserade program" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "Använd favoritikoner som programstartare" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Endast dölj panelen om den täcks av fönster " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "Panelen döljs från" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Alla fönster" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Fokuserade fönster" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Maximerade fönster" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Kräv tryck vid kanten på skärmen för att visa panelen" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Tröskelvärde som krävs för trycket (px)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Tidsgräns som krävs för trycket (ms)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Tillåt panelen att synas i fullskärmsläge" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "" +"Göm endast sekundära paneler (kräver inställningar för flera bildskärmar)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "t ex i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Snabbkommando för att syna och hålla panelen" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Syntax: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Tidsgräns för göm och syna animeringen (ms)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Fördröjning innan panelen göms (ms)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Fördröjning innan automatisk döljande aktiveras vid starten (ms)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Tiden (ms) innan visning (förinställd på 100)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Animationstid (ms)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Tiden (ms) innan gömmande (förinställd på 100)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Genast vid klickande på programikonen" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "Mittenklicka för att förhandsvisning för att stänga fönster" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Föredra fönsterstorlek på förhandsvisning (px)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Fönster förhandsvisningens bildförhållande Y (höjd)" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Fönster förhandsvisningens utfyllnad (px)" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "Fast" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Fönster förhandsvisningens bildförhållande X (bredd)" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Använd anpassad genomskinlighet för förhandsvisningens bakgrund" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "" +"Om avaktiverad, förhandsvisningen kommer att ha samma genomskinlighet som " +"panelen" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Stäng knappen och titelposition" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Under" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Topp" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Visa rubrik i fönster förhandsvisningen" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Typsnitt storlek (px) på förhandsvisningens titlar" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Typsnitt tjocklek på förhandsvisningens titlar" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Typsnitt färg på förhandsvisningens titlar" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Aktivera fönstermarkering" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"När en muspekare svävar över förhandsvisning av fönster under en tid, då " +"kommer fönstret att framträda." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Startar fönstermarkerande läge tidsgräns (ms)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Tid av inaktivitet då muspekare svävar på fönster förhandsvisning som behövs " +"till att aktivera fönstermarkerande läge." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Fönstermarkerande läge genomskinlighet" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "Alla fönster förutom de markerade har samma genomskinlighet." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Fördröjning mellan bläddrande händelser med mushjulet (ms)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "" +"Använd detta värde för att begränsa numret av uppfångade bläddrande med " +"mushjulet." + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Snabbkommando prefix" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "" +"Snabbkommando kommer att antingen vara Super+Nummer eller Super+Alt+Num" + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Alldrig" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Visa tillfälligt" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Alltid synlig" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Nummer av övertäckande" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "Tillfälligt visa programnummer över ikoner när snabbkommando används." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Tidsgränsen för döljandet (ms)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "t ex q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Snabbkommando för att visa övertäckande i 2 sekunder" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Visa fönsterförhandsvisningar baserad på snabbkommando" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Presentera förhandsvisningar när programmet har flera förekomster" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Raden med nummerknappar" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Numeriskt knappsats" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "Båda" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Snabbkommando aktiveras med" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "" +"Välj vilka tangentbordsknappar ska användas för att aktivera snabbkommando" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Nuvarande Visa Program ikonen" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Välj en bild för Visa Program ikonen" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Anpassad bild för Visa Program ikonen" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "Visa Program ikonens utfyllnad (px)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Visa skrivbord när muspekaren svävar över skrivbordsknappen" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Fördröjningen innan skrivbord visas (ms)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Varaktighet på bleknande (ms)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "Genomskinligheten på panelens bakgrund påverkas av" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Ändra genomskinlighet när fönster blir närmare än (px)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Ändra genomskinlighet till (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Ändringstiden för genomskinlighet animationen (ms)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Panelpositionen på skärmen" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "Vänster" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "Höger" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Aktivitetsfältets position" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Placering av klockan" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "Visa huvudpanelen på" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Visa paneler på alla bildskärmar" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Automatisk gömmande av panelen" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "Göm och visa panelen beroende på inställningar" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Position" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Panelstorlek\n" +"(48 är standard)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Programikonernas marginaler\n" +"(8 är standard)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Programikonernas avståndsutfyllnad\n" +"(grundläge är 4)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Aktiv indikeringsposition" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Stilen för aktiv indikering (fokuserad program)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Punkter" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Kvadrater" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Sträck" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Segmenterade" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Fasta" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Stilen för aktiv indikering (icke fokuserade program)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "Åsidosätt paneltemans bakgrundsfärg " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "Åsidosätt paneltemans genomskinlighet av bakgrund" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Panelens genomskinlighet av bakgrund (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Dynamisk genomskinlighet av bakgrund" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "Ändra genomskinlighet av bakgrund när en fönster kommer nära panelen" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "Åsidosätt paneltemans gradient " + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Toppgradientens färg och genomskinlighet (%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Bottengradientens färg och genomskinlighet (%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Stil" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Visa favoritprogram" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Visa program som körs" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Visa Program ikonen" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Animera Visa Program." + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Visa Aktiviteter knappen" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Visa Skrivbord knappen" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Visa Program Meny knappen" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Övre Fältet > Visa Program Meny måste aktiveras i Justeringar (Tweak Tool)" + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Visa förhandsgranskning av fönster vid svävande av muspekaren" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Visa beskrivning vid svävande av muspekaren" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Isolera Arbetsytor" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Avgruppera program" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Beteende" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Beteende när ikonen med redan körande program klickas på." + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "Klickande" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Växla fönster" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Åtgärd för skrollande av panelen" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Beteende då mushjulet bläddras över panelen." + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Skrollande ikonens åtgärd" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Beteende då mushjulet skrollar över en programikon." + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "Gör ingenting" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Ändra arbetsyta" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Växla bland fönster" + +#: Settings.ui.h:205 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Aktivera Super+(0-9) som snabba genvägar för att aktivera program. Det kan " +"också användas tillsammans med Shift och Ctrl." + +#: Settings.ui.h:206 +msgid "Use hotkeys to activate apps" +msgstr "Använd snabbkommando för att aktivera program" + +#: Settings.ui.h:207 +msgid "Action" +msgstr "Åtgärd" + +#: Settings.ui.h:208 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Teckenstorlek för meddelandefältet\n" +"(0 = temans standard)" + +#: Settings.ui.h:210 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Typsnitt storlek på vänster sida\n" +"(0 = temans standard)" + +#: Settings.ui.h:212 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Utfyllnadsavstånd för meddelandefältets objekt\n" +"(-1 = temans standard)" + +#: Settings.ui.h:214 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Utfyllnadsavstånd för statusikon\n" +"(-1 = temans standard)" + +#: Settings.ui.h:216 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Utfyllnadsavstånd på vänstersida\n" +"(-1 = temans standard)" + +#: Settings.ui.h:218 +msgid "Animate switching applications" +msgstr "Animera programbyte" + +#: Settings.ui.h:219 +msgid "Animate launching new windows" +msgstr "Animera uppstart av nya fönster" + +#: Settings.ui.h:220 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Behåll den ursprungliga GNOME-skalets översikt" + +#: Settings.ui.h:221 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "Aktivera panelens menyknappar (t ex datum meny) endast vid klickandet" + +#: Settings.ui.h:222 +msgid "App icon secondary (right-click) menu" +msgstr "Programikonens sekundära (högerklick) meny" + +#: Settings.ui.h:224 +msgid "Fine-Tune" +msgstr "Finjustera" + +#: Settings.ui.h:225 +msgid "version: " +msgstr "version: " + +#: Settings.ui.h:226 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:227 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Använd knapparna nedan för att skapa en inställningsfil för de gällande " +"förval som sedan kan importeras vid en annan installation." + +#: Settings.ui.h:228 +msgid "Export and import settings" +msgstr "Exportera och importera inställningar" + +#: Settings.ui.h:229 +msgid "Export to file" +msgstr "Exportera till en fil" + +#: Settings.ui.h:230 +msgid "Import from file" +msgstr "Importera från en fil" + +#: Settings.ui.h:231 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "" +"Detta gör det möjligt för dig att uppdatera tillägget direkt från GitHub " +"förrådet." + +#: Settings.ui.h:232 +msgid "Updates" +msgstr "Uppdateringar" + +#: Settings.ui.h:233 +msgid "Periodically check for updates" +msgstr "Regelmässigt kolla efter uppdateringar" + +#: Settings.ui.h:234 +msgid "Check now" +msgstr "Kolla nu" + +#: Settings.ui.h:235 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Var medveten om att dessa officiella " +"Dash to Panel utgåvor kan ännu vara icke recenserade på extensions.gnome.org!" +" Läs mer" + +#: Settings.ui.h:236 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Detta program kommer ABSOLUT UTAN NÅGON GARANTI.\n" +"Se GNU " +"General Public Licens, version 2 eller senare för detaljer." + +#: Settings.ui.h:238 +msgid "About" +msgstr "Information om programmet" + +#~ msgid "Highlight color" +#~ msgstr "Markeringsfärg" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Fördröjning i förhandsgranskning av döljande ikonen (ms)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Om den är satt för lågt, kommer fönsterförhandvisning av körande program se ut att " +#~ "att stängas för snabbt när det återgår. Om satt för högt så kommer " +#~ "fönsterförhandvisning att hänga kvar för länge när det flyttas till närliggande ikonen." + +#~ msgid "Middle click to close window" +#~ msgstr "Mittenklick för att stänga fönster" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Bredden på förhandsvisningar av fönster (px)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Höjden på förhandsvisningar av fönster (px)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Avstånd mellan förhandsvisningar av fönster (px)" + +#~ msgid "Natural" +#~ msgstr "Naturell" + +#~ msgid "Left side of panel" +#~ msgstr "Vänster sida av panelen" + +#~ msgid "Centered in content" +#~ msgstr "Centrerad i innehållet" + +#~ msgid "Github" +#~ msgstr "Github" + +#~ msgid "Height (px)" +#~ msgstr "Höjd (px)" + +#~ msgid "Color - Override Theme" +#~ msgstr "Färg - Åsidosatt Tema" + +#~ msgid "1 window open" +#~ msgstr "1 Fönster öppnad" + +msgid "Weekday" +msgstr "Veckodag" + +msgid "Date" +msgstr "Datum" + +msgid "Seconds" +msgstr "Sekunder" diff --git a/po/ta.po b/po/ta.po new file mode 100644 index 0000000..131ba6f --- /dev/null +++ b/po/ta.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ta\n" + +msgid "System Monitor" +msgstr "கணினி கண்காணிப்புக் கருவி" + +msgid "Files" +msgstr "கோப்புகள்" + +msgid "Settings" +msgstr "அமைவுகள்" diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..2642c11 --- /dev/null +++ b/po/te.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: te\n" + +msgid "System Monitor" +msgstr "వ్యవస్థ పర్యవేక్షకం" + +msgid "Files" +msgstr "దస్త్రాలు" + +msgid "Settings" +msgstr "అమరికలు" diff --git a/po/tg.po b/po/tg.po new file mode 100644 index 0000000..594d93c --- /dev/null +++ b/po/tg.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: tg\n" + +msgid "System Monitor" +msgstr "Монитори система" + +msgid "Files" +msgstr "Файлҳо" + +msgid "Settings" +msgstr "Танзимот" diff --git a/po/th.po b/po/th.po new file mode 100644 index 0000000..3a400c2 --- /dev/null +++ b/po/th.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: th\n" + +msgid "System Monitor" +msgstr "เครื่องมือเฝ้าสังเกตระบบ" + +msgid "Files" +msgstr "แฟ้ม" + +msgid "Settings" +msgstr "ตั้งค่า" diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..6d29b22 --- /dev/null +++ b/po/tr.po @@ -0,0 +1,1319 @@ +# Dash to Panel Türkçe çeviri +# Copyright (C) 2017 +# This file is distributed under the same license as the PACKAGE package. +# Serdar Sağlam , 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-13 08:27+0300\n" +"PO-Revision-Date: 2019-10-13 08:49+0300\n" +"Last-Translator: Serdar Sağlam \n" +"Language-Team: Serdar Sağlam \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "Üst, eklenti simgeleri alta kaydırılır" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "Sol, eklenti simgeleri sağa kaydırılır" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "Üst, eklenti simgeleri ortada sabit kalır" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "Sol, eklenti simgeleri ortada sabit kalır" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "Üst, eklenti simgeleri ortada değişken" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "Sol, eklenti simgeleri ortada değişken" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "Merkez, ekranın ortasında sabit kalır" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "Merkez, üst ve alt elemanlar arasında değişken" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "Merkez, sol ve sağ değişken" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "Eklenti simgelerinin üstünde" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "Eklenti simgelerinin solunda" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "Eklenti simgelerinin altında" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "Eklenti simgelerinin sağında" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "Sistem tepsisinin üstünde" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "Sistem tepsisinin solunda" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "Sistem tepsisinin altında" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "Sistem tepsisinin sağında" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "Görev çubuğunun üstünde" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "Görev çubuğunun solunda" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "Görev çubuğunun altında" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "Görev çubuğunun sağında" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "Masaüstü Göster düğmesi yüksekliği (piksel)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "Düğme genişliği (piksel)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "Çalışan Gösterge Seçenekleri" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1078 prefs.js:1325 prefs.js:1409 prefs.js:1474 +#: prefs.js:1510 prefs.js:1607 prefs.js:1641 prefs.js:1683 +msgid "Reset to defaults" +msgstr "Varsayılanlara Dön" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "Varsayılan (Birincil ekran)" + +#: prefs.js:517 +msgid "Monitor " +msgstr "Ekran " + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "Çoklu Ekran Seçenekleri" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "Dinamik Saydamlık Seçenekleri" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "Otomatik gizleme seçenekleri" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "Tüm Uygulamalar Seçenekleri" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "Masaüstü Göster Seçenekleri" + +#: prefs.js:1071 +msgid "Window preview options" +msgstr "Pencere Önizleme Seçenekleri" + +#: prefs.js:1318 +msgid "Ungrouped application options" +msgstr "Gruplanmamış Uygulama Seçenekleri" + +#: prefs.js:1402 +msgid "Customize middle-click behavior" +msgstr "Orta Tıklatma Davranışları" + +#: prefs.js:1467 +msgid "Customize panel scroll behavior" +msgstr "Panel kaydırma davranışını özelleştir" + +#: prefs.js:1503 +msgid "Customize icon scroll behavior" +msgstr "Simge kaydırma davranışını özelleştir" + +#: prefs.js:1600 +msgid "Advanced hotkeys options" +msgstr "Gelişmiş kısayol tuş seçenekleri" + +#: prefs.js:1634 +msgid "Secondary Menu Options" +msgstr "İkincil Menü Seçenekleri" + +#: prefs.js:1676 Settings.ui.h:223 +msgid "Advanced Options" +msgstr "Gelişmiş Seçenekler" + +#: prefs.js:1763 +msgid "Export settings" +msgstr "Dışarı aktarma ayarları" + +#: prefs.js:1780 +msgid "Import settings" +msgstr "İçeri aktarma ayarları" + +#: appIcons.js:1380 +msgid "Show Details" +msgstr "Ayrıntıları Göster" + +#: appIcons.js:1398 +msgid "New Window" +msgstr "Yeni Pencere" + +#: appIcons.js:1398 appIcons.js:1458 appIcons.js:1460 Settings.ui.h:10 +msgid "Quit" +msgstr "Çık" + +#: appIcons.js:1460 +msgid "Windows" +msgstr "Pencere" + +#: appIcons.js:1684 +msgid "Power options" +msgstr "Güç seçenekleri" + +#: appIcons.js:1689 +msgid "Event logs" +msgstr "Olay günlükleri" + +#: appIcons.js:1694 +msgid "System" +msgstr "Sistem" + +#: appIcons.js:1699 +msgid "Device Management" +msgstr "Aygıt Yönetimi" + +#: appIcons.js:1704 +msgid "Disk Management" +msgstr "Disk Yönetimi" + +#: appIcons.js:1711 +msgid "Terminal" +msgstr "Uçbirim" + +#: appIcons.js:1716 +msgid "System Monitor" +msgstr "Sistem monitörü" + +#: appIcons.js:1721 +msgid "Files" +msgstr "Dosyalar" + +#: appIcons.js:1726 +msgid "Settings" +msgstr "Ayarlar" + +#: appIcons.js:1733 +msgid "Unlock taskbar" +msgstr "Görev Çubuğu Kilidini Aç" + +#: appIcons.js:1733 +msgid "Lock taskbar" +msgstr "Görev Çubuğunu Kilitle" + +#: appIcons.js:1738 +msgid "Taskbar Settings" +msgstr "Görev Çubuğu Ayarları" + +#: appIcons.js:1745 +msgid "Restore Windows" +msgstr "Pencereleri Onar" + +#: appIcons.js:1745 +msgid "Show Desktop" +msgstr "Masaüstünü Göster" + +#: update.js:58 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "Sürüm %s (%s) kullanılabilir" + +#: update.js:59 +msgid "Details" +msgstr "Ayrıntılar" + +#: update.js:60 +msgid "Update" +msgstr "Güncelle" + +#: update.js:63 +msgid "Already up to date" +msgstr "Zaten güncel" + +#: update.js:148 +msgid "Update successful, please log out/in" +msgstr "Güncelleme başarılı, lütfen çıkış yapın/girin" + +#: update.js:149 +msgid "Log out" +msgstr "Çıkış yap" + +#: update.js:153 +msgid "Update successful, please restart GNOME Shell" +msgstr "Güncelleme başarılı, lütfen Gnome Kabuğunu yeniden başlat" + +#: update.js:154 +msgid "Restart GNOME Shell" +msgstr "Gnome Kabuğunu yeniden başlat" + +#: update.js:154 +msgid "Restarting GNOME Shell..." +msgstr "Gnome Kabuğunu yeniden başlatılıyor..." + +#: update.js:160 +msgid "Error: " +msgstr "Hata: " + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "Henüz bir şey yok!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"Küçültmek için ayarlandığında, çift tıklayarak tüm uygulama pencerelerini " +"küçültür." + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Shift+Tıklama eylemi" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "Pencereleri yükselt" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "Pencereyi küçült" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "Yeni uygulama başlat" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "Pencereler döngüsü" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "Uygulama başlat ve küçült" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "Tek geçiş/çoklu önizleme" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "Orta tıklama davranışı." + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "Orta tıklama eylemi" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Shift + Orta tıklama davranışı." + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Shift+Orta Tıklama eylemi" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "Ekranları izole et" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "Tüm ekranlarda sık kullanılan uygulamaları göster" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "Tüm ekranlarda saati göster" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "Tüm ekranlarda durum menüsünü göster" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "Entegre Program menüsü" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "Ayrıntıları Göster menü seçeneği" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "Vurgu odaklı uygulamalar" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "Simge baskın renk" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "Özel renk" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "Arka ışık saydamlığı" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "Yükseklik (piksel)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "Gösterge rengi - baskın simge" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "Gösterge rengi - temayı geçersiz kıl" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "Bir pencere açık olduğunda (gruplandırılmadığında)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "Tümüne uygula" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "İki pencere açık olduğunda" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "Üç pencere açık olduğunda" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "Dört + pencere açık olduğunda" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "Odakta değilken diğerini kullan" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "Uygulama başlığı yazı tipi boyutu (piksel) (varsayılan 14)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "Uygulama başlığı yazı tipi" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "mevcut tema" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normal" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "hafif" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "kalın" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "çok kalın" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "Uygulama başlığı yazı tipi rengi" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "Uygulama başlığı azami genişliği (piksel) (varsayılan 160)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "Sabit başlık genişliğini kullan" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"Uygulama başlıkları, metinleri azami genişlikten daha kısa olsa bile, aynı " +"genişliğe sahiptir. Azami genişlik değeri sabit genişlik olarak kullanılır." + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "Odaklanmamış uygulamalarda çalışan göstergeleri görüntüle" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "Sık kullanılanlar simgelerini başlatıcı olarak kullanma" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "Sadece pencere tarafından engellendiğinde paneli gizle " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "Panel gizlenir" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "Tüm pencereler" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "Odaklanmış pencereler" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "Büyütülmüş pencereler" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "Paneli ortaya çıkarmak için ekranın kenarında beklemek gerektirir" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "Başlatma için gereken alan eşiği (piksel)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "Bekleme için gerekli zaman aşımı (ms)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "Panelin tam ekran kipinde ortaya çıkmasına izin ver" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "Yalnızca ikincil panelleri gizle (çoklu monitör seçeneği gerekir)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "örneğin. i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "Paneli tutmak ve ortaya çıkarmak için klavye kısayolu" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "Sözdizimi: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "Canlandırma süresini gizle ve göster (ms)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "Paneli gizlemeden önce gecikme süresi (ms)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "Başlangıçta intellihide'ı etkinleştirmeden önce gecikme (ms)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "Göstermeden önce geçen süre (ms) (varsayılan 100)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "Animasyon süresi (ms)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "Gizlemeden önce geçen süre (ms) (varsayılan 100)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "Hemen uygulama simgesine tıkla" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "Pencereyi kapatmak için önizlemeye orta tıkla" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "Pencere önizlemeleri tercih edilen boyut (px)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "Pencere önizlemeleri en boy oranı Y (yükseklik)" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "Pencere önizlemeleri dolgu (px)" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "Sabit" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "Pencere önizlemeleri en boy oranı X (genişlik)" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "Önizleme arka planı için özel opaklık kullan" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "" +"Devre dışı bırakılırsa, önizleme arka planı panelin aynı opaklığına sahip " +"olur" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "Kapat düğmesi ve üstbilgi konumu" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "Alt" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "Üst" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "Pencere önizleme başlıklarını görüntüle" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "Önizleme başlıklarının yazı tipi boyutu (px)" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "Önizleme başlıklarının yazı tipi genişliği" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "Önizleme başlıklarının yazı tipi rengi" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "Pencereye göz atmayı etkinleştir" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "" +"Bir süre boyunca bir pencere önizlemesinin üzerine gelindiğinde, pencere " +"ayırt edilir." + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "Pencere gözatma kipi zaman aşımı (ms)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "" +"Bir pencere önizleme üzerinde vurgulama sırasında etkinlik dışı zaman girmek " +"için gerekli pencere göz atma kipi." + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "Pencere gözatma kipi saydamlığı" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "" +"Bakılan pencerenin dışındaki tüm pencerelerin opaklıkları aynı değere " +"ayarlanmıştır." + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "Fare kaydırma olayları arasındaki gecikme (ms)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "" +"Yakalanan fare kaydırma olaylarının sayısını sınırlamak için bu değeri " +"kullanın." + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "Kısayol tuşları" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Kısayol Super+Numaralar, yada Super+Alt" + +#: Settings.ui.h:117 +msgid "Never" +msgstr "Asla" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "Geçici olarak göster" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "Sürekli görünür" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "Numara yerleşimi" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Kısayol tuşlarını kullanırken uygulama numaralarını simgeler üzerinde geçici " +"olarak göster." + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "Gizleme sonlanma (ms)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "örneğin. q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "2 saniye kaplama göstermek için kısayol" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "Uygulama önizleme kısayol" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "Uygulamanın birden çok örneği açık olduğunda önizlemeleri göster" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "Numara satırı" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "Sayısal tuş takımı" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "İkiside" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "Kısayol tuşları ile etkin" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "" +"Kısayol tuşlarını etkinleştirmek için hangi klavye sayı tuşlarının " +"kullanılacağını seçin" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "Mevcut simgeyi göster" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "Görünmesini istediğin simgeyi seç" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "Görünmesini istediğin simgeyi seç" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "Simge yan dolgu (piksel)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "Masaüstünü göster düğmesinin üstüne gelince masaüstü görünsün" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "Masaüstünü ortaya çıkarmadan önce gecikme (ms)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "Solma süresi (ms)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "Panelin saydamlık üzerindeki etkisi" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "Bir pencere yaklaştığında saydamlığı değiştir (piksel)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "Saydamlığı değiştir (%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "Saydamlık değişimi canlandırma süresi (ms)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "Panelin Ekrandaki Konumu" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "Sol" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "Sağ" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "Görev çubuğu konumu" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "Saat konumu" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "Paneli ana ekranda göster" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "Paneli tüm ekranlarda göster" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "Paneli gizle" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "Paneli gizleme ve geri getirme seçenekleri" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "Konum" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Panel Boyutu\n" +"(varsayılan 48)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Uygulama Simge Marjı\n" +"(varsayılan 8)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"Uygulama Simge Dolgusu\n" +"(varsayılan 4)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "Çalışan uygulamaların gösterge konumu" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "Çalışan uygulamaların gösterge biçimi (Odakta olan)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "Noktalar" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "Kareler" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "Tireler" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "Segmentler" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "Kalın çizgi" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Nokta ve çizgi" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "Çalışan uygulamaların gösterge biçimi (Odakta olmayan)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "Panel tema arka plan rengini geçersiz kıl " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "Panel tema arka plan saydamlığını geçersiz kıl" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "Panel arka plan saydamlığı (%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "Dinamik arka plan saydamlığı" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "Bir pencere panele yaklaştığında saydamlığı değişir" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "Panel temasında değişken renkler kullan " + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "Değişken renk ve saydamlık değeri (%) üst" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "Değişken renk ve saydamlık değeri (%) alt" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "Biçim" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "Sık kullanılan uygulamaları göster" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "Çalışan uygulamaları göster" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "Tüm Uygulamalar simgesi Aktif" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "Canlandırma menü açılışlarında göster." + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "Etkinlikler düğmesi Aktif" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "Masaüstünü göster düğmesi Aktif" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "Uygulama menüleri düğmesi Aktif" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "Gnome İnce Ayarlar/Tepe Çubuğu/Uygulama Menüsü etkin olmalıdır" + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "Pencere önizlemelerini göster" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "Vurgulu araç ipucunu göster" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "Çalışma alanlarını ayır" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "Gruplandırılmamış uygulamalar" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "Davranış" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Çalışan bir uygulamanın simgesine tıkladığınızda davranış." + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "Tıklama eylemi" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "Pencereleri aç/kapat" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "Kaydırma paneli eylemi" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "Panel üzerinde fare kaydırırken davranış." + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "Kaydırma simgesi eylemi" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "Bir uygulama simgesi üzerinde fareyi kaydırırken davranış." + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "Hiçbir şey yapma" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "Çalışma alanını değiştir" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "Pencere döngüsü" + +#: Settings.ui.h:205 +msgid "" +"Enable Super+(0-9) as shortcuts to activate apps. It can also be used " +"together with Shift and Ctrl." +msgstr "" +"Uygulamaları etkinleştirmek için kısayollar ctrl +(0-9) etkinleştirin Shift " +"ve Ctrl ile birlikte." + +#: Settings.ui.h:206 +msgid "Use hotkeys to activate apps" +msgstr "Uygulamaları etkinleştirmek için kısayol tuşlarını kullan" + +#: Settings.ui.h:207 +msgid "Action" +msgstr "Eylem" + +#: Settings.ui.h:208 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Simge Font Boyutu\n" +"(0 = varsayılan)" + +#: Settings.ui.h:210 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"SolKutu Yazı Boyutu\n" +"(0 = varsayılan)" + +#: Settings.ui.h:212 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Simge Dolgusu\n" +"(-1 = varsayılan)" + +#: Settings.ui.h:214 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Durum Simge Dolgusu\n" +"(-1 = varsayılan)" + +#: Settings.ui.h:216 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"SolKutu Dolgusu\n" +"(-1 = varsayılan)" + +#: Settings.ui.h:218 +msgid "Animate switching applications" +msgstr "Uygulama geçişlerinde canlandırma kullan" + +#: Settings.ui.h:219 +msgid "Animate launching new windows" +msgstr "Açılan pencerelerde canlandırma kullan" + +#: Settings.ui.h:220 +msgid "Keep original gnome-shell dash (overview)" +msgstr "Orijinal gnome-shell rıhtımını kullan (genel bakış)" + +#: Settings.ui.h:221 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "" +"Sadece tıklandığında panel menü düğmelerini (ör. tarih menüsü) etkinleştir" + +#: Settings.ui.h:222 +msgid "App icon secondary (right-click) menu" +msgstr "Uygulama simgesi ikincil (sağ tık) menüsü" + +#: Settings.ui.h:224 +msgid "Fine-Tune" +msgstr "İnce Ayarlar" + +#: Settings.ui.h:225 +msgid "version: " +msgstr "sürüm: " + +#: Settings.ui.h:226 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:227 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"Geçerli ayarlarınızı yedeklemek için aşağıdaki düğmeleri kullanın farklı bir " +"makinede içe aktarılabilen tercihler." + +#: Settings.ui.h:228 +msgid "Export and import settings" +msgstr "Ayarları içeri ve dışarı aktar" + +#: Settings.ui.h:229 +msgid "Export to file" +msgstr "Dışarı aktar" + +#: Settings.ui.h:230 +msgid "Import from file" +msgstr "İçeri aktar" + +#: Settings.ui.h:231 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "Bu, eklentiyi GitHub deposundan doğrudan güncellemenizi sağlar." + +#: Settings.ui.h:232 +msgid "Updates" +msgstr "Güncellemeler" + +#: Settings.ui.h:233 +msgid "Periodically check for updates" +msgstr "Güncellemeleri düzenli olarak kontrol et" + +#: Settings.ui.h:234 +msgid "Check now" +msgstr "Şimdi kontrol et" + +#: Settings.ui.h:235 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"Unutmayın, Dash to Panel bültenleri " +"extensions.gnome.org üstünde henüz hazır olmayabilir! Devamını oku" + +#: Settings.ui.h:236 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Bu program KESİNLİKLE HİÇBİR GARANTİ vermez.\n" +"Bakın GNU " +"Genel Kamu Lisansı, sürüm 2 veya üstü detaylar için." + +#: Settings.ui.h:238 +msgid "About" +msgstr "Hakkında" + +#~ msgid "Highlight color" +#~ msgstr "Arka ışık rengi" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "Önizleme zaman aşımı simgesi (ms)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "Çok düşük ayarlanırsa, çalışan uygulamaların pencere önizlemesi kapanıyor " +#~ "gibi görünebilir hızlı açılır pencere. Çok yüksek ayarlarsanız, önizleme " +#~ "olabilir bitişik bir simgeye taşınırken çok uzun süre bekler." + +#~ msgid "Middle click to close window" +#~ msgstr "Pencereyi kapatmak için orta tık" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "Pencere önizleme genişliği (piksel)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "Pencere önizleme yüksekliği (piksel)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "Pencere önizleme dolgusu (piksel)" + +msgid "Weekday" +msgstr "Hafta İçi" + +msgid "Date" +msgstr "Tarih" + +msgid "Seconds" +msgstr "Saniye" diff --git a/po/ug.po b/po/ug.po new file mode 100644 index 0000000..293ad6d --- /dev/null +++ b/po/ug.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: ug\n" + +msgid "System Monitor" +msgstr "سىستېما كۆزەتكۈچ" + +msgid "Files" +msgstr "ھۆججەتلەر" + +msgid "Settings" +msgstr "تەڭشەكلەر" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..5c64f2c --- /dev/null +++ b/po/uk.po @@ -0,0 +1,461 @@ +# 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 , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-03-25 11:55+0100\n" +"PO-Revision-Date: 2017-12-04 18:43+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.4\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" +"Last-Translator: Alice Charlotte Liddell \n" +"Language: uk\n" + +#: prefs.js:213 +msgid "Running Indicator Options" +msgstr "Налаштування індикатора роботи" + +#: prefs.js:220 prefs.js:380 prefs.js:445 prefs.js:511 prefs.js:553 +msgid "Reset to defaults" +msgstr "Скинути налаштвання" + +#: prefs.js:373 +msgid "Customize middle-click behavior" +msgstr "Налаштувати поведінку при середньому кліку" + +#: prefs.js:438 +msgid "Advanced hotkeys options" +msgstr "Розширені налаштування гарячих клавіш" + +#: prefs.js:504 +msgid "Secondary Menu Options" +msgstr "Налаштування другорядних меню" + +#: prefs.js:546 Settings.ui.h:85 +msgid "Advanced Options" +msgstr "Розширені налаштування" + +#: appIcons.js:918 +msgid "Show Details" +msgstr "Детальніше" + +#: appIcons.js:937 +msgid "New Window" +msgstr "Нове вікно" + +#: appIcons.js:937 appIcons.js:998 appIcons.js:1000 Settings.ui.h:8 +msgid "Quit" +msgstr "Вийти" + +#: appIcons.js:1000 +msgid "Windows" +msgstr "Вікна" + +#: appIcons.js:1159 +msgid "Taskbar Settings" +msgstr "Налаштування панелі завдань" + +#: appIcons.js:1166 +msgid "Restore Windows" +msgstr "Відновити вікна" + +#: appIcons.js:1166 +msgid "Show Desktop" +msgstr "Показати стільницю" + +#: Settings.ui.h:1 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "" +"За активної опції згортання вікон, подвійне клацання згорне всі вікна " +"застосунку." + +#: Settings.ui.h:2 +msgid "Shift+Click action" +msgstr "Дія при натисканні Shift+Клік" + +#: Settings.ui.h:3 +msgid "Raise window" +msgstr "Розгорнути вікно" + +#: Settings.ui.h:4 +msgid "Minimize window" +msgstr "Згорнути вікно" + +#: Settings.ui.h:5 +msgid "Launch new instance" +msgstr "Запустити нову копію програми" + +#: Settings.ui.h:6 +msgid "Cycle through windows" +msgstr "Прокрутка вікон" + +#: Settings.ui.h:7 +msgid "Cycle windows + minimize" +msgstr "Прокрутка та згортання вікон" + +#: Settings.ui.h:9 +msgid "Behavior for Middle-Click." +msgstr "Поведінка при середньому кліку" + +#: Settings.ui.h:10 +msgid "Middle-Click action" +msgstr "Дія при середньому кліку" + +#: Settings.ui.h:11 +msgid "Behavior for Shift+Middle-Click." +msgstr "Поведінка при Shift+Середній клік" + +#: Settings.ui.h:12 +msgid "Shift+Middle-Click action" +msgstr "Дія при Shift+Середній клік" + +#: Settings.ui.h:13 +msgid "Integrate AppMenu items" +msgstr "Вбудувати пункти Меню" + +#: Settings.ui.h:14 +msgid "Show Details menu item" +msgstr "Пункт меню Детальніше" + +#: Settings.ui.h:15 +msgid "Highlight focused application" +msgstr "Підсвічувати застосунок у фокусі" + +#: Settings.ui.h:16 +msgid "Height (px)" +msgstr "Висота (пікселів)" + +#: Settings.ui.h:17 +msgid "0" +msgstr "0" + +#: Settings.ui.h:18 +msgid "Color - Override Theme" +msgstr "Колір - Використовувати власну палітру" + +#: Settings.ui.h:19 +msgid "1 window open" +msgstr "1 відкрите вікно" + +#: Settings.ui.h:20 +msgid "Apply to all" +msgstr "Застосувати для всіх" + +#: Settings.ui.h:21 +msgid "2 windows open" +msgstr "2 відкритих вікна" + +#: Settings.ui.h:22 +msgid "3 windows open" +msgstr "3 відкритих вікна" + +#: Settings.ui.h:23 +msgid "4+ windows open" +msgstr "4 та більше відкритих вікон" + +#: Settings.ui.h:24 +msgid "Use different for unfocused" +msgstr "Використовувати інший набір для вікон не у фокусі" + +#: Settings.ui.h:25 +msgid "Preview timeout on icon leave (ms)" +msgstr "Показувати ескіз ще (мс) після прибирання курсору миші" + +#: Settings.ui.h:26 +msgid "" +"If set too low, the window preview of running applications may seem to close " +"too quickly when trying to enter the popup. If set too high, the preview may " +"linger too long when moving to an adjacent icon." +msgstr "" +"За надто малих значень ескізи вікон застосунків можуть зникати надто швидко " +"навіть для спроби переведення курсору з панелі на виринаючий контейнер з " +"ескізами, але якщо значення зависоке, ескіз може ще довго висіти при " +"переході на суміжну піктограму." + +#: Settings.ui.h:27 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:28 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:29 +msgid "Hotkeys prefix" +msgstr "Префікс гарячих клавіш" + +#: Settings.ui.h:30 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "Гарячі клавіші будуть Super+Число, або Super+Alt+Num" + +#: Settings.ui.h:31 +msgid "Number overlay" +msgstr "Комірки з номерами" + +#: Settings.ui.h:32 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "" +"Тимчасово показувати порядкові номери застосунків над їх піктограмами за " +"використання гарячих клавіш." + +#: Settings.ui.h:33 +msgid "Hide timeout (ms)" +msgstr "Час зникнення (мс)" + +#: Settings.ui.h:34 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "Комбінація для двосекундного показу комірок" + +#: Settings.ui.h:35 +msgid "Syntax: , , , " +msgstr "Синтаксис: , , , " + +#: Settings.ui.h:36 +msgid "Panel screen position" +msgstr "Розташування панелі на екрані" + +#: Settings.ui.h:37 +msgid "Bottom" +msgstr "Знизу" + +#: Settings.ui.h:38 +msgid "Top" +msgstr "Вгорі" + +#: Settings.ui.h:39 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"Розмір панелі\n" +"(48 за замовчуванням)" + +#: Settings.ui.h:41 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"Проміжок між піктограмами\n" +"(8 за замовчуванням)" + +#: Settings.ui.h:43 +msgid "Running indicator position" +msgstr "Розташування індикатора роботи" + +#: Settings.ui.h:44 +msgid "Running indicator style (Focused app)" +msgstr "Вигляд індикатора роботи" + +#: Settings.ui.h:45 +msgid "Dots" +msgstr "Крапки" + +#: Settings.ui.h:46 +msgid "Squares" +msgstr "Квадрати" + +#: Settings.ui.h:47 +msgid "Dashes" +msgstr "Рисочки" + +#: Settings.ui.h:48 +msgid "Segmented" +msgstr "Сегментований" + +#: Settings.ui.h:49 +msgid "Solid" +msgstr "Цільний" + +#: Settings.ui.h:50 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:51 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:52 +msgid "Running indicator style (Unfocused apps)" +msgstr "Вигляд індикатора роботи (Не в фокусі)" + +#: Settings.ui.h:53 +msgid "Clock location" +msgstr "Розташування годинника" + +#: Settings.ui.h:54 +msgid "Natural" +msgstr "За замовчуванням" + +#: Settings.ui.h:55 +msgid "Left of status menu" +msgstr "Ліворуч від рядку стану" + +#: Settings.ui.h:56 +msgid "Right of status menu" +msgstr "Праворуч від рядку стану" + +#: Settings.ui.h:57 +msgid "Position and Style" +msgstr "Стиль і розташування" + +#: Settings.ui.h:58 +msgid "Show Applications icon" +msgstr "Піктограма Всі Застосунки" + +#: Settings.ui.h:59 +msgid "Animate Show Applications." +msgstr "Анімувати Всі Застосунки." + +#: Settings.ui.h:60 +msgid "Show Activities button" +msgstr "Показувати кнопку Діяльність" + +#: Settings.ui.h:61 +msgid "Show Desktop button" +msgstr "Показувати кнопку Стільниця" + +#: Settings.ui.h:62 +msgid "Show AppMenu button" +msgstr "Показувати кнопку Застосунки" + +#: Settings.ui.h:63 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "" +"Панель Завдань > Опція \"Показувати Меню Застосунків\" має бути увімкнена у " +"Tweak Tool" + +#: Settings.ui.h:64 +msgid "Show window previews on hover" +msgstr "Показувати виринаючі ескізи вікон при наведенні миші" + +#: Settings.ui.h:65 +msgid "Time (ms) before showing (100 is default)" +msgstr "Затримка (мс) перед показом (100 за замовчуванням)" + +#: Settings.ui.h:66 +msgid "Isolate Workspaces" +msgstr "Ізолювати стільниці" + +#: Settings.ui.h:67 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "Дія при кліку по піктограмі запущеного застосунку" + +#: Settings.ui.h:68 +msgid "Click action" +msgstr "Дія при кліку" + +#: Settings.ui.h:69 +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:70 +msgid "Use hotkeys to activate apps" +msgstr "Використовувати гарячі клавіші для запуску улюблених застосунків" + +#: Settings.ui.h:71 +msgid "Behavior" +msgstr "Поведінка" + +#: Settings.ui.h:72 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"Розмір шрифту у панелі\n" +"(0 = визначено темою)" + +#: Settings.ui.h:74 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"Розмір шрифту LeftBox\n" +"(0 = визначено темою)" + +#: Settings.ui.h:76 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"Проміжки між об’єктами лотка\n" +"(-1 = визначено темою)" + +#: Settings.ui.h:78 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"Проміжки в рядку стану\n" +"(-1 = визначено тамою)" + +#: Settings.ui.h:80 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"Проміжок зліва\n" +"(-1 = визначено темою)" + +#: Settings.ui.h:82 +msgid "Animate switching applications" +msgstr "Анімувати перемикання між застосунками" + +#: Settings.ui.h:83 +msgid "Animate launching new windows" +msgstr "Анімувати запуск нових вікон" + +#: Settings.ui.h:84 +msgid "App icon secondary (right-click) menu" +msgstr "Контекстне меню піктограм застосунків" + +#: Settings.ui.h:86 +msgid "Fine-Tune" +msgstr "Тонке налаштування" + +#: Settings.ui.h:87 +msgid "version: " +msgstr "версія:" + +#: Settings.ui.h:88 +msgid "Github" +msgstr "GitHub" + +#: Settings.ui.h:89 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"Автор програми не надає ЖОДНИХ ГАРАНТІЙ.\n" +"Перегляньте GNU General Public License, version 2 or later, щоб дізнатися більше." +"" + +#: Settings.ui.h:91 +msgid "About" +msgstr "Про програму" + +msgid "System Monitor" +msgstr "Системний монітор" + +msgid "Files" +msgstr "Файли" + +msgid "Settings" +msgstr "Параметри" diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..1038374 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: vi\n" + +msgid "System Monitor" +msgstr "Theo dõi hệ thống" + +msgid "Files" +msgstr "Tập tin" + +msgid "Settings" +msgstr "Cài đặt" diff --git a/po/yo.po b/po/yo.po new file mode 100644 index 0000000..1301fa1 --- /dev/null +++ b/po/yo.po @@ -0,0 +1,11 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: yo\n" + +msgid "Files" +msgstr "Fáìlì" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..e971e74 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,1311 @@ +# Dash to Panel Simplified Chinese Translation. +# This file is distributed under the same license as the Dash to Panel package. +# Boyuan Yang <073plan@gmail.com>, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: dash-to-panel 24\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-18 10:58-0400\n" +"PO-Revision-Date: 2019-10-18 11:00-0400\n" +"Last-Translator: Boyuan Yang <073plan@gmail.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: Poedit 2.2.4\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: prefs.js:211 +msgid "Top, with plugin icons collapsed to bottom" +msgstr "顶部,并且插件图标收缩到底部" + +#: prefs.js:211 +msgid "Left, with plugin icons collapsed to right" +msgstr "左侧,并且插件图标收缩到右侧" + +#: prefs.js:212 +msgid "Top, with fixed center plugin icons" +msgstr "顶部,并且固定居中插件图标" + +#: prefs.js:212 +msgid "Left, with fixed center plugin icons" +msgstr "左侧,并且固定居中插件图标" + +#: prefs.js:213 +msgid "Top, with floating center plugin icons" +msgstr "顶部,并且浮动居中插件图标" + +#: prefs.js:213 +msgid "Left, with floating center plugin icons" +msgstr "左侧,并且浮动居中插件图标" + +#: prefs.js:214 +msgid "Center, fixed in middle of monitor" +msgstr "中间,固定在显示屏中间" + +#: prefs.js:215 +msgid "Center, floating between top and bottom elements" +msgstr "中间,在顶部元素和底部元素之间浮动" + +#: prefs.js:215 +msgid "Center, floating between left and right elements" +msgstr "中间,在左侧元素和右侧元素之间浮动" + +#: prefs.js:219 +msgid "Top of plugin icons" +msgstr "插件图标上侧" + +#: prefs.js:219 +msgid "Left of plugin icons" +msgstr "插件图标左侧" + +#: prefs.js:220 +msgid "Bottom of plugin icons" +msgstr "插件图标下侧" + +#: prefs.js:220 +msgid "Right of plugin icons" +msgstr "插件图标右侧" + +#: prefs.js:221 +msgid "Top of system indicators" +msgstr "系统指示器上侧" + +#: prefs.js:221 +msgid "Left of system indicators" +msgstr "系统指示器左侧" + +#: prefs.js:222 +msgid "Bottom of system indicators" +msgstr "系统指示器下侧" + +#: prefs.js:222 +msgid "Right of system indicators" +msgstr "系统指示器右侧" + +#: prefs.js:223 +msgid "Top of taskbar" +msgstr "任务栏上侧" + +#: prefs.js:223 +msgid "Left of taskbar" +msgstr "任务栏左侧" + +#: prefs.js:224 +msgid "Bottom of taskbar" +msgstr "任务栏下侧" + +#: prefs.js:224 +msgid "Right of taskbar" +msgstr "任务栏右侧" + +#: prefs.js:230 +msgid "Show Desktop button height (px)" +msgstr "“显示桌面”按钮图标高度(像素)" + +#: prefs.js:230 +msgid "Show Desktop button width (px)" +msgstr "“显示桌面”按钮图标宽度(像素)" + +#: prefs.js:364 +msgid "Running Indicator Options" +msgstr "运行指示器选项" + +#: prefs.js:371 prefs.js:569 prefs.js:712 prefs.js:837 prefs.js:904 +#: prefs.js:992 prefs.js:1078 prefs.js:1325 prefs.js:1409 prefs.js:1474 +#: prefs.js:1510 prefs.js:1607 prefs.js:1641 prefs.js:1683 +msgid "Reset to defaults" +msgstr "恢复默认值" + +#: prefs.js:514 +msgid "Default (Primary monitor)" +msgstr "主显示器" + +#: prefs.js:517 +msgid "Monitor " +msgstr "显示器 " + +#: prefs.js:562 +msgid "Multi-monitors options" +msgstr "多显示器选项" + +#: prefs.js:705 +msgid "Dynamic opacity options" +msgstr "动态半透明选项" + +#: prefs.js:830 +msgid "Intellihide options" +msgstr "智能隐藏选项" + +#: prefs.js:897 +msgid "Show Applications options" +msgstr "“显示应用程序”选项" + +#: prefs.js:985 +msgid "Show Desktop options" +msgstr "“显示桌面”选项" + +#: prefs.js:1071 +msgid "Window preview options" +msgstr "窗口预览选项" + +#: prefs.js:1318 +msgid "Ungrouped application options" +msgstr "未分组的应用程序选项" + +#: prefs.js:1402 +msgid "Customize middle-click behavior" +msgstr "自定义中键点击行为" + +#: prefs.js:1467 +msgid "Customize panel scroll behavior" +msgstr "自定义面板滚动行为" + +#: prefs.js:1503 +msgid "Customize icon scroll behavior" +msgstr "自定义图标滚动行为" + +#: prefs.js:1600 +msgid "Advanced hotkeys options" +msgstr "高级热键选项" + +#: prefs.js:1634 +msgid "Secondary Menu Options" +msgstr "次级菜单选项" + +#: prefs.js:1676 Settings.ui.h:223 +msgid "Advanced Options" +msgstr "高级选项" + +#: prefs.js:1763 +msgid "Export settings" +msgstr "导出设置" + +#: prefs.js:1780 +msgid "Import settings" +msgstr "导入设置" + +#: appIcons.js:1380 +msgid "Show Details" +msgstr "显示细节" + +#: appIcons.js:1398 +msgid "New Window" +msgstr "新建窗口" + +#: appIcons.js:1398 appIcons.js:1458 appIcons.js:1460 Settings.ui.h:10 +msgid "Quit" +msgstr "退出" + +#: appIcons.js:1460 +msgid "Windows" +msgstr "窗口" + +#: appIcons.js:1684 +msgid "Power options" +msgstr "电源选项" + +#: appIcons.js:1689 +msgid "Event logs" +msgstr "事件日志" + +#: appIcons.js:1694 +msgid "System" +msgstr "系统" + +#: appIcons.js:1699 +msgid "Device Management" +msgstr "设备管理" + +#: appIcons.js:1704 +msgid "Disk Management" +msgstr "磁盘管理" + +#: appIcons.js:1711 +msgid "Terminal" +msgstr "终端" + +#: appIcons.js:1716 +msgid "System Monitor" +msgstr "系统监视器" + +#: appIcons.js:1721 +msgid "Files" +msgstr "文件" + +#: appIcons.js:1726 +msgid "Settings" +msgstr "导出设置设置" + +#: appIcons.js:1733 +msgid "Unlock taskbar" +msgstr "解锁任务栏" + +#: appIcons.js:1733 +msgid "Lock taskbar" +msgstr "锁定任务栏" + +#: appIcons.js:1738 +msgid "Taskbar Settings" +msgstr "任务栏设置" + +#: appIcons.js:1745 +msgid "Restore Windows" +msgstr "恢复窗口" + +#: appIcons.js:1745 +msgid "Show Desktop" +msgstr "显示桌面" + +#: update.js:58 +#, javascript-format +msgid "Version %s (%s) is available" +msgstr "版本 %s(%s)已经可用" + +#: update.js:59 +msgid "Details" +msgstr "详细信息" + +#: update.js:60 +msgid "Update" +msgstr "更新" + +#: update.js:63 +msgid "Already up to date" +msgstr "已经处于最新状态" + +#: update.js:148 +msgid "Update successful, please log out/in" +msgstr "更新成功,请注销并重新登录" + +#: update.js:149 +msgid "Log out" +msgstr "注销" + +#: update.js:153 +msgid "Update successful, please restart GNOME Shell" +msgstr "更新成功,请重新启动 GNOME Shell" + +#: update.js:154 +msgid "Restart GNOME Shell" +msgstr "重新启动 GNOME Shell" + +#: update.js:154 +msgid "Restarting GNOME Shell..." +msgstr "正在重新启动 GNOME Shell……" + +#: update.js:160 +msgid "Error: " +msgstr "错误:" + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "暂时什么都没有!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "设置为最小化时,双击将最小化该应用程序的所有窗口。" + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Shift+点击动作" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "提升窗口" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "最小化窗口" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "启动新实例" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "在窗口间循环切换" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "循环窗口 + 最小化" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "切换单个 / 预览多个" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "中键点击行为。" + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "中键点击动作" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Shift+中键点击的行为。" + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Shift+中键点击动作" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "隔离显示器" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "在所有显示器上显示收藏的应用程序" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "在所有显示器上显示时钟" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "在所有显示器上显示状态菜单" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "集成应用菜单项" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "显示细节菜单项" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "高亮显示取得焦点的应用程序" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "图标主颜色" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "自定义颜色" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "高亮不透明度" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "指示器高度(像素)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "指示器颜色 - 图标主色" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "指示器颜色 - 覆盖主题" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "1 窗口开启(或未分组)" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "应用至全部" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "2 窗口开启" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "3 窗口开启" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "4+ 窗口开启" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "为未取得焦点的程序使用不同方案" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "应用程序标题字体大小(像素)(默认值为 14)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "应用程序标题字体粗细" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "继承自主题" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "正常" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "较细" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "粗体" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "更粗" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "应用程序标题字体颜色" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "应用程序最大宽度(像素)(默认值为 160)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "为应用程序标题使用固定宽度" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"应用程序标题都将使用相同宽度,即使其文本宽度无法达到最大宽度。最大宽度值将被" +"用于固定宽度值。" + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "在未取得焦点的应用上显示运行指示器" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "使用收藏的图标作为应用程序启动器" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "仅在面板被窗口阻挡时隐藏 " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "触发面板隐藏的对象" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "所有窗口" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "获得焦点的窗口" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "最大化窗口" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "在屏幕边缘受到一定光标压力时显示面板" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "所需压力阈值(像素)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "所需压力超时(毫秒)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "允许面板在全屏幕模式下显示" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "只隐藏次要面板(需要多显示器选项)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "例如 i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "显示并保持面板的键盘快捷键" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "语法:, , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "隐藏与显示动画持续时间(毫秒)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "隐藏面板之前的延时(毫秒)" + +#: Settings.ui.h:62 +msgid "Delay before enabling intellihide on start (ms)" +msgstr "启动后到启用智能隐藏之间的延时(毫秒)" + +#: Settings.ui.h:63 +msgid "Time (ms) before showing (100 is default)" +msgstr "显示前的延时(毫秒,默认为 100)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "动画时间(毫秒)" + +#: Settings.ui.h:65 +msgid "Time (ms) before hiding (100 is default)" +msgstr "隐藏前的延时(毫秒,默认为 100)" + +#: Settings.ui.h:66 +msgid "Immediate on application icon click" +msgstr "点击应用程序图标后立即触发" + +#: Settings.ui.h:67 +msgid "Middle click on the preview to close the window" +msgstr "在预览上中键点击以关闭窗口" + +#: Settings.ui.h:68 +msgid "Window previews preferred size (px)" +msgstr "窗口预览偏好大小(像素)" + +#: Settings.ui.h:69 +msgid "Window previews aspect ratio Y (height)" +msgstr "窗口预览长宽比 X(高度)" + +#: Settings.ui.h:70 +msgid "Window previews padding (px)" +msgstr "窗口预览填充距离(像素)" + +#: Settings.ui.h:71 +msgid "1" +msgstr "1" + +#: Settings.ui.h:72 +msgid "2" +msgstr "2" + +#: Settings.ui.h:73 +msgid "3" +msgstr "3" + +#: Settings.ui.h:74 +msgid "4" +msgstr "4" + +#: Settings.ui.h:75 +msgid "5" +msgstr "5" + +#: Settings.ui.h:76 +msgid "6" +msgstr "6" + +#: Settings.ui.h:77 +msgid "7" +msgstr "7" + +#: Settings.ui.h:78 +msgid "8" +msgstr "8" + +#: Settings.ui.h:79 +msgid "9" +msgstr "9" + +#: Settings.ui.h:80 +msgid "10" +msgstr "10" + +#: Settings.ui.h:81 +msgid "11" +msgstr "11" + +#: Settings.ui.h:82 +msgid "12" +msgstr "12" + +#: Settings.ui.h:83 +msgid "13" +msgstr "13" + +#: Settings.ui.h:84 +msgid "14" +msgstr "14" + +#: Settings.ui.h:85 +msgid "15" +msgstr "15" + +#: Settings.ui.h:86 +msgid "16" +msgstr "16" + +#: Settings.ui.h:87 +msgid "17" +msgstr "17" + +#: Settings.ui.h:88 +msgid "18" +msgstr "18" + +#: Settings.ui.h:89 +msgid "19" +msgstr "19" + +#: Settings.ui.h:90 +msgid "20" +msgstr "20" + +#: Settings.ui.h:91 +msgid "21" +msgstr "21" + +#: Settings.ui.h:92 +msgid "Fixed" +msgstr "固定" + +#: Settings.ui.h:93 +msgid "Window previews aspect ratio X (width)" +msgstr "窗口预览长宽比 X(宽度)" + +#: Settings.ui.h:94 +msgid "Use custom opacity for the previews background" +msgstr "为预览背景使用自定义不透明度" + +#: Settings.ui.h:95 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "如果禁用,预览的背景与面板的不透明度将保持一致" + +#: Settings.ui.h:96 +msgid "Close button and header position" +msgstr "关闭按钮和头部的位置" + +#: Settings.ui.h:97 +msgid "Bottom" +msgstr "底部" + +#: Settings.ui.h:98 +msgid "Top" +msgstr "顶部" + +#: Settings.ui.h:99 +msgid "Display window preview headers" +msgstr "显示窗口预览头部" + +#: Settings.ui.h:100 +msgid "Font size (px) of the preview titles" +msgstr "预览标题的字体大小(像素)" + +#: Settings.ui.h:101 +msgid "Font weight of the preview titles" +msgstr "预览标题的字重" + +#: Settings.ui.h:102 +msgid "Font color of the preview titles" +msgstr "预览标题的字体颜色" + +#: Settings.ui.h:103 +msgid "Enable window peeking" +msgstr "启用窗口概览功能" + +#: Settings.ui.h:104 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "在窗口预览上悬浮一定时间后,该窗口将被区别显示。" + +#: Settings.ui.h:105 +msgid "Enter window peeking mode timeout (ms)" +msgstr "进入窗口概览模式延时(毫秒)" + +#: Settings.ui.h:106 +msgid "50" +msgstr "50" + +#: Settings.ui.h:107 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "为进入窗口概览模式,需要光标悬浮在预览窗口上不活动的时间。" + +#: Settings.ui.h:108 +msgid "Window peeking mode opacity" +msgstr "窗口概览模式不透明度" + +#: Settings.ui.h:109 +msgid "0" +msgstr "0" + +#: Settings.ui.h:110 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "除正在处于概览状态的窗口外,其它所有窗口的不透明度将被设置为同一个值。" + +#: Settings.ui.h:111 +msgid "Delay between mouse scroll events (ms)" +msgstr "鼠标滚动事件之间的延迟(毫秒)" + +#: Settings.ui.h:112 +msgid "Use this value to limit the number of captured mouse scroll events." +msgstr "使用这个值来限制对鼠标滚动事件捕捉的频率。" + +#: Settings.ui.h:113 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:114 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:115 +msgid "Hotkeys prefix" +msgstr "热键前缀" + +#: Settings.ui.h:116 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "热键可以是 Super+数字 或者 Super+Alt+数字" + +#: Settings.ui.h:117 +msgid "Never" +msgstr "从不" + +#: Settings.ui.h:118 +msgid "Show temporarily" +msgstr "暂时显示" + +#: Settings.ui.h:119 +msgid "Always visible" +msgstr "总是可见" + +#: Settings.ui.h:120 +msgid "Number overlay" +msgstr "数字附加显示" + +#: Settings.ui.h:121 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "使用热键时在应用图标上临时显示其对应数字。" + +#: Settings.ui.h:122 +msgid "Hide timeout (ms)" +msgstr "隐藏延时(毫秒)" + +#: Settings.ui.h:123 +msgid "e.g. q" +msgstr "例如 q" + +#: Settings.ui.h:124 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "显示两秒钟附加数字的快捷键" + +#: Settings.ui.h:125 +msgid "Show window previews on hotkey" +msgstr "按下热键时显示窗口预览" + +#: Settings.ui.h:126 +msgid "Show previews when the application have multiple instances" +msgstr "应用程序有多个实例时显示预览" + +#: Settings.ui.h:127 +msgid "Number row" +msgstr "键盘主数字行" + +#: Settings.ui.h:128 +msgid "Numeric keypad" +msgstr "数字小键盘" + +#: Settings.ui.h:129 +msgid "Both" +msgstr "两者" + +#: Settings.ui.h:130 +msgid "Hotkeys are activated with" +msgstr "热键激活来源" + +#: Settings.ui.h:131 +msgid "Select which keyboard number keys are used to activate the hotkeys" +msgstr "选择用于激活热键的键盘数字键" + +#: Settings.ui.h:132 +msgid "Current Show Applications icon" +msgstr "当前“显示应用程序”图标" + +#: Settings.ui.h:133 +msgid "Select a Show Applications image icon" +msgstr "选择一个“显示应用程序”图标图像" + +#: Settings.ui.h:134 +msgid "Custom Show Applications image icon" +msgstr "自定义“显示应用程序”图标图像" + +#: Settings.ui.h:135 +msgid "Show Applications icon side padding (px)" +msgstr "“显示应用程序”图标侧边距(像素)" + +#: Settings.ui.h:136 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "悬停在显示桌面按钮时展示桌面预览" + +#: Settings.ui.h:137 +msgid "Delay before revealing the desktop (ms)" +msgstr "展示桌面预览之前的延时(毫秒)" + +#: Settings.ui.h:138 +msgid "Fade duration (ms)" +msgstr "淡出延时(毫秒)" + +#: Settings.ui.h:139 +msgid "The panel background opacity is affected by" +msgstr "面板背景不透明度的影响因素" + +#: Settings.ui.h:140 +msgid "Change opacity when a window gets closer than (px)" +msgstr "在窗口多靠近时修改不透明度(像素 px)" + +#: Settings.ui.h:142 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "将不透明度修改为(%)" + +#: Settings.ui.h:143 +msgid "Opacity change animation duration (ms)" +msgstr "不透明度变更动画持续时间(毫秒)" + +#: Settings.ui.h:144 +msgid "Panel screen position" +msgstr "面板屏幕位置" + +#: Settings.ui.h:145 +msgid "Left" +msgstr "左侧" + +#: Settings.ui.h:146 +msgid "Right" +msgstr "右侧" + +#: Settings.ui.h:147 +msgid "Taskbar position" +msgstr "任务栏位置" + +#: Settings.ui.h:148 +msgid "Clock location" +msgstr "时钟位置" + +#: Settings.ui.h:149 +msgid "Display the main panel on" +msgstr "将主面板显示于" + +#: Settings.ui.h:150 +msgid "Display panels on all monitors" +msgstr "在所有显示器上显示面板" + +#: Settings.ui.h:151 +msgid "Panel Intellihide" +msgstr "面板智能隐藏" + +#: Settings.ui.h:152 +msgid "Hide and reveal the panel according to preferences" +msgstr "按照配置隐藏和显示面板" + +#: Settings.ui.h:153 +msgid "Position" +msgstr "位置" + +#: Settings.ui.h:154 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"面板大小\n" +"(默认为 48)" + +#: Settings.ui.h:156 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"应用图标边缘空白\n" +"(默认为 8)" + +#: Settings.ui.h:158 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"应用图标边缘空白\n" +"(默认为 4)" + +#: Settings.ui.h:160 +msgid "Running indicator position" +msgstr "运行指示器位置" + +#: Settings.ui.h:161 +msgid "Running indicator style (Focused app)" +msgstr "运行指示器风格(取得焦点的应用)" + +#: Settings.ui.h:162 +msgid "Dots" +msgstr "点" + +#: Settings.ui.h:163 +msgid "Squares" +msgstr "方块" + +#: Settings.ui.h:164 +msgid "Dashes" +msgstr "横线" + +#: Settings.ui.h:165 +msgid "Segmented" +msgstr "间断线" + +#: Settings.ui.h:166 +msgid "Solid" +msgstr "实心" + +#: Settings.ui.h:167 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:168 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:169 +msgid "Running indicator style (Unfocused apps)" +msgstr "运行指示器风格(未取得焦点的应用)" + +#: Settings.ui.h:170 +msgid "Override panel theme background color " +msgstr "覆盖面板主题背景颜色 " + +#: Settings.ui.h:171 +msgid "Override panel theme background opacity" +msgstr "覆盖面板主题背景不透明度" + +#: Settings.ui.h:173 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "面板背景不透明度(%)" + +#: Settings.ui.h:174 +msgid "Dynamic background opacity" +msgstr "动态背景不透明度" + +#: Settings.ui.h:175 +msgid "Change opacity when a window gets close to the panel" +msgstr "在有窗口接近面板时修改不透明度" + +#: Settings.ui.h:176 +msgid "Override panel theme gradient " +msgstr "覆盖面板主题渐变 " + +#: Settings.ui.h:178 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "渐变顶部颜色和不透明度(%)" + +#: Settings.ui.h:180 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "渐变底部颜色和不透明度(%)" + +#: Settings.ui.h:181 +msgid "Style" +msgstr "风格" + +#: Settings.ui.h:182 +msgid "Show favorite applications" +msgstr "显示收藏的应用程序" + +#: Settings.ui.h:183 +msgid "Show running applications" +msgstr "显示正在运行的应用程序" + +#: Settings.ui.h:184 +msgid "Show Applications icon" +msgstr "显示应用图标" + +#: Settings.ui.h:185 +msgid "Animate Show Applications." +msgstr "动画化显示应用程序。" + +#: Settings.ui.h:186 +msgid "Show Activities button" +msgstr "显示活动按钮" + +#: Settings.ui.h:187 +msgid "Show Desktop button" +msgstr "显示桌面按钮" + +#: Settings.ui.h:188 +msgid "Show AppMenu button" +msgstr "显示应用菜单按钮" + +#: Settings.ui.h:189 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "必须在优化工具中启用顶栏 > 显示应用菜单" + +#: Settings.ui.h:190 +msgid "Show window previews on hover" +msgstr "悬停时显示窗口预览" + +#: Settings.ui.h:191 +msgid "Show tooltip on hover" +msgstr "悬停时显示工具提示" + +#: Settings.ui.h:192 +msgid "Isolate Workspaces" +msgstr "隔离工作区" + +#: Settings.ui.h:193 +msgid "Ungroup applications" +msgstr "取消应用程序分组" + +#: Settings.ui.h:194 +msgid "Behavior" +msgstr "行为" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "点击正在运行应用程序图标时的行为。" + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "点击行为" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "切换窗口" + +#: Settings.ui.h:198 +msgid "Scroll panel action" +msgstr "滚动面板行为" + +#: Settings.ui.h:199 +msgid "Behavior when mouse scrolling over the panel." +msgstr "在面板上滚动鼠标滚轮时的行为。" + +#: Settings.ui.h:200 +msgid "Scroll icon action" +msgstr "滚动行为" + +#: Settings.ui.h:201 +msgid "Behavior when mouse scrolling over an application icon." +msgstr "在正在运行应用程序图标上滚动鼠标滚轮时的行为。" + +#: Settings.ui.h:202 +msgid "Do nothing" +msgstr "什么也不做" + +#: Settings.ui.h:203 +msgid "Switch workspace" +msgstr "切换工作区" + +#: Settings.ui.h:204 +msgid "Cycle windows" +msgstr "循环窗口" + +#: Settings.ui.h:205 +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:206 +msgid "Use hotkeys to activate apps" +msgstr "使用热键激活应用" + +#: Settings.ui.h:207 +msgid "Action" +msgstr "行为" + +#: Settings.ui.h:208 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"托盘字体大小\n" +"(0 = 主题默认)" + +#: Settings.ui.h:210 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"LeftBox 字体大小\n" +"(0 = 主题默认)" + +#: Settings.ui.h:212 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"托盘项边缘空白\n" +"(-1 = 主题默认)" + +#: Settings.ui.h:214 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"状态图标边缘空白\n" +"(-1 = 主题默认)" + +#: Settings.ui.h:216 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"LeftBox 边缘空白\n" +"(-1 = 主题默认)" + +#: Settings.ui.h:218 +msgid "Animate switching applications" +msgstr "动画切换应用程序" + +#: Settings.ui.h:219 +msgid "Animate launching new windows" +msgstr "动画启动新窗口" + +#: Settings.ui.h:220 +msgid "Keep original gnome-shell dash (overview)" +msgstr "保持原始 gnome-shell dash(预览)" + +#: Settings.ui.h:221 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "只在点击时激活面板菜单按钮(例如:日期菜单)" + +#: Settings.ui.h:222 +msgid "App icon secondary (right-click) menu" +msgstr "应用图标次级(右键点击)菜单" + +#: Settings.ui.h:224 +msgid "Fine-Tune" +msgstr "微调" + +#: Settings.ui.h:225 +msgid "version: " +msgstr "版本:" + +#: Settings.ui.h:226 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:227 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"使用下面的按钮以基于您当前的首选项创建一个设置文件;您稍后可使用该文件在其他" +"机器上导入设置。" + +#: Settings.ui.h:228 +msgid "Export and import settings" +msgstr "导入导出设置" + +#: Settings.ui.h:229 +msgid "Export to file" +msgstr "导出至文件" + +#: Settings.ui.h:230 +msgid "Import from file" +msgstr "从文件导入" + +#: Settings.ui.h:231 +msgid "" +"This allows you to update the extension directly from the GitHub repository." +msgstr "这样可以帮助您直接从 GitHub 仓库更新本扩展。" + +#: Settings.ui.h:232 +msgid "Updates" +msgstr "更新" + +#: Settings.ui.h:233 +msgid "Periodically check for updates" +msgstr "定期检查更新" + +#: Settings.ui.h:234 +msgid "Check now" +msgstr "立刻检查" + +#: Settings.ui.h:235 +msgid "" +"Be aware, these official Dash to " +"Panel releases might not be reviewed yet on extensions.gnome.org! Read more" +msgstr "" +"请注意,这些官方发布的 Dash to Panel " +"版本可能还没有通过 extensions.gnome.org 的审查! 详细了解" + +#: Settings.ui.h:236 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"本程序不提供任何担保。\n" +"请查看 GNU 通用公共许可证,第二版或更新版本 以了解详情。" + +#: Settings.ui.h:238 +msgid "About" +msgstr "关于" + +#~ msgid "Highlight color" +#~ msgstr "高亮颜色" + +#~ msgid "Preview timeout on icon leave (ms)" +#~ msgstr "离开图标时的预览延时(毫秒)" + +#~ msgid "" +#~ "If set too low, the window preview of running applications may seem to " +#~ "close too quickly when trying to enter the popup. If set too high, the " +#~ "preview may linger too long when moving to an adjacent icon." +#~ msgstr "" +#~ "如果设置过低,在尝试进入弹出菜单时正在运行程序的窗口预览可能会关闭得过快。" +#~ "如果设置过高,在移动至临接图标时预览可能滞留过长时间。" + +#~ msgid "Middle click to close window" +#~ msgstr "中键点击以关闭窗口" + +#~ msgid "Width of the window previews (px)" +#~ msgstr "窗口预览宽度(像素)" + +#~ msgid "Height of the window previews (px)" +#~ msgstr "窗口预览高度(像素)" + +#~ msgid "Padding of the window previews (px)" +#~ msgstr "窗口预览边缘宽度(像素)" + +#~ msgid "Natural" +#~ msgstr "自然" + +#~ msgid "Left side of panel" +#~ msgstr "面板左侧" + +#~ msgid "Centered in content" +#~ msgstr "内容居中" + +#~ msgid "Github" +#~ msgstr "Github" + +msgid "Weekday" +msgstr "工作日" + +msgid "Date" +msgstr "日期" + +msgid "Seconds" +msgstr "秒" diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..9694b65 --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"Project-Id-Version: Zorin OS\n" +"Language: zh_HK\n" + +msgid "System Monitor" +msgstr "系統監控" + +msgid "Files" +msgstr "檔案" + +msgid "Settings" +msgstr "設定值" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..84defa7 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,1079 @@ +# Dash to Panel Traditional Chinese Translation +# This file is distributed under the same license as the Dash To Panel package. +# +# Jack Wu , 2019. +# pan93412 , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: Dash To Panel\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-19 20:51+0800\n" +"PO-Revision-Date: 2019-07-28 14:38+0800\n" +"Last-Translator: pan93412 \n" +"Language-Team: Chinese (Traditional)\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: prefs.js:310 +msgid "Running Indicator Options" +msgstr "執行指示器選項" + +#: prefs.js:317 prefs.js:515 prefs.js:658 prefs.js:778 prefs.js:842 +#: prefs.js:930 prefs.js:1023 prefs.js:1260 prefs.js:1344 prefs.js:1455 +#: prefs.js:1489 prefs.js:1531 +msgid "Reset to defaults" +msgstr "重設至預設值" + +#: prefs.js:460 +msgid "Default (Primary monitor)" +msgstr "預設(主顯示器)" + +#: prefs.js:463 +msgid "Monitor " +msgstr "顯示器 " + +#: prefs.js:508 +msgid "Multi-monitors options" +msgstr "多顯示器選項" + +#: prefs.js:651 +msgid "Dynamic opacity options" +msgstr "動態半透明選項" + +#: prefs.js:771 +msgid "Intellihide options" +msgstr "智慧隱藏選項" + +#: prefs.js:835 +msgid "Show Applications options" +msgstr "“顯示應用程式”選項" + +#: prefs.js:923 +msgid "Show Desktop options" +msgstr "“顯示桌面”選項" + +#: prefs.js:1016 +msgid "Window preview options" +msgstr "視窗預覽選項" + +#: prefs.js:1253 +msgid "Ungrouped application options" +msgstr "未分組的應用程式選項" + +#: prefs.js:1337 +msgid "Customize middle-click behavior" +msgstr "自訂滑鼠中鍵點選行為" + +#: prefs.js:1448 +msgid "Advanced hotkeys options" +msgstr "進階快速鍵選項" + +#: prefs.js:1482 +msgid "Secondary Menu Options" +msgstr "次級選單選項" + +#: prefs.js:1524 +msgid "Advanced Options" +msgstr "進階選項" + +#: prefs.js:1611 +msgid "Export settings" +msgstr "匯出設定" + +#: prefs.js:1628 +msgid "Import settings" +msgstr "匯入設定" + +#: appIcons.js:1287 +msgid "Show Details" +msgstr "顯示詳細資訊" + +#: appIcons.js:1306 +msgid "New Window" +msgstr "建立視窗" + +#: appIcons.js:1306 appIcons.js:1368 appIcons.js:1370 +msgid "Quit" +msgstr "離開" + +#: appIcons.js:1370 +msgid "Windows" +msgstr "視窗" + +#: appIcons.js:1578 +msgid "Power options" +msgstr "電源選項" + +#: appIcons.js:1583 +msgid "Event logs" +msgstr "事件日誌" + +#: appIcons.js:1588 +msgid "System" +msgstr "系統" + +#: appIcons.js:1593 +msgid "Device Management" +msgstr "裝置管理" + +#: appIcons.js:1598 +msgid "Disk Management" +msgstr "磁碟管理" + +#: appIcons.js:1605 +msgid "Terminal" +msgstr "終端" + +#: appIcons.js:1610 +msgid "System Monitor" +msgstr "系統監視器" + +#: appIcons.js:1615 +msgid "Files" +msgstr "檔案" + +#: appIcons.js:1620 +msgid "Settings" +msgstr "設定" + +#: appIcons.js:1627 +msgid "Unlock taskbar" +msgstr "解鎖工作列" + +#: appIcons.js:1627 +msgid "Lock taskbar" +msgstr "鎖定工作列" + +#: appIcons.js:1632 +msgid "Taskbar Settings" +msgstr "工作列設定" + +#: appIcons.js:1639 +msgid "Restore Windows" +msgstr "復原視窗" + +#: appIcons.js:1639 +msgid "Show Desktop" +msgstr "顯示桌面" + +#: Settings.ui.h:1 +msgid "Nothing yet!" +msgstr "這裏什麼也沒有!" + +#: Settings.ui.h:2 +msgid "" +"When set to minimize, double clicking minimizes all the windows of the " +"application." +msgstr "當設定為最小化時,點兩下可將應用程式的所有視窗最小化。" + +#: Settings.ui.h:3 +msgid "Shift+Click action" +msgstr "Shift + 點選動作" + +#: Settings.ui.h:4 +msgid "Raise windows" +msgstr "抬升視窗" + +#: Settings.ui.h:5 +msgid "Minimize window" +msgstr "最小化視窗" + +#: Settings.ui.h:6 +msgid "Launch new instance" +msgstr "啟動新實例" + +#: Settings.ui.h:7 +msgid "Cycle through windows" +msgstr "在視窗間循環" + +#: Settings.ui.h:8 +msgid "Cycle windows + minimize" +msgstr "循環視窗並最小化" + +#: Settings.ui.h:9 +msgid "Toggle single / Preview multiple" +msgstr "切換單視窗 / 預覽多視窗" + +#: Settings.ui.h:11 +msgid "Behavior for Middle-Click." +msgstr "滑鼠中鍵行為。" + +#: Settings.ui.h:12 +msgid "Middle-Click action" +msgstr "滑鼠中鍵動作" + +#: Settings.ui.h:13 +msgid "Behavior for Shift+Middle-Click." +msgstr "Shift + 滑鼠中鍵行為。" + +#: Settings.ui.h:14 +msgid "Shift+Middle-Click action" +msgstr "Shift + 滑鼠中鍵動作" + +#: Settings.ui.h:15 +msgid "Isolate monitors" +msgstr "隔離顯示器" + +#: Settings.ui.h:16 +msgid "Display favorite applications on all monitors" +msgstr "在所有顯示器上顯示收藏的應用程式" + +#: Settings.ui.h:17 +msgid "Display the clock on all monitors" +msgstr "在所有顯示器上顯示時鐘" + +#: Settings.ui.h:18 +msgid "Display the status menu on all monitors" +msgstr "在所有顯示器上顯示狀態選單" + +#: Settings.ui.h:19 +msgid "Integrate AppMenu items" +msgstr "整合 AppMenu 項目" + +#: Settings.ui.h:20 +msgid "Show Details menu item" +msgstr "顯示詳細資料 選單項目" + +#: Settings.ui.h:21 +msgid "Highlight focused application" +msgstr "突顯焦點應用" + +#: Settings.ui.h:22 +msgid "Icon dominant color" +msgstr "圖示主色" + +#: Settings.ui.h:23 +msgid "Custom color" +msgstr "自訂顏色" + +#: Settings.ui.h:24 +msgid "Highlight opacity" +msgstr "突顯不透明度" + +#: Settings.ui.h:25 +msgid "Indicator height (px)" +msgstr "指示器高度(像素 px)" + +#: Settings.ui.h:26 +msgid "Indicator color - Icon Dominant" +msgstr "指示器顏色 - 主圖示" + +#: Settings.ui.h:27 +msgid "Indicator color - Override Theme" +msgstr "指示器顏色 - 覆寫主題" + +#: Settings.ui.h:28 +msgid "1 window open (or ungrouped)" +msgstr "打開了(或未分組)1 個視窗" + +#: Settings.ui.h:29 +msgid "Apply to all" +msgstr "全部套用" + +#: Settings.ui.h:30 +msgid "2 windows open" +msgstr "打開了 2 個視窗" + +#: Settings.ui.h:31 +msgid "3 windows open" +msgstr "打開了 3 個視窗" + +#: Settings.ui.h:32 +msgid "4+ windows open" +msgstr "打開了 4 個以上的視窗" + +#: Settings.ui.h:33 +msgid "Use different for unfocused" +msgstr "為未聚焦視窗使用不同樣式" + +#: Settings.ui.h:34 +msgid "Font size (px) of the application titles (default is 14)" +msgstr "應用程式標題字型大小(像素)(預設為 14)" + +#: Settings.ui.h:35 +msgid "Font weight of application titles" +msgstr "應用程式標題字型粗細" + +#: Settings.ui.h:36 +msgid "inherit from theme" +msgstr "繼承自主題" + +#: Settings.ui.h:37 +msgid "normal" +msgstr "normal" + +#: Settings.ui.h:38 +msgid "lighter" +msgstr "lighter" + +#: Settings.ui.h:39 +msgid "bold" +msgstr "bold" + +#: Settings.ui.h:40 +msgid "bolder" +msgstr "bolder" + +#: Settings.ui.h:41 +msgid "Font color of the application titles" +msgstr "應用程式標題字型顏色" + +#: Settings.ui.h:42 +msgid "Maximum width (px) of the application titles (default is 160)" +msgstr "應用程式標題寬度上限(像素)(預設為 160)" + +#: Settings.ui.h:43 +msgid "Use a fixed width for the application titles" +msgstr "為所有應用程式標題使用固定寬度" + +#: Settings.ui.h:44 +msgid "" +"The application titles all have the same width, even if their texts are " +"shorter than the maximum width. The maximum width value is used as the fixed " +"width." +msgstr "" +"所有的應用程式標題共用相同的寬度,即使它們的文字比寬度上限短。寬度上限值被用" +"作固定寬度。" + +#: Settings.ui.h:45 +msgid "Display running indicators on unfocused applications" +msgstr "在未聚焦的應用程式上顯示正在執行的指示器" + +#: Settings.ui.h:46 +msgid "Use the favorite icons as application launchers" +msgstr "為應用程式啟動器使用收藏的圖示" + +#: Settings.ui.h:47 +msgid "Only hide the panel when it is obstructed by windows " +msgstr "僅在面板被視窗阻擋時才將其隱藏 " + +#: Settings.ui.h:48 +msgid "The panel hides from" +msgstr "面板隱藏自" + +#: Settings.ui.h:49 +msgid "All windows" +msgstr "所有視窗" + +#: Settings.ui.h:50 +msgid "Focused windows" +msgstr "焦點視窗" + +#: Settings.ui.h:51 +msgid "Maximized windows" +msgstr "最大化視窗" + +#: Settings.ui.h:52 +msgid "Require pressure at the edge of the screen to reveal the panel" +msgstr "在螢幕邊緣受到一定游標壓力時顯示面板" + +#: Settings.ui.h:53 +msgid "Required pressure threshold (px)" +msgstr "所需壓力閾值(像素)" + +#: Settings.ui.h:54 +msgid "Required pressure timeout (ms)" +msgstr "所需壓力等候時間(毫秒)" + +#: Settings.ui.h:55 +msgid "Allow the panel to be revealed while in fullscreen mode" +msgstr "允許在全螢幕模式下顯示面板" + +#: Settings.ui.h:56 +msgid "Only hide secondary panels (requires multi-monitors option)" +msgstr "僅隱藏次級面板(需要多顯示器選項)" + +#: Settings.ui.h:57 +msgid "e.g. i" +msgstr "例如 i" + +#: Settings.ui.h:58 +msgid "Keyboard shortcut to reveal and hold the panel" +msgstr "顯示並保持面板的鍵盤快速鍵" + +#: Settings.ui.h:59 +msgid "Syntax: , , , " +msgstr "語法: , , , " + +#: Settings.ui.h:60 +msgid "Hide and reveal animation duration (ms)" +msgstr "隱藏及顯示動畫持續時間(毫秒)" + +#: Settings.ui.h:61 +msgid "Delay before hiding the panel (ms)" +msgstr "隱藏面板前的延遲(毫秒)" + +#: Settings.ui.h:62 +msgid "Time (ms) before showing (100 is default)" +msgstr "顯示前的延遲(毫秒)(預設為 100)" + +#: Settings.ui.h:63 +msgid "Time (ms) before hiding (100 is default)" +msgstr "隱藏前的延遲(毫秒)(預設為 100)" + +#: Settings.ui.h:64 +msgid "Animation time (ms)" +msgstr "動畫時間(毫秒)" + +#: Settings.ui.h:65 +msgid "Middle click on the preview to close the window" +msgstr "在預覽介面點選中鍵以關閉視窗" + +#: Settings.ui.h:66 +msgid "Window previews preferred size (px)" +msgstr "視窗預覽慣用大小(像素)" + +#: Settings.ui.h:67 +msgid "Window previews aspect ratio Y (height)" +msgstr "視窗預覽外觀比例 Y(高度)" + +#: Settings.ui.h:68 +msgid "Window previews padding (px)" +msgstr "視窗預覽間距(像素)" + +#: Settings.ui.h:69 +msgid "1" +msgstr "1" + +#: Settings.ui.h:70 +msgid "2" +msgstr "2" + +#: Settings.ui.h:71 +msgid "3" +msgstr "3" + +#: Settings.ui.h:72 +msgid "4" +msgstr "4" + +#: Settings.ui.h:73 +msgid "5" +msgstr "5" + +#: Settings.ui.h:74 +msgid "6" +msgstr "6" + +#: Settings.ui.h:75 +msgid "7" +msgstr "7" + +#: Settings.ui.h:76 +msgid "8" +msgstr "8" + +#: Settings.ui.h:77 +msgid "9" +msgstr "9" + +#: Settings.ui.h:78 +msgid "10" +msgstr "10" + +#: Settings.ui.h:79 +msgid "11" +msgstr "11" + +#: Settings.ui.h:80 +msgid "12" +msgstr "12" + +#: Settings.ui.h:81 +msgid "13" +msgstr "13" + +#: Settings.ui.h:82 +msgid "14" +msgstr "14" + +#: Settings.ui.h:83 +msgid "15" +msgstr "15" + +#: Settings.ui.h:84 +msgid "16" +msgstr "16" + +#: Settings.ui.h:85 +msgid "17" +msgstr "17" + +#: Settings.ui.h:86 +msgid "18" +msgstr "18" + +#: Settings.ui.h:87 +msgid "19" +msgstr "19" + +#: Settings.ui.h:88 +msgid "20" +msgstr "20" + +#: Settings.ui.h:89 +msgid "21" +msgstr "21" + +#: Settings.ui.h:90 +msgid "Fixed" +msgstr "固定" + +#: Settings.ui.h:91 +msgid "Window previews aspect ratio X (width)" +msgstr "視窗預覽外觀比例 X(寬度)" + +#: Settings.ui.h:92 +msgid "Use custom opacity for the previews background" +msgstr "為預覽介面背景使用自定義不透明度" + +#: Settings.ui.h:93 +msgid "If disabled, the previews background have the same opacity as the panel" +msgstr "若停用,則預覽介面背景將與面板使用相同的不透明度" + +#: Settings.ui.h:94 +msgid "Close button and header position" +msgstr "關閉按鈕及頁首位置" + +#: Settings.ui.h:95 +msgid "Bottom" +msgstr "底部" + +#: Settings.ui.h:96 +msgid "Top" +msgstr "頂部" + +#: Settings.ui.h:97 +msgid "Display window preview headers" +msgstr "顯示視窗預覽開頭" + +#: Settings.ui.h:98 +msgid "Font size (px) of the preview titles" +msgstr "預覽標題字型大小(像素)" + +#: Settings.ui.h:99 +msgid "Font weight of the preview titles" +msgstr "預覽標題字型粗細" + +#: Settings.ui.h:100 +msgid "Font color of the preview titles" +msgstr "預覽標題字型顏色" + +#: Settings.ui.h:101 +msgid "Enable window peeking" +msgstr "啟用視窗查看" + +#: Settings.ui.h:102 +msgid "" +"When hovering over a window preview for some time, the window gets " +"distinguished." +msgstr "當滑鼠指標在某一視窗預覽介面上懸停一段時間,區分該視窗。" + +#: Settings.ui.h:103 +msgid "Enter window peeking mode timeout (ms)" +msgstr "進入視窗查看模式等候時間(毫秒)" + +#: Settings.ui.h:104 +msgid "50" +msgstr "50" + +#: Settings.ui.h:105 +msgid "" +"Time of inactivity while hovering over a window preview needed to enter the " +"window peeking mode." +msgstr "當在某一視窗預覽介面上暫留並進入視窗查看模式所需的時間。" + +#: Settings.ui.h:106 +msgid "Window peeking mode opacity" +msgstr "視窗查看模式不透明度" + +#: Settings.ui.h:107 +msgid "0" +msgstr "0" + +#: Settings.ui.h:108 +msgid "" +"All windows except for the peeked one have their opacity set to the same " +"value." +msgstr "除被查看的視窗外,所有視窗的不透明度將被設定為同一值。" + +#: Settings.ui.h:109 +msgid "Super" +msgstr "Super" + +#: Settings.ui.h:110 +msgid "Super + Alt" +msgstr "Super + Alt" + +#: Settings.ui.h:111 +msgid "Hotkeys prefix" +msgstr "快速鍵" + +#: Settings.ui.h:112 +msgid "Hotkeys will either be Super+Number or Super+Alt+Num" +msgstr "快速鍵將被設定為 Super+Number 或者 Super+Alt+Num" + +#: Settings.ui.h:113 +msgid "Never" +msgstr "永不" + +#: Settings.ui.h:114 +msgid "Show temporarily" +msgstr "暫時顯示" + +#: Settings.ui.h:115 +msgid "Always visible" +msgstr "永遠顯示" + +#: Settings.ui.h:116 +msgid "Number overlay" +msgstr "編號重疊" + +#: Settings.ui.h:117 +msgid "" +"Temporarily show the application numbers over the icons when using the " +"hotkeys." +msgstr "當使用快速鍵時暫時在應用程式圖示上顯示其編號。" + +#: Settings.ui.h:118 +msgid "Hide timeout (ms)" +msgstr "隱藏等候時間(毫秒)" + +#: Settings.ui.h:119 +msgid "e.g. q" +msgstr "例如 q" + +#: Settings.ui.h:120 +msgid "Shortcut to show the overlay for 2 seconds" +msgstr "顯示 2 秒重疊的快速鍵" + +#: Settings.ui.h:121 +msgid "Show window previews on hotkey" +msgstr "使用快速鍵時顯示視窗預覽介面" + +#: Settings.ui.h:122 +msgid "Show previews when the application have multiple instances" +msgstr "當應用程式有多個實例時顯示預覽" + +#: Settings.ui.h:123 +msgid "Current Show Applications icon" +msgstr "目前的“顯示應用程式”圖示" + +#: Settings.ui.h:124 +msgid "Select a Show Applications image icon" +msgstr "選取一個“顯示應用程式”圖示" + +#: Settings.ui.h:125 +msgid "Custom Show Applications image icon" +msgstr "自訂“顯示應用程式”圖示圖片" + +#: Settings.ui.h:126 +msgid "Show Applications icon side padding (px)" +msgstr "“顯示應用程式”圖示邊框間距" + +#: Settings.ui.h:127 +msgid "Show Desktop button width (px)" +msgstr "“顯示桌面”按鈕大小(像素)" + +#: Settings.ui.h:128 +msgid "Reveal the desktop when hovering the Show Desktop button" +msgstr "當滑鼠指標在“顯示桌面”按鈕上懸停一段時間則預覽桌面" + +#: Settings.ui.h:129 +msgid "Delay before revealing the desktop (ms)" +msgstr "預覽桌面前的延遲(毫秒)" + +#: Settings.ui.h:130 +msgid "Fade duration (ms)" +msgstr "淡出效果持續時間(毫秒)" + +#: Settings.ui.h:131 +msgid "The panel background opacity is affected by" +msgstr "面板背景不透明度受影響於" + +#: Settings.ui.h:132 +msgid "Change opacity when a window gets closer than (px)" +msgstr "當視窗靠近時改變不透明度(像素)" + +#: Settings.ui.h:134 +#, no-c-format +msgid "Change opacity to (%)" +msgstr "改變不透明度為(%)" + +#: Settings.ui.h:135 +msgid "Opacity change animation duration (ms)" +msgstr "不透明度變化動畫持續時間(毫秒)" + +#: Settings.ui.h:136 +msgid "Panel screen position" +msgstr "面板在螢幕中所處的位置" + +#: Settings.ui.h:137 +msgid "Taskbar position" +msgstr "工作列位置" + +#: Settings.ui.h:138 +msgid "Left, with plugin icons collapsed to right" +msgstr "左側,並將外掛圖示摺疊到右側" + +#: Settings.ui.h:139 +msgid "Left, with fixed center plugin icons" +msgstr "左側,並固定居中外掛圖示" + +#: Settings.ui.h:140 +msgid "Left, with floating center plugin icons" +msgstr "左側,並浮動居中外掛圖示" + +#: Settings.ui.h:141 +msgid "Center, fixed in middle of monitor" +msgstr "中間,固定於顯示器中間" + +#: Settings.ui.h:142 +msgid "Center, floating between left and right elements" +msgstr "中間,在左側及右側元素中浮動" + +#: Settings.ui.h:143 +msgid "Clock location" +msgstr "時鐘位置" + +#: Settings.ui.h:144 +msgid "Left of plugin icons" +msgstr "外掛圖示左側" + +#: Settings.ui.h:145 +msgid "Right of plugin icons" +msgstr "外掛圖示右側" + +#: Settings.ui.h:146 +msgid "Left of system indicators" +msgstr "系統指示器左側" + +#: Settings.ui.h:147 +msgid "Right of system indicators" +msgstr "系統指示器右側" + +#: Settings.ui.h:148 +msgid "Left of taskbar" +msgstr "工作列左側" + +#: Settings.ui.h:149 +msgid "Right of taskbar" +msgstr "工作列右側" + +#: Settings.ui.h:150 +msgid "Display the main panel on" +msgstr "將主面板顯示於" + +#: Settings.ui.h:151 +msgid "Display panels on all monitors" +msgstr "在所有顯示器上顯示面板" + +#: Settings.ui.h:152 +msgid "Panel Intellihide" +msgstr "面板智慧隱藏" + +#: Settings.ui.h:153 +msgid "Hide and reveal the panel according to preferences" +msgstr "依偏好設定隱藏和顯示面板" + +#: Settings.ui.h:154 +msgid "Position" +msgstr "位置" + +#: Settings.ui.h:155 +msgid "" +"Panel Size\n" +"(default is 48)" +msgstr "" +"面板大小\n" +"(預設為 48)" + +#: Settings.ui.h:157 +msgid "" +"App Icon Margin\n" +"(default is 8)" +msgstr "" +"應用圖示邊界\n" +"(預設為 8)" + +#: Settings.ui.h:159 +msgid "" +"App Icon Padding\n" +"(default is 4)" +msgstr "" +"應用圖示邊框間距\n" +"(預設為 4)" + +#: Settings.ui.h:161 +msgid "Running indicator position" +msgstr "執行指示器位置" + +#: Settings.ui.h:162 +msgid "Running indicator style (Focused app)" +msgstr "執行指示器樣式(焦點應用)" + +#: Settings.ui.h:163 +msgid "Dots" +msgstr "點" + +#: Settings.ui.h:164 +msgid "Squares" +msgstr "方塊" + +#: Settings.ui.h:165 +msgid "Dashes" +msgstr "虛線" + +#: Settings.ui.h:166 +msgid "Segmented" +msgstr "分割線" + +#: Settings.ui.h:167 +msgid "Solid" +msgstr "實心" + +#: Settings.ui.h:168 +msgid "Ciliora" +msgstr "Ciliora" + +#: Settings.ui.h:169 +msgid "Metro" +msgstr "Metro" + +#: Settings.ui.h:170 +msgid "Running indicator style (Unfocused apps)" +msgstr "執行指示器樣式(未聚焦應用)" + +#: Settings.ui.h:171 +msgid "Override panel theme background color " +msgstr "覆寫面板主題背景色 " + +#: Settings.ui.h:172 +msgid "Override panel theme background opacity" +msgstr "覆寫面板主題背景不透明度" + +#: Settings.ui.h:174 +#, no-c-format +msgid "Panel background opacity (%)" +msgstr "面板背景不透明度(%)" + +#: Settings.ui.h:175 +msgid "Dynamic background opacity" +msgstr "動態背景不透明度" + +#: Settings.ui.h:176 +msgid "Change opacity when a window gets close to the panel" +msgstr "在有視窗接近面板時改變不透明度" + +#: Settings.ui.h:177 +msgid "Override panel theme gradient " +msgstr "覆寫面板主題漸變 " + +#: Settings.ui.h:179 +#, no-c-format +msgid "Gradient top color and opacity (%)" +msgstr "漸變頂部顏色和不透明度(%)" + +#: Settings.ui.h:181 +#, no-c-format +msgid "Gradient bottom color and opacity (%)" +msgstr "漸變底部顏色和不透明度(%)" + +#: Settings.ui.h:182 +msgid "Style" +msgstr "樣式" + +#: Settings.ui.h:183 +msgid "Show favorite applications" +msgstr "顯示收藏應用程式" + +#: Settings.ui.h:184 +msgid "Show running applications" +msgstr "顯示正在執行的應用程式" + +#: Settings.ui.h:185 +msgid "Show Applications icon" +msgstr "顯示應用程式圖示" + +#: Settings.ui.h:186 +msgid "Animate Show Applications." +msgstr "動畫化顯示應用程式" + +#: Settings.ui.h:187 +msgid "Show Activities button" +msgstr "顯示活動按鈕" + +#: Settings.ui.h:188 +msgid "Show Desktop button" +msgstr "顯示桌面按鈕" + +#: Settings.ui.h:189 +msgid "Show AppMenu button" +msgstr "顯示應用選單按鈕" + +#: Settings.ui.h:190 +msgid "Top Bar > Show App Menu must be enabled in Tweak Tool" +msgstr "必須在調校工具中啟用頂端列 > 應用程式選單" + +#: Settings.ui.h:191 +msgid "Show window previews on hover" +msgstr "懸停時顯示視窗預覽" + +#: Settings.ui.h:192 +msgid "Show tooltip on hover" +msgstr "懸停時顯示工具提示" + +#: Settings.ui.h:193 +msgid "Isolate Workspaces" +msgstr "隔離工作區" + +#: Settings.ui.h:194 +msgid "Ungroup applications" +msgstr "取消應用程式分組" + +#: Settings.ui.h:195 +msgid "Behaviour when clicking on the icon of a running application." +msgstr "點選正在執行的應用程式圖示時的行為。" + +#: Settings.ui.h:196 +msgid "Click action" +msgstr "點選行為" + +#: Settings.ui.h:197 +msgid "Toggle windows" +msgstr "切換視窗" + +#: Settings.ui.h:198 +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:199 +msgid "Use hotkeys to activate apps" +msgstr "使用熱鍵啟用應用" + +#: Settings.ui.h:200 +msgid "Behavior" +msgstr "行為" + +#: Settings.ui.h:201 +msgid "" +"Tray Font Size\n" +"(0 = theme default)" +msgstr "" +"工具列字型大小\n" +"(0 = 主題預設)" + +#: Settings.ui.h:203 +msgid "" +"LeftBox Font Size\n" +"(0 = theme default)" +msgstr "" +"LeftBox 字型大小\n" +"(0 = 主題預設)" + +#: Settings.ui.h:205 +msgid "" +"Tray Item Padding\n" +"(-1 = theme default)" +msgstr "" +"工具列項目間距\n" +"(-1 = 主題預設)" + +#: Settings.ui.h:207 +msgid "" +"Status Icon Padding\n" +"(-1 = theme default)" +msgstr "" +"狀態圖示間距\n" +"(-1 = 主題預設)" + +#: Settings.ui.h:209 +msgid "" +"LeftBox Padding\n" +"(-1 = theme default)" +msgstr "" +"LeftBox 間距\n" +"(-1 = 主題預設)" + +#: Settings.ui.h:211 +msgid "Animate switching applications" +msgstr "使切換應用程式時出現動畫" + +#: Settings.ui.h:212 +msgid "Animate launching new windows" +msgstr "使啟動新視窗時出現動畫" + +#: Settings.ui.h:213 +msgid "Keep original gnome-shell dash (overview)" +msgstr "保留原始 gnome-shell dash(預覽)" + +#: Settings.ui.h:214 +msgid "Activate panel menu buttons (e.g. date menu) on click only" +msgstr "僅在點選時啟用面板選單按鈕(例如日期選單)" + +#: Settings.ui.h:215 +msgid "App icon secondary (right-click) menu" +msgstr "應用圖示次級(右鍵點選)選單" + +#: Settings.ui.h:217 +msgid "Fine-Tune" +msgstr "微調" + +#: Settings.ui.h:218 +msgid "version: " +msgstr "版本: " + +#: Settings.ui.h:219 +msgid "GitHub" +msgstr "GitHub" + +#: Settings.ui.h:220 +msgid "" +"Use the buttons below to create a settings file from your current " +"preferences that can be imported on a different machine." +msgstr "" +"使用下面的按鈕以基於您目前的配置建立一份設定檔;您稍後可使用該檔案在其他機器" +"上匯入設定。" + +#: Settings.ui.h:221 +msgid "Export and import settings" +msgstr "匯入及匯出設定" + +#: Settings.ui.h:222 +msgid "Export to file" +msgstr "匯出至檔案" + +#: Settings.ui.h:223 +msgid "Import from file" +msgstr "從檔案匯入" + +#: Settings.ui.h:224 +msgid "" +"This program comes with ABSOLUTELY NO WARRANTY.\n" +"See the GNU General Public License, version 2 or later for details." +msgstr "" +"本程式不提供任何擔保。\n" +"請檢視 GNU 通用公共許可證 (GPL),第二版或更新版 以瞭解詳情。" + +#: Settings.ui.h:226 +msgid "About" +msgstr "關於" + +msgid "Weekday" +msgstr "週之日" + +msgid "Date" +msgstr "日期" + +msgid "Seconds" +msgstr "秒數" diff --git a/prefs.js b/prefs.js new file mode 100644 index 0000000..0951eab --- /dev/null +++ b/prefs.js @@ -0,0 +1,1037 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const GdkPixbuf = imports.gi.GdkPixbuf; +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; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Convenience = Me.imports.convenience; +const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); +const _ = Gettext.gettext; +const N_ = function(e) { return e }; +const Pos = Me.imports.panelPositions; + +const SCALE_UPDATE_TIMEOUT = 500; +const DEFAULT_PANEL_SIZES = [ 128, 96, 64, 48, 32, 24 ]; +const DEFAULT_MARGIN_SIZES = [ 32, 24, 16, 12, 8, 4, 0 ]; +const DEFAULT_PADDING_SIZES = [ 32, 24, 16, 12, 8, 4, 0, -1 ]; + +const SCHEMA_PATH = '/org/gnome/shell/extensions/zorin-taskbar/'; +const GSET = 'gnome-shell-extension-tool'; + +/** + * 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, shortcutName) { + let shortcut_text = settings.get_string(shortcutName + '-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(shortcutName, [shortcut]); + } + else { + settings.set_strv(shortcutName, []); + } +} + +function checkHotkeyPrefix(settings) { + settings.delay(); + + let hotkeyPrefix = settings.get_string('hotkey-prefix-text'); + if (hotkeyPrefix == 'Super') + hotkeyPrefix = ''; + else if (hotkeyPrefix == 'SuperAlt') + hotkeyPrefix = ''; + let [, mods] = Gtk.accelerator_parse(hotkeyPrefix); + let [, shift_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + let [, ctrl_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); + + let numHotkeys = 10; + for (let i = 1; i <= numHotkeys; i++) { + let number = i; + if (number == 10) + number = 0; + let key = Gdk.keyval_from_name(number.toString()); + let key_kp = Gdk.keyval_from_name('KP_' + number.toString()); + if (Gtk.accelerator_valid(key, mods)) { + let shortcut = Gtk.accelerator_name(key, mods); + let shortcut_kp = Gtk.accelerator_name(key_kp, mods); + + // Setup shortcut strings + settings.set_strv('app-hotkey-' + i, [shortcut]); + settings.set_strv('app-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, shift_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, shift_mods); + settings.set_strv('app-shift-hotkey-' + i, [shortcut]); + settings.set_strv('app-shift-hotkey-kp-' + i, [shortcut_kp]); + + // With + shortcut = Gtk.accelerator_name(key, ctrl_mods); + shortcut_kp = Gtk.accelerator_name(key_kp, ctrl_mods); + settings.set_strv('app-ctrl-hotkey-' + i, [shortcut]); + settings.set_strv('app-ctrl-hotkey-kp-' + i, [shortcut_kp]); + } + else { + // Reset default settings for the relevant keys if the + // accelerators are invalid + let keys = ['app-hotkey-' + i, 'app-shift-hotkey-' + i, 'app-ctrl-hotkey-' + i, // Regular numbers + 'app-hotkey-kp-' + i, 'app-shift-hotkey-kp-' + i, 'app-ctrl-hotkey-kp-' + i]; // Key-pad numbers + keys.forEach(function(val) { + settings.set_value(val, settings.get_default_value(val)); + }, this); + } + } + + settings.apply(); +} + +function mergeObjects(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +const Settings = new Lang.Class({ + Name: 'ZorinTaskbar.Settings', + + _init: function() { + this._settings = Convenience.getSettings('org.gnome.shell.extensions.zorin-taskbar'); + this._gnomeInterfaceSettings = Convenience.getSettings('org.gnome.desktop.interface'); + + 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.notebook = this._builder.get_object('settings_notebook'); + this.viewport = new Gtk.Viewport(); + this.viewport.add(this.notebook); + this.widget = new Gtk.ScrolledWindow(); + this.widget.add(this.viewport); + + + // Timeout to delay the update of the settings + this._panel_size_timeout = 0; + this._dot_height_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])); + }, + + _updateVerticalRelatedOptions: function() { + let position = this._getPanelPosition(this._currentMonitorIndex); + let isVertical = position == Pos.LEFT || position == Pos.RIGHT; + let showDesktopWidthLabel = this._builder.get_object('show_showdesktop_width_label'); + + showDesktopWidthLabel.set_text(_('Show Desktop button padding (px)')); + + this._displayPanelPositionsForMonitor(this._currentMonitorIndex); + }, + + _getPanelPositions: function() { + return Pos.getSettingsPositions(this._settings, 'panel-positions'); + }, + + _getPanelPosition: function(monitorIndex) { + let panelPositionsSettings = this._getPanelPositions(); + + return panelPositionsSettings[monitorIndex] || this._settings.get_string('panel-position'); + }, + + _setPanelPosition: function(position) { + let panelPositionsSettings = this._getPanelPositions(); + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let monitors = monitorSync ? this.monitors : [this._currentMonitorIndex]; + + monitors.forEach(m => panelPositionsSettings[m] = position); + + this._settings.set_string('panel-positions', JSON.stringify(panelPositionsSettings)); + }, + + _setPositionRadios: function(position) { + this._ignorePositionRadios = true; + + switch (position) { + case Pos.BOTTOM: + this._builder.get_object('position_bottom_button').set_active(true); + break; + case Pos.TOP: + this._builder.get_object('position_top_button').set_active(true); + break; + case Pos.LEFT: + this._builder.get_object('position_left_button').set_active(true); + break; + case Pos.RIGHT: + this._builder.get_object('position_right_button').set_active(true); + break; + } + + this._ignorePositionRadios = false; + }, + + _displayPanelPositionsForMonitor: function(monitorIndex) { + let taskbarListBox = this._builder.get_object('taskbar_display_listbox'); + + taskbarListBox.get_children().forEach(c => c.destroy()); + + let labels = {}; + let panelPosition = this._getPanelPosition(monitorIndex); + let isVertical = panelPosition == Pos.LEFT || panelPosition == Pos.RIGHT; + let panelElementPositionsSettings = Pos.getSettingsPositions(this._settings, 'panel-element-positions'); + let panelElementPositions = panelElementPositionsSettings[monitorIndex] || Pos.defaults; + let updateElementsSettings = () => { + let newPanelElementPositions = []; + let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); + let monitors = monitorSync ? this.monitors : [monitorIndex]; + + taskbarListBox.get_children().forEach(c => { + newPanelElementPositions.push({ + element: c.id, + visible: c.visibleToggleBtn.get_active(), + position: c.positionCombo.get_active_id() + }); + }); + + monitors.forEach(m => panelElementPositionsSettings[m] = newPanelElementPositions); + this._settings.set_string('panel-element-positions', JSON.stringify(panelElementPositionsSettings)); + }; + + this._setPositionRadios(panelPosition); + + labels[Pos.SHOW_APPS_BTN] = _('Show Applications button'); + labels[Pos.ACTIVITIES_BTN] = _('Activities button'); + labels[Pos.TASKBAR] = _('Taskbar'); + labels[Pos.DATE_MENU] = _('Date menu'); + labels[Pos.SYSTEM_MENU] = _('System menu'); + labels[Pos.LEFT_BOX] = _('Left box'); + labels[Pos.CENTER_BOX] = _('Center box'); + labels[Pos.RIGHT_BOX] = _('Right box'); + labels[Pos.DESKTOP_BTN] = _('Desktop button'); + + panelElementPositions.forEach(el => { + let row = new Gtk.ListBoxRow(); + let grid = new Gtk.Grid({ margin: 2, margin_left: 12, margin_right: 12, column_spacing: 8 }); + let upDownGrid = new Gtk.Grid({ column_spacing: 2 }); + let upBtn = new Gtk.Button({ tooltip_text: _('Move up') }); + let upImg = new Gtk.Image({ icon_name: 'go-up-symbolic', pixel_size: 12 }); + let downBtn = new Gtk.Button({ tooltip_text: _('Move down') }); + let downImg = new Gtk.Image({ icon_name: 'go-down-symbolic', pixel_size: 12 }); + let visibleToggleBtn = new Gtk.ToggleButton({ label: _('Visible'), active: el.visible }); + let positionCombo = new Gtk.ComboBoxText({ tooltip_text: _('Select element position') }); + let upDownClickHandler = limit => { + let index = row.get_index(); + + if (index != limit) { + taskbarListBox.remove(row); + taskbarListBox.insert(row, index + (!limit ? -1 : 1)); + updateElementsSettings(); + } + }; + + positionCombo.append(Pos.STACKED_TL, isVertical ? _('Stacked to top') : _('Stacked to left')); + positionCombo.append(Pos.STACKED_BR, isVertical ? _('Stacked to bottom') :_('Stacked to right')); + positionCombo.append(Pos.CENTERED, _('Centered')); + positionCombo.append(Pos.CENTERED_MONITOR, _('Monitor Center')); + positionCombo.set_active_id(el.position); + + upBtn.connect('clicked', () => upDownClickHandler(0)); + downBtn.connect('clicked', () => upDownClickHandler(panelElementPositions.length - 1)); + visibleToggleBtn.connect('toggled', () => updateElementsSettings()); + positionCombo.connect('changed', () => updateElementsSettings()); + + upBtn.add(upImg); + downBtn.add(downImg); + + upDownGrid.add(upBtn); + upDownGrid.add(downBtn); + + grid.add(upDownGrid); + grid.add(new Gtk.Label({ label: labels[el.element], xalign: 0, hexpand: true })); + + if (Pos.optionDialogFunctions[el.element]) { + let cogImg = new Gtk.Image({ icon_name: 'emblem-system-symbolic' }); + let optionsBtn = new Gtk.Button({ tooltip_text: _('More options') }); + + optionsBtn.get_style_context().add_class('circular'); + optionsBtn.add(cogImg); + grid.add(optionsBtn); + + optionsBtn.connect('clicked', () => this[Pos.optionDialogFunctions[el.element]]()); + } + + grid.add(visibleToggleBtn); + grid.add(positionCombo); + + row.id = el.element; + row.visibleToggleBtn = visibleToggleBtn; + row.positionCombo = positionCombo; + + row.add(grid); + taskbarListBox.add(row); + }); + + taskbarListBox.show_all(); + }, + + _showShowAppsButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Applications options'), + 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('show_applications_options'); + dialog.get_content_area().add(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-apps-override-escape', this._settings.get_default_value('show-apps-override-escape')); + this._settings.set_value('animate-show-apps', this._settings.get_default_value('animate-show-apps')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show_all(); + }, + + _showDateMenuOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Date Menu options'), + 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('date_menu_options'); + dialog.get_content_area().add(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._gnomeInterfaceSettings.set_value('clock-show-date', this._gnomeInterfaceSettings.get_default_value('clock-show-date')); + this._gnomeInterfaceSettings.set_value('clock-show-seconds', this._gnomeInterfaceSettings.get_default_value('clock-show-seconds')); + this._gnomeInterfaceSettings.set_value('clock-show-weekday', this._gnomeInterfaceSettings.get_default_value('clock-show-weekday')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show_all(); + }, + + _showDesktopButtonOptions: function() { + let dialog = new Gtk.Dialog({ title: _('Show Desktop options'), + 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_show_showdesktop_options'); + dialog.get_content_area().add(box); + + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('showdesktop-button-width', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('show-showdesktop-icon', this._settings.get_default_value('show-showdesktop-icon')); + + this._settings.set_value('showdesktop-button-width', this._settings.get_default_value('showdesktop-button-width')); + this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); + + this._settings.set_value('show-showdesktop-hover', this._settings.get_default_value('show-showdesktop-hover')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show_all(); + }, + + _bindSettings: function() { + // size options + let panel_size_scale = this._builder.get_object('panel_size_scale'); + panel_size_scale.set_range(DEFAULT_PANEL_SIZES[DEFAULT_PANEL_SIZES.length-1], DEFAULT_PANEL_SIZES[0]); + panel_size_scale.set_value(this._settings.get_int('panel-size')); + DEFAULT_PANEL_SIZES.slice(1, -1).forEach(function(val) { + panel_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 + panel_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 + panel_size_scale.set_flippable(false); + panel_size_scale.set_inverted(true); + } + + //multi-monitor + this.monitors = this._settings.get_value('available-monitors').deep_unpack(); + + let dtpPrimaryMonitorIndex = 0; + + this._currentMonitorIndex = this.monitors[dtpPrimaryMonitorIndex]; + + this._settings.connect('changed::panel-positions', () => this._updateVerticalRelatedOptions()); + this._updateVerticalRelatedOptions(); + + for (let i = 0; i < this.monitors.length; ++i) { + //the primary index is the first one in the "available-monitors" setting + let label = !i ? _('Primary monitor') : _('Monitor ') + (i + 1); + + this._builder.get_object('taskbar_position_monitor_combo').append_text(label); + } + + this._builder.get_object('taskbar_position_monitor_combo').set_active(dtpPrimaryMonitorIndex); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_sync_button'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('panel-element-positions-monitors-sync', + this._builder.get_object('taskbar_position_monitor_combo'), + 'sensitive', + Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._builder.get_object('taskbar_position_monitor_combo').connect('changed', Lang.bind (this, function(widget) { + this._currentMonitorIndex = this.monitors[widget.get_active()]; + this._displayPanelPositionsForMonitor(this._currentMonitorIndex); + })); + + //panel positions + this._displayPanelPositionsForMonitor(this._currentMonitorIndex); + + this._settings.bind('multi-monitors', + this._builder.get_object('multimon_multi_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + if (this.monitors.length === 1) { + this._builder.get_object('multimon_multi_switch').set_sensitive(false); + } + + //dynamic opacity + let rgba = new Gdk.RGBA(); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_override_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('trans-use-custom-opacity', + this._builder.get_object('trans_opacity_box'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('trans_opacity_spinbutton').set_value(this._settings.get_double('trans-panel-opacity') * 100); + this._builder.get_object('trans_opacity_spinbutton').connect('value-changed', Lang.bind(this, function (widget) { + this._settings.set_double('trans-panel-opacity', widget.get_value() * 0.01); + })); + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide', + this._builder.get_object('intellihide_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-floating-rounded-theme', + this._builder.get_object('intellihide_floating_rounded_theme_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_window_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-hide-from-windows', + this._builder.get_object('intellihide_behaviour_options'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-behaviour', + this._builder.get_object('intellihide_behaviour_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-use-pressure', + this._builder.get_object('intellihide_use_pressure_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-show-in-fullscreen', + this._builder.get_object('intellihide_show_in_fullscreen_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('intellihide-only-secondary', + this._builder.get_object('intellihide_only_secondary_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('multi-monitors', + this._builder.get_object('grid_intellihide_only_secondary'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('multimon_multi_switch').connect('notify::active', (widget) => { + if (!widget.get_active()) + this._builder.get_object('intellihide_only_secondary_switch').set_active(false); + }); + + this._settings.bind('intellihide-key-toggle-text', + this._builder.get_object('intellihide_toggle_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::intellihide-key-toggle-text', () => setShortcut(this._settings, 'intellihide-key-toggle')); + + this._builder.get_object('intellihide_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Intellihide options'), + 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_intellihide_options'); + dialog.get_content_area().add(box); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('intellihide-floating-rounded-theme', this._settings.get_default_value('intellihide-floating-rounded-theme')); + this._settings.set_value('intellihide-hide-from-windows', this._settings.get_default_value('intellihide-hide-from-windows')); + this._settings.set_value('intellihide-behaviour', this._settings.get_default_value('intellihide-behaviour')); + this._settings.set_value('intellihide-use-pressure', this._settings.get_default_value('intellihide-use-pressure')); + this._settings.set_value('intellihide-show-in-fullscreen', this._settings.get_default_value('intellihide-show-in-fullscreen')); + this._settings.set_value('intellihide-only-secondary', this._settings.get_default_value('intellihide-only-secondary')); + + this._settings.set_value('intellihide-key-toggle-text', this._settings.get_default_value('intellihide-key-toggle-text')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show_all(); + + })); + + // Behavior panel + + this._settings.bind('animate-show-apps', + this._builder.get_object('application_button_animation_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-apps-override-escape', + this._builder.get_object('show_applications_esc_key_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._gnomeInterfaceSettings.bind('clock-show-date', + this._builder.get_object('date_menu_date_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._gnomeInterfaceSettings.bind('clock-show-seconds', + this._builder.get_object('date_menu_seconds_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._gnomeInterfaceSettings.bind('clock-show-weekday', + this._builder.get_object('date_menu_weekday_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-hover', + this._builder.get_object('show_showdesktop_hide_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-showdesktop-icon', + this._builder.get_object('show_showdesktop_icon_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-window-previews', + this._builder.get_object('show_window_previews_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-tooltip', + this._builder.get_object('show_tooltip_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('show_favorite_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites-all-monitors', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-favorites', + this._builder.get_object('multimon_multi_show_favorites_switch'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('show-running-apps', + this._builder.get_object('show_runnning_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('show_window_previews_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Window preview options'), + 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 scrolledWindow = this._builder.get_object('box_window_preview_options'); + + adjustScrollableHeight(this._builder.get_object('viewport_window_preview_options'), scrolledWindow); + + dialog.get_content_area().add(scrolledWindow); + + this._settings.bind('preview-middle-click-close', + this._builder.get_object('preview_middle_click_close_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('peek-mode', + this._builder.get_object('peek_mode_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('window-preview-size', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('peek-mode', this._settings.get_default_value('peek-mode')); + + this._settings.set_value('window-preview-size', this._settings.get_default_value('window-preview-size')); + this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); + + this._settings.set_value('preview-middle-click-close', this._settings.get_default_value('preview-middle-click-close')); + + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(scrolledWindow); + dialog.destroy(); + } + return; + })); + + dialog.show_all(); + + })); + + this._settings.bind('isolate-workspaces', + this._builder.get_object('isolate_workspaces_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('isolate-monitors', + this._builder.get_object('multimon_multi_isolate_monitor_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps', + this._builder.get_object('group_apps_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('group-apps', + this._builder.get_object('show_group_apps_options_button'), + 'sensitive', + Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); + + this._settings.bind('group-apps-use-fixed-width', + this._builder.get_object('group_apps_use_fixed_width_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('group-apps-use-launchers', + this._builder.get_object('group_apps_use_launchers_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('show_group_apps_options_button').connect('clicked', Lang.bind(this, function() { + let dialog = new Gtk.Dialog({ title: _('Ungrouped application options'), + 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_group_apps_options'); + dialog.get_content_area().add(box); + + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').connect('value-changed', Lang.bind (this, function(widget) { + this._settings.set_int('group-apps-label-max-width', widget.get_value()); + })); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings + this._settings.set_value('group-apps-label-max-width', this._settings.get_default_value('group-apps-label-max-width')); + this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); + + this._settings.set_value('group-apps-use-fixed-width', this._settings.get_default_value('group-apps-use-fixed-width')); + this._settings.set_value('group-apps-use-launchers', this._settings.get_default_value('group-apps-use-launchers')); + } else { + // remove the settings box so it doesn't get destroyed; + dialog.get_content_area().remove(box); + dialog.destroy(); + } + return; + })); + + dialog.show_all(); + + })); + + this._builder.get_object('click_action_combo').set_active_id(this._settings.get_string('click-action')); + this._builder.get_object('click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('click-action', widget.get_active_id()); + })); + + this._builder.get_object('shift_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-click-action', widget.get_active_id()); + })); + + this._builder.get_object('middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('middle-click-action', widget.get_active_id()); + })); + this._builder.get_object('shift_middle_click_action_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shift-middle-click-action', widget.get_active_id()); + })); + + // 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_id(this._settings.get_string('shift-click-action')); + + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('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_id(this._settings.get_string('shift-click-action')); + this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); + this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('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(); + + })); + + this._builder.get_object('scroll_icon_combo').set_active_id(this._settings.get_string('scroll-icon-action')); + this._builder.get_object('scroll_icon_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('scroll-icon-action', widget.get_active_id()); + })); + + 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('overlay_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('hotkeys-overlay-combo', widget.get_active_id()); + })); + + this._settings.bind('shortcut-previews', + this._builder.get_object('shortcut_preview_switch'), + 'active', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('shortcut_num_keys_combo').set_active_id(this._settings.get_string('shortcut-num-keys')); + this._builder.get_object('shortcut_num_keys_combo').connect('changed', Lang.bind (this, function(widget) { + this._settings.set_string('shortcut-num-keys', widget.get_active_id()); + })); + + this._settings.connect('changed::hotkey-prefix-text', Lang.bind(this, function() {checkHotkeyPrefix(this._settings);})); + + this._builder.get_object('hotkey_prefix_combo').set_active_id(this._settings.get_string('hotkey-prefix-text')); + + this._settings.bind('hotkey-prefix-text', + this._builder.get_object('hotkey_prefix_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._builder.get_object('overlay_combo').set_active_id(this._settings.get_string('hotkeys-overlay-combo')); + + this._settings.bind('hotkeys-overlay-combo', + this._builder.get_object('overlay_combo'), + 'active-id', + Gio.SettingsBindFlags.DEFAULT); + + this._settings.bind('shortcut-text', + this._builder.get_object('shortcut_entry'), + 'text', + Gio.SettingsBindFlags.DEFAULT); + this._settings.connect('changed::shortcut-text', Lang.bind(this, function() {setShortcut(this._settings, 'shortcut');})); + + // Create dialog for number overlay options + this._builder.get_object('overlay_button').connect('clicked', Lang.bind(this, function() { + + let dialog = new Gtk.Dialog({ title: _('Advanced hotkeys options'), + 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); + + dialog.connect('response', Lang.bind(this, function(dialog, id) { + if (id == 1) { + // restore default settings for the relevant keys + let keys = ['hotkey-prefix-text', 'shortcut-text', 'hotkeys-overlay-combo', 'shortcut-previews']; + 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(); + + })); + }, + + /** + * Object containing all signals defined in the glade file + */ + _SignalHandler: { + + position_bottom_button_clicked_cb: function(button) { + if (!this._ignorePositionRadios && button.get_active()) this._setPanelPosition(Pos.BOTTOM); + }, + + position_top_button_clicked_cb: function(button) { + if (!this._ignorePositionRadios && button.get_active()) this._setPanelPosition(Pos.TOP); + }, + + position_left_button_clicked_cb: function(button) { + if (!this._ignorePositionRadios && button.get_active()) this._setPanelPosition(Pos.LEFT); + }, + + position_right_button_clicked_cb: function(button) { + if (!this._ignorePositionRadios && button.get_active()) this._setPanelPosition(Pos.RIGHT); + }, + + panel_size_scale_format_value_cb: function(scale, value) { + return value+ ' px'; + }, + + panel_size_scale_value_changed_cb: function(scale) { + // Avoid settings the size consinuosly + if (this._panel_size_timeout > 0) + Mainloop.source_remove(this._panel_size_timeout); + + this._panel_size_timeout = Mainloop.timeout_add(SCALE_UPDATE_TIMEOUT, Lang.bind(this, function() { + this._settings.set_int('panel-size', scale.get_value()); + this._panel_size_timeout = 0; + return GLib.SOURCE_REMOVE; + })); + } + } +}); + +function init() { + Convenience.initTranslations(); +} + +function buildPrefsWidget() { + let settings = new Settings(); + let widget = settings.widget; + + // I'd like the scrolled window to default to a size large enough to show all without scrolling, if it fits on the screen + // But, it doesn't seem possible, so I'm setting a minimum size if there seems to be enough screen real estate + widget.show_all(); + adjustScrollableHeight(settings.viewport, widget); + + return widget; +} + +function adjustScrollableHeight(viewport, scrollableWindow) { + let viewportSize = viewport.size_request(); + let screenHeight = scrollableWindow.get_screen().get_height() - 120; + + scrollableWindow.set_size_request(viewportSize.width, viewportSize.height > screenHeight ? screenHeight : viewportSize.height); +} diff --git a/progress.js b/progress.js new file mode 100644 index 0000000..e1d493f --- /dev/null +++ b/progress.js @@ -0,0 +1,600 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + */ + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Gio = imports.gi.Gio; +const Cairo = imports.cairo; +const Clutter = imports.gi.Clutter; +const Pango = imports.gi.Pango; +const St = imports.gi.St; +const Signals = imports.signals; +const Utils = Me.imports.utils; + + +var ProgressManager = Utils.defineClass({ + Name: 'ZorinTaskbar.ProgressManager', + + _init: function() { + + this._entriesByDBusName = {}; + + this._launcher_entry_dbus_signal_id = + Gio.DBus.session.signal_subscribe(null, // sender + 'com.canonical.Unity.LauncherEntry', // iface + null, // member + null, // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onEntrySignalReceived.bind(this)); + + this._dbus_name_owner_changed_signal_id = + Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender + 'org.freedesktop.DBus', // interface + 'NameOwnerChanged', // member + '/org/freedesktop/DBus', // path + null, // arg0 + Gio.DBusSignalFlags.NONE, + this._onDBusNameOwnerChanged.bind(this)); + + this._acquireUnityDBus(); + }, + + destroy: function() { + if (this._launcher_entry_dbus_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id); + } + + if (this._dbus_name_owner_changed_signal_id) { + Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id); + } + + this._releaseUnityDBus(); + }, + + size: function() { + return Object.keys(this._entriesByDBusName).length; + }, + + lookupByDBusName: function(dbusName) { + return this._entriesByDBusName.hasOwnProperty(dbusName) ? this._entriesByDBusName[dbusName] : null; + }, + + lookupById: function(appId) { + let ret = []; + for (let dbusName in this._entriesByDBusName) { + let entry = this._entriesByDBusName[dbusName]; + if (entry && entry.appId() == appId) { + ret.push(entry); + } + } + + return ret; + }, + + addEntry: function(entry) { + let existingEntry = this.lookupByDBusName(entry.dbusName()); + if (existingEntry) { + existingEntry.update(entry); + } else { + this._entriesByDBusName[entry.dbusName()] = entry; + this.emit('progress-entry-added', entry); + } + }, + + removeEntry: function(entry) { + delete this._entriesByDBusName[entry.dbusName()] + this.emit('progress-entry-removed', entry); + }, + + _acquireUnityDBus: function() { + if (!this._unity_bus_id) { + Gio.DBus.session.own_name('com.canonical.Unity', + Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null); + } + }, + + _releaseUnityDBus: function() { + if (this._unity_bus_id) { + Gio.DBus.session.unown_name(this._unity_bus_id); + this._unity_bus_id = 0; + } + }, + + _onEntrySignalReceived: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !signal_name) + return; + + if (signal_name == 'Update') { + if (!sender_name) { + return; + } + + this._handleUpdateRequest(sender_name, parameters); + } + }, + + _onDBusNameOwnerChanged: function(connection, sender_name, object_path, + interface_name, signal_name, parameters, user_data) { + if (!parameters || !this.size()) + return; + + let [name, before, after] = parameters.deep_unpack(); + + if (!after) { + if (this._entriesByDBusName.hasOwnProperty(before)) { + this.removeEntry(this._entriesByDBusName[before]); + } + } + }, + + _handleUpdateRequest: function(senderName, parameters) { + if (!senderName || !parameters) { + return; + } + + let [appUri, properties] = parameters.deep_unpack(); + let appId = appUri.replace(/(^\w+:|^)\/\//, ''); + let entry = this.lookupByDBusName(senderName); + + if (entry) { + entry.setDBusName(senderName); + entry.update(properties); + } else { + let entry = new AppProgress(senderName, appId, properties); + this.addEntry(entry); + } + } +}); +Signals.addSignalMethods(ProgressManager.prototype); + +var AppProgress = Utils.defineClass({ + Name: 'ZorinTaskbar.AppProgress', + + _init: function(dbusName, appId, properties) { + this._dbusName = dbusName; + this._appId = appId; + this._count = 0; + this._countVisible = false; + this._progress = 0.0; + this._progressVisible = false; + this._urgent = false; + this.update(properties); + }, + + appId: function() { + return this._appId; + }, + + dbusName: function() { + return this._dbusName; + }, + + count: function() { + return this._count; + }, + + setCount: function(count) { + if (this._count != count) { + this._count = count; + this.emit('count-changed', this._count); + } + }, + + countVisible: function() { + return this._countVisible; + }, + + setCountVisible: function(countVisible) { + if (this._countVisible != countVisible) { + this._countVisible = countVisible; + this.emit('count-visible-changed', this._countVisible); + } + }, + + progress: function() { + return this._progress; + }, + + setProgress: function(progress) { + if (this._progress != progress) { + this._progress = progress; + this.emit('progress-changed', this._progress); + } + }, + + progressVisible: function() { + return this._progressVisible; + }, + + setProgressVisible: function(progressVisible) { + if (this._progressVisible != progressVisible) { + this._progressVisible = progressVisible; + this.emit('progress-visible-changed', this._progressVisible); + } + }, + + urgent: function() { + return this._urgent; + }, + + setUrgent: function(urgent) { + if (this._urgent != urgent) { + this._urgent = urgent; + this.emit('urgent-changed', this._urgent); + } + }, + + setDBusName: function(dbusName) { + if (this._dbusName != dbusName) { + let oldName = this._dbusName; + this._dbusName = dbusName; + this.emit('dbus-name-changed', oldName); + } + }, + + update: function(other) { + if (other instanceof AppProgress) { + this.setDBusName(other.dbusName()) + this.setCount(other.count()); + this.setCountVisible(other.countVisible()); + this.setProgress(other.progress()); + this.setProgressVisible(other.progressVisible()) + this.setUrgent(other.urgent()); + } else { + for (let property in other) { + if (other.hasOwnProperty(property)) { + if (property == 'count') { + this.setCount(other[property].get_int64()); + } else if (property == 'count-visible') { + this.setCountVisible(Me.settings.get_boolean('progress-show-count') && other[property].get_boolean()); + } else if (property == 'progress') { + this.setProgress(other[property].get_double()); + } else if (property == 'progress-visible') { + this.setProgressVisible(Me.settings.get_boolean('progress-show-bar') && other[property].get_boolean()); + } else if (property == 'urgent') { + this.setUrgent(other[property].get_boolean()); + } else { + // Not implemented yet + } + } + } + } + } +}); +Signals.addSignalMethods(AppProgress.prototype); + + +var ProgressIndicator = Utils.defineClass({ + Name: 'ZorinTaskbar.ProgressIndicator', + + _init: function(source, progressManager) { + this._source = source; + this._progressManager = progressManager; + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + this._sourceDestroyId = this._source.actor.connect('destroy', () => { + this._signalsHandler.destroy(); + }); + + this._notificationBadgeLabel = new St.Label({ style_class: 'badge' }); + this._notificationBadgeBin = new St.Bin({ + child: this._notificationBadgeLabel, + x_align: Clutter.ActorAlign.END, + y_align: Clutter.ActorAlign.START, + x_expand: true, y_expand: true + }); + this._notificationBadgeLabel.add_style_class_name('notification-badge'); + this._notificationBadgeCount = 0; + this._notificationBadgeBin.hide(); + + this._source._dtpIconContainer.add_child(this._notificationBadgeBin); + this._source._dtpIconContainer.connect('notify::allocation', this.updateNotificationBadge.bind(this)); + + this._progressManagerEntries = []; + this._progressManager.lookupById(this._source.app.id).forEach( + (entry) => { + this.insertEntry(entry); + } + ); + + this._signalsHandler.add([ + this._progressManager, + 'progress-entry-added', + this._onEntryAdded.bind(this) + ], [ + this._progressManager, + 'progress-entry-removed', + this._onEntryRemoved.bind(this) + ]); + }, + + destroy: function() { + this._source.actor.disconnect(this._sourceDestroyId); + this._signalsHandler.destroy(); + }, + + _onEntryAdded: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.insertEntry(entry); + } + }, + + _onEntryRemoved: function(appProgress, entry) { + if (!entry || !entry.appId()) + return; + + if (this._source && this._source.app && this._source.app.id == entry.appId()) { + this.removeEntry(entry); + } + }, + + updateNotificationBadge: function() { + this._source.updateNumberOverlay(this._notificationBadgeBin); + this._notificationBadgeLabel.clutter_text.ellipsize = Pango.EllipsizeMode.MIDDLE; + }, + + _notificationBadgeCountToText: function(count) { + if (count <= 9999) { + return count.toString(); + } else if (count < 1e5) { + let thousands = count / 1e3; + return thousands.toFixed(1).toString() + "k"; + } else if (count < 1e6) { + let thousands = count / 1e3; + return thousands.toFixed(0).toString() + "k"; + } else if (count < 1e8) { + let millions = count / 1e6; + return millions.toFixed(1).toString() + "M"; + } else if (count < 1e9) { + let millions = count / 1e6; + return millions.toFixed(0).toString() + "M"; + } else { + let billions = count / 1e9; + return billions.toFixed(1).toString() + "B"; + } + }, + + setNotificationBadge: function(count) { + this._notificationBadgeCount = count; + let text = this._notificationBadgeCountToText(count); + this._notificationBadgeLabel.set_text(text); + }, + + toggleNotificationBadge: function(activate) { + if (activate && this._notificationBadgeCount > 0) { + this.updateNotificationBadge(); + this._notificationBadgeBin.show(); + } + else + this._notificationBadgeBin.hide(); + }, + + _showProgressOverlay: function() { + if (this._progressOverlayArea) { + this._updateProgressOverlay(); + return; + } + + this._progressOverlayArea = new St.DrawingArea({x_expand: true, y_expand: true}); + this._progressOverlayArea.add_style_class_name('progress-bar'); + this._progressOverlayArea.connect('repaint', () => { + this._drawProgressOverlay(this._progressOverlayArea); + }); + + this._source._iconContainer.add_child(this._progressOverlayArea); + let node = this._progressOverlayArea.get_theme_node(); + + let [hasColor, color] = node.lookup_color('-progress-bar-background', false); + if (hasColor) + this._progressbar_background = color + else + this._progressbar_background = new Clutter.Color({red: 204, green: 204, blue: 204, alpha: 255}); + + [hasColor, color] = node.lookup_color('-progress-bar-border', false); + if (hasColor) + this._progressbar_border = color; + else + this._progressbar_border = new Clutter.Color({red: 230, green: 230, blue: 230, alpha: 255}); + + this._updateProgressOverlay(); + }, + + _hideProgressOverlay: function() { + if (this._progressOverlayArea) + this._progressOverlayArea.destroy(); + + this._progressOverlayArea = null; + this._progressbar_background = null; + this._progressbar_border = null; + }, + + _updateProgressOverlay: function() { + + if (this._progressOverlayArea) { + this._progressOverlayArea.queue_repaint(); + } + }, + + _drawProgressOverlay: function(area) { + let scaleFactor = Utils.getScaleFactor(); + let [surfaceWidth, surfaceHeight] = area.get_surface_size(); + let cr = area.get_context(); + + let iconSize = this._source.icon.iconSize * scaleFactor; + + let x = Math.floor((surfaceWidth - iconSize) / 2); + let y = Math.floor((surfaceHeight - iconSize) / 2); + + let lineWidth = Math.floor(1.0 * scaleFactor); + let padding = Math.floor(iconSize * 0.05); + let width = iconSize - 2.0*padding; + let height = Math.floor(Math.min(18.0*scaleFactor, 0.20*iconSize)); + x += padding; + y += iconSize - height - padding; + + cr.setLineWidth(lineWidth); + + // Draw the outer stroke + let stroke = new Cairo.LinearGradient(0, y, 0, y + height); + let fill = null; + stroke.addColorStopRGBA(1.0, 1.0, 1.0, 1.0, 0.1); + stroke.addColorStopRGBA(1.0, 1.0, 1.0, 1.0, 0.1); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the background + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + stroke = null; + fill = new Cairo.LinearGradient(0, y, 0, y + height); + fill.addColorStopRGBA(0.0, 0.0, 0.0, 0.0, 1.0); + fill.addColorStopRGBA(0.0, 0.0, 0.0, 0.0, 1.0); + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); + + // Draw the finished bar + x += lineWidth; + y += lineWidth; + width -= 2.0*lineWidth; + height -= 2.0*lineWidth; + + let finishedWidth = Math.ceil(this._progress * width); + + let bg = this._progressbar_background; + let bd = this._progressbar_border; + + stroke = Cairo.SolidPattern.createRGBA(bd.red/255, bd.green/255, bd.blue/255, bd.alpha/255); + fill = Cairo.SolidPattern.createRGBA(bg.red/255, bg.green/255, bg.blue/255, bg.alpha/255); + + if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) + Utils.drawRoundedLine(cr, x + lineWidth/2.0 + width - finishedWidth, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + else + Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); + + cr.$dispose(); + }, + + setProgress: function(progress) { + this._progress = Math.min(Math.max(progress, 0.0), 1.0); + this._updateProgressOverlay(); + }, + + toggleProgressOverlay: function(activate) { + if (activate) { + this._showProgressOverlay(); + } + else { + this._hideProgressOverlay(); + } + }, + + insertEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) !== -1) + return; + + this._progressManagerEntries.push(appProgress); + this._selectEntry(appProgress); + }, + + removeEntry: function(appProgress) { + if (!appProgress || this._progressManagerEntries.indexOf(appProgress) == -1) + return; + + this._progressManagerEntries.splice(this._progressManagerEntries.indexOf(appProgress), 1); + + if (this._progressManagerEntries.length > 0) { + this._selectEntry(this._progressManagerEntries[this._progressManagerEntries.length-1]); + } else { + this.setNotificationBadge(0); + this.toggleNotificationBadge(false); + this.setProgress(0); + this.toggleProgressOverlay(false); + this.setUrgent(false); + } + }, + + _selectEntry: function(appProgress) { + if (!appProgress) + return; + + this._signalsHandler.removeWithLabel('progress-entry'); + + this._signalsHandler.addWithLabel('progress-entry', + [ + appProgress, + 'count-changed', + (appProgress, value) => { + this.setNotificationBadge(value); + } + ], [ + appProgress, + 'count-visible-changed', + (appProgress, value) => { + this.toggleNotificationBadge(value); + } + ], [ + appProgress, + 'progress-changed', + (appProgress, value) => { + this.setProgress(value); + } + ], [ + appProgress, + 'progress-visible-changed', + (appProgress, value) => { + this.toggleProgressOverlay(value); + } + ], [ + appProgress, + 'urgent-changed', + (appProgress, value) => this.setUrgent(value) + ]); + + this.setNotificationBadge(appProgress.count()); + this.toggleNotificationBadge(appProgress.countVisible()); + this.setProgress(appProgress.progress()); + this.toggleProgressOverlay(appProgress.progressVisible()); + + this._isUrgent = false; + }, + + setUrgent(urgent) { + const icon = this._source.icon._iconBin; + if (urgent) { + if (!this._isUrgent) { + icon.set_pivot_point(0.5, 0.5); + this._source.iconAnimator.addAnimation(icon, 'dance'); + this._isUrgent = true; + } + } else { + if (this._isUrgent) { + this._source.iconAnimator.removeAnimation(icon, 'dance'); + this._isUrgent = false; + } + icon.rotation_angle_z = 0; + } + } +}); diff --git a/proximity.js b/proximity.js new file mode 100644 index 0000000..641d0aa --- /dev/null +++ b/proximity.js @@ -0,0 +1,265 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Panel extension + */ + +const Lang = imports.lang; +const Meta = imports.gi.Meta; + +const Layout = imports.ui.layout; +const Main = imports.ui.main; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Utils = Me.imports.utils; + +//timeout intervals +const MIN_UPDATE_MS = 200; + +//timeout names +const T1 = 'limitUpdateTimeout'; + +var Mode = { + ALL_WINDOWS: 0, + FOCUSED_WINDOWS: 1, + MAXIMIZED_WINDOWS: 2 +}; + +var ProximityWatch = Utils.defineClass({ + Name: 'ZorinTaskbar.ProximityWatch', + + _init: function(actor, mode, xThreshold, yThreshold, handler) { + this.actor = actor; + this.overlap = 0; + this.mode = mode; + this.threshold = [xThreshold, yThreshold]; + this.handler = handler; + + this._allocationChangedId = actor.connect('notify::allocation', () => this._update()); + + this._update(); + }, + + destroy: function() { + this.actor.disconnect(this._allocationChangedId); + }, + + _update: function() { + this.monitorIndex = Main.layoutManager.findIndexForActor(this.actor); + + this._updateWatchRect(); + }, + + _updateWatchRect: function() { + let [actorX, actorY] = this.actor.get_position(); + + this.rect = new Meta.Rectangle({ + x: actorX - this.threshold[0], + y: actorY - this.threshold[1], + width: this.actor.width + this.threshold[0] * 2, + height: this.actor.height + this.threshold[1] * 2 + }); + }, +}); + +var ProximityManager = Utils.defineClass({ + Name: 'ZorinTaskbar.ProximityManager', + + _init: function() { + this._counter = 1; + this._watches = {}; + this._focusedWindowInfo = null; + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._timeoutsHandler = new Utils.TimeoutsHandler(); + + this._bindSignals(); + this._setFocusedWindow(); + }, + + createWatch: function(actor, mode, xThreshold, yThreshold, handler) { + let watch = new ProximityWatch(actor, mode, xThreshold, yThreshold, handler); + + this._watches[this._counter] = watch; + this.update(); + + return this._counter++; + }, + + removeWatch: function(id) { + if (this._watches[id]) { + this._watches[id].destroy(); + delete this._watches[id]; + } + }, + + update: function() { + this._queueUpdate(true); + }, + + destroy: function() { + this._signalsHandler.destroy(); + this._timeoutsHandler.destroy(); + this._disconnectFocusedWindow(); + Object.keys(this._watches).forEach(id => this.removeWatch(id)); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + global.window_manager, + 'switch-workspace', + () => Object.keys(this._watches).forEach(id => this._watches[id].overlap = 0) + ], + [ + Main.overview, + 'hidden', + () => this._queueUpdate() + ], + [ + global.display, + 'notify::focus-window', + () => { + this._setFocusedWindow(); + this._queueUpdate(); + } + ], + [ + global.window_group, + [ + 'actor-added', + 'actor-removed' + ], + () => this._queueUpdate() + ] + ); + }, + + _setFocusedWindow: function() { + this._disconnectFocusedWindow(); + + let focusedWindow = global.display.focus_window; + + if (focusedWindow) { + let focusedWindowInfo = this._getFocusedWindowInfo(focusedWindow); + + if (focusedWindowInfo && this._checkIfHandledWindowType(focusedWindowInfo.metaWindow)) { + focusedWindowInfo.allocationId = focusedWindowInfo.window.connect('notify::allocation', () => this._queueUpdate()); + focusedWindowInfo.destroyId = focusedWindowInfo.window.connect('destroy', () => this._disconnectFocusedWindow(true)); + + this._focusedWindowInfo = focusedWindowInfo; + } + } + }, + + _getFocusedWindowInfo: function(focusedWindow) { + let window = focusedWindow.get_compositor_private(); + let focusedWindowInfo; + + if (window) { + focusedWindowInfo = { window: window }; + focusedWindowInfo.metaWindow = focusedWindowInfo.window.get_meta_window(); + + if (focusedWindow.is_attached_dialog()) { + let mainMetaWindow = focusedWindow.get_transient_for(); + + if (focusedWindowInfo.metaWindow.get_frame_rect().height < mainMetaWindow.get_frame_rect().height) { + focusedWindowInfo.window = mainMetaWindow.get_compositor_private(); + focusedWindowInfo.metaWindow = mainMetaWindow; + } + } + } + + return focusedWindowInfo; + }, + + _disconnectFocusedWindow: function(destroy) { + if (this._focusedWindowInfo && !destroy) { + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.allocationId); + this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.destroyId); + } + + this._focusedWindowInfo = null; + }, + + _getHandledWindows: function() { + return global.get_window_actors() + .filter(w => w.visible) + .map(w => w.get_meta_window()) + .filter(mw => this._checkIfHandledWindow(mw)); + }, + + _checkIfHandledWindow: function(metaWindow) { + return metaWindow && !metaWindow.minimized && + this._checkIfHandledWindowType(metaWindow); + }, + + _checkIfHandledWindowType: function(metaWindow) { + let metaWindowType = metaWindow.get_window_type(); + + //https://www.roojs.org/seed/gir-1.2-gtk-3.0/seed/Meta.WindowType.html + return metaWindowType <= Meta.WindowType.SPLASHSCREEN && + metaWindowType != Meta.WindowType.DESKTOP; + }, + + _queueUpdate: function(noDelay) { + if (!noDelay && this._timeoutsHandler.getId(T1)) { + //limit the number of updates + this._pendingUpdate = true; + return; + } + + this._timeoutsHandler.add([T1, MIN_UPDATE_MS, () => this._endLimitUpdate()]); + + let metaWindows = this._getHandledWindows(); + + Object.keys(this._watches).forEach(id => { + let watch = this._watches[id]; + let overlap = this._update(watch, metaWindows); + + if (overlap !== watch.overlap) { + watch.handler(overlap); + watch.overlap = overlap; + } + }); + }, + + _endLimitUpdate: function() { + if (this._pendingUpdate) { + this._pendingUpdate = false; + this._queueUpdate(); + } + }, + + _update: function(watch, metaWindows) { + if (watch.mode === Mode.FOCUSED_WINDOWS) { + return (this._focusedWindowInfo && + this._checkIfHandledWindow(this._focusedWindowInfo.metaWindow) && + this._checkProximity(this._focusedWindowInfo.metaWindow, watch)); + } else if (watch.mode === Mode.MAXIMIZED_WINDOWS) { + return metaWindows.some(mw => mw.maximized_vertically && mw.maximized_horizontally && + mw.get_monitor() == watch.monitorIndex); + } + + //Mode.ALL_WINDOWS + return metaWindows.some(mw => this._checkProximity(mw, watch)); + }, + + _checkProximity: function(metaWindow, watch) { + return metaWindow.get_frame_rect().overlap(watch.rect); + }, +}); diff --git a/schemas/org.gnome.shell.extensions.zorin-taskbar.gschema.xml b/schemas/org.gnome.shell.extensions.zorin-taskbar.gschema.xml new file mode 100644 index 0000000..d3925f7 --- /dev/null +++ b/schemas/org.gnome.shell.extensions.zorin-taskbar.gschema.xml @@ -0,0 +1,777 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'BOTTOM' + Panel position + Panel is shown on the Bottom or Top of the screen. + + + true + Sync element positions + Sync panel element positions on all monitors. + + + '{}' + Panel positions + Panel positions (JSON). + + + '{}' + Panel element positions + Panel element positions (JSON). + + + 48 + Panel size + Set the size of the panel. + + + 'CILIORA' + Style of the running indicator (focused) + Style of the running indicator for the icon for the currently focused application + + + 'DOTS' + Style of the running indicator (unfocused) + Style of the running indicator for the icon for applications which are not currently focused + + + false + Running indicator dominant color + Whether to use the app icon's dominant color for .app-well-running-dot + + + false + Lock the taskbar + Specifies if the user can modify the taskbar + + + false + Custom background color + Replace current theme background color for the panel + + + 0.4 + Panel opacity + Custom opacity for the panel + + + false + Intellihide + Whether to intelligently hide the panel + + + true + Only hide from windows + Dictates if the dash should only hide when in conflict with windows + + + 'FOCUSED_WINDOWS' + Intellihide behaviour + Dictates how to intelligently hide the panel + + + false + Intellihide pressure + To reveal the panel, pressure needs to be applied to the edege of the screen + + + false + Intellihide pressure + Allow the panel to be revealed while an application is in fullscreen mode + + + false + Intellihide only secondary + Whether to only hide secondary panels + + + "<Super>i" + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + i']]]> + Keybinding toggle intellihide + Keybinding to reveal the panel while in intellihide mode + + + true + Floating rounded theme + Display the panel with a floating rounded theme while in intellihide mode + + + true + Override escape key + Override the escape key to return to the desktop when entering the overview using the Show Applications button + + + true + Animate Show Applications from the desktop + Animate Show Applications from the desktop + + + [] + Panel context menu commands + Commands to add to the panel right click menu + + + [] + Panel context menu titles + Titles for commands added to panel right click menu + + + 8 + Width of show Desktop button + Customize the width of the show Desktop button + + + true + Icon in show Desktop button + Display an icon in the show Desktop button + + + true + Show desktop on hover + Show the desktop on mouse hover + + + true + Show window preview + Show preview of running window on hover of app icon + + + true + Show tooltip + Show tooltip on hover of app icon + + + true + Show running apps + Show or hide running application icons in the dash + + + true + Show favorites apps + Show or hide favorite application icons in the dash + + + true + Enable peek mode + Peek a window upon hover for some time + + + 250 + Window previews size + Preferred window previews size + + + false + Provide workspace isolation + Dash shows only windows from the current workspace + + + true + Group applications + Dash groups the application instances under the same icon + + + 160 + Application title max width + When the applications are ungrouped, this defines the application titles maximum width. + + + false + Use a fixed width for the application titles + The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. + + + false + Use favorite icons as application launchers + When the applications are ungrouped, this defines if running applications stay separate from the favorite icons. + + + false + Display panels on all monitors + Specifies if a panel is shown on every monitors + + + [] + Available monitors + Available gnome-shell (Mutter) monitors, internal use + + + false + Provide monitor isolation + Dash shows only windows from the current monitor + + + true + Display the favorites on all monitors + Specifies if every panel should display the favorite applications. If false, the favorite appplications are only displayed on the primary monitor. + + + true + Customize click behaviour + Customize action on various mouse events + + + true + Minimize on shift+click + + + true + Activate only one window + + + 'CYCLE-MIN' + Action when clicking on a running app + Set the action that is executed when clicking on the icon of a running application + + + 'MINIMIZE' + Action when shift+clicking on a running app + Set the action that is executed when shift+clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when middle-clicking on the icon of a running application + + + 'LAUNCH' + Action when clicking on a running app + Set the action that is executed when shift+middle-clicking on the icon of a running application + + + 'CYCLE_WINDOWS' + Action when scrolling over a running app + Set the action that is executed when scrolling over a running application + + + true + Middle click preview to close window + Middle click on the window preview to close that window + + + "<Super>q" + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + q']]]> + Keybinding to show the dock and the number overlay. + Behavior depends on hotkeys-show-dock and hotkeys-overlay. + + + 'TEMPORARILY' + Transitivity of the number overlay + You can choose between NEVER, TEMPORARILY and ALWAYS. + + + true + Super Hot-Keys + Launch and switch between dash items using Super+(0-9) + + + 'Super' + Prefix to use for hotkeys + You can choose between Super or SuperAlt as the prefix for hotkeys. + + + false + Show window previews + When multiple instances of the application are available, show their window previews + + + 'BOTH' + Hotkeys number keys + Which number keys are used for the hotkeys + + + 1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + 2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + 3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + 4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + 5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + 6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + 7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + 8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + 9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + 0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + 1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + 2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + 3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + 4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + 5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + 6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + 7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + 8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + 9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + 0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + 1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + 2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + 3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + 4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + 5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + 6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + 7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + 8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + 9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + 0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + KP_1']]]> + Keybinding to launch 1st dash app + + Keybinding to launch 1st app. + + + + KP_2']]]> + Keybinding to launch 2nd dash app + + Keybinding to launch 2nd app. + + + + KP_3']]]> + Keybinding to launch 3rd dash app + + Keybinding to launch 3rd app. + + + + KP_4']]]> + Keybinding to launch 4th dash app + + Keybinding to launch 4th app. + + + + KP_5']]]> + Keybinding to launch 5th dash app + + Keybinding to launch 5th app. + + + + KP_6']]]> + Keybinding to launch 6th dash app + + Keybinding to launch 6th app. + + + + KP_7']]]> + Keybinding to launch 7th dash app + + Keybinding to launch 7th app. + + + + KP_8']]]> + Keybinding to launch 8th dash app + + Keybinding to launch 8th app. + + + + KP_9']]]> + Keybinding to launch 9th dash app + + Keybinding to launch 9th app. + + + + KP_0']]]> + Keybinding to launch 10th dash app + + Keybinding to launch 10th app. + + + + KP_1']]]> + Keybinding to trigger 1st dash app with shift behavior + + Keybinding to trigger 1st app with shift behavior. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app with shift behavior + + Keybinding to trigger 2nd app with shift behavior. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app with shift behavior + + Keybinding to trigger 3rd app with shift behavior. + + + + KP_4']]]> + Keybinding to trigger 4th dash app with shift behavior + + Keybinding to trigger 4th app with shift behavior. + + + + KP_5']]]> + Keybinding to trigger 5th dash app with shift behavior + + Keybinding to trigger 5th app with shift behavior. + + + + KP_6']]]> + Keybinding to trigger 6th dash app with shift behavior + + Keybinding to trigger 6th app with shift behavior. + + + + KP_7']]]> + Keybinding to trigger 7th dash app with shift behavior + + Keybinding to trigger 7th app with shift behavior. + + + + KP_8']]]> + Keybinding to trigger 8th dash app with shift behavior + + Keybinding to trigger 8th app with shift behavior. + + + + KP_9']]]> + Keybinding to trigger 9th dash app with shift behavior + + Keybinding to trigger 9th app with shift behavior. + + + + KP_0']]]> + Keybinding to trigger 10th dash app with shift behavior + + Keybinding to trigger 10th app with shift behavior. + + + + KP_1']]]> + Keybinding to trigger 1st dash app + + Keybinding to either show or launch the 1st application in the dash. + + + + KP_2']]]> + Keybinding to trigger 2nd dash app + + Keybinding to either show or launch the 2nd application in the dash. + + + + KP_3']]]> + Keybinding to trigger 3rd dash app + + Keybinding to either show or launch the 3rd application in the dash. + + + + KP_4']]]> + Keybinding to trigger 4th dash app + + Keybinding to either show or launch the 4th application in the dash. + + + + KP_5']]]> + Keybinding to trigger 5th dash app + + Keybinding to either show or launch the 5th application in the dash. + + + + KP_6']]]> + Keybinding to trigger 6th dash app + + Keybinding to either show or launch the 6th application in the dash. + + + + KP_7']]]> + Keybinding to trigger 7th dash app + + Keybinding to either show or launch the 7th application in the dash. + + + + KP_8']]]> + Keybinding to trigger 8th dash app + + Keybinding to either show or launch the 8th application in the dash. + + + + KP_9']]]> + Keybinding to trigger 9th dash app + + Keybinding to either show or launch the 9th application in the dash. + + + + KP_0']]]> + Keybinding to trigger 10th dash app + + Keybinding to either show or launch the 10th application in the dash. + + + + true + Show progress bar on app icon + Whether to show progress bar overlay on app icon, for supported applications. + + + true + Show badge count on app icon + Whether to show badge count overlay on app icon, for supported applications. + + + diff --git a/secondaryMenu.js b/secondaryMenu.js deleted file mode 100644 index afd4dbc..0000000 --- a/secondaryMenu.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Taskbar: A taskbar extension for the Gnome panel. - * Copyright (C) 2016 Zorin OS - * - * 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, see . - * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg. - * Some code was also adapted from the upstream Gnome Shell source code. - */ - - -const AppDisplay = imports.ui.appDisplay; -const Lang = imports.lang; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Taskbar = Me.imports.taskbar; - -/** - * Extend AppIconMenu - * - * - set popup arrow side based on taskbar orientation - * - Add close windows option based on quitfromdash extension - * (https://github.com/deuill/shell-extension-quitfromdash) - */ - -const taskbarSecondaryMenu = new Lang.Class({ - Name: 'taskbarSecondaryMenu', - Extends: AppDisplay.AppIconMenu, - - _init: function(source) { - - let side = Taskbar.getPosition(); - - // 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; - }, - - // helper function for the quit windows abilities - _closeWindowInstance: function(metaWindow) { - metaWindow.delete(global.get_current_time()); - }, - - _redisplay: function() { - this.parent(); - - // quit menu - let app = this._source.app; - let count = Taskbar.getAppInterestingWindows(app).length; - if ( count > 0) { - this._appendSeparator(); - let quitFromTaskbarMenuText = ""; - if (count == 1) - quitFromTaskbarMenuText = _("Quit"); - else - quitFromTaskbarMenuText = _("Quit") + ' ' + count + ' ' + _("Windows"); - - this._quitfromTaskbarMenuItem = this._appendMenuItem(quitFromTaskbarMenuText); - this._quitfromTaskbarMenuItem.connect('activate', Lang.bind(this, function() { - let app = this._source.app; - let windows = app.get_windows(); - for (let i = 0; i < windows.length; i++) { - this._closeWindowInstance(windows[i]) - } - })); - } - } -}); diff --git a/stylesheet.css b/stylesheet.css index f6cbcb9..d1fcf91 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -1,6 +1,5 @@ /* - * Taskbar: A taskbar extension for the Gnome panel. - * Copyright (C) 2016 Zorin OS + * This file is part of the Zorin Taskbar extension for Zorin OS. * * 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 @@ -14,48 +13,128 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + * Some code was also adapted from the upstream Gnome Shell source code. */ -#taskbarScrollview .dash-item-container > StWidget { - padding: 0; - margin: 0 8px; +#zorintaskbarTaskbar .dash-item-container > StWidget { + margin: 0; + padding: 0; } -#taskbarScrollview .app-well-app .overview-icon { - border-radius: 0; - padding: 8px; +#zorintaskbarScrollview .app-well-app .overview-icon, +.zorintaskbarMainPanel .show-apps .overview-icon { + background: none; border: none; + margin: 0; + padding: 0; } -#taskbarScrollview .app-well-app-running-dot { +#zorintaskbarScrollview .app-well-app .overview-label { + /* must match TITLE_RIGHT_PADDING in apppicons.js */ + padding-right: 8px; +} + +#zorintaskbarScrollview .app-well-app .favorite { + background-color: rgba(80, 150, 255, 0.4); +} + +#zorintaskbarScrollview .app-well-app-running-dot { margin-bottom: 0; } -#thumbnailPreviewScrollview, -#taskbarScrollview { - -st-hfade-offset: 48px; +#zorintaskbarTaskbar .scrollview-fade { + background-gradient-end: rgba(0, 0, 0, 0); } -.taskbarSecondaryMenu { +.zorintaskbarSecondaryMenu { max-width: 400px; } -#thumbnailPreviewList { +.zorintaskbarMainPanel.vertical .panel-button { + text-align: center; +} + +.zorintaskbarMainPanel.vertical .panel-button.vertical *, +.zorintaskbarMainPanel.vertical .panel-button.clock-display * { + padding: 0; + margin: 0; +} + +.zorintaskbarMainPanel.vertical .panel-button > *, +.zorintaskbarMainPanel.vertical .panel-button.vertical > *, +.zorintaskbarMainPanel.vertical .panel-button.clock-display > * { + padding: 8px 0; +} + +#zorintaskbarThumbnailList { spacing: 0em; padding: 0 1em; } -#thumbnailPreviewList .popup-menu-item { - padding: 1em; +#zorintaskbarThumbnailList .popup-menu-item { + padding: 0; border-radius: 5px; spacing: 0; } -#thumbnailPreviewList .window-box { +#zorintaskbarThumbnailList .window-box { padding: 0; spacing: 0; } -#thumbnailPreviewList .preview-window-title { +#zorintaskbarThumbnailList .preview-window-title { padding-top: 1em; } + +.popup-menu.panel-menu { + margin-bottom: 0; +} + +#panel #panelLeft, #panel #panelCenter { + spacing: 0px; +} + +#panelBox.floating { + padding: 8px; + background: transparent; +} + +#panelBox.floating #panel, +#panelBox.floating .panel-button { + border-radius: 10px; +} + +.panel-corner.hidden:active, .panel-corner.hidden:overview, .panel-corner.hidden:focus { + -panel-corner-border-color: rgba(0, 0, 0, .001); +} +#zorintaskbarScrollview .badge { + color: rgba(255, 255, 255, 1); + font-weight: bold; + text-align: center; +} + +#zorintaskbarScrollview .number-overlay { + background-color: rgba(0,0,0,0.8); +} + +#zorintaskbarScrollview .notification-badge { + background-color: rgba(255,0,0,0.8); + margin: 2px; +} + +#zorintaskbarScrollview .progress-bar { + /* Customization of the progress bar style, e.g.: + -progress-bar-background: rgba(0.8, 0.8, 0.8, 1); + -progress-bar-border: rgba(0.9, 0.9, 0.9, 1); + */ +} + +.preview-container, +#preview-menu { + border-radius: 10px; +} diff --git a/taskbar.js b/taskbar.js index 6b285a6..781d003 100644 --- a/taskbar.js +++ b/taskbar.js @@ -1,6 +1,5 @@ /* - * Taskbar: A taskbar extension for the Gnome panel. - * Copyright (C) 2016 Zorin OS + * This file is part of the Zorin Taskbar extension for Zorin OS. * * 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 @@ -17,12 +16,14 @@ * * * Credits: - * This file is based on code from the Dash to Dock extension by micheleg. + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension * Some code was also adapted from the upstream Gnome Shell source code. */ const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Gtk = imports.gi.Gtk; @@ -40,26 +41,20 @@ 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 Convenience = Me.imports.convenience; -const SecondaryMenu = Me.imports.secondaryMenu; +const AppIcons = Me.imports.appIcons; +const Panel = Me.imports.panel; +const PanelManager = Me.imports.panelManager; +const Utils = Me.imports.utils; const WindowPreview = Me.imports.windowPreview; -let DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME; -let DASH_ITEM_LABEL_SHOW_TIME = Dash.DASH_ITEM_LABEL_SHOW_TIME; -let DASH_ITEM_LABEL_HIDE_TIME = Dash.DASH_ITEM_LABEL_HIDE_TIME; -let DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; -let LABEL_GAP = 5; -let RUNNING_INDICATOR_SIZE = 3; -let HFADE_WIDTH = 48; - -function getPosition() { - return Main.layoutManager.panelBox.anchor_y == 0 ? St.Side.TOP : St.Side.BOTTOM; -} +var DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME / (Dash.DASH_ANIMATION_TIME > 1 ? 1000 : 1); +var DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; +var MIN_ICON_SIZE = 4; +var APPICON_MARGIN = 4; +var APPICON_PADDING = 8; /** * Extend DashItemContainer @@ -70,64 +65,8 @@ function getPosition() { * thus use this ugly pattern. */ -// define first this function to use it in extendDashItemContainer -function ItemShowLabel() { - if (!this._labelText) - 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 = getPosition(); - let labelOffset = node.get_length('-x-offset'); - - switch(position) { - 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 for the x coordinate. - - // Leave a few pixel gap - let gap = LABEL_GAP; - 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', - }); -}; - function extendDashItemContainer(dashItemContainer) { - dashItemContainer.showLabel = ItemShowLabel; + dashItemContainer.showLabel = AppIcons.ItemShowLabel; }; /* This class is a fork of the upstream DashActor class (ui.dash.js) @@ -136,58 +75,73 @@ function extendDashItemContainer(dashItemContainer) { * - modified chldBox calculations for when 'show-apps-at-top' option is checked * - handle horizontal dash */ +var taskbarActor = Utils.defineClass({ + Name: 'ZorinTaskbar-TaskbarActor', + Extends: St.Widget, -const taskbarActor = new Lang.Class({ - Name: 'taskbarActor', - - _init: function() { - this._rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; - - this._position = getPosition(); - - let layout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL }); - - this.actor = new Shell.GenericContainer({ name: 'taskbar', - 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; - + _init: function(delegate) { + this._delegate = delegate; + this._currentBackgroundColor = 0; + this.callParent('_init', { name: 'zorinTaskbarTaskbar', + layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation[delegate.dtpPanel.getOrientation().toUpperCase()] }), + clip_to_allocation: true }); }, - _allocate: function(actor, box, flags) { - let contentBox = box; - - let [appIcons] = actor.get_children(); + vfunc_allocate: function(box, flags)  { + Utils.setAllocation(this, box, flags); + let panel = this._delegate.dtpPanel; + let availFixedSize = box[panel.fixedCoord.c2] - box[panel.fixedCoord.c1]; + let availVarSize = box[panel.varCoord.c2] - box[panel.varCoord.c1]; + let [dummy, scrollview, leftFade, rightFade] = this.get_children(); + let [, natSize] = this[panel.sizeFunc](availFixedSize); let childBox = new Clutter.ActorBox(); - childBox.x1 = contentBox.x1; - childBox.y1 = contentBox.y1; - childBox.x2 = contentBox.x2; - childBox.y2 = contentBox.y2; - appIcons.allocate(childBox, flags); + let orientation = panel.getOrientation(); + + Utils.allocate(dummy, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c1]; + childBox[panel.varCoord.c2] = Math.min(availVarSize, natSize); + childBox[panel.fixedCoord.c1] = box[panel.fixedCoord.c1]; + childBox[panel.fixedCoord.c2] = box[panel.fixedCoord.c2]; + + Utils.allocate(scrollview, childBox, flags); + + let [value, , upper, , , pageSize] = scrollview[orientation[0] + 'scroll'].adjustment.get_values(); + upper = Math.floor(upper); + scrollview._dtpFadeSize = upper > pageSize ? this._delegate.iconSize : 0; + + if (this._currentBackgroundColor !== panel.dynamicTransparency.currentBackgroundColor) { + this._currentBackgroundColor = panel.dynamicTransparency.currentBackgroundColor; + let gradientStyle = 'background-gradient-start: ' + this._currentBackgroundColor + + 'background-gradient-direction: ' + orientation; + + leftFade.set_style(gradientStyle); + rightFade.set_style(gradientStyle); + } + + childBox[panel.varCoord.c2] = childBox[panel.varCoord.c1] + (value > 0 ? scrollview._dtpFadeSize : 0); + Utils.allocate(leftFade, childBox, flags); + + childBox[panel.varCoord.c1] = box[panel.varCoord.c2] - (value + pageSize < upper ? scrollview._dtpFadeSize : 0); + childBox[panel.varCoord.c2] = box[panel.varCoord.c2]; + Utils.allocate(rightFade, 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) - let [, natWidth] = this.actor.layout_manager.get_preferred_width(this.actor, forHeight); - alloc.min_size = 0; - alloc.natural_size = natWidth + HFADE_WIDTH; + // We want to request the natural size of all our children + // as our natural width, so we chain up to StWidget (which + // then calls BoxLayout) + vfunc_get_preferred_width: function(forHeight) { + let [, natWidth] = St.Widget.prototype.vfunc_get_preferred_width.call(this, forHeight); + + return [0, 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) - let [, natHeight] = this.actor.layout_manager.get_preferred_height(this.actor, forWidth); - alloc.min_size = 0; - alloc.natural_size = natHeight; - } + vfunc_get_preferred_height: function(forWidth) { + let [, natHeight] = St.Widget.prototype.vfunc_get_preferred_height.call(this, forWidth); + + return [0, natHeight]; + }, }); /* This class is a fork of the upstream dash class (ui.dash.js) @@ -204,75 +158,107 @@ const taskbarActor = new Lang.Class({ * - Sync minimization application target position. */ -const baseIconSizes = [ 16, 22, 24, 32, 48, 64, 96, 128 ]; +var taskbar = Utils.defineClass({ + Name: 'ZorinTaskbar.Taskbar', -const taskbar = new Lang.Class({ - Name: 'taskbar.taskbar', + _init : function(panel) { + this.dtpPanel = panel; + + // start at smallest size due to running indicator drawing area expanding but not shrinking + this.iconSize = 16; - _init : function() { - this._maxHeight = -1; - this.iconSize = 32; - this._availableIconSizes = baseIconSizes; this._shownInitially = false; - this._position = getPosition(); - this._signalsHandler = new Convenience.GlobalSignalsHandler(); + 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.fullScrollView = 0; - this._containerObject = new taskbarActor(); - this._container = this._containerObject.actor; - this._scrollView = new St.ScrollView({ name: 'taskbarScrollview', + let isVertical = panel.checkIfVertical(); + + this._box = new St.BoxLayout({ vertical: isVertical, + clip_to_allocation: false, + x_align: Clutter.ActorAlign.START, + y_align: Clutter.ActorAlign.START }); + + this._container = new taskbarActor(this); + this._scrollView = new St.ScrollView({ name: 'zorintaskbarScrollview', hscrollbar_policy: Gtk.PolicyType.NEVER, vscrollbar_policy: Gtk.PolicyType.NEVER, enable_mouse_scrolling: true }); this._scrollView.connect('scroll-event', Lang.bind(this, this._onScrollEvent )); - - this._box = new St.BoxLayout({ vertical: false, - 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._showAppsIconWrapper = panel.showAppsIconWrapper; + this._showAppsIconWrapper.connect('menu-state-changed', Lang.bind(this, function(showAppsIconWrapper, opened) { + this._itemMenuStateChanged(showAppsIconWrapper, opened); + })); + // an instance of the showAppsIcon class is encapsulated in the wrapper + this._showAppsIcon = this._showAppsIconWrapper.realShowAppsIcon; + this.showAppsButton = this._showAppsIcon.toggleButton; + + if (isVertical) { + this.showAppsButton.set_width(panel.geom.w); + } + + this.showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled)); + this.showAppsButton.checked = Main.overview.viewSelector._showAppsButton.checked; + + this._showAppsIcon.childScale = 1; + this._showAppsIcon.childOpacity = 255; + this._showAppsIcon.icon.setIconSize(this.iconSize); + this._hookUpLabel(this._showAppsIcon, this._showAppsIconWrapper); + + this._container.add_child(new St.Widget({ width: 0, reactive: false })); + this._container.add_actor(this._scrollView); + + let orientation = panel.getOrientation(); + let fadeStyle = 'background-gradient-direction:' + orientation; + let fade1 = new St.Widget({ style_class: 'scrollview-fade', reactive: false }); + let fade2 = new St.Widget({ style_class: 'scrollview-fade', + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: 180 }); + + fade1.set_style(fadeStyle); + fade2.set_style(fadeStyle); + + this._container.add_actor(fade1); + this._container.add_actor(fade2); + + this.previewMenu = new WindowPreview.PreviewMenu(panel); + this.previewMenu.enable(); + 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 }); - Main.panel.actor.connect('notify::height', Lang.bind(this, - function() { - this._queueRedisplay(); - })); - - this.actor.connect('notify::width', Lang.bind(this, - function() { - if (this._maxHeight != this.actor.width) - this._queueRedisplay(); - this._maxHeight = this.actor.width; - })); - - // Update minimization animation target position on allocation of the - // container and on scrollview change. - this._box.connect('notify::allocation', Lang.bind(this, this._updateAppIconsGeometry)); - let scrollViewAdjustment = this._scrollView.hscroll.adjustment; - scrollViewAdjustment.connect('notify::value', Lang.bind(this, this._updateAppIconsGeometry)); - + let adjustment = this._scrollView[orientation[0] + 'scroll'].adjustment; + 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.iconAnimator = new PanelManager.IconAnimator(this.dtpPanel.panel.actor); this._signalsHandler.add( + [ + this.dtpPanel.panel.actor, + 'notify::height', + () => this._queueRedisplay() + ], + [ + this.dtpPanel.panel.actor, + 'notify::width', + () => this._queueRedisplay() + ], [ this._appSystem, 'installed-changed', @@ -281,15 +267,32 @@ const taskbar = new Lang.Class({ this._queueRedisplay(); }) ], + [ + this._appSystem, + 'app-state-changed', + Lang.bind(this, this._queueRedisplay) + ], [ AppFavorites.getAppFavorites(), 'changed', Lang.bind(this, this._queueRedisplay) ], [ - this._appSystem, - 'app-state-changed', - Lang.bind(this, this._queueRedisplay) + global.window_manager, + 'switch-workspace', + () => this._connectWorkspaceSignals() + ], + [ + Utils.DisplayWrapper.getScreen(), + [ + 'window-entered-monitor', + 'window-left-monitor' + ], + () => { + if (Me.settings.get_boolean('isolate-monitors')) { + this._queueRedisplay(); + } + } ], [ Main.overview, @@ -305,29 +308,71 @@ const taskbar = new Lang.Class({ Main.overview, 'item-drag-cancelled', Lang.bind(this, this._onDragCancelled) + ], + [ + // Ensure the ShowAppsButton status is kept in sync + Main.overview.viewSelector._showAppsButton, + 'notify::checked', + Lang.bind(this, this._syncShowAppsButtonToggled) + ], + [ + Me.settings, + [ + 'changed::show-favorites', + 'changed::show-running-apps', + 'changed::show-favorites-all-monitors' + ], + Lang.bind(this, this._redisplay) + ], + [ + Me.settings, + 'changed::group-apps', + Lang.bind(this, function() { + this.isGroupApps = Me.settings.get_boolean('group-apps'); + this._connectWorkspaceSignals(); + }) + ], + [ + Me.settings, + [ + 'changed::group-apps-use-launchers', + 'changed::taskbar-locked' + ], + () => this.resetAppIcons() + ], + [ + adjustment, + [ + 'notify::upper', + 'notify::pageSize' + ], + () => this._onScrollSizeChange(adjustment) ] ); + this.isGroupApps = Me.settings.get_boolean('group-apps'); + + this._onScrollSizeChange(adjustment); + this._connectWorkspaceSignals(); }, destroy: function() { + this.iconAnimator.destroy(); + this._signalsHandler.destroy(); + this._signalsHandler = 0; + + this._container.destroy(); + + this.previewMenu.disable(); + this.previewMenu.destroy(); + + this._disconnectWorkspaceSignals(); }, _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 ((this._position == St.Side.TOP && event_y <= 1) || - (this._position == St.Side.BOTTOM && event_y >= actor_h - 2)) - return Clutter.EVENT_PROPAGATE; + let orientation = this.dtpPanel.getOrientation(); // reset timeout to avid conflicts with the mousehover event if (this._ensureAppIconVisibilityTimeoutId>0) { @@ -341,15 +386,17 @@ const taskbar = new Lang.Class({ let adjustment, delta; - adjustment = this._scrollView.get_hscroll_bar().get_adjustment(); + adjustment = this._scrollView[orientation[0] + 'scroll'].get_adjustment(); let increment = adjustment.step_increment; switch ( event.get_scroll_direction() ) { case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: delta = -increment; break; case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: delta = +increment; break; case Clutter.ScrollDirection.SMOOTH: @@ -366,6 +413,29 @@ const taskbar = new Lang.Class({ }, + _onScrollSizeChange: function(adjustment) { + // Update minimization animation target position on scrollview change. + this._updateAppIcons(); + + // When applications are ungrouped and there is some empty space on the horizontal taskbar, + // force a fixed label width to prevent the icons from "wiggling" when an animation runs + // (adding or removing an icon). When the taskbar is full, revert to a dynamic label width + // to allow them to resize and make room for new icons. + if (!this.dtpPanel.checkIfVertical() && !this.isGroupApps) { + let initial = this.fullScrollView; + + if (!this.fullScrollView && Math.floor(adjustment.upper) > adjustment.page_size) { + this.fullScrollView = adjustment.page_size; + } else if (adjustment.page_size < this.fullScrollView) { + this.fullScrollView = 0; + } + + if (initial != this.fullScrollView) { + this._getAppIcons().forEach(a => a.updateTitleStyle()); + } + } + }, + _onDragBegin: function() { this._dragCancelled = false; this._dragMonitor = { @@ -378,10 +448,17 @@ const taskbar = new Lang.Class({ this._box.insert_child_at_index(this._emptyDropTarget, 0); this._emptyDropTarget.show(true); } + + this._toggleFavortieHighlight(true); }, _onDragCancelled: function() { this._dragCancelled = true; + + if (this._dragInfo) { + this._box.set_child_at_index(this._dragInfo[1]._dashItemContainer, this._dragInfo[0]); + } + this._endDrag(); }, @@ -393,9 +470,18 @@ const taskbar = new Lang.Class({ }, _endDrag: function() { - this._clearDragPlaceholder(); + if (this._dragInfo && this._dragInfo[1]._dashItemContainer instanceof DragPlaceholderItem) { + this._box.remove_child(this._dragInfo[1]._dashItemContainer); + this._dragInfo[1]._dashItemContainer.destroy(); + delete this._dragInfo[1]._dashItemContainer; + } + + this._dragInfo = null; this._clearEmptyDropTarget(); + this._showAppsIcon.setDragApp(null); DND.removeDragMonitor(this._dragMonitor); + + this._toggleFavortieHighlight(); }, _onDragMotion: function(dragEvent) { @@ -403,47 +489,89 @@ const taskbar = new Lang.Class({ if (app == null) return DND.DragMotionResult.CONTINUE; - if (!this._box.contains(dragEvent.targetActor)) - this._clearDragPlaceholder(); + let showAppsHovered = this._showAppsIcon.contains(dragEvent.targetActor); + + 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; + _toggleFavortieHighlight: function(show) { + let appFavorites = AppFavorites.getAppFavorites(); + let cssFuncName = (show ? 'add' : 'remove') + '_style_class_name'; + + this._getAppIcons().filter(appIcon => appFavorites.isFavorite(appIcon.app.get_id())) + .forEach(fav => fav._container[cssFuncName]('favorite')); + }, + + handleIsolatedWorkspaceSwitch: function() { + this._shownInitially = this.isGroupApps; + this._queueRedisplay(); + }, + + _connectWorkspaceSignals: function() { + this._disconnectWorkspaceSignals(); + + this._lastWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); + + this._workspaceWindowAddedId = this._lastWorkspace.connect('window-added', () => this._queueRedisplay()); + this._workspaceWindowRemovedId = this._lastWorkspace.connect('window-removed', () => this._queueRedisplay()); + }, + + _disconnectWorkspaceSignals: function() { + if (this._lastWorkspace) { + this._lastWorkspace.disconnect(this._workspaceWindowAddedId); + this._lastWorkspace.disconnect(this._workspaceWindowRemovedId); + + this._lastWorkspace = null; + } }, _queueRedisplay: function () { Main.queueDeferredWork(this._workId); }, - _hookUpLabel: function(item, appIcon) { + _hookUpLabel: function(item, syncHandler) { item.child.connect('notify::hover', Lang.bind(this, function() { - this._syncLabel(item, appIcon); + this._syncLabel(item, syncHandler); })); - if (appIcon) { - appIcon.connect('sync-tooltip', Lang.bind(this, function() { - this._syncLabel(item, appIcon); - })); - } + syncHandler.connect('sync-tooltip', Lang.bind(this, function() { + this._syncLabel(item, syncHandler); + })); }, - _createAppItem: function(app) { - let appIcon = new taskbarAppIcon(app, - { setSizeManually: true, - showLabel: false }); + _createAppItem: function(app, window, isLauncher) { + let appIcon = new AppIcons.taskbarAppIcon( + { + app: app, + window: window, + isLauncher: isLauncher + }, + this.dtpPanel, + { + setSizeManually: true, + showLabel: false, + isDraggable: !Me.settings.get_boolean('taskbar-locked'), + }, + this.previewMenu, + this.iconAnimator + ); + if (appIcon._draggable) { appIcon._draggable.connect('drag-begin', Lang.bind(this, function() { appIcon.actor.opacity = 50; + appIcon.isDragged = 1; })); appIcon._draggable.connect('drag-end', Lang.bind(this, function() { appIcon.actor.opacity = 255; + delete appIcon.isDragged; + this._updateAppIcons(); })); } @@ -454,13 +582,16 @@ const taskbar = new Lang.Class({ let item = new Dash.DashItemContainer(); + item._dtpPanel = this.dtpPanel extendDashItemContainer(item); + item.setChild(appIcon.actor); + appIcon._dashItemContainer = item; 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); + Utils.ensureActorVisibleInScrollView(this._scrollView, appIcon.actor, this._scrollView._dtpFadeSize); this._ensureAppIconVisibilityTimeoutId = 0; return GLib.SOURCE_REMOVE; })); @@ -474,11 +605,11 @@ const taskbar = new Lang.Class({ appIcon.actor.connect('clicked', Lang.bind(this, function(actor) { - ensureActorVisibleInScrollView(this._scrollView, actor); + Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); })); appIcon.actor.connect('key-focus-in', Lang.bind(this, function(actor) { - let [x_shift, y_shift] = ensureActorVisibleInScrollView(this._scrollView, actor); + let [x_shift, y_shift] = Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); // 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. @@ -487,7 +618,7 @@ const taskbar = new Lang.Class({ 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; @@ -501,28 +632,28 @@ const taskbar = new Lang.Class({ // Return an array with the "proper" appIcons currently in the taskbar _getAppIcons: function() { - // Only consider children which are "proper" - // icons (i.e. ignoring drag placeholders) and which are not + // Only consider children which are "proper" icons 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 this._getTaskbarIcons().map(function(actor){ + return actor.child._delegate; + }); + }, + + _getTaskbarIcons: function(includeAnimated) { + return this._box.get_children().filter(function(actor) { return actor.child && actor.child._delegate && actor.child._delegate.icon && - !actor.animatingOut; + (includeAnimated || !actor.animatingOut); }); - - let appIcons = iconChildren.map(function(actor){ - return actor.child._delegate; - }); - - return appIcons; }, - _updateAppIconsGeometry: function() { + _updateAppIcons: function() { let appIcons = this._getAppIcons(); - appIcons.forEach(function(icon){ - icon.updateIconGeometry(); + + appIcons.filter(icon => icon.constructor === AppIcons.taskbarAppIcon).forEach(icon => { + icon.updateIcon(); }); }, @@ -544,8 +675,8 @@ const taskbar = new Lang.Class({ } }, - _syncLabel: function (item, appIcon) { - let shouldShow = appIcon ? appIcon.shouldShowTooltip() : item.child.get_hover(); + _syncLabel: function (item, syncHandler) { + let shouldShow = syncHandler ? syncHandler.shouldShowTooltip() : item.child.get_hover(); if (shouldShow) { if (this._showLabelTimeoutId == 0) { @@ -581,44 +712,25 @@ const taskbar = new Lang.Class({ }, _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; - }); + let panelSize = Me.settings.get_int('panel-size'); + let availSize = panelSize - APPICON_PADDING * 2; + let minIconSize = MIN_ICON_SIZE + panelSize % 2; - if (this._maxHeight == -1) + if (availSize == this.iconSize) return; - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let iconSizes = this._availableIconSizes.map(function(s) { - return s * scaleFactor; - }); - - // Getting the panel height and making sure that the icon padding is at - // least the size of the app running indicator on both the top and bottom. - let availSize = Main.panel.actor.get_height() - (RUNNING_INDICATOR_SIZE * 2); - - let newIconSize = this._availableIconSizes[0]; - for (let i = 0; i < iconSizes.length ; i++) { - if (iconSizes[i] < availSize) { - newIconSize = this._availableIconSizes[i]; - } + if (availSize < minIconSize) { + availSize = minIconSize; } + + // For the icon size, we only consider children which are "proper" + // icons and which are not animating out (which means they will be + // destroyed at the end of the animation) + let iconChildren = this._getTaskbarIcons().concat([this._showAppsIcon]); + let scale = this.iconSize / availSize; + + this.iconSize = availSize; - 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; @@ -637,164 +749,152 @@ const taskbar = new Lang.Class({ // 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); + 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', - }); + Utils.animate(icon.icon, + { width: targetWidth, + height: targetHeight, + time: DASH_ANIMATION_TIME, + transition: 'easeOutQuad', + }); } }, sortAppsCompareFunction: function(appA, appB) { - let windowA = getAppInterestingWindows(appA)[0]; - let windowB = getAppInterestingWindows(appB)[0]; - return windowA.get_stable_sequence() > windowB.get_stable_sequence(); + return getAppStableSequence(appA, this.dtpPanel.monitor) - + getAppStableSequence(appB, this.dtpPanel.monitor); + }, + + getAppInfos: function() { + //get the user's favorite apps + let favoriteApps = this._checkIfShowingFavorites() ? AppFavorites.getAppFavorites().getFavorites() : []; + + //find the apps that should be in the taskbar: the favorites first, then add the running apps + // When using isolation, we filter out apps that have no windows in + // the current workspace (this check is done in AppIcons.getInterestingWindows) + let runningApps = this._checkIfShowingRunningApps() ? this._getRunningApps().sort(this.sortAppsCompareFunction.bind(this)) : []; + + if (!this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers')) { + return this._createAppInfos(favoriteApps, [], true) + .concat(this._createAppInfos(runningApps) + .filter(appInfo => appInfo.windows.length)); + } else { + return this._createAppInfos(favoriteApps.concat(runningApps.filter(app => favoriteApps.indexOf(app) < 0))) + .filter(appInfo => appInfo.windows.length || favoriteApps.indexOf(appInfo.app) >= 0); + } }, _redisplay: function () { - let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); - - let running = this._appSystem.get_running().sort(this.sortAppsCompareFunction); - - let children = this._box.get_children().filter(function(actor) { - return actor.child && - actor.child._delegate && - actor.child._delegate.app; - }); - // Apps currently in the taskbar - let oldApps = children.map(function(actor) { - return actor.child._delegate.app; - }); - // Apps supposed to be in the taskbar - let newApps = []; - - // Adding favorites - for (let id in favorites) - newApps.push(favorites[id]); - - // Adding running apps - for (let i = 0; i < running.length; i++) { - let app = running[i]; - if (app.get_id() in favorites) - continue; - newApps.push(app); + if (!this._signalsHandler) { + return; } - // Figure out the actual changes to the list of items; we iterate - // over both the list of items currently in the taskbar 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 = []; + //get the currently displayed appIcons + let currentAppIcons = this._getTaskbarIcons(); + let expectedAppInfos = this.getAppInfos(); - let newIndex = 0; - let oldIndex = 0; - while (newIndex < newApps.length || oldIndex < oldApps.length) { - // No change at oldIndex/newIndex - if (oldApps[oldIndex] == newApps[newIndex]) { - oldIndex++; - newIndex++; - continue; - } + //remove the appIcons which are not in the expected apps list + for (let i = currentAppIcons.length - 1; i > -1; --i) { + let appIcon = currentAppIcons[i].child._delegate; + let appIndex = Utils.findIndex(expectedAppInfos, appInfo => appInfo.app == appIcon.app && + appInfo.isLauncher == appIcon.isLauncher); - // 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) { - addedItems.push({ app: newApps[newIndex], - item: this._createAppItem(newApps[newIndex]), - 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++; + if (appIndex < 0 || + (appIcon.window && (this.isGroupApps || expectedAppInfos[appIndex].windows.indexOf(appIcon.window) < 0)) || + (!appIcon.window && !appIcon.isLauncher && + !this.isGroupApps && expectedAppInfos[appIndex].windows.length)) { + currentAppIcons[i][this._shownInitially ? 'animateOutAndDestroy' : 'destroy'](); + currentAppIcons.splice(i, 1); } } - for (let i = 0; i < addedItems.length; i++) - this._box.insert_child_at_index(addedItems[i].item, - addedItems[i].pos); + //if needed, reorder the existing appIcons and create the missing ones + let currentPosition = 0; + for (let i = 0, l = expectedAppInfos.length; i < l; ++i) { + let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? + [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : + expectedAppInfos[i].windows.map(window => ({ app: expectedAppInfos[i].app, window: window, isLauncher: false })); + + for (let j = 0, ll = neededAppIcons.length; j < ll; ++j) { + //check if the icon already exists + let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && + appIcon.child._delegate.window == neededAppIcons[j].window); - for (let i = 0; i < removedActors.length; i++) { - let item = removedActors[i]; - item.animateOutAndDestroy(); + if (matchingAppIconIndex > 0 && matchingAppIconIndex != currentPosition) { + //moved icon, reposition it + this._box.remove_child(currentAppIcons[matchingAppIconIndex]); + this._box.insert_child_at_index(currentAppIcons[matchingAppIconIndex], currentPosition); + } else if (matchingAppIconIndex < 0) { + //the icon doesn't exist yet, create a new one + let newAppIcon = this._createAppItem(neededAppIcons[j].app, neededAppIcons[j].window, neededAppIcons[j].isLauncher); + + this._box.insert_child_at_index(newAppIcon, currentPosition); + currentAppIcons.splice(currentPosition, 0, newAppIcon); + + // Skip animations on first run when adding the initial set + // of items, to avoid all items zooming in at once + newAppIcon.show(this._shownInitially); + } + + ++currentPosition; + } } 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; - - 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._updateAppIconsGeometry(); + this._updateAppIcons(); + + // This will update the size, and the corresponding number for each icon on the primary panel + if (this.dtpPanel.isPrimary) { + this._updateNumberOverlay(); + } + + this._shownInitially = true; + }, + + _checkIfShowingRunningApps: function() { + return Me.settings.get_boolean('show-running-apps'); + }, + + _checkIfShowingFavorites: function() { + return Me.settings.get_boolean('show-favorites') && + (this.dtpPanel.isPrimary || Me.settings.get_boolean('show-favorites-all-monitors')); + }, + + _getRunningApps: function() { + let tracker = Shell.WindowTracker.get_default(); + let windows = global.get_window_actors(); + let apps = []; + + for (let i = 0, l = windows.length; i < l; ++i) { + let app = tracker.get_window_app(windows[i].metaWindow); + + if (app && apps.indexOf(app) < 0) { + apps.push(app); + } + } + + return apps; + }, + + _createAppInfos: function(apps, defaultWindows, defaultIsLauncher) { + return apps.map(app => ({ + app: app, + isLauncher: defaultIsLauncher || false, + windows: defaultWindows || AppIcons.getInterestingWindows(app, this.dtpPanel.monitor) + .sort(sortWindowsCompareFunction) + })); }, // Reset the displayed apps icon to mantain the correct order - resetAppIcons : function() { + resetAppIcons : function(geometryChange) { + let children = this._getTaskbarIcons(true); - 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(); @@ -804,19 +904,41 @@ const taskbar = new Lang.Class({ this._shownInitially = false; this._redisplay(); + if (geometryChange && this.dtpPanel.checkIfVertical()) { + this.previewMenu._updateClip(); + } }, - _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; + _updateNumberOverlay: function() { + let seenApps = {}; + let counter = 0; + + this._getAppIcons().forEach(function(icon) { + if (!seenApps[icon.app]) { + seenApps[icon.app] = 1; + counter++; + } + + if (counter <= 10) { + icon.setNumberOverlay(counter == 10 ? 0 : counter); + } else { + // No overlay after 10 + icon.setNumberOverlay(-1); + } + + icon.updateHotkeyNumberOverlay(); + }); + + if (Me.settings.get_boolean('hot-keys') && + Me.settings.get_string('hotkeys-overlay-combo') === 'ALWAYS') + this.toggleNumberOverlay(true); + }, + + toggleNumberOverlay: function(activate) { + let appIcons = this._getAppIcons(); + appIcons.forEach(function(icon) { + icon.toggleNumberOverlay(activate); + }); }, _clearEmptyDropTarget: function() { @@ -826,549 +948,323 @@ const taskbar = new Lang.Class({ } }, - handleDragOver : function(source, actor, x, y, time) { - let app = Dash.getAppFromSource(source); + handleDragOver: function(source, actor, x, y, time) { + if (source == Main.xdndHandler) + return DND.DragMotionResult.CONTINUE; // Don't allow favoriting of transient apps - if (app == null || app.is_window_backed()) + if (source.app == null || source.app.is_window_backed()) return DND.DragMotionResult.NO_DROP; if (!this._settings.is_writable('favorite-apps')) return DND.DragMotionResult.NO_DROP; - let favorites = AppFavorites.getAppFavorites().getFavorites(); - let numFavorites = favorites.length; + let sourceActor = source instanceof St.Widget ? source : source.actor; + let isVertical = this.dtpPanel.checkIfVertical(); - 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 += children[i].width; + if (!this._box.contains(sourceActor) && !source._dashItemContainer) { + //not an appIcon of the taskbar, probably from the applications view + source._dashItemContainer = new DragPlaceholderItem(source, this.iconSize, isVertical); + this._box.insert_child_above(source._dashItemContainer, null); } - // 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._dragPlaceholder.width; - numChildren--; + let sizeProp = isVertical ? 'height' : 'width'; + let posProp = isVertical ? 'y' : 'x'; + let pos = isVertical ? y : x; + + let currentAppIcons = this._getAppIcons(); + let sourceIndex = currentAppIcons.indexOf(source); + let hoveredIndex = Utils.findIndex(currentAppIcons, + appIcon => pos >= appIcon._dashItemContainer[posProp] && + pos <= (appIcon._dashItemContainer[posProp] + appIcon._dashItemContainer[sizeProp])); + + if (!this._dragInfo) { + this._dragInfo = [sourceIndex, source]; } - let pos; - if (!this._emptyDropTarget){ - pos = Math.floor(x * numChildren / boxHeight); - if (pos > numChildren) - pos = numChildren; - } else - pos = 0; // always insert at the top when taskbar is empty + if (hoveredIndex >= 0) { + let isLeft = pos < currentAppIcons[hoveredIndex]._dashItemContainer[posProp] + currentAppIcons[hoveredIndex]._dashItemContainer[sizeProp] * .5; - /* Take into account childredn position in rtl*/ - if (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; + // Don't allow positioning before or after self and between icons of same app + if (!(hoveredIndex === sourceIndex || + (isLeft && hoveredIndex - 1 == sourceIndex) || + (isLeft && hoveredIndex - 1 >= 0 && source.app != currentAppIcons[hoveredIndex - 1].app && + currentAppIcons[hoveredIndex - 1].app == currentAppIcons[hoveredIndex].app) || + (!isLeft && hoveredIndex + 1 == sourceIndex) || + (!isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != currentAppIcons[hoveredIndex + 1].app && + currentAppIcons[hoveredIndex + 1].app == currentAppIcons[hoveredIndex].app))) { + this._box.set_child_at_index(source._dashItemContainer, hoveredIndex); + + // Ensure the next and previous icon are visible when moving the icon + // (I assume there's room for both of them) + if (hoveredIndex > 1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex-1], this._scrollView._dtpFadeSize); + if (hoveredIndex < this._box.get_children().length-1) + Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex+1], this._scrollView._dtpFadeSize); } - - // 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); - 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; + + return this._dragInfo[0] !== sourceIndex ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.CONTINUE; }, // 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()) { + if (!source.app || source.app.is_window_backed() || !this._settings.is_writable('favorite-apps')) { return false; } - if (!this._settings.is_writable('favorite-apps')) - return false; + let appIcons = this._getAppIcons(); + let sourceIndex = appIcons.indexOf(source); + let usingLaunchers = !this.isGroupApps && Me.settings.get_boolean('group-apps-use-launchers'); - 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) + // dragging the icon to its original position + if (this._dragInfo[0] === sourceIndex) { 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; - })); + let appFavorites = AppFavorites.getAppFavorites(); + let sourceAppId = source.app.get_id(); + let appIsFavorite = appFavorites.isFavorite(sourceAppId); + let replacingIndex = sourceIndex + (sourceIndex > this._dragInfo[0] ? -1 : 1); + let favoriteIndex = replacingIndex >= 0 ? appFavorites.getFavorites().indexOf(appIcons[replacingIndex].app) : 0; + let sameApps = appIcons.filter(a => a != source && a.app == source.app); + let showingFavorites = this._checkIfShowingFavorites(); + let favoritesCount = 0; + let position = 0; + let interestingWindows = {}; + let getAppWindows = app => { + if (!interestingWindows[app]) { + interestingWindows[app] = AppIcons.getInterestingWindows(app, this.dtpPanel.monitor); + } + + let appWindows = interestingWindows[app]; //prevents "reference to undefined property Symbol.toPrimitive" warning + return appWindows; + }; + + if (sameApps.length && + ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && + (!appIcons[sourceIndex + 1] || appIcons[sourceIndex + 1].app !== source.app))) { + appIcons.splice(appIcons.indexOf(sameApps[0]), sameApps.length); + Array.prototype.splice.apply(appIcons, [sourceIndex + 1, 0].concat(sameApps)); + } + + for (let i = 0, l = appIcons.length; i < l; ++i) { + let windows = []; + + if (!usingLaunchers || (!source.isLauncher && !appIcons[i].isLauncher)) { + windows = appIcons[i].window ? [appIcons[i].window] : getAppWindows(appIcons[i].app); + } + + windows.forEach(w => w._dtpPosition = position++); + + if (showingFavorites && + ((usingLaunchers && appIcons[i].isLauncher) || + (!usingLaunchers && appFavorites.isFavorite(appIcons[i].app.get_id())))) { + ++favoritesCount; + } + } + + if (sourceIndex < favoritesCount) { + if (appIsFavorite) { + appFavorites.moveFavoriteToPos(sourceAppId, favoriteIndex); + } else { + appFavorites.addFavoriteAtPos(sourceAppId, favoriteIndex); + } + } else if (appIsFavorite && showingFavorites && (!usingLaunchers || source.isLauncher)) { + appFavorites.removeFavorite(sourceAppId); + } + + appFavorites.emit('changed'); return true; - } + }, + _onShowAppsButtonToggled: function() { + // 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 = Me.settings.get_boolean('animate-show-apps'); + let selector = Main.overview.viewSelector; + + if (selector._showAppsButton.checked !== this.showAppsButton.checked) { + // find visible view + let visibleView; + Utils.getAppDisplayViews().every(function(v, index) { + if (v.view.actor.visible) { + visibleView = index; + return false; + } + else + return true; + }); + + if (this.showAppsButton.checked) { + if (Me.settings.get_boolean('show-apps-override-escape')) { + //override escape key to return to the desktop when entering the overview using the showapps button + Main.overview.viewSelector._onStageKeyPress = function(actor, event) { + if (Main.modalCount == 1 && event.get_key_symbol() === Clutter.KEY_Escape) { + this._searchActive ? this.reset() : Main.overview.hide(); + + return Clutter.EVENT_STOP; + } + + return this.__proto__._onStageKeyPress.call(this, actor, event); + }; + } + + // 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 grid = Utils.getAppDisplayViews()[visibleView].view._grid; + let onShownCb; + let overviewSignal = Config.PACKAGE_VERSION > '3.38.1' ? 'showing' : 'shown'; + let overviewShowingId = Main.overview.connect(overviewSignal, () => { + Main.overview.disconnect(overviewShowingId); + onShownCb(); + }); + + 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.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. + onShownCb = () => Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + grid.actor.opacity = 255; + grid.animateSpring(IconGrid.AnimationDirection.IN, this.showAppsButton); + }); + } else { + Main.overview.viewSelector._activePage = Main.overview.viewSelector._appsPage; + Main.overview.viewSelector._activePage.show(); + onShownCb = () => grid.emit('animation-done'); + } + } + + //temporarily use as primary the monitor on which the showapps btn was clicked, this is + //restored by the panel when exiting the overview + this.dtpPanel.panelManager.setFocusedMonitor(this.dtpPanel.monitor); + + let overviewHiddenId = Main.overview.connect('hidden', () => { + Main.overview.disconnect(overviewHiddenId); + delete Main.overview.viewSelector._onStageKeyPress; + }); + + // 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 = Utils.getAppDisplayViews()[visibleView].view; + 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; + } + } + } + }, + + _syncShowAppsButtonToggled: function() { + let status = Main.overview.viewSelector._showAppsButton.checked; + if (this.showAppsButton.checked !== status) + this.showAppsButton.checked = status; + }, + + showShowAppsButton: function() { + this.showAppsButton.visible = true; + this.showAppsButton.set_width(-1); + this.showAppsButton.set_height(-1); + }, + + popupFocusedAppSecondaryMenu: function() { + let appIcons = this._getAppIcons(); + let tracker = Shell.WindowTracker.get_default(); + + for(let i in appIcons) { + if(appIcons[i].app == tracker.focus_app) { + let appIcon = appIcons[i]; + if(appIcon._menu && appIcon._menu.isOpen) + appIcon._menu.close(); + else + appIcon.popupMenu(); + + appIcon.sync_hover(); + break; + } + } + }, }); Signals.addSignalMethods(taskbar.prototype); +var DragPlaceholderItem = Utils.defineClass({ + Name: 'ZorinTaskbar-DragPlaceholderItem', + Extends: St.Widget, -/** - * Extend AppIcon - * - * - 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 - * - */ + _init: function(appIcon, iconSize, isVertical) { + this.callParent('_init', { style: AppIcons.getIconContainerStyle(isVertical), layout_manager: new Clutter.BinLayout() }); -let tracker = Shell.WindowTracker.get_default(); + this.child = { _delegate: appIcon }; -const taskbarAppIcon = new Lang.Class({ - Name: 'taskbar.AppIcon', - Extends: AppDisplay.AppIcon, - - _init: function(app, iconParams, onActivateOverride) { - - this._nWindows = 0; - - this.parent(app, iconParams, onActivateOverride); - - this._dot.set_width(0); - this._focused = tracker.focus_app == this.app; - - // 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._focuseAppChangeId = tracker.connect('notify::focus-app', - Lang.bind(this, this._onFocusAppChanged)); - - this._dots = null; - - this._showDots(); - - // Creating a new menu manager for window previews as adding it to the - // using the secondary menu's menu manager (which uses the "ignoreRelease" - // function) caused the extension to crash. - this._menuManagerWindowPreview = new PopupMenu.PopupMenuManager(this); - - this._windowPreview = new WindowPreview.thumbnailPreviewMenu(this); - this._windowPreview.connect('open-state-changed', Lang.bind(this, function (menu, isPoppedUp) { - if (!isPoppedUp) - this._onMenuPoppedDown(); - })); - this._menuManagerWindowPreview.addMenu(this._windowPreview); - }, - - shouldShowTooltip: function() { - let windows = getAppInterestingWindows(this.app); - if (windows.length > 0) { - return false; - } else { - return this.actor.hover && (!this._menu || !this._menu.isOpen) && (!this._windowPreview || !this._windowPreview.isOpen); - } - }, - - _onDestroy: function() { - this.parent(); - - // Disconect global signals - // stateChangedId is already handled by parent) - if(this._focusAppId>0) - tracker.disconnect(this._focusAppId); - }, - - onWindowsChanged: function() { - 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(); - windows.forEach(function(w) { - w.set_icon_geometry(rect); + this._clone = new Clutter.Clone({ + source: appIcon.icon._iconBin, + width: iconSize, + height: iconSize }); + this.add_actor(this._clone); }, - _showDots: function() { - // 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); - this._onFocusAppChanged(); - })); - this._iconContainer.add_child(this._dots); - this._updateCounterClass(); - + destroy: function() { + this._clone.destroy(); + this.callParent('destroy'); }, - - _updateRunningStyle: function() { - this._updateCounterClass(); - }, - - popupMenu: function() { - this._removeMenuTimeout(); - this.actor.fake_release(); - this._draggable.fakeRelease(); - - if (!this._menu) { - this._menu = new SecondaryMenu.taskbarSecondaryMenu(this); - 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(); - })); - 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._windowPreview.shouldOpen = false; - this._windowPreview.close(); - - this.actor.set_hover(true); - this._menu.actor.add_style_class_name('taskbarSecondaryMenu'); - this._menu.popup(); - this._menuManager.ignoreRelease(); - this.emit('sync-tooltip'); - - return false; - }, - - _onFocusAppChanged: function() { - if(tracker.focus_app == this.app) { - this._dot.opacity = 255; - Tweener.addTween(this._dot, - { width: this._iconContainer.get_width(), - height: RUNNING_INDICATOR_SIZE, - time: DASH_ANIMATION_TIME, - transition: 'easeInOutCubic', - }); - Tweener.addTween(this._dots, - { opacity: 0, - time: DASH_ANIMATION_TIME, - transition: 'easeInOutCubic', - }); - } else { - this._dot.opacity = 255; - Tweener.addTween(this._dot, - { width: 0, - height: RUNNING_INDICATOR_SIZE, - time: DASH_ANIMATION_TIME, - transition: 'easeInOutCubic', - }); - Tweener.addTween(this._dots, - { opacity: 255, - time: DASH_ANIMATION_TIME, - transition: 'easeInOutCubic', - }); - } - }, - - activate: function(button) { - this._windowPreview.shouldOpen = false; - this._windowPreview.requestCloseMenu(); - - let event = Clutter.get_current_event(); - let modifiers = event ? event.get_state() : 0; - let openNewWindow = modifiers & Clutter.ModifierType.CONTROL_MASK && - this.app.state == Shell.AppState.RUNNING || - button && button == 2; - let focusedApp = tracker.focus_app; - - if (this.app.state == Shell.AppState.STOPPED || openNewWindow) - this.animateLaunch(); - - if (button && button == 1 && this.app.state == Shell.AppState.RUNNING) { - - 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.animateLaunch(); - this.app.open_new_window(-1); - return; - - } else if (this.app == focusedApp && !Main.overview._shown){ - minimizeWindow(this.app, true); - } else { - // If click minimizes all, then one expects all windows to be reshown - activateAllWindows(this.app); - } - } else { - // Default behaviour - if (openNewWindow) - this.app.open_new_window(-1); - else - this.app.activate(); - } - - Main.overview.hide(); - }, - - _updateCounterClass: function() { - - let maxN = 4; - this._nWindows = Math.min(getAppInterestingWindows(this.app).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) { - // Re-use the style - background color, and border width and color - - // of the default dot - let themeNode = this._dot.get_theme_node(); - let bodyColor = themeNode.get_background_color(); - - let [width, height] = area.get_surface_size(); - let cr = area.get_context(); - - // Draw the required numbers of dots - let radius = RUNNING_INDICATOR_SIZE/2; - let padding = 0; // distance from the margin - let spacing = width/22; // separation between the dots - let n = this._nWindows; - - Clutter.cairo_set_source_color(cr, bodyColor); - - cr.translate((width - (2*n)*radius - (n-1)*spacing)/2, height- padding- 2*radius); - for (let i = 0; i < n; i++) { - cr.newSubPath(); - cr.arc((2*i+1)*radius + i*spacing, radius, radius, 0, 2*Math.PI); - } - - cr.fill(); - cr.$dispose(); - } - }); -function minimizeWindow(app, param){ - // Param true make all app windows minimize - let windows = getAppInterestingWindows(app); - 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; - } - } +function getAppStableSequence(app, monitor) { + let windows = AppIcons.getInterestingWindows(app, monitor); + + return windows.reduce((prevWindow, window) => { + return Math.min(prevWindow, getWindowStableSequence(window)); + }, Infinity); } -/* - * By default only non minimized windows are activated. - * This activates all windows in the current workspace. - */ -function activateAllWindows(app){ - - // First activate first window so workspace is switched if needed, - // then activate all other app windows in the current workspace. - let windows = getAppInterestingWindows(app); - let w = windows[0]; - Main.activateWindow(w); - 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++; - } - } +function sortWindowsCompareFunction(windowA, windowB) { + return getWindowStableSequence(windowA) - getWindowStableSequence(windowB); } -function getAppInterestingWindows(app) { - // Filter out unnecessary windows, for instance - // nautilus desktop window. - let windows = app.get_windows().filter(function(w) { - return !w.skip_taskbar; - }); - - return windows; -} - - -/* - * 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]; +function getWindowStableSequence(window) { + return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); } diff --git a/transparency.js b/transparency.js new file mode 100644 index 0000000..d89420b --- /dev/null +++ b/transparency.js @@ -0,0 +1,175 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * Credits: + * This file is based on code from the Dash to Panel extension + */ + +const Clutter = imports.gi.Clutter; +const GdkPixbuf = imports.gi.GdkPixbuf; +const Lang = imports.lang; +const Main = imports.ui.main; +const Meta = imports.gi.Meta; +const St = imports.gi.St; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; +const Proximity = Me.imports.proximity; +const Utils = Me.imports.utils; + +var DynamicTransparency = Utils.defineClass({ + Name: 'ZorinTaskbar.DynamicTransparency', + + _init: function(dtpPanel) { + this._dtpPanel = dtpPanel; + this.currentBackgroundColor = 0; + + this._initialPanelStyle = dtpPanel.panel.actor.get_style(); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._initialPanelCornerStyle = dtpPanel.panel._leftCorner.actor.get_style(); + } + + this._signalsHandler = new Utils.GlobalSignalsHandler(); + this._bindSignals(); + + this._updateAllAndSet(); + }, + + destroy: function() { + this._signalsHandler.destroy(); + + this._dtpPanel.panel.actor.set_style(this._initialPanelStyle); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(this._initialPanelCornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(this._initialPanelCornerStyle); + } + }, + + updateExternalStyle: function() { + this._updateComplementaryStyles(); + this._setBackground(); + }, + + _bindSignals: function() { + this._signalsHandler.add( + [ + Utils.getStageTheme(), + 'changed', + () => this._updateAllAndSet() + ], + [ + Main.overview, + [ + 'showing', + 'hiding' + ], + () => this._updateAlphaAndSet() + ], + [ + Me.settings, + [ + 'changed::trans-use-custom-opacity', + 'changed::trans-panel-opacity' + ], + () => this._updateAlphaAndSet() + ] + ); + }, + + _updateAllAndSet: function() { + let themeBackground = this._getThemeBackground(true); + + this._updateColor(themeBackground); + this._updateAlpha(themeBackground); + this._updateComplementaryStyles(); + this._setBackground(); + this._setActorStyle(); + }, + + _updateAlphaAndSet: function() { + this._updateAlpha(); + this._setBackground(); + }, + + _updateComplementaryStyles: function() { + let panelThemeNode = this._dtpPanel.panel.actor.get_theme_node(); + + this._complementaryStyles = 'border-radius: ' + panelThemeNode.get_border_radius(0) + 'px;'; + }, + + _updateColor: function(themeBackground) { + this.backgroundColorRgb = (themeBackground || this._getThemeBackground()); + }, + + _updateAlpha: function(themeBackground) { + this.alpha = Me.settings.get_boolean('trans-use-custom-opacity') ? + Me.settings.get_double('trans-panel-opacity') : + (themeBackground || this._getThemeBackground()).alpha * 0.003921569; // 1 / 255 = 0.003921569 + }, + + _setBackground: function() { + this.currentBackgroundColor = Utils.getrgbaColor(this.backgroundColorRgb, this.alpha); + + let transition = 'transition-duration: 200ms;'; + let cornerStyle = '-panel-corner-background-color: ' + this.currentBackgroundColor + transition; + + this._dtpPanel.set_style('background-color: ' + this.currentBackgroundColor + transition + this._complementaryStyles); + + if (this._dtpPanel.geom.position == St.Side.TOP) { + this._dtpPanel.panel._leftCorner.actor.set_style(cornerStyle); + this._dtpPanel.panel._rightCorner.actor.set_style(cornerStyle); + } + }, + + _setActorStyle: function() { + this._dtpPanel.panel.actor.set_style( + 'background: none; ' + + 'border-image: none; ' + + 'background-image: none;' + ); + }, + + _getThemeBackground: function(reload) { + if (reload || !this._themeBackground) { + let fakePanel = new St.Bin({ name: 'panel' }); + Main.uiGroup.add_child(fakePanel); + let fakeTheme = fakePanel.get_theme_node(); + this._themeBackground = this._getBackgroundImageColor(fakeTheme) || fakeTheme.get_background_color(); + Main.uiGroup.remove_child(fakePanel); + } + + return this._themeBackground; + }, + + _getBackgroundImageColor: function(theme) { + let bg = null; + + try { + let imageFile = theme.get_background_image() || theme.get_border_image().get_file(); + + if (imageFile) { + let imageBuf = GdkPixbuf.Pixbuf.new_from_file(imageFile.get_path()); + let pixels = imageBuf.get_pixels(); + + bg = { red: pixels[0], green: pixels[1], blue: pixels[2], alpha: pixels[3] }; + } + } catch (error) {} + + return bg; + } +}); diff --git a/utils.js b/utils.js new file mode 100644 index 0000000..269b23c --- /dev/null +++ b/utils.js @@ -0,0 +1,1035 @@ +/* + * This file is part of the Zorin Taskbar extension for Zorin OS. + * + * 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, see . + * + * + * Credits: + * This file is based on code from the Dash to Dock extension by micheleg + * and code from the Dash to Panel extension + * Some code was also adapted from the upstream Gnome Shell source code. + */ + +const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; +const GdkPixbuf = imports.gi.GdkPixbuf +const Gi = imports._gi; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; +const Meta = imports.gi.Meta; +const Shell = imports.gi.Shell; +const St = imports.gi.St; +const Mainloop = imports.mainloop; +const Main = imports.ui.main; +const MessageTray = imports.ui.messageTray; +const Util = imports.misc.util; + +var TRANSLATION_DOMAIN = imports.misc.extensionUtils.getCurrentExtension().metadata['gettext-domain']; +var SCROLL_TIME = Util.SCROLL_TIME / (Util.SCROLL_TIME > 1 ? 1000 : 1); + +//Clutter implicit animations are available since 3.34 +//prefer those over Tweener if available +if (Config.PACKAGE_VERSION < '3.34') { + var Tweener = imports.ui.tweener; +} + +var defineClass = function (classDef) { + let parentProto = classDef.Extends ? classDef.Extends.prototype : null; + + if (Config.PACKAGE_VERSION < '3.31.9') { + if (parentProto && (classDef.Extends.name || classDef.Extends.toString()).indexOf('ZorinTaskbar.') < 0) { + classDef.callParent = function() { + let args = Array.prototype.slice.call(arguments); + let func = args.shift(); + + classDef.Extends.prototype[func].apply(this, args); + }; + } + + return new imports.lang.Class(classDef); + } + + let isGObject = parentProto instanceof GObject.Object; + let needsSuper = parentProto && !isGObject; + let getParentArgs = function(args) { + let parentArgs = []; + + (classDef.ParentConstrParams || parentArgs).forEach(p => { + if (p.constructor === Array) { + let param = args[p[0]]; + + parentArgs.push(p[1] ? param[p[1]] : param); + } else { + parentArgs.push(p); + } + }); + + return parentArgs; + }; + + let C = eval( + '(class C ' + (needsSuper ? 'extends Object' : '') + ' { ' + + ' constructor(...args) { ' + + (needsSuper ? 'super(...getParentArgs(args));' : '') + + (needsSuper || !parentProto ? 'this._init(...args);' : '') + + ' }' + + ' callParent(...args) { ' + + ' let func = args.shift(); ' + + ' if (!(func === \'_init\' && needsSuper))' + + ' super[func](...args); ' + + ' }' + + '})' + ); + + if (parentProto) { + Object.setPrototypeOf(C.prototype, parentProto); + Object.setPrototypeOf(C, classDef.Extends); + } + + Object.defineProperty(C, 'name', { value: classDef.Name }); + Object.keys(classDef) + .filter(k => classDef.hasOwnProperty(k) && classDef[k] instanceof Function) + .forEach(k => C.prototype[k] = classDef[k]); + + if (isGObject) { + C = GObject.registerClass({ Signals: classDef.Signals || {} }, C); + } + + return C; +}; + +// simplify global signals and function injections handling +// abstract class +var BasicHandler = defineClass({ + Name: 'ZorinTaskbar.BasicHandler', + + _init: function(){ + this._storage = new Object(); + }, + + add: function(/*unlimited 3-long array arguments*/){ + + // convert arguments object to array, concatenate with generic + let args = [].concat('generic', [].slice.call(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++ ) { + let item = this._storage[label]; + let handlers = this._create(arguments[i]); + + for (let j = 0, l = handlers.length; j < l; ++j) { + item.push(handlers[j]); + } + } + + }, + + 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 +var GlobalSignalsHandler = defineClass({ + Name: 'ZorinTaskbar.GlobalSignalsHandler', + Extends: BasicHandler, + + _create: function(item) { + let handlers = []; + + item[1] = [].concat(item[1]); + + for (let i = 0, l = item[1].length; i < l; ++i) { + let object = item[0]; + let event = item[1][i]; + let callback = item[2] + let id = object.connect(event, callback); + + handlers.push([object, id]); + } + + return handlers; + }, + + _remove: function(item){ + item[0].disconnect(item[1]); + } +}); + +/** + * Manage function injection: both instances and prototype can be overridden + * and restored + */ +var InjectionsHandler = defineClass({ + Name: 'ZorinTaskbar.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; + } +}); + +/** + * Manage timeouts: the added timeouts have their id reset on completion + */ +var TimeoutsHandler = defineClass({ + Name: 'ZorinTaskbar.TimeoutsHandler', + Extends: BasicHandler, + + _create: function(item) { + let name = item[0]; + let delay = item[1]; + let timeoutHandler = item[2]; + + this._remove(item); + + this[name] = Mainloop.timeout_add(delay, () => { + this[name] = 0; + timeoutHandler(); + }); + + return [[name]]; + }, + + remove: function(name) { + this._remove([name]) + }, + + _remove: function(item) { + let name = item[0]; + + if (this[name]) { + Mainloop.source_remove(this[name]); + this[name] = 0; + } + }, + + getId: function(name) { + return this[name] ? this[name] : 0; + } +}); + +// This is wrapper to maintain compatibility with GNOME-Shell 3.30+ as well as +// previous versions. +var DisplayWrapper = { + getScreen: function() { + return global.screen || global.display; + }, + + getWorkspaceManager: function() { + return global.screen || global.workspace_manager; + }, + + getMonitorManager: function() { + return global.screen || Meta.MonitorManager.get(); + } +}; + +var getCurrentWorkspace = function() { + return DisplayWrapper.getWorkspaceManager().get_active_workspace(); +}; + +var getWorkspaceByIndex = function(index) { + return DisplayWrapper.getWorkspaceManager().get_workspace_by_index(index); +}; + +var getWorkspaceCount = function() { + return DisplayWrapper.getWorkspaceManager().n_workspaces; +}; + +var getStageTheme = function() { + return St.ThemeContext.get_for_stage(global.stage); +}; + +var getScaleFactor = function() { + return getStageTheme().scale_factor || 1; +}; + +var getAppDisplayViews = function() { + //gnome-shell 3.38 only has one view and it is now the appDisplay + return Main.overview.viewSelector.appDisplay._views || [{ view: Main.overview.viewSelector.appDisplay }]; +}; + +var findIndex = function(array, predicate) { + if (Array.prototype.findIndex) { + return array.findIndex(predicate); + } + + for (let i = 0, l = array.length; i < l; ++i) { + if (predicate(array[i])) { + return i; + } + } + + return -1; +}; + +var find = function(array, predicate) { + let index = findIndex(array, predicate); + + if (index > -1) { + return array[index]; + } +}; + +var mergeObjects = function(main, bck) { + for (var prop in bck) { + if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { + main[prop] = bck[prop]; + } + } + + return main; +}; + +var hookVfunc = function(proto, symbol, func) { + if (Gi.hook_up_vfunc_symbol) { + //gjs > 1.53.3 + proto[Gi.hook_up_vfunc_symbol](symbol, func); + } else { + //On older gjs, this is how to hook vfunc. It is buggy and can't be used reliably to replace + //already hooked functions. Since it's our only use for it, disabled for now (and probably forever) + //Gi.hook_up_vfunc(proto, symbol, func); + } +}; + +var wrapActor = function(actor) { + if (actor) { + Object.defineProperty(actor, 'actor', { + value: actor instanceof Clutter.Actor ? actor : actor.actor + }); + } +}; + +var getTransformedAllocation = function(actor) { + if (Config.PACKAGE_VERSION < '3.37') { + return Shell.util_get_transformed_allocation(actor); + } + + let extents = actor.get_transformed_extents(); + let topLeft = extents.get_top_left(); + let bottomRight = extents.get_bottom_right(); + + return { x1: topLeft.x, x2: bottomRight.x, y1: topLeft.y, y2: bottomRight.y }; +}; + +var allocate = function(actor, box, flags, useParent) { + let allocateObj = useParent ? actor.__proto__ : actor; + + allocateObj.allocate.apply(actor, getAllocationParams(box, flags)); +}; + +var setAllocation = function(actor, box, flags) { + actor.set_allocation.apply(actor, getAllocationParams(box, flags)); +}; + +var getAllocationParams = function(box, flags) { + let params = [box]; + + if (Config.PACKAGE_VERSION < '3.37') { + params.push(flags); + } + + return params; +}; + +var setClip = function(actor, x, y, width, height) { + actor.set_clip(0, 0, width, height); + actor.set_position(x, y); + actor.set_size(width, height); +}; + +var addKeybinding = function(key, settings, handler, modes) { + if (!Main.wm._allowedKeybindings[key]) { + Main.wm.addKeybinding( + key, + settings, + Meta.KeyBindingFlags.NONE, + modes || (Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW), + handler + ); + } +}; + +var removeKeybinding = function(key) { + if (Main.wm._allowedKeybindings[key]) { + Main.wm.removeKeybinding(key); + } +}; + +var getrgbColor = function(color) { + color = typeof color === 'string' ? Clutter.color_from_string(color)[1] : color; + + return { red: color.red, green: color.green, blue: color.blue }; +}; + +var getrgbaColor = function(color, alpha, offset) { + if (alpha <= 0) { + return 'transparent; '; + } + + let rgb = getrgbColor(color); + + if (offset) { + ['red', 'green', 'blue'].forEach(k => { + rgb[k] = Math.min(255, Math.max(0, rgb[k] + offset)); + + if (rgb[k] == color[k]) { + rgb[k] = Math.min(255, Math.max(0, rgb[k] - offset)); + } + }); + } + + return 'rgba(' + rgb.red + ',' + rgb.green + ',' + rgb.blue + ',' + (Math.floor(alpha * 100) * 0.01) + '); ' ; +}; + +var checkIfColorIsBright = function(color) { + let rgb = getrgbColor(color); + let brightness = 0.2126 * rgb.red + 0.7152 * rgb.green + 0.0722 * rgb.blue; + + return brightness > 128; +}; + +var getMouseScrollDirection = function(event) { + let direction; + + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + case Clutter.ScrollDirection.LEFT: + direction = 'up'; + break; + case Clutter.ScrollDirection.DOWN: + case Clutter.ScrollDirection.RIGHT: + direction = 'down'; + break; + } + + return direction; +}; + +var checkIfWindowHasTransient = function(window) { + let hasTransient; + + window.foreach_transient(t => !(hasTransient = true)); + + return hasTransient; +}; + +var activateSiblingWindow = function(windows, direction, startWindow) { + let windowIndex = windows.indexOf(global.display.focus_window); + let nextWindowIndex = windowIndex < 0 ? + startWindow ? windows.indexOf(startWindow) : 0 : + windowIndex + (direction == 'up' ? 1 : -1); + + if (nextWindowIndex == windows.length) { + nextWindowIndex = 0; + } else if (nextWindowIndex < 0) { + nextWindowIndex = windows.length - 1; + } + + if (windowIndex != nextWindowIndex) { + Main.activateWindow(windows[nextWindowIndex]); + } +}; + +var animateWindowOpacity = function(window, tweenOpts) { + //there currently is a mutter bug with the windowactor opacity, starting with 3.34 + //https://gitlab.gnome.org/GNOME/mutter/issues/836 + + if (Config.PACKAGE_VERSION > '3.35') { + //on 3.36, a workaround is to use the windowactor's child for the fade animation + //this leaves a "shadow" on the desktop, so the windowactor needs to be hidden + //when the animation is complete + let visible = tweenOpts.opacity > 0; + let windowActor = window; + + window = windowActor.get_first_child() || windowActor; + + if (!windowActor.visible && visible) { + window.opacity = 0; + windowActor.visible = visible; + } + + if (!visible) { + let initialOpacity = window.opacity; + + tweenOpts.onComplete = () => { + windowActor.visible = visible; + window.opacity = initialOpacity; + }; + } + } else if (Config.PACKAGE_VERSION > '3.33') { + //the workaround only works on 3.35+, so on 3.34, let's just hide the + //window without animation + return window.visible = (tweenOpts.opacity == 255); + } + + animate(window, tweenOpts); +}; + +var animate = function(actor, options) { + if (Tweener) { + return Tweener.addTween(actor, options); + } + + //to support both Tweener and Clutter animations, we use Tweener "time" + //and "delay" properties defined in seconds, as opposed to Clutter animations + //"duration" and "delay" which are defined in milliseconds + if (options.delay) { + options.delay = options.delay * 1000; + } + + options.duration = options.time * 1000; + delete options.time; + + if (options.transition) { + //map Tweener easing equations to Clutter animation modes + options.mode = { + 'easeInCubic': Clutter.AnimationMode.EASE_IN_CUBIC, + 'easeInOutCubic': Clutter.AnimationMode.EASE_IN_OUT_CUBIC, + 'easeInOutQuad': Clutter.AnimationMode.EASE_IN_OUT_QUAD, + 'easeOutQuad': Clutter.AnimationMode.EASE_OUT_QUAD + }[options.transition] || Clutter.AnimationMode.LINEAR; + + delete options.transition; + } + + let params = [options]; + + if ('value' in options && actor instanceof St.Adjustment) { + params.unshift(options.value); + delete options.value; + } + + actor.ease.apply(actor, params); +} + +var isAnimating = function(actor, prop) { + if (Tweener) { + return Tweener.isTweening(actor); + } + + return !!actor.get_transition(prop); +} + +var stopAnimations = function(actor) { + if (Tweener) { + return Tweener.removeTweens(actor); + } + + actor.remove_all_transitions(); +} + +var getIndicators = function(delegate) { + if (delegate instanceof St.BoxLayout) { + return delegate; + } + + return delegate.indicators; +} + +var getPoint = function(coords) { + if (Config.PACKAGE_VERSION > '3.35.1') { + return new imports.gi.Graphene.Point(coords); + } + + return new Clutter.Point(coords); +} + +var getPanelGhost = function() { + if (!Main.overview._panelGhost) { + return Main.overview._overview.get_first_child(); + } + + return Main.overview._panelGhost; +} + +var notify = function(text, iconName, action, isTransient) { + let source = new MessageTray.SystemNotificationSource(); + let notification = new MessageTray.Notification(source, 'Dash to Panel', text); + let notifyFunc = source.showNotification || source.notify; + + if (iconName) { + source.createIcon = function() { + return new St.Icon({ icon_name: iconName }); + }; + } + + if (action) { + if (!(action instanceof Array)) { + action = [action]; + } + + action.forEach(a => notification.addAction(a.text, a.func)); + } + + Main.messageTray.add(source); + + notification.setTransient(isTransient); + notifyFunc.call(source, notification); +}; + +/* + * 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 +*/ +var ensureActorVisibleInScrollView = function(scrollView, actor, fadeSize, onComplete) { + 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 = fadeSize; + let hoffset = fadeSize; + + 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); + + let tweenOpts = { + time: SCROLL_TIME, + onComplete: onComplete || (() => {}), + transition: 'easeOutQuad' + }; + + if (vvalue !== vvalue0) { + animate(vadjustment, mergeObjects(tweenOpts, { value: vvalue })); + } + + if (hvalue !== hvalue0) { + animate(hadjustment, mergeObjects(tweenOpts, { value: hvalue })); + } + + return [hvalue- hvalue0, vvalue - vvalue0]; +} + +/** + * ColorUtils is adapted from https://github.com/micheleg/dash-to-dock + */ +var ColorUtils = { + colorLuminance: function(r, g, b, dlum) { + // Darken or brighten color by a fraction dlum + // Each rgb value is modified by the same fraction. + // Return "#rrggbb" strin + + let rgbString = '#'; + + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2); + rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2); + + return rgbString; + }, + + _decimalToHex: function(d, padding) { + // Convert decimal to an hexadecimal string adding the desired padding + + let hex = d.toString(16); + while (hex.length < padding) + hex = '0'+ hex; + return hex; + }, + + HSVtoRGB: function(h, s, v) { + // Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (h,s,v) independently or {h:h, s:s, v:v} object. + // Return {r:r, g:g, b:b} object. + + if (arguments.length === 1) { + s = h.s; + v = h.v; + h = h.h; + } + + let r,g,b; + let c = v*s; + let h1 = h*6; + let x = c*(1 - Math.abs(h1 % 2 - 1)); + let m = v - c; + + if (h1 <=1) + r = c + m, g = x + m, b = m; + else if (h1 <=2) + r = x + m, g = c + m, b = m; + else if (h1 <=3) + r = m, g = c + m, b = x + m; + else if (h1 <=4) + r = m, g = x + m, b = c + m; + else if (h1 <=5) + r = x + m, g = m, b = c + m; + else + r = c + m, g = m, b = x + m; + + return { + r: Math.round(r * 255), + g: Math.round(g * 255), + b: Math.round(b * 255) + }; + }, + + RGBtoHSV: function(r, g, b) { + // Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]). + // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV + // here with h = [0,1] instead of [0, 360] + // Accept either (r,g,b) independently or {r:r, g:g, b:b} object. + // Return {h:h, s:s, v:v} object. + + if (arguments.length === 1) { + r = r.r; + g = r.g; + b = r.b; + } + + let h,s,v; + + let M = Math.max(r, g, b); + let m = Math.min(r, g, b); + let c = M - m; + + if (c == 0) + h = 0; + else if (M == r) + h = ((g-b)/c) % 6; + else if (M == g) + h = (b-r)/c + 2; + else + h = (r-g)/c + 4; + + h = h/6; + v = M/255; + if (M !== 0) + s = c/M; + else + s = 0; + + return {h: h, s: s, v: v}; + } +}; + +/** + * DominantColorExtractor is adapted from https://github.com/micheleg/dash-to-dock + */ +let themeLoader = null; +let iconCacheMap = new Map(); +const MAX_CACHED_ITEMS = 1000; +const BATCH_SIZE_TO_DELETE = 50; +const DOMINANT_COLOR_ICON_SIZE = 64; + +var DominantColorExtractor = defineClass({ + Name: 'ZorinTaskbar.DominantColorExtractor', + + _init: function(app){ + this._app = app; + }, + + /** + * Try to get the pixel buffer for the current icon, if not fail gracefully + */ + _getIconPixBuf: function() { + let iconTexture = this._app.create_icon_texture(16); + + if (themeLoader === null) { + let ifaceSettings = new Gio.Settings({ schema: "org.gnome.desktop.interface" }); + + themeLoader = new Gtk.IconTheme(), + themeLoader.set_custom_theme(ifaceSettings.get_string('icon-theme')); // Make sure the correct theme is loaded + } + + // Unable to load the icon texture, use fallback + if (iconTexture instanceof St.Icon === false) { + return null; + } + + iconTexture = iconTexture.get_gicon(); + + // Unable to load the icon texture, use fallback + if (iconTexture === null) { + return null; + } + + if (iconTexture instanceof Gio.FileIcon) { + // Use GdkPixBuf to load the pixel buffer from the provided file path + return GdkPixbuf.Pixbuf.new_from_file(iconTexture.get_file().get_path()); + } + + // Get the pixel buffer from the icon theme + let icon_info = themeLoader.lookup_icon(iconTexture.get_names()[0], DOMINANT_COLOR_ICON_SIZE, 0); + if (icon_info !== null) + return icon_info.load_icon(); + else + return null; + }, + + /** + * The backlight color choosing algorithm was mostly ported to javascript from the + * Unity7 C++ source of Canonicals: + * https://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/launcher/LauncherIcon.cpp + * so it more or less works the same way. + */ + _getColorPalette: function() { + if (iconCacheMap.get(this._app.get_id())) { + // We already know the answer + return iconCacheMap.get(this._app.get_id()); + } + + let pixBuf = this._getIconPixBuf(); + if (pixBuf == null) + return null; + + let pixels = pixBuf.get_pixels(), + offset = 0; + + let total = 0, + rTotal = 0, + gTotal = 0, + bTotal = 0; + + let resample_y = 1, + resample_x = 1; + + // Resampling of large icons + // We resample icons larger than twice the desired size, as the resampling + // to a size s + // DOMINANT_COLOR_ICON_SIZE < s < 2*DOMINANT_COLOR_ICON_SIZE, + // most of the case exactly DOMINANT_COLOR_ICON_SIZE as the icon size is tipycally + // a multiple of it. + let width = pixBuf.get_width(); + let height = pixBuf.get_height(); + + // Resample + if (height >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_y = Math.floor(height/DOMINANT_COLOR_ICON_SIZE); + + if (width >= 2* DOMINANT_COLOR_ICON_SIZE) + resample_x = Math.floor(width/DOMINANT_COLOR_ICON_SIZE); + + if (resample_x !==1 || resample_y !== 1) + pixels = this._resamplePixels(pixels, resample_x, resample_y); + + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length; + for (let offset = 0; offset < limit; offset+=4) { + let r = pixels[offset], + g = pixels[offset + 1], + b = pixels[offset + 2], + a = pixels[offset + 3]; + + let saturation = (Math.max(r,g, b) - Math.min(r,g, b)); + let relevance = 0.1 * 255 * 255 + 0.9 * a * saturation; + + rTotal += r * relevance; + gTotal += g * relevance; + bTotal += b * relevance; + + total += relevance; + } + + total = total * 255; + + let r = rTotal / total, + g = gTotal / total, + b = bTotal / total; + + let hsv = ColorUtils.RGBtoHSV(r * 255, g * 255, b * 255); + + if (hsv.s > 0.15) + hsv.s = 0.65; + hsv.v = 0.90; + + let rgb = ColorUtils.HSVtoRGB(hsv.h, hsv.s, hsv.v); + + // Cache the result. + let backgroundColor = { + lighter: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0.2), + original: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0), + darker: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, -0.5) + }; + + if (iconCacheMap.size >= MAX_CACHED_ITEMS) { + //delete oldest cached values (which are in order of insertions) + let ctr=0; + for (let key of iconCacheMap.keys()) { + if (++ctr > BATCH_SIZE_TO_DELETE) + break; + iconCacheMap.delete(key); + } + } + + iconCacheMap.set(this._app.get_id(), backgroundColor); + + return backgroundColor; + }, + + /** + * Downsample large icons before scanning for the backlight color to + * improve performance. + * + * @param pixBuf + * @param pixels + * @param resampleX + * @param resampleY + * + * @return []; + */ + _resamplePixels: function (pixels, resampleX, resampleY) { + let resampledPixels = []; + // computing the limit outside the for (where it would be repeated at each iteration) + // for performance reasons + let limit = pixels.length / (resampleX * resampleY) / 4; + for (let i = 0; i < limit; i++) { + let pixel = i * resampleX * resampleY; + + resampledPixels.push(pixels[pixel * 4]); + resampledPixels.push(pixels[pixel * 4 + 1]); + resampledPixels.push(pixels[pixel * 4 + 2]); + resampledPixels.push(pixels[pixel * 4 + 3]); + } + + return resampledPixels; + } + +}); + +var drawRoundedLine = function(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) { + if (height > width) { + y += Math.floor((height - width) / 2.0); + height = width; + } + + height = 2.0 * Math.floor(height / 2.0); + + var leftRadius = isRoundLeft ? height / 2.0 : 0.0; + var rightRadius = isRoundRight ? height / 2.0 : 0.0; + + cr.moveTo(x + width - rightRadius, y); + cr.lineTo(x + leftRadius, y); + if (isRoundLeft) + cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2); + else + cr.lineTo(x, y + height); + cr.lineTo(x + width - rightRadius, y + height); + if (isRoundRight) + cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2); + else + cr.lineTo(x + width, y); + cr.closePath(); + + if (fill != null) { + cr.setSource(fill); + cr.fillPreserve(); + } + if (stroke != null) + cr.setSource(stroke); + cr.stroke(); +} + +/** + * Check if an app exists in the system. + */ +var checkedCommandsMap = new Map(); + +function checkIfCommandExists(app) { + let answer = checkedCommandsMap.get(app); + if (answer === undefined) { + // Command is a shell built in, use shell to call it. + // Quotes around app value are important. They let command operate + // on the whole value, instead of having shell interpret it. + let cmd = "sh -c 'command -v \"" + app + "\"'"; + try { + let out = GLib.spawn_command_line_sync(cmd); + // out contains 1: stdout, 2: stderr, 3: exit code + answer = out[3] == 0; + } catch (ex) { + answer = false; + } + + checkedCommandsMap.set(app, answer); + } + return answer; +} diff --git a/windowPreview.js b/windowPreview.js index a93cd9d..bab596c 100644 --- a/windowPreview.js +++ b/windowPreview.js @@ -1,6 +1,5 @@ /* - * Taskbar: A taskbar extension for the Gnome panel. - * Copyright (C) 2016 Zorin OS + * This file is part of the Zorin Taskbar extension for Zorin OS. * * 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 @@ -13,654 +12,1123 @@ * 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 . - * + * along with this program. If not, see . * * Credits: - * This file is based on code from the Dash to Dock extension by micheleg. - * Some code was also adapted from the upstream Gnome Shell source code. + * This file is based on code from the Dash to Panel extension */ - const Clutter = imports.gi.Clutter; +const Config = imports.misc.config; const GLib = imports.gi.GLib; const Gtk = imports.gi.Gtk; -const Lang = imports.lang; const Main = imports.ui.main; const Mainloop = imports.mainloop; +const Meta = imports.gi.Meta; const PopupMenu = imports.ui.popupMenu; const Signals = imports.signals; const St = imports.gi.St; -const Tweener = imports.ui.tweener; +const WindowManager = imports.ui.windowManager; const Workspace = imports.ui.workspace; const Me = imports.misc.extensionUtils.getCurrentExtension(); +const Panel = Me.imports.panel; const Taskbar = Me.imports.taskbar; +const Utils = Me.imports.utils; -let THUMBNAIL_WIDTH = 350; -let THUMBNAIL_HEIGHT = 200; +//timeout intervals +const ENSURE_VISIBLE_MS = 200; -const thumbnailPreviewMenu = new Lang.Class({ - Name: 'thumbnailPreviewMenu', - Extends: PopupMenu.PopupMenu, +//timeout names +const T1 = 'openMenuTimeout'; +const T2 = 'closeMenuTimeout'; +const T3 = 'peekTimeout'; +const T4 = 'ensureVisibleTimeout'; - _init: function(source) { +const MAX_TRANSLATION = 40; +const HEADER_HEIGHT = 38; +const MAX_CLOSE_BUTTON_SIZE = 30; +const MIN_DIMENSION = 100; +const FOCUSED_COLOR_OFFSET = 24; +const FADE_SIZE = 36; +const PEEK_INDEX_PROP = '_dtpPeekInitialIndex'; +const MARGIN_SIZE = 8; - let side = Taskbar.getPosition(); +const SHOW_WINDOW_PREVIEWS_TIMEOUT = 400; +const ENTER_PEEK_MODE_TIMEOUT = 500; +const LEAVE_TIMEOUT = 100; +const WINDOW_PREVIEW_ANIMATION_TIME = 200; +const WINDOW_PREVIEW_ASPECT_RATIO_X = 16; +const WINDOW_PREVIEW_FIXED_X = false; +const WINDOW_PREVIEW_ASPECT_RATIO_Y = 9; +const WINDOW_PREVIEW_FIXED_Y = true; +const WINDOW_PREVIEW_PADDING = 8; +const PEEK_MODE_OPACITY = 40; - this.parent(source.actor, 0.5, side); +let headerHeight = 0; +let alphaBg = 0; +let isLeftButtons = false; +let isTopHeader = true; +let scaleFactor = 1; +let animationTime = 0; +let aspectRatio = {}; - // We want to keep the item hovered while the menu is up - this.blockSourceEvents = false; +var PreviewMenu = Utils.defineClass({ + Name: 'ZorinTaskbar-PreviewMenu', + Extends: St.Widget, + Signals: { 'open-state-changed': {} }, - this._source = source; - this._app = this._source.app; - this.shouldOpen = true; - this.shouldClose = false; + _init: function(panel) { + this.callParent('_init', { layout_manager: new Clutter.BinLayout() }); - this.actor.add_style_class_name('app-well-menu'); - this.actor.set_style("max-width: " + (Main.layoutManager.primaryMonitor.width - 22) + "px;"); - this.actor.hide(); + let geom = panel.geom; + this.panel = panel; + this.currentAppIcon = null; + this._focusedPreview = null; + this._peekedWindow = null; + this.peekInitialWorkspaceIndex = -1; + this.opened = false; + this.isVertical = geom.position == St.Side.LEFT || geom.position == St.Side.RIGHT; + this._translationProp = 'translation_' + (this.isVertical ? 'x' : 'y'); + this._translationDirection = (geom.position == St.Side.TOP || geom.position == St.Side.LEFT ? -1 : 1); + this._translationOffset = Math.min(panel.dtpSize, MAX_TRANSLATION) * this._translationDirection; - // 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)); + this.menu = new St.Widget({ + name: 'preview-menu', + style_class: 'dash-label', + layout_manager: new Clutter.BinLayout(), + reactive: true, + track_hover: true, + x_expand: true, + y_expand: true, + x_align: Clutter.ActorAlign[geom.position != St.Side.RIGHT ? 'START' : 'END'], + y_align: Clutter.ActorAlign[geom.position != St.Side.BOTTOM ? 'START' : 'END'] + }); + this._box = new St.BoxLayout({ vertical: this.isVertical }); + this._scrollView = new St.ScrollView({ + name: 'zorintaskbarPreviewScrollview', + hscrollbar_policy: Gtk.PolicyType.NEVER, + vscrollbar_policy: Gtk.PolicyType.NEVER, + enable_mouse_scrolling: true, + y_expand: !this.isVertical + }); - Main.uiGroup.add_actor(this.actor); - - this._enterSourceId = this._source.actor.connect('enter-event', Lang.bind(this, this._onEnter)); - this._leaveSourceId = this._source.actor.connect('leave-event', Lang.bind(this, this._onLeave)); - - this._enterMenuId = this.actor.connect('enter-event', Lang.bind(this, this._onMenuEnter)); - this._leaveMenuId = this.actor.connect('leave-event', Lang.bind(this, this._onMenuLeave)); - - // Change the initialized side where required. - this._arrowSide = side; - this._boxPointer._arrowSide = side; - this._boxPointer._userArrowSide = side; - - this._previewBox = new thumbnailPreviewList(this._app, THUMBNAIL_HEIGHT); - this.addMenuItem(this._previewBox); + this._scrollView.add_actor(this._box); + this.menu.add_child(this._scrollView); + this.add_child(this.menu); }, - requestCloseMenu: function() { - // The "~0" argument makes the animation display. - this.close(~0); + enable: function() { + this._timeoutsHandler = new Utils.TimeoutsHandler(); + this._signalsHandler = new Utils.GlobalSignalsHandler(); + + Main.layoutManager.addChrome(this, { affectsInputRegion: false }); + Main.layoutManager.trackChrome(this.menu, { affectsInputRegion: true }); + + this._resetHiddenState(); + this._refreshGlobals(); + this._updateClip(); + this.menu.set_position(1, 1); + + this._signalsHandler.add( + [ + this.menu, + 'notify::hover', + () => this._onHoverChanged() + ], + [ + this._scrollView, + 'scroll-event', + this._onScrollEvent.bind(this) + ], + [ + this.panel.panelBox, + 'style-changed', + () => this._updateClip() + ], + [ + Utils.DisplayWrapper.getScreen(), + 'in-fullscreen-changed', + () => { + if (global.display.focus_window && global.display.focus_window.is_fullscreen()) { + this.close(true); + } + } + ], + [ + Me.settings, + [ + 'changed::panel-size', + 'changed::window-preview-size' + ], + () => { + this._refreshGlobals(); + this._updateClip(); + } + ] + ); }, - _redisplay: function() { - this._previewBox._shownInitially = false; - this._previewBox._redisplay(); + disable: function() { + this._timeoutsHandler.destroy(); + this._signalsHandler.destroy(); + + this.close(true); + + Main.layoutManager.untrackChrome(this.menu); + Main.layoutManager.removeChrome(this); }, - popup: function() { - let windows = Taskbar.getAppInterestingWindows(this._app); - if (windows.length > 0) { - this._redisplay(); - this.open(); - this._source.emit('sync-tooltip'); + requestOpen: function(appIcon) { + let timeout = SHOW_WINDOW_PREVIEWS_TIMEOUT; + + if (this.opened) { + timeout = Math.min(100, timeout); + } + + this._endOpenCloseTimeouts(); + this._timeoutsHandler.add([T1, timeout, () => this.open(appIcon)]); + }, + + requestClose: function() { + this._endOpenCloseTimeouts(); + this._addCloseTimeout(); + }, + + open: function(appIcon) { + if (this.currentAppIcon != appIcon) { + this.currentAppIcon = appIcon; + + if (!this.opened) { + this._refreshGlobals(); + + this.set_height(this.clipHeight); + this.menu.show(); + + setStyle(this.menu, 'padding: 0; margin: 0; border: none; background-image: none;'); + } + + this._mergeWindows(appIcon); + this._updatePosition(); + this._animateOpenOrClose(true); + + this._setReactive(true); + this._setOpenedState(true); } }, - _onMenuEnter: function () { - this.shouldOpen = true; - this.shouldClose = false; - - this.hoverOpen(); - }, - - _onMenuLeave: function () { - this.shouldOpen = false; - this.shouldClose = true; - Mainloop.timeout_add(Taskbar.DASH_ITEM_HOVER_TIMEOUT, Lang.bind(this, this.hoverClose)); - }, - - _onEnter: function () { - this.shouldOpen = true; - this.shouldClose = false; - - this.hoverOpen(); - }, - - _onLeave: function () { - this.shouldClose = true; - this.shouldOpen = false; - - Mainloop.timeout_add(0, Lang.bind(this, this.hoverClose)); - }, - - hoverOpen: function () { - if (this.shouldOpen && !this.isOpen) { - this.popup(); - } - }, - - hoverClose: function () { - if (this.shouldClose) { - this.close(~0); - } - }, - - destroy: function () { - if (this._mappedId) - this._source.actor.disconnect(this._mappedId); - - if (this._destroyId) - this._source.actor.disconnect(this._destroyId); - - if (this._enterSourceId) - this._source.actor.disconnect(this._enterSourceId); - if (this._leaveSourceId) - this._source.actor.disconnect(this._leaveSourceId); - - if (this._enterMenuId) - this.actor.disconnect(this._enterMenuId); - if (this._leaveMenuId) - this.actor.disconnect(this._leaveMenuId); - - this.parent(); - }, - - close: function(animate) { - if (this.isOpen) - this.emit('open-state-changed', false); - if (this._activeMenuItem) - this._activeMenuItem.setActive(false); - - if (this._boxPointer.actor.visible) { - this._boxPointer.hide(animate, Lang.bind(this, function() { - this.emit('menu-closed'); - })); - } - - this.isOpen = false; - } - -}); - -const thumbnailPreview = new Lang.Class({ - Name: 'thumbnailPreview', - Extends: PopupMenu.PopupBaseMenuItem, - - _init: function(window) { - this.window = window; - - this.parent({reactive: true}); - this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._onResize)); - this._closeButtonId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._repositionCloseButton)); - this.scale = 0; - - this.preview = this.getThumbnail(); - - this.actor.remove_child(this._ornamentLabel); - this.actor._delegate = this; - - this.animatingOut = false; - - this._windowBox = new St.BoxLayout({ style_class: 'window-box', - x_expand: true, - vertical: true }); - - this._previewBin = new St.Bin(); - this._previewBin.set_size(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT); - - this._closeButton = new St.Button({ style_class: 'window-close', - accessible_name: "Close window" }); - this._closeButton.opacity = 0; - this._closeButton.connect('clicked', Lang.bind(this, this._closeWindow)); - - this.overlayGroup = new Clutter.Actor({layout_manager: new Clutter.BinLayout()}); - this.overlayGroup.add_actor(this._previewBin); - this.overlayGroup.add_actor(this._closeButton); - - this._title = new St.Label({ text: window.title }); - this._titleBin = new St.Bin({ child: this._title, - x_align: St.Align.MIDDLE, - width: THUMBNAIL_WIDTH - }); - this._titleBin.add_style_class_name("preview-window-title"); - - this.window.connect('notify::title', Lang.bind(this, function() { - this._title.set_text(this.window.title); - })); - - this._windowBin = new St.Bin({ child: this.overlayGroup, - x_align: St.Align.MIDDLE, - width: THUMBNAIL_WIDTH, - height: THUMBNAIL_HEIGHT - }); - - this._windowBox.add_child(this._windowBin); - - if (this.preview) - this._previewBin.set_child(this.preview); - this._windowBox.add_child(this._titleBin); - this.actor.add_child(this._windowBox); - this._queueRepositionCloseButton(); - - 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)); - }, - - _onEnter: function() { - this._showCloseButton(); - return Clutter.EVENT_PROPAGATE; - }, - - _onLeave: function() { - if (!this._previewBin.has_pointer && - !this._closeButton.has_pointer) - this._hideCloseButton(); - - return Clutter.EVENT_PROPAGATE; - }, - - _idleToggleCloseButton: function() { - this._idleToggleCloseId = 0; - - if (!this._previewBin.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' }); - } - }, - - _windowCanClose: function() { - return this.window.can_close() && - !this._hasAttachedDialogs(); - }, - - _hasAttachedDialogs: function() { - // count trasient windows - let n = 0; - this.window.foreach_transient(function() {n++;}); - return n > 0; - }, - - _hideCloseButton: function() { - Tweener.addTween(this._closeButton, - { opacity: 0, - time: Workspace.CLOSE_BUTTON_FADE_TIME, - transition: 'easeInQuad' }); - }, - - getThumbnail: function() { - let thumbnail = null; - let mutterWindow = this.window.get_compositor_private(); - if (mutterWindow) { - let windowTexture = mutterWindow.get_texture(); - let [width, height] = windowTexture.get_size(); - this.scale = Math.min(1.0, THUMBNAIL_WIDTH / width, THUMBNAIL_HEIGHT / height); - thumbnail = new Clutter.Clone ({ source: windowTexture, - reactive: true, - width: width * this.scale, - height: height * this.scale }); - this._resizeId = mutterWindow.meta_window.connect('size-changed', - Lang.bind(this, this._queueResize)); - this._destroyId = mutterWindow.connect('destroy', Lang.bind(this, function() { - thumbnail.destroy(); - this._destroyId = 0; - this.animateOutAndDestroy(); - })); - } - - return thumbnail; - }, - - _queueResize: function () { - Main.queueDeferredWork(this._workId); - }, - - _onResize: function() { - let [width, height] = this.preview.get_source().get_size(); - this.scale = Math.min(1.0, THUMBNAIL_WIDTH / width, THUMBNAIL_HEIGHT / height); - this.preview.set_size(width * this.scale, height * this.scale); - - this._queueRepositionCloseButton(); - }, - - _queueRepositionCloseButton: function () { - Main.queueDeferredWork(this._closeButtonId); - }, - - _repositionCloseButton: function() { - let rect = this.window.get_compositor_private().meta_window.get_frame_rect(); - let cloneWidth = Math.floor(rect.width) * this.scale; - let cloneHeight = Math.floor(rect.height) * this.scale; - - let cloneX = (THUMBNAIL_WIDTH - cloneWidth) / 2 ; - let cloneY = (THUMBNAIL_HEIGHT - cloneHeight) / 2; - - let buttonX; - if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { - buttonX = cloneX - (this._closeButton.width / 2); - buttonX = Math.max(buttonX, 0); + close: function(immediate) { + this._endOpenCloseTimeouts(); + this._removeFocus(); + this._endPeek(); + + if (immediate) { + Utils.stopAnimations(this.menu); + this._resetHiddenState(); } else { - buttonX = cloneX + (cloneWidth - (this._closeButton.width / 2)); - buttonX = Math.min(buttonX, THUMBNAIL_WIDTH - this._closeButton.width); + this._animateOpenOrClose(false, () => this._resetHiddenState()); } - let buttonY = cloneY - (this._closeButton.height / 2); - buttonY = Math.max(buttonY, 0); - - this._closeButton.set_position(Math.floor(buttonX), Math.floor(buttonY)); + this._setReactive(false); + this.currentAppIcon = null; }, - _closeWindow: function() { - this.window.delete(global.get_current_time()); + update: function(appIcon, windows) { + if (this.currentAppIcon == appIcon) { + if (windows && !windows.length) { + this.close(); + } else { + this._addAndRemoveWindows(windows); + this._updatePosition(); + } + } }, - show: function(animate) { - let fullWidth = this.actor.get_width(); - - this.actor.opacity = 0; - this.actor.set_width(0); - - let time = animate ? Taskbar.DASH_ANIMATION_TIME : 0; - Tweener.addTween(this.actor, - { opacity: 255, - width: fullWidth, - time: time, - transition: 'easeInOutQuad' - }); + updatePosition: function() { + this._updatePosition(); }, - animateOutAndDestroy: function() { - this.animatingOut = true; - this._hideCloseButton(); - Tweener.addTween(this.actor, - { width: 0, - opacity: 0, - time: Taskbar.DASH_ANIMATION_TIME, - transition: 'easeOutQuad', - onComplete: Lang.bind(this, function() { - this.destroy(); - }) - }); - }, + focusNext: function() { + let previews = this._box.get_children(); + let currentIndex = this._focusedPreview ? previews.indexOf(this._focusedPreview) : -1; + let nextIndex = currentIndex + 1; + + nextIndex = previews[nextIndex] ? nextIndex : 0; - activate: function() { - Main.activateWindow(this.window); - this._getTopMenu().close(~0); - } -}); - -const thumbnailPreviewList = new Lang.Class({ - Name: 'thumbnailPreviewList', - Extends: PopupMenu.PopupMenuSection, - - _init: function(app) { - this.parent(); - - this._ensurePreviewVisibilityTimeoutId = 0; - - this.actor = new St.ScrollView({ name: 'thumbnailPreviewScrollview', - hscrollbar_policy: Gtk.PolicyType.NEVER, - vscrollbar_policy: Gtk.PolicyType.NEVER, - enable_mouse_scrolling: true }); - - this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent )); - - this.box.set_vertical(false); - this.box.set_name("thumbnailPreviewList"); - this.actor.add_actor(this.box); - this.actor._delegate = this; - - this._shownInitially = false; - - this.app = app; - - this._redisplayId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay)); - this._scrollbarId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._showHideScrollbar)); - - if (this._stateChangedId > 0) { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; + if (previews[nextIndex]) { + this._removeFocus(); + previews[nextIndex].setFocus(true); + this._focusedPreview = previews[nextIndex]; } - this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); - this._stateChangedId = this.app.connect('windows-changed', - Lang.bind(this, - this._queueRedisplay)); + return nextIndex; }, - _needsScrollbar: function() { - let topMenu = this._getTopMenu(); - let [topMinWidth, topNaturalWidth] = topMenu.actor.get_preferred_width(-1); - let topThemeNode = topMenu.actor.get_theme_node(); - - let topMaxWidth = topThemeNode.get_max_width(); - return topMaxWidth >= 0 && topNaturalWidth >= topMaxWidth; + activateFocused: function() { + if (this.opened && this._focusedPreview) { + this._focusedPreview.activate(); + } }, - _showHideScrollbar: function() { - let needsScrollbar = this._needsScrollbar(); + requestPeek: function(window) { + this._timeoutsHandler.remove(T3); - // St.ScrollView always requests space vertically for a possible horizontal - // scrollbar if in AUTOMATIC mode. This looks bad when we *don't* need it, - // so turn off the scrollbar when that's true. Dynamic changes in whether - // we need it aren't handled properly. - - this.actor.hscrollbar_policy = - needsScrollbar ? Gtk.PolicyType.AUTOMATIC : Gtk.PolicyType.NEVER; - - if (needsScrollbar) - this.actor.add_style_pseudo_class('scrolled'); - else - this.actor.remove_style_pseudo_class('scrolled'); + if (Me.settings.get_boolean('peek-mode')) { + if (this.peekInitialWorkspaceIndex < 0) { + this._timeoutsHandler.add([T3, ENTER_PEEK_MODE_TIMEOUT, () => this._peek(window)]); + } else { + this._peek(window); + } + } }, - _queueScrollbar: function () { - Main.queueDeferredWork(this._scrollbarId); + endPeekHere: function() { + this._endPeek(true); }, - _queueRedisplay: function () { - Main.queueDeferredWork(this._redisplayId); + ensureVisible: function(preview) { + let [ , upper, pageSize] = this._getScrollAdjustmentValues(); + + if (upper > pageSize) { + this._timeoutsHandler.add([ + T4, + ENSURE_VISIBLE_MS, + () => Utils.ensureActorVisibleInScrollView(this._scrollView, preview, MIN_DIMENSION, () => this._updateScrollFade()) + ]); + } + }, + + getCurrentAppIcon: function() { + return this.currentAppIcon; + }, + + _setReactive: function(reactive) {  + this._box.get_children().forEach(c => c.reactive = reactive); + this.menu.reactive = reactive; + }, + + _setOpenedState: function(opened) { + this.opened = opened; + this.emit('open-state-changed'); + }, + + _resetHiddenState: function() { + this.menu.hide(); + this.set_height(0); + this._setOpenedState(false); + this.menu.opacity = 0; + this.menu[this._translationProp] = this._translationOffset; + this._box.get_children().forEach(c => c.destroy()); + }, + + _removeFocus: function() { + if (this._focusedPreview) { + this._focusedPreview.setFocus(false); + this._focusedPreview = null; + } + }, + + _mergeWindows: function(appIcon, windows) { + windows = windows || (appIcon.window ? [appIcon.window] : appIcon.getAppIconInterestingWindows()); + windows.sort(Taskbar.sortWindowsCompareFunction); + + let currentPreviews = this._box.get_children(); + let l = Math.max(windows.length, currentPreviews.length); + + for (let i = 0; i < l; ++i) { + if (currentPreviews[i] && windows[i]) { + currentPreviews[i].assignWindow(windows[i], this.opened); + } else if (!currentPreviews[i]) { + this._addNewPreview(windows[i]); + } else if (!windows[i]) { + currentPreviews[i][!this.opened ? 'destroy' : 'animateOut'](); + } + } + }, + + _addAndRemoveWindows: function(windows) { + let currentPreviews = this._box.get_children(); + + windows.sort(Taskbar.sortWindowsCompareFunction); + + for (let i = 0, l = windows.length; i < l; ++i) { + let currentIndex = Utils.findIndex(currentPreviews, c => c.window == windows[i]); + + if (currentIndex < 0) { + this._addNewPreview(windows[i]); + } else { + currentPreviews[currentIndex].assignWindow(windows[i]); + currentPreviews.splice(currentIndex, 1); + + if (this._peekedWindow && this._peekedWindow == windows[i]) { + this.requestPeek(windows[i]); + } + } + } + + currentPreviews.forEach(c => c.animateOut()); + }, + + _addNewPreview: function(window) { + let preview = new Preview(this); + + this._box.add_child(preview); + preview.adjustOnStage(); + preview.assignWindow(window, this.opened); + }, + + _addCloseTimeout: function() { + this._timeoutsHandler.add([T2, LEAVE_TIMEOUT, () => this.close()]); + }, + + _onHoverChanged: function() { + this._endOpenCloseTimeouts(); + + if (this.currentAppIcon && !this.menu.hover) { + this._addCloseTimeout(); + this._endPeek(); + } }, _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 (!event.is_pointer_emulated()) { + let vOrh = this.isVertical ? 'v' : 'h'; + let adjustment = this._scrollView['get_' + vOrh + 'scroll_bar']().get_adjustment(); + let increment = adjustment.step_increment; + let delta = increment; - // 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; - - // reset timeout to avid conflicts with the mousehover event - if (this._ensurePreviewVisibilityTimeoutId>0) { - Mainloop.source_remove(this._ensurePreviewVisibilityTimeoutId); - this._ensurePreviewVisibilityTimeoutId = 0; + switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + 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); + this._updateScrollFade(); } - // Skip to avoid double events mouse - if (event.is_pointer_emulated()) - return Clutter.EVENT_STOP; - - let adjustment, delta; - - adjustment = this.actor.get_hscroll_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; + }, + _endOpenCloseTimeouts: function() { + this._timeoutsHandler.remove(T1); + this._timeoutsHandler.remove(T2); + this._timeoutsHandler.remove(T4); + }, + + _refreshGlobals: function() { + isLeftButtons = Meta.prefs_get_button_layout().left_buttons.indexOf(Meta.ButtonFunction.CLOSE) >= 0; + scaleFactor = Utils.getScaleFactor(); + headerHeight = HEADER_HEIGHT * scaleFactor; + animationTime = WINDOW_PREVIEW_ANIMATION_TIME * .001; + aspectRatio.x = { + size: WINDOW_PREVIEW_ASPECT_RATIO_X, + fixed: WINDOW_PREVIEW_FIXED_X + }; + aspectRatio.y = { + size: WINDOW_PREVIEW_ASPECT_RATIO_Y, + fixed: WINDOW_PREVIEW_FIXED_Y + }; + + alphaBg = this._getThemeBackground().alpha; + }, + + _updateClip: function() { + let x, y, w; + let geom = this.panel.getGeometry(); + let panelBoxTheme = this.panel.panelBox.get_theme_node(); + let themeBackground = this._getThemeBackground(true); + let previewSize = (Me.settings.get_int('window-preview-size') + + WINDOW_PREVIEW_PADDING * 2) * scaleFactor; + + if (this.isVertical) { + w = previewSize; + this.clipHeight = this.panel.monitor.height; + y = this.panel.monitor.y; + } else { + w = this.panel.monitor.width; + this.clipHeight = (previewSize + headerHeight); + x = this.panel.monitor.x; + } + + if (geom.position == St.Side.LEFT) { + x = this.panel.monitor.x + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.LEFT) + MARGIN_SIZE; + } else if (geom.position == St.Side.RIGHT) { + x = this.panel.monitor.x + this.panel.monitor.width - (this.panel.dtpSize + previewSize) - panelBoxTheme.get_padding(St.Side.RIGHT) - MARGIN_SIZE; + } else if (geom.position == St.Side.TOP) { + y = this.panel.monitor.y + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.TOP) + MARGIN_SIZE; + } else { //St.Side.BOTTOM + y = this.panel.monitor.y + this.panel.monitor.height - (this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.BOTTOM) + previewSize + headerHeight) - MARGIN_SIZE; + } + + Utils.setClip(this, x, y, w, this.clipHeight); + }, + + _updatePosition: function() { + let sourceNode = this.currentAppIcon.actor.get_theme_node(); + let sourceContentBox = sourceNode.get_content_box(this.currentAppIcon.actor.get_allocation_box()); + let sourceAllocation = Utils.getTransformedAllocation(this.currentAppIcon.actor); + let [previewsWidth, previewsHeight] = this._getPreviewsSize(); + let appIconMargin = Taskbar.APPICON_MARGIN / scaleFactor; + let x = 0, y = 0; + + previewsWidth = Math.min(previewsWidth, this.panel.monitor.width); + previewsHeight = Math.min(previewsHeight, this.panel.monitor.height); + this._updateScrollFade(previewsWidth < this.panel.monitor.width && previewsHeight < this.panel.monitor.height); + + if (this.isVertical) { + y = sourceAllocation.y1 + appIconMargin - this.panel.monitor.y + (sourceContentBox.y2 - sourceContentBox.y1 - previewsHeight) * .5; + y = Math.max(y, 0); + y = Math.min(y, this.panel.monitor.height - previewsHeight); + } else { + x = sourceAllocation.x1 + appIconMargin - this.panel.monitor.x + (sourceContentBox.x2 - sourceContentBox.x1 - previewsWidth) * .5; + x = Math.max(x, 0); + x = Math.min(x, this.panel.monitor.width - previewsWidth); + } + + if (!this.opened) { + this.menu.set_position(x, y); + this.menu.set_size(previewsWidth, previewsHeight); + } else { + Utils.animate(this.menu, getTweenOpts({ x: x, y: y, width: previewsWidth, height: previewsHeight })); + } + }, + + _updateScrollFade: function(remove) { + let [value, upper, pageSize] = this._getScrollAdjustmentValues(); + let needsFade = Math.round(upper) > Math.round(pageSize); + let fadeWidgets = this.menu.get_children().filter(c => c != this._scrollView); + + if (!remove && needsFade) { + if (!fadeWidgets.length) { + fadeWidgets.push(this._getFadeWidget()); + fadeWidgets.push(this._getFadeWidget(true)); + + this.menu.add_child(fadeWidgets[0]); + this.menu.add_child(fadeWidgets[1]); + } + + fadeWidgets[0].visible = value > 0; + fadeWidgets[1].visible = value + pageSize < upper; + } else if (remove || (!needsFade && fadeWidgets.length)) { + fadeWidgets.forEach(fw => fw.destroy()); + } + }, + + _getScrollAdjustmentValues: function() { + let [value , , upper, , , pageSize] = this._scrollView[(this.isVertical ? 'v' : 'h') + 'scroll'].adjustment.get_values(); + + return [value, upper, pageSize]; + }, + + _getFadeWidget: function(end) { + let x = 0, y = 0; + let startBg = Utils.getrgbaColor(this._getThemeBackground(), Math.min(alphaBg + .1, 1)); + let endBg = Utils.getrgbaColor(this._getThemeBackground(), 0) + let fadeStyle = 'background-gradient-start:' + startBg + + 'background-gradient-end:' + endBg + + 'background-gradient-direction:' + this.panel.getOrientation(); + + if (this.isVertical) { + y = end ? this.panel.monitor.height - FADE_SIZE : 0; + } else { + x = end ? this.panel.monitor.width - FADE_SIZE : 0; + } + + let fadeWidget = new St.Widget({ + reactive: false, + pivot_point: Utils.getPoint({ x: .5, y: .5 }), + rotation_angle_z: end ? 180 : 0, + style: fadeStyle, + x: x, y: y, + width: this.isVertical ? this.width : FADE_SIZE, + height: this.isVertical ? FADE_SIZE : this.height + }); + + return fadeWidget; + }, + + _getPreviewsSize: function() { + let previewsWidth = 0; + let previewsHeight = 0; + + this._box.get_children().forEach(c => { + if (!c.animatingOut) { + let [width, height] = c.getSize(); + + if (this.isVertical) { + previewsWidth = Math.max(width, previewsWidth); + previewsHeight += height; + } else { + previewsWidth += width; + previewsHeight = Math.max(height, previewsHeight); + } + } + }); + + return [previewsWidth, previewsHeight]; + }, + + _getThemeBackground: function(reload) { + if (reload || !this._themeBackground) { + let fakeTooltip = new St.Bin({ style_class: 'dash-label' }); + Main.uiGroup.add_child(fakeTooltip); + let fakeTheme = fakeTooltip.get_theme_node(); + this._themeBackground = fakeTheme.get_background_color(); + Main.uiGroup.remove_child(fakeTooltip); + } + + return this._themeBackground; + }, + + _animateOpenOrClose: function(show, onComplete) { + let isTranslationAnimation = this.menu[this._translationProp] != 0; + let tweenOpts = { + opacity: show ? 255 : 0, + transition: show ? 'easeInOutQuad' : 'easeInCubic', + onComplete: () => { + if (isTranslationAnimation) { + Main.layoutManager._queueUpdateRegions(); + } + + (onComplete || (() => {}))(); + } + }; + + tweenOpts[this._translationProp] = show ? this._translationDirection : this._translationOffset; + + Utils.animate(this.menu, getTweenOpts(tweenOpts)); + }, + + _peek: function(window) { + let currentWorkspace = Utils.getCurrentWorkspace(); + let windowWorkspace = window.get_workspace(); + let focusWindow = () => this._focusMetaWindow(PEEK_MODE_OPACITY, window); + + this._restorePeekedWindowStack(); + this._peekedWindow = window; + + if (currentWorkspace != windowWorkspace) { + this._switchToWorkspaceImmediate(windowWorkspace.index()); + this._timeoutsHandler.add([T3, 100, focusWindow]); + } else { + focusWindow(); + } + + if (this.peekInitialWorkspaceIndex < 0) { + this.peekInitialWorkspaceIndex = currentWorkspace.index(); + } + }, + + _endPeek: function(stayHere) { + this._timeoutsHandler.remove(T3); + + if (this._peekedWindow) { + let immediate = !stayHere && this.peekInitialWorkspaceIndex != Utils.getCurrentWorkspace().index(); + + this._restorePeekedWindowStack(); + this._focusMetaWindow(255, this._peekedWindow, immediate, true); + this._peekedWindow = null; + + if (!stayHere) { + this._switchToWorkspaceImmediate(this.peekInitialWorkspaceIndex); + } + + this.peekInitialWorkspaceIndex = -1; + } + }, + + _switchToWorkspaceImmediate: function(workspaceIndex) { + let workspace = Utils.getWorkspaceByIndex(workspaceIndex); + let shouldAnimate = Main.wm._shouldAnimate; + + if (!workspace || (!workspace.list_windows().length && + workspaceIndex < Utils.getWorkspaceCount() - 1)) { + workspace = Utils.getCurrentWorkspace(); + } + + Main.wm._shouldAnimate = () => false; + workspace.activate(global.display.get_current_time_roundtrip()); + Main.wm._shouldAnimate = shouldAnimate; + }, + + _focusMetaWindow: function(dimOpacity, window, immediate, ignoreFocus) { + window.get_workspace().list_windows().forEach(mw => { + let wa = mw.get_compositor_private(); + let isFocused = !ignoreFocus && mw == window; + + if (wa) { + if (isFocused) { + mw[PEEK_INDEX_PROP] = wa.get_parent().get_children().indexOf(wa); + wa.get_parent().set_child_above_sibling(wa, null); + } + + if (isFocused && mw.minimized) { + wa.show(); + } + + if (!mw.minimized) { + let tweenOpts = getTweenOpts({ opacity: isFocused ? 255 : dimOpacity }); + + if (immediate && !mw.is_on_all_workspaces()) { + tweenOpts.time = 0; + } + + Utils.animateWindowOpacity(wa, tweenOpts); + } + } + }); + }, + + _restorePeekedWindowStack: function() { + let windowActor = this._peekedWindow ? this._peekedWindow.get_compositor_private() : null; + + if (windowActor) { + if (this._peekedWindow.hasOwnProperty(PEEK_INDEX_PROP)) { + windowActor.get_parent().set_child_at_index(windowActor, this._peekedWindow[PEEK_INDEX_PROP]); + delete this._peekedWindow[PEEK_INDEX_PROP]; + } + + if (this._peekedWindow.minimized) { + windowActor.hide(); + } + } + }, +}); + +var Preview = Utils.defineClass({ + Name: 'ZorinTaskbar-Preview', + Extends: St.Widget, + + _init: function(previewMenu) { + this.callParent('_init', { + style_class: 'preview-container', + reactive: true, + track_hover: true, + layout_manager: new Clutter.BinLayout() + }); + + this.window = null; + this._waitWindowId = 0; + this._needsCloseButton = true; + this.cloneWidth = this.cloneHeight = 0; + this._previewMenu = previewMenu; + this._padding = WINDOW_PREVIEW_PADDING * scaleFactor; + this._previewDimensions = this._getPreviewDimensions(); + this.animatingOut = false; + + let box = new St.Widget({ layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL }), y_expand: true }); + let [previewBinWidth, previewBinHeight] = this._getBinSize(); + let closeButton = new St.Button({ style_class: 'window-close', accessible_name: 'Close window' }); + + if (Config.PACKAGE_VERSION >= '3.31.9') { + closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); + } + + this._closeButtonBin = new St.Widget({ + style_class: 'preview-close-btn-container', + layout_manager: new Clutter.BinLayout(), + opacity: 0, + x_expand: true, y_expand: true, + x_align: Clutter.ActorAlign[isLeftButtons ? 'START' : 'END'], + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + + this._closeButtonBin.add_child(closeButton); + + this._previewBin = new St.Widget({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true, + style: 'padding: ' + this._padding / scaleFactor + 'px;' + }); + + this._previewBin.set_size(previewBinWidth, previewBinHeight); + + box.add_child(this._previewBin); + + if (headerHeight) { + let headerBox = new St.Widget({ + style_class: 'preview-header-box', + layout_manager: new Clutter.BoxLayout(), + x_expand: true, + y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] + }); + headerBox.set_size(headerHeight, headerHeight); + + this._windowTitle = new St.Label({ y_align: Clutter.ActorAlign.CENTER, x_expand: true }); + + headerBox.insert_child_at_index(this._windowTitle, isLeftButtons ? 1 : 2); + + box.insert_child_at_index(headerBox, isTopHeader ? 0 : 1); + } + + this.add_child(box); + this.add_child(this._closeButtonBin); + + closeButton.connect('clicked', () => this._onCloseBtnClick()); + this.connect('notify::hover', () => this._onHoverChanged()); + this.connect('button-release-event', (actor, e) => this._onButtonReleaseEvent(e)); + this.connect('destroy', () => this._onDestroy()); + }, + + adjustOnStage: function() { + let closeButton = this._closeButtonBin.get_first_child(); + let closeButtonHeight = closeButton.height; + let maxCloseButtonSize = MAX_CLOSE_BUTTON_SIZE * scaleFactor; + let closeButtonBorderRadius = ''; + + if (closeButtonHeight > maxCloseButtonSize) { + closeButtonHeight = maxCloseButtonSize; + closeButton.set_size(closeButtonHeight, closeButtonHeight); + } + + if (!headerHeight) { + closeButtonBorderRadius = 'border-radius: '; + + if (isTopHeader) { + closeButtonBorderRadius += (isLeftButtons ? '0 0 8px 0;' : '0 0 0 8px;'); + } else { + closeButtonBorderRadius += (isLeftButtons ? '0 8px 0 0;' : '8px 0 0 0;'); + } + } + + setStyle( + this._closeButtonBin, + 'padding: ' + (headerHeight ? Math.round((headerHeight - closeButtonHeight) * .5 / scaleFactor) : 4) + 'px;' + + closeButtonBorderRadius + ); + }, + + assignWindow: function(window, animateSize) { + if (this.window != window) { + let _assignWindowClone = () => { + if (window.get_compositor_private()) { + let cloneBin = this._getWindowCloneBin(window); + + this._resizeClone(cloneBin, window); + this._addClone(cloneBin, animateSize); + this._previewMenu.updatePosition(); + } else if (!this._waitWindowId) { + this._waitWindowId = Mainloop.idle_add(() => { + this._waitWindowId = 0; + + if (this._previewMenu.opened) { + _assignWindowClone(); + } + }); + } + }; + + _assignWindowClone(); + } + + this._cancelAnimateOut(); + this._removeWindowSignals(); + this.window = window; + this._needsCloseButton = window.can_close() && !Utils.checkIfWindowHasTransient(window); + this._updateHeader(); + }, + + animateOut: function() { + if (!this.animatingOut) { + let tweenOpts = getTweenOpts({ opacity: 0, width: 0, height: 0, onComplete: () => this.destroy() }); + + this.animatingOut = true; + + Utils.stopAnimations(this); + Utils.animate(this, tweenOpts); + } + }, + + getSize: function() { + let [binWidth, binHeight] = this._getBinSize(); + + binWidth = Math.max(binWidth, this.cloneWidth + this._padding * 2); + binHeight = Math.max(binHeight, this.cloneHeight + this._padding * 2) + headerHeight; + + return [binWidth, binHeight]; + }, + + setFocus: function(focused) { + this._hideOrShowCloseButton(!focused); + setStyle(this, this._getBackgroundColor(FOCUSED_COLOR_OFFSET, focused ? '-' : 0)); + + if (focused) { + this._previewMenu.ensureVisible(this); + this._previewMenu.requestPeek(this.window); + } + }, + + activate: function() { + this._previewMenu.endPeekHere(); + this._previewMenu.close(); + Main.activateWindow(this.window); }, _onDestroy: function() { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; + if (this._waitWindowId) { + GLib.source_remove(this._waitWindowId); + this._waitWindowId = 0; + } + + this._removeWindowSignals(); }, - _createPreviewItem: function(window) { - let preview = new thumbnailPreview(window); + _onHoverChanged: function() { + this.setFocus(this.hover); + }, + _onCloseBtnClick: function() { + this._hideOrShowCloseButton(true); + this.reactive = false; - preview.actor.connect('notify::hover', Lang.bind(this, function() { - if (preview.actor.hover){ - this._ensurePreviewVisibilityTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, function(){ - Taskbar.ensureActorVisibleInScrollView(this.actor, preview.actor); - this._ensurePreviewVisibilityTimeoutId = 0; - return GLib.SOURCE_REMOVE; - })); - } else { - if (this._ensurePreviewVisibilityTimeoutId>0) { - Mainloop.source_remove(this._ensurePreviewVisibilityTimeoutId); - this._ensurePreviewVisibilityTimeoutId = 0; + if (!Me.settings.get_boolean('group-apps')) { + this._previewMenu.close(); + } else { + this._previewMenu.endPeekHere(); + } + + this.window.delete(global.get_current_time()); + }, + + _onButtonReleaseEvent: function(e) { + switch (e.get_button()) { + case 1: // Left click + this.activate(); + break; + case 2: // Middle click + if (Me.settings.get_boolean('preview-middle-click-close')) { + this._onCloseBtnClick(); } - } - })); + break; + case 3: // Right click + this._showContextMenu(e); + break; + } - preview.actor.connect('key-focus-in', - Lang.bind(this, function(actor) { - - let [x_shift, y_shift] = Taskbar.ensureActorVisibleInScrollView(this.actor, actor); - })); - - return preview; + return Clutter.EVENT_STOP; }, - _redisplay: function () { - let windows = Taskbar.getAppInterestingWindows(this.app).sort(this.sortWindowsCompareFunction); - let children = this.box.get_children().filter(function(actor) { - return actor._delegate.window && actor._delegate.preview; - }); - // Apps currently in the taskbar - let oldWin = children.map(function(actor) { - return actor._delegate.window; - }); - // Apps supposed to be in the taskbar - let newWin = windows; + _cancelAnimateOut: function() { + if (this.animatingOut) { + this.animatingOut = false; - let addedItems = []; - let removedActors = []; + Utils.stopAnimations(this); + Utils.animate(this, getTweenOpts({ opacity: 255, width: this.cloneWidth, height: this.cloneHeight })); + } + }, - let newIndex = 0; - let oldIndex = 0; + _showContextMenu: function(e) { + let coords = e.get_coords(); + let currentWorkspace = this._previewMenu.peekInitialWorkspaceIndex < 0 ? + Utils.getCurrentWorkspace() : + Utils.getWorkspaceByIndex(this._previewMenu.peekInitialWorkspaceIndex); - while (newIndex < newWin.length || oldIndex < oldWin.length) { - // No change at oldIndex/newIndex - if (oldWin[oldIndex] == newWin[newIndex]) { - oldIndex++; - newIndex++; - continue; - } + Main.wm._showWindowMenu(null, this.window, Meta.WindowMenuType.WM, { + x: coords[0], + y: coords[1], + width: 0, + height: 0 + }); - // Window removed at oldIndex - if (oldWin[oldIndex] && - newWin.indexOf(oldWin[oldIndex]) == -1) { - removedActors.push(children[oldIndex]); - oldIndex++; - continue; - } + let ctxMenuData = Main.wm._windowMenuManager._manager._menus[0]; - // Window added at newIndex - if (newWin[newIndex] && - oldWin.indexOf(newWin[newIndex]) == -1) { - addedItems.push({ item: this._createPreviewItem(newWin[newIndex]), - pos: newIndex }); - newIndex++; - continue; - } + ctxMenuData.menu.connect('open-state-changed', () => this._previewMenu.menu.sync_hover()); - // 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 (this.window.get_workspace() != currentWorkspace) { + let menuItem = new PopupMenu.PopupMenuItem(_('Move to current Workspace') + ' [' + (currentWorkspace.index() + 1) + ']'); + let menuItems = ctxMenuData.menu.box.get_children(); + let insertIndex = Utils.findIndex(menuItems, c => c._delegate instanceof PopupMenu.PopupSeparatorMenuItem); - if (insertHere || alreadyRemoved) { - addedItems.push({ item: this._createPreviewItem(newWin[newIndex]), - pos: newIndex + removedActors.length }); - newIndex++; + insertIndex = insertIndex >= 0 ? insertIndex : menuItems.length - 1; + ctxMenuData.menu.addMenuItem(menuItem, insertIndex); + menuItem.connect('activate', () => this.window.change_workspace(currentWorkspace)); + } + }, + + _removeWindowSignals: function() { + if (this._titleWindowChangeId) { + this.window.disconnect(this._titleWindowChangeId); + this._titleWindowChangeId = 0; + } + }, + + _updateHeader: function() { + if (headerHeight) { + this._titleWindowChangeId = this.window.connect('notify::title', () => this._updateWindowTitle()); + setStyle(this._windowTitle, 'max-width: 0px; padding-left: 8px; padding-right: 8px; text-align: center;'); + this._updateWindowTitle(); + } + }, + + _updateWindowTitle: function() { + this._windowTitle.text = this.window.title; + }, + + _hideOrShowCloseButton: function(hide) { + if (this._needsCloseButton) { + Utils.animate(this._closeButtonBin, getTweenOpts({ opacity: hide ? 0 : 255 })); + } + }, + + _getBackgroundColor: function(offset, alpha) { + return 'background-color: ' + this._getRgbaColor(offset, alpha) + + 'transition-duration:' + this._previewMenu.panel.dynamicTransparency.animationDuration; + }, + + _getRgbaColor: function(offset, alpha) { + alpha = Math.abs(alpha); + + if (isNaN(alpha)) { + alpha = alphaBg; + } + + return Utils.getrgbaColor(this._previewMenu._getThemeBackground(), alpha, offset); + }, + + _addClone: function(newCloneBin, animateSize) { + let currentClones = this._previewBin.get_children(); + let newCloneOpts = getTweenOpts({ opacity: 255 }); + + this._previewBin.add_child(newCloneBin); + + if (currentClones.length) { + let currentCloneBin = currentClones.pop(); + let currentCloneOpts = getTweenOpts({ opacity: 0, onComplete: () => currentCloneBin.destroy() }); + + if (newCloneBin.width > currentCloneBin.width) { + newCloneOpts.width = newCloneBin.width; + newCloneBin.width = currentCloneBin.width; } else { - removedActors.push(children[oldIndex]); - oldIndex++; + currentCloneOpts.width = newCloneBin.width; } + + if (newCloneBin.height > currentCloneBin.height) { + newCloneOpts.height = newCloneBin.height; + newCloneBin.height = currentCloneBin.height; + } else { + currentCloneOpts.height = newCloneBin.height; + } + + currentClones.forEach(c => c.destroy()); + Utils.animate(currentCloneBin, currentCloneOpts); + } else if (animateSize) { + newCloneBin.width = 0; + newCloneBin.height = 0; + newCloneOpts.width = this.cloneWidth; + newCloneOpts.height = this.cloneHeight; } - for (let i = 0; i < addedItems.length; i++) - this.addMenuItem(addedItems[i].item, - addedItems[i].pos); + Utils.animate(newCloneBin, newCloneOpts); + }, + + _getWindowCloneBin: function(window) { + let frameRect = window.get_frame_rect(); + let bufferRect = window.get_buffer_rect(); + let clone = new Clutter.Clone({ source: window.get_compositor_private() }); + let cloneBin = new St.Widget({ + opacity: 0, + layout_manager: frameRect.width != bufferRect.width || + frameRect.height != bufferRect.height ? + new WindowCloneLayout(frameRect, bufferRect) : + new Clutter.BinLayout() + }); + + cloneBin.add_child(clone); - for (let i = 0; i < removedActors.length; i++) { - let item = removedActors[i]; - item._delegate.animateOutAndDestroy(); - } - - // 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); - } - - this._queueScrollbar(); - - // 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 (windows.length < 1) { - this._getTopMenu().close(~0); - } + return cloneBin; }, - isAnimatingOut: function() { - return this.actor.get_children().reduce(function(result, actor) { - return result || actor.animatingOut; - }, false); + _getBinSize: function() { + let [fixedWidth, fixedHeight] = this._previewDimensions; + + return [ + aspectRatio.x.fixed ? fixedWidth + this._padding * 2 : -1, + aspectRatio.y.fixed ? fixedHeight + this._padding * 2 : -1 + ]; }, - sortWindowsCompareFunction: function(windowA, windowB) { - return windowA.get_stable_sequence() > windowB.get_stable_sequence(); + _resizeClone: function(cloneBin, window) { + let frameRect = cloneBin.layout_manager.frameRect || window.get_frame_rect(); + let [fixedWidth, fixedHeight] = this._previewDimensions; + let ratio = Math.min(fixedWidth / frameRect.width, fixedHeight / frameRect.height, 1); + let cloneWidth = frameRect.width * ratio; + let cloneHeight = frameRect.height * ratio; + + let clonePaddingTB = cloneHeight < MIN_DIMENSION ? MIN_DIMENSION - cloneHeight : 0; + let clonePaddingLR = cloneWidth < MIN_DIMENSION ? MIN_DIMENSION - cloneWidth : 0; + let clonePaddingTop = clonePaddingTB * .5; + let clonePaddingLeft = clonePaddingLR * .5; + + this.cloneWidth = cloneWidth + clonePaddingLR * scaleFactor; + this.cloneHeight = cloneHeight + clonePaddingTB * scaleFactor; + + cloneBin.set_style('padding: ' + clonePaddingTop + 'px ' + clonePaddingLeft + 'px;'); + cloneBin.layout_manager.ratio = ratio; + cloneBin.layout_manager.padding = [clonePaddingLeft * scaleFactor, clonePaddingTop * scaleFactor]; + + cloneBin.get_first_child().set_size(cloneWidth, cloneHeight); + }, + + _getPreviewDimensions: function() { + let size = Me.settings.get_int('window-preview-size') * scaleFactor; + let w, h; + + if (this._previewMenu.isVertical) { + w = size; + h = w * aspectRatio.y.size / aspectRatio.x.size; + } else { + h = size; + w = h * aspectRatio.x.size / aspectRatio.y.size; + } + + return [w, h]; } - }); + +var WindowCloneLayout = Utils.defineClass({ + Name: 'ZorinTaskbar-WindowCloneLayout', + Extends: Clutter.BinLayout, + + _init: function(frameRect, bufferRect) { + this.callParent('_init'); + + //the buffer_rect contains the transparent padding that must be removed + this.frameRect = frameRect; + this.bufferRect = bufferRect; + }, + + vfunc_allocate: function(actor, box, flags) { + let [width, height] = box.get_size(); + + box.set_origin( + (this.bufferRect.x - this.frameRect.x) * this.ratio + this.padding[0], + (this.bufferRect.y - this.frameRect.y) * this.ratio + this.padding[1] + ); + + box.set_size( + width + (this.bufferRect.width - this.frameRect.width) * this.ratio, + height + (this.bufferRect.height - this.frameRect.height) * this.ratio + ); + + Utils.allocate(actor.get_first_child(), box, flags); + } +}); + +function setStyle(actor, style) { + actor.set_style(style); +} + +function getTweenOpts(opts) { + let defaults = { + time: animationTime, + transition: 'easeInOutQuad' + }; + + return Utils.mergeObjects(opts || {}, defaults); +}