Compare commits
333 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48bfe6dc1e | ||
|
|
f380f527d0 | ||
|
|
5c9292aae3 | ||
|
|
ab3d3ce41b | ||
|
|
c3796b2b19 | ||
|
|
e5ae9e7110 | ||
|
|
5c91a2867d | ||
|
|
2f5c095f7a | ||
|
|
95b0d72e04 | ||
|
|
7fb52fa115 | ||
|
|
5c6c81dd2b | ||
|
|
ab45ec8ee7 | ||
|
|
b9fba54b9f | ||
|
|
f187f47cdd | ||
|
|
c4a694337c | ||
|
|
4103a228b2 | ||
|
|
da49c0d635 | ||
|
|
c626cc2a1d | ||
|
|
92ccfc0e0d | ||
|
|
61ee59f083 | ||
|
|
7783e99842 | ||
|
|
2397289568 | ||
|
|
edefa7b674 | ||
|
|
5392a50e98 | ||
|
|
fc5c7c8fda | ||
|
|
3c0d84469a | ||
|
|
01542c3dc7 | ||
|
|
0aaa37c30f | ||
|
|
a1c938d3d9 | ||
|
|
f23197e09e | ||
|
|
a4fe08d53d | ||
|
|
7e3b48da9d | ||
|
|
b843058c18 | ||
|
|
9b05c80f81 | ||
|
|
3805054b25 | ||
|
|
348f0faf22 | ||
|
|
b907e44fdf | ||
|
|
032233cf9d | ||
|
|
443837e09d | ||
|
|
7f1904a97c | ||
|
|
caaa544fd6 | ||
|
|
179b14ea4b | ||
|
|
9211fa4409 | ||
|
|
edb8a65c78 | ||
|
|
fdd2fa09d7 | ||
|
|
5d37b39ce5 | ||
|
|
b673e1624a | ||
|
|
2b81d125cb | ||
|
|
31128e0dae | ||
|
|
680e4e075a | ||
|
|
dd3349bf6d | ||
|
|
f53d251a46 | ||
|
|
80b4f108df | ||
|
|
df2e1e6217 | ||
|
|
292661d943 | ||
|
|
c978057d3a | ||
|
|
8034b65f46 | ||
|
|
c1c9f280d8 | ||
|
|
e179ab72fc | ||
|
|
11e8f2832c | ||
|
|
61f86a3f29 | ||
|
|
0fed304f79 | ||
|
|
02989fd0f7 | ||
|
|
9900ae19dc | ||
|
|
b9a4d178a8 | ||
|
|
8815c670ea | ||
|
|
1e45a69d36 | ||
|
|
0b7c3e3dbb | ||
|
|
b9563829bb | ||
|
|
4b26753d83 | ||
|
|
cdb7ff0cec | ||
|
|
c421da905f | ||
|
|
5a08081cc0 | ||
|
|
ad542d2f77 | ||
|
|
20e8a0dcc3 | ||
|
|
87c26eab14 | ||
|
|
877a53c2fc | ||
|
|
10e38adf20 | ||
|
|
2a64ee6993 | ||
|
|
9d9ef27317 | ||
|
|
785656d149 | ||
|
|
f8ee696c7c | ||
|
|
aa677b265a | ||
|
|
9b04e6f44c | ||
|
|
315aa82d15 | ||
|
|
0bc41bcb1d | ||
|
|
e59c218c62 | ||
|
|
880758e470 | ||
|
|
a5ce94c6d3 | ||
|
|
8a73e58134 | ||
|
|
bfe7a760d1 | ||
|
|
0d932f4b24 | ||
|
|
6c1dbe1ee1 | ||
|
|
a125390c5f | ||
|
|
fdb5f3e8ef | ||
|
|
d64feb040d | ||
|
|
987409b742 | ||
|
|
e14efb3dfc | ||
|
|
7e3262a58d | ||
|
|
f670aa5cc3 | ||
|
|
da2ed2d695 | ||
|
|
23e5cd30a4 | ||
|
|
42a85d81a6 | ||
|
|
1d65af715f | ||
|
|
7ae2ddcb95 | ||
|
|
0abb0f4b57 | ||
|
|
dfcff4b297 | ||
|
|
fa2840aee3 | ||
|
|
e48e1d0a38 | ||
|
|
f9f4684c8d | ||
|
|
3954649632 | ||
|
|
74702c00e5 | ||
|
|
727872833f | ||
|
|
e0518f0bda | ||
|
|
ef5a8a9641 | ||
|
|
69bfc23b7f | ||
|
|
9bc1e04654 | ||
|
|
c3872afc30 | ||
|
|
a6e5f8aab7 | ||
|
|
67a4db07aa | ||
|
|
f834c29530 | ||
|
|
60f38b3b6c | ||
|
|
3fddc8e846 | ||
|
|
f0e1229a26 | ||
|
|
00871cc98f | ||
|
|
3992182905 | ||
|
|
2df41753e5 | ||
|
|
39c221775e | ||
|
|
eda45e6072 | ||
|
|
333871387a | ||
|
|
eb6b84eb18 | ||
|
|
d8c651f255 | ||
|
|
7cf25a3bc0 | ||
|
|
fdad0263ec | ||
|
|
c5181cda46 | ||
|
|
56f6eccc82 | ||
|
|
6a74326a61 | ||
|
|
48d4956ee0 | ||
|
|
0ab46d5c70 | ||
|
|
cd7d9aa2a4 | ||
|
|
ea3d27c311 | ||
|
|
6c050118f4 | ||
|
|
dfb942f6fe | ||
|
|
262efe3c9e | ||
|
|
d1d099fbbf | ||
|
|
45da997dd3 | ||
|
|
d91c949068 | ||
|
|
5a028aab52 | ||
|
|
c49758f1c5 | ||
|
|
5ca52e89d5 | ||
|
|
dd26111c04 | ||
|
|
f40e7109e5 | ||
|
|
5cb3e1877a | ||
|
|
a78a16b4a7 | ||
|
|
a6307d48c0 | ||
|
|
f9d95b9408 | ||
|
|
fb3df46a25 | ||
|
|
d2a7a95628 | ||
|
|
12e91b86e5 | ||
|
|
5e89c761ca | ||
|
|
d12307991a | ||
|
|
c711ce83fa | ||
|
|
96f91eda59 | ||
|
|
e2a76b665a | ||
|
|
c638e6c0f2 | ||
|
|
9ef1ecd827 | ||
|
|
60f0954a76 | ||
|
|
08339cd78e | ||
|
|
a772154471 | ||
|
|
e02cd89c8b | ||
|
|
706857132a | ||
|
|
c0f6028212 | ||
|
|
ecd9e4ab6c | ||
|
|
d4f3391481 | ||
|
|
dd9b47e51e | ||
|
|
279dd348e4 | ||
|
|
efe068324b | ||
|
|
338f742310 | ||
|
|
c1845d73bd | ||
|
|
a3ae190edc | ||
|
|
6e946fe702 | ||
|
|
dca49d662d | ||
|
|
df73753b08 | ||
|
|
0676b9c0f9 | ||
|
|
13b8b3c22c | ||
|
|
35ee8fc2c6 | ||
|
|
99924c3952 | ||
|
|
dfd7191aa1 | ||
|
|
c5fd578214 | ||
|
|
e00a73b88a | ||
|
|
487fd4cd1c | ||
|
|
2acb53fa2e | ||
|
|
548ede7eea | ||
|
|
667f72532e | ||
|
|
7753a68331 | ||
|
|
6728411a52 | ||
|
|
31ff2d4c97 | ||
|
|
d355424f22 | ||
|
|
dde7084711 | ||
|
|
f77bf60bcb | ||
|
|
e3f1091f2d | ||
|
|
ffb3462d54 | ||
|
|
e1c1fc73e2 | ||
|
|
5ca9f35a95 | ||
|
|
6128102eac | ||
|
|
cb6d5357d9 | ||
|
|
9fb703ca6b | ||
|
|
06d2b906e0 | ||
|
|
98403dfc3b | ||
|
|
ec88930f80 | ||
|
|
ee5e54f9f4 | ||
|
|
ed9c17dfdd | ||
|
|
10027b6697 | ||
|
|
27abc7a42b | ||
|
|
3bb56a7a59 | ||
|
|
0e94c81734 | ||
|
|
7d41bd9fbd | ||
|
|
f12cd9ba39 | ||
|
|
182a9cff18 | ||
|
|
9bb5399263 | ||
|
|
82bd3efc73 | ||
|
|
0b3f7e37f0 | ||
|
|
2f034bbee2 | ||
|
|
f14ae5f3c9 | ||
|
|
1463a6481e | ||
|
|
0a9be8fc82 | ||
|
|
75629a468f | ||
|
|
72a5a3424f | ||
|
|
4e35410b7a | ||
|
|
9faa028f1e | ||
|
|
60f8139482 | ||
|
|
e7f7a488c6 | ||
|
|
f0b3e4de0a | ||
|
|
25ada42ed9 | ||
|
|
ef95c7e4e7 | ||
|
|
9e53a37c08 | ||
|
|
b3e783e7a8 | ||
|
|
9e41c06cd7 | ||
|
|
7b3650fb68 | ||
|
|
0bb2184efb | ||
|
|
e55101526c | ||
|
|
50b89bb8b5 | ||
|
|
856ebbf7e6 | ||
|
|
0c5564fe55 | ||
|
|
53ee4c096e | ||
|
|
5754e2db58 | ||
|
|
468ed6cfe6 | ||
|
|
a4fac964dc | ||
|
|
245ab96a27 | ||
|
|
6b373686d3 | ||
|
|
c90f90a5c7 | ||
|
|
1dca3fecaa | ||
|
|
b6f4ed7013 | ||
|
|
9b6374881d | ||
|
|
2388b8738f | ||
|
|
775bd5a86a | ||
|
|
3630228cac | ||
|
|
7517d8ab6a | ||
|
|
9ebfd1f495 | ||
|
|
dfca68062c | ||
|
|
ce1334a610 | ||
|
|
8bc650ae19 | ||
|
|
46fe71d1b8 | ||
|
|
29b0d0d96b | ||
|
|
037a65c3d1 | ||
|
|
55bd12c989 | ||
|
|
2c5c6e0c1a | ||
|
|
e2353389e5 | ||
|
|
9d00455d8f | ||
|
|
c49c20fe38 | ||
|
|
684cfeeeaa | ||
|
|
eb3e6f9136 | ||
|
|
1e2668c291 | ||
|
|
c2c4eb39be | ||
|
|
711b714a3f | ||
|
|
cdcdecd8f1 | ||
|
|
800efc2bb2 | ||
|
|
9679bb63b2 | ||
|
|
1d10cdf600 | ||
|
|
7dd6b5e112 | ||
|
|
1f7e5cc36a | ||
|
|
4b76e797cf | ||
|
|
631f88ff42 | ||
|
|
98b0a5e9ee | ||
|
|
9b630b387c | ||
|
|
5bf1339ef1 | ||
|
|
a70c9b7f5d | ||
|
|
b120e7fee9 | ||
|
|
fe052f0e69 | ||
|
|
e9919240c9 | ||
|
|
ca19f18c8f | ||
|
|
48d2d8789d | ||
|
|
5006a926b5 | ||
|
|
729f233d7a | ||
|
|
79046280d2 | ||
|
|
6442791482 | ||
|
|
3523728a61 | ||
|
|
7627c47d89 | ||
|
|
caa83943ba | ||
|
|
ae41fceba9 | ||
|
|
d71be4b73d | ||
|
|
1888229da6 | ||
|
|
10aec91ebb | ||
|
|
1d22e73a44 | ||
|
|
3981d066e5 | ||
|
|
fc47063c73 | ||
|
|
7a6777f703 | ||
|
|
c5d79240fd | ||
|
|
9e4156a706 | ||
|
|
f61af132e7 | ||
|
|
75617da66d | ||
|
|
805bcc4ab0 | ||
|
|
d76abc79c7 | ||
|
|
44c5651c3e | ||
|
|
afa8ccd07f | ||
|
|
c6624e84b3 | ||
|
|
5b72347566 | ||
|
|
b7e30eb99a | ||
|
|
bfa203266a | ||
|
|
7cabe76fe3 | ||
|
|
ef934af38d | ||
|
|
cbc4aab55d | ||
|
|
56a94b31e6 | ||
|
|
05a0586e38 | ||
|
|
bf7c3c548f | ||
|
|
9eb2a50c47 | ||
|
|
2bba98d621 | ||
|
|
4c5a36e4c0 | ||
|
|
66242aa76a | ||
|
|
967aee7aad | ||
|
|
6ba59d9072 | ||
|
|
9f7c5d38f0 | ||
|
|
d3bf490b3d |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -6,13 +6,18 @@ config.log
|
||||
config.status
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
data/*.json
|
||||
po/gnome-shell-extensions.pot
|
||||
po/POTFILES
|
||||
po/stamp-it
|
||||
staging/
|
||||
zip-files/
|
||||
|
||||
*~
|
||||
*.gmo
|
||||
metadata.json
|
||||
*.desktop
|
||||
*.desktop.in
|
||||
*.gschema.xml
|
||||
*.gschema.valid
|
||||
*.session
|
||||
|
||||
47
Makefile.am
47
Makefile.am
@@ -1,5 +1,52 @@
|
||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||
|
||||
DIST_SUBDIRS = data extensions po
|
||||
|
||||
SUBDIRS = extensions po
|
||||
|
||||
if CLASSIC_MODE
|
||||
SUBDIRS += data
|
||||
endif
|
||||
|
||||
EXTRA_DIST = lib/convenience.js
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-extensions=all
|
||||
|
||||
include include.mk
|
||||
|
||||
zip-file: all
|
||||
-rm -fR $(builddir)/_build
|
||||
-rm -fR $(builddir)/zip-files
|
||||
$(MKDIR_P) $(builddir)/_build; \
|
||||
$(MKDIR_P) $(builddir)/zip-files; \
|
||||
$(MAKE) install DESTDIR="$(abs_builddir)/_build"; \
|
||||
for i in $(ENABLED_EXTENSIONS); do \
|
||||
mv "$(builddir)/_build$(topextensiondir)/$${i}$(extensionbase)" "$(builddir)/_build/"; \
|
||||
cp -r "$(builddir)/_build$(datadir)/locale" "$(builddir)/_build/$${i}$(extensionbase)"; \
|
||||
cp "$(srcdir)/COPYING" -t "$(builddir)/_build/$${i}$(extensionbase)"; \
|
||||
cp "$(srcdir)/NEWS" -t "$(builddir)/_build/$${i}$(extensionbase)"; \
|
||||
if [ -f "$(builddir)/_build$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" ]; then \
|
||||
$(MKDIR_P) "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
|
||||
mv "$(builddir)/_build$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
|
||||
glib-compile-schemas "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
|
||||
fi; \
|
||||
(cd "$(builddir)/_build/$${i}$(extensionbase)"; \
|
||||
zip -qr "$(abs_builddir)/zip-files/$${i}$(extensionbase).shell-extension.zip" .; \
|
||||
); \
|
||||
done
|
||||
-rm -fR $(builddir)/_build
|
||||
|
||||
localprefix = $(HOME)/.local/share/gnome-shell/extensions
|
||||
|
||||
local-install: zip-file
|
||||
for i in $(ENABLED_EXTENSIONS); do \
|
||||
uuid="$${i}$(extensionbase)"; \
|
||||
zip_file="$(abs_builddir)/zip-files/$${uuid}.shell-extension.zip"; \
|
||||
if [ -d "$(localprefix)/$${uuid}" ]; then \
|
||||
rm -fR "$(localprefix)/$${uuid}"; \
|
||||
fi; \
|
||||
$(MKDIR_P) $(localprefix)/$${uuid}; \
|
||||
(cd $(localprefix)/$${uuid}; \
|
||||
unzip -q $${zip_file}; \
|
||||
); \
|
||||
done
|
||||
|
||||
201
NEWS
201
NEWS
@@ -1,3 +1,204 @@
|
||||
3.7.90
|
||||
======
|
||||
* various fixes to make places-menu behave more
|
||||
like Nautilus, including showing the machine
|
||||
name in place of File System
|
||||
* various updates for shell changes
|
||||
* alternative-status-menu no longer supports
|
||||
ConsoleKit systems, you need to install logind
|
||||
to have suspend or hibernate
|
||||
* translation updates (es, cz, pl, sr)
|
||||
|
||||
3.7.5.1
|
||||
=======
|
||||
* new extension forgotten in previous NEWS entry:
|
||||
windows-list
|
||||
* also forgotten previously: classic mode got a new
|
||||
GNOME2 style
|
||||
* build fixes
|
||||
|
||||
3.7.5
|
||||
=====
|
||||
* places-menu is back in the classic extensions, with
|
||||
a new old GNOME-2 look
|
||||
* classic mode moved the date menu to right, where we
|
||||
all know it rightly belongs
|
||||
* apps-menu received a face-lift, with the inclusion
|
||||
of a reduced form of AxeMenu
|
||||
* new extension in the classic set: launch-new-instance,
|
||||
which modifies the behavior of clicking in the dash
|
||||
and app launcher
|
||||
* alternate-tab, native-window-placement and windowsNavigator
|
||||
updated for gnome-shell changes
|
||||
* translation updates (es, cz, pl)
|
||||
|
||||
3.7.4
|
||||
=====
|
||||
* a separate configure switch has been added to enable
|
||||
classic mode session definitions
|
||||
* places-menu is no longer part of the classic-mode
|
||||
extension set
|
||||
* updated translations (ar, gl, hu, lt, pt_BR, sr)
|
||||
|
||||
3.7.3
|
||||
=====
|
||||
* new extensions: default-min-max, static-workspaces
|
||||
* alternate-tab now uses the built-in window switcher and just
|
||||
takes over the switch-application keybinding
|
||||
* workspace-indicator: is no longer part of classic-mode
|
||||
* we now install classic-mode data files for gdm, gnome-session
|
||||
and gnome-shell, so if you enable classic-mode you get a new
|
||||
session option in GDM
|
||||
* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW)
|
||||
|
||||
3.7.2
|
||||
=====
|
||||
* fixed crashes with places-menu, windowsNavigator, alternate-tab
|
||||
and native-window-placement
|
||||
* alternate-tab now hides attached modal dialogs
|
||||
* places-menu has restored support for Nautilus 3.4
|
||||
* the default for hibernate is now to show in alternative-status-menu
|
||||
* some extensions are now tagged as "classic", and can be chosen with
|
||||
--enable-extensions=classic-mode
|
||||
* dock and gajim were removed at the beginning of the 3.7.1 cycle,
|
||||
as they were buggy and unmaintained
|
||||
* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl
|
||||
ru, sk, sl, sr, sr@latin)
|
||||
|
||||
3.6.1
|
||||
=====
|
||||
* fixed alternative-status-menu for the new lock screen
|
||||
* squashed some alternate-tab warnings
|
||||
* drive-menu now works with 3.6 again
|
||||
* updated translations (ar, cs, el, es, gl, id, lv, pl, sl)
|
||||
|
||||
3.6.0
|
||||
=====
|
||||
* major rework in places menu, to make it work without
|
||||
removed supporting code in the shell and to make it look like
|
||||
the nautilus sidebar
|
||||
(similar work would be needed for drive-menu, not done yet)
|
||||
* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt,
|
||||
pl, pt_BR, ru, sl, sr)
|
||||
|
||||
3.5.91
|
||||
======
|
||||
* various crashers were fixed in alternative-tab
|
||||
* auto-move-windows now can be made to work with static workspaces
|
||||
* place-menu is now on the left and uses symbolic icons like Files
|
||||
* StIconType usage was removed from all extensions, after it was
|
||||
removed in core
|
||||
* systemMonitor, xrandr-indicator, apps-menu, places-menu,
|
||||
alternative-status-menu were updated for the newer shell
|
||||
* updated translations (es, gl, it, pl, sl)
|
||||
|
||||
3.5.90
|
||||
======
|
||||
* alternate-tab has been reworked again, the old mode switch
|
||||
was removed and the all&thumbnails code extended to handle
|
||||
icons and filtering to the workspace
|
||||
* alternate-tab thumbnails now reflect the aspect ratio of the windows
|
||||
* systemMonitor now shows a tooltip above the indicator
|
||||
* native-window-placement, systemMonitor and windowsNavigator have been updated
|
||||
for the newer shell
|
||||
* updated translations (es, pa)
|
||||
|
||||
3.5.5
|
||||
=====
|
||||
* convenience module has been relicensed to BSD,
|
||||
for compatibility with GPLv3 extensions
|
||||
* alternate-tab has been refactored and seen various
|
||||
improvements to all&thumbnails mode, including a new
|
||||
overlaid application icon
|
||||
* updated translations (lt, id, sr)
|
||||
|
||||
3.5.4
|
||||
=====
|
||||
* updated translations (de, es, ar, sl, lv, zh_CN)
|
||||
|
||||
3.5.2
|
||||
=====
|
||||
* removable-drive-menu is now a11y friendly
|
||||
* the dock can now be placed on any monitor, not just the primary
|
||||
* dock is now clipped to its monitor
|
||||
* alternative-status-menu now exposes GSettings for Suspend
|
||||
and Hibernate visibility - no UI yet
|
||||
* more gnome-shell API changes (places-menu, removable-drive-menu,
|
||||
alternative-status-menu)
|
||||
* miscellaneous bug fixes (native-window-placement, gajim,
|
||||
auto-move-windows)
|
||||
* updated translations
|
||||
|
||||
3.4.0
|
||||
=====
|
||||
* build system improvements
|
||||
* updated translations (ar, cs, fr)
|
||||
|
||||
3.3.92
|
||||
======
|
||||
* various updates for gnome-shell API changes (dock,
|
||||
native-window-placement)
|
||||
* local-install is now a make rule, not a shell script
|
||||
* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl,
|
||||
pl, la, fi, sr)
|
||||
|
||||
3.3.90
|
||||
======
|
||||
* system wide installation via "make install" is possible
|
||||
again
|
||||
* alternate-tab can now pre-activate the selected window
|
||||
* auto-move-windows, workspace-indicator and example gained
|
||||
new preference dialogs
|
||||
* workspace-indicator: fixed a bug wrt focus stealing prevention
|
||||
* updated translations (es, pt_BR, it, sl, gl, sr)
|
||||
|
||||
3.3.5
|
||||
=====
|
||||
* improvements to the build system and convenience module,
|
||||
making it easier for other extensions to use, and bringing
|
||||
it up to date with gnome-shell changes
|
||||
* all extensions were ported to the Lang.Class framework
|
||||
(except xrandr-indicator, which is pending GDBus merge)
|
||||
* alternate-tab and dock were slightly refactored to clean up
|
||||
some old code
|
||||
|
||||
3.3.4
|
||||
=====
|
||||
* improved styling of windowsNavigator tooltips
|
||||
* fixed windowsNavigator when used with the numeric keypad
|
||||
* fixed native-window-placement with custom button layout
|
||||
* updated translations (pt_BR, cz)
|
||||
|
||||
3.3.3
|
||||
=====
|
||||
* windowsNavigator was fixed to work with azerty keyboards
|
||||
* drive-menu was changed to use media-eject icon instead of media-optical
|
||||
* dock: the default value of hide-effect is now move
|
||||
* dock: if autohide is disabled, now it pushes maximized windows aside
|
||||
* dock was updated to match current core shell styling
|
||||
* native-window-placement: position stategy setting was removed
|
||||
* alternative-status-menu no longer conflicts with other extensions
|
||||
in the user menu
|
||||
* various other minor bug fixes
|
||||
* updated translations (zh, uk, es, it, cz, sl, sk, fi)
|
||||
|
||||
3.3.2
|
||||
=====
|
||||
* all extensions are now self-contained, including l10n and settings
|
||||
* introduce a convenience module that can be shared among all extensions
|
||||
* you can know build an installable zip file with make zip-file
|
||||
* apps-menu no longer shows NoDisplay apps
|
||||
* alternative-status-menu, alternate-tab: fix for master shell
|
||||
|
||||
3.2.1
|
||||
=====
|
||||
* dock: added "move" hide effect
|
||||
* systemMonitor: now it enables/disables properly
|
||||
* systemMonitor: improved styling
|
||||
* alternate-tab: both modes now work with gnome-shell 3.2
|
||||
* various other bug fixes
|
||||
* updated translations
|
||||
|
||||
3.2.0
|
||||
=====
|
||||
|
||||
|
||||
50
configure.ac
50
configure.ac
@@ -1,10 +1,10 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell-extensions],[3.2.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=extensions])
|
||||
AC_INIT([gnome-shell-extensions],[3.7.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=extensions])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_AUX_DIR([config])
|
||||
|
||||
AM_INIT_AUTOMAKE([1.10 dist-bzip2 no-dist-gzip foreign tar-ustar])
|
||||
AM_INIT_AUTOMAKE([1.10 dist-xz no-dist-gzip foreign tar-ustar])
|
||||
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
|
||||
@@ -18,24 +18,45 @@ PKG_PROG_PKG_CONFIG([0.22])
|
||||
|
||||
GLIB_GSETTINGS
|
||||
|
||||
SHELL_VERSION="$PACKAGE_VERSION"
|
||||
shell_major=`echo "$PACKAGE_VERSION" | cut -d'.' -f1`
|
||||
shell_minor=`echo "$PACKAGE_VERSION" | cut -d'.' -f2`
|
||||
if test "$(($shell_minor % 2))" -eq 0; then
|
||||
SHELL_VERSION="$shell_major.$shell_minor"
|
||||
fi
|
||||
AC_SUBST([SHELL_VERSION])
|
||||
|
||||
dnl keep this in alphabetic order
|
||||
dnl by default, install only extensions that do not change completely the shell experience,
|
||||
dnl that don't require GSettings and that don't require external packages for typelibs
|
||||
dnl (so basically only menus, status icons, search providers, overview tabs, message tray sources, etc.)
|
||||
DEFAULT_EXTENSIONS="alternative-status-menu apps-menu dock drive-menu gajim places-menu windowsNavigator workspace-indicator"
|
||||
ALL_EXTENSIONS="$DEFAULT_EXTENSIONS alternate-tab auto-move-windows example native-window-placement systemMonitor user-theme xrandr-indicator"
|
||||
CLASSIC_EXTENSIONS="apps-menu places-menu alternate-tab default-min-max launch-new-instance static-workspaces window-list"
|
||||
DEFAULT_EXTENSIONS="$CLASSIC_EXTENSIONS alternative-status-menu drive-menu windowsNavigator workspace-indicator"
|
||||
ALL_EXTENSIONS="$DEFAULT_EXTENSIONS auto-move-windows example native-window-placement systemMonitor user-theme xrandr-indicator"
|
||||
AC_SUBST(CLASSIC_EXTENSIONS, [$CLASSIC_EXTENSIONS])
|
||||
AC_SUBST(ALL_EXTENSIONS, [$ALL_EXTENSIONS])
|
||||
AC_ARG_ENABLE([extensions],
|
||||
[AS_HELP_STRING([--enable-extensions],[Space separated list of extensions to enable.
|
||||
The default is to build all extensions that can be installed in the home directory and have no external depedencies.
|
||||
Use "all" to enable all available extensions.])],
|
||||
The default is to build and distribute all extensions that can be installed in the home directory and have no external depedencies.
|
||||
Use "all" to enable all available extensions, or "classic-mode" to enable extensions that restore GNOME 2 functionality.])],
|
||||
[],
|
||||
[enable_extensions=$DEFAULT_EXTENSIONS]
|
||||
)
|
||||
if test x$enable_extensions = xall; then
|
||||
|
||||
if test x"$enable_extensions" = xall; then
|
||||
enable_extensions="$ALL_EXTENSIONS"
|
||||
enable_classic_mode_default=yes
|
||||
elif test x"$enable_extensions" = xclassic-mode; then
|
||||
enable_extensions="$CLASSIC_EXTENSIONS"
|
||||
enable_classic_mode_default=yes
|
||||
else
|
||||
enable_classic_mode_default=no
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([classic-mode],
|
||||
[AS_HELP_STRING([--enable-classic-mode],[Enable installing data files for classic mode.
|
||||
Defaults to yes if enabling all or classic-mode extensions, and no otherwise.])],
|
||||
[],
|
||||
[enable_classic_mode=$enable_classic_mode_default])
|
||||
AM_CONDITIONAL([CLASSIC_MODE], [test x"$enable_classic_mode" != xno])
|
||||
|
||||
ENABLED_EXTENSIONS=
|
||||
for e in $enable_extensions; do
|
||||
case $e in
|
||||
@@ -50,7 +71,7 @@ for e in $enable_extensions; do
|
||||
[AC_MSG_WARN([gnome-desktop-3.0 not found, disabling xrandr-indicator])])
|
||||
;;
|
||||
dnl keep this in alphabetic order
|
||||
alternate-tab|alternative-status-menu|apps-menu|auto-move-windows|dock|drive-menu|example|gajim|native-window-placement|places-menu|user-theme|windowsNavigator|workspace-indicator)
|
||||
alternate-tab|alternative-status-menu|apps-menu|auto-move-windows|default-min-max|drive-menu|example|launch-new-instance|native-window-placement|places-menu|static-workspaces|user-theme|window-list|windowsNavigator|workspace-indicator)
|
||||
ENABLED_EXTENSIONS="$ENABLED_EXTENSIONS $e"
|
||||
;;
|
||||
*)
|
||||
@@ -62,18 +83,21 @@ AC_SUBST(ENABLED_EXTENSIONS, [$ENABLED_EXTENSIONS])
|
||||
|
||||
dnl Please keep this sorted alphabetically
|
||||
AC_CONFIG_FILES([
|
||||
data/Makefile
|
||||
extensions/alternate-tab/Makefile
|
||||
extensions/alternative-status-menu/Makefile
|
||||
extensions/apps-menu/Makefile
|
||||
extensions/auto-move-windows/Makefile
|
||||
extensions/dock/Makefile
|
||||
extensions/default-min-max/Makefile
|
||||
extensions/drive-menu/Makefile
|
||||
extensions/example/Makefile
|
||||
extensions/gajim/Makefile
|
||||
extensions/launch-new-instance/Makefile
|
||||
extensions/native-window-placement/Makefile
|
||||
extensions/places-menu/Makefile
|
||||
extensions/static-workspaces/Makefile
|
||||
extensions/systemMonitor/Makefile
|
||||
extensions/user-theme/Makefile
|
||||
extensions/window-list/Makefile
|
||||
extensions/windowsNavigator/Makefile
|
||||
extensions/workspace-indicator/Makefile
|
||||
extensions/xrandr-indicator/Makefile
|
||||
|
||||
64
data/Makefile.am
Normal file
64
data/Makefile.am
Normal file
@@ -0,0 +1,64 @@
|
||||
include $(top_srcdir)/include.mk
|
||||
|
||||
desktopdir = $(datadir)/applications
|
||||
desktop_in_in_files = gnome-shell-classic.desktop.in.in
|
||||
desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in)
|
||||
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
|
||||
|
||||
sessiondir = $(datadir)/gnome-session/sessions
|
||||
session_in_in_files = gnome-classic.session.desktop.in.in
|
||||
session_in_files = $(session_in_in_files:.session.desktop.in.in=.session.desktop.in)
|
||||
session_DATA = $(session_in_files:.session.desktop.in=.session)
|
||||
|
||||
xsessiondir = $(datadir)/xsessions
|
||||
xsession_in_files = gnome-classic.desktop.in
|
||||
xsession_DATA = $(xsession_in_files:.desktop.in=.desktop)
|
||||
|
||||
modedir = $(datadir)/gnome-shell/modes
|
||||
mode_in_files = classic.json.in
|
||||
mode_DATA = $(mode_in_files:.json.in=.json)
|
||||
|
||||
themedir = $(datadir)/gnome-shell/theme
|
||||
theme_DATA = \
|
||||
$(srcdir)/classic-toggle-off-intl.svg \
|
||||
$(srcdir)/classic-toggle-off-us.svg \
|
||||
$(srcdir)/classic-toggle-on-intl.svg \
|
||||
$(srcdir)/classic-toggle-on-us.svg \
|
||||
$(srcdir)/gnome-classic.css \
|
||||
$(NULL)
|
||||
|
||||
%.desktop.in:%.desktop.in.in
|
||||
$(AM_V_GEN) sed \
|
||||
-e "s|\@libexecdir\@|$(libexecdir)|" \
|
||||
-e "s|\@bindir\@|$(bindir)|" \
|
||||
-e "s|\@VERSION\@|$(VERSION)|" \
|
||||
$< > $@
|
||||
|
||||
comma:=,
|
||||
empty:=
|
||||
space:= $(empty) $(empty)
|
||||
extensions:=$(patsubst %,\"%$(extensionbase)\",$(CLASSIC_EXTENSIONS))
|
||||
extension_list:=$(subst $(space),$(comma),$(extensions))
|
||||
%.json:%.json.in
|
||||
$(AM_V_GEN) sed \
|
||||
-e "s|\@CLASSIC_EXTENSIONS\@|$(extension_list)|g" \
|
||||
$< > $@
|
||||
|
||||
%.session: %.session.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
|
||||
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(desktop_in_in_files) \
|
||||
$(session_in_in_files) \
|
||||
$(xsession_in_files) \
|
||||
$(mode_in_files) \
|
||||
$(theme_DATA) \
|
||||
$(NULL)
|
||||
|
||||
CLEANFILES = \
|
||||
$(desktop_DATA) \
|
||||
$(session_DATA) \
|
||||
$(xsession_DATA) \
|
||||
$(mode_DATA) \
|
||||
$(NULL)
|
||||
250
data/classic-toggle-off-intl.svg
Normal file
250
data/classic-toggle-off-intl.svg
Normal file
@@ -0,0 +1,250 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg10865"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="toggle-off-us.svg">
|
||||
<defs
|
||||
id="defs10867">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62852-6-5"
|
||||
id="linearGradient62981-1-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.85639946,0,0,0.81059641,27.810405,92.069729)"
|
||||
x1="740"
|
||||
y1="486.10501"
|
||||
x2="740"
|
||||
y2="505.3204" />
|
||||
<linearGradient
|
||||
id="linearGradient62852-6-5">
|
||||
<stop
|
||||
id="stop62854-6-7"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.97726452"
|
||||
id="stop62858-8-0" />
|
||||
<stop
|
||||
id="stop62860-5-3"
|
||||
offset="1"
|
||||
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
is_visible="true"
|
||||
id="path-effect62989-8-0"
|
||||
effect="spiro" />
|
||||
<linearGradient
|
||||
id="linearGradient62821-5-8">
|
||||
<stop
|
||||
id="stop62823-2-4"
|
||||
offset="0"
|
||||
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop62825-3-8"
|
||||
offset="1"
|
||||
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient62852-6-5-3">
|
||||
<stop
|
||||
id="stop62854-6-7-6"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.97726452"
|
||||
id="stop62858-8-0-3" />
|
||||
<stop
|
||||
id="stop62860-5-3-9"
|
||||
offset="1"
|
||||
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect62829-6-8-0"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62821-5-8-1"
|
||||
id="linearGradient62864-0-3-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
|
||||
x1="702.58966"
|
||||
y1="484.49405"
|
||||
x2="702.58966"
|
||||
y2="507.42715" />
|
||||
<linearGradient
|
||||
id="linearGradient62821-5-8-1">
|
||||
<stop
|
||||
id="stop62823-2-4-2"
|
||||
offset="0"
|
||||
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop62825-3-8-9"
|
||||
offset="1"
|
||||
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="507.42715"
|
||||
x2="702.58966"
|
||||
y1="484.49405"
|
||||
x1="702.58966"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient11647"
|
||||
xlink:href="#linearGradient62821-5-8-1"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="-133.20351"
|
||||
inkscape:cy="20.84411"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g62929"
|
||||
showgrid="false"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-paths="true"
|
||||
inkscape:snap-others="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1380"
|
||||
inkscape:window-x="1600"
|
||||
inkscape:window-y="28"
|
||||
inkscape:window-maximized="1"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid11512" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata10870">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1030.3622)">
|
||||
<g
|
||||
inkscape:export-ydpi="90"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||
style="display:inline"
|
||||
id="g62929"
|
||||
transform="translate(-643.91421,517.29894)">
|
||||
<g
|
||||
transform="translate(0,30)"
|
||||
id="g62931">
|
||||
<rect
|
||||
style="fill:url(#linearGradient62864-0-3-1);fill-opacity:1;stroke:#a6a8a6;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero"
|
||||
id="rect62935"
|
||||
width="63.856125"
|
||||
height="21.093594"
|
||||
x="644.5"
|
||||
y="483.5"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
id="rect62937"
|
||||
width="29.97398"
|
||||
height="17.022524"
|
||||
x="646.55896"
|
||||
y="485.61429"
|
||||
rx="1"
|
||||
ry="1" />
|
||||
<g
|
||||
transform="translate(-38.048674,-1.9445437)"
|
||||
id="g62939">
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="695"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62941"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="699"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62943"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="703"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62945"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:original-d="m 647.78624,486.57192 27.94632,0"
|
||||
inkscape:path-effect="#path-effect62989-8-0"
|
||||
id="path62947"
|
||||
d="m 647.78624,486.57192 27.94632,0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g11665"
|
||||
transform="matrix(0.78906097,0,0,0.78906097,178.78814,111.57844)" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
transform="translate(642.41421,514.02037)"
|
||||
d="m 55,11.875 a 4.625,4.625 0 1 1 -9.25,0 4.625,4.625 0 1 1 9.25,0 z"
|
||||
sodipodi:ry="4.625"
|
||||
sodipodi:rx="4.625"
|
||||
sodipodi:cy="11.875"
|
||||
sodipodi:cx="50.375"
|
||||
id="path3786"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
id="path3016"
|
||||
sodipodi:cx="50.375"
|
||||
sodipodi:cy="11.875"
|
||||
sodipodi:rx="4.625"
|
||||
sodipodi:ry="4.625"
|
||||
d="m 55,11.875 a 4.625,4.625 0 1 1 -9.25,0 4.625,4.625 0 1 1 9.25,0 z"
|
||||
transform="translate(642.41421,512.02037)"
|
||||
style="fill:none;stroke:#555753;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.1 KiB |
255
data/classic-toggle-off-us.svg
Normal file
255
data/classic-toggle-off-us.svg
Normal file
@@ -0,0 +1,255 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg10865"
|
||||
version="1.1"
|
||||
inkscape:version="0.48+devel r12050"
|
||||
sodipodi:docname="toggle-off-us.svg">
|
||||
<defs
|
||||
id="defs10867">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62852-6-5"
|
||||
id="linearGradient62981-1-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.85639946,0,0,0.81059641,27.810405,92.069729)"
|
||||
x1="740"
|
||||
y1="486.10501"
|
||||
x2="740"
|
||||
y2="505.3204" />
|
||||
<linearGradient
|
||||
id="linearGradient62852-6-5">
|
||||
<stop
|
||||
id="stop62854-6-7"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.97726452"
|
||||
id="stop62858-8-0" />
|
||||
<stop
|
||||
id="stop62860-5-3"
|
||||
offset="1"
|
||||
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
is_visible="true"
|
||||
id="path-effect62989-8-0"
|
||||
effect="spiro" />
|
||||
<linearGradient
|
||||
id="linearGradient62821-5-8">
|
||||
<stop
|
||||
id="stop62823-2-4"
|
||||
offset="0"
|
||||
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop62825-3-8"
|
||||
offset="1"
|
||||
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient62852-6-5-3">
|
||||
<stop
|
||||
id="stop62854-6-7-6"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.97726452"
|
||||
id="stop62858-8-0-3" />
|
||||
<stop
|
||||
id="stop62860-5-3-9"
|
||||
offset="1"
|
||||
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect62829-6-8-0"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62821-5-8-1"
|
||||
id="linearGradient62864-0-3-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
|
||||
x1="702.58966"
|
||||
y1="484.49405"
|
||||
x2="702.58966"
|
||||
y2="507.42715" />
|
||||
<linearGradient
|
||||
id="linearGradient62821-5-8-1">
|
||||
<stop
|
||||
id="stop62823-2-4-2"
|
||||
offset="0"
|
||||
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop62825-3-8-9"
|
||||
offset="1"
|
||||
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="507.42715"
|
||||
x2="702.58966"
|
||||
y1="484.49405"
|
||||
x1="702.58966"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient11647"
|
||||
xlink:href="#linearGradient62821-5-8-1"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="50.925774"
|
||||
inkscape:cy="11.296867"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g62929"
|
||||
showgrid="false"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-paths="true"
|
||||
inkscape:snap-others="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1375"
|
||||
inkscape:window-x="1600"
|
||||
inkscape:window-y="28"
|
||||
inkscape:window-maximized="1"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid11512" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata10870">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1030.3622)">
|
||||
<g
|
||||
inkscape:export-ydpi="90"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||
style="display:inline"
|
||||
id="g62929"
|
||||
transform="translate(-643.91421,517.29894)">
|
||||
<g
|
||||
transform="translate(0,30)"
|
||||
id="g62931">
|
||||
<rect
|
||||
style="fill:url(#linearGradient62864-0-3-1);fill-opacity:1;stroke:#a6a8a6;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero"
|
||||
id="rect62935"
|
||||
width="63.856125"
|
||||
height="21.093594"
|
||||
x="644.5"
|
||||
y="483.5"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
id="rect62937"
|
||||
width="29.97398"
|
||||
height="17.022524"
|
||||
x="646.55896"
|
||||
y="485.61429"
|
||||
rx="1"
|
||||
ry="1" />
|
||||
<g
|
||||
transform="translate(-38.048674,-1.9445437)"
|
||||
id="g62939">
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="695"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62941"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="699"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62943"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="703"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62945"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:original-d="m 647.78624,486.57192 27.94632,0"
|
||||
inkscape:path-effect="#path-effect62989-8-0"
|
||||
id="path62947"
|
||||
d="m 647.78624,486.57192 27.94632,0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g11665"
|
||||
transform="matrix(0.78906097,0,0,0.78906097,167.78814,111.57844)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:13.14816952px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
x="644.02277"
|
||||
y="534.94739"
|
||||
id="text62949-7"
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(1.0113976,0.98873084)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan62951-7"
|
||||
x="644.02277"
|
||||
y="534.94739">OFF</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:12.69556618px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#2e3436;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
x="644.46393"
|
||||
y="533.87158"
|
||||
id="text62949"
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(1.0113976,0.98873084)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan62951"
|
||||
x="644.46393"
|
||||
y="533.87158">OFF</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.5 KiB |
199
data/classic-toggle-on-intl.svg
Normal file
199
data/classic-toggle-on-intl.svg
Normal file
@@ -0,0 +1,199 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg10865"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="toggle-on-us.svg">
|
||||
<defs
|
||||
id="defs10867">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62991-9-6"
|
||||
id="linearGradient62979-8-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
|
||||
x1="702.58966"
|
||||
y1="484.49405"
|
||||
x2="702.58966"
|
||||
y2="507.42715" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient62991-9-6">
|
||||
<stop
|
||||
style="stop-color:#589fe9;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop62993-6-9" />
|
||||
<stop
|
||||
style="stop-color:#a3cefe;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop62995-1-6" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62852-6-5"
|
||||
id="linearGradient62981-1-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
|
||||
x1="740"
|
||||
y1="486.10501"
|
||||
x2="740"
|
||||
y2="505.3204" />
|
||||
<linearGradient
|
||||
id="linearGradient62852-6-5">
|
||||
<stop
|
||||
id="stop62854-6-7"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.97726452"
|
||||
id="stop62858-8-0" />
|
||||
<stop
|
||||
id="stop62860-5-3"
|
||||
offset="1"
|
||||
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
is_visible="true"
|
||||
id="path-effect62989-8-0"
|
||||
effect="spiro" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="14.199007"
|
||||
inkscape:cy="11.127758"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g62929"
|
||||
showgrid="false"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-paths="true"
|
||||
inkscape:snap-others="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1380"
|
||||
inkscape:window-x="1600"
|
||||
inkscape:window-y="28"
|
||||
inkscape:window-maximized="1"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid11512" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata10870">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1030.3622)">
|
||||
<g
|
||||
inkscape:export-ydpi="90"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||
style="display:inline"
|
||||
id="g62929"
|
||||
transform="translate(-643.91421,517.29894)">
|
||||
<g
|
||||
transform="translate(0,30)"
|
||||
id="g62931">
|
||||
<rect
|
||||
style="fill:url(#linearGradient62979-8-1);fill-opacity:1;stroke:#1a71cc;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
id="rect62935"
|
||||
width="63.856125"
|
||||
height="21.093594"
|
||||
x="644.5"
|
||||
y="483.5"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
id="rect62937"
|
||||
width="29.97398"
|
||||
height="17.022524"
|
||||
x="676.49646"
|
||||
y="485.67679"
|
||||
rx="1"
|
||||
ry="1" />
|
||||
<g
|
||||
transform="translate(-7.9861743,-1.9445437)"
|
||||
id="g62939">
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="695"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62941"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="699"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62943"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="703"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62945"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
|
||||
inkscape:path-effect="#path-effect62989-8-0"
|
||||
id="path62947"
|
||||
d="m 677.59874,486.57192 27.94632,0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4444"
|
||||
d="m 661.91421,522.09451 0,7"
|
||||
style="fill:none;stroke:#1a71cc;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
d="m 18,7.96875 0,7"
|
||||
id="path3922"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(643.91421,513.06326)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.5 KiB |
212
data/classic-toggle-on-us.svg
Normal file
212
data/classic-toggle-on-us.svg
Normal file
@@ -0,0 +1,212 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg10865"
|
||||
version="1.1"
|
||||
inkscape:version="0.48+devel r12050"
|
||||
sodipodi:docname="toggle-on-us.svg">
|
||||
<defs
|
||||
id="defs10867">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62991-9-6"
|
||||
id="linearGradient62979-8-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
|
||||
x1="702.58966"
|
||||
y1="484.49405"
|
||||
x2="702.58966"
|
||||
y2="507.42715" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient62991-9-6">
|
||||
<stop
|
||||
style="stop-color:#589fe9;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop62993-6-9" />
|
||||
<stop
|
||||
style="stop-color:#a3cefe;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop62995-1-6" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient62852-6-5"
|
||||
id="linearGradient62981-1-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
|
||||
x1="740"
|
||||
y1="486.10501"
|
||||
x2="740"
|
||||
y2="505.3204" />
|
||||
<linearGradient
|
||||
id="linearGradient62852-6-5">
|
||||
<stop
|
||||
id="stop62854-6-7"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.97726452"
|
||||
id="stop62858-8-0" />
|
||||
<stop
|
||||
id="stop62860-5-3"
|
||||
offset="1"
|
||||
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
is_visible="true"
|
||||
id="path-effect62989-8-0"
|
||||
effect="spiro" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="8.2018252"
|
||||
inkscape:cy="8.0650495"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g62929"
|
||||
showgrid="false"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-paths="true"
|
||||
inkscape:snap-others="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1375"
|
||||
inkscape:window-x="1600"
|
||||
inkscape:window-y="28"
|
||||
inkscape:window-maximized="1"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid11512" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata10870">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1030.3622)">
|
||||
<g
|
||||
inkscape:export-ydpi="90"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||
style="display:inline"
|
||||
id="g62929"
|
||||
transform="translate(-643.91421,517.29894)">
|
||||
<g
|
||||
transform="translate(0,30)"
|
||||
id="g62931">
|
||||
<rect
|
||||
style="fill:url(#linearGradient62979-8-1);fill-opacity:1;stroke:#1a71cc;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
id="rect62935"
|
||||
width="63.856125"
|
||||
height="21.093594"
|
||||
x="644.5"
|
||||
y="483.5"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
id="rect62937"
|
||||
width="29.97398"
|
||||
height="17.022524"
|
||||
x="676.49646"
|
||||
y="485.67679"
|
||||
rx="1"
|
||||
ry="1" />
|
||||
<g
|
||||
transform="translate(-7.9861743,-1.9445437)"
|
||||
id="g62939">
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="695"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62941"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="699"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62943"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
<rect
|
||||
ry="1"
|
||||
rx="1"
|
||||
y="492"
|
||||
x="703"
|
||||
height="8"
|
||||
width="2"
|
||||
id="rect62945"
|
||||
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
|
||||
inkscape:path-effect="#path-effect62989-8-0"
|
||||
id="path62947"
|
||||
d="m 677.59874,486.57192 27.94632,0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
<text
|
||||
transform="scale(1.0113976,0.98873084)"
|
||||
sodipodi:linespacing="125%"
|
||||
id="text62949-7"
|
||||
y="534.96918"
|
||||
x="646.71399"
|
||||
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#1a71cc;fill-opacity:1;stroke:none;display:inline;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
xml:space="preserve"><tspan
|
||||
y="534.96918"
|
||||
x="646.71399"
|
||||
id="tspan62951-7"
|
||||
sodipodi:role="line">ON</tspan></text>
|
||||
<text
|
||||
transform="scale(1.0113976,0.98873084)"
|
||||
sodipodi:linespacing="125%"
|
||||
id="text62949"
|
||||
y="533.94482"
|
||||
x="646.71399"
|
||||
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
xml:space="preserve"><tspan
|
||||
y="533.94482"
|
||||
x="646.71399"
|
||||
id="tspan62951"
|
||||
sodipodi:role="line">ON</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.9 KiB |
10
data/classic.json.in
Normal file
10
data/classic.json.in
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"parentMode": "user",
|
||||
"stylesheetName": "gnome-classic.css",
|
||||
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
|
||||
"panel": { "left": ["activities", "appMenu"],
|
||||
"center": [],
|
||||
"right": ["a11y", "keyboard", "volume", "bluetooth",
|
||||
"network", "battery", "dateMenu", "userMenu"]
|
||||
}
|
||||
}
|
||||
210
data/gnome-classic.css
Normal file
210
data/gnome-classic.css
Normal file
@@ -0,0 +1,210 @@
|
||||
@import url("gnome-shell.css");
|
||||
|
||||
/* FIXME:
|
||||
- white edge highlight with text-shadow and icon-shadow for panel-button
|
||||
- better shading of the panel (dark 5%) - impossible without multipoint gradients, image-bg is a hack
|
||||
- bubble menus: separators
|
||||
- submenus (network, ...)
|
||||
- startup notification spinner
|
||||
*/
|
||||
|
||||
#panel {
|
||||
background-color: #e9e9e9 !important;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-end: #d0d0d0;
|
||||
border-top-color: #666; /* we don't support non-uniform border-colors and
|
||||
use the top border color for any border, so we
|
||||
need to set it even if all we want is a bottom
|
||||
border */
|
||||
border-bottom: 1px solid #666;
|
||||
app-icon-bottom-clip: 0px;
|
||||
|
||||
/* hrm, still no multipoint gradients
|
||||
background-image: linear-gradient(left, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 50%, rgba(255, 255, 255, 0)) !important;*/
|
||||
}
|
||||
|
||||
#panel:overview {
|
||||
background-color: #000 !important;
|
||||
background-gradient-end: #000 !important;
|
||||
border-top-color: #000;
|
||||
border-bottom: 1px solid #000 !important;
|
||||
}
|
||||
|
||||
#panel.lock-screen {
|
||||
background-color: rgba(0,0,0,0.3) !important;
|
||||
background-gradient-end: rgba(0,0,0,0.3) !important;
|
||||
border-top-color: transparent;
|
||||
}
|
||||
|
||||
#panel.unlock-screen {
|
||||
background-color: transparent !important;
|
||||
background-gradient-end: transparent !important;
|
||||
border-top-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
/* TOP BAR */
|
||||
|
||||
.panel-corner,
|
||||
.panel-corner:active,
|
||||
.panel-corner:overview,
|
||||
.panel-corner:focus {
|
||||
-panel-corner-radius: 0 !important;
|
||||
}
|
||||
|
||||
.panel-button {
|
||||
color: #555 !important;
|
||||
-natural-hpadding: 6px !important;
|
||||
-minimum-hpadding: 3px !important;
|
||||
}
|
||||
|
||||
#panel:overview .panel-button,
|
||||
#panel.lock-screen .panel-button,
|
||||
#panel.unlock-screen .panel-button {
|
||||
color: #ccc !important;
|
||||
}
|
||||
|
||||
.panel-button:hover {
|
||||
color: #000 !important;
|
||||
}
|
||||
|
||||
#panel:overview .panel-button:hover,
|
||||
#panel:overview .panel-button:active {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.panel-button > .system-status-icon {
|
||||
icon-shadow: #fff 0 1px 0 !important; /* FIXME */
|
||||
}
|
||||
|
||||
.panel-button:hover,
|
||||
.panel-button:active,
|
||||
.panel-button:overview,
|
||||
.panel-button:focus {
|
||||
text-shadow: 0 0 0 transparent !important; /* FIXME: why can't I do none ? */
|
||||
}
|
||||
|
||||
.panel-button:active,
|
||||
.panel-button:overview,
|
||||
.panel-button:focus {
|
||||
background-color: #4a90d9 !important; /* FIXME */
|
||||
color: #fff !important;
|
||||
border: none !important;
|
||||
border-image: none !important;
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
#panelUserMenu {
|
||||
padding: 0 10px 0 10px !important;
|
||||
}
|
||||
|
||||
#appMenu {
|
||||
text-shadow: 0 0 0 transparent !important;
|
||||
}
|
||||
|
||||
/* used for the app menu header only */
|
||||
.label-shadow {
|
||||
color: rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
.label-shadow {
|
||||
color: rgba(255,255,255,.5) !important;
|
||||
}
|
||||
.panel-button:active .label-shadow,
|
||||
.panel-button:focus .label-shadow {
|
||||
color: rgba(0,0,0,.5) !important;
|
||||
}
|
||||
|
||||
.popup-menu-boxpointer {
|
||||
-arrow-background-color: #e9e9e9 !important;
|
||||
-arrow-border-width: 1px !important;
|
||||
-arrow-border-color: #aaa !important;
|
||||
-arrow-border-radius: 3px !important;
|
||||
color: #000 !important;
|
||||
-arrow-base: 11px !important;
|
||||
-arrow-rise: 5px !important;
|
||||
}
|
||||
|
||||
.popup-combo-menu {
|
||||
background-color: #e9e9e9 !important;
|
||||
border: 1px solid #aaa !important;
|
||||
color: #000 !important;
|
||||
}
|
||||
|
||||
.popup-menu-item:active {
|
||||
background-color: #4a90d9 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.popup-menu-item:insensitive {
|
||||
color: #888;
|
||||
}
|
||||
|
||||
.popup-subtitle-menu-item, .popup-subtitle-menu-item:insensitive {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* CALENDAR */
|
||||
|
||||
.calendar {}
|
||||
.calendar-month-label {
|
||||
color: #333 !important;
|
||||
}
|
||||
.datemenu-date-label,
|
||||
.events-day-header {
|
||||
color: #666 !important;
|
||||
}
|
||||
.calendar-day-base:active {
|
||||
color: #fff !important;
|
||||
background-color: #4a90d9 !important;
|
||||
background-image: none !important;
|
||||
border-image: none !important;
|
||||
}
|
||||
.calendar-today {
|
||||
background-color: #4a90d9 !important;
|
||||
background-image: none !important;
|
||||
border-image: none !important;
|
||||
}
|
||||
.calendar-day-base {
|
||||
color: #666 !important;
|
||||
}
|
||||
.calendar-day-base:hover {
|
||||
background-color: #666 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
.calendar-nonwork-day {
|
||||
color: #999 !important;
|
||||
}
|
||||
.events-day-dayname,
|
||||
.events-day-time {
|
||||
color: #666 !important;
|
||||
}
|
||||
|
||||
/* VOLUME SLIDER */
|
||||
|
||||
.popup-slider-menu-item {
|
||||
-slider-background-color: #e9e9e9;
|
||||
-slider-border-color: #999;
|
||||
-slider-active-background-color: #76b0ec;
|
||||
-slider-active-border-color: #1f6dbc;
|
||||
}
|
||||
|
||||
/* ON OFF switch */
|
||||
|
||||
.toggle-switch-us {
|
||||
background-image: url("classic-toggle-off-us.svg");
|
||||
background-size: contain;
|
||||
}
|
||||
.toggle-switch-us:checked {
|
||||
background-image: url("classic-toggle-on-us.svg");
|
||||
background-size: contain;
|
||||
}
|
||||
|
||||
.toggle-switch-intl {
|
||||
background-image: url("classic-toggle-off-intl.svg");
|
||||
background-size: contain;
|
||||
}
|
||||
.toggle-switch-intl:checked {
|
||||
background-image: url("classic-toggle-on-intl.svg");
|
||||
background-size: contain;
|
||||
}
|
||||
7
data/gnome-classic.desktop.in
Normal file
7
data/gnome-classic.desktop.in
Normal file
@@ -0,0 +1,7 @@
|
||||
[Desktop Entry]
|
||||
_Name=GNOME Classic
|
||||
_Comment=This session logs you into GNOME Classic
|
||||
Exec=gnome-session --session gnome-classic
|
||||
TryExec=gnome-session
|
||||
Icon=
|
||||
Type=Application
|
||||
4
data/gnome-classic.session.desktop.in.in
Normal file
4
data/gnome-classic.session.desktop.in.in
Normal file
@@ -0,0 +1,4 @@
|
||||
[GNOME Session]
|
||||
_Name=GNOME Classic
|
||||
RequiredComponents=gnome-shell-classic;gnome-settings-daemon;nautilus-classic;
|
||||
IsRunnableHelper=@libexecdir@/gnome-session-check-accelerated
|
||||
17
data/gnome-shell-classic.desktop.in.in
Normal file
17
data/gnome-shell-classic.desktop.in.in
Normal file
@@ -0,0 +1,17 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
_Name=GNOME Shell Classic
|
||||
_Comment=Window management and application launching
|
||||
Exec=@bindir@/gnome-shell --mode=classic
|
||||
TryExec=@bindir@/gnome-shell
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-shell
|
||||
X-GNOME-Bugzilla-Component=general
|
||||
X-GNOME-Bugzilla-Version=@VERSION@
|
||||
Categories=GNOME;GTK;Core;
|
||||
OnlyShowIn=GNOME;
|
||||
NoDisplay=true
|
||||
X-GNOME-Autostart-Phase=WindowManager
|
||||
X-GNOME-Provides=panel;windowmanager;
|
||||
X-GNOME-Autostart-Notify=true
|
||||
X-GNOME-AutoRestart=false
|
||||
24
extension.mk
24
extension.mk
@@ -1,22 +1,18 @@
|
||||
extensionurl = http://git.gnome.org/gnome-shell-extensions
|
||||
include $(top_srcdir)/include.mk
|
||||
|
||||
# Change these to modify how installation is performed
|
||||
topextensiondir = $(datadir)/gnome-shell/extensions
|
||||
extensionbase = @gnome-shell-extensions.gnome.org
|
||||
|
||||
uuid = $(EXTENSION_ID)$(extensionbase)
|
||||
|
||||
extensiondir = $(topextensiondir)/$(uuid)
|
||||
|
||||
dist_extension_DATA = extension.js stylesheet.css
|
||||
nodist_extension_DATA = metadata.json $(EXTRA_EXTENSION)
|
||||
dist_extension_DATA = extension.js stylesheet.css $(EXTRA_MODULES)
|
||||
nodist_extension_DATA = metadata.json $(top_srcdir)/lib/convenience.js $(EXTRA_EXTENSION)
|
||||
|
||||
EXTRA_DIST = metadata.json.in
|
||||
|
||||
metadata.json: metadata.json.in $(top_builddir)/config.status
|
||||
$(AM_V_GEN) sed -e "s|[@]LOCALEDIR@|$(datadir)/locale|" \
|
||||
$(AM_V_GEN) sed \
|
||||
-e "s|[@]extension_id@|$(EXTENSION_ID)|" \
|
||||
-e "s|[@]uuid@|$(uuid)|" \
|
||||
-e "s|[@]shell_current@|$(PACKAGE_VERSION)|" \
|
||||
-e "s|[@]url@|$(extensionurl)|" $< > $@
|
||||
-e "s|[@]gschemaname@|$(gschemaname)|" \
|
||||
-e "s|[@]gettext_domain@|$(GETTEXT_PACKAGE)|" \
|
||||
-e "s|[@]shell_current@|$(SHELL_VERSION)|" \
|
||||
-e "s|[@]url@|$(extensionurl)|" \
|
||||
$< > $@
|
||||
|
||||
CLEANFILES = metadata.json
|
||||
|
||||
@@ -1,14 +1,5 @@
|
||||
EXTENSION_ID = alternate-tab
|
||||
|
||||
EXTRA_MODULES = prefs.js
|
||||
|
||||
include ../../extension.mk
|
||||
|
||||
gschemas_in = org.gnome.shell.extensions.alternate-tab.gschema.xml.in
|
||||
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
|
||||
gsettings_SCHEMAS = $(gschemas_in:.xml.in=.xml)
|
||||
|
||||
@GSETTINGS_RULES@
|
||||
|
||||
CLEANFILES += $(gschemas_in:.xml.in=.valid) $(gsettings_SCHEMAS)
|
||||
EXTRA_DIST += $(gschemas_in)
|
||||
|
||||
@@ -1,573 +1,64 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
/* most of the code is borrowed from
|
||||
* > js/ui/altTab.js <
|
||||
* of the gnome-shell source code
|
||||
*/
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const AltTab = imports.ui.altTab;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Main = imports.ui.main;
|
||||
const Mainloop = imports.mainloop;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const WindowManager = imports.ui.windowManager;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
const N_ = function(e) { return e };
|
||||
|
||||
const POPUP_FADE_TIME = 0.1; // seconds
|
||||
|
||||
const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.alternate-tab';
|
||||
const SETTINGS_BEHAVIOUR_KEY = 'behaviour';
|
||||
const SETTINGS_FIRST_TIME_KEY = 'first-time';
|
||||
|
||||
const MODES = {
|
||||
native: function() {
|
||||
Main.wm._startAppSwitcher();
|
||||
},
|
||||
all_thumbnails: function() {
|
||||
new AltTabPopup2();
|
||||
},
|
||||
workspace_icons: function() {
|
||||
new AltTabPopupW().show();
|
||||
}
|
||||
};
|
||||
|
||||
const MESSAGE = N_("This is the first time you use the Alternate Tab extension. \n\
|
||||
Please choose your preferred behaviour:\n\
|
||||
\n\
|
||||
All & Thumbnails:\n\
|
||||
This mode presents all applications from all workspaces in one selection \n\
|
||||
list. Instead of using the application icon of every window, it uses small \n\
|
||||
thumbnails resembling the window itself. \n\
|
||||
\n\
|
||||
Workspace & Icons:\n\
|
||||
This mode let's you switch between the applications of your current \n\
|
||||
workspace and gives you additionally the option to switch to the last used \n\
|
||||
application of your previous workspace. This is always the last symbol in \n\
|
||||
the list and is segregated by a separator/vertical line if available. \n\
|
||||
Every window is represented by its application icon. \n\
|
||||
\n\
|
||||
Native:\n\
|
||||
This mode is the native GNOME 3 behaviour or in other words: Clicking \n\
|
||||
native switches the Alternate Tab extension off. \n\
|
||||
");
|
||||
|
||||
function AltTabPopupW() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
AltTabPopupW.prototype = {
|
||||
__proto__ : AltTab.AltTabPopup.prototype,
|
||||
|
||||
show : function(backward, switch_group) {
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let apps = appSys.get_running ();
|
||||
|
||||
if (!apps.length)
|
||||
return false;
|
||||
|
||||
if (!Main.pushModal(this.actor))
|
||||
return false;
|
||||
this._haveModal = true;
|
||||
|
||||
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
|
||||
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
|
||||
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
|
||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
|
||||
|
||||
this._appSwitcher = new WindowSwitcher(apps, this);
|
||||
this.actor.add_actor(this._appSwitcher.actor);
|
||||
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
|
||||
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
|
||||
|
||||
this._appIcons = this._appSwitcher.icons;
|
||||
|
||||
// Make the initial selection
|
||||
if (switch_group) {
|
||||
if (backward) {
|
||||
this._select(0, this._appIcons[0].cachedWindows.length - 1);
|
||||
} else {
|
||||
if (this._appIcons[0].cachedWindows.length > 1)
|
||||
this._select(0, 1);
|
||||
else
|
||||
this._select(0, 0);
|
||||
}
|
||||
} else if (this._appIcons.length == 1) {
|
||||
this._select(0);
|
||||
} else if (backward) {
|
||||
this._select(this._appIcons.length - 1);
|
||||
} else {
|
||||
this._select(1);
|
||||
}
|
||||
|
||||
// There's a race condition; if the user released Alt before
|
||||
// we got the grab, then we won't be notified. (See
|
||||
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
|
||||
// details.) So we check now. (Have to do this after updating
|
||||
// selection.)
|
||||
let [x, y, mods] = global.get_pointer();
|
||||
if (!(mods & Gdk.ModifierType.MOD1_MASK)) {
|
||||
this._finish();
|
||||
return false;
|
||||
}
|
||||
|
||||
this.actor.opacity = 0;
|
||||
this.actor.show();
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: POPUP_FADE_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
|
||||
_finish : function() {
|
||||
let app = this._appIcons[this._currentApp];
|
||||
Main.activateWindow(app.cachedWindows[0]);
|
||||
this.destroy();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
function AppIcon(app, window) {
|
||||
this._init(app, window);
|
||||
}
|
||||
|
||||
AppIcon.prototype = {
|
||||
__proto__ : AltTab.AppIcon.prototype,
|
||||
|
||||
_init: function(app, window) {
|
||||
this.app = app;
|
||||
|
||||
this.cachedWindows = [];
|
||||
this.cachedWindows.push(window);
|
||||
|
||||
this.actor = new St.BoxLayout({ style_class: 'alt-tab-app',
|
||||
vertical: true });
|
||||
this.icon = null;
|
||||
this._iconBin = new St.Bin({ x_fill: true, y_fill: true });
|
||||
|
||||
this.actor.add(this._iconBin, { x_fill: false, y_fill: false } );
|
||||
|
||||
let title = window.get_title();
|
||||
if (title) {
|
||||
this.label = new St.Label({ text: title });
|
||||
let bin = new St.Bin({ x_align: St.Align.MIDDLE });
|
||||
bin.add_actor(this.label);
|
||||
this.actor.add(bin);
|
||||
}
|
||||
else {
|
||||
this.label = new St.Label({ text: this.app.get_name() });
|
||||
this.actor.add(this.label, { x_fill: false });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function WindowSwitcher(apps, altTabPopup) {
|
||||
this._init(apps, altTabPopup);
|
||||
}
|
||||
|
||||
WindowSwitcher.prototype = {
|
||||
__proto__ : AltTab.AppSwitcher.prototype,
|
||||
|
||||
_init : function(apps, altTabPopup) {
|
||||
AltTab.SwitcherList.prototype._init.call(this, true);
|
||||
|
||||
// Construct the AppIcons, sort by time, add to the popup
|
||||
let activeWorkspace = global.screen.get_active_workspace();
|
||||
let workspaceIcons = [];
|
||||
let otherIcons = [];
|
||||
for (let i = 0; i < apps.length; i++) {
|
||||
// Cache the window list now; we don't handle dynamic changes here,
|
||||
// and we don't want to be continually retrieving it
|
||||
let windows = apps[i].get_windows();
|
||||
|
||||
for(let j = 0; j < windows.length; j++) {
|
||||
let appIcon = new AppIcon(apps[i], windows[j]);
|
||||
if (this._isWindowOnWorkspace(windows[j], activeWorkspace)) {
|
||||
workspaceIcons.push(appIcon);
|
||||
}
|
||||
else {
|
||||
otherIcons.push(appIcon);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
workspaceIcons.sort(Lang.bind(this, this._sortAppIcon));
|
||||
otherIcons.sort(Lang.bind(this, this._sortAppIcon));
|
||||
|
||||
if(otherIcons.length > 0) {
|
||||
let mostRecentOtherIcon = otherIcons[0];
|
||||
otherIcons = [];
|
||||
otherIcons.push(mostRecentOtherIcon);
|
||||
}
|
||||
|
||||
this.icons = [];
|
||||
this._arrows = [];
|
||||
for (let i = 0; i < workspaceIcons.length; i++)
|
||||
this._addIcon(workspaceIcons[i]);
|
||||
if (workspaceIcons.length > 0 && otherIcons.length > 0)
|
||||
this.addSeparator();
|
||||
for (let i = 0; i < otherIcons.length; i++)
|
||||
this._addIcon(otherIcons[i]);
|
||||
|
||||
this._curApp = -1;
|
||||
this._iconSize = 0;
|
||||
this._altTabPopup = altTabPopup;
|
||||
this._mouseTimeOutId = 0;
|
||||
},
|
||||
|
||||
|
||||
_isWindowOnWorkspace: function(w, workspace) {
|
||||
if (w.get_workspace() == workspace)
|
||||
return true;
|
||||
return false;
|
||||
},
|
||||
|
||||
_sortAppIcon : function(appIcon1, appIcon2) {
|
||||
let t1 = appIcon1.cachedWindows[0].get_user_time();
|
||||
let t2 = appIcon2.cachedWindows[0].get_user_time();
|
||||
if (t2 > t1) return 1;
|
||||
else return -1;
|
||||
}
|
||||
};
|
||||
|
||||
function AltTabSettingsDialog() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
AltTabSettingsDialog.prototype = {
|
||||
__proto__: ModalDialog.ModalDialog.prototype,
|
||||
|
||||
_init : function() {
|
||||
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: null });
|
||||
|
||||
let mainContentBox = new St.BoxLayout({ style_class: 'polkit-dialog-main-layout',
|
||||
vertical: false });
|
||||
this.contentLayout.add(mainContentBox,
|
||||
{ x_fill: true,
|
||||
y_fill: true });
|
||||
|
||||
let messageBox = new St.BoxLayout({ style_class: 'polkit-dialog-message-layout',
|
||||
vertical: true });
|
||||
mainContentBox.add(messageBox,
|
||||
{ y_align: St.Align.START });
|
||||
|
||||
this._subjectLabel = new St.Label({ style_class: 'polkit-dialog-headline',
|
||||
text: _("Alt Tab Behaviour") });
|
||||
|
||||
messageBox.add(this._subjectLabel,
|
||||
{ y_fill: false,
|
||||
y_align: St.Align.START });
|
||||
|
||||
this._descriptionLabel = new St.Label({ style_class: 'polkit-dialog-description',
|
||||
text: Gettext.gettext(MESSAGE) });
|
||||
|
||||
messageBox.add(this._descriptionLabel,
|
||||
{ y_fill: true,
|
||||
y_align: St.Align.START });
|
||||
|
||||
|
||||
this.setButtons([
|
||||
{
|
||||
label: _("All & Thumbnails"),
|
||||
action: Lang.bind(this, function() {
|
||||
this.setBehaviour('all_thumbnails');
|
||||
this.close();
|
||||
})
|
||||
},
|
||||
{
|
||||
label: _("Workspace & Icons"),
|
||||
action: Lang.bind(this, function() {
|
||||
this.setBehaviour('workspace_icons');
|
||||
this.close();
|
||||
})
|
||||
},
|
||||
{
|
||||
label: _("Native"),
|
||||
action: Lang.bind(this, function() {
|
||||
this.setBehaviour('native');
|
||||
this.close();
|
||||
})
|
||||
},
|
||||
{
|
||||
label: _("Cancel"),
|
||||
action: Lang.bind(this, function() {
|
||||
this.close();
|
||||
}),
|
||||
key: Clutter.Escape
|
||||
}
|
||||
]);
|
||||
},
|
||||
|
||||
setBehaviour: function(behaviour) {
|
||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||
this._settings.set_string(SETTINGS_BEHAVIOUR_KEY, behaviour);
|
||||
this._settings.set_boolean(SETTINGS_FIRST_TIME_KEY, false);
|
||||
}
|
||||
};
|
||||
|
||||
function AltTabPopup2() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
AltTabPopup2.prototype = {
|
||||
__proto__ : AltTab.AltTabPopup.prototype,
|
||||
|
||||
_init : function() {
|
||||
this.actor = new Shell.GenericContainer({ name: 'altTabPopup',
|
||||
reactive: 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.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._haveModal = false;
|
||||
|
||||
this._currentApp = 0;
|
||||
this._currentWindow = -1;
|
||||
this._thumbnailTimeoutId = 0;
|
||||
this._motionTimeoutId = 0;
|
||||
|
||||
// Initially disable hover so we ignore the enter-event if
|
||||
// the switcher appears underneath the current pointer location
|
||||
this._disableHover();
|
||||
|
||||
this.show();
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
this._select(0);
|
||||
},
|
||||
|
||||
show : function(backward) {
|
||||
let windows = global.get_window_actors();
|
||||
|
||||
let list = '';
|
||||
let normal_windows= [];
|
||||
let appIcons = [];
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let apps = appSys.get_running();
|
||||
|
||||
for (let w = windows.length-1; w >= 0; w--) {
|
||||
let win = windows[w].get_meta_window();
|
||||
normal_windows.push(win);
|
||||
}
|
||||
normal_windows.sort(Lang.bind(this, this._sortWindows));
|
||||
|
||||
let win_on_top = normal_windows.shift();
|
||||
normal_windows.push(win_on_top);
|
||||
windows = normal_windows;
|
||||
for (let w = 0; w < windows.length; w++) {
|
||||
let win = windows[w];
|
||||
|
||||
let ap1 = null;
|
||||
for (let i = 0;i < apps.length; i++) {
|
||||
let app_wins = apps[i].get_windows();
|
||||
for (let j = 0;j < app_wins.length; j++) {
|
||||
if (app_wins[j] == win)
|
||||
ap1 = new AltTab.AppIcon(apps[i]);
|
||||
}
|
||||
}
|
||||
if (ap1 != null) {
|
||||
ap1.cachedWindows = [win];
|
||||
appIcons.push(ap1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!windows.length)
|
||||
return false;
|
||||
|
||||
if (!Main.pushModal(this.actor))
|
||||
return false;
|
||||
this._haveModal = true;
|
||||
|
||||
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
|
||||
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
|
||||
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
|
||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
|
||||
|
||||
this._appSwitcher = new WindowList(windows);
|
||||
this._appSwitcher._altTabPopup=this;
|
||||
this.actor.add_actor(this._appSwitcher.actor);
|
||||
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
|
||||
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
|
||||
|
||||
this._appIcons = appIcons;
|
||||
|
||||
|
||||
return true
|
||||
},
|
||||
|
||||
_keyPressEvent : function(actor, event) {
|
||||
let keysym = event.get_key_symbol();
|
||||
let shift = (Shell.get_event_state(event) & Clutter.ModifierType.SHIFT_MASK);
|
||||
// X allows servers to represent Shift+Tab in two different ways
|
||||
if (shift && keysym == Clutter.Tab)
|
||||
keysym = Clutter.ISO_Left_Tab;
|
||||
|
||||
this._disableHover();
|
||||
|
||||
if (keysym == Clutter.grave)
|
||||
this._select(this._currentApp, this._nextWindow());
|
||||
else if (keysym == Clutter.asciitilde)
|
||||
this._select(this._currentApp, this._previousWindow());
|
||||
else if (keysym == Clutter.Escape)
|
||||
this.destroy();
|
||||
else if (this._thumbnailsFocused) {
|
||||
if (keysym == Clutter.Tab) {
|
||||
if (this._currentWindow == this._appIcons[this._currentApp].cachedWindows.length - 1)
|
||||
this._select(this._nextApp());
|
||||
else
|
||||
this._select(this._currentApp, this._nextWindow());
|
||||
} else if (keysym == Clutter.ISO_Left_Tab) {
|
||||
if (this._currentWindow == 0 || this._currentWindow == -1)
|
||||
this._select(this._previousApp());
|
||||
else
|
||||
this._select(this._currentApp, this._previousWindow());
|
||||
} else if (keysym == Clutter.Left)
|
||||
this._select(this._currentApp, this._previousWindow());
|
||||
else if (keysym == Clutter.Right)
|
||||
this._select(this._currentApp, this._nextWindow());
|
||||
else if (keysym == Clutter.Up)
|
||||
this._select(this._currentApp, null, true);
|
||||
} else {
|
||||
if (keysym == Clutter.Tab)
|
||||
this._select(this._nextApp());
|
||||
else if (keysym == Clutter.ISO_Left_Tab)
|
||||
this._select(this._previousApp());
|
||||
else if (keysym == Clutter.Left)
|
||||
this._select(this._previousApp());
|
||||
else if (keysym == Clutter.Right)
|
||||
this._select(this._nextApp());
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_sortWindows : function(win1,win2) {
|
||||
let t1 = win1.get_user_time();
|
||||
let t2 = win2.get_user_time();
|
||||
if (t2 > t1) return 1;
|
||||
else return -1;
|
||||
},
|
||||
|
||||
_appActivated : function(thumbnailList, n) {
|
||||
let appIcon = this._appIcons[this._currentApp];
|
||||
Main.activateWindow(appIcon.cachedWindows[0]);
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
_finish : function() {
|
||||
let app = this._appIcons[this._currentApp];
|
||||
Main.activateWindow(app.cachedWindows[0]);
|
||||
this.destroy();
|
||||
},
|
||||
};
|
||||
|
||||
function WindowList(windows) {
|
||||
this._init(windows);
|
||||
}
|
||||
|
||||
WindowList.prototype = {
|
||||
__proto__ : AltTab.AppSwitcher.prototype,
|
||||
|
||||
_init : function(windows) {
|
||||
AltTab.AppSwitcher.prototype._init.call(this, []);
|
||||
|
||||
let activeWorkspace = global.screen.get_active_workspace();
|
||||
this._labels = new Array();
|
||||
this._thumbnailBins = new Array();
|
||||
this._clones = new Array();
|
||||
this._windows = windows;
|
||||
this._arrows= new Array();
|
||||
this.icons= new Array();
|
||||
for (let w = 0; w < windows.length; w++) {
|
||||
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
||||
arrow.connect('repaint', Lang.bind(this, function (area) {
|
||||
Shell.draw_box_pointer(area, Shell.PointerDirection.DOWN);
|
||||
}));
|
||||
this._list.add_actor(arrow);
|
||||
this._arrows.push(arrow);
|
||||
|
||||
arrow.hide();
|
||||
|
||||
let win=windows[w];
|
||||
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let apps = appSys.get_running();
|
||||
let ap1 = null;
|
||||
for (let i = 0; i < apps.length; i++) {
|
||||
let app_wins = apps[i].get_windows();
|
||||
for (let j = 0; j < app_wins.length; j++) {
|
||||
if (app_wins[j] == win) {
|
||||
ap1 = new AltTab.AppIcon(apps[i]);
|
||||
let mutterWindow = win.get_compositor_private();
|
||||
let windowTexture = mutterWindow.get_texture ();
|
||||
let [width, height] = windowTexture.get_size();
|
||||
let scale = Math.min(1.0, 128 / width, 128 / height);
|
||||
|
||||
let clone = new Clutter.Clone ({ source: windowTexture, reactive: true, width: width * scale, height: height * scale });
|
||||
ap1.icon = ap1.app.create_icon_texture(128);
|
||||
ap1._iconBin.set_size(128,128);
|
||||
ap1._iconBin.child=clone;
|
||||
|
||||
ap1.label.text=win.get_title();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ap1 != null) {
|
||||
ap1.cachedWindows = [win];
|
||||
this._addIcon(ap1);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
addSeparator: function () {
|
||||
this._separator=null;
|
||||
}
|
||||
};
|
||||
let injections = {};
|
||||
|
||||
function init(metadata) {
|
||||
imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir);
|
||||
}
|
||||
|
||||
function doAltTab(shellwm, binding, window, backwards) {
|
||||
let settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||
|
||||
if(settings.get_boolean(SETTINGS_FIRST_TIME_KEY)) {
|
||||
new AltTabSettingsDialog().open();
|
||||
} else {
|
||||
let behaviour = settings.get_string(SETTINGS_BEHAVIOUR_KEY);
|
||||
if(behaviour in MODES) {
|
||||
MODES[behaviour](binding, backwards);
|
||||
}
|
||||
}
|
||||
function setKeybinding(name, func) {
|
||||
Main.wm.setCustomKeybindingHandler(name, Shell.KeyBindingMode.NORMAL, func);
|
||||
}
|
||||
|
||||
function enable() {
|
||||
Main.wm.setKeybindingHandler('switch_windows', doAltTab);
|
||||
Main.wm.setKeybindingHandler('switch_group', doAltTab);
|
||||
Main.wm.setKeybindingHandler('switch_windows_backward', doAltTab);
|
||||
Main.wm.setKeybindingHandler('switch_group_backward', doAltTab);
|
||||
injections['_initialSelection'] = AltTab.WindowSwitcherPopup.prototype._initialSelection;
|
||||
AltTab.WindowSwitcherPopup.prototype._initialSelection = function(backward, binding) {
|
||||
if (binding == 'switch-windows-backward' ||
|
||||
binding == 'switch-applications-backward' ||
|
||||
binding == 'switch-group-backward' || backward)
|
||||
this._select(this._items.length - 1);
|
||||
else if (this._items.length == 1)
|
||||
this._select(0);
|
||||
else
|
||||
this._select(1);
|
||||
};
|
||||
injections['_keyPressHandler'] = AltTab.WindowSwitcherPopup.prototype._keyPressHandler;
|
||||
AltTab.WindowSwitcherPopup.prototype._keyPressHandler = function(keysym, backwards, action) {
|
||||
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS ||
|
||||
action == Meta.KeyBindingAction.SWITCH_APPLICATIONS ||
|
||||
action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
||||
this._select(backwards ? this._previous() : this._next());
|
||||
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD ||
|
||||
action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD ||
|
||||
action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
|
||||
this._select(this._previous());
|
||||
} else {
|
||||
if (keysym == Clutter.Left)
|
||||
this._select(this._previous());
|
||||
else if (keysym == Clutter.Right)
|
||||
this._select(this._next());
|
||||
}
|
||||
};
|
||||
|
||||
setKeybinding('switch-applications', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
|
||||
setKeybinding('switch-group', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
|
||||
setKeybinding('switch-applications-backward', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
|
||||
setKeybinding('switch-group-backward', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
|
||||
}
|
||||
|
||||
function disable() {
|
||||
Main.wm.setKeybindingHandler('switch_windows', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
Main.wm.setKeybindingHandler('switch_group', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
Main.wm.setKeybindingHandler('switch_windows_backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
Main.wm.setKeybindingHandler('switch_group_backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
}
|
||||
setKeybinding('switch-applications', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
setKeybinding('switch-group', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
setKeybinding('switch-applications-backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
setKeybinding('switch-group-backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
|
||||
|
||||
for (prop in injections)
|
||||
AltTab.WindowSwitcherPopup.prototype[prop] = injections[prop];
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "AlternateTab",
|
||||
"description": "A replacement for Alt-Tab, allows to cycle between windows and does not group by application",
|
||||
"original-authors": [ "jw@bargsten.org", "thomas.bouffon@gmail.com" ],
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<enum id="org.gnome.shell.extensions.alternate-tab.BehaviourMode">
|
||||
<value value="0" nick="native"/>
|
||||
<value value="1" nick="all_thumbnails"/>
|
||||
<value value="2" nick="workspace_icons"/>
|
||||
</enum>
|
||||
<schema id="org.gnome.shell.extensions.alternate-tab" path="/org/gnome/shell/extensions/alternate-tab/">
|
||||
<key name="behaviour" enum="org.gnome.shell.extensions.alternate-tab.BehaviourMode">
|
||||
<default>'native'</default>
|
||||
<_summary>The alt tab behaviour.</_summary>
|
||||
<_description>Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and workspace_icons.</_description>
|
||||
</key>
|
||||
<key type="b" name="first-time">
|
||||
<default>true</default>
|
||||
<_summary>Indicates if Alternate Tab is newly installed</_summary>
|
||||
<_description>Ask the user for a default behaviour if true.</_description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
78
extensions/alternate-tab/prefs.js
Normal file
78
extensions/alternate-tab/prefs.js
Normal file
@@ -0,0 +1,78 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
const N_ = function(e) { return e };
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const SETTINGS_APP_ICON_MODE = 'app-icon-mode';
|
||||
const SETTINGS_CURRENT_WORKSPACE_ONLY = 'current-workspace-only';
|
||||
|
||||
const MODES = {
|
||||
'thumbnail-only': N_("Thumbnail only"),
|
||||
'app-icon-only': N_("Application icon only"),
|
||||
'both': N_("Thumbnail and application icon"),
|
||||
};
|
||||
|
||||
const AltTabSettingsWidget = new GObject.Class({
|
||||
Name: 'AlternateTab.Prefs.AltTabSettingsWidget',
|
||||
GTypeName: 'AltTabSettingsWidget',
|
||||
Extends: Gtk.Grid,
|
||||
|
||||
_init : function(params) {
|
||||
this.parent(params);
|
||||
this.margin = 10;
|
||||
this.orientation = Gtk.Orientation.VERTICAL;
|
||||
|
||||
this._settings = new Gio.Settings({ schema: 'org.gnome.shell.window-switcher' });
|
||||
|
||||
let presentLabel = _("Present windows as");
|
||||
this.add(new Gtk.Label({ label: presentLabel, sensitive: true,
|
||||
margin_bottom: 10, margin_top: 5 }));
|
||||
|
||||
let top = 1;
|
||||
let radio = null;
|
||||
let currentMode = this._settings.get_string(SETTINGS_APP_ICON_MODE);
|
||||
for (let mode in MODES) {
|
||||
// copy the mode variable because it has function scope, not block scope
|
||||
// so cannot be used in a closure
|
||||
let modeCapture = mode;
|
||||
let name = Gettext.gettext(MODES[mode]);
|
||||
|
||||
radio = new Gtk.RadioButton({ group: radio, label: name, valign: Gtk.Align.START });
|
||||
radio.connect('toggled', Lang.bind(this, function(widget) {
|
||||
if (widget.active)
|
||||
this._settings.set_string(SETTINGS_APP_ICON_MODE, modeCapture);
|
||||
}));
|
||||
this.add(radio);
|
||||
|
||||
if (mode == currentMode)
|
||||
radio.active = true;
|
||||
top += 1;
|
||||
}
|
||||
|
||||
let check = new Gtk.CheckButton({ label: _("Show only windows in the current workspace"),
|
||||
margin_top: 12 });
|
||||
this._settings.bind(SETTINGS_CURRENT_WORKSPACE_ONLY, check, 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
this.add(check);
|
||||
},
|
||||
});
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
function buildPrefsWidget() {
|
||||
let widget = new AltTabSettingsWidget();
|
||||
widget.show_all();
|
||||
|
||||
return widget;
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
EXTENSION_ID = alternative-status-menu
|
||||
|
||||
include ../../extension.mk
|
||||
include ../../settings.mk
|
||||
|
||||
@@ -1,129 +1,172 @@
|
||||
/* -*- mode: js2 - indent-tabs-mode: nil - js2-basic-offset: 4 -*- */
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const BoxPointer = imports.ui.boxpointer;
|
||||
const Main = imports.ui.main;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const GnomeSession = imports.misc.gnomeSession;
|
||||
const UserMenu = imports.ui.userMenu;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
function updateSuspend(object, pspec, item) {
|
||||
item.actor.visible = object.get_can_suspend();
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const LOCK_ENABLED_KEY = 'lock-enabled';
|
||||
|
||||
let extension;
|
||||
|
||||
// Need to reimplement here the missing bits from LoginManager
|
||||
|
||||
function loginManager_hibernate() {
|
||||
if (this._proxy) {
|
||||
// systemd path
|
||||
this._proxy.call("Hibernate",
|
||||
GLib.Variant.new('(b)', [true]),
|
||||
Gio.DBusCallFlags.NONE,
|
||||
-1, null, null);
|
||||
} else {
|
||||
// Can't do in ConsoleKit
|
||||
this.emit('prepare-for-sleep', true);
|
||||
this.emit('prepare-for-sleep', false);
|
||||
}
|
||||
}
|
||||
|
||||
function updateHibernate(object, pspec, item) {
|
||||
item.actor.visible = object.get_can_hibernate();
|
||||
function loginManager_canHibernate(asyncCallback) {
|
||||
if (this._proxy) {
|
||||
// systemd path
|
||||
this._proxy.call("CanHibernate",
|
||||
null,
|
||||
Gio.DBusCallFlags.NONE,
|
||||
-1, null, function(proxy, asyncResult) {
|
||||
let result, error;
|
||||
|
||||
try {
|
||||
result = proxy.call_finish(asyncResult);
|
||||
} catch(e) {
|
||||
error = e;
|
||||
}
|
||||
|
||||
if (error)
|
||||
asyncCallback(false);
|
||||
else
|
||||
asyncCallback(result[0] != 'no');
|
||||
});
|
||||
} else {
|
||||
Mainloop.idle_add(Lang.bind(this, function() {
|
||||
asyncCallback(false);
|
||||
return false;
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
function statusMenu_updateHaveHibernate() {
|
||||
loginManager_canHibernate.call(this._loginManager, Lang.bind(this,
|
||||
function(result) {
|
||||
this._haveHibernate = result;
|
||||
this._updateSuspendOrPowerOff();
|
||||
}));
|
||||
}
|
||||
|
||||
function statusMenu_updateSuspendOrPowerOff() {
|
||||
this._suspendOrPowerOffItem.actor.hide();
|
||||
|
||||
extension.suspendItem.actor.visible = this._haveSuspend;
|
||||
extension.hibernateItem.actor.visible = this._haveHibernate;
|
||||
extension.powerOffItem.actor.visible = this._haveShutdown;
|
||||
}
|
||||
|
||||
function onSuspendActivate(item) {
|
||||
Main.overview.hide();
|
||||
|
||||
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
|
||||
this._upClient.suspend_sync(null);
|
||||
}));
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
this._loginManager.suspend();
|
||||
}
|
||||
|
||||
function onHibernateActivate(item) {
|
||||
Main.overview.hide();
|
||||
|
||||
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
|
||||
this._upClient.hibernate_sync(null);
|
||||
}));
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
loginManager_hibernate.call(this._loginManager);
|
||||
}
|
||||
|
||||
function createSubMenu() {
|
||||
let item;
|
||||
const Extension = new Lang.Class({
|
||||
Name: 'AlternativeStatusMenu.Extension',
|
||||
|
||||
item = new UserMenu.IMStatusChooserItem();
|
||||
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
_init: function() {
|
||||
this.suspendItem = null;
|
||||
this.hibernateItem = null;
|
||||
this.powerOffItem = null;
|
||||
|
||||
item = new PopupMenu.PopupSwitchMenuItem(_("Notifications"));
|
||||
item.connect('activate', Lang.bind(this, this._updatePresenceStatus));
|
||||
this.menu.addMenuItem(item);
|
||||
this._notificationsSwitch = item;
|
||||
Convenience.initTranslations();
|
||||
this._settings = Convenience.getSettings();
|
||||
},
|
||||
|
||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
enable: function() {
|
||||
let statusMenu = Main.panel.statusArea.userMenu;
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Online Accounts"));
|
||||
item.connect('activate', Lang.bind(this, this._onOnlineAccountsActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
let children = statusMenu.menu._getMenuItems();
|
||||
let index = children.length;
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("System Settings"));
|
||||
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
/* find the old entry */
|
||||
for (let i = children.length - 1; i >= 0; i--) {
|
||||
if (children[i] == statusMenu._suspendOrPowerOffItem) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
/* add the new entries */
|
||||
this.suspendItem = new PopupMenu.PopupMenuItem(_("Suspend"));
|
||||
this.suspendItem.connect('activate', Lang.bind(statusMenu, onSuspendActivate));
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Lock Screen"));
|
||||
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
this._lockScreenItem = item;
|
||||
this.hibernateItem = new PopupMenu.PopupMenuItem(_("Hibernate"));
|
||||
this.hibernateItem.connect('activate', Lang.bind(statusMenu, onHibernateActivate));
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Switch User"));
|
||||
item.connect('activate', Lang.bind(this, this._onLoginScreenActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
this._loginScreenItem = item;
|
||||
this.powerOffItem = new PopupMenu.PopupMenuItem(_("Power Off"));
|
||||
this.powerOffItem.connect('activate', Lang.bind(statusMenu, function() {
|
||||
this._session.ShutdownRemote();
|
||||
}));
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Log Out..."));
|
||||
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
this._logoutItem = item;
|
||||
/* insert the entries at the found position */
|
||||
statusMenu.menu.addMenuItem(this.suspendItem, index);
|
||||
statusMenu.menu.addMenuItem(this.hibernateItem, index + 1);
|
||||
statusMenu.menu.addMenuItem(this.powerOffItem, index + 2);
|
||||
|
||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
this._openStateChangedId = statusMenu.menu.connect('open-state-changed', function() {
|
||||
statusMenu_updateHaveHibernate.call(statusMenu);
|
||||
});
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Suspend"));
|
||||
item.connect('activate', Lang.bind(this, onSuspendActivate));
|
||||
this._upClient.connect('notify::can-suspend', Lang.bind(this, updateSuspend, item));
|
||||
updateSuspend(this._upClient, null, item);
|
||||
this.menu.addMenuItem(item);
|
||||
this._previousUpdateSuspendOrPowerOff = statusMenu._updateSuspendOrPowerOff;
|
||||
statusMenu._updateSuspendOrPowerOff = statusMenu_updateSuspendOrPowerOff;
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Hibernate"));
|
||||
item.connect('activate', Lang.bind(this, onHibernateActivate));
|
||||
this._upClient.connect('notify::can-hibernate', Lang.bind(this, updateHibernate, item));
|
||||
updateHibernate(this._upClient, null, item);
|
||||
this.menu.addMenuItem(item);
|
||||
this._settingsChangedId = this._settings.connect('changed', function() {
|
||||
statusMenu._updateSuspendOrPowerOff();
|
||||
});
|
||||
},
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Power Off..."));
|
||||
item.connect('activate', Lang.bind(this, function() {
|
||||
this._session.ShutdownRemote();
|
||||
}));
|
||||
this.menu.addMenuItem(item);
|
||||
}
|
||||
disable: function() {
|
||||
let statusMenu = Main.panel.statusArea.userMenu;
|
||||
|
||||
this.suspendItem.destroy();
|
||||
this.hibernateItem.destroy();
|
||||
this.powerOffItem.destroy();
|
||||
|
||||
statusMenu.menu.disconnect(this._openStateChangedId);
|
||||
this._settings.disconnect(this._settingsChangedId);
|
||||
|
||||
statusMenu._updateSuspendOrPowerOff = this._previousUpdateSuspendOrPowerOff;
|
||||
statusMenu._updateSuspendOrPowerOff();
|
||||
},
|
||||
});
|
||||
|
||||
// Put your extension initialization code here
|
||||
function init(metadata) {
|
||||
imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir);
|
||||
return (extension = new Extension());
|
||||
}
|
||||
|
||||
function reset(statusMenu) {
|
||||
statusMenu._updateSwitchUser();
|
||||
statusMenu._updateLogout();
|
||||
statusMenu._updateLockScreen();
|
||||
|
||||
statusMenu._presence.getStatus(Lang.bind(statusMenu, statusMenu._updateSwitch));
|
||||
|
||||
// HACK! Obtain the IMStatusChooserItem and force a _updateUser
|
||||
statusMenu.menu._getMenuItems()[0]._updateUser();
|
||||
}
|
||||
|
||||
function enable() {
|
||||
let statusMenu = Main.panel._statusArea.userMenu;
|
||||
statusMenu.menu.removeAll();
|
||||
createSubMenu.call(statusMenu);
|
||||
reset(statusMenu);
|
||||
}
|
||||
|
||||
function disable() {
|
||||
// not guarranteed to work, if more extensions operate in the same place
|
||||
let statusMenu = Main.panel._statusArea.userMenu;
|
||||
statusMenu.menu.removeAll();
|
||||
statusMenu._createSubMenu();
|
||||
reset(statusMenu);
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Alternative Status Menu",
|
||||
"description": "Replaces GNOME Shell Status Menu with one showing Suspend/Hibernate and Power Off as separate items",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<schema id="org.gnome.shell.extensions.alternative-status-menu" path="/org/gnome/shell/extensions/alternative-status-menu/">
|
||||
<key name="allow-suspend" type="b">
|
||||
<default>true</default>
|
||||
<_summary>Enable suspending</_summary>
|
||||
<_description>Control the visibility of the Suspend menu item</_description>
|
||||
</key>
|
||||
<key name="allow-hibernate" type="b">
|
||||
<default>true</default>
|
||||
<_summary>Enable hibernating</_summary>
|
||||
<_description>Control the visibility of the Hibernate menu item</_description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
@@ -1,110 +1,545 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Atk = imports.gi.Atk;
|
||||
const GMenu = imports.gi.GMenu;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Signals = imports.signals;
|
||||
const Layout = imports.ui.layout;
|
||||
const Pango = imports.gi.Pango;
|
||||
|
||||
const ICON_SIZE = 28;
|
||||
let appsys = Shell.AppSystem.get_default();
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
function AppMenuItem() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
AppMenuItem.prototype = {
|
||||
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
|
||||
const appSys = Shell.AppSystem.get_default();
|
||||
|
||||
_init: function (app, params) {
|
||||
PopupMenu.PopupBaseMenuItem.prototype._init.call(this, params);
|
||||
const APPLICATION_ICON_SIZE = 32;
|
||||
const MENU_HEIGHT_OFFSET = 132;
|
||||
|
||||
this._app = app;
|
||||
this.label = new St.Label({ text: app.get_name() });
|
||||
this.addActor(this.label);
|
||||
this._icon = app.create_icon_texture(ICON_SIZE);
|
||||
this.addActor(this._icon, { expand: false });
|
||||
const ActivitiesMenuItem = new Lang.Class({
|
||||
Name: 'ActivitiesMenuItem',
|
||||
Extends: PopupMenu.PopupBaseMenuItem,
|
||||
|
||||
_init: function(button) {
|
||||
this.parent();
|
||||
this._button = button;
|
||||
this.addActor(new St.Label({ text: _("Activities Overview") }));
|
||||
},
|
||||
|
||||
activate: function (event) {
|
||||
this._app.activate_full(-1, event.get_time());
|
||||
activate: function(event) {
|
||||
this._button.menu.toggle();
|
||||
Main.overview.toggle();
|
||||
this.parent(event);
|
||||
},
|
||||
});
|
||||
|
||||
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event);
|
||||
const ApplicationMenuItem = new Lang.Class({
|
||||
Name: 'ApplicationMenuItem',
|
||||
Extends: PopupMenu.PopupBaseMenuItem,
|
||||
|
||||
_init: function(button, app) {
|
||||
this.parent();
|
||||
this._app = app;
|
||||
this._button = button;
|
||||
|
||||
let icon = this._app.create_icon_texture(APPLICATION_ICON_SIZE);
|
||||
this.addActor(icon);
|
||||
|
||||
let appLabel = new St.Label({ text: app.get_name() });
|
||||
this.addActor(appLabel, { span: -1, expand: true });
|
||||
this.actor.label_actor = appLabel;
|
||||
},
|
||||
|
||||
activate: function(event) {
|
||||
this._app.open_new_window(event.get_time());
|
||||
this._button.selectCategory(null, null);
|
||||
this._button.menu.toggle();
|
||||
this.parent(event);
|
||||
},
|
||||
|
||||
setActive: function(active, params) {
|
||||
if (active)
|
||||
this._button.scrollToButton(this);
|
||||
this.parent(active, params);
|
||||
},
|
||||
|
||||
_getPreferredWidth: function(actor, forHeight, alloc) {
|
||||
alloc.min_size = alloc.natural_size = -1;
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
const CategoryMenuItem = new Lang.Class({
|
||||
Name: 'CategoryMenuItem',
|
||||
Extends: PopupMenu.PopupBaseMenuItem,
|
||||
|
||||
function ApplicationsButton() {
|
||||
this._init();
|
||||
}
|
||||
_init: function(button, category) {
|
||||
this.parent();
|
||||
this._category = category;
|
||||
this._button = button;
|
||||
|
||||
ApplicationsButton.prototype = {
|
||||
__proto__: PanelMenu.SystemStatusButton.prototype,
|
||||
let name;
|
||||
if (this._category)
|
||||
name = this._category.get_name();
|
||||
else
|
||||
name = _("Favorites");
|
||||
|
||||
this.addActor(new St.Label({ text: name }));
|
||||
},
|
||||
|
||||
activate: function(event) {
|
||||
this._button.selectCategory(this._category, this);
|
||||
this._button.scrollToCatButton(this);
|
||||
this.parent(event);
|
||||
},
|
||||
|
||||
setActive: function(active, params) {
|
||||
if (active) {
|
||||
this._button.selectCategory(this._category, this);
|
||||
this._button.scrollToCatButton(this);
|
||||
}
|
||||
this.parent(active, params);
|
||||
}
|
||||
});
|
||||
|
||||
const HotCorner = new Lang.Class({
|
||||
Name: 'HotCorner',
|
||||
Extends: Layout.HotCorner,
|
||||
|
||||
_init : function(layoutManager) {
|
||||
this.parent(layoutManager);
|
||||
},
|
||||
|
||||
_onCornerEntered : function() {
|
||||
if (!this._entered) {
|
||||
this._entered = true;
|
||||
if (!Main.overview.animationInProgress) {
|
||||
this._activationTime = Date.now() / 1000;
|
||||
this.rippleAnimation();
|
||||
Main.overview.toggle();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
const ApplicationsMenu = new Lang.Class({
|
||||
Name: 'ApplicationsMenu',
|
||||
Extends: PopupMenu.PopupMenu,
|
||||
|
||||
_init: function(sourceActor, arrowAlignment, arrowSide, button, hotCorner) {
|
||||
this.parent(sourceActor, arrowAlignment, arrowSide);
|
||||
this._button = button;
|
||||
this._hotCorner = hotCorner;
|
||||
},
|
||||
|
||||
open: function(animate) {
|
||||
this._hotCorner.actor.hide();
|
||||
this.parent(animate);
|
||||
},
|
||||
|
||||
close: function(animate) {
|
||||
this._hotCorner.actor.show();
|
||||
this.parent(animate);
|
||||
},
|
||||
|
||||
toggle: function() {
|
||||
if (this.isOpen) {
|
||||
this._button.selectCategory(null, null);
|
||||
} else {
|
||||
if (Main.overview.visible)
|
||||
Main.overview.hide();
|
||||
}
|
||||
this.parent();
|
||||
}
|
||||
});
|
||||
|
||||
const ApplicationsButton = new Lang.Class({
|
||||
Name: 'ApplicationsButton',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function() {
|
||||
PanelMenu.SystemStatusButton.prototype._init.call(this, 'start-here');
|
||||
this.parent(1.0, null, false);
|
||||
this._hotCorner = new HotCorner(Main.layoutManager);
|
||||
this.setMenu(new ApplicationsMenu(this.actor, 1.0, St.Side.TOP, this, this._hotCorner));
|
||||
Main.panel.menuManager.addMenu(this.menu);
|
||||
|
||||
// At this moment applications menu is not keyboard navigable at
|
||||
// all (so not accessible), so it doesn't make sense to set as
|
||||
// role ATK_ROLE_MENU like other elements of the panel.
|
||||
this.actor.accessible_role = Atk.Role.LABEL;
|
||||
|
||||
let container = new Shell.GenericContainer();
|
||||
container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth));
|
||||
container.connect('get-preferred-height', Lang.bind(this, this._containerGetPreferredHeight));
|
||||
container.connect('allocate', Lang.bind(this, this._containerAllocate));
|
||||
this.actor.add_actor(container);
|
||||
this.actor.name = 'panelApplications';
|
||||
|
||||
this._label = new St.Label({ text: _("Applications") });
|
||||
container.add_actor(this._label);
|
||||
|
||||
this.actor.label_actor = this._label;
|
||||
|
||||
container.add_actor(this._hotCorner.actor);
|
||||
Main.messageTray._grabHelper.addActor(this._hotCorner.actor);
|
||||
|
||||
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
||||
|
||||
_showingId = Main.overview.connect('showing', Lang.bind(this, function() {
|
||||
this.actor.add_accessible_state (Atk.StateType.CHECKED);
|
||||
}));
|
||||
_hidingId = Main.overview.connect('hiding', Lang.bind(this, function() {
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
}));
|
||||
|
||||
this.reloadFlag = false;
|
||||
this._createLayout();
|
||||
this._display();
|
||||
appsys.connect('installed-changed', Lang.bind(this, this.reDisplay));
|
||||
_installedChangedId = appSys.connect('installed-changed', Lang.bind(this, function() {
|
||||
if (this.menu.isOpen) {
|
||||
this._redisplay();
|
||||
this.mainBox.show();
|
||||
} else {
|
||||
this.reloadFlag = true;
|
||||
}
|
||||
}));
|
||||
|
||||
// Since the hot corner uses stage coordinates, Clutter won't
|
||||
// queue relayouts for us when the panel moves. Queue a relayout
|
||||
// when that happens.
|
||||
_panelBoxChangedId = Main.layoutManager.connect('panel-box-changed', Lang.bind(this, function() {
|
||||
container.queue_relayout();
|
||||
}));
|
||||
},
|
||||
|
||||
reDisplay : function() {
|
||||
this._clearAll();
|
||||
_containerGetPreferredWidth: function(actor, forHeight, alloc) {
|
||||
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_width(forHeight);
|
||||
},
|
||||
|
||||
_containerGetPreferredHeight: function(actor, forWidth, alloc) {
|
||||
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_height(forWidth);
|
||||
},
|
||||
|
||||
_containerAllocate: function(actor, box, flags) {
|
||||
this._label.allocate(box, flags);
|
||||
|
||||
// The hot corner needs to be outside any padding/alignment
|
||||
// that has been imposed on us
|
||||
let primary = Main.layoutManager.primaryMonitor;
|
||||
let hotBox = new Clutter.ActorBox();
|
||||
let ok, x, y;
|
||||
if (actor.get_text_direction() == Clutter.TextDirection.LTR) {
|
||||
[ok, x, y] = actor.transform_stage_point(primary.x, primary.y);
|
||||
} else {
|
||||
[ok, x, y] = actor.transform_stage_point(primary.x + primary.width, primary.y);
|
||||
// hotCorner.actor has northeast gravity, so we don't need
|
||||
// to adjust x for its width
|
||||
}
|
||||
|
||||
hotBox.x1 = Math.round(x);
|
||||
hotBox.x2 = hotBox.x1 + this._hotCorner.actor.width;
|
||||
hotBox.y1 = Math.round(y);
|
||||
hotBox.y2 = hotBox.y1 + this._hotCorner.actor.height;
|
||||
this._hotCorner.actor.allocate(hotBox, flags);
|
||||
},
|
||||
|
||||
_createVertSeparator: function() {
|
||||
let separator = new St.DrawingArea({ style_class: 'calendar-vertical-separator',
|
||||
pseudo_class: 'highlighted' });
|
||||
separator.connect('repaint', Lang.bind(this, this._onVertSepRepaint));
|
||||
return separator;
|
||||
},
|
||||
|
||||
_onCapturedEvent: function(actor, event) {
|
||||
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
|
||||
if (!this._hotCorner.shouldToggleOverviewOnClick())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
_onVertSepRepaint: function(area) {
|
||||
let cr = area.get_context();
|
||||
let themeNode = area.get_theme_node();
|
||||
let [width, height] = area.get_surface_size();
|
||||
let stippleColor = themeNode.get_color('-stipple-color');
|
||||
let stippleWidth = themeNode.get_length('-stipple-width');
|
||||
let x = Math.floor(width/2) + 0.5;
|
||||
cr.moveTo(x, 0);
|
||||
cr.lineTo(x, height);
|
||||
Clutter.cairo_set_source_color(cr, stippleColor);
|
||||
cr.setDash([1, 3], 1); // Hard-code for now
|
||||
cr.setLineWidth(stippleWidth);
|
||||
cr.stroke();
|
||||
},
|
||||
|
||||
_onOpenStateChanged: function(menu, open) {
|
||||
if (open) {
|
||||
if (this.reloadFlag) {
|
||||
this._redisplay();
|
||||
this.reloadFlag = false;
|
||||
}
|
||||
this.mainBox.show();
|
||||
}
|
||||
this.parent(menu, open);
|
||||
},
|
||||
|
||||
_redisplay: function() {
|
||||
this.applicationsBox.destroy_all_children();
|
||||
this.categoriesBox.destroy_all_children();
|
||||
this._display();
|
||||
},
|
||||
|
||||
_clearAll : function() {
|
||||
this.menu.removeAll();
|
||||
},
|
||||
|
||||
// Recursively load a GMenuTreeDirectory; we could put this in ShellAppSystem too
|
||||
// (taken from js/ui/appDisplay.js in core shell)
|
||||
_loadCategory: function(dir, menu) {
|
||||
var iter = dir.iter();
|
||||
var nextType;
|
||||
_loadCategory: function(dir) {
|
||||
let iter = dir.iter();
|
||||
let nextType;
|
||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
||||
if (nextType == GMenu.TreeItemType.ENTRY) {
|
||||
var entry = iter.get_entry();
|
||||
var app = appsys.lookup_app_by_tree_entry(entry);
|
||||
menu.addMenuItem(new AppMenuItem(app));
|
||||
let entry = iter.get_entry();
|
||||
if (!entry.get_app_info().get_nodisplay()) {
|
||||
let app = appSys.lookup_app_by_tree_entry(entry);
|
||||
let menu_id = dir.get_menu_id();
|
||||
this.applicationsByCategory[menu_id].push(app);
|
||||
}
|
||||
} else if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
||||
this._loadCategory(iter.get_directory(), appList);
|
||||
let subdir = iter.get_directory();
|
||||
if (!subdir.get_is_nodisplay()) {
|
||||
let menu_id = subdir.get_menu_id();
|
||||
this.applicationsByCategory[menu_id] = new Array();
|
||||
this._loadCategory(subdir);
|
||||
if (this.applicationsByCategory[menu_id].length > 0) {
|
||||
let categoryMenuItem = new CategoryMenuItem(this, subdir);
|
||||
this.categoriesBox.add_actor(categoryMenuItem.actor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_display : function() {
|
||||
let tree = appsys.get_tree();
|
||||
let root = tree.get_root_directory();
|
||||
scrollToButton: function(button) {
|
||||
let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment();
|
||||
let appsScrollBoxAlloc = this.applicationsScrollBox.get_allocation_box();
|
||||
let currentScrollValue = appsScrollBoxAdj.get_value();
|
||||
let boxHeight = appsScrollBoxAlloc.y2 - appsScrollBoxAlloc.y1;
|
||||
let buttonAlloc = button.actor.get_allocation_box();
|
||||
let newScrollValue = currentScrollValue;
|
||||
if (currentScrollValue > buttonAlloc.y1 - 10)
|
||||
newScrollValue = buttonAlloc.y1 - 10;
|
||||
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
||||
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
||||
if (newScrollValue != currentScrollValue)
|
||||
appsScrollBoxAdj.set_value(newScrollValue);
|
||||
},
|
||||
|
||||
scrollToCatButton: function(button) {
|
||||
let catsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment();
|
||||
let catsScrollBoxAlloc = this.categoriesScrollBox.get_allocation_box();
|
||||
let currentScrollValue = catsScrollBoxAdj.get_value();
|
||||
let boxHeight = catsScrollBoxAlloc.y2 - catsScrollBoxAlloc.y1;
|
||||
let buttonAlloc = button.actor.get_allocation_box();
|
||||
let newScrollValue = currentScrollValue;
|
||||
if (currentScrollValue > buttonAlloc.y1 - 10)
|
||||
newScrollValue = buttonAlloc.y1 - 10;
|
||||
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
||||
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
||||
if (newScrollValue != currentScrollValue)
|
||||
catsScrollBoxAdj.set_value(newScrollValue);
|
||||
},
|
||||
|
||||
_createLayout: function() {
|
||||
let section = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(section);
|
||||
this.mainBox = new St.BoxLayout({ vertical: false });
|
||||
this.leftBox = new St.BoxLayout({ vertical: true });
|
||||
this.applicationsScrollBox = new St.ScrollView({ x_fill: true, y_fill: false,
|
||||
y_align: St.Align.START,
|
||||
style_class: 'vfade' });
|
||||
this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
let vscroll = this.applicationsScrollBox.get_vscroll_bar();
|
||||
vscroll.connect('scroll-start', Lang.bind(this, function() {
|
||||
this.menu.passEvents = true;
|
||||
}));
|
||||
vscroll.connect('scroll-stop', Lang.bind(this, function() {
|
||||
this.menu.passEvents = false;
|
||||
}));
|
||||
this.categoriesScrollBox = new St.ScrollView({ x_fill: true, y_fill: false,
|
||||
y_align: St.Align.START,
|
||||
style_class: 'vfade' });
|
||||
this.categoriesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
vscroll = this.categoriesScrollBox.get_vscroll_bar();
|
||||
vscroll.connect('scroll-start', Lang.bind(this, function() {
|
||||
this.menu.passEvents = true;
|
||||
}));
|
||||
vscroll.connect('scroll-stop', Lang.bind(this, function() {
|
||||
this.menu.passEvents = false;
|
||||
}));
|
||||
this.leftBox.add(this.categoriesScrollBox, { expand: true,
|
||||
x_fill: true, y_fill: true,
|
||||
y_align: St.Align.START });
|
||||
|
||||
let activities = new ActivitiesMenuItem(this);
|
||||
this.leftBox.add(activities.actor, { expand: false,
|
||||
x_fill: true, y_fill: false,
|
||||
y_align: St.Align.START });
|
||||
|
||||
this.applicationsBox = new St.BoxLayout({ vertical: true });
|
||||
this.applicationsScrollBox.add_actor(this.applicationsBox);
|
||||
this.categoriesBox = new St.BoxLayout({ vertical: true });
|
||||
this.categoriesScrollBox.add_actor(this.categoriesBox, { expand: true, x_fill: false });
|
||||
|
||||
this.mainBox.add(this.leftBox);
|
||||
this.mainBox.add(this._createVertSeparator(), { expand: false, x_fill: false, y_fill: true});
|
||||
this.mainBox.add(this.applicationsScrollBox, { expand: true, x_fill: true, y_fill: true });
|
||||
section.actor.add_actor(this.mainBox);
|
||||
},
|
||||
|
||||
_display: function() {
|
||||
this._applicationsButtons = new Array();
|
||||
this.mainBox.style=('width: 640px;');
|
||||
this.mainBox.hide();
|
||||
|
||||
//Load categories
|
||||
this.applicationsByCategory = {};
|
||||
let tree = appSys.get_tree();
|
||||
let root = tree.get_root_directory();
|
||||
let categoryMenuItem = new CategoryMenuItem(this, null);
|
||||
this.categoriesBox.add_actor(categoryMenuItem.actor);
|
||||
let iter = root.iter();
|
||||
let nextType;
|
||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
||||
if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
||||
let dir = iter.get_directory();
|
||||
let item = new PopupMenu.PopupSubMenuMenuItem(dir.get_name());
|
||||
this._loadCategory(dir, item.menu);
|
||||
this.menu.addMenuItem(item);
|
||||
if (!dir.get_is_nodisplay()) {
|
||||
let menu_id = dir.get_menu_id();
|
||||
this.applicationsByCategory[menu_id] = new Array();
|
||||
this._loadCategory(dir);
|
||||
if (this.applicationsByCategory[menu_id].length > 0) {
|
||||
let categoryMenuItem = new CategoryMenuItem(this, dir);
|
||||
this.categoriesBox.add_actor(categoryMenuItem.actor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Load applications
|
||||
this._displayButtons(this._listApplications(null));
|
||||
|
||||
let height = this.categoriesBox.height + MENU_HEIGHT_OFFSET + 'px';
|
||||
this.mainBox.style+=('height: ' + height);
|
||||
},
|
||||
|
||||
_clearApplicationsBox: function(selectedActor) {
|
||||
let actors = this.applicationsBox.get_children();
|
||||
for (let i = 0; i < actors.length; i++) {
|
||||
let actor = actors[i];
|
||||
this.applicationsBox.remove_actor(actor);
|
||||
}
|
||||
},
|
||||
|
||||
selectCategory: function(dir, categoryMenuItem) {
|
||||
if (categoryMenuItem)
|
||||
this._clearApplicationsBox(categoryMenuItem.actor);
|
||||
else
|
||||
this._clearApplicationsBox(null);
|
||||
|
||||
if (dir)
|
||||
this._displayButtons(this._listApplications(dir.get_menu_id()));
|
||||
else
|
||||
this._displayButtons(this._listApplications(null));
|
||||
},
|
||||
|
||||
_displayButtons: function(apps) {
|
||||
if (apps) {
|
||||
for (let i = 0; i < apps.length; i++) {
|
||||
let app = apps[i];
|
||||
if (!this._applicationsButtons[app]) {
|
||||
let applicationMenuItem = new ApplicationMenuItem(this, app);
|
||||
this._applicationsButtons[app] = applicationMenuItem;
|
||||
}
|
||||
if (!this._applicationsButtons[app].actor.get_parent())
|
||||
this.applicationsBox.add_actor(this._applicationsButtons[app].actor);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_listApplications: function(category_menu_id) {
|
||||
let applist;
|
||||
|
||||
if (category_menu_id) {
|
||||
applist = this.applicationsByCategory[category_menu_id];
|
||||
} else {
|
||||
applist = new Array();
|
||||
let favorites = global.settings.get_strv('favorite-apps');
|
||||
for (let i = 0; i < favorites.length; i++) {
|
||||
let app = appSys.lookup_app(favorites[i]);
|
||||
if (app)
|
||||
applist.push(app);
|
||||
}
|
||||
}
|
||||
|
||||
applist.sort(function(a,b) {
|
||||
return a.get_name().toLowerCase() > b.get_name().toLowerCase();
|
||||
});
|
||||
return applist;
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
this.menu.actor.get_children().forEach(function(c) { c.destroy() });
|
||||
this.parent();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
let appsMenuButton;
|
||||
let activitiesButton;
|
||||
let _hidingId;
|
||||
let _installedChangedId;
|
||||
let _panelBoxChangedId;
|
||||
let _showingId;
|
||||
|
||||
function enable() {
|
||||
activitiesButton = Main.panel.statusArea['activities'];
|
||||
activitiesButton.hotCorner.actor.hide();
|
||||
activitiesButton.container.hide();
|
||||
appsMenuButton = new ApplicationsButton();
|
||||
Main.panel._leftBox.insert_actor(appsMenuButton.actor, 1);
|
||||
Main.panel._leftBox.child_set(appsMenuButton.actor, { y_fill : true } );
|
||||
Main.panel._menus.addMenu(appsMenuButton.menu);
|
||||
Main.panel.addToStatusArea('apps-menu', appsMenuButton, 1, 'left');
|
||||
|
||||
Main.wm.setCustomKeybindingHandler('panel-main-menu',
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
function() {
|
||||
appsMenuButton.menu.toggle();
|
||||
});
|
||||
}
|
||||
|
||||
function disable() {
|
||||
Main.panel.menuManager.removeMenu(appsMenuButton.menu);
|
||||
appSys.disconnect(_installedChangedId);
|
||||
Main.layoutManager.disconnect(_panelBoxChangedId);
|
||||
Main.overview.disconnect(_hidingId);
|
||||
Main.overview.disconnect(_showingId);
|
||||
appsMenuButton.destroy();
|
||||
activitiesButton.container.show();
|
||||
activitiesButton.hotCorner.actor.show();
|
||||
|
||||
Main.wm.setCustomKeybindingHandler('panel-main-menu',
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Main.sessionMode.hasOverview ?
|
||||
Lang.bind(Main.overview, Main.overview.toggle) :
|
||||
null);
|
||||
}
|
||||
|
||||
function init() {
|
||||
/* do nothing */
|
||||
function init(metadata) {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Applications Menu",
|
||||
"description": "Add a gnome 2.x style menu for applications",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"original-authors": [ "e2002@bk.ru", "debarshir@gnome.org" ],
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
@@ -1,14 +1,7 @@
|
||||
EXTENSION_ID = auto-move-windows
|
||||
|
||||
EXTRA_MODULES = prefs.js
|
||||
|
||||
include ../../extension.mk
|
||||
include ../../settings.mk
|
||||
|
||||
gschemas_in = org.gnome.shell.extensions.auto-move-windows.gschema.xml.in
|
||||
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
|
||||
gsettings_SCHEMAS = $(gschemas_in:.xml.in=.xml)
|
||||
|
||||
@GSETTINGS_RULES@
|
||||
|
||||
CLEANFILES += $(gschemas_in:.xml.in=.valid) $(gsettings_SCHEMAS)
|
||||
EXTRA_DIST += $(gschemas_in)
|
||||
|
||||
@@ -11,16 +11,19 @@ const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.auto-move-windows';
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const SETTINGS_KEY = 'application-list';
|
||||
|
||||
function WindowMover() {
|
||||
this._init();
|
||||
}
|
||||
let settings;
|
||||
|
||||
const WindowMover = new Lang.Class({
|
||||
Name: 'AutoMoveWindows.WindowMover',
|
||||
|
||||
WindowMover.prototype = {
|
||||
_init: function() {
|
||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||
this._settings = settings;
|
||||
this._windowTracker = Shell.WindowTracker.get_default();
|
||||
|
||||
let display = global.screen.get_display();
|
||||
@@ -74,84 +77,86 @@ WindowMover.prototype = {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
let prevCheckWorkspaces;
|
||||
let winMover;
|
||||
|
||||
function init(extensionMeta) {
|
||||
// do nothing here
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
settings = Convenience.getSettings();
|
||||
}
|
||||
|
||||
function myCheckWorkspaces() {
|
||||
let i;
|
||||
let emptyWorkspaces = new Array(Main._workspaces.length);
|
||||
|
||||
for (i = 0; i < Main._workspaces.length; i++) {
|
||||
let lastRemoved = Main._workspaces[i]._lastRemovedWindow;
|
||||
if (lastRemoved &&
|
||||
(lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN ||
|
||||
lastRemoved.get_window_type() == Meta.WindowType.DIALOG ||
|
||||
lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG))
|
||||
emptyWorkspaces[i] = false;
|
||||
else
|
||||
emptyWorkspaces[i] = true;
|
||||
}
|
||||
|
||||
let windows = global.get_window_actors();
|
||||
for (i = 0; i < windows.length; i++) {
|
||||
let win = windows[i];
|
||||
|
||||
if (win.get_meta_window().is_on_all_workspaces())
|
||||
continue;
|
||||
|
||||
let workspaceIndex = win.get_workspace();
|
||||
emptyWorkspaces[workspaceIndex] = false;
|
||||
}
|
||||
|
||||
// If we don't have an empty workspace at the end, add one
|
||||
if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
|
||||
global.screen.append_new_workspace(false, global.get_current_time());
|
||||
emptyWorkspaces.push(false);
|
||||
}
|
||||
|
||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||
let activeIsLast = activeWorkspaceIndex == global.screen.n_workspaces - 2;
|
||||
let removingTrailWorkspaces = (emptyWorkspaces[activeWorkspaceIndex] &&
|
||||
activeIsLast);
|
||||
// Don't enter the overview when removing multiple empty workspaces at startup
|
||||
let showOverview = (removingTrailWorkspaces &&
|
||||
!emptyWorkspaces.every(function(x) { return x; }));
|
||||
|
||||
if (removingTrailWorkspaces) {
|
||||
// "Merge" the empty workspace we are removing with the one at the end
|
||||
Main.wm.blockAnimations();
|
||||
}
|
||||
|
||||
// Delete other empty workspaces; do it from the end to avoid index changes
|
||||
for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
|
||||
if (emptyWorkspaces[i])
|
||||
global.screen.remove_workspace(Main._workspaces[i], global.get_current_time());
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (removingTrailWorkspaces) {
|
||||
global.screen.get_workspace_by_index(global.screen.n_workspaces - 1).activate(global.get_current_time());
|
||||
|
||||
Main.wm.unblockAnimations();
|
||||
|
||||
if (!Main.overview.visible && showOverview)
|
||||
Main.overview.show();
|
||||
}
|
||||
|
||||
Main._checkWorkspacesId = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
function enable() {
|
||||
prevCheckWorkspaces = Main._checkWorkspaces;
|
||||
Main._checkWorkspaces = function() {
|
||||
let i;
|
||||
let emptyWorkspaces = new Array(Main._workspaces.length);
|
||||
|
||||
for (i = 0; i < Main._workspaces.length; i++) {
|
||||
let lastRemoved = Main._workspaces[i]._lastRemovedWindow;
|
||||
if (lastRemoved &&
|
||||
(lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN ||
|
||||
lastRemoved.get_window_type() == Meta.WindowType.DIALOG ||
|
||||
lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG))
|
||||
emptyWorkspaces[i] = false;
|
||||
else
|
||||
emptyWorkspaces[i] = true;
|
||||
}
|
||||
|
||||
|
||||
let windows = global.get_window_actors();
|
||||
for (i = 0; i < windows.length; i++) {
|
||||
let win = windows[i];
|
||||
|
||||
if (win.get_meta_window().is_on_all_workspaces())
|
||||
continue;
|
||||
|
||||
let workspaceIndex = win.get_workspace();
|
||||
emptyWorkspaces[workspaceIndex] = false;
|
||||
}
|
||||
|
||||
// If we don't have an empty workspace at the end, add one
|
||||
if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
|
||||
global.screen.append_new_workspace(false, global.get_current_time());
|
||||
emptyWorkspaces.push(false);
|
||||
}
|
||||
|
||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||
let activeIsLast = activeWorkspaceIndex == global.screen.n_workspaces - 2;
|
||||
let removingTrailWorkspaces = (emptyWorkspaces[activeWorkspaceIndex] &&
|
||||
activeIsLast);
|
||||
// Don't enter the overview when removing multiple empty workspaces at startup
|
||||
let showOverview = (removingTrailWorkspaces &&
|
||||
!emptyWorkspaces.every(function(x) { return x; }));
|
||||
|
||||
if (removingTrailWorkspaces) {
|
||||
// "Merge" the empty workspace we are removing with the one at the end
|
||||
Main.wm.blockAnimations();
|
||||
}
|
||||
|
||||
// Delete other empty workspaces; do it from the end to avoid index changes
|
||||
for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
|
||||
if (emptyWorkspaces[i])
|
||||
global.screen.remove_workspace(Main._workspaces[i], global.get_current_time());
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (removingTrailWorkspaces) {
|
||||
global.screen.get_workspace_by_index(global.screen.n_workspaces - 1).activate(global.get_current_time());
|
||||
|
||||
Main.wm.unblockAnimations();
|
||||
|
||||
if (!Main.overview.visible && showOverview)
|
||||
Main.overview.show();
|
||||
}
|
||||
|
||||
Main._checkWorkspacesId = 0;
|
||||
return false;
|
||||
|
||||
};
|
||||
if (Meta.prefs_get_dynamic_workspaces())
|
||||
Main._checkWorkspaces = myCheckWorkspaces;
|
||||
|
||||
winMover = new WindowMover();
|
||||
}
|
||||
@@ -159,4 +164,4 @@ function enable() {
|
||||
function disable() {
|
||||
Main._checkWorkspaces = prevCheckWorkspaces;
|
||||
winMover.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Auto Move Windows",
|
||||
"description": "Move applications to specific workspaces when they create windows",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"original-authors": [ "alessandro.crismani@gmail.com", "thomas.bouffon@gmail.com" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
260
extensions/auto-move-windows/prefs.js
Normal file
260
extensions/auto-move-windows/prefs.js
Normal file
@@ -0,0 +1,260 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
// Start apps on custom workspaces
|
||||
|
||||
const GdkPixbuf = imports.gi.GdkPixbuf;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const GMenu = imports.gi.GMenu;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
const N_ = function(e) { return e };
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const SETTINGS_KEY = 'application-list';
|
||||
|
||||
const WORKSPACE_MAX = 36; // compiled in limit of mutter
|
||||
|
||||
const Columns = {
|
||||
APPINFO: 0,
|
||||
DISPLAY_NAME: 1,
|
||||
ICON: 2,
|
||||
WORKSPACE: 3,
|
||||
ADJUSTMENT: 4
|
||||
};
|
||||
|
||||
const Widget = new GObject.Class({
|
||||
Name: 'AutoMoveWindows.Prefs.Widget',
|
||||
GTypeName: 'AutoMoveWindowsPrefsWidget',
|
||||
Extends: Gtk.Grid,
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
this.set_orientation(Gtk.Orientation.VERTICAL);
|
||||
|
||||
this._settings = Convenience.getSettings();
|
||||
this._settings.connect('changed', Lang.bind(this, this._refresh));
|
||||
this._changedPermitted = false;
|
||||
|
||||
this._store = new Gtk.ListStore();
|
||||
this._store.set_column_types([Gio.AppInfo, GObject.TYPE_STRING, Gio.Icon, GObject.TYPE_INT,
|
||||
Gtk.Adjustment]);
|
||||
|
||||
this._treeView = new Gtk.TreeView({ model: this._store,
|
||||
hexpand: true, vexpand: true });
|
||||
this._treeView.get_selection().set_mode(Gtk.SelectionMode.SINGLE);
|
||||
|
||||
let appColumn = new Gtk.TreeViewColumn({ expand: true, sort_column_id: Columns.DISPLAY_NAME,
|
||||
title: _("Application") });
|
||||
let iconRenderer = new Gtk.CellRendererPixbuf;
|
||||
appColumn.pack_start(iconRenderer, false);
|
||||
appColumn.add_attribute(iconRenderer, "gicon", Columns.ICON);
|
||||
let nameRenderer = new Gtk.CellRendererText;
|
||||
appColumn.pack_start(nameRenderer, true);
|
||||
appColumn.add_attribute(nameRenderer, "text", Columns.DISPLAY_NAME);
|
||||
this._treeView.append_column(appColumn);
|
||||
|
||||
let workspaceColumn = new Gtk.TreeViewColumn({ title: _("Workspace"),
|
||||
sort_column_id: Columns.WORKSPACE });
|
||||
let workspaceRenderer = new Gtk.CellRendererSpin({ editable: true });
|
||||
workspaceRenderer.connect('edited', Lang.bind(this, this._workspaceEdited));
|
||||
workspaceColumn.pack_start(workspaceRenderer, true);
|
||||
workspaceColumn.add_attribute(workspaceRenderer, "adjustment", Columns.ADJUSTMENT);
|
||||
workspaceColumn.add_attribute(workspaceRenderer, "text", Columns.WORKSPACE);
|
||||
this._treeView.append_column(workspaceColumn);
|
||||
|
||||
this.add(this._treeView);
|
||||
|
||||
let toolbar = new Gtk.Toolbar();
|
||||
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
|
||||
this.add(toolbar);
|
||||
|
||||
let newButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_NEW,
|
||||
label: _("Add rule"),
|
||||
is_important: true });
|
||||
newButton.connect('clicked', Lang.bind(this, this._createNew));
|
||||
toolbar.add(newButton);
|
||||
|
||||
let delButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_DELETE });
|
||||
delButton.connect('clicked', Lang.bind(this, this._deleteSelected));
|
||||
toolbar.add(delButton);
|
||||
|
||||
this._changedPermitted = true;
|
||||
this._refresh();
|
||||
},
|
||||
|
||||
_createNew: function() {
|
||||
let dialog = new Gtk.Dialog({ title: _("Create new matching rule"),
|
||||
transient_for: this.get_toplevel(),
|
||||
modal: true });
|
||||
dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL);
|
||||
dialog.add_button(_("Add"), Gtk.ResponseType.OK);
|
||||
dialog.set_default_response(Gtk.ResponseType.OK);
|
||||
|
||||
let grid = new Gtk.Grid({ column_spacing: 10,
|
||||
row_spacing: 15,
|
||||
margin: 10 });
|
||||
dialog._appChooser = new Gtk.AppChooserWidget({ show_all: true });
|
||||
grid.attach(dialog._appChooser, 0, 0, 2, 1);
|
||||
grid.attach(new Gtk.Label({ label: _("Workspace") }),
|
||||
0, 1, 1, 1);
|
||||
let adjustment = new Gtk.Adjustment({ lower: 1,
|
||||
upper: WORKSPACE_MAX,
|
||||
step_increment: 1
|
||||
});
|
||||
dialog._spin = new Gtk.SpinButton({ adjustment: adjustment,
|
||||
snap_to_ticks: true });
|
||||
dialog._spin.set_value(1);
|
||||
grid.attach(dialog._spin, 1, 1, 1, 1);
|
||||
dialog.get_content_area().add(grid);
|
||||
|
||||
dialog.connect('response', Lang.bind(this, function(dialog, id) {
|
||||
if (id != Gtk.ResponseType.OK) {
|
||||
dialog.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
let appInfo = dialog._appChooser.get_app_info();
|
||||
if (!appInfo)
|
||||
return;
|
||||
let index = Math.floor(dialog._spin.value);
|
||||
if (isNaN(index) || index < 0)
|
||||
index = 1;
|
||||
|
||||
this._changedPermitted = false;
|
||||
if (!this._appendItem(appInfo.get_id(), index)) {
|
||||
this._changedPermitted = true;
|
||||
return;
|
||||
}
|
||||
let iter = this._store.append();
|
||||
let adj = new Gtk.Adjustment({ lower: 1,
|
||||
upper: WORKSPACE_MAX,
|
||||
step_increment: 1,
|
||||
value: index });
|
||||
this._store.set(iter,
|
||||
[Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME, Columns.WORKSPACE, Columns.ADJUSTMENT],
|
||||
[appInfo, appInfo.get_icon(), appInfo.get_display_name(), index, adj]);
|
||||
this._changedPermitted = true;
|
||||
|
||||
dialog.destroy();
|
||||
}));
|
||||
dialog.show_all();
|
||||
},
|
||||
|
||||
_deleteSelected: function() {
|
||||
let [any, model, iter] = this._treeView.get_selection().get_selected();
|
||||
|
||||
if (any) {
|
||||
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
||||
|
||||
this._changedPermitted = false;
|
||||
this._removeItem(appInfo.get_id());
|
||||
this._store.remove(iter);
|
||||
this._changedPermitted = true;
|
||||
}
|
||||
},
|
||||
|
||||
_workspaceEdited: function(renderer, pathString, text) {
|
||||
let index = parseInt(text);
|
||||
if (isNaN(index) || index < 0)
|
||||
index = 1;
|
||||
let path = Gtk.TreePath.new_from_string(pathString);
|
||||
let [model, iter] = this._store.get_iter(path);
|
||||
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
||||
|
||||
this._changedPermitted = false;
|
||||
this._changeItem(appInfo.get_id(), index);
|
||||
this._store.set_value(iter, Columns.WORKSPACE, index);
|
||||
this._changedPermitted = true;
|
||||
},
|
||||
|
||||
_refresh: function() {
|
||||
if (!this._changedPermitted)
|
||||
// Ignore this notification, model is being modified outside
|
||||
return;
|
||||
|
||||
this._store.clear();
|
||||
|
||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||
let validItems = [ ];
|
||||
for (let i = 0; i < currentItems.length; i++) {
|
||||
let [id, index] = currentItems[i].split(':');
|
||||
let appInfo = Gio.DesktopAppInfo.new(id);
|
||||
if (!appInfo)
|
||||
continue;
|
||||
validItems.push(currentItems[i]);
|
||||
|
||||
let iter = this._store.append();
|
||||
let adj = new Gtk.Adjustment({ lower: 1,
|
||||
upper: WORKSPACE_MAX,
|
||||
step_increment: 1,
|
||||
value: index });
|
||||
this._store.set(iter,
|
||||
[Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME, Columns.WORKSPACE, Columns.ADJUSTMENT],
|
||||
[appInfo, appInfo.get_icon(), appInfo.get_display_name(), parseInt(index), adj]);
|
||||
}
|
||||
|
||||
if (validItems.length != currentItems.length) // some items were filtered out
|
||||
this._settings.set_strv(SETTINGS_KEY, validItems);
|
||||
},
|
||||
|
||||
_appendItem: function(id, workspace) {
|
||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||
let alreadyHave = currentItems.map(function(el) {
|
||||
return el.split(':')[0];
|
||||
}).indexOf(id) != -1;
|
||||
|
||||
if (alreadyHave) {
|
||||
printerr("Already have an item for this id");
|
||||
return false;
|
||||
}
|
||||
|
||||
currentItems.push(id + ':' + workspace);
|
||||
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||
return true;
|
||||
},
|
||||
|
||||
_removeItem: function(id) {
|
||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||
let index = currentItems.map(function(el) {
|
||||
return el.split(':')[0];
|
||||
}).indexOf(id);
|
||||
|
||||
if (index < 0)
|
||||
return;
|
||||
currentItems.splice(index, 1);
|
||||
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||
},
|
||||
|
||||
_changeItem: function(id, workspace) {
|
||||
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||
let index = currentItems.map(function(el) {
|
||||
return el.split(':')[0];
|
||||
}).indexOf(id);
|
||||
|
||||
if (index < 0)
|
||||
currentItems.push(id + ':' + workspace);
|
||||
else
|
||||
currentItems[index] = id + ':' + workspace;
|
||||
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
function buildPrefsWidget() {
|
||||
let widget = new Widget();
|
||||
widget.show_all();
|
||||
|
||||
return widget;
|
||||
}
|
||||
3
extensions/default-min-max/Makefile.am
Normal file
3
extensions/default-min-max/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
EXTENSION_ID = default-min-max
|
||||
|
||||
include ../../extension.mk
|
||||
20
extensions/default-min-max/extension.js
Normal file
20
extensions/default-min-max/extension.js
Normal file
@@ -0,0 +1,20 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
|
||||
const Meta = imports.gi.Meta;
|
||||
|
||||
const BUTTON_LAYOUT_KEY = 'button-layout';
|
||||
const EXTENSION_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
||||
const SHELL_OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
|
||||
|
||||
function init(metadata) {
|
||||
}
|
||||
|
||||
function enable() {
|
||||
// Override gnome-shell's overrides
|
||||
Meta.prefs_override_preference_schema(BUTTON_LAYOUT_KEY, EXTENSION_SCHEMA);
|
||||
}
|
||||
|
||||
function disable() {
|
||||
// Restore gnome-shell's overrides
|
||||
Meta.prefs_override_preference_schema(BUTTON_LAYOUT_KEY, SHELL_OVERRIDES_SCHEMA);
|
||||
}
|
||||
11
extensions/default-min-max/metadata.json.in
Normal file
11
extensions/default-min-max/metadata.json.in
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Default Minimize and Maximize",
|
||||
"description": "Adds minimize and maximize buttons to the titlebar by default",
|
||||
"original-authors": [ "debarshir@gnome.org" ],
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
1
extensions/default-min-max/stylesheet.css
Normal file
1
extensions/default-min-max/stylesheet.css
Normal file
@@ -0,0 +1 @@
|
||||
/* This extensions requires no special styling */
|
||||
@@ -1,865 +0,0 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Pango = imports.gi.Pango;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
const AppFavorites = imports.ui.appFavorites;
|
||||
const DND = imports.ui.dnd;
|
||||
const Main = imports.ui.main;
|
||||
const Overview = imports.ui.overview;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Search = imports.ui.search;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Workspace = imports.ui.workspace;
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const AltTab = imports.ui.altTab;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
// Settings
|
||||
const DOCK_SETTINGS_SCHEMA = 'org.gnome.shell.extensions.dock';
|
||||
const DOCK_POSITION_KEY = 'position';
|
||||
const DOCK_SIZE_KEY = 'size';
|
||||
const DOCK_HIDE_KEY = 'autohide';
|
||||
const DOCK_EFFECTHIDE_KEY = 'hide-effect';
|
||||
const DOCK_AUTOHIDE_ANIMATION_TIME_KEY = 'hide-effect-duration';
|
||||
|
||||
|
||||
//hide
|
||||
//const autohide_animation_time = 0.3;
|
||||
|
||||
// Keep enums in sync with GSettings schemas
|
||||
const PositionMode = {
|
||||
LEFT: 0,
|
||||
RIGHT: 1
|
||||
};
|
||||
|
||||
const AutoHideEffect = {
|
||||
RESIZE: 0,
|
||||
RESCALE: 1
|
||||
};
|
||||
|
||||
let position = PositionMode.RIGHT;
|
||||
let dockicon_size = 48;
|
||||
let hideable = true;
|
||||
let hideDock = true;
|
||||
let hideEffect = AutoHideEffect.RESIZE;
|
||||
let autohide_animation_time = 0.3;
|
||||
const DND_RAISE_APP_TIMEOUT = 500;
|
||||
|
||||
/*************************************************************************************/
|
||||
/**** start resize's Dock functions *****************/
|
||||
/*************************************************************************************/
|
||||
function hideDock_size () {
|
||||
if (hideable){
|
||||
let monitor = Main.layoutManager.primaryMonitor
|
||||
let position_x = monitor.x;
|
||||
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
|
||||
Tweener.addTween(this,{
|
||||
_item_size: 1,
|
||||
time: autohide_animation_time,
|
||||
transition: 'easeOutQuad',
|
||||
onUpdate: function () {
|
||||
height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
width = this._item_size + 4*this._spacing;
|
||||
switch (position) {
|
||||
case PositionMode.LEFT:
|
||||
position_x=monitor.x-2*this._spacing;
|
||||
break;
|
||||
case PositionMode.RIGHT:
|
||||
default:
|
||||
position_x = monitor.x + (monitor.width-1-this._item_size-2*this._spacing);
|
||||
}
|
||||
this.actor.set_position (position_x,monitor.y+(monitor.height-height)/2);
|
||||
this.actor.set_size(width,height);
|
||||
},
|
||||
});
|
||||
hideDock=true;
|
||||
}
|
||||
}
|
||||
|
||||
function showDock_size () {
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
let position_x = monitor.x;
|
||||
|
||||
Tweener.addTween(this,{
|
||||
_item_size: dockicon_size,
|
||||
time: autohide_animation_time,
|
||||
transition: 'easeOutQuad',
|
||||
onUpdate: function () {
|
||||
height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
width = this._item_size + 4*this._spacing;
|
||||
switch (position) {
|
||||
case PositionMode.LEFT:
|
||||
position_x=monitor.x-2*this._spacing;
|
||||
break;
|
||||
case PositionMode.RIGHT:
|
||||
default:
|
||||
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
|
||||
}
|
||||
this.actor.set_position (position_x, monitor.y+(monitor.height-height)/2);
|
||||
this.actor.set_size(width,height);
|
||||
}
|
||||
});
|
||||
hideDock=false;
|
||||
}
|
||||
|
||||
function initShowDock_size () {
|
||||
this._item_size=1;
|
||||
this._showDock();
|
||||
}
|
||||
|
||||
function showEffectAddItem_size () {
|
||||
let primary = Main.layoutManager.primaryMonitor;
|
||||
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
|
||||
Tweener.addTween(this.actor, {
|
||||
y: primary.y + (primary.height-height)/2,
|
||||
height: height,
|
||||
width: width,
|
||||
time: autohide_animation_time,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
|
||||
/**************************************************************************************/
|
||||
/**** start rescale's Dock functions *****************/
|
||||
/**************************************************************************************/
|
||||
function hideDock_scale () {
|
||||
this._item_size = dockicon_size;
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
let cornerX = 0;
|
||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
|
||||
switch (position) {
|
||||
case PositionMode.LEFT:
|
||||
cornerX=monitor.x;
|
||||
break;
|
||||
case PositionMode.RIGHT:
|
||||
default:
|
||||
cornerX = monitor.x + monitor.width-1;
|
||||
}
|
||||
|
||||
if (hideable) {
|
||||
Tweener.addTween(this.actor,{
|
||||
y: monitor.y + (monitor.height-height)/2,
|
||||
x: cornerX,
|
||||
height:height,
|
||||
width: width,
|
||||
scale_x: 0.025,
|
||||
time: autohide_animation_time,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
hideDock=true;
|
||||
}
|
||||
}
|
||||
|
||||
function showDock_scale () {
|
||||
this._item_size = dockicon_size;
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
let position_x = monitor.x;
|
||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
|
||||
switch (position) {
|
||||
case PositionMode.LEFT:
|
||||
position_x=monitor.x-2*this._spacing;
|
||||
break;
|
||||
case PositionMode.RIGHT:
|
||||
default:
|
||||
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
|
||||
}
|
||||
Tweener.addTween(this.actor, {
|
||||
y: monitor.y + (monitor.height-height)/2,
|
||||
x: monitor.x + position_x,
|
||||
height: height,
|
||||
width: width,
|
||||
scale_x: 1,
|
||||
time: autohide_animation_time,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
hideDock=false;
|
||||
}
|
||||
|
||||
function initShowDock_scale () {
|
||||
let primary = Main.layoutManager.primaryMonitor;
|
||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
|
||||
this.actor.set_scale (0,0);
|
||||
this.actor.set_size (width,height);
|
||||
|
||||
// set the position of the dock
|
||||
switch (position) {
|
||||
case PositionMode.LEFT:
|
||||
this.actor.x = 0;
|
||||
// effect of creation of the dock
|
||||
Tweener.addTween(this.actor, {
|
||||
x: primary.x-2*this._spacing,
|
||||
y: primary.y + (primary.height-height)/2,
|
||||
time: autohide_animation_time * 3,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
break;
|
||||
case PositionMode.RIGHT:
|
||||
default:
|
||||
this.actor.x = primary.width-1;
|
||||
// effect of creation of the dock
|
||||
Tweener.addTween(this.actor, {
|
||||
x: primary.x + primary.width-this._item_size- 2*this._spacing,
|
||||
y: primary.y + (primary.height-height)/2,
|
||||
time: autohide_animation_time * 3,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
Tweener.addTween(this.actor,{
|
||||
scale_x: 1,
|
||||
scale_y: 1,
|
||||
time: autohide_animation_time * 3,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
hideDock=false;
|
||||
}
|
||||
|
||||
function showEffectAddItem_scale () {
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
|
||||
Tweener.addTween(this.actor, {
|
||||
y: monitor.y + (monitor.height-height)/2,
|
||||
height: height,
|
||||
width: width,
|
||||
time: autohide_animation_time,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
|
||||
function Dock() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
Dock.prototype = {
|
||||
_init : function() {
|
||||
this._placeholderText = null;
|
||||
this._menus = [];
|
||||
this._menuDisplays = [];
|
||||
|
||||
this._favorites = [];
|
||||
|
||||
// Load Settings
|
||||
this._settings = new Gio.Settings({ schema: DOCK_SETTINGS_SCHEMA });
|
||||
position = this._settings.get_enum(DOCK_POSITION_KEY);
|
||||
dockicon_size = this._settings.get_int(DOCK_SIZE_KEY);
|
||||
hideDock = hideable = this._settings.get_boolean(DOCK_HIDE_KEY);
|
||||
hideEffect = this._settings.get_enum(DOCK_EFFECTHIDE_KEY);
|
||||
autohide_animation_time = this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY);
|
||||
//global.log("POSITION: " + position);
|
||||
//global.log("dockicon_size: " + dockicon_size);
|
||||
|
||||
|
||||
this._spacing = 4;
|
||||
this._item_size = dockicon_size;
|
||||
this._nicons = 0;
|
||||
this._selectFunctionsHide ();
|
||||
|
||||
this.actor = new St.BoxLayout({ name: 'dock', vertical: true, reactive: true });
|
||||
|
||||
this._grid = new Shell.GenericContainer();
|
||||
this.actor.add(this._grid, { expand: true, y_align: St.Align.START });
|
||||
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||
|
||||
this._grid.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
|
||||
this._grid.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
|
||||
this._grid.connect('allocate', Lang.bind(this, this._allocate));
|
||||
|
||||
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
|
||||
|
||||
this._tracker = Shell.WindowTracker.get_default();
|
||||
this._appSystem = Shell.AppSystem.get_default();
|
||||
|
||||
this._installedChangedId = this._appSystem.connect('installed-changed', Lang.bind(this, this._queueRedisplay));
|
||||
this._appFavoritesChangedId = AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._queueRedisplay));
|
||||
this._appStateChangedId = this._appSystem.connect('app-state-changed', Lang.bind(this, this._queueRedisplay));
|
||||
|
||||
this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function() {
|
||||
this.actor.hide();
|
||||
}));
|
||||
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this, function() {
|
||||
this.actor.show();
|
||||
}));
|
||||
Main.layoutManager.addChrome(this.actor);
|
||||
this.actor.lower_bottom();
|
||||
|
||||
//hidden
|
||||
this._settings.connect('changed::'+DOCK_POSITION_KEY, Lang.bind(this, function (){
|
||||
if (!this._settings)
|
||||
return;
|
||||
|
||||
let primary = Main.layoutManager.primaryMonitor;
|
||||
position = this._settings.get_enum(DOCK_POSITION_KEY);
|
||||
this.actor.y=primary.y;
|
||||
this._redisplay();
|
||||
}));
|
||||
|
||||
this._settings.connect('changed::'+DOCK_SIZE_KEY, Lang.bind(this, function (){
|
||||
if (!this._settings)
|
||||
return;
|
||||
|
||||
dockicon_size = this._settings.get_int(DOCK_SIZE_KEY);
|
||||
this._redisplay();
|
||||
}));
|
||||
|
||||
this._settings.connect('changed::'+DOCK_HIDE_KEY, Lang.bind(this, function (){
|
||||
if (!this._settings)
|
||||
return;
|
||||
|
||||
hideable = this._settings.get_boolean(DOCK_HIDE_KEY);
|
||||
if (hideable){
|
||||
hideDock=false;
|
||||
this._hideDock();
|
||||
} else {
|
||||
hideDock=true;
|
||||
this._showDock();
|
||||
}
|
||||
}));
|
||||
|
||||
this._settings.connect('changed::'+DOCK_EFFECTHIDE_KEY, Lang.bind(this, function () {
|
||||
if (!this._settings)
|
||||
return;
|
||||
|
||||
hideEffect = this._settings.get_enum(DOCK_EFFECTHIDE_KEY);
|
||||
this.actor.y=0;
|
||||
|
||||
switch (hideEffect) {
|
||||
case AutoHideEffect.RESCALE:
|
||||
this._item_size=dockicon_size;
|
||||
break;
|
||||
case AutoHideEffect.RESIZE:
|
||||
this.actor.set_scale (1,1);
|
||||
}
|
||||
this.actor.disconnect(leave_event);
|
||||
this.actor.disconnect(enter_event);
|
||||
|
||||
this._selectFunctionsHide ();
|
||||
|
||||
leave_event = this.actor.connect('leave-event', Lang.bind(this, this._hideDock));
|
||||
enter_event = this.actor.connect('enter-event', Lang.bind(this, this._showDock));
|
||||
this._redisplay();
|
||||
}));
|
||||
|
||||
this._settings.connect('changed::'+DOCK_AUTOHIDE_ANIMATION_TIME_KEY, Lang.bind(this,function (){
|
||||
if (!this._settings)
|
||||
return;
|
||||
|
||||
autohide_animation_time = this._settings.get_double(DOCK_AUTOHIDE_ANIMATION_TIME_KEY);
|
||||
}));
|
||||
|
||||
this.actor.connect('leave-event', Lang.bind(this, this._hideDock));
|
||||
this.actor.connect('enter-event', Lang.bind(this, this._showDock));
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._installedChangedId) {
|
||||
this._appSystem.disconnect(this._installedChangedId);
|
||||
this._installedChangedId = 0;
|
||||
}
|
||||
|
||||
if (this._appFavoritesChangedId) {
|
||||
AppFavorites.getAppFavorites().disconnect(this._appFavoritesChangedId);
|
||||
this._appFavoritesChangedId = 0;
|
||||
}
|
||||
|
||||
if (this._appStateChangedId) {
|
||||
this._appSystem.disconnect(this._appStateChangedId);
|
||||
this._appStateChangedId = 0;
|
||||
}
|
||||
|
||||
if (this._overviewShowingId) {
|
||||
Main.overview.disconnect(this._overviewShowingId);
|
||||
this._overviewShowingId = 0;
|
||||
}
|
||||
|
||||
if (this._overviewHiddenId) {
|
||||
Main.overview.disconnect(this._overviewHiddenId);
|
||||
this._overviewHiddenId = 0;
|
||||
}
|
||||
|
||||
this.actor.destroy();
|
||||
|
||||
// Break reference cycles
|
||||
this._settings = null;
|
||||
this._appSystem = null;
|
||||
this._tracker = null;
|
||||
},
|
||||
|
||||
// fuctions hide
|
||||
_restoreHideDock: function(){
|
||||
hideable = this._settings.get_boolean(DOCK_HIDE_KEY);
|
||||
},
|
||||
|
||||
_disableHideDock: function (){
|
||||
hideable = false;
|
||||
},
|
||||
|
||||
_selectFunctionsHide: function () {
|
||||
switch (hideEffect) {
|
||||
case AutoHideEffect.RESCALE:
|
||||
this._hideDock = hideDock_scale;
|
||||
this._showDock = showDock_scale;
|
||||
this._initShowDock = initShowDock_scale;
|
||||
this._showEffectAddItem = showEffectAddItem_scale;
|
||||
break;
|
||||
case AutoHideEffect.RESIZE:
|
||||
default:
|
||||
this._hideDock = hideDock_size;
|
||||
this._showDock = showDock_size;
|
||||
this._initShowDock = initShowDock_size;
|
||||
this._showEffectAddItem = showEffectAddItem_size;
|
||||
}
|
||||
},
|
||||
|
||||
_appIdListToHash: function(apps) {
|
||||
let ids = {};
|
||||
for (let i = 0; i < apps.length; i++)
|
||||
ids[apps[i].get_id()] = apps[i];
|
||||
return ids;
|
||||
},
|
||||
|
||||
_queueRedisplay: function () {
|
||||
Main.queueDeferredWork(this._workId);
|
||||
},
|
||||
|
||||
_redisplay: function () {
|
||||
this.removeAll();
|
||||
|
||||
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
|
||||
|
||||
let running = this._appSystem.get_running();
|
||||
let runningIds = this._appIdListToHash(running);
|
||||
|
||||
let icons = 0;
|
||||
|
||||
let nFavorites = 0;
|
||||
for (let id in favorites) {
|
||||
let app = favorites[id];
|
||||
let display = new DockIcon(app,this);
|
||||
this.addItem(display.actor);
|
||||
nFavorites++;
|
||||
icons++;
|
||||
}
|
||||
|
||||
for (let i = 0; i < running.length; i++) {
|
||||
let app = running[i];
|
||||
if (app.get_id() in favorites)
|
||||
continue;
|
||||
let display = new DockIcon(app,this);
|
||||
icons++;
|
||||
this.addItem(display.actor);
|
||||
}
|
||||
this._nicons=icons;
|
||||
|
||||
if (this._placeholderText) {
|
||||
this._placeholderText.destroy();
|
||||
this._placeholderText = null;
|
||||
}
|
||||
|
||||
if (running.length == 0 && nFavorites == 0) {
|
||||
this._placeholderText = new St.Label({ text: _("Drag here to add favorites") });
|
||||
this.actor.add_actor(this._placeholderText);
|
||||
}
|
||||
|
||||
let primary = Main.layoutManager.primaryMonitor;
|
||||
let height = (icons)*(this._item_size + this._spacing) + 2*this._spacing;
|
||||
let width = this._item_size + 4*this._spacing;
|
||||
|
||||
if (this.actor.y != primary.y) {
|
||||
if (hideable && hideDock) {
|
||||
this._hideDock();
|
||||
} else {
|
||||
if (dockicon_size == this._item_size) {
|
||||
// only add/delete icon
|
||||
this._showEffectAddItem ();
|
||||
} else {
|
||||
// change size icon
|
||||
this._showDock ();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// effect of creation
|
||||
this._initShowDock ();
|
||||
}
|
||||
},
|
||||
|
||||
_getPreferredWidth: function (grid, forHeight, alloc) {
|
||||
alloc.min_size = this._item_size;
|
||||
alloc.natural_size = this._item_size + this._spacing;
|
||||
},
|
||||
|
||||
_getPreferredHeight: function (grid, forWidth, alloc) {
|
||||
let children = this._grid.get_children();
|
||||
let nRows = children.length;
|
||||
let totalSpacing = Math.max(0, nRows - 1) * this._spacing;
|
||||
let height = nRows * this._item_size + totalSpacing;
|
||||
alloc.min_size = height;
|
||||
alloc.natural_size = height;
|
||||
},
|
||||
|
||||
_allocate: function (grid, box, flags) {
|
||||
let children = this._grid.get_children();
|
||||
|
||||
let x = box.x1 + this._spacing;
|
||||
if (position == PositionMode.LEFT)
|
||||
x = box.x1 + 2*this._spacing;
|
||||
let y = box.y1 + this._spacing;
|
||||
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let childBox = new Clutter.ActorBox();
|
||||
childBox.x1 = x;
|
||||
childBox.y1 = y;
|
||||
childBox.x2 = childBox.x1 + this._item_size;
|
||||
childBox.y2 = childBox.y1 + this._item_size;
|
||||
children[i].allocate(childBox, flags);
|
||||
y += this._item_size + this._spacing;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
_onStyleChanged: function() {
|
||||
let themeNode = this.actor.get_theme_node();
|
||||
let [success, len] = themeNode.get_length('spacing', false);
|
||||
if (success)
|
||||
this._spacing = len;
|
||||
[success, len] = themeNode.get_length('-shell-grid-item-size', false);
|
||||
if (success)
|
||||
this._item_size = len;
|
||||
this._grid.queue_relayout();
|
||||
},
|
||||
|
||||
removeAll: function () {
|
||||
this._grid.get_children().forEach(Lang.bind(this, function (child) {
|
||||
child.destroy();
|
||||
}));
|
||||
},
|
||||
|
||||
addItem: function(actor) {
|
||||
this._grid.add_actor(actor);
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Dock.prototype);
|
||||
|
||||
function DockIcon(app, dock) {
|
||||
this._init(app, dock);
|
||||
}
|
||||
|
||||
DockIcon.prototype = {
|
||||
_init : function(app, dock) {
|
||||
this.app = app;
|
||||
this.actor = new St.Button({ style_class: 'dock-app',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO,
|
||||
reactive: true,
|
||||
x_fill: true,
|
||||
y_fill: true });
|
||||
this.actor._delegate = this;
|
||||
this.actor.set_size(dockicon_size, dockicon_size);
|
||||
|
||||
this._icon = this.app.create_icon_texture(dockicon_size);
|
||||
this.actor.set_child(this._icon);
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
|
||||
this._menu = null;
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
|
||||
this._has_focus = false;
|
||||
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
tracker.connect('notify::focus-app', Lang.bind(this, this._onStateChanged));
|
||||
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
this.actor.connect('notify::hover', Lang.bind(this, this._hoverChanged));
|
||||
|
||||
this._menuTimeoutId = 0;
|
||||
this._stateChangedId = this.app.connect('notify::state',
|
||||
Lang.bind(this, this._onStateChanged));
|
||||
this._onStateChanged();
|
||||
this._dock=dock;
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
if (this._stateChangedId > 0)
|
||||
this.app.disconnect(this._stateChangedId);
|
||||
this._stateChangedId = 0;
|
||||
this._removeMenuTimeout();
|
||||
},
|
||||
|
||||
_removeMenuTimeout: function() {
|
||||
if (this._menuTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._menuTimeoutId);
|
||||
this._menuTimeoutId = 0;
|
||||
}
|
||||
},
|
||||
|
||||
_hoverChanged: function(actor) {
|
||||
if (actor != this.actor)
|
||||
this._has_focus = false;
|
||||
else
|
||||
this._has_focus = true;
|
||||
return false;
|
||||
},
|
||||
|
||||
_onStateChanged: function() {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let focusedApp = tracker.focus_app;
|
||||
if (this.app.state != Shell.AppState.STOPPED) {
|
||||
this.actor.add_style_class_name('running');
|
||||
if (this.app == focusedApp) {
|
||||
this.actor.add_style_class_name('focused');
|
||||
} else {
|
||||
this.actor.remove_style_class_name('focused');
|
||||
}
|
||||
} else {
|
||||
this.actor.remove_style_class_name('focused');
|
||||
this.actor.remove_style_class_name('running');
|
||||
}
|
||||
},
|
||||
|
||||
_onButtonPress: function(actor, event) {
|
||||
let button = event.get_button();
|
||||
if (button == 1) {
|
||||
this._removeMenuTimeout();
|
||||
this._menuTimeoutId = Mainloop.timeout_add(AppDisplay.MENU_POPUP_TIMEOUT, Lang.bind(this, function() {
|
||||
this.popupMenu();
|
||||
}));
|
||||
} else if (button == 3) {
|
||||
this.popupMenu();
|
||||
}
|
||||
},
|
||||
|
||||
_onClicked: function(actor, button) {
|
||||
this._removeMenuTimeout();
|
||||
|
||||
if (button == 1) {
|
||||
this._onActivate(Clutter.get_current_event());
|
||||
} else if (button == 2) {
|
||||
// Last workspace is always empty
|
||||
let launchWorkspace = global.screen.get_workspace_by_index(global.screen.n_workspaces - 1);
|
||||
launchWorkspace.activate(global.get_current_time());
|
||||
this.emit('launching');
|
||||
this.app.open_new_window(-1);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
getId: function() {
|
||||
return this.app.get_id();
|
||||
},
|
||||
|
||||
popupMenu: function() {
|
||||
this._removeMenuTimeout();
|
||||
this.actor.fake_release();
|
||||
|
||||
this._dock._disableHideDock();
|
||||
|
||||
if (!this._menu) {
|
||||
this._menu = new DockIconMenu(this);
|
||||
this._menu.connect('activate-window', Lang.bind(this, function (menu, window) {
|
||||
this.activateWindow(window);
|
||||
}));
|
||||
this._menu.connect('popup', Lang.bind(this, function (menu, isPoppedUp) {
|
||||
if (!isPoppedUp){
|
||||
//Restore value of autohidedock
|
||||
this._dock._restoreHideDock();
|
||||
this._dock._hideDock();
|
||||
|
||||
this._onMenuPoppedDown();
|
||||
}
|
||||
}));
|
||||
|
||||
this._menuManager.addMenu(this._menu, true);
|
||||
}
|
||||
|
||||
this._menu.popup();
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
activateWindow: function(metaWindow) {
|
||||
if (metaWindow) {
|
||||
this._didActivateWindow = true;
|
||||
Main.activateWindow(metaWindow);
|
||||
}
|
||||
},
|
||||
|
||||
setSelected: function (isSelected) {
|
||||
this._selected = isSelected;
|
||||
if (this._selected)
|
||||
this.actor.add_style_class_name('selected');
|
||||
else
|
||||
this.actor.remove_style_class_name('selected');
|
||||
},
|
||||
|
||||
_onMenuPoppedDown: function() {
|
||||
this.actor.sync_hover();
|
||||
},
|
||||
|
||||
_getRunning: function() {
|
||||
return this.app.state != Shell.AppState.STOPPED;
|
||||
},
|
||||
|
||||
_onActivate: function (event) {
|
||||
this.emit('launching');
|
||||
let modifiers = Shell.get_event_state(event);
|
||||
|
||||
if (modifiers & Clutter.ModifierType.CONTROL_MASK
|
||||
&& this.app.state == Shell.AppState.RUNNING) {
|
||||
let current_workspace = global.screen.get_active_workspace().index();
|
||||
this.app.open_new_window(current_workspace);
|
||||
} else {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let focusedApp = tracker.focus_app;
|
||||
|
||||
if (this.app == focusedApp) {
|
||||
let windows = this.app.get_windows();
|
||||
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.minimize();
|
||||
}
|
||||
} else {
|
||||
this.app.activate(-1);
|
||||
}
|
||||
}
|
||||
Main.overview.hide();
|
||||
},
|
||||
|
||||
shellWorkspaceLaunch : function() {
|
||||
this.app.open_new_window();
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(DockIcon.prototype);
|
||||
|
||||
function DockIconMenu(source) {
|
||||
this._init(source);
|
||||
}
|
||||
|
||||
DockIconMenu.prototype = {
|
||||
__proto__: AppDisplay.AppIconMenu.prototype,
|
||||
|
||||
_init: function(source) {
|
||||
switch (position) {
|
||||
case PositionMode.LEFT:
|
||||
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, St.Align.MIDDLE, St.Side.LEFT, 0);
|
||||
break;
|
||||
case PositionMode.RIGHT:
|
||||
default:
|
||||
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, St.Align.MIDDLE, St.Side.RIGHT, 0);
|
||||
}
|
||||
|
||||
this._source = source;
|
||||
|
||||
this.connect('activate', Lang.bind(this, this._onActivate));
|
||||
this.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
||||
|
||||
this.actor.add_style_class_name('dock-menu');
|
||||
|
||||
// Chain our visibility and lifecycle to that of the source
|
||||
source.actor.connect('notify::mapped', Lang.bind(this, function () {
|
||||
if (!source.actor.mapped)
|
||||
this.close();
|
||||
}));
|
||||
source.actor.connect('destroy', Lang.bind(this, function () { this.actor.destroy(); }));
|
||||
|
||||
Main.layoutManager.addChrome(this.actor);
|
||||
},
|
||||
|
||||
_redisplay: function() {
|
||||
this.removeAll();
|
||||
|
||||
let windows = this._source.app.get_windows();
|
||||
|
||||
// Display the app windows menu items and the separator between windows
|
||||
// of the current desktop and other windows.
|
||||
let activeWorkspace = global.screen.get_active_workspace();
|
||||
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
|
||||
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
if (!separatorShown && windows[i].get_workspace() != activeWorkspace) {
|
||||
this._appendSeparator();
|
||||
separatorShown = true;
|
||||
}
|
||||
let item = this._appendMenuItem(windows[i].title);
|
||||
item._window = windows[i];
|
||||
}
|
||||
|
||||
if (windows.length > 0)
|
||||
this._appendSeparator();
|
||||
|
||||
let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id());
|
||||
|
||||
this._newWindowMenuItem = windows.length > 0 ? this._appendMenuItem(_("New Window")) : null;
|
||||
|
||||
this._quitAppMenuItem = windows.length >0 ? this._appendMenuItem(_("Quit Application")) : null;
|
||||
|
||||
if (windows.length > 0)
|
||||
this._appendSeparator();
|
||||
this._toggleFavoriteMenuItem = this._appendMenuItem(isFavorite ?
|
||||
_("Remove from Favorites")
|
||||
: _("Add to Favorites"));
|
||||
|
||||
this._highlightedItem = null;
|
||||
},
|
||||
|
||||
_onActivate: function (actor, child) {
|
||||
if (child._window) {
|
||||
let metaWindow = child._window;
|
||||
this.emit('activate-window', metaWindow);
|
||||
} else if (child == this._newWindowMenuItem) {
|
||||
let current_workspace = global.screen.get_active_workspace().index();
|
||||
this._source.app.open_new_window(current_workspace);
|
||||
this.emit('activate-window', null);
|
||||
} else if (child == this._quitAppMenuItem) {
|
||||
this._source.app.request_quit();
|
||||
} else if (child == this._toggleFavoriteMenuItem) {
|
||||
let favs = AppFavorites.getAppFavorites();
|
||||
let isFavorite = favs.isFavorite(this._source.app.get_id());
|
||||
if (isFavorite)
|
||||
favs.removeFavorite(this._source.app.get_id());
|
||||
else
|
||||
favs.addFavorite(this._source.app.get_id());
|
||||
}
|
||||
this.close();
|
||||
}
|
||||
}
|
||||
|
||||
function init(extensionMeta) {
|
||||
imports.gettext.bindtextdomain('gnome-shell-extensions', extensionMeta.localedir);
|
||||
}
|
||||
|
||||
let dock;
|
||||
|
||||
function enable() {
|
||||
dock = new Dock();
|
||||
}
|
||||
|
||||
function disable() {
|
||||
dock.destroy();
|
||||
dock = null;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"uuid": "@uuid@",
|
||||
"name": "Dock",
|
||||
"description": "A dock for the GNOME Shell -- displays favorite and running applications",
|
||||
"original-author": "tclaesson@gmail.com",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"url": "@url@"
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<enum id='org.gnome.shell.extensions.dock.PositionMode'>
|
||||
<value nick='left' value='0'/>
|
||||
<value nick='right' value='1'/>
|
||||
</enum>
|
||||
<enum id='org.gnome.shell.extensions.dock.AutoHideEfect'>
|
||||
<value nick='resize' value='0'/>
|
||||
<value nick='rescale' value='1'/>
|
||||
</enum>
|
||||
|
||||
<schema id="org.gnome.shell.extensions.dock" path="/org/gnome/shell/extensions/dock/">
|
||||
<key name="position" enum="org.gnome.shell.extensions.dock.PositionMode">
|
||||
<default>'right'</default>
|
||||
<_summary>Position of the dock</_summary>
|
||||
<_description>Sets the position of the dock in the screen. Allowed values are 'right' or 'left'</_description>
|
||||
</key>
|
||||
<key name="size" type="i">
|
||||
<default>48</default>
|
||||
<_summary>Icon size</_summary>
|
||||
<_description>Sets icon size of the dock.</_description>
|
||||
</key>
|
||||
<key name="autohide" type="b">
|
||||
<default>true</default>
|
||||
<_summary>Enable/disable autohide</_summary>
|
||||
</key>
|
||||
<key name="hide-effect" enum="org.gnome.shell.extensions.dock.AutoHideEfect">
|
||||
<default>'resize'</default>
|
||||
<_summary>Autohide effect</_summary>
|
||||
<_description>Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'</_description>
|
||||
</key>
|
||||
<key name="hide-effect-duration" type="d">
|
||||
<default>0.3</default>
|
||||
<_summary>Autohide duration</_summary>
|
||||
<_description>Sets the time duration of the autohide effect.</_description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
@@ -1,54 +0,0 @@
|
||||
#dock {
|
||||
border-radius: 9px;
|
||||
background-color: rgba(0,0,0,0.9);
|
||||
border-width: 2px;
|
||||
border-color: #5f5f5f;
|
||||
}
|
||||
/* Panel */
|
||||
.dock-app {
|
||||
padding: 4px;
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
border-radius: 4px;
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.dock-app.running {
|
||||
padding: 3px;
|
||||
border: 1px solid #181818;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: #3d3d3d;
|
||||
background-gradient-end: #181818;
|
||||
}
|
||||
|
||||
.dock-app.selected {
|
||||
padding: 3px;
|
||||
border: 1px solid #666666;
|
||||
}
|
||||
|
||||
.dock-app.focused {
|
||||
padding: 3px;
|
||||
border: 1px solid #5f5f5f;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: rgba(61,61,61,0.8);
|
||||
background-gradient-end: rgba(24,24,24,0.2);
|
||||
}
|
||||
|
||||
.dock-app:hover {
|
||||
padding: 3px;
|
||||
border: 1px solid #666666;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: rgba(61,61,61,0.8);
|
||||
background-gradient-end: rgba(24,24,24,0.2);
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.dock-app:active {
|
||||
padding: 3px;
|
||||
background-color: #1e1e1e;
|
||||
border: 1px solid #5f5f5f;
|
||||
}
|
||||
|
||||
.dock-menu {
|
||||
font-size: 12px
|
||||
}
|
||||
@@ -11,24 +11,26 @@ const Main = imports.ui.main;
|
||||
const Panel = imports.ui.panel;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||
|
||||
function DriveMenuItem(place) {
|
||||
this._init(place);
|
||||
}
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
DriveMenuItem.prototype = {
|
||||
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
|
||||
const MountMenuItem = new Lang.Class({
|
||||
Name: 'DriveMenu.MountMenuItem',
|
||||
Extends: PopupMenu.PopupBaseMenuItem,
|
||||
|
||||
_init: function(place) {
|
||||
PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
|
||||
_init: function(mount) {
|
||||
this.parent();
|
||||
|
||||
this.place = place;
|
||||
|
||||
this.label = new St.Label({ text: place.name });
|
||||
this.label = new St.Label({ text: mount.get_name() });
|
||||
this.addActor(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
|
||||
let ejectIcon = new St.Icon({ icon_name: 'media-eject',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
this.mount = mount;
|
||||
|
||||
let ejectIcon = new St.Icon({ icon_name: 'media-eject-symbolic',
|
||||
style_class: 'popup-menu-icon ' });
|
||||
let ejectButton = new St.Button({ child: ejectIcon });
|
||||
ejectButton.connect('clicked', Lang.bind(this, this._eject));
|
||||
@@ -36,62 +38,140 @@ DriveMenuItem.prototype = {
|
||||
},
|
||||
|
||||
_eject: function() {
|
||||
this.place.remove();
|
||||
let mountOp = new ShellMountOperation.ShellMountOperation(this.mount);
|
||||
|
||||
if (this.mount.can_eject())
|
||||
this.mount.eject_with_operation(Gio.MountUnmountFlags.NONE,
|
||||
mountOp.mountOp,
|
||||
null, // Gio.Cancellable
|
||||
Lang.bind(this, this._ejectFinish));
|
||||
else
|
||||
this.mount.unmount_with_operation(Gio.MountUnmountFlags.NONE,
|
||||
mountOp.mountOp,
|
||||
null, // Gio.Cancellable
|
||||
Lang.bind(this, this._unmountFinish));
|
||||
},
|
||||
|
||||
_unmountFinish: function(mount, result) {
|
||||
try {
|
||||
mount.unmount_with_operation_finish(result);
|
||||
} catch(e) {
|
||||
this._reportFailure(e);
|
||||
}
|
||||
},
|
||||
|
||||
_ejectFinish: function(mount, result) {
|
||||
try {
|
||||
mount.eject_with_operation_finish(result);
|
||||
} catch(e) {
|
||||
this._reportFailure(e);
|
||||
}
|
||||
},
|
||||
|
||||
_reportFailure: function(exception) {
|
||||
let msg = _("Ejecting drive '%s' failed:").format(this.mount.get_name());
|
||||
Main.notifyError(msg, exception.message);
|
||||
},
|
||||
|
||||
activate: function(event) {
|
||||
this.place.launch({ timestamp: event.get_time() });
|
||||
Gio.AppInfo.launch_default_for_uri(this.mount.get_root().get_uri(),
|
||||
global.create_app_launch_context());
|
||||
|
||||
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event);
|
||||
this.parent(event);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
function DriveMenu() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
DriveMenu.prototype = {
|
||||
__proto__: PanelMenu.SystemStatusButton.prototype,
|
||||
const DriveMenu = new Lang.Class({
|
||||
Name: 'DriveMenu.DriveMenu',
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
// is 'media-eject' better?
|
||||
PanelMenu.SystemStatusButton.prototype._init.call(this, 'media-optical');
|
||||
this.parent('media-eject-symbolic', _("Removable devices"));
|
||||
|
||||
this._manager = Main.placesManager;
|
||||
this._manager.connect('mounts-updated', Lang.bind(this, this._update));
|
||||
this._monitor = Gio.VolumeMonitor.get();
|
||||
this._addedId = this._monitor.connect('mount-added', Lang.bind(this, function(monitor, mount) {
|
||||
this._addMount(mount);
|
||||
this._updateMenuVisibility();
|
||||
}));
|
||||
this._removedId = this._monitor.connect('mount-removed', Lang.bind(this, function(monitor, mount) {
|
||||
this._removeMount(mount);
|
||||
this._updateMenuVisibility();
|
||||
}));
|
||||
|
||||
this._contentSection = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(this._contentSection);
|
||||
this._mounts = [ ];
|
||||
|
||||
this._update();
|
||||
this._monitor.get_mounts().forEach(Lang.bind(this, this._addMount));
|
||||
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addAction(_("Open file manager"), function(event) {
|
||||
this.menu.addAction(_("Open File"), function(event) {
|
||||
let appSystem = Shell.AppSystem.get_default();
|
||||
let app = appSystem.lookup_app('nautilus.desktop');
|
||||
app.activate_full(-1, event.get_time());
|
||||
});
|
||||
|
||||
this._updateMenuVisibility();
|
||||
},
|
||||
|
||||
_update: function() {
|
||||
this._contentSection.removeAll();
|
||||
_updateMenuVisibility: function() {
|
||||
if (this._mounts.length > 0)
|
||||
this.actor.show();
|
||||
else
|
||||
this.actor.hide();
|
||||
},
|
||||
|
||||
let mounts = this._manager.getMounts();
|
||||
let any = false;
|
||||
for (let i = 0; i < mounts.length; i++) {
|
||||
if (mounts[i].isRemovable()) {
|
||||
this._contentSection.addMenuItem(new DriveMenuItem(mounts[i]));
|
||||
any = true;
|
||||
_isMountInteresting: function(mount) {
|
||||
if (!mount.can_eject() && !mount.can_unmount())
|
||||
return false;
|
||||
|
||||
let volume = mount.get_volume();
|
||||
|
||||
if (volume == null) {
|
||||
// probably a GDaemonMount, could be network or
|
||||
// local, but we can't tell; assume it's local for now
|
||||
return true;
|
||||
}
|
||||
|
||||
return volume.get_identifier('class') != 'network';
|
||||
},
|
||||
|
||||
_addMount: function(mount) {
|
||||
if (!this._isMountInteresting(mount))
|
||||
return;
|
||||
|
||||
let item = new MountMenuItem(mount);
|
||||
this._mounts.unshift(item);
|
||||
this.menu.addMenuItem(item, 0);
|
||||
},
|
||||
|
||||
_removeMount: function(mount) {
|
||||
if (!this._isMountInteresting(mount))
|
||||
return;
|
||||
|
||||
for (let i = 0; i < this._mounts.length; i++) {
|
||||
let item = this._mounts[i];
|
||||
if (item.mount == mount) {
|
||||
item.destroy();
|
||||
this._mounts.splice(i, 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
this.actor.visible = any;
|
||||
log ('Removing a mount that was never added to the menu');
|
||||
},
|
||||
}
|
||||
|
||||
// Put your extension initialization code here
|
||||
function init(metadata) {
|
||||
imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir);
|
||||
destroy: function() {
|
||||
if (this._connectedId) {
|
||||
this._monitor.disconnect(this._connectedId);
|
||||
this._monitor.disconnect(this._disconnectedId);
|
||||
this._connectedId = 0;
|
||||
this._disconnectedId = 0;
|
||||
}
|
||||
|
||||
this.parent();
|
||||
},
|
||||
});
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
let _indicator;
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Removable Drive Menu",
|
||||
"description": "A status menu for accessing and unmounting removable devices",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
EXTENSION_ID = example
|
||||
|
||||
EXTRA_MODULES = prefs.js
|
||||
|
||||
include ../../extension.mk
|
||||
include ../../settings.mk
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
// Sample extension code, makes clicking on the panel show a message
|
||||
const St = imports.gi.St;
|
||||
const Mainloop = imports.mainloop;
|
||||
@@ -7,19 +8,26 @@ const _ = Gettext.gettext;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
function _showHello() {
|
||||
let text = new St.Label({ style_class: 'helloworld-label', text: _("Hello, world!") });
|
||||
let settings = Convenience.getSettings();
|
||||
let text = settings.get_string('hello-text') || _("Hello, world!");
|
||||
|
||||
let label = new St.Label({ style_class: 'helloworld-label', text: text });
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
global.stage.add_actor(text);
|
||||
text.set_position(Math.floor (monitor.width / 2 - text.width / 2), Math.floor(monitor.height / 2 - text.height / 2));
|
||||
Mainloop.timeout_add(3000, function () { text.destroy(); });
|
||||
global.stage.add_actor(label);
|
||||
label.set_position(Math.floor (monitor.width / 2 - label.width / 2), Math.floor(monitor.height / 2 - label.height / 2));
|
||||
Mainloop.timeout_add(3000, function () { label.destroy(); });
|
||||
}
|
||||
|
||||
// Put your extension initialization code here
|
||||
function init(metadata) {
|
||||
log ('Example extension initalized');
|
||||
|
||||
imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir);
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
let signalId;
|
||||
@@ -38,4 +46,4 @@ function disable() {
|
||||
Main.panel.actor.disconnect(signalId);
|
||||
signalId = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Hello, World!",
|
||||
"description": "An example extension to show how it works. Shows Hello, world when clicking on the top panel.",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<schema id="org.gnome.shell.extensions.example" path="/org/gnome/shell/extensions/example/">
|
||||
<key name="hello-text" type="s">
|
||||
<default>''</default>
|
||||
<_summary>Alternative greeting text.</_summary>
|
||||
<_description>If not empty, it contains the text that will be shown when clicking on the panel.</_description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
52
extensions/example/prefs.js
Normal file
52
extensions/example/prefs.js
Normal file
@@ -0,0 +1,52 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
const ExamplePrefsWidget = new GObject.Class({
|
||||
Name: 'Example.Prefs.Widget',
|
||||
GTypeName: 'ExamplePrefsWidget',
|
||||
Extends: Gtk.Grid,
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
this.margin = this.row_spacing = this.column_spacing = 10;
|
||||
|
||||
// TRANSLATORS: Example is the name of the extension, should not be
|
||||
// translated
|
||||
let primaryText = _("Example aims to show how to build well behaved \
|
||||
extensions for the Shell and as such it has little functionality on its own.\n\
|
||||
Nevertheless it's possible to customize the greeting message.");
|
||||
|
||||
this.attach(new Gtk.Label({ label: primaryText, wrap: true }), 0, 0, 2, 1);
|
||||
|
||||
this.attach(new Gtk.Label({ label: '<b>' + _("Message:") + '</b>', use_markup: true }),
|
||||
0, 1, 1, 1);
|
||||
|
||||
let entry = new Gtk.Entry({ hexpand: true });
|
||||
this.attach(entry, 1, 1, 1, 1);
|
||||
|
||||
this._settings = Convenience.getSettings();
|
||||
this._settings.bind('hello-text', entry, 'text', Gio.SettingsBindFlags.DEFAULT);
|
||||
}
|
||||
});
|
||||
|
||||
function buildPrefsWidget() {
|
||||
let widget = new ExamplePrefsWidget();
|
||||
widget.show_all();
|
||||
|
||||
return widget;
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
EXTENSION_ID = gajim
|
||||
|
||||
include ../../extension.mk
|
||||
@@ -1,340 +0,0 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const DBus = imports.dbus;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
const Tp = imports.gi.TelepathyGLib;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Mainloop = imports.mainloop;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const Shell = imports.gi.Shell;
|
||||
const TelepathyClient = imports.ui.telepathyClient;
|
||||
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
// http://ntt.cc/ext/base64-Encoding-Decoding.html
|
||||
const keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
|
||||
function decode64(input) {
|
||||
let output = "";
|
||||
let chr1, chr2, chr3;
|
||||
let enc1, enc2, enc3, enc4;
|
||||
let i = 0;
|
||||
|
||||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
||||
|
||||
do {
|
||||
enc1 = keyStr.indexOf(input.charAt(i++));
|
||||
enc2 = keyStr.indexOf(input.charAt(i++));
|
||||
enc3 = keyStr.indexOf(input.charAt(i++));
|
||||
enc4 = keyStr.indexOf(input.charAt(i++));
|
||||
|
||||
chr1 = (enc1 << 2) | (enc2 >> 4);
|
||||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
||||
chr3 = ((enc3 & 3) << 6) | enc4;
|
||||
|
||||
output = output + String.fromCharCode(chr1);
|
||||
|
||||
if (enc3 != 64) {
|
||||
output = output + String.fromCharCode(chr2);
|
||||
}
|
||||
if (enc4 != 64) {
|
||||
output = output + String.fromCharCode(chr3);
|
||||
}
|
||||
|
||||
chr1 = chr2 = chr3 = "";
|
||||
enc1 = enc2 = enc3 = enc4 = "";
|
||||
|
||||
} while (i < input.length);
|
||||
|
||||
return unescape(output);
|
||||
}
|
||||
|
||||
function wrappedText(text, sender, timestamp, direction) {
|
||||
if (!timestamp)
|
||||
timestamp = (Date.now() / 1000);
|
||||
return {
|
||||
messageType: Tp.ChannelTextMessageType.NORMAL,
|
||||
text: text,
|
||||
sender: sender,
|
||||
timestamp: timestamp,
|
||||
direction: direction
|
||||
};
|
||||
}
|
||||
|
||||
function Source(gajimClient, accountName, author, initialMessage) {
|
||||
this._init(gajimClient, accountName, author, initialMessage);
|
||||
}
|
||||
|
||||
Source.prototype = {
|
||||
__proto__: MessageTray.Source.prototype,
|
||||
|
||||
_init: function(gajimClient, accountName, author, initialMessage) {
|
||||
MessageTray.Source.prototype._init.call(this, author);
|
||||
this.isChat = true;
|
||||
this._author = author;
|
||||
this._gajimClient = gajimClient;
|
||||
this._accountName = accountName;
|
||||
this._initialMessage = initialMessage;
|
||||
this._iconUri = null;
|
||||
this._presence = "online";
|
||||
|
||||
this._notification = new TelepathyClient.ChatNotification(this);
|
||||
this._notification.setUrgency(MessageTray.Urgency.HIGH);
|
||||
|
||||
let jid = author.split('/')[0];
|
||||
let proxy = this._gajimClient.proxy();
|
||||
proxy.contact_infoRemote(jid, Lang.bind(this, this._gotContactInfos));
|
||||
this._statusChangeId = proxy.connect('ContactStatus',
|
||||
Lang.bind(this, this._onStatusChange));
|
||||
this._contactAbsenceId = proxy.connect('ContactAbsence',
|
||||
Lang.bind(this, this._onStatusChange));
|
||||
this._chatStateId = proxy.connect('ChatState',
|
||||
Lang.bind(this, this._onChatState));
|
||||
this._messageSentId = proxy.connect('MessageSent',
|
||||
Lang.bind(this, this._messageSent));
|
||||
this._newMessageId = proxy.connect('NewMessage',
|
||||
Lang.bind(this, this._messageReceived));
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
let proxy = this._gajimClient.proxy();
|
||||
proxy.disconnect(this._statusChangeId);
|
||||
proxy.disconnect(this._contactAbsenceId);
|
||||
proxy.disconnect(this._chatStateId);
|
||||
proxy.disconnect(this._messageSentId);
|
||||
proxy.disconnect(this._newMessageId);
|
||||
MessageTray.Source.prototype.destroy.call(this);
|
||||
},
|
||||
|
||||
_gotContactInfos: function(result, excp) {
|
||||
this.title = result['FN'];
|
||||
|
||||
let avatarUri = null;
|
||||
if (result['PHOTO']) {
|
||||
let mimeType = result['PHOTO']['TYPE'];
|
||||
let avatarData = decode64(result['PHOTO']['BINVAL']);
|
||||
let sha = result['PHOTO']['SHA'];
|
||||
avatarUri = this._gajimClient.cacheAvatar(mimeType, sha, avatarData);
|
||||
}
|
||||
|
||||
this._iconUri = avatarUri;
|
||||
this._setSummaryIcon(this.createNotificationIcon());
|
||||
|
||||
let message = wrappedText(this._initialMessage, this._author, null, TelepathyClient.NotificationDirection.RECEIVED);
|
||||
this._notification.appendMessage(message, false);
|
||||
|
||||
if (!Main.messageTray.contains(this))
|
||||
Main.messageTray.add(this);
|
||||
|
||||
this.notify(this._notification);
|
||||
},
|
||||
|
||||
createNotificationIcon: function() {
|
||||
let iconBox = new St.Bin({ style_class: 'avatar-box' });
|
||||
iconBox._size = this.ICON_SIZE;
|
||||
|
||||
if (!this._iconUri) {
|
||||
iconBox.child = new St.Icon({ icon_name: 'avatar-default',
|
||||
icon_type: St.IconType.FULLCOLOR,
|
||||
icon_size: iconBox._size });
|
||||
} else {
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
iconBox.child = textureCache.load_uri_async(this._iconUri, iconBox._size, iconBox._size);
|
||||
}
|
||||
return iconBox;
|
||||
},
|
||||
|
||||
open: function(notification) {
|
||||
// Lookup for the messages window and display it. In the case where it's not o
|
||||
// opened yet fallback to the roster window.
|
||||
let windows = global.get_window_actors();
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let metaWindow = windows[i].metaWindow;
|
||||
if (metaWindow.get_wm_class_instance() == "gajim" &&
|
||||
metaWindow.get_role() == "messages") {
|
||||
Main.activateWindow(metaWindow);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let app = Shell.AppSystem.get_default().lookup_app('gajim.desktop');
|
||||
app.activate(-1);
|
||||
},
|
||||
|
||||
_onChatState: function(emitter, data) {
|
||||
let chatstate = data[1][5];
|
||||
if (chatstate == 'gone')
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
setChatState: function(state) {
|
||||
// Gajim DBUS API doesn't support sending chatstate yet.
|
||||
},
|
||||
|
||||
_messageReceived: function(emitter, data) {
|
||||
let author = data[1][0];
|
||||
let text = data[1][1];
|
||||
if (text && (author == this._author)) {
|
||||
let message = wrappedText(text, this._author, null, TelepathyClient.NotificationDirection.RECEIVED);
|
||||
this._notification.appendMessage(message, false);
|
||||
this.notify(this._notification);
|
||||
}
|
||||
},
|
||||
|
||||
_messageSent: function(emitter, data) {
|
||||
let recipient = data[1][0];
|
||||
let text = data[1][1];
|
||||
let chatstate = data[1][3];
|
||||
|
||||
if (text && (recipient == this._author)) {
|
||||
let message = wrappedText(text, this._author, null, TelepathyClient.NotificationDirection.SENT);
|
||||
this._notification.appendMessage(message, false);
|
||||
} else if (chatstate == 'gone')
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
notify: function() {
|
||||
|
||||
MessageTray.Source.prototype.notify.call(this, this._notification);
|
||||
},
|
||||
|
||||
respond: function(text) {
|
||||
let jid = this._author;
|
||||
let keyID = ""; // unencrypted.
|
||||
this._gajimClient.proxy().send_chat_messageRemote(jid, text, keyID, this._accountName);
|
||||
},
|
||||
|
||||
_onStatusChange: function(emitter, data) {
|
||||
if (!this.title)
|
||||
return;
|
||||
|
||||
let jid = data[1][0];
|
||||
let presence = data[1][1];
|
||||
let message = data[1][2];
|
||||
|
||||
if (jid != this._author.split('/')[0])
|
||||
return;
|
||||
|
||||
let presenceMessage, shouldNotify, title;
|
||||
title = GLib.markup_escape_text(this.title, -1);
|
||||
if (presence == "away") {
|
||||
presenceMessage = _("%s is away.").format(title);
|
||||
shouldNotify = false;
|
||||
} else if (presence == "offline") {
|
||||
presenceMessage = _("%s is offline.").format(title);
|
||||
shouldNotify = (this._presence != "offline");
|
||||
} else if (presence == "online") {
|
||||
presenceMessage = _("%s is online.").format(title);
|
||||
shouldNotify = (this._presence == "offline");
|
||||
} else if (presence == "dnd") {
|
||||
presenceMessage = _("%s is busy.").format(title);
|
||||
shouldNotify = false;
|
||||
} else
|
||||
return;
|
||||
|
||||
this._presence = presence;
|
||||
|
||||
if (message)
|
||||
presenceMessage += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
|
||||
|
||||
this._notification.appendPresence(presenceMessage, shouldNotify);
|
||||
if (shouldNotify)
|
||||
this.notify(this._notification);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const GajimIface = {
|
||||
name: 'org.gajim.dbus.RemoteInterface',
|
||||
properties: [],
|
||||
methods: [{ name: 'send_chat_message', inSignature: 'ssss', outSignature: 'b'},
|
||||
{ name: 'contact_info', inSignature: 's', outSignature: 'a{sv}'}],
|
||||
signals: [{ name: 'NewMessage', inSignature: 'av' },
|
||||
{ name: 'ChatState', inSignature: 'av' },
|
||||
{ name: 'ContactStatus', inSignature: 'av' },
|
||||
{ name: 'ContactAbsence', inSignature: 'av' },
|
||||
{ name: 'MessageSent', inSignature: 'av' }]
|
||||
};
|
||||
|
||||
let Gajim = DBus.makeProxyClass(GajimIface);
|
||||
|
||||
function GajimClient() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
GajimClient.prototype = {
|
||||
_init: function() {
|
||||
this._sources = {};
|
||||
},
|
||||
|
||||
proxy : function() {
|
||||
return this._proxy;
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
this._cacheDir = GLib.get_user_cache_dir() + '/gnome-shell/gajim-avatars';
|
||||
let dir = Gio.file_new_for_path(this._cacheDir);
|
||||
if (!dir.query_exists(null)) {
|
||||
GLib.mkdir_with_parents(this._cacheDir, 0x1c0); // 0x1c0 = octal 0700
|
||||
}
|
||||
|
||||
this._proxy = new Gajim(DBus.session, 'org.gajim.dbus', '/org/gajim/dbus/RemoteObject');
|
||||
this._newMessageId = this._proxy.connect('NewMessage', Lang.bind(this, this._messageReceived));
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
if (this._newMessageId) {
|
||||
this._proxy.disconnect(this._newMessageId);
|
||||
this._newMessageId = 0;
|
||||
}
|
||||
this._proxy = null;
|
||||
|
||||
for (let id in this._sources)
|
||||
this._sources[id].destroy();
|
||||
|
||||
this._sources = { };
|
||||
},
|
||||
|
||||
_messageReceived : function(emitter, data) {
|
||||
let author = data[1][0];
|
||||
let message = data[1][1];
|
||||
let account = data[0];
|
||||
let source = this._sources[author];
|
||||
if (!source) {
|
||||
source = new Source(this, account, author, message);
|
||||
source.connect('destroy', Lang.bind(this,
|
||||
function() {
|
||||
delete this._sources[author];
|
||||
}));
|
||||
this._sources[author] = source;
|
||||
}
|
||||
},
|
||||
|
||||
cacheAvatar : function(mimeType, sha, avatarData) {
|
||||
let ext = mimeType.split('/')[1];
|
||||
let file = this._cacheDir + '/' + sha + '.' + ext;
|
||||
let uri = GLib.filename_to_uri(file, null);
|
||||
|
||||
if (GLib.file_test(file, GLib.FileTest.EXISTS))
|
||||
return uri;
|
||||
|
||||
let success = false;
|
||||
try {
|
||||
success = GLib.file_set_contents(file, avatarData, avatarData.length);
|
||||
} catch (e) {
|
||||
logError(e, 'Error caching avatar data');
|
||||
}
|
||||
return uri;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
function init() {
|
||||
return new GajimClient();
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"uuid": "@uuid@",
|
||||
"name": "Gajim IM integration",
|
||||
"description": "Display Gajim incoming chats as notifications in the Shell message tray.",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"url": "http://base-art.net"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
/* none used */
|
||||
3
extensions/launch-new-instance/Makefile.am
Normal file
3
extensions/launch-new-instance/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
EXTENSION_ID = launch-new-instance
|
||||
|
||||
include ../../extension.mk
|
||||
37
extensions/launch-new-instance/extension.js
Normal file
37
extensions/launch-new-instance/extension.js
Normal file
@@ -0,0 +1,37 @@
|
||||
const Main = imports.ui.main;
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
|
||||
var _onActivateOriginal = null;
|
||||
var _activateResultOriginal = null;
|
||||
|
||||
function _onActivate(event) {
|
||||
|
||||
this.emit('launching');
|
||||
|
||||
if (this._onActivateOverride) {
|
||||
this._onActivateOverride(event);
|
||||
} else {
|
||||
this.app.open_new_window(-1);
|
||||
}
|
||||
Main.overview.hide();
|
||||
}
|
||||
|
||||
function _activateResult(app) {
|
||||
app.open_new_window(-1);
|
||||
}
|
||||
|
||||
function init() {
|
||||
}
|
||||
|
||||
function enable() {
|
||||
_onActivateOriginal = AppDisplay.AppWellIcon.prototype._onActivate;
|
||||
AppDisplay.AppWellIcon.prototype._onActivate = _onActivate;
|
||||
|
||||
_activateResultOriginal = AppDisplay.AppSearchProvider.prototype.activateResult;
|
||||
AppDisplay.AppSearchProvider.prototype.activateResult = _activateResult;
|
||||
}
|
||||
|
||||
function disable() {
|
||||
AppDisplay.AppWellIcon.prototype._onActivate = _onActivateOriginal;
|
||||
AppDisplay.AppSearchProvider.prototype.activateResult = _activateResultOriginal;
|
||||
}
|
||||
10
extensions/launch-new-instance/metadata.json.in
Normal file
10
extensions/launch-new-instance/metadata.json.in
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Launch new instance",
|
||||
"description": "Always launch a new instance",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
1
extensions/launch-new-instance/stylesheet.css
Normal file
1
extensions/launch-new-instance/stylesheet.css
Normal file
@@ -0,0 +1 @@
|
||||
/* This extensions requires no special styling */
|
||||
@@ -1,14 +1,5 @@
|
||||
EXTENSION_ID = native-window-placement
|
||||
|
||||
include ../../extension.mk
|
||||
include ../../settings.mk
|
||||
|
||||
gschemas_in = org.gnome.shell.extensions.native-window-placement.gschema.xml.in
|
||||
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
|
||||
gsettings_SCHEMAS = $(gschemas_in:.xml.in=.xml)
|
||||
|
||||
@GSETTINGS_RULES@
|
||||
|
||||
CLEANFILES += $(gschemas_in:.xml.in=.valid) $(gsettings_SCHEMAS)
|
||||
EXTRA_DIST += $(gschemas_in)
|
||||
|
||||
@@ -20,10 +20,9 @@ const Tweener = imports.ui.tweener;
|
||||
const Workspace = imports.ui.workspace;
|
||||
const WindowPositionFlags = Workspace.WindowPositionFlags;
|
||||
|
||||
const WindowPlacementStrategy = {
|
||||
NATURAL: 0,
|
||||
GRID: 1,
|
||||
};
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
// testing settings for natural window placement strategy:
|
||||
const WINDOW_PLACEMENT_NATURAL_FILLGAPS = true; // enlarge windows at the end to fill gaps // not implemented yet
|
||||
@@ -34,6 +33,12 @@ const WINDOW_PLACEMENT_NATURAL_MAX_TRANSLATIONS = 5000; // safety li
|
||||
|
||||
const PLACE_WINDOW_CAPTIONS_ON_TOP = true; // place window titles in overview on top of windows with overlap parameter
|
||||
|
||||
const WORKSPACE_BORDER_GAP = 10; // minimum gap between the workspace area and the workspace selector
|
||||
const WINDOW_AREA_TOP_GAP = 20; // minimum gap between the workspace area and the top border. This keeps window captions and close buttons visible. 13px (26/2) should currently be enough.
|
||||
|
||||
const BUTTON_LAYOUT_SCHEMA = 'org.gnome.shell.overrides';
|
||||
const BUTTON_LAYOUT_KEY = 'button-layout';
|
||||
|
||||
function injectToFunction(parent, name, func) {
|
||||
let origin = parent[name];
|
||||
parent[name] = function() {
|
||||
@@ -44,17 +49,17 @@ function injectToFunction(parent, name, func) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
const WORKSPACE_BORDER_GAP = 10; // gap between the workspace area and the workspace selector
|
||||
|
||||
function Rect(x, y, width, height) {
|
||||
[this.x, this.y, this.width, this.height] = arguments;
|
||||
}
|
||||
const Rect = new Lang.Class({
|
||||
Name: 'NativeWindowPlacement.Rect',
|
||||
|
||||
_init: function(x, y, width, height) {
|
||||
[this.x, this.y, this.width, this.height] = [x, y, width, height];
|
||||
},
|
||||
|
||||
Rect.prototype = {
|
||||
/**
|
||||
* used in _calculateWindowTransformationsNatural to replace Meta.Rectangle that is too slow.
|
||||
*/
|
||||
|
||||
copy: function() {
|
||||
return new Rect(this.x, this.y, this.width, this.height);
|
||||
},
|
||||
@@ -103,30 +108,23 @@ Rect.prototype = {
|
||||
this.x += dx;
|
||||
this.y += dy;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
let winInjections, workspaceInjections, connectedSignals;
|
||||
|
||||
function resetState() {
|
||||
winInjections = { };
|
||||
workspaceInjections = { };
|
||||
workViewInjections = { };
|
||||
connectedSignals = [ ];
|
||||
}
|
||||
|
||||
function enable() {
|
||||
resetState();
|
||||
|
||||
let settings = new Gio.Settings({ schema: 'org.gnome.shell.extensions.native-window-placement' });
|
||||
let placementStrategy = settings.get_enum('strategy');
|
||||
let signalId = settings.connect('changed::strategy', function() {
|
||||
placementStrategy = settings.get_enum('strategy');
|
||||
// we don't update immediately, we wait for a relayout
|
||||
// (and hope for the best)
|
||||
});
|
||||
connectedSignals.push({ obj: settings, id: signalId });
|
||||
let settings = Convenience.getSettings();
|
||||
let useMoreScreen = settings.get_boolean('use-more-screen');
|
||||
signalId = settings.connect('changed::use-more-screen', function() {
|
||||
let windowCaptionsOnTop = settings.get_boolean('window-captions-on-top');
|
||||
let signalId = settings.connect('changed::use-more-screen', function() {
|
||||
useMoreScreen = settings.get_boolean('use-more-screen');
|
||||
});
|
||||
connectedSignals.push({ obj: settings, id: signalId });
|
||||
@@ -147,10 +145,41 @@ function enable() {
|
||||
return win2.metaWindow.get_stable_sequence() - win1.metaWindow.get_stable_sequence();
|
||||
});
|
||||
|
||||
// Put a gap on the right edge of the workspace to separe it from the workspace selector
|
||||
let x_gap = WORKSPACE_BORDER_GAP;
|
||||
let y_gap = WORKSPACE_BORDER_GAP * this._height / this._width
|
||||
let area = new Rect(this._x, this._y, this._width - x_gap, this._height - y_gap);
|
||||
let node = this.actor.get_theme_node();
|
||||
let columnSpacing = node.get_length('-horizontal-spacing');
|
||||
let rowSpacing = node.get_length('-vertical-spacing');
|
||||
let padding = {
|
||||
left: node.get_padding(St.Side.LEFT),
|
||||
top: node.get_padding(St.Side.TOP),
|
||||
bottom: node.get_padding(St.Side.BOTTOM),
|
||||
right: node.get_padding(St.Side.RIGHT),
|
||||
};
|
||||
|
||||
let closeButtonHeight, captionHeight;
|
||||
let leftBorder, rightBorder;
|
||||
// If the window captions are below the window, put an additional gap to account for them
|
||||
if (!windowCaptionsOnTop && this._windowOverlays.length) {
|
||||
// All of the overlays have the same chrome sizes,
|
||||
// so just pick the first one.
|
||||
let overlay = this._windowOverlays[0];
|
||||
[closeButtonHeight, captionHeight] = overlay.chromeHeights();
|
||||
[leftBorder, rightBorder] = overlay.chromeWidths();
|
||||
} else {
|
||||
[closeButtonHeight, captionHeight] = [0, 0];
|
||||
[leftBorder, rightBorder] = [0, 0];
|
||||
}
|
||||
|
||||
rowSpacing += captionHeight;
|
||||
columnSpacing += (rightBorder + leftBorder) / 2;
|
||||
padding.top += closeButtonHeight;
|
||||
padding.bottom += captionHeight;
|
||||
padding.left += leftBorder;
|
||||
padding.right += rightBorder;
|
||||
|
||||
let area = new Rect(this._x + padding.left,
|
||||
this._y + padding.top,
|
||||
this._width - padding.left - padding.right,
|
||||
this._height - padding.top - padding.bottom);
|
||||
|
||||
let bounds = area.copy();
|
||||
|
||||
@@ -292,8 +321,8 @@ function enable() {
|
||||
|
||||
let targets = [];
|
||||
for (let i = 0; i < rects.length; i++) {
|
||||
rects[i].x = rects[i].x * scale + this._x;
|
||||
rects[i].y = rects[i].y * scale + this._y;
|
||||
rects[i].x = rects[i].x * scale + area.x;
|
||||
rects[i].y = rects[i].y * scale + area.y;
|
||||
|
||||
targets[i] = [rects[i].x, rects[i].y, scale];
|
||||
}
|
||||
@@ -303,32 +332,13 @@ function enable() {
|
||||
workspaceInjections['_calculateWindowTransformationsNatural'] = undefined;
|
||||
|
||||
/**
|
||||
* _calculateWindowTransformationsGrid:
|
||||
* @clones: Array of #MetaWindow
|
||||
*
|
||||
* Returns clones with matching target coordinates and scales to arrange windows in a grid.
|
||||
*/
|
||||
Workspace.Workspace.prototype._calculateWindowTransformationsGrid = function(clones) {
|
||||
let slots = this._computeAllWindowSlots(clones.length);
|
||||
clones = this._orderWindowsByMotionAndStartup(clones, slots);
|
||||
let targets = [];
|
||||
|
||||
for (let i = 0; i < clones.length; i++) {
|
||||
targets[i] = this._computeWindowLayout(clones[i].metaWindow, slots[i]);
|
||||
}
|
||||
|
||||
return [clones, targets];
|
||||
}
|
||||
workspaceInjections['_calculateWindowTransformationsGrid'] = undefined;
|
||||
|
||||
/**
|
||||
* positionWindows:
|
||||
* _realPositionWindows:
|
||||
* @flags:
|
||||
* INITIAL - this is the initial positioning of the windows.
|
||||
* ANIMATE - Indicates that we need animate changing position.
|
||||
*/
|
||||
workspaceInjections['positionWindows'] = Workspace.Workspace.prototype.positionWindows;
|
||||
Workspace.Workspace.prototype.positionWindows = function(flags) {
|
||||
workspaceInjections['_realPositionWindows'] = Workspace.Workspace.prototype._realPositionWindows;
|
||||
Workspace.Workspace.prototype._realPositionWindows = function(flags) {
|
||||
if (this._repositionWindowsId > 0) {
|
||||
Mainloop.source_remove(this._repositionWindowsId);
|
||||
this._repositionWindowsId = 0;
|
||||
@@ -342,38 +352,32 @@ function enable() {
|
||||
let animate = flags & WindowPositionFlags.ANIMATE;
|
||||
|
||||
// Start the animations
|
||||
let targets = [];
|
||||
let targets = [];
|
||||
let scales = [];
|
||||
|
||||
switch (placementStrategy) {
|
||||
case WindowPlacementStrategy.NATURAL:
|
||||
[clones, targets] = this._calculateWindowTransformationsNatural(clones);
|
||||
break;
|
||||
default:
|
||||
log ('Invalid window placement strategy');
|
||||
placementStrategy = WindowPlacementStrategy.GRID;
|
||||
case WindowPlacementStrategy.GRID:
|
||||
[clones, targets] = this._calculateWindowTransformationsGrid(clones);
|
||||
break;
|
||||
}
|
||||
[clones, targets] = this._calculateWindowTransformationsNatural(clones);
|
||||
|
||||
let currentWorkspace = global.screen.get_active_workspace();
|
||||
let currentWorkspace = global.screen.get_active_workspace();
|
||||
let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace;
|
||||
|
||||
for (let i = 0; i < clones.length; i++) {
|
||||
let clone = clones[i];
|
||||
let [x, y , scale] = targets[i];
|
||||
let [x, y , scale] = targets[i];
|
||||
let metaWindow = clone.metaWindow;
|
||||
let mainIndex = this._lookupIndex(metaWindow);
|
||||
let overlay = this._windowOverlays[mainIndex];
|
||||
clone.slotId = i;
|
||||
|
||||
// Positioning a window currently being dragged must be avoided;
|
||||
// we'll just leave a blank spot in the layout for it.
|
||||
if (clone.inDrag)
|
||||
continue;
|
||||
|
||||
if (overlay)
|
||||
overlay.hide();
|
||||
clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale];
|
||||
|
||||
if (overlay && initialPositioning)
|
||||
overlay.hide(initialPositioning);
|
||||
|
||||
if (animate && isOnCurrentWorkspace) {
|
||||
if (!metaWindow.showing_on_its_workspace()) {
|
||||
/* Hidden windows should fade in and grow
|
||||
@@ -395,115 +399,66 @@ function enable() {
|
||||
});
|
||||
}
|
||||
|
||||
Tweener.addTween(clone.actor,
|
||||
{ x: x,
|
||||
y: y,
|
||||
scale_x: scale,
|
||||
scale_y: scale,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this._showWindowOverlay(clone, overlay, true);
|
||||
})
|
||||
});
|
||||
this._animateClone(clone, overlay, x, y, scale, initialPositioning);
|
||||
} else {
|
||||
clone.actor.set_position(x, y);
|
||||
clone.actor.set_scale(scale, scale);
|
||||
clone.overlay.relayout(false);
|
||||
this._showWindowOverlay(clone, overlay, isOnCurrentWorkspace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// position window titles on top of windows in overlay ////
|
||||
if (settings.get_boolean('window-captions-on-top')) {
|
||||
winInjections['_init'] = Workspace.WindowOverlay.prototype._init;
|
||||
Workspace.WindowOverlay.prototype._init = function(windowClone, parentActor) {
|
||||
let metaWindow = windowClone.metaWindow;
|
||||
|
||||
this._windowClone = windowClone;
|
||||
this._parentActor = parentActor;
|
||||
this._hidden = false;
|
||||
|
||||
let title = new St.Label({ style_class: 'window-caption',
|
||||
text: metaWindow.title });
|
||||
title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||
title._spacing = 0;
|
||||
title._overlap = 0;
|
||||
|
||||
this._updateCaptionId = metaWindow.connect('notify::title', Lang.bind(this, function(w) {
|
||||
this.title.text = w.title;
|
||||
}));
|
||||
|
||||
let button = new St.Button({ style_class: 'window-close' });
|
||||
button._overlap = 0;
|
||||
|
||||
this._idleToggleCloseId = 0;
|
||||
button.connect('clicked', Lang.bind(this, this._closeWindow));
|
||||
|
||||
windowClone.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
windowClone.actor.connect('enter-event', Lang.bind(this, this._onEnter));
|
||||
windowClone.actor.connect('leave-event', Lang.bind(this, this._onLeave));
|
||||
|
||||
this._windowAddedId = 0;
|
||||
windowClone.connect('zoom-start', Lang.bind(this, this.hide));
|
||||
windowClone.connect('zoom-end', Lang.bind(this, this.show));
|
||||
|
||||
button.hide();
|
||||
|
||||
this.title = title;
|
||||
this.closeButton = button;
|
||||
|
||||
parentActor.add_actor(this.title);
|
||||
parentActor.add_actor(this.closeButton);
|
||||
title.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||
button.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||
|
||||
// force a style change if we are already on a stage - otherwise
|
||||
// the signal will be emitted normally when we are added
|
||||
if (parentActor.get_stage())
|
||||
this._onStyleChanged();
|
||||
},
|
||||
|
||||
if (windowCaptionsOnTop) {
|
||||
winInjections['chromeHeights'] = Workspace.WindowOverlay.prototype.chromeHeights;
|
||||
Workspace.WindowOverlay.prototype.chromeHeights = function () {
|
||||
Workspace.WindowOverlay.prototype.chromeHeights = function () {
|
||||
return [Math.max( this.closeButton.height - this.closeButton._overlap, this.title.height - this.title._overlap),
|
||||
0];
|
||||
},
|
||||
0];
|
||||
};
|
||||
|
||||
winInjections['updatePositions'] = Workspace.WindowOverlay.prototype.updatePositions;
|
||||
Workspace.WindowOverlay.prototype.updatePositions = function(cloneX, cloneY, cloneWidth, cloneHeight) {
|
||||
Workspace.WindowOverlay.prototype.updatePositions = function(cloneX, cloneY, cloneWidth, cloneHeight, animate) {
|
||||
let button = this.closeButton;
|
||||
let title = this.title;
|
||||
|
||||
let settings = new Gio.Settings({ schema: BUTTON_LAYOUT_SCHEMA });
|
||||
let layout = settings.get_string(BUTTON_LAYOUT_KEY);
|
||||
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
|
||||
|
||||
let split = layout.split(":");
|
||||
let side;
|
||||
if (split[0].indexOf("close") > -1)
|
||||
side = rtl ? St.Side.RIGHT : St.Side.LEFT;
|
||||
else
|
||||
side = rtl ? St.Side.LEFT : St.Side.RIGHT;
|
||||
|
||||
let buttonX;
|
||||
let buttonY = cloneY - (button.height - button._overlap);
|
||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
|
||||
buttonX = cloneX - (button.width - button._overlap);
|
||||
if (side == St.Side.LEFT)
|
||||
buttonX = cloneX - (button.width - button._overlap);
|
||||
else
|
||||
buttonX = cloneX + (cloneWidth - button._overlap);
|
||||
buttonX = cloneX + (cloneWidth - button._overlap);
|
||||
|
||||
button.set_position(Math.floor(buttonX), Math.floor(buttonY));
|
||||
if (animate)
|
||||
this._animateOverlayActor(button, Math.floor(buttonX), Math.floor(buttonY), button.width);
|
||||
else
|
||||
button.set_position(Math.floor(buttonX), Math.floor(buttonY));
|
||||
|
||||
if (!title.fullWidth)
|
||||
title.fullWidth = title.width;
|
||||
title.width = Math.min(title.fullWidth, cloneWidth);
|
||||
title.fullWidth = title.width;
|
||||
let titleWidth = Math.min(title.fullWidth, cloneWidth);
|
||||
|
||||
let titleX = cloneX + (cloneWidth - title.width) / 2;
|
||||
let titleY = cloneY - title.height + title._overlap;
|
||||
title.set_position(Math.floor(titleX), Math.floor(titleY));
|
||||
},
|
||||
let titleX = cloneX + (cloneWidth - titleWidth) / 2;
|
||||
let titleY = cloneY - title.height + title._spacing;
|
||||
|
||||
winInjections['_onStyleChanged'] = Workspace.WindowOverlay.prototype._onStyleChanged;
|
||||
Workspace.WindowOverlay.prototype._onStyleChanged = function() {
|
||||
let titleNode = this.title.get_theme_node();
|
||||
this.title._spacing = titleNode.get_length('-shell-caption-spacing');
|
||||
this.title._overlap = titleNode.get_length('-shell-caption-overlap');
|
||||
|
||||
let closeNode = this.closeButton.get_theme_node();
|
||||
this.closeButton._overlap = closeNode.get_length('-shell-close-overlap');
|
||||
|
||||
this._parentActor.queue_relayout();
|
||||
}
|
||||
if (animate)
|
||||
this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY), titleWidth);
|
||||
else {
|
||||
title.width = titleWidth;
|
||||
title.set_position(Math.floor(titleX), Math.floor(titleY));
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -529,4 +484,4 @@ function disable() {
|
||||
|
||||
function init() {
|
||||
/* do nothing */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
{
|
||||
"uuid": "@uuid@",
|
||||
"extension-id": "@extension_id@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Native Window Placement",
|
||||
"description": "Arrange windows in overview in a more native way",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@",
|
||||
"original-authors": [ "wepmaschda@gmx.de" ]
|
||||
}
|
||||
|
||||
@@ -1,15 +1,5 @@
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<enum id="org.gnome.shell.extensions.native-window-placement.strategy">
|
||||
<value nick="natural" value="0" />
|
||||
<value nick="grid" value="1" />
|
||||
</enum>
|
||||
<schema id="org.gnome.shell.extensions.native-window-placement" path="/org/gnome/shell/extensions/native-window-placement/">
|
||||
<key name="strategy" enum="org.gnome.shell.extensions.native-window-placement.strategy">
|
||||
<default>'natural'</default>
|
||||
<_summary>Window placement strategy</_summary>
|
||||
<_description>The algorithm used to layout thumbnails in the overview. 'grid' to use the default grid based algorithm,
|
||||
'natural' to use another one that reflects more the position and size of the actual window</_description>
|
||||
</key>
|
||||
<key name="use-more-screen" type="b">
|
||||
<default>true</default>
|
||||
<_summary>Use more screen for windows</_summary>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
.window-caption {
|
||||
color: red;
|
||||
-shell-caption-overlap: 10px;
|
||||
-shell-caption-spacing: 13px; /* current caption height is 26px => set it to half of it. TODO: better solution needed */
|
||||
}
|
||||
|
||||
.window-picker {
|
||||
-horizontal-spacing: 32px;
|
||||
-vertical-spacing: 32px;
|
||||
padding: 64px 32px;
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
EXTENSION_ID = places-menu
|
||||
|
||||
EXTRA_MODULES = placeDisplay.js
|
||||
|
||||
include ../../extension.mk
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
@@ -13,115 +13,122 @@ const Panel = imports.ui.panel;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
const N_ = function(x) { return x; }
|
||||
|
||||
const PLACE_ICON_SIZE = 22;
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
const PlaceDisplay = Me.imports.placeDisplay;
|
||||
|
||||
function PlacesMenu() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
const PLACE_ICON_SIZE = 16;
|
||||
|
||||
PlacesMenu.prototype = {
|
||||
__proto__: PanelMenu.SystemStatusButton.prototype,
|
||||
const PlaceMenuItem = new Lang.Class({
|
||||
Name: 'PlaceMenuItem',
|
||||
Extends: PopupMenu.PopupBaseMenuItem,
|
||||
|
||||
_init: function(info) {
|
||||
this.parent();
|
||||
this._info = info;
|
||||
|
||||
this._icon = new St.Icon({ gicon: info.icon,
|
||||
icon_size: PLACE_ICON_SIZE });
|
||||
this.addActor(this._icon);
|
||||
|
||||
this._label = new St.Label({ text: info.name });
|
||||
this.addActor(this._label);
|
||||
|
||||
this._changedId = info.connect('changed',
|
||||
Lang.bind(this, this._propertiesChanged));
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._changedId) {
|
||||
this._info.disconnect(this._changedId);
|
||||
this._changedId = 0;
|
||||
}
|
||||
|
||||
this.parent();
|
||||
},
|
||||
|
||||
activate: function(event) {
|
||||
this._info.launch(event.get_time());
|
||||
|
||||
this.parent(event);
|
||||
},
|
||||
|
||||
_propertiesChanged: function(info) {
|
||||
this._icon.gicon = info.icon;
|
||||
this._label.text = info.name;
|
||||
},
|
||||
});
|
||||
|
||||
const SECTIONS = [
|
||||
'special',
|
||||
'devices',
|
||||
'bookmarks',
|
||||
'network'
|
||||
]
|
||||
|
||||
const PlacesMenu = new Lang.Class({
|
||||
Name: 'PlacesMenu.PlacesMenu',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function() {
|
||||
PanelMenu.SystemStatusButton.prototype._init.call(this, 'folder');
|
||||
let label = new St.Label({ text: _("Places") });
|
||||
this.parent(0.0, label.text);
|
||||
this.actor.add_actor(label);
|
||||
|
||||
this.defaultItems = [];
|
||||
this.bookmarkItems = [];
|
||||
this.deviceItems = [];
|
||||
this._createDefaultPlaces();
|
||||
this._bookmarksSection = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(this._bookmarksSection);
|
||||
this._createBookmarks();
|
||||
this._devicesMenuItem = new PopupMenu.PopupSubMenuMenuItem('Removable Devices');
|
||||
this.menu.addMenuItem(this._devicesMenuItem);
|
||||
this._createDevices();
|
||||
Main.placesManager.connect('bookmarks-updated',Lang.bind(this,this._redisplayBookmarks));
|
||||
Main.placesManager.connect('mounts-updated',Lang.bind(this,this._redisplayDevices));
|
||||
this.placesManager = new PlaceDisplay.PlacesManager();
|
||||
|
||||
this._sections = { };
|
||||
|
||||
for (let i=0; i < SECTIONS.length; i++) {
|
||||
let id = SECTIONS[i];
|
||||
this._sections[id] = new PopupMenu.PopupMenuSection();
|
||||
this.placesManager.connect(id + '-updated', Lang.bind(this, function() {
|
||||
this._redisplay(id);
|
||||
}));
|
||||
|
||||
this._create(id);
|
||||
this.menu.addMenuItem(this._sections[id]);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
}
|
||||
},
|
||||
|
||||
_redisplayBookmarks: function(){
|
||||
this._clearBookmarks();
|
||||
this._createBookmarks();
|
||||
destroy: function() {
|
||||
this.placesManager.destroy();
|
||||
|
||||
this.parent();
|
||||
},
|
||||
|
||||
_redisplayDevices: function(){
|
||||
this._clearDevices();
|
||||
this._createDevices();
|
||||
_redisplay: function(id) {
|
||||
this._sections[id].removeAll();
|
||||
this._create(id);
|
||||
},
|
||||
|
||||
_createDefaultPlaces : function() {
|
||||
this.defaultPlaces = Main.placesManager.getDefaultPlaces();
|
||||
_create: function(id) {
|
||||
let places = this.placesManager.get(id);
|
||||
|
||||
for (let placeid = 0; placeid < this.defaultPlaces.length; placeid++) {
|
||||
this.defaultItems[placeid] = new PopupMenu.PopupMenuItem(_(this.defaultPlaces[placeid].name));
|
||||
let icon = this.defaultPlaces[placeid].iconFactory(PLACE_ICON_SIZE);
|
||||
this.defaultItems[placeid].addActor(icon, { align: St.Align.END});
|
||||
this.defaultItems[placeid].place = this.defaultPlaces[placeid];
|
||||
this.menu.addMenuItem(this.defaultItems[placeid]);
|
||||
this.defaultItems[placeid].connect('activate', function(actor,event) {
|
||||
actor.place.launch();
|
||||
});
|
||||
for (let i = 0; i < places.length; i++)
|
||||
this._sections[id].addMenuItem(new PlaceMenuItem(places[i]));
|
||||
|
||||
}
|
||||
},
|
||||
this._sections[id].actor.visible = places.length > 0;
|
||||
}
|
||||
});
|
||||
|
||||
_createBookmarks : function() {
|
||||
this.bookmarks = Main.placesManager.getBookmarks();
|
||||
|
||||
for (let bookmarkid = 0; bookmarkid < this.bookmarks.length; bookmarkid++) {
|
||||
this.bookmarkItems[bookmarkid] = new PopupMenu.PopupMenuItem(_(this.bookmarks[bookmarkid].name));
|
||||
let icon = this.bookmarks[bookmarkid].iconFactory(PLACE_ICON_SIZE);
|
||||
this.bookmarkItems[bookmarkid].addActor(icon, { align: St.Align.END});
|
||||
this.bookmarkItems[bookmarkid].place = this.bookmarks[bookmarkid];
|
||||
this._bookmarksSection.addMenuItem(this.bookmarkItems[bookmarkid]);
|
||||
this.bookmarkItems[bookmarkid].connect('activate', function(actor,event) {
|
||||
actor.place.launch();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_createDevices : function() {
|
||||
this.devices = Main.placesManager.getMounts();
|
||||
|
||||
for (let devid = 0; devid < this.devices.length; devid++) {
|
||||
this.deviceItems[devid] = new PopupMenu.PopupMenuItem(_(this.devices[devid].name));
|
||||
let icon = this.devices[devid].iconFactory(PLACE_ICON_SIZE);
|
||||
this.deviceItems[devid].addActor(icon, { align: St.Align.END});
|
||||
this.deviceItems[devid].place = this.devices[devid];
|
||||
this._devicesMenuItem.menu.addMenuItem(this.deviceItems[devid]);
|
||||
this.deviceItems[devid].connect('activate', function(actor,event) {
|
||||
actor.place.launch();
|
||||
});
|
||||
}
|
||||
|
||||
if (this.devices.length == 0)
|
||||
this._devicesMenuItem.actor.hide();
|
||||
else
|
||||
this._devicesMenuItem.actor.show();
|
||||
},
|
||||
|
||||
_clearBookmarks : function(){
|
||||
this._bookmarksSection.removeAll();
|
||||
this.bookmarkItems = [];
|
||||
},
|
||||
|
||||
_clearDevices : function(){
|
||||
this._devicesMenuItem.menu.removeAll();
|
||||
this.DeviceItems = [];
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
function init(metadata) {
|
||||
imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir);
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
let _indicator;
|
||||
|
||||
function enable() {
|
||||
_indicator = new PlacesMenu;
|
||||
Main.panel.addToStatusArea('places-menu', _indicator);
|
||||
|
||||
let pos = 1;
|
||||
if ('apps-menu' in Main.panel.statusArea)
|
||||
pos = 2;
|
||||
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
|
||||
}
|
||||
|
||||
function disable() {
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Places Status Indicator",
|
||||
"description": "Add a systems status menu for quickly navigating places in the system",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
446
extensions/places-menu/placeDisplay.js
Normal file
446
extensions/places-menu/placeDisplay.js
Normal file
@@ -0,0 +1,446 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const DND = imports.ui.dnd;
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
const Search = imports.ui.search;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
const N_ = function(x) { return x; }
|
||||
|
||||
const Hostname1Iface = <interface name="org.freedesktop.hostname1">
|
||||
<property name="PrettyHostname" type="s" access="read" />
|
||||
</interface>;
|
||||
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
|
||||
|
||||
const PlaceInfo = new Lang.Class({
|
||||
Name: 'PlaceInfo',
|
||||
|
||||
_init: function(kind, file, name, icon) {
|
||||
this.kind = kind;
|
||||
this.file = file;
|
||||
this.name = name || this._getFileName();
|
||||
this.icon = icon ? new Gio.ThemedIcon({ name: icon }) : this.getIcon();
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
},
|
||||
|
||||
isRemovable: function() {
|
||||
return false;
|
||||
},
|
||||
|
||||
launch: function(timestamp) {
|
||||
let launchContext = global.create_app_launch_context();
|
||||
launchContext.set_timestamp(timestamp);
|
||||
|
||||
try {
|
||||
Gio.AppInfo.launch_default_for_uri(this.file.get_uri(),
|
||||
launchContext);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) {
|
||||
this.file.mount_enclosing_volume(0, null, null, function(file, result) {
|
||||
file.mount_enclosing_volume_finish(result);
|
||||
Gio.AppInfo.launch_default_for_uri(file.get_uri(), launchContext);
|
||||
});
|
||||
} catch(e) {
|
||||
Main.notifyError(_("Failed to launch \"%s\"").format(this.name), e.message);
|
||||
}
|
||||
},
|
||||
|
||||
getIcon: function() {
|
||||
try {
|
||||
let info = this.file.query_info('standard::symbolic-icon', 0, null);
|
||||
return info.get_symbolic_icon();
|
||||
} catch(e if e instanceof Gio.IOErrorEnum) {
|
||||
// return a generic icon for this kind
|
||||
switch (this.kind) {
|
||||
case 'network':
|
||||
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' });
|
||||
case 'devices':
|
||||
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' });
|
||||
case 'special':
|
||||
case 'bookmarks':
|
||||
default:
|
||||
if (!this.file.is_native())
|
||||
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' });
|
||||
else
|
||||
return new Gio.ThemedIcon({ name: 'folder-symbolic' });
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_getFileName: function() {
|
||||
try {
|
||||
let info = this.file.query_info('standard::display-name', 0, null);
|
||||
return info.get_display_name();
|
||||
} catch(e if e instanceof Gio.IOErrorEnum) {
|
||||
return this.file.get_basename();
|
||||
}
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(PlaceInfo.prototype);
|
||||
|
||||
const RootInfo = new Lang.Class({
|
||||
Name: 'RootInfo',
|
||||
Extends: PlaceInfo,
|
||||
|
||||
_init: function() {
|
||||
this.parent('devices', Gio.File.new_for_path('/'), _("Computer"));
|
||||
|
||||
this._proxy = new Hostname1(Gio.DBus.system,
|
||||
'org.freedesktop.hostname1',
|
||||
'/org/freedesktop/hostname1',
|
||||
Lang.bind(this, function(obj, error) {
|
||||
if (error)
|
||||
return;
|
||||
|
||||
this._proxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._propertiesChanged));
|
||||
this._propertiesChanged(obj);
|
||||
}));
|
||||
},
|
||||
|
||||
getIcon: function() {
|
||||
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' });
|
||||
},
|
||||
|
||||
_propertiesChanged: function(proxy) {
|
||||
// GDBusProxy will emit a g-properties-changed when hostname1 goes down
|
||||
// ignore it
|
||||
if (proxy.g_name_owner) {
|
||||
this.name = proxy.PrettyHostname || _("Computer");
|
||||
this.emit('changed');
|
||||
}
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
this._proxy.run_dispose();
|
||||
this.parent();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const PlaceDeviceInfo = new Lang.Class({
|
||||
Name: 'PlaceDeviceInfo',
|
||||
Extends: PlaceInfo,
|
||||
|
||||
_init: function(kind, mount) {
|
||||
this._mount = mount;
|
||||
this.parent(kind, mount.get_root(), mount.get_name());
|
||||
},
|
||||
|
||||
getIcon: function() {
|
||||
return this._mount.get_symbolic_icon();
|
||||
}
|
||||
});
|
||||
|
||||
const PlaceVolumeInfo = new Lang.Class({
|
||||
Name: 'PlaceVolumeInfo',
|
||||
Extends: PlaceInfo,
|
||||
|
||||
_init: function(kind, volume) {
|
||||
this._volume = volume;
|
||||
this.parent(kind, volume.get_activation_root(), volume.get_name());
|
||||
},
|
||||
|
||||
launch: function(timestamp) {
|
||||
if (this.file) {
|
||||
this.parent(timestamp);
|
||||
return;
|
||||
}
|
||||
|
||||
this._volume.mount(0, null, null, Lang.bind(this, function(volume, result) {
|
||||
volume.mount_finish(result);
|
||||
|
||||
let mount = volume.get_mount();
|
||||
this.file = mount.get_root();
|
||||
this.parent(timestamp);
|
||||
}));
|
||||
},
|
||||
|
||||
getIcon: function() {
|
||||
return this._volume.get_symbolic_icon();
|
||||
}
|
||||
});
|
||||
|
||||
const DEFAULT_DIRECTORIES = [
|
||||
GLib.UserDirectory.DIRECTORY_DOCUMENTS,
|
||||
GLib.UserDirectory.DIRECTORY_PICTURES,
|
||||
GLib.UserDirectory.DIRECTORY_MUSIC,
|
||||
GLib.UserDirectory.DIRECTORY_DOWNLOAD,
|
||||
GLib.UserDirectory.DIRECTORY_VIDEOS,
|
||||
];
|
||||
|
||||
const PlacesManager = new Lang.Class({
|
||||
Name: 'PlacesManager',
|
||||
|
||||
_init: function() {
|
||||
this._places = {
|
||||
special: [],
|
||||
devices: [],
|
||||
bookmarks: [],
|
||||
network: [],
|
||||
};
|
||||
|
||||
let homePath = GLib.get_home_dir();
|
||||
|
||||
this._places.special.push(new PlaceInfo('special',
|
||||
Gio.File.new_for_path(homePath),
|
||||
_("Home")));
|
||||
|
||||
let specials = [];
|
||||
for (let i = 0; i < DEFAULT_DIRECTORIES.length; i++) {
|
||||
let specialPath = GLib.get_user_special_dir(DEFAULT_DIRECTORIES[i]);
|
||||
if (specialPath == homePath)
|
||||
continue;
|
||||
|
||||
let file = Gio.File.new_for_path(specialPath), info;
|
||||
try {
|
||||
info = new PlaceInfo('special', file);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
specials.push(info);
|
||||
}
|
||||
|
||||
specials.sort(function(a, b) {
|
||||
return GLib.utf8_collate(a.name, b.name);
|
||||
});
|
||||
this._places.special = this._places.special.concat(specials);
|
||||
|
||||
/*
|
||||
* Show devices, code more or less ported from nautilus-places-sidebar.c
|
||||
*/
|
||||
this._volumeMonitor = Gio.VolumeMonitor.get();
|
||||
this._connectVolumeMonitorSignals();
|
||||
this._updateMounts();
|
||||
|
||||
this._bookmarksFile = this._findBookmarksFile()
|
||||
this._bookmarkTimeoutId = 0;
|
||||
this._monitor = null;
|
||||
|
||||
if (this._bookmarksFile) {
|
||||
this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null);
|
||||
this._monitor.connect('changed', Lang.bind(this, function () {
|
||||
if (this._bookmarkTimeoutId > 0)
|
||||
return;
|
||||
/* Defensive event compression */
|
||||
this._bookmarkTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, function () {
|
||||
this._bookmarkTimeoutId = 0;
|
||||
this._reloadBookmarks();
|
||||
return false;
|
||||
}));
|
||||
}));
|
||||
|
||||
this._reloadBookmarks();
|
||||
}
|
||||
},
|
||||
|
||||
_connectVolumeMonitorSignals: function() {
|
||||
const signals = ['volume-added', 'volume-removed', 'volume-changed',
|
||||
'mount-added', 'mount-removed', 'mount-changed',
|
||||
'drive-connected', 'drive-disconnected', 'drive-changed'];
|
||||
|
||||
this._volumeMonitorSignals = [];
|
||||
let func = Lang.bind(this, this._updateMounts);
|
||||
for (let i = 0; i < signals.length; i++) {
|
||||
let id = this._volumeMonitor.connect(signals[i], func);
|
||||
this._volumeMonitorSignals.push(id);
|
||||
}
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
for (let i = 0; i < this._volumeMonitorSignals.length; i++)
|
||||
this._volumeMonitor.disconnect(this._volumeMonitorSignals[i]);
|
||||
|
||||
if (this._monitor)
|
||||
this._monitor.cancel();
|
||||
if (this._bookmarkTimeoutId)
|
||||
Mainloop.source_remove(this._bookmarkTimeoutId);
|
||||
},
|
||||
|
||||
_updateMounts: function() {
|
||||
let networkMounts = [];
|
||||
let networkVolumes = [];
|
||||
|
||||
this._places.devices.forEach(function (p) { p.destroy(); });
|
||||
this._places.devices = [];
|
||||
this._places.network.forEach(function (p) { p.destroy(); });
|
||||
this._places.network = [];
|
||||
|
||||
/* Add standard places */
|
||||
this._places.devices.push(new RootInfo());
|
||||
this._places.network.push(new PlaceInfo('network',
|
||||
Gio.File.new_for_uri('network:///'),
|
||||
_("Browse Network"),
|
||||
'network-workgroup-symbolic'));
|
||||
|
||||
/* first go through all connected drives */
|
||||
let drives = this._volumeMonitor.get_connected_drives();
|
||||
for (let i = 0; i < drives.length; i++) {
|
||||
let volumes = drives[i].get_volumes();
|
||||
|
||||
for(let j = 0; j < volumes.length; j++) {
|
||||
if (volumes[j].get_identifier('class').indexOf('network') >= 0) {
|
||||
networkVolumes.push(volumes[i]);
|
||||
} else {
|
||||
let mount = volumes[j].get_mount();
|
||||
if(mount != null)
|
||||
this._addMount('devices', mount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* add all volumes that is not associated with a drive */
|
||||
let volumes = this._volumeMonitor.get_volumes();
|
||||
for(let i = 0; i < volumes.length; i++) {
|
||||
if(volumes[i].get_drive() != null)
|
||||
continue;
|
||||
|
||||
if (volumes[i].get_identifier('class').indexOf('network') >= 0) {
|
||||
networkVolumes.push(volumes[i]);
|
||||
} else {
|
||||
let mount = volumes[i].get_mount();
|
||||
if(mount != null)
|
||||
this._addMount('devices', mount);
|
||||
}
|
||||
}
|
||||
|
||||
/* add mounts that have no volume (/etc/mtab mounts, ftp, sftp,...) */
|
||||
let mounts = this._volumeMonitor.get_mounts();
|
||||
for(let i = 0; i < mounts.length; i++) {
|
||||
if(mounts[i].is_shadowed())
|
||||
continue;
|
||||
|
||||
if(mounts[i].get_volume())
|
||||
continue;
|
||||
|
||||
let root = mounts[i].get_default_location();
|
||||
if (!root.is_native()) {
|
||||
networkMounts.push(mounts[i]);
|
||||
continue;
|
||||
}
|
||||
this._addMount('devices', mounts[i]);
|
||||
}
|
||||
|
||||
for (let i = 0; i < networkVolumes.length; i++) {
|
||||
let mount = networkVolumes[i].get_mount();
|
||||
if (mount) {
|
||||
networkMounts.push(mount);
|
||||
continue;
|
||||
}
|
||||
this._addVolume('network', networkVolumes[i]);
|
||||
}
|
||||
|
||||
for (let i = 0; i < networkMounts.length; i++) {
|
||||
this._addMount('network', networkMounts[i]);
|
||||
}
|
||||
|
||||
this.emit('devices-updated');
|
||||
this.emit('network-updated');
|
||||
},
|
||||
|
||||
_findBookmarksFile: function() {
|
||||
let paths = [
|
||||
GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']),
|
||||
GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']),
|
||||
];
|
||||
|
||||
for (let i = 0; i < paths.length; i++) {
|
||||
if (GLib.file_test(paths[i], GLib.FileTest.EXISTS))
|
||||
return Gio.File.new_for_path(paths[i]);
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
_reloadBookmarks: function() {
|
||||
|
||||
this._bookmarks = [];
|
||||
|
||||
let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path());
|
||||
let lines = content.split('\n');
|
||||
|
||||
let bookmarks = [];
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
let line = lines[i];
|
||||
let components = line.split(' ');
|
||||
let bookmark = components[0];
|
||||
|
||||
if (!bookmark)
|
||||
continue;
|
||||
|
||||
let file = Gio.File.new_for_uri(bookmark);
|
||||
if (file.is_native() && !file.query_exists(null))
|
||||
continue;
|
||||
|
||||
let duplicate = false;
|
||||
for (let i = 0; i < this._places.special.length; i++) {
|
||||
if (file.equal(this._places.special[i].file)) {
|
||||
duplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (duplicate)
|
||||
continue;
|
||||
for (let i = 0; i < bookmarks.length; i++) {
|
||||
if (file.equal(bookmarks[i].file)) {
|
||||
duplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (duplicate)
|
||||
continue;
|
||||
|
||||
let label = null;
|
||||
if (components.length > 1)
|
||||
label = components.slice(1).join(' ');
|
||||
|
||||
bookmarks.push(new PlaceInfo('bookmarks', file, label));
|
||||
}
|
||||
|
||||
this._places.bookmarks = bookmarks;
|
||||
|
||||
this.emit('bookmarks-updated');
|
||||
},
|
||||
|
||||
_addMount: function(kind, mount) {
|
||||
let devItem;
|
||||
|
||||
try {
|
||||
devItem = new PlaceDeviceInfo(kind, mount);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._places[kind].push(devItem);
|
||||
},
|
||||
|
||||
_addVolume: function(kind, volume) {
|
||||
let volItem;
|
||||
|
||||
try {
|
||||
volItem = new PlaceVolumeInfo(kind, volume);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._places[kind].push(volItem);
|
||||
},
|
||||
|
||||
get: function (kind) {
|
||||
return this._places[kind];
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(PlacesManager.prototype);
|
||||
3
extensions/static-workspaces/Makefile.am
Normal file
3
extensions/static-workspaces/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
EXTENSION_ID = static-workspaces
|
||||
|
||||
include ../../extension.mk
|
||||
18
extensions/static-workspaces/extension.js
Normal file
18
extensions/static-workspaces/extension.js
Normal file
@@ -0,0 +1,18 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
|
||||
const Meta = imports.gi.Meta;
|
||||
|
||||
function init(metadata) {
|
||||
}
|
||||
|
||||
function enable() {
|
||||
// Override gnome-shell's overrides
|
||||
Meta.prefs_override_preference_schema('dynamic-workspaces',
|
||||
'org.gnome.mutter');
|
||||
}
|
||||
|
||||
function disable() {
|
||||
// Restore gnome-shell's overrides
|
||||
Meta.prefs_override_preference_schema('dynamic-workspaces',
|
||||
'org.gnome.shell.overrides');
|
||||
}
|
||||
11
extensions/static-workspaces/metadata.json.in
Normal file
11
extensions/static-workspaces/metadata.json.in
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Static workspaces",
|
||||
"description": "Disable dynamic workspace management",
|
||||
"original-authors": [ "fmuellner@gnome.org" ],
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
1
extensions/static-workspaces/stylesheet.css
Normal file
1
extensions/static-workspaces/stylesheet.css
Normal file
@@ -0,0 +1 @@
|
||||
/* This extensions requires no special styling */
|
||||
@@ -8,40 +8,103 @@ const St = imports.gi.St;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
let _cpuIndicator;
|
||||
let _memIndicator;
|
||||
let _box;
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
function Indicator() {
|
||||
this._init();
|
||||
}
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const INDICATOR_UPDATE_INTERVAL = 500;
|
||||
const INDICATOR_NUM_GRID_LINES = 3;
|
||||
|
||||
const ITEM_LABEL_SHOW_TIME = 0.15;
|
||||
const ITEM_LABEL_HIDE_TIME = 0.1;
|
||||
const ITEM_HOVER_TIMEOUT = 300;
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'SystemMonitor.Indicator',
|
||||
|
||||
Indicator.prototype = {
|
||||
_init: function() {
|
||||
this._initValues();
|
||||
this.actor = new St.DrawingArea({ style_class: "extension-systemMonitor-indicator-area",
|
||||
reactive: true});
|
||||
this.actor.connect('repaint', Lang.bind(this, this._draw));
|
||||
this.actor.connect('button-press-event', function() {
|
||||
this._initValues();
|
||||
this.drawing_area = new St.DrawingArea({ reactive: true });
|
||||
this.drawing_area.connect('repaint', Lang.bind(this, this._draw));
|
||||
this.drawing_area.connect('button-press-event', function() {
|
||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-system-monitor.desktop');
|
||||
app.open_new_window(-1);
|
||||
});
|
||||
|
||||
this._timeoutId = Mainloop.timeout_add(250, Lang.bind(this, function () {
|
||||
this._updateValues();
|
||||
this.actor.queue_repaint();
|
||||
this.actor = new St.Bin({ style_class: "extension-systemMonitor-indicator-area",
|
||||
reactive: true, track_hover: true,
|
||||
x_fill: true, y_fill: true });
|
||||
this.actor.add_actor(this.drawing_area);
|
||||
|
||||
this._timeout = Mainloop.timeout_add(INDICATOR_UPDATE_INTERVAL, Lang.bind(this, function () {
|
||||
this._updateValues();
|
||||
this.drawing_area.queue_repaint();
|
||||
return true;
|
||||
}));
|
||||
}));
|
||||
},
|
||||
|
||||
showLabel: function() {
|
||||
if (this.label == null)
|
||||
return;
|
||||
|
||||
this.label.opacity = 0;
|
||||
this.label.show();
|
||||
|
||||
let [stageX, stageY] = this.actor.get_transformed_position();
|
||||
|
||||
let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1;
|
||||
let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1;
|
||||
|
||||
let labelWidth = this.label.width;
|
||||
let labelHeight = this.label.height;
|
||||
let xOffset = Math.floor((itemWidth - labelWidth) / 2)
|
||||
|
||||
let x = stageX + xOffset;
|
||||
|
||||
let node = this.label.get_theme_node();
|
||||
let yOffset = node.get_length('-y-offset');
|
||||
|
||||
let y = stageY - this.label.get_height() - yOffset;
|
||||
|
||||
this.label.set_position(x, y);
|
||||
Tweener.addTween(this.label,
|
||||
{ opacity: 255,
|
||||
time: ITEM_LABEL_SHOW_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
});
|
||||
},
|
||||
|
||||
setLabelText: function(text) {
|
||||
if (this.label == null)
|
||||
this.label = new St.Label({ style_class: 'extension-systemMonitor-indicator-label'});
|
||||
|
||||
this.label.set_text(text);
|
||||
Main.layoutManager.addChrome(this.label);
|
||||
this.label.hide();
|
||||
},
|
||||
|
||||
hideLabel: function () {
|
||||
Tweener.addTween(this.label,
|
||||
{ opacity: 0,
|
||||
time: ITEM_LABEL_HIDE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.label.hide();
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._timeoutId) {
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
this._timeoutId = 0;
|
||||
}
|
||||
Mainloop.source_remove(this._timeout);
|
||||
|
||||
this.actor.destroy();
|
||||
if (this.label)
|
||||
this.label.destroy();
|
||||
},
|
||||
|
||||
_initValues: function() {
|
||||
@@ -54,40 +117,112 @@ Indicator.prototype = {
|
||||
let [width, height] = area.get_surface_size();
|
||||
let themeNode = this.actor.get_theme_node();
|
||||
let cr = area.get_context();
|
||||
for (let i = this.values.length - 1; i >= 0; i--) {
|
||||
let color = themeNode.get_color(this.values[i].color);
|
||||
cr.moveTo(0, height);
|
||||
let k;
|
||||
for (k = 0; k < this.values[i].values.length; k++) {
|
||||
cr.lineTo(k, (1 - this.values[i].values[k]) * height);
|
||||
}
|
||||
if (k > width)
|
||||
this.values[i].values.shift();
|
||||
cr.lineTo(k, height);
|
||||
cr.lineTo(0, height);
|
||||
cr.closePath();
|
||||
Clutter.cairo_set_source_color(cr, color);
|
||||
|
||||
cr.fill();
|
||||
//draw the background grid
|
||||
let color = themeNode.get_color(this.gridColor);
|
||||
let gridOffset = Math.floor(height / (INDICATOR_NUM_GRID_LINES + 1));
|
||||
for (let i = 1; i <= INDICATOR_NUM_GRID_LINES; ++i) {
|
||||
cr.moveTo(0, i * gridOffset + .5);
|
||||
cr.lineTo(width, i * gridOffset + .5);
|
||||
}
|
||||
Clutter.cairo_set_source_color(cr, color);
|
||||
cr.setLineWidth(1);
|
||||
cr.setDash([4,1], 0);
|
||||
cr.stroke();
|
||||
|
||||
//draw the foreground
|
||||
|
||||
function makePath(values, reverse, nudge) {
|
||||
if (nudge == null) {
|
||||
nudge = 0;
|
||||
}
|
||||
//if we are going in reverse, we are completing the bottom of a chart, so use lineTo
|
||||
if (reverse) {
|
||||
cr.lineTo(values.length - 1, (1 - values[values.length - 1]) * height + nudge);
|
||||
for (let k = values.length - 2; k >= 0; --k) {
|
||||
cr.lineTo(k, (1 - values[k]) * height + nudge);
|
||||
}
|
||||
} else {
|
||||
cr.moveTo(0, (1 - values[0]) * height + nudge);
|
||||
for (let k = 1; k < values.length; ++k) {
|
||||
cr.lineTo(k, (1 - values[k]) * height + nudge);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let renderStats = this.renderStats;
|
||||
|
||||
// Make sure we don't have more sample points than pixels
|
||||
renderStats.map(Lang.bind(this, function(k){
|
||||
let stat = this.stats[k];
|
||||
if (stat.values.length > width) {
|
||||
stat.values = stat.values.slice(stat.values.length - width, stat.values.length);
|
||||
}
|
||||
}));
|
||||
|
||||
for (let i = 0; i < renderStats.length; ++i) {
|
||||
let stat = this.stats[renderStats[i]];
|
||||
// We outline at full opacity and fill with 40% opacity
|
||||
let outlineColor = themeNode.get_color(stat.color);
|
||||
let color = new Clutter.Color(outlineColor);
|
||||
color.alpha = color.alpha * .4;
|
||||
|
||||
// Render the background between us and the next level
|
||||
makePath(stat.values, false);
|
||||
// If there is a process below us, render the cpu between us and it, otherwise,
|
||||
// render to the bottom of the chart
|
||||
if (i == renderStats.length - 1) {
|
||||
cr.lineTo(stat.values.length - 1, height);
|
||||
cr.lineTo(0, height);
|
||||
cr.closePath();
|
||||
} else {
|
||||
let nextStat = this.stats[renderStats[i+1]];
|
||||
makePath(nextStat.values, true);
|
||||
}
|
||||
cr.closePath()
|
||||
Clutter.cairo_set_source_color(cr, color);
|
||||
cr.fill();
|
||||
|
||||
// Render the outline of this level
|
||||
makePath(stat.values, false, .5);
|
||||
Clutter.cairo_set_source_color(cr, outlineColor);
|
||||
cr.setLineWidth(1.0);
|
||||
cr.setDash([], 0);
|
||||
cr.stroke();
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
function CpuIndicator() {
|
||||
this._init();
|
||||
}
|
||||
const CpuIndicator = new Lang.Class({
|
||||
Name: 'SystemMonitor.CpuIndicator',
|
||||
Extends: Indicator,
|
||||
|
||||
CpuIndicator.prototype = {
|
||||
__proto__: Indicator.prototype,
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
this.gridColor = '-grid-color';
|
||||
this.renderStats = [ 'cpu-user', 'cpu-sys', 'cpu-iowait' ];
|
||||
|
||||
// Make sure renderStats is sorted as necessary for rendering
|
||||
let renderStatOrder = {'cpu-total': 0, 'cpu-user': 1, 'cpu-sys': 2, 'cpu-iowait': 3};
|
||||
this.renderStats = this.renderStats.sort(function(a,b) {
|
||||
return renderStatOrder[a] - renderStatOrder[b];
|
||||
});
|
||||
|
||||
this.setLabelText(_("CPU"));
|
||||
},
|
||||
|
||||
_initValues: function() {
|
||||
this._prev = new GTop.glibtop_cpu;
|
||||
GTop.glibtop_get_cpu(this._prev);
|
||||
|
||||
this.values = [];
|
||||
this.values.push({color: "-cpu-user-color", values: []});
|
||||
this.values.push({color: "-cpu-sys-color", values: []});
|
||||
this.values.push({color: "-cpu-iowait-color", values: []});
|
||||
this.stats = {
|
||||
'cpu-user': {color: '-cpu-user-color', values: []},
|
||||
'cpu-sys': {color: '-cpu-sys-color', values: []},
|
||||
'cpu-iowait': {color: '-cpu-iowait-color', values: []},
|
||||
'cpu-total': {color: '-cpu-total-color', values: []}
|
||||
};
|
||||
},
|
||||
|
||||
_updateValues: function() {
|
||||
@@ -98,61 +233,128 @@ CpuIndicator.prototype = {
|
||||
let user = cpu.user - this._prev.user;
|
||||
let sys = cpu.sys - this._prev.sys;
|
||||
let iowait = cpu.iowait - this._prev.iowait;
|
||||
let idle = cpu.idle - this._prev.idle;
|
||||
|
||||
t = user / total;
|
||||
this.values[0].values.push(t);
|
||||
|
||||
t += sys / total;
|
||||
this.values[1].values.push(t);
|
||||
t += iowait / total;
|
||||
this.values[2].values.push(t);
|
||||
|
||||
this.stats['cpu-iowait'].values.push(t);
|
||||
t += sys / total;
|
||||
this.stats['cpu-sys'].values.push(t);
|
||||
t += user / total;
|
||||
this.stats['cpu-user'].values.push(t);
|
||||
this.stats['cpu-total'].values.push(1 - idle / total);
|
||||
|
||||
this._prev = cpu;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
function MemoryIndicator() {
|
||||
this._init();
|
||||
}
|
||||
const MemoryIndicator = new Lang.Class({
|
||||
Name: 'SystemMonitor.MemoryIndicator',
|
||||
Extends: Indicator,
|
||||
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
MemoryIndicator.prototype = {
|
||||
__proto__: Indicator.prototype,
|
||||
this.gridColor = '-grid-color';
|
||||
this.renderStats = [ 'mem-user', 'mem-other', 'mem-cached' ];
|
||||
|
||||
// Make sure renderStats is sorted as necessary for rendering
|
||||
let renderStatOrder = { 'mem-cached': 0, 'mem-other': 1, 'mem-user': 2 };
|
||||
this.renderStats = this.renderStats.sort(function(a,b) {
|
||||
return renderStatOrder[a] - renderStatOrder[b];
|
||||
});
|
||||
|
||||
this.setLabelText(_("Memory"));
|
||||
},
|
||||
|
||||
_initValues: function() {
|
||||
this.mem = new GTop.glibtop_mem;
|
||||
this.values = [];
|
||||
this.values.push({ color: "-mem-user-color", values: [] });
|
||||
this.values.push({ color: "-mem-other-color", values: [] });
|
||||
this.values.push({ color: "-mem-cached-color", values: [] });
|
||||
this.stats = {
|
||||
'mem-user': { color: "-mem-user-color", values: [] },
|
||||
'mem-other': { color: "-mem-other-color", values: [] },
|
||||
'mem-cached': { color: "-mem-cached-color", values: [] }
|
||||
};
|
||||
},
|
||||
|
||||
_updateValues: function() {
|
||||
GTop.glibtop_get_mem(this.mem);
|
||||
|
||||
let t = this.mem.user / this.mem.total;
|
||||
this.values[0].values.push(t);
|
||||
this.stats['mem-user'].values.push(t);
|
||||
t += (this.mem.used - this.mem.user - this.mem.cached) / this.mem.total;
|
||||
this.values[1].values.push(t);
|
||||
this.stats['mem-other'].values.push(t);
|
||||
t += this.mem.cached / this.mem.total;
|
||||
this.values[2].values.push(t);
|
||||
this.stats['mem-cached'].values.push(t);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
const INDICATORS = [CpuIndicator, MemoryIndicator];
|
||||
|
||||
const Extension = new Lang.Class({
|
||||
Name: 'SystemMonitor.Extension',
|
||||
|
||||
_init: function() {
|
||||
Convenience.initTranslations();
|
||||
|
||||
this._showLabelTimeoutId = 0;
|
||||
this._resetHoverTimeoutId = 0;
|
||||
this._labelShowing = false;
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
this._box = new St.BoxLayout({ style_class: 'extension-systemMonitor-container',
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
x_expand: true });
|
||||
this._indicators = [ ];
|
||||
|
||||
for (let i = 0; i < INDICATORS.length; i++) {
|
||||
let indicator = new (INDICATORS[i])();
|
||||
|
||||
indicator.actor.connect('notify::hover', Lang.bind(this, function() {
|
||||
this._onHover(indicator);
|
||||
}));
|
||||
this._box.add_actor(indicator.actor);
|
||||
this._indicators.push(indicator);
|
||||
}
|
||||
|
||||
Main.messageTray.actor.add_actor(this._box);
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
this._indicators.forEach(function(i) { i.destroy(); });
|
||||
this._box.destroy();
|
||||
},
|
||||
|
||||
_onHover: function (item) {
|
||||
if (item.actor.get_hover()) {
|
||||
if (this._showLabelTimeoutId == 0) {
|
||||
let timeout = this._labelShowing ? 0 : ITEM_HOVER_TIMEOUT;
|
||||
this._showLabelTimeoutId = Mainloop.timeout_add(timeout,
|
||||
Lang.bind(this, function() {
|
||||
this._labelShowing = true;
|
||||
item.showLabel();
|
||||
return false;
|
||||
}));
|
||||
if (this._resetHoverTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._resetHoverTimeoutId);
|
||||
this._resetHoverTimeoutId = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this._showLabelTimeoutId > 0)
|
||||
Mainloop.source_remove(this._showLabelTimeoutId);
|
||||
this._showLabelTimeoutId = 0;
|
||||
item.hideLabel();
|
||||
if (this._labelShowing) {
|
||||
this._resetHoverTimeoutId = Mainloop.timeout_add(ITEM_HOVER_TIMEOUT,
|
||||
Lang.bind(this, function() {
|
||||
this._labelShowing = false;
|
||||
return false;
|
||||
}));
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
function init() {
|
||||
// nothing to do here
|
||||
}
|
||||
|
||||
function enable() {
|
||||
_cpuIndicator = new CpuIndicator();
|
||||
_memIndicator = new MemoryIndicator();
|
||||
_box = new St.BoxLayout({ style_class: 'extension-systemMonitor-container' });
|
||||
_box.add(_cpuIndicator.actor);
|
||||
_box.add(_memIndicator.actor);
|
||||
Main.messageTray.actor.add_actor(_box);
|
||||
}
|
||||
|
||||
function disable() {
|
||||
_cpuIndicator.destroy();
|
||||
_memIndicator.destroy();
|
||||
_box.destroy();
|
||||
return new Extension();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
{
|
||||
"shell-version": ["@shell_current@", "3.2" ],
|
||||
"shell-version": ["@shell_current@" ],
|
||||
"uuid": "@uuid@",
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"extension-id": "@extension_id@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"original-author": "zaspire@rambler.ru",
|
||||
"name": "SystemMonitor",
|
||||
"description": "System Monitor",
|
||||
|
||||
@@ -1,16 +1,35 @@
|
||||
.extension-systemMonitor-container {
|
||||
spacing: 5px;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
padding-bottom: 10px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.extension-systemMonitor-indicator-area {
|
||||
border: 1px solid #000;
|
||||
border: 1px solid #8d8d8d;
|
||||
border-radius: 3px;
|
||||
width: 100px;
|
||||
height: 34px;
|
||||
-cpu-user-color: #f00;
|
||||
-cpu-sys-color: #0f0;
|
||||
-cpu-iowait-color: #00f;
|
||||
-mem-user-color: #ff0;
|
||||
-mem-cached-color: #0ff;
|
||||
-mem-other-color: #111;
|
||||
background-color: #fff;
|
||||
/* message tray is 72px, so 20px padding of the container,
|
||||
2px of border, makes it 50px */
|
||||
height: 50px;
|
||||
-grid-color: #575757;
|
||||
-cpu-total-color: rgb(0,154,62);
|
||||
-cpu-user-color: rgb(69,154,0);
|
||||
-cpu-sys-color: rgb(255,253,81);
|
||||
-cpu-iowait-color: rgb(210,148,0);
|
||||
-mem-user-color: rgb(210,148,0);
|
||||
-mem-cached-color: rgb(90,90,90);
|
||||
-mem-other-color: rgb(205,203,41);
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
.extension-systemMonitor-indicator-label {
|
||||
border-radius: 7px;
|
||||
padding: 4px 12px;
|
||||
background-color: rgba(0,0,0,0.9);
|
||||
text-align: center;
|
||||
-y-offset: 8px;
|
||||
font-size: 9pt;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,5 @@
|
||||
EXTENSION_ID = user-theme
|
||||
|
||||
include ../../extension.mk
|
||||
include ../../settings.mk
|
||||
|
||||
gschemas_in = org.gnome.shell.extensions.user-theme.gschema.xml.in
|
||||
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
|
||||
gsettings_SCHEMAS = $(gschemas_in:.xml.in=.xml)
|
||||
|
||||
@GSETTINGS_RULES@
|
||||
|
||||
CLEANFILES += $(gschemas_in:.xml.in=.valid) $(gsettings_SCHEMAS)
|
||||
EXTRA_DIST += $(gschemas_in)
|
||||
|
||||
@@ -6,19 +6,20 @@ const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.user-theme';
|
||||
const SETTINGS_KEY = 'name';
|
||||
|
||||
function ThemeManager() {
|
||||
this._init();
|
||||
}
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const ThemeManager = new Lang.Class({
|
||||
Name: 'UserTheme.ThemeManager',
|
||||
|
||||
ThemeManager.prototype = {
|
||||
_init: function() {
|
||||
this._settings = Convenience.getSettings();
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||
this._changedId = this._settings.connect('changed::'+SETTINGS_KEY, Lang.bind(this, this._changeTheme));
|
||||
this._changeTheme();
|
||||
},
|
||||
@@ -29,8 +30,6 @@ ThemeManager.prototype = {
|
||||
this._changedId = 0;
|
||||
}
|
||||
|
||||
this._settings = null;
|
||||
|
||||
Main.setThemeStylesheet(null);
|
||||
Main.loadTheme();
|
||||
},
|
||||
@@ -64,9 +63,8 @@ ThemeManager.prototype = {
|
||||
Main.setThemeStylesheet(_stylesheet);
|
||||
Main.loadTheme();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function init(metadata) {
|
||||
function init() {
|
||||
return new ThemeManager();
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
{
|
||||
"uuid": "@uuid@",
|
||||
"extension-id": "@extension_id@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "User Themes",
|
||||
"description": "Load shell themes from user directory",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"original-authors": [ "john.stowers@gmail.com" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
10
extensions/window-list/Makefile.am
Normal file
10
extensions/window-list/Makefile.am
Normal file
@@ -0,0 +1,10 @@
|
||||
EXTENSION_ID = window-list
|
||||
|
||||
EXTRA_MODULES = prefs.js
|
||||
|
||||
if CLASSIC_MODE
|
||||
EXTRA_MODULES += classic.css
|
||||
endif
|
||||
|
||||
include ../../extension.mk
|
||||
include ../../settings.mk
|
||||
42
extensions/window-list/classic.css
Normal file
42
extensions/window-list/classic.css
Normal file
@@ -0,0 +1,42 @@
|
||||
@import url("stylesheet.css");
|
||||
|
||||
#panel.bottom-panel {
|
||||
border-top-width: 1px;
|
||||
border-bottom-width: 0px;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button > StWidget {
|
||||
background-color: #e9e9e9 !important;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-end: #d0d0d0;
|
||||
color: #555 !important;
|
||||
border-radius: 2px !important;
|
||||
text-shadow: 0 0 transparent;
|
||||
box-shadow: inset -1px -1px 1px rgba(0,0,0,0.5) !important;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button:hover > StWidget {
|
||||
background-color: #f9f9f9 !important;
|
||||
background-gradient-end: #e0e0e0;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button:active > StWidget {
|
||||
box-shadow: inset 1px 1px 2px rgba(0,0,0,0.5) !important;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button.focused > StWidget {
|
||||
background-color: #a9a9a9 !important;
|
||||
background-gradient-end: #b0b0b0;
|
||||
box-shadow: inset 1px 1px 2px rgba(0,0,0,0.5) !important;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button.focused:hover > StWidget {
|
||||
background-color: #b9b9b9 !important;
|
||||
background-gradient-end: #c0c0c0;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button.minimized > StWidget {
|
||||
color: #888 !important;
|
||||
box-shadow: inset -1px -1px 1px rgba(0,0,0,0.4) !important;
|
||||
}
|
||||
|
||||
647
extensions/window-list/extension.js
Normal file
647
extensions/window-list/extension.js
Normal file
@@ -0,0 +1,647 @@
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Hash = imports.misc.hash;
|
||||
const Lang = imports.lang;
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const GroupingMode = {
|
||||
NEVER: 0,
|
||||
ALWAYS: 1
|
||||
};
|
||||
|
||||
|
||||
function _minimizeOrActivateWindow(window) {
|
||||
let focusWindow = global.display.focus_window;
|
||||
if (focusWindow == window ||
|
||||
focusWindow && focusWindow.get_transient_for() == window)
|
||||
window.minimize();
|
||||
else
|
||||
window.activate(global.get_current_time());
|
||||
}
|
||||
|
||||
|
||||
const WindowTitle = new Lang.Class({
|
||||
Name: 'WindowTitle',
|
||||
|
||||
_init: function(metaWindow) {
|
||||
this._metaWindow = metaWindow;
|
||||
this.actor = new St.BoxLayout();
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
let icon = textureCache.bind_pixbuf_property(this._metaWindow, "icon");
|
||||
this._icon = new St.Bin({ style_class: 'window-button-icon',
|
||||
child: icon });
|
||||
this.actor.add(this._icon);
|
||||
this._label = new St.Label();
|
||||
this.actor.add(this._label);
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._notifyTitleId =
|
||||
this._metaWindow.connect('notify::title',
|
||||
Lang.bind(this, this._updateTitle));
|
||||
this._notifyMinimizedId =
|
||||
this._metaWindow.connect('notify::minimized',
|
||||
Lang.bind(this, this._minimizedChanged));
|
||||
this._minimizedChanged();
|
||||
},
|
||||
|
||||
_minimizedChanged: function() {
|
||||
this._icon.opacity = this._metaWindow.minimized ? 128 : 255;
|
||||
this._updateTitle();
|
||||
},
|
||||
|
||||
_updateTitle: function() {
|
||||
if (this._metaWindow.minimized)
|
||||
this._label.text = '[%s]'.format(this._metaWindow.title);
|
||||
else
|
||||
this._label.text = this._metaWindow.title;
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
this._metaWindow.disconnect(this._notifyTitleId);
|
||||
this._metaWindow.disconnect(this._notifyMinimizedId);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const WindowButton = new Lang.Class({
|
||||
Name: 'WindowButton',
|
||||
|
||||
_init: function(metaWindow) {
|
||||
this.metaWindow = metaWindow;
|
||||
|
||||
this._windowTitle = new WindowTitle(this.metaWindow);
|
||||
this.actor = new St.Button({ style_class: 'window-button',
|
||||
x_fill: true,
|
||||
can_focus: true,
|
||||
child: this._windowTitle.actor });
|
||||
this.actor._delegate = this;
|
||||
|
||||
this.actor.connect('allocation-changed',
|
||||
Lang.bind(this, this._updateIconGeometry));
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._switchWorkspaceId =
|
||||
global.window_manager.connect('switch-workspace',
|
||||
Lang.bind(this, this._updateVisibility));
|
||||
this._updateVisibility();
|
||||
|
||||
this._notifyFocusId =
|
||||
global.display.connect('notify::focus-window',
|
||||
Lang.bind(this, this._updateStyle));
|
||||
this._updateStyle();
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
_minimizeOrActivateWindow(this.metaWindow);
|
||||
},
|
||||
|
||||
_updateStyle: function() {
|
||||
if (this.metaWindow.minimized)
|
||||
this.actor.add_style_class_name('minimized');
|
||||
else
|
||||
this.actor.remove_style_class_name('minimized');
|
||||
|
||||
if (global.display.focus_window == this.metaWindow)
|
||||
this.actor.add_style_class_name('focused');
|
||||
else
|
||||
this.actor.remove_style_class_name('focused');
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
let workspace = global.screen.get_active_workspace();
|
||||
this.actor.visible = this.metaWindow.located_on_workspace(workspace);
|
||||
},
|
||||
|
||||
_updateIconGeometry: function() {
|
||||
let rect = new Meta.Rectangle();
|
||||
|
||||
[rect.x, rect.y] = this.actor.get_transformed_position();
|
||||
[rect.width, rect.height] = this.actor.get_transformed_size();
|
||||
|
||||
this.metaWindow.set_icon_geometry(rect);
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
global.window_manager.disconnect(this._switchWorkspaceId);
|
||||
global.display.disconnect(this._notifyFocusId);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const AppButton = new Lang.Class({
|
||||
Name: 'AppButton',
|
||||
|
||||
_init: function(app) {
|
||||
this.app = app;
|
||||
|
||||
let stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||
this.actor = new St.Button({ style_class: 'window-button',
|
||||
x_fill: true,
|
||||
can_focus: true,
|
||||
child: stack });
|
||||
this.actor._delegate = this;
|
||||
|
||||
this.actor.connect('allocation-changed',
|
||||
Lang.bind(this, this._updateIconGeometry));
|
||||
|
||||
this._singleWindowTitle = new St.Bin({ x_expand: true,
|
||||
x_align: St.Align.START });
|
||||
stack.add_actor(this._singleWindowTitle);
|
||||
|
||||
this._multiWindowTitle = new St.BoxLayout({ x_expand: true });
|
||||
stack.add_actor(this._multiWindowTitle);
|
||||
|
||||
let icon = new St.Bin({ style_class: 'window-button-icon',
|
||||
child: app.create_icon_texture(24) });
|
||||
this._multiWindowTitle.add(icon);
|
||||
this._multiWindowTitle.add(new St.Label({ text: app.get_name() }));
|
||||
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
this._menu = new PopupMenu.PopupMenu(this.actor, 0.5, St.Side.BOTTOM);
|
||||
this._menu.actor.hide();
|
||||
this._menu.connect('activate', Lang.bind(this, this._onMenuActivate));
|
||||
this._menuManager.addMenu(this._menu);
|
||||
Main.uiGroup.add_actor(this._menu.actor);
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._switchWorkspaceId =
|
||||
global.window_manager.connect('switch-workspace',
|
||||
Lang.bind(this, this._updateVisibility));
|
||||
this._updateVisibility();
|
||||
|
||||
this._windowsChangedId =
|
||||
this.app.connect('windows-changed',
|
||||
Lang.bind(this, this._windowsChanged));
|
||||
this._windowsChanged();
|
||||
|
||||
this._windowTracker = Shell.WindowTracker.get_default();
|
||||
this._notifyFocusId =
|
||||
this._windowTracker.connect('notify::focus-app',
|
||||
Lang.bind(this, this._updateStyle));
|
||||
this._updateStyle();
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
let workspace = global.screen.get_active_workspace();
|
||||
this.actor.visible = this.app.is_on_workspace(workspace);
|
||||
},
|
||||
|
||||
_updateStyle: function() {
|
||||
if (this._windowTracker.focus_app == this.app)
|
||||
this.actor.add_style_class_name('focused');
|
||||
else
|
||||
this.actor.remove_style_class_name('focused');
|
||||
},
|
||||
|
||||
_updateIconGeometry: function() {
|
||||
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);
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
_getWindowList: function() {
|
||||
let workspace = global.screen.get_active_workspace();
|
||||
return this.app.get_windows().filter(function(win) {
|
||||
return win.located_on_workspace(workspace);
|
||||
});
|
||||
},
|
||||
|
||||
_windowsChanged: function() {
|
||||
let windows = this._getWindowList();
|
||||
this._singleWindowTitle.visible = windows.length == 1;
|
||||
this._multiWindowTitle.visible = !this._singleWindowTitle.visible;
|
||||
|
||||
if (this._singleWindowTitle.visible) {
|
||||
if (!this._windowTitle) {
|
||||
this._windowTitle = new WindowTitle(windows[0]);
|
||||
this._singleWindowTitle.child = this._windowTitle.actor;
|
||||
}
|
||||
} else {
|
||||
if (this._windowTitle) {
|
||||
this._singleWindowTitle.child = null;
|
||||
this._windowTitle = null;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
if (this._menu.isOpen) {
|
||||
this._menu.close();
|
||||
return;
|
||||
}
|
||||
|
||||
let windows = this._getWindowList();
|
||||
if (windows.length == 1) {
|
||||
_minimizeOrActivateWindow(windows[0]);
|
||||
} else {
|
||||
this._menu.removeAll();
|
||||
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let windowTitle = new WindowTitle(windows[i]);
|
||||
let item = new PopupMenu.PopupBaseMenuItem();
|
||||
item.addActor(windowTitle.actor);
|
||||
item._window = windows[i];
|
||||
this._menu.addMenuItem(item);
|
||||
}
|
||||
this._menu.open();
|
||||
|
||||
let event = Clutter.get_current_event();
|
||||
if (event && event.type() == Clutter.EventType.KEY_RELEASE)
|
||||
this._menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
}
|
||||
},
|
||||
|
||||
_onMenuActivate: function(menu, child) {
|
||||
child._window.activate(global.get_current_time());
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
global.window_manager.disconnect(this._switchWorkspaceId);
|
||||
this._windowTracker.disconnect(this._notifyFocusId);
|
||||
this.app.disconnect(this._windowsChangedId);
|
||||
this._menu.actor.destroy();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const TrayButton = new Lang.Class({
|
||||
Name: 'TrayButton',
|
||||
|
||||
_init: function() {
|
||||
this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
|
||||
x_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
y_expand: true });
|
||||
this.actor = new St.Button({ style_class: 'summary-source-counter',
|
||||
child: this._counterLabel,
|
||||
layoutManager: new Clutter.BinLayout() });
|
||||
this.actor.set_x_align(Clutter.ActorAlign.END);
|
||||
this.actor.set_x_expand(true);
|
||||
this.actor.set_y_expand(true);
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
if (Main.messageTray._trayState == MessageTray.State.HIDDEN)
|
||||
Main.messageTray.toggle();
|
||||
}));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._trayItemCount = 0;
|
||||
Main.messageTray.getSources().forEach(Lang.bind(this,
|
||||
function(source) {
|
||||
this._sourceAdded(Main.messageTray, source);
|
||||
}));
|
||||
this._sourceAddedId =
|
||||
Main.messageTray.connect('source-added',
|
||||
Lang.bind(this, this._sourceAdded));
|
||||
this._sourceRemovedId =
|
||||
Main.messageTray.connect('source-removed',
|
||||
Lang.bind(this, this._sourceRemoved));
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_sourceAdded: function(tray, source) {
|
||||
this._trayItemCount++;
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_sourceRemoved: function(source) {
|
||||
this._trayItemCount--;
|
||||
this.actor.checked = false;
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
this._counterLabel.text = this._trayItemCount.toString();
|
||||
this.actor.visible = this._trayItemCount > 0;
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
Main.messageTray.getSources().forEach(Lang.bind(this,
|
||||
function(source) {
|
||||
if (!source._windowListDestroyId)
|
||||
return;
|
||||
source.disconnect(source._windowListDestroyId)
|
||||
delete source._windowListDestroyId;
|
||||
}));
|
||||
Main.messageTray.disconnect(this._sourceAddedId);
|
||||
Main.messageTray.disconnect(this._sourceRemovedId);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const WindowList = new Lang.Class({
|
||||
Name: 'WindowList',
|
||||
|
||||
_init: function() {
|
||||
this.actor = new St.Widget({ name: 'panel',
|
||||
style_class: 'bottom-panel',
|
||||
reactive: true,
|
||||
track_hover: true,
|
||||
layout_manager: new Clutter.BinLayout()});
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
let box = new St.BoxLayout({ x_expand: true, y_expand: true });
|
||||
this.actor.add_actor(box);
|
||||
|
||||
let layout = new Clutter.BoxLayout({ homogeneous: true });
|
||||
this._windowList = new St.Widget({ style_class: 'window-list',
|
||||
layout_manager: layout,
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
x_expand: true,
|
||||
y_expand: true });
|
||||
box.add(this._windowList, { expand: true });
|
||||
|
||||
this._windowList.connect('style-changed', Lang.bind(this,
|
||||
function() {
|
||||
let node = this._windowList.get_theme_node();
|
||||
let spacing = node.get_length('spacing');
|
||||
this._windowList.layout_manager.spacing = spacing;
|
||||
}));
|
||||
|
||||
this._trayButton = new TrayButton();
|
||||
box.add(this._trayButton.actor);
|
||||
|
||||
Main.layoutManager.addChrome(this.actor, { affectsStruts: true,
|
||||
trackFullscreen: true });
|
||||
Main.ctrlAltTabManager.addGroup(this.actor, _('Window List'), 'start-here-symbolic');
|
||||
|
||||
this._appSystem = Shell.AppSystem.get_default();
|
||||
this._appStateChangedId =
|
||||
this._appSystem.connect('app-state-changed',
|
||||
Lang.bind(this, this._onAppStateChanged));
|
||||
|
||||
this._monitorsChangedId =
|
||||
Main.layoutManager.connect('monitors-changed',
|
||||
Lang.bind(this, this._updatePosition));
|
||||
this._updatePosition();
|
||||
|
||||
this._keyboardVisiblechangedId =
|
||||
Main.layoutManager.connect('keyboard-visible-changed',
|
||||
Lang.bind(this, function(o, state) {
|
||||
Main.layoutManager.keyboardBox.visible = state;
|
||||
Main.uiGroup.set_child_above_sibling(windowList.actor,
|
||||
Main.layoutManager.keyboardBox);
|
||||
this._updateKeyboardAnchor();
|
||||
}));
|
||||
|
||||
this._workspaceSignals = new Hash.Map();
|
||||
this._nWorkspacesChangedId =
|
||||
global.screen.connect('notify::n-workspaces',
|
||||
Lang.bind(this, this._onWorkspacesChanged));
|
||||
this._onWorkspacesChanged();
|
||||
|
||||
this._overviewShowingId =
|
||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||
this.actor.hide();
|
||||
this._updateKeyboardAnchor();
|
||||
}));
|
||||
|
||||
this._overviewHidingId =
|
||||
Main.overview.connect('hiding', Lang.bind(this, function() {
|
||||
this.actor.show();
|
||||
this._updateKeyboardAnchor();
|
||||
}));
|
||||
|
||||
this._settings = Convenience.getSettings();
|
||||
this._groupingModeChangedId =
|
||||
this._settings.connect('changed::grouping-mode',
|
||||
Lang.bind(this, this._groupingModeChanged));
|
||||
this._groupingModeChanged();
|
||||
},
|
||||
|
||||
_groupingModeChanged: function() {
|
||||
this._groupingMode = this._settings.get_enum('grouping-mode');
|
||||
this._populateWindowList();
|
||||
},
|
||||
|
||||
_populateWindowList: function() {
|
||||
this._windowList.destroy_all_children();
|
||||
|
||||
if (this._groupingMode == GroupingMode.NEVER) {
|
||||
let windows = Meta.get_window_actors(global.screen);
|
||||
for (let i = 0; i < windows.length; i++)
|
||||
this._onWindowAdded(null, windows[i].metaWindow);
|
||||
} else {
|
||||
let apps = this._appSystem.get_running();
|
||||
for (let i = 0; i < apps.length; i++)
|
||||
this._addApp(apps[i]);
|
||||
}
|
||||
},
|
||||
|
||||
_updatePosition: function() {
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
this.actor.width = monitor.width;
|
||||
this.actor.set_position(monitor.x, monitor.y + monitor.height - this.actor.height);
|
||||
},
|
||||
|
||||
_updateKeyboardAnchor: function() {
|
||||
if (!Main.keyboard.actor)
|
||||
return;
|
||||
|
||||
let anchorY = Main.overview.visible ? 0 : this.actor.height;
|
||||
Main.keyboard.actor.anchor_y = anchorY;
|
||||
},
|
||||
|
||||
_onAppStateChanged: function(appSys, app) {
|
||||
if (this._groupingMode != GroupingMode.ALWAYS)
|
||||
return;
|
||||
|
||||
if (app.state == Shell.AppState.RUNNING)
|
||||
this._addApp(app);
|
||||
else if (app.state == Shell.AppState.STOPPED)
|
||||
this._removeApp(app);
|
||||
},
|
||||
|
||||
_addApp: function(app) {
|
||||
let button = new AppButton(app);
|
||||
this._windowList.layout_manager.pack(button.actor,
|
||||
true, true, true,
|
||||
Clutter.BoxAlignment.START,
|
||||
Clutter.BoxAlignment.START);
|
||||
},
|
||||
|
||||
_removeApp: function(app) {
|
||||
let children = this._windowList.get_children();
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
if (children[i]._delegate.app == app) {
|
||||
children[i].destroy();
|
||||
return;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_onWindowAdded: function(ws, win) {
|
||||
if (!Shell.WindowTracker.get_default().is_window_interesting(win))
|
||||
return;
|
||||
|
||||
if (this._groupingMode != GroupingMode.NEVER)
|
||||
return;
|
||||
|
||||
let button = new WindowButton(win);
|
||||
this._windowList.layout_manager.pack(button.actor,
|
||||
true, true, true,
|
||||
Clutter.BoxAlignment.START,
|
||||
Clutter.BoxAlignment.START);
|
||||
},
|
||||
|
||||
_onWindowRemoved: function(ws, win) {
|
||||
if (this._groupingMode != GroupingMode.NEVER)
|
||||
return;
|
||||
|
||||
let children = this._windowList.get_children();
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
if (children[i]._delegate.metaWindow == win) {
|
||||
children[i].destroy();
|
||||
return;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_onWorkspacesChanged: function() {
|
||||
let numWorkspaces = global.screen.n_workspaces;
|
||||
for (let i = 0; i < numWorkspaces; i++) {
|
||||
let workspace = global.screen.get_workspace_by_index(i);
|
||||
if (this._workspaceSignals.has(workspace))
|
||||
continue;
|
||||
|
||||
let signals = { windowAddedId: 0, windowRemovedId: 0 };
|
||||
signals._windowAddedId =
|
||||
workspace.connect('window-added',
|
||||
Lang.bind(this, this._onWindowAdded));
|
||||
signals._windowRemovedId =
|
||||
workspace.connect('window-removed',
|
||||
Lang.bind(this, this._onWindowRemoved));
|
||||
this._workspaceSignals.set(workspace, signals);
|
||||
}
|
||||
},
|
||||
|
||||
_disconnectWorkspaceSignals: function() {
|
||||
let numWorkspaces = global.screen.n_workspaces;
|
||||
for (let i = 0; i < numWorkspaces; i++) {
|
||||
let workspace = global.screen.get_workspace_by_index(i);
|
||||
let signals = this._workspaceSignals.delete(workspace)[1];
|
||||
workspace.disconnect(signals._windowAddedId);
|
||||
workspace.disconnect(signals._windowRemovedId);
|
||||
}
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
|
||||
Main.ctrlAltTabManager.removeGroup(this.actor);
|
||||
|
||||
this._appSystem.disconnect(this._appStateChangedId);
|
||||
this._appStateChangedId = 0;
|
||||
|
||||
Main.layoutManager.disconnect(this._monitorsChangedId);
|
||||
this._monitorsChangedId = 0;
|
||||
|
||||
Main.layoutManager.disconnect(this._keyboardVisiblechangedId);
|
||||
this._keyboardVisiblechangedId = 0;
|
||||
|
||||
Main.layoutManager.hideKeyboard();
|
||||
|
||||
this._disconnectWorkspaceSignals();
|
||||
global.screen.disconnect(this._nWorkspacesChangedId);
|
||||
this._nWorkspacesChangedId = 0;
|
||||
|
||||
Main.overview.disconnect(this._overviewShowingId);
|
||||
Main.overview.disconnect(this._overviewHidingId);
|
||||
|
||||
this._settings.disconnect(this._groupingModeChangedId);
|
||||
|
||||
let windows = Meta.get_window_actors(global.screen);
|
||||
for (let i = 0; i < windows.length; i++)
|
||||
windows[i].metaWindow.set_icon_geometry(null);
|
||||
}
|
||||
});
|
||||
|
||||
let windowList;
|
||||
let injections = {};
|
||||
let notificationParent;
|
||||
|
||||
function init() {
|
||||
}
|
||||
|
||||
function enable() {
|
||||
windowList = new WindowList();
|
||||
|
||||
windowList.actor.connect('notify::hover', Lang.bind(Main.messageTray,
|
||||
function() {
|
||||
this._pointerInTray = windowList.actor.hover;
|
||||
this._updateState();
|
||||
}));
|
||||
|
||||
injections['_trayDwellTimeout'] = MessageTray.MessageTray.prototype._trayDwellTimeout;
|
||||
MessageTray.MessageTray.prototype._trayDwellTimeout = function() {
|
||||
return false;
|
||||
};
|
||||
|
||||
injections['_tween'] = MessageTray.MessageTray.prototype._tween;
|
||||
MessageTray.MessageTray.prototype._tween = function(actor, statevar, value, params) {
|
||||
if (!Main.overview.visible) {
|
||||
let anchorY;
|
||||
if (statevar == '_trayState')
|
||||
anchorY = windowList.actor.height;
|
||||
else if (statevar == '_notificationState')
|
||||
anchorY = -windowList.actor.height;
|
||||
else
|
||||
anchorY = 0;
|
||||
actor.anchor_y = anchorY;
|
||||
}
|
||||
injections['_tween'].call(Main.messageTray, actor, statevar, value, params);
|
||||
};
|
||||
injections['_onTrayHidden'] = MessageTray.MessageTray.prototype._onTrayHidden;
|
||||
MessageTray.MessageTray.prototype._onTrayHidden = function() {
|
||||
this.actor.anchor_y = 0;
|
||||
injections['_onTrayHidden'].call(Main.messageTray);
|
||||
};
|
||||
|
||||
notificationParent = Main.messageTray._notificationWidget.get_parent();
|
||||
Main.messageTray._notificationWidget.hide();
|
||||
Main.messageTray._notificationWidget.reparent(windowList.actor);
|
||||
Main.messageTray._notificationWidget.show();
|
||||
}
|
||||
|
||||
function disable() {
|
||||
if (!windowList)
|
||||
return;
|
||||
|
||||
windowList.actor.hide();
|
||||
|
||||
if (notificationParent) {
|
||||
Main.messageTray._notificationWidget.reparent(notificationParent);
|
||||
notificationParent = null;
|
||||
}
|
||||
|
||||
windowList.actor.destroy();
|
||||
windowList = null;
|
||||
|
||||
for (prop in injections)
|
||||
MessageTray.MessageTray.prototype[prop] = injections[prop];
|
||||
|
||||
Main.messageTray._notificationWidget.set_anchor_point(0, 0);
|
||||
Main.messageTray.actor.set_anchor_point(0, 0);
|
||||
}
|
||||
10
extensions/window-list/metadata.json.in
Normal file
10
extensions/window-list/metadata.json.in
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Window List",
|
||||
"description": "Display a window list at the bottom of the screen",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<enum id="org.gnome.shell.extensions.window-list.GroupingMode">
|
||||
<value value="0" nick="never"/>
|
||||
<value value="1" nick="always"/>
|
||||
</enum>
|
||||
<schema id="org.gnome.shell.extensions.window-list"
|
||||
path="/org/gnome/shell/extensions/window-list/">
|
||||
<key name="grouping-mode"
|
||||
enum="org.gnome.shell.extensions.window-list.GroupingMode">
|
||||
<default>'never'</default>
|
||||
<_summary>When to group windows</_summary>
|
||||
<_description>
|
||||
Decides when to group windows from the same application on the
|
||||
window list. Possible values are "never" and "always".
|
||||
</_description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
80
extensions/window-list/prefs.js
Normal file
80
extensions/window-list/prefs.js
Normal file
@@ -0,0 +1,80 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
const WindowListPrefsWidget = new GObject.Class({
|
||||
Name: 'WindowList.Prefs.Widget',
|
||||
GTypeName: 'WindowListPrefsWidget',
|
||||
Extends: Gtk.Frame,
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
|
||||
this.shadow_type = Gtk.ShadowType.NONE;
|
||||
this.margin = 24;
|
||||
|
||||
let title = '<b>' + _("Window Grouping") + '</b>';
|
||||
let titleLabel = new Gtk.Label({ use_markup: true, label: title });
|
||||
this.set_label_widget(titleLabel);
|
||||
|
||||
let align = new Gtk.Alignment({ left_padding: 12 });
|
||||
this.add(align);
|
||||
|
||||
let grid = new Gtk.Grid({ orientation: Gtk.Orientation.VERTICAL,
|
||||
row_spacing: 6,
|
||||
column_spacing: 6,
|
||||
margin_top: 6 });
|
||||
align.add(grid);
|
||||
|
||||
this._settings = Convenience.getSettings();
|
||||
let currentMode = this._settings.get_string('grouping-mode');
|
||||
let range = this._settings.get_range('grouping-mode');
|
||||
let modes = range.deep_unpack()[1].deep_unpack();
|
||||
|
||||
let modeLabels = {
|
||||
'never': _("Never group windows"),
|
||||
'always': _("Always group windows")
|
||||
};
|
||||
|
||||
let radio = null;
|
||||
for (let i = 0; i < modes.length; i++) {
|
||||
let mode = modes[i];
|
||||
let label = modeLabels[mode];
|
||||
if (!label) {
|
||||
log('Unhandled option "%s" for grouping-mode'.format(mode));
|
||||
continue;
|
||||
}
|
||||
|
||||
radio = new Gtk.RadioButton({ group: radio,
|
||||
label: label,
|
||||
active: currentMode == mode });
|
||||
grid.add(radio);
|
||||
|
||||
radio.connect('toggled', Lang.bind(this, function(button) {
|
||||
if (button.active)
|
||||
this._settings.set_string('grouping-mode', mode);
|
||||
}));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function buildPrefsWidget() {
|
||||
let widget = new WindowListPrefsWidget();
|
||||
widget.show_all();
|
||||
|
||||
return widget;
|
||||
}
|
||||
67
extensions/window-list/stylesheet.css
Normal file
67
extensions/window-list/stylesheet.css
Normal file
@@ -0,0 +1,67 @@
|
||||
.bottom-panel {
|
||||
/* .window-button-icon height +
|
||||
.window-button vertical padding +
|
||||
.window-button > StWidget vertical padding) */
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.window-list {
|
||||
spacing: 2px;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
.window-button {
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.window-button:first-child:ltr {
|
||||
padding-left: 2px;
|
||||
}
|
||||
|
||||
.window-button:last-child:rtl {
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
.window-button > StWidget {
|
||||
max-width: 250px;
|
||||
color: #bbb;
|
||||
background-color: black;
|
||||
border-radius: 4px;
|
||||
padding: 3px 6px 1px;
|
||||
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.5);
|
||||
text-shadow: 1px 1px 4px rgba(0,0,0,0.8);
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.window-button:hover > StWidget {
|
||||
color: white;
|
||||
background-color: #1f1f1f;
|
||||
}
|
||||
|
||||
.window-button:active > StWidget,
|
||||
.window-button:focus > StWidget {
|
||||
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.window-button.focused > StWidget {
|
||||
color: white;
|
||||
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.7);
|
||||
}
|
||||
|
||||
.window-button.focused:active > StWidget {
|
||||
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.7);
|
||||
}
|
||||
|
||||
.window-button.minimized > StWidget {
|
||||
color: #666;
|
||||
box-shadow: inset -1px -1px 4px rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.window-button.minimized:active > StWidget {
|
||||
box-shadow: inset -2px -2px 4px rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.window-button-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
@@ -33,31 +33,15 @@ function resetState() {
|
||||
function enable() {
|
||||
resetState();
|
||||
|
||||
Workspace.WindowOverlay.prototype.setId = function(id) {
|
||||
if (this._text.visible && id == null)
|
||||
this._text.hide();
|
||||
this._id = id;
|
||||
if (id != null)
|
||||
this._text.text = this._id.toString();
|
||||
}
|
||||
winInjections['setId'] = undefined;
|
||||
|
||||
Workspace.WindowOverlay.prototype.getId = function() {
|
||||
return this._id;
|
||||
}
|
||||
winInjections['getId'] = undefined;
|
||||
|
||||
Workspace.WindowOverlay.prototype.showTooltip = function() {
|
||||
if (this._id === null)
|
||||
return;
|
||||
this._text.raise_top();
|
||||
this._text.show();
|
||||
this._text.text = this._id.toString();
|
||||
this._text.text = (this._windowClone.slotId + 1).toString();
|
||||
}
|
||||
winInjections['showTooltip'] = undefined;
|
||||
|
||||
Workspace.WindowOverlay.prototype.hideTooltip = function() {
|
||||
if (this._text.visible)
|
||||
if (this._text && this._text.visible)
|
||||
this._text.hide();
|
||||
}
|
||||
winInjections['hideTooltip'] = undefined;
|
||||
@@ -83,11 +67,9 @@ function enable() {
|
||||
workspaceInjections['hideTooltip'] = undefined;
|
||||
|
||||
Workspace.Workspace.prototype.getWindowWithTooltip = function(id) {
|
||||
for (let i in this._windowOverlays) {
|
||||
if (this._windowOverlays[i] == null)
|
||||
continue;
|
||||
if (this._windowOverlays[i].getId() === id)
|
||||
return this._windowOverlays[i]._windowClone.metaWindow;
|
||||
for (let i = 0; i < this._windows.length; i++) {
|
||||
if ((this._windows[i].slotId + 1) == id)
|
||||
return this._windows[i].metaWindow;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -127,15 +109,24 @@ function enable() {
|
||||
workViewInjections['_hideWorkspacesTooltips'] = undefined;
|
||||
|
||||
WorkspacesView.WorkspacesView.prototype._onKeyRelease = function(s, o) {
|
||||
if (this._pickWindow && o.get_key_symbol() == Clutter.KEY_Alt_L)
|
||||
if (this._pickWindow &&
|
||||
(o.get_key_symbol() == Clutter.KEY_Alt_L ||
|
||||
o.get_key_symbol() == Clutter.KEY_Alt_R))
|
||||
this._hideTooltips();
|
||||
if (this._pickWorkspace && o.get_key_symbol() == Clutter.KEY_Control_L)
|
||||
if (this._pickWorkspace &&
|
||||
(o.get_key_symbol() == Clutter.KEY_Control_L ||
|
||||
o.get_key_symbol() == Clutter.KEY_Control_R))
|
||||
this._hideWorkspacesTooltips();
|
||||
}
|
||||
workViewInjections['_onKeyRelease'] = undefined;
|
||||
|
||||
WorkspacesView.WorkspacesView.prototype._onKeyPress = function(s, o) {
|
||||
if (o.get_key_symbol() == Clutter.KEY_Alt_L && !this._pickWorkspace) {
|
||||
if(Main.overview._viewSelector._activePage != Main.overview._viewSelector._workspacesPage)
|
||||
return false;
|
||||
|
||||
if ((o.get_key_symbol() == Clutter.KEY_Alt_L ||
|
||||
o.get_key_symbol() == Clutter.KEY_Alt_R)
|
||||
&& !this._pickWorkspace) {
|
||||
this._prevFocusActor = global.stage.get_key_focus();
|
||||
global.stage.set_key_focus(null);
|
||||
this._active = global.screen.get_active_workspace_index();
|
||||
@@ -143,7 +134,9 @@ function enable() {
|
||||
this._workspaces[global.screen.get_active_workspace_index()].showWindowsTooltips();
|
||||
return true;
|
||||
}
|
||||
if (o.get_key_symbol() == Clutter.KEY_Control_L && !this._pickWindow) {
|
||||
if ((o.get_key_symbol() == Clutter.KEY_Control_L ||
|
||||
o.get_key_symbol() == Clutter.KEY_Control_R)
|
||||
&& !this._pickWindow) {
|
||||
this._prevFocusActor = global.stage.get_key_focus();
|
||||
global.stage.set_key_focus(null);
|
||||
this._pickWorkspace = true;
|
||||
@@ -155,16 +148,26 @@ function enable() {
|
||||
if (global.stage.get_key_focus() != global.stage)
|
||||
return false;
|
||||
|
||||
// ignore shift presses, they're required to get numerals in azerty keyboards
|
||||
if ((this._pickWindow || this._pickWorkspace) &&
|
||||
(o.get_key_symbol() == Clutter.KEY_Shift_L ||
|
||||
o.get_key_symbol() == Clutter.KEY_Shift_R))
|
||||
return true;
|
||||
|
||||
if (this._pickWindow) {
|
||||
if (this._active != global.screen.get_active_workspace_index()) {
|
||||
this._hideTooltips();
|
||||
return false;
|
||||
}
|
||||
|
||||
let c = o.get_key_symbol() - Clutter.KEY_0;
|
||||
let c = o.get_key_symbol() - Clutter.KEY_KP_0;
|
||||
if (c > 9 || c <= 0) {
|
||||
this._hideTooltips();
|
||||
return false;
|
||||
c = o.get_key_symbol() - Clutter.KEY_0;
|
||||
if (c > 9 || c <= 0) {
|
||||
this._hideTooltips();
|
||||
global.log(c);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
let win = this._workspaces[this._active].getWindowWithTooltip(c);
|
||||
@@ -176,10 +179,13 @@ function enable() {
|
||||
return true;
|
||||
}
|
||||
if (this._pickWorkspace) {
|
||||
let c = o.get_key_symbol() - Clutter.KEY_0;
|
||||
let c = o.get_key_symbol() - Clutter.KEY_KP_0;
|
||||
if (c > 9 || c <= 0) {
|
||||
this._hideWorkspacesTooltips();
|
||||
return false;
|
||||
c = o.get_key_symbol() - Clutter.KEY_0;
|
||||
if (c > 9 || c <= 0) {
|
||||
this._hideWorkspacesTooltips();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
let workspace = this._workspaces[c - 1];
|
||||
@@ -200,10 +206,12 @@ function enable() {
|
||||
parentActor.add_actor(this._text);
|
||||
});
|
||||
|
||||
winInjections['updatePositions'] = injectToFunction(Workspace.WindowOverlay.prototype, 'updatePositions', function(cloneX, cloneY, cloneWidth, cloneHeight) {
|
||||
winInjections['relayout'] = injectToFunction(Workspace.WindowOverlay.prototype, 'relayout', function(animate) {
|
||||
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
|
||||
|
||||
let textX = cloneX - 2;
|
||||
let textY = cloneY - 2;
|
||||
this._text.set_position(Math.floor(textX), Math.floor(textY));
|
||||
this._text.set_position(Math.floor(textX) + 5, Math.floor(textY) + 5);
|
||||
this._text.raise_top();
|
||||
});
|
||||
|
||||
@@ -221,23 +229,6 @@ function enable() {
|
||||
this._tip = null;
|
||||
});
|
||||
|
||||
workspaceInjections['positionWindows'] = injectToFunction(Workspace.Workspace.prototype, 'positionWindows', function(flags) {
|
||||
let visibleClones = this._windows.slice();
|
||||
if (this._reservedSlot)
|
||||
visibleClones.push(this._reservedSlot);
|
||||
|
||||
let slots = this._computeAllWindowSlots(visibleClones.length);
|
||||
visibleClones = this._orderWindowsByMotionAndStartup(visibleClones, slots);
|
||||
for (let i = 0; i < visibleClones.length; i++) {
|
||||
let clone = visibleClones[i];
|
||||
let metaWindow = clone.metaWindow;
|
||||
let mainIndex = this._lookupIndex(metaWindow);
|
||||
let overlay = this._windowOverlays[mainIndex];
|
||||
if (overlay)
|
||||
overlay.setId(i < 9 ? i + 1 : null);
|
||||
}
|
||||
});
|
||||
|
||||
workViewInjections['_init'] = injectToFunction(WorkspacesView.WorkspacesView.prototype, '_init', function(width, height, x, y, workspaces) {
|
||||
this._pickWorkspace = false;
|
||||
this._pickWindow = false;
|
||||
@@ -262,6 +253,8 @@ function removeInjection(object, injection, name) {
|
||||
}
|
||||
|
||||
function disable() {
|
||||
let i;
|
||||
|
||||
for (i in workspaceInjections)
|
||||
removeInjection(Workspace.Workspace.prototype, workspaceInjections, i);
|
||||
for (i in winInjections)
|
||||
@@ -280,4 +273,4 @@ function disable() {
|
||||
|
||||
function init() {
|
||||
/* do nothing */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
{
|
||||
"shell-version": ["@shell_current@", "3.2" ],
|
||||
"shell-version": ["@shell_current@" ],
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"original-author": "zaspire@rambler.ru",
|
||||
"name": "windowNavigator",
|
||||
"description": "Allow keyboard selection of windows and workspaces in overlay mode",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.extension-windowsNavigator-window-tooltip {
|
||||
color: #ff0000;
|
||||
color: #fefefe;
|
||||
background: rgba(0,0,0,0.8);
|
||||
border: 1px solid rgba(128,128,128,0.40);
|
||||
border-radius: 10px;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
EXTENSION_ID = workspace-indicator
|
||||
|
||||
EXTRA_MODULES = prefs.js
|
||||
|
||||
include ../../extension.mk
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const St = imports.gi.St;
|
||||
@@ -7,97 +10,125 @@ const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Panel = imports.ui.panel;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
|
||||
function WorkspaceIndicator() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
WorkspaceIndicator.prototype = {
|
||||
__proto__: PanelMenu.SystemStatusButton.prototype,
|
||||
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
||||
const WORKSPACE_KEY = 'workspace-names';
|
||||
|
||||
_init: function(){
|
||||
PanelMenu.SystemStatusButton.prototype._init.call(this, 'folder');
|
||||
const WorkspaceIndicator = new Lang.Class({
|
||||
Name: 'WorkspaceIndicator.WorkspaceIndicator',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
this._currentWorkspace = global.screen.get_active_workspace().index();
|
||||
this.statusLabel = new St.Label({ text: this._labelText() });
|
||||
_init: function(){
|
||||
this.parent(0.0, _("Workspace Indicator"));
|
||||
|
||||
// destroy all previously created children, and add our statusLabel
|
||||
this.actor.get_children().forEach(function(c) { c.destroy() });
|
||||
this.actor.add_actor(this.statusLabel);
|
||||
this._currentWorkspace = global.screen.get_active_workspace().index();
|
||||
this.statusLabel = new St.Label({ text: this._labelText() });
|
||||
|
||||
this.workspacesItems = [];
|
||||
this._workspaceSection = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(this._workspaceSection);
|
||||
global.screen.connect_after('workspace-added', Lang.bind(this,this._createWorkspacesSection));
|
||||
global.screen.connect_after('workspace-removed', Lang.bind(this,this._createWorkspacesSection));
|
||||
global.screen.connect_after('workspace-switched', Lang.bind(this,this._updateIndicator));
|
||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
this._createWorkspacesSection();
|
||||
this.actor.add_actor(this.statusLabel);
|
||||
|
||||
//styling
|
||||
this.menu.actor.add_style_class_name('workspace-indicator-shorter');
|
||||
},
|
||||
this.workspacesItems = [];
|
||||
this._workspaceSection = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(this._workspaceSection);
|
||||
|
||||
_updateIndicator: function() {
|
||||
this.workspacesItems[this._currentWorkspace].setShowDot(false);
|
||||
this._currentWorkspace = global.screen.get_active_workspace().index();
|
||||
this.workspacesItems[this._currentWorkspace].setShowDot(true);
|
||||
this._screenSignals = [];
|
||||
this._screenSignals.push(global.screen.connect_after('workspace-added', Lang.bind(this,this._createWorkspacesSection)));
|
||||
this._screenSignals.push(global.screen.connect_after('workspace-removed', Lang.bind(this,this._createWorkspacesSection)));
|
||||
this._screenSignals.push(global.screen.connect_after('workspace-switched', Lang.bind(this,this._updateIndicator)));
|
||||
|
||||
this.statusLabel.set_text(this._labelText());
|
||||
},
|
||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
this._createWorkspacesSection();
|
||||
|
||||
_labelText : function(workspaceIndex) {
|
||||
if(workspaceIndex == undefined) {
|
||||
workspaceIndex = this._currentWorkspace;
|
||||
}
|
||||
return Meta.prefs_get_workspace_name(workspaceIndex);
|
||||
},
|
||||
//styling
|
||||
this.statusLabel.add_style_class_name('panel-workspace-indicator');
|
||||
|
||||
_createWorkspacesSection : function() {
|
||||
this._workspaceSection.removeAll();
|
||||
this.workspacesItems = [];
|
||||
this._settings = new Gio.Settings({ schema: WORKSPACE_SCHEMA });
|
||||
this._settingsChangedId = this._settings.connect('changed::' + WORKSPACE_KEY, Lang.bind(this, this._createWorkspacesSection));
|
||||
},
|
||||
|
||||
let i = 0;
|
||||
for(; i < global.screen.n_workspaces; i++) {
|
||||
this.workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
|
||||
this._workspaceSection.addMenuItem(this.workspacesItems[i]);
|
||||
this.workspacesItems[i].workspaceId = i;
|
||||
this.workspacesItems[i].label_actor = this.statusLabel;
|
||||
let self = this;
|
||||
this.workspacesItems[i].connect('activate', Lang.bind(this, function(actor, event) {
|
||||
this._activate(actor.workspaceId);
|
||||
}));
|
||||
}
|
||||
destroy: function() {
|
||||
for (let i = 0; i < this._screenSignals.length; i++)
|
||||
global.screen.disconnect(this._screenSignals[i]);
|
||||
|
||||
this._updateIndicator();
|
||||
},
|
||||
if (this._settingsChangedId) {
|
||||
this._settings.disconnect(this._settingsChangedId);
|
||||
this._settingsChangedId = 0;
|
||||
}
|
||||
|
||||
_activate : function (index) {
|
||||
if(index >= 0 && index < global.screen.n_workspaces) {
|
||||
let metaWorkspace = global.screen.get_workspace_by_index(index);
|
||||
metaWorkspace.activate(true);
|
||||
}
|
||||
},
|
||||
this.parent();
|
||||
},
|
||||
|
||||
_onScrollEvent : function(actor, event) {
|
||||
let direction = event.get_scroll_direction();
|
||||
let diff = 0;
|
||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||
diff = 1;
|
||||
} else if (direction == Clutter.ScrollDirection.UP) {
|
||||
diff = -1;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
_updateIndicator: function() {
|
||||
this.workspacesItems[this._currentWorkspace].setShowDot(false);
|
||||
this._currentWorkspace = global.screen.get_active_workspace().index();
|
||||
this.workspacesItems[this._currentWorkspace].setShowDot(true);
|
||||
|
||||
let newIndex = global.screen.get_active_workspace().index() + diff;
|
||||
this._activate(newIndex);
|
||||
},
|
||||
}
|
||||
this.statusLabel.set_text(this._labelText());
|
||||
},
|
||||
|
||||
_labelText : function(workspaceIndex) {
|
||||
if(workspaceIndex == undefined) {
|
||||
workspaceIndex = this._currentWorkspace;
|
||||
return (workspaceIndex + 1).toString();
|
||||
}
|
||||
return Meta.prefs_get_workspace_name(workspaceIndex);
|
||||
},
|
||||
|
||||
_createWorkspacesSection : function() {
|
||||
this._workspaceSection.removeAll();
|
||||
this.workspacesItems = [];
|
||||
this._currentWorkspace = global.screen.get_active_workspace().index();
|
||||
|
||||
let i = 0;
|
||||
for(; i < global.screen.n_workspaces; i++) {
|
||||
this.workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
|
||||
this._workspaceSection.addMenuItem(this.workspacesItems[i]);
|
||||
this.workspacesItems[i].workspaceId = i;
|
||||
this.workspacesItems[i].label_actor = this.statusLabel;
|
||||
let self = this;
|
||||
this.workspacesItems[i].connect('activate', Lang.bind(this, function(actor, event) {
|
||||
this._activate(actor.workspaceId);
|
||||
}));
|
||||
|
||||
if (i == this._currentWorkspace)
|
||||
this.workspacesItems[i].setShowDot(true);
|
||||
}
|
||||
|
||||
this.statusLabel.set_text(this._labelText());
|
||||
},
|
||||
|
||||
_activate : function (index) {
|
||||
if(index >= 0 && index < global.screen.n_workspaces) {
|
||||
let metaWorkspace = global.screen.get_workspace_by_index(index);
|
||||
metaWorkspace.activate(global.get_current_time());
|
||||
}
|
||||
},
|
||||
|
||||
_onScrollEvent : function(actor, event) {
|
||||
let direction = event.get_scroll_direction();
|
||||
let diff = 0;
|
||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||
diff = 1;
|
||||
} else if (direction == Clutter.ScrollDirection.UP) {
|
||||
diff = -1;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
let newIndex = global.screen.get_active_workspace().index() + diff;
|
||||
this._activate(newIndex);
|
||||
},
|
||||
});
|
||||
|
||||
function init(meta) {
|
||||
// empty
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
let _indicator;
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Workspace Indicator",
|
||||
"description": "Put an indicator on the panel signaling in which workspace you are, and give you the possibility of switching to another one",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"original-authors": [ "erick.red@gmail.com" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
207
extensions/workspace-indicator/prefs.js
Normal file
207
extensions/workspace-indicator/prefs.js
Normal file
@@ -0,0 +1,207 @@
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
const N_ = function(e) { return e };
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
||||
const WORKSPACE_KEY = 'workspace-names';
|
||||
|
||||
const WorkspaceNameModel = new GObject.Class({
|
||||
Name: 'WorkspaceIndicator.WorkspaceNameModel',
|
||||
GTypeName: 'WorkspaceNameModel',
|
||||
Extends: Gtk.ListStore,
|
||||
|
||||
Columns: {
|
||||
LABEL: 0,
|
||||
},
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
this.set_column_types([GObject.TYPE_STRING]);
|
||||
|
||||
this._settings = new Gio.Settings({ schema: WORKSPACE_SCHEMA });
|
||||
//this._settings.connect('changed::workspace-names', Lang.bind(this, this._reloadFromSettings));
|
||||
|
||||
this._reloadFromSettings();
|
||||
|
||||
// overriding class closure doesn't work, because GtkTreeModel
|
||||
// plays tricks with marshallers and class closures
|
||||
this.connect('row-changed', Lang.bind(this, this._onRowChanged));
|
||||
this.connect('row-inserted', Lang.bind(this, this._onRowInserted));
|
||||
this.connect('row-deleted', Lang.bind(this, this._onRowDeleted));
|
||||
},
|
||||
|
||||
_reloadFromSettings: function() {
|
||||
if (this._preventChanges)
|
||||
return;
|
||||
this._preventChanges = true;
|
||||
|
||||
let newNames = this._settings.get_strv(WORKSPACE_KEY);
|
||||
|
||||
let i = 0;
|
||||
let [ok, iter] = this.get_iter_first();
|
||||
while (ok && i < newNames.length) {
|
||||
this.set(iter, [this.Columns.LABEL], [newNames[i]]);
|
||||
|
||||
ok = this.iter_next(iter);
|
||||
i++;
|
||||
}
|
||||
|
||||
while (ok)
|
||||
ok = this.remove(iter);
|
||||
|
||||
for ( ; i < newNames.length; i++) {
|
||||
iter = this.append();
|
||||
this.set(iter, [this.Columns.LABEL], [newNames[i]]);
|
||||
}
|
||||
|
||||
this._preventChanges = false;
|
||||
},
|
||||
|
||||
_onRowChanged: function(self, path, iter) {
|
||||
if (this._preventChanges)
|
||||
return;
|
||||
this._preventChanges = true;
|
||||
|
||||
let index = path.get_indices()[0];
|
||||
let names = this._settings.get_strv(WORKSPACE_KEY);
|
||||
|
||||
if (index >= names.length) {
|
||||
// fill with blanks
|
||||
for (let i = names.length; i <= index; i++)
|
||||
names[i] = '';
|
||||
}
|
||||
|
||||
names[index] = this.get_value(iter, this.Columns.LABEL);
|
||||
|
||||
this._settings.set_strv(WORKSPACE_KEY, names);
|
||||
|
||||
this._preventChanges = false;
|
||||
},
|
||||
|
||||
_onRowInserted: function(self, path, iter) {
|
||||
if (this._preventChanges)
|
||||
return;
|
||||
this._preventChanges = true;
|
||||
|
||||
let index = path.get_indices()[0];
|
||||
let names = this._settings.get_strv(WORKSPACE_KEY);
|
||||
let label = this.get_value(iter, this.Columns.LABEL) || '';
|
||||
names.splice(index, 0, label);
|
||||
|
||||
this._settings.set_strv(WORKSPACE_KEY, names);
|
||||
|
||||
this._preventChanges = false;
|
||||
},
|
||||
|
||||
_onRowDeleted: function(self, path) {
|
||||
if (this._preventChanges)
|
||||
return;
|
||||
this._preventChanges = true;
|
||||
|
||||
let index = path.get_indices()[0];
|
||||
let names = this._settings.get_strv(WORKSPACE_KEY);
|
||||
|
||||
if (index >= names.length)
|
||||
return;
|
||||
|
||||
names.splice(index, 1);
|
||||
|
||||
// compact the array
|
||||
for (let i = names.length -1; i >= 0 && !names[i]; i++)
|
||||
names.pop();
|
||||
|
||||
this._settings.set_strv(WORKSPACE_KEY, names);
|
||||
|
||||
this._preventChanges = false;
|
||||
},
|
||||
});
|
||||
|
||||
const WorkspaceSettingsWidget = new GObject.Class({
|
||||
Name: 'WorkspaceIndicator.WorkspaceSettingsWidget',
|
||||
GTypeName: 'WorkspaceSettingsWidget',
|
||||
Extends: Gtk.Grid,
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
this.margin = 10;
|
||||
this.orientation = Gtk.Orientation.VERTICAL;
|
||||
|
||||
this.add(new Gtk.Label({ label: _("Workspace names:"),
|
||||
margin_bottom: 5 }));
|
||||
|
||||
this._store = new WorkspaceNameModel();
|
||||
this._treeView = new Gtk.TreeView({ model: this._store,
|
||||
headers_visible: false,
|
||||
reorderable: true,
|
||||
hexpand: true,
|
||||
vexpand: true
|
||||
});
|
||||
|
||||
let column = new Gtk.TreeViewColumn({ title: _("Name") });
|
||||
let renderer = new Gtk.CellRendererText({ editable: true });
|
||||
renderer.connect('edited', Lang.bind(this, this._cellEdited));
|
||||
column.pack_start(renderer, true);
|
||||
column.add_attribute(renderer, 'text', this._store.Columns.LABEL);
|
||||
this._treeView.append_column(column);
|
||||
|
||||
this.add(this._treeView);
|
||||
|
||||
let toolbar = new Gtk.Toolbar();
|
||||
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
|
||||
|
||||
let newButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_NEW });
|
||||
newButton.connect('clicked', Lang.bind(this, this._newClicked));
|
||||
toolbar.add(newButton);
|
||||
|
||||
let delButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_DELETE });
|
||||
delButton.connect('clicked', Lang.bind(this, this._delClicked));
|
||||
toolbar.add(delButton);
|
||||
|
||||
this.add(toolbar);
|
||||
},
|
||||
|
||||
_cellEdited: function(renderer, path, new_text) {
|
||||
let [ok, iter] = this._store.get_iter_from_string(path);
|
||||
|
||||
if (ok)
|
||||
this._store.set(iter, [this._store.Columns.LABEL], [new_text]);
|
||||
},
|
||||
|
||||
_newClicked: function() {
|
||||
let iter = this._store.append();
|
||||
let index = this._store.get_path(iter).get_indices()[0];
|
||||
|
||||
let label = _("Workspace %d").format(index);
|
||||
this._store.set(iter, [this._store.Columns.LABEL], [label]);
|
||||
},
|
||||
|
||||
_delClicked: function() {
|
||||
let [any, model, iter] = this._treeView.get_selection().get_selected();
|
||||
|
||||
if (any)
|
||||
this._store.remove(iter);
|
||||
}
|
||||
});
|
||||
|
||||
function init() {
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
function buildPrefsWidget() {
|
||||
let widget = new WorkspaceSettingsWidget();
|
||||
widget.show_all();
|
||||
|
||||
return widget;
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
.workspace-indicator-shorter {
|
||||
min-width: 25px;
|
||||
font-size: 10pt;
|
||||
.panel-workspace-indicator {
|
||||
padding: 0 8px;
|
||||
background-color: rgba(200, 200, 200, .5);
|
||||
border: 1px solid #cccccc;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const DBus = imports.dbus;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||
const Lang = imports.lang;
|
||||
@@ -17,6 +17,10 @@ const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||
const _ = Gettext.gettext;
|
||||
const N_ = function(e) { return e };
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = ExtensionUtils.getCurrentExtension();
|
||||
const Convenience = Me.imports.convenience;
|
||||
|
||||
const possibleRotations = [ GnomeDesktop.RRRotation.ROTATION_0,
|
||||
GnomeDesktop.RRRotation.ROTATION_90,
|
||||
GnomeDesktop.RRRotation.ROTATION_180,
|
||||
@@ -29,25 +33,23 @@ let rotations = [ [ GnomeDesktop.RRRotation.ROTATION_0, N_("Normal") ],
|
||||
[ GnomeDesktop.RRRotation.ROTATION_180, N_("Upside-down") ]
|
||||
];
|
||||
|
||||
const XRandr2Iface = {
|
||||
name: 'org.gnome.SettingsDaemon.XRANDR_2',
|
||||
methods: [
|
||||
{ name: 'ApplyConfiguration', inSignature: 'xx', outSignature: '' },
|
||||
]
|
||||
};
|
||||
let XRandr2 = DBus.makeProxyClass(XRandr2Iface);
|
||||
const XRandr2Iface = <interface name='org.gnome.SettingsDaemon.XRANDR_2'>
|
||||
<method name='ApplyConfiguration'>
|
||||
<arg type='x' direction='in'/>
|
||||
<arg type='x' direction='in'/>
|
||||
</method>
|
||||
</interface>;
|
||||
|
||||
function Indicator() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
const XRandr2 = Gio.DBusProxy.makeProxyWrapper(XRandr2Iface);
|
||||
|
||||
Indicator.prototype = {
|
||||
__proto__: PanelMenu.SystemStatusButton.prototype,
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'XRandRIndicator',
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
PanelMenu.SystemStatusButton.prototype._init.call(this, 'preferences-desktop-display');
|
||||
this.parent('preferences-desktop-display-symbolic', _("Display"));
|
||||
|
||||
this._proxy = new XRandr2(DBus.session, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/XRANDR');
|
||||
this._proxy = new XRandr2(Gio.DBus.session, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/XRANDR');
|
||||
|
||||
try {
|
||||
this._screen = new GnomeDesktop.RRScreen({ gdk_screen: Gdk.Screen.get_default() });
|
||||
@@ -75,9 +77,7 @@ Indicator.prototype = {
|
||||
this._addOutputItem(config, outputs[i]);
|
||||
}
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addAction(_("Configure display settings..."), function() {
|
||||
GLib.spawn_command_line_async('gnome-control-center display');
|
||||
});
|
||||
this.menu.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop');
|
||||
},
|
||||
|
||||
_addOutputItem: function(config, output) {
|
||||
@@ -133,11 +133,10 @@ Indicator.prototype = {
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
function init(metadata) {
|
||||
imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir);
|
||||
Convenience.initTranslations();
|
||||
}
|
||||
|
||||
let _indicator;
|
||||
@@ -149,4 +148,4 @@ function enable() {
|
||||
|
||||
function disable() {
|
||||
_indicator.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Monitor Status Indicator",
|
||||
"description": "Add a systems status menu for rotating monitors (overrides what is currently provided by gnome-settings-daemon)",
|
||||
"shell-version": [ "@shell_current@", "3.2" ],
|
||||
"localedir": "@LOCALEDIR@",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
12
include.mk
Normal file
12
include.mk
Normal file
@@ -0,0 +1,12 @@
|
||||
extensionurl = http://git.gnome.org/gnome-shell-extensions
|
||||
|
||||
# Change these to modify how installation is performed
|
||||
topextensiondir = $(datadir)/gnome-shell/extensions
|
||||
extensionbase = @gnome-shell-extensions.gcampax.github.com
|
||||
|
||||
gschemabase = org.gnome.shell.extensions
|
||||
|
||||
uuid = $(EXTENSION_ID)$(extensionbase)
|
||||
gschemaname = $(gschemabase).$(EXTENSION_ID)
|
||||
|
||||
extensiondir = $(topextensiondir)/$(uuid)
|
||||
93
lib/convenience.js
Normal file
93
lib/convenience.js
Normal file
@@ -0,0 +1,93 @@
|
||||
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
/*
|
||||
Copyright (c) 2011-2012, Giovanni Campagna <scampa.giovanni@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the GNOME nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
const Gettext = imports.gettext;
|
||||
const Gio = imports.gi.Gio;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
|
||||
/**
|
||||
* initTranslations:
|
||||
* @domain: (optional): the gettext domain to use
|
||||
*
|
||||
* Initialize Gettext to load translations from extensionsdir/locale.
|
||||
* If @domain is not provided, it will be taken from metadata['gettext-domain']
|
||||
*/
|
||||
function initTranslations(domain) {
|
||||
let extension = ExtensionUtils.getCurrentExtension();
|
||||
|
||||
domain = domain || extension.metadata['gettext-domain'];
|
||||
|
||||
// check if this extension was built with "make zip-file", and thus
|
||||
// has the locale files in a subfolder
|
||||
// otherwise assume that extension has been installed in the
|
||||
// same prefix as gnome-shell
|
||||
let localeDir = extension.dir.get_child('locale');
|
||||
if (localeDir.query_exists(null))
|
||||
Gettext.bindtextdomain(domain, localeDir.get_path());
|
||||
else
|
||||
Gettext.bindtextdomain(domain, Config.LOCALEDIR);
|
||||
}
|
||||
|
||||
/**
|
||||
* getSettings:
|
||||
* @schema: (optional): the GSettings schema id
|
||||
*
|
||||
* Builds and return a GSettings schema for @schema, using schema files
|
||||
* in extensionsdir/schemas. If @schema is not provided, it is taken from
|
||||
* metadata['settings-schema'].
|
||||
*/
|
||||
function getSettings(schema) {
|
||||
let extension = ExtensionUtils.getCurrentExtension();
|
||||
|
||||
schema = schema || extension.metadata['settings-schema'];
|
||||
|
||||
const GioSSS = Gio.SettingsSchemaSource;
|
||||
|
||||
// check if this extension was built with "make zip-file", and thus
|
||||
// has the schema files in a subfolder
|
||||
// otherwise assume that extension has been installed in the
|
||||
// same prefix as gnome-shell (and therefore schemas are available
|
||||
// in the standard folders)
|
||||
let schemaDir = extension.dir.get_child('schemas');
|
||||
let schemaSource;
|
||||
if (schemaDir.query_exists(null))
|
||||
schemaSource = GioSSS.new_from_directory(schemaDir.get_path(),
|
||||
GioSSS.get_default(),
|
||||
false);
|
||||
else
|
||||
schemaSource = GioSSS.get_default();
|
||||
|
||||
let schemaObj = schemaSource.lookup(schema, true);
|
||||
if (!schemaObj)
|
||||
throw new Error('Schema ' + schema + ' could not be found for extension '
|
||||
+ extension.metadata.uuid + '. Please check your installation.');
|
||||
|
||||
return new Gio.Settings({ settings_schema: schemaObj });
|
||||
}
|
||||
|
||||
11
po/LINGUAS
11
po/LINGUAS
@@ -1,28 +1,39 @@
|
||||
ar
|
||||
ca
|
||||
cs
|
||||
da
|
||||
de
|
||||
el
|
||||
en_GB
|
||||
eo
|
||||
es
|
||||
eu
|
||||
fa
|
||||
fi
|
||||
fr
|
||||
gl
|
||||
he
|
||||
hu
|
||||
id
|
||||
it
|
||||
ja
|
||||
ko
|
||||
lv
|
||||
lt
|
||||
nb
|
||||
pa
|
||||
pt
|
||||
pt_BR
|
||||
pl
|
||||
ru
|
||||
sk
|
||||
sl
|
||||
sr
|
||||
sr@latin
|
||||
sv
|
||||
te
|
||||
vi
|
||||
uk
|
||||
zh_CN
|
||||
zh_HK
|
||||
zh_TW
|
||||
|
||||
@@ -1,13 +1,27 @@
|
||||
data/gnome-classic.desktop.in
|
||||
data/gnome-classic.session.desktop.in.in
|
||||
data/gnome-shell-classic.desktop.in.in
|
||||
extensions/alternate-tab/prefs.js
|
||||
extensions/alternative-status-menu/extension.js
|
||||
extensions/alternate-tab/extension.js
|
||||
extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in
|
||||
extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in
|
||||
extensions/apps-menu/extension.js
|
||||
extensions/auto-move-windows/extension.js
|
||||
extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in
|
||||
extensions/dock/extension.js
|
||||
extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in
|
||||
extensions/auto-move-windows/prefs.js
|
||||
extensions/drive-menu/extension.js
|
||||
extensions/example/extension.js
|
||||
extensions/gajim/extension.js
|
||||
extensions/example/org.gnome.shell.extensions.example.gschema.xml.in
|
||||
extensions/example/prefs.js
|
||||
extensions/native-window-placement/extension.js
|
||||
extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in
|
||||
extensions/places-menu/extension.js
|
||||
extensions/places-menu/placeDisplay.js
|
||||
extensions/systemMonitor/extension.js
|
||||
extensions/user-theme/extension.js
|
||||
extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in
|
||||
extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in
|
||||
extensions/window-list/prefs.js
|
||||
extensions/windowsNavigator/extension.js
|
||||
extensions/workspace-indicator/extension.js
|
||||
extensions/workspace-indicator/prefs.js
|
||||
extensions/xrandr-indicator/extension.js
|
||||
|
||||
338
po/ar.po
Normal file
338
po/ar.po
Normal file
@@ -0,0 +1,338 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Khaled Hosny <khaledhosny@eglug.org>, 2012.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-12-24 12:44+0200\n"
|
||||
"PO-Revision-Date: 2012-12-24 12:46+0200\n"
|
||||
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
|
||||
"Language-Team: Arabic <doc@arabeyes.org>\n"
|
||||
"Language: ar\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Virtaal 0.7.0\n"
|
||||
|
||||
#: ../data/gnome-classic.desktop.in.h:1
|
||||
#: ../data/gnome-classic.session.desktop.in.in.h:1
|
||||
msgid "GNOME Classic"
|
||||
msgstr "جنوم تقليدية"
|
||||
|
||||
#: ../data/gnome-classic.desktop.in.h:2
|
||||
msgid "This session logs you into GNOME Classic"
|
||||
msgstr "تولجك هذه الجلسة في جنوم التقليدية"
|
||||
|
||||
#: ../data/gnome-shell-classic.desktop.in.in.h:1
|
||||
msgid "GNOME Shell Classic"
|
||||
msgstr "صدفة جنوم تقليدية"
|
||||
|
||||
#: ../data/gnome-shell-classic.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "إدارة النوافذ وإطلاق التطبيقات"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:20
|
||||
msgid "Thumbnail only"
|
||||
msgstr "مصغّرة فقط"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:21
|
||||
msgid "Application icon only"
|
||||
msgstr "أيقونة التطبيق فقط"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:22
|
||||
msgid "Thumbnail and application icon"
|
||||
msgstr "مصغّرة وأيقونة التطبيق"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:37
|
||||
msgid "Present windows as"
|
||||
msgstr "كيفية عرض التطبيقات"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:62
|
||||
msgid "Show only windows in the current workspace"
|
||||
msgstr "أظهر نوافذ مساحات العمل الحالية فقط"
|
||||
|
||||
#. add the new entries
|
||||
#: ../extensions/alternative-status-menu/extension.js:144
|
||||
msgid "Suspend"
|
||||
msgstr "علّق"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:147
|
||||
msgid "Hibernate"
|
||||
msgstr "أسبِت"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:150
|
||||
msgid "Power Off"
|
||||
msgstr "أطفئ"
|
||||
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
|
||||
msgid "Enable suspending"
|
||||
msgstr "فعّل التعليق"
|
||||
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
|
||||
msgid "Control the visibility of the Suspend menu item"
|
||||
msgstr "تحكم في ظهور ”علّق“ في القائمة"
|
||||
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
|
||||
msgid "Enable hibernating"
|
||||
msgstr "فعّل الإسبات"
|
||||
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
|
||||
msgid "Control the visibility of the Hibernate menu item"
|
||||
msgstr "تحكم في ظهور ”أسبِت“ في القائمة"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
|
||||
msgid "Application and workspace list"
|
||||
msgstr "قائمة التطبيقات ومساحات العمل"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:55
|
||||
msgid "Application"
|
||||
msgstr "التطبيق"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:64
|
||||
#: ../extensions/auto-move-windows/prefs.js:106
|
||||
msgid "Workspace"
|
||||
msgstr "مساحة العمل"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:80
|
||||
msgid "Add rule"
|
||||
msgstr "أضِف قاعدة"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:94
|
||||
msgid "Create new matching rule"
|
||||
msgstr "أنشئ قاعدة تطابق"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:98
|
||||
msgid "Add"
|
||||
msgstr "أضِف"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:72
|
||||
#, c-format
|
||||
msgid "Ejecting drive '%s' failed:"
|
||||
msgstr "فشل إخراج '%s':"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:89
|
||||
msgid "Removable devices"
|
||||
msgstr "الأجهزة المنفصلة"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:106
|
||||
msgid "Open File"
|
||||
msgstr "افتح الملف"
|
||||
|
||||
#: ../extensions/example/extension.js:17
|
||||
msgid "Hello, world!"
|
||||
msgstr "أهلا، يا عالم!"
|
||||
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
|
||||
msgid "Alternative greeting text."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"If not empty, it contains the text that will be shown when clicking on the "
|
||||
"panel."
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: Example is the name of the extension, should not be
|
||||
#. translated
|
||||
#: ../extensions/example/prefs.js:30
|
||||
msgid ""
|
||||
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||
"as such it has little functionality on its own.\n"
|
||||
"Nevertheless it's possible to customize the greeting message."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/example/prefs.js:36
|
||||
msgid "Message:"
|
||||
msgstr "الرسالة:"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
|
||||
msgid "Use more screen for windows"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid "Place window captions on top"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/places-menu/extension.js:46
|
||||
msgid "Places"
|
||||
msgstr "الأماكن"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:47
|
||||
msgid "Devices"
|
||||
msgstr "الأجهزة"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:48
|
||||
msgid "Bookmarks"
|
||||
msgstr "العلامات"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:49
|
||||
msgid "Network"
|
||||
msgstr "الشبكة"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:48
|
||||
#, c-format
|
||||
msgid "Failed to launch \"%s\""
|
||||
msgstr "فشل تشغيل \"%s\""
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:121
|
||||
msgid "Home"
|
||||
msgstr "المنزل"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:195
|
||||
msgid "File System"
|
||||
msgstr "نظام الملفات"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:199
|
||||
msgid "Browse network"
|
||||
msgstr "تصفّح الشبكة"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:213
|
||||
msgid "CPU"
|
||||
msgstr "المعالج"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:266
|
||||
msgid "Memory"
|
||||
msgstr "الذاكرة"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
|
||||
msgid "Theme name"
|
||||
msgstr "اسم السمة"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/workspace-indicator/extension.js:30
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "مؤشر مساحات العمل"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:141
|
||||
msgid "Workspace names:"
|
||||
msgstr "أسماء مساحات العمل"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:152
|
||||
msgid "Name"
|
||||
msgstr "الاسم"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:186
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "مساحة العمل %Id"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:30
|
||||
msgid "Normal"
|
||||
msgstr "عادي"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:31
|
||||
msgid "Left"
|
||||
msgstr "يسار"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:32
|
||||
msgid "Right"
|
||||
msgstr "يمين"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:33
|
||||
msgid "Upside-down"
|
||||
msgstr "رأسا على عقب"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:50
|
||||
msgid "Display"
|
||||
msgstr "العرض"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:80
|
||||
msgid "Display Settings"
|
||||
msgstr "إعدادات العرض"
|
||||
|
||||
#~ msgid "Drag here to add favorites"
|
||||
#~ msgstr "اسحب إلى هنا ليضاف إلى المفضّلة"
|
||||
|
||||
#~ msgid "New Window"
|
||||
#~ msgstr "نافذة جديدة"
|
||||
|
||||
#~ msgid "Quit Application"
|
||||
#~ msgstr "أغلق التطبيق"
|
||||
|
||||
#~ msgid "Remove from Favorites"
|
||||
#~ msgstr "أزِل من المفضّلة"
|
||||
|
||||
#~ msgid "Add to Favorites"
|
||||
#~ msgstr "أضِف إلى المفضّلة"
|
||||
|
||||
#~ msgid "Icon size"
|
||||
#~ msgstr "حجم الأيقونة"
|
||||
|
||||
#~ msgid "Monitor"
|
||||
#~ msgstr "الشاشة"
|
||||
|
||||
#~ msgid "%s is away."
|
||||
#~ msgstr "%s غائب."
|
||||
|
||||
#~ msgid "%s is offline."
|
||||
#~ msgstr "%s غير متّصل."
|
||||
|
||||
#~ msgid "%s is online."
|
||||
#~ msgstr "%s متّصل."
|
||||
|
||||
#~ msgid "%s is busy."
|
||||
#~ msgstr "%s مشغول."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This mode presents all applications from all workspaces in one selection "
|
||||
#~ "list. Instead of using the application icon of every window, it uses "
|
||||
#~ "small thumbnails resembling the window itself."
|
||||
#~ msgstr ""
|
||||
#~ "يعرض هذا النمط كل التطبيقات من كل مساحات العمل في قائمة واحدة، وبدلا من "
|
||||
#~ "استخدام أيقونة التطبيق لكل النوافذ يستخدم صورة مصغّرة للنافذة نفسها."
|
||||
|
||||
#~ msgid "Workspace & Icons"
|
||||
#~ msgstr "مساحة العمل مع أيقونات"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This mode let's you switch between the applications of your current "
|
||||
#~ "workspace and gives you additionally the option to switch to the last "
|
||||
#~ "used application of your previous workspace. This is always the last "
|
||||
#~ "symbol in the list and is segregated by a separator/vertical line if "
|
||||
#~ "available. \n"
|
||||
#~ "Every window is represented by its application icon."
|
||||
#~ msgstr ""
|
||||
#~ "يتيح هذا النمط التنقل بين التطبيقات في مساحة العمل الحالية بالإضافة إلى "
|
||||
#~ "إمكانية الانتقال إلى آخر تطبيق استُخدم في مساحة العمل السابقة، والذي سيكون "
|
||||
#~ "دائما آخر عنصر في القائمة مفصولا بخط رأسي.\n"
|
||||
#~ "تُمثل كل نافذة بأيقونة التطبيق الذي تنتمي إليه."
|
||||
|
||||
#~ msgid "Move current selection to front before closing the popup"
|
||||
#~ msgstr "انقل الاختيار الحالي إلى المقدمة قبل غلق النافذة المنبثقة."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The Alternate Tab can be used in different modes, that affect the way "
|
||||
#~ "windows are chosen and presented."
|
||||
#~ msgstr ""
|
||||
#~ "يمكن استخدام هذا الامتداد في أنماط مختلفة تؤثر على كيفية اختيار وعرض "
|
||||
#~ "النوافذ."
|
||||
|
||||
#~ msgid "Removable Devices"
|
||||
#~ msgstr "الأجهزة المنفصلة"
|
||||
607
po/ca.po
607
po/ca.po
@@ -2,152 +2,93 @@
|
||||
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||
# Jordi Mas i Hernandez <jmas@softcatala.org>, 2011.
|
||||
# Gil Forcada <gilforcada@guifi.net>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-08-19 23:28+0200\n"
|
||||
"PO-Revision-Date: 2011-08-02 07:30+0200\n"
|
||||
"Last-Translator: jmas@softcatala.org\n"
|
||||
"Language-Team: ca_ES <tradgnome@softcatala.net>\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=extensions\n"
|
||||
"POT-Creation-Date: 2012-09-06 17:51+0000\n"
|
||||
"PO-Revision-Date: 2012-09-29 00:02+0200\n"
|
||||
"Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
|
||||
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Content-Transfer-Encoding: 8bits\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:39
|
||||
msgid "Available"
|
||||
msgstr "Disponible"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "The application icon mode."
|
||||
msgstr "El mode d'icona d'aplicació."
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:44
|
||||
msgid "Busy"
|
||||
msgstr "Ocupat"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
msgstr ""
|
||||
"Configura com es mostren les icones en l'intercanviador. Les possibilitats "
|
||||
"vàlides són «thumbnail-only» (només miniatures, mostra les miniatures de les "
|
||||
"finestres), «app-icon-only» (només icona de l'aplicació, mostra només la "
|
||||
"icona de l'aplicació) o «both» (ambdós, mostra tan la icona de l'aplicació "
|
||||
"com la miniatura). "
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:52
|
||||
msgid "My Account"
|
||||
msgstr "El meu compte"
|
||||
#: ../extensions/alternate-tab/prefs.js:26
|
||||
msgid "Thumbnail only"
|
||||
msgstr "Només miniatures"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:56
|
||||
msgid "System Settings"
|
||||
msgstr "Paràmetres de l'ordinador"
|
||||
#: ../extensions/alternate-tab/prefs.js:27
|
||||
msgid "Application icon only"
|
||||
msgstr "Només la icona de l'aplicació"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:63
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bloca la pantalla"
|
||||
#: ../extensions/alternate-tab/prefs.js:28
|
||||
msgid "Thumbnail and application icon"
|
||||
msgstr "Miniatura i icona de l'aplicació"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:67
|
||||
msgid "Switch User"
|
||||
msgstr "Canvia d'usuari"
|
||||
#: ../extensions/alternate-tab/prefs.js:43
|
||||
msgid "Present windows as"
|
||||
msgstr "Mostra les finestres com a"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:72
|
||||
msgid "Log Out..."
|
||||
msgstr "Surt..."
|
||||
#: ../extensions/alternate-tab/prefs.js:68
|
||||
msgid "Show only windows in the current workspace"
|
||||
msgstr "Mostra només les icones de l'espai de treball actual"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:79
|
||||
#. add the new entries
|
||||
#: ../extensions/alternative-status-menu/extension.js:68
|
||||
msgid "Suspend"
|
||||
msgstr "Atura temporalment"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:85
|
||||
#: ../extensions/alternative-status-menu/extension.js:73
|
||||
msgid "Hibernate"
|
||||
msgstr "Hiberna"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:91
|
||||
msgid "Power Off..."
|
||||
msgstr "Apaga..."
|
||||
#: ../extensions/alternative-status-menu/extension.js:78
|
||||
msgid "Power Off"
|
||||
msgstr "Apaga"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:44
|
||||
msgid ""
|
||||
"This is the first time you use the Alternate Tab extension. \n"
|
||||
"Please choose your preferred behaviour:\n"
|
||||
"\n"
|
||||
"All & Thumbnails:\n"
|
||||
" This mode presents all applications from all workspaces in one "
|
||||
"selection \n"
|
||||
" list. Instead of using the application icon of every window, it uses "
|
||||
"small \n"
|
||||
" thumbnails resembling the window itself. \n"
|
||||
"\n"
|
||||
"Workspace & Icons:\n"
|
||||
" This mode let's you switch between the applications of your current \n"
|
||||
" workspace and gives you additionally the option to switch to the last "
|
||||
"used \n"
|
||||
" application of your previous workspace. This is always the last symbol "
|
||||
"in \n"
|
||||
" the list and is segregated by a separator/vertical line if available. \n"
|
||||
" Every window is represented by its application icon. \n"
|
||||
"\n"
|
||||
"Native:\n"
|
||||
" This mode is the native GNOME 3 behaviour or in other words: Clicking \n"
|
||||
" native switches the Alternate Tab extension off. \n"
|
||||
msgstr ""
|
||||
"Aquest és el primer cop que utilitzeu l'extensió «Alternate Tab». \n"
|
||||
"Trieu el comportament que preferiu:\n"
|
||||
"\n"
|
||||
"Totes i miniatures:\n"
|
||||
" Aquest mode presenta totes les aplicacions de tots els espais de treball "
|
||||
"com a\n"
|
||||
" una llista de selecció. En comptes de mostrar la icona d'aplicació de "
|
||||
"cada finestra, mostra les \n"
|
||||
" miniatures que representen el contingut de la finestra. \n"
|
||||
"\n"
|
||||
"Espai de treball i icones:\n"
|
||||
" Aquest mode us permet canviar entre aplicacions de l'espai de treball "
|
||||
"actual \n"
|
||||
" i us dóna la possibilitat de canviar a l'última aplicació usada de "
|
||||
"l'espai de \n"
|
||||
" treball anterior. Aquest és sempre el darrer símbol a la llista i està "
|
||||
"separat \n"
|
||||
" per una línia vertical/separador quan està disponible. \n"
|
||||
" Cada finestra es representa per la seva icona d'aplicació. \n"
|
||||
"\n"
|
||||
"Nadiu:\n"
|
||||
" Aquest és el mode de comportament nadiu al GNOME 3 o amb altres "
|
||||
"paraules: fent \n"
|
||||
" clic inhabilita l'extensió «Alternate Tab». \n"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
|
||||
msgid "Enable suspending"
|
||||
msgstr "Habilita l'aturada temporal"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:269
|
||||
msgid "Alt Tab Behaviour"
|
||||
msgstr "Comportament de l'«Alternate Tab»"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
|
||||
msgid "Control the visibility of the Suspend menu item"
|
||||
msgstr "Permet controlar si es mostra l'element de menú «Atura temporalment»"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:285
|
||||
msgid "All & Thumbnails"
|
||||
msgstr "Totes i miniatures"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
|
||||
msgid "Enable hibernating"
|
||||
msgstr "Habilita la hibernació"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:292
|
||||
msgid "Workspace & Icons"
|
||||
msgstr "Espai de treball i icones"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:299
|
||||
msgid "Native"
|
||||
msgstr "Nadiu"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:306
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel·la"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "Ask the user for a default behaviour if true."
|
||||
msgstr "Si és «true» (cert) pregunta a l'usuari pel comportament per defecte."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid "Indicates if Alternate Tab is newly installed"
|
||||
msgstr "Indica si s'acaba d'instal·lar l'«Alternate Tab»"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
|
||||
"workspace_icons."
|
||||
msgstr ""
|
||||
"Defineix el comportament de l'«Alternate Tab». Els valors possibles són: "
|
||||
"«native» (nadiu), «all_thumbnails» (totes i miniatures) i "
|
||||
"«workspace_icons» (espai de treball i icones)."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
|
||||
msgid "The alt tab behaviour."
|
||||
msgstr "Comportament de l'«Alternate Tab»"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
|
||||
msgid "Control the visibility of the Hibernate menu item"
|
||||
msgstr "Permet controlar si es mostra l'element de menú «Hiberna»"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Aplicació i llista d'espais de treball"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -156,62 +97,52 @@ msgstr ""
|
||||
"d'aplicació (nom del fitxer de l'escriptori), seguit de dos punts i el "
|
||||
"número de l'espai de treball"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Aplicació i llista d'espais de treball"
|
||||
#: ../extensions/auto-move-windows/prefs.js:55
|
||||
msgid "Application"
|
||||
msgstr "Aplicació"
|
||||
|
||||
#: ../extensions/dock/extension.js:437
|
||||
#: ../extensions/auto-move-windows/prefs.js:64
|
||||
#: ../extensions/auto-move-windows/prefs.js:106
|
||||
msgid "Workspace"
|
||||
msgstr "Espai de treball"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:80
|
||||
msgid "Add rule"
|
||||
msgstr "Afegeix una regla"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:94
|
||||
msgid "Create new matching rule"
|
||||
msgstr "Crea una regla de coincidència nova"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:98
|
||||
msgid "Add"
|
||||
msgstr "Afegeix"
|
||||
|
||||
#: ../extensions/dock/extension.js:600
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Arrossegueu aquí per afegir als preferits"
|
||||
|
||||
#: ../extensions/dock/extension.js:771
|
||||
#: ../extensions/dock/extension.js:926
|
||||
msgid "New Window"
|
||||
msgstr "Finestra nova"
|
||||
|
||||
#: ../extensions/dock/extension.js:773
|
||||
#: ../extensions/dock/extension.js:928
|
||||
msgid "Quit Application"
|
||||
msgstr "Surt de l'aplicació"
|
||||
|
||||
#: ../extensions/dock/extension.js:778
|
||||
#: ../extensions/dock/extension.js:933
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Suprimeix dels preferits"
|
||||
|
||||
#: ../extensions/dock/extension.js:779
|
||||
#: ../extensions/dock/extension.js:934
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Afegeix als preferits"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
|
||||
msgid "Autohide duration"
|
||||
msgstr "Duració de l'ocultació automàtica"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid "Autohide effect"
|
||||
msgstr "Efecte de l'ocultació automàtica"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr "Habilita/Inhabilita l'ocultació automàtica"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Icon size"
|
||||
msgstr "Mida de la icona"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Position of the dock"
|
||||
msgstr "Posició de l'acoblador"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
msgid "Sets icon size of the dock."
|
||||
msgstr "Defineix la mida de la icona per l'acoblador."
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
|
||||
msgid ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
|
||||
msgstr ""
|
||||
"Defineix l'efecte de l'acoblador amagat. Els valors permesos són "
|
||||
"«resize» (amplia) o «rescale» (escala)"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
@@ -219,61 +150,115 @@ msgstr ""
|
||||
"Defineix la posició de l'acoblador a la pantalla. Els valors permesos són "
|
||||
"«right» (dreta) o «left» (esquerra)"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Icon size"
|
||||
msgstr "Mida de la icona"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Sets icon size of the dock."
|
||||
msgstr "Defineix la mida de la icona per l'acoblador."
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr "Habilita/inhabilita l'ocultació automàtica"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
msgid "Autohide effect"
|
||||
msgstr "Efecte de l'ocultació automàtica"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
|
||||
msgid ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
|
||||
"'move'"
|
||||
msgstr ""
|
||||
"Defineix l'efecte de l'acoblador ocult. Els valors permesos són "
|
||||
"«resize» (amplia), «rescale» (escala) i «move» (mou)"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
|
||||
msgid "Autohide duration"
|
||||
msgstr "Duració de l'ocultació automàtica"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
|
||||
msgid "Sets the time duration of the autohide effect."
|
||||
msgstr "Defineix la durada en temps de l'efecte d'ocultació automàtica."
|
||||
|
||||
#: ../extensions/example/extension.js:11
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:10
|
||||
msgid "Monitor"
|
||||
msgstr "Pantalla"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:11
|
||||
msgid ""
|
||||
"Sets monitor to display dock in. The default value (-1) is the primary "
|
||||
"monitor."
|
||||
msgstr ""
|
||||
"Estableix la pantalla a on es mostra l'acoblador. El valor per defecte és "
|
||||
"«-1», la pantalla principal."
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:56
|
||||
msgid "Removable devices"
|
||||
msgstr "Dispositius extraïbles"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:67
|
||||
msgid "Open file manager"
|
||||
msgstr "Obre del gestor de fitxers"
|
||||
|
||||
#: ../extensions/example/extension.js:17
|
||||
msgid "Hello, world!"
|
||||
msgstr "Hola, món!"
|
||||
|
||||
#: ../extensions/gajim/extension.js:219
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
|
||||
msgid "Alternative greeting text."
|
||||
msgstr "Text de rebuda alternatiu."
|
||||
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"If not empty, it contains the text that will be shown when clicking on the "
|
||||
"panel."
|
||||
msgstr ""
|
||||
"Si no és buit, conté el text que es mostrarà quan es faci clic en el quadre."
|
||||
|
||||
#. TRANSLATORS: Example is the name of the extension, should not be
|
||||
#. translated
|
||||
#: ../extensions/example/prefs.js:30
|
||||
msgid ""
|
||||
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||
"as such it has little functionality on its own.\n"
|
||||
"Nevertheless it's possible to customize the greeting message."
|
||||
msgstr ""
|
||||
"L'«Example» està pensat com una extensió del GNOME Shell que demostri la "
|
||||
"manera correcta de crear extensions. Com a extensió pròpiament dita no fa "
|
||||
"gairebé res.\n"
|
||||
"Tot i així permet personalitzar el missatge del rebedor."
|
||||
|
||||
#: ../extensions/example/prefs.js:36
|
||||
msgid "Message:"
|
||||
msgstr "Missatge:"
|
||||
|
||||
#: ../extensions/gajim/extension.js:226
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s està absent."
|
||||
|
||||
#: ../extensions/gajim/extension.js:222
|
||||
#: ../extensions/gajim/extension.js:229
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s està fora de línia."
|
||||
|
||||
#: ../extensions/gajim/extension.js:225
|
||||
#: ../extensions/gajim/extension.js:232
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s està en línia."
|
||||
|
||||
#: ../extensions/gajim/extension.js:228
|
||||
#: ../extensions/gajim/extension.js:235
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s està ocupat."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Si és «true» (cert), posiciona el títol de la finestra damunt de la "
|
||||
"miniatura corresponent, substituint el comportament per defecte del Shell de "
|
||||
"posicionar-lo a baix. Cal reiniciar el Shell per tal de que aquest canvi "
|
||||
"tingui efecte."
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Utilitza més pantalla per les finestres"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Posiciona els títols de les finestres al damunt"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
|
||||
"default grid based algorithm, 'natural' to use another one that reflects "
|
||||
"more the position and size of the actual window"
|
||||
msgstr ""
|
||||
"L'algoritme per posicionar les miniatures en la perspectiva general. Useu "
|
||||
"«grid» (graella) per a utilitzar l'algoritme per defecte basat en disposició "
|
||||
"en graella, o «natural» (natural) per a usar un algoritme que reflexa millor "
|
||||
"la posició i mida de la finestra actual."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
@@ -285,38 +270,258 @@ msgstr ""
|
||||
"configuració només s'aplica a l'estratègia de posicionament de finestres "
|
||||
"natural."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Utilitza més pantalla per les finestres"
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Posiciona els títols de les finestres al damunt"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
|
||||
msgid "Window placement strategy"
|
||||
msgstr "Estratègia de posicionament de la finestra"
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Si és «true» (cert), posiciona el títol de la finestra damunt de la "
|
||||
"miniatura corresponent, substituint el comportament per defecte del Shell de "
|
||||
"posicionar-lo a baix. Cal reiniciar el Shell per tal de que aquest canvi "
|
||||
"tingui efecte."
|
||||
|
||||
#: ../extensions/places-menu/extension.js:46
|
||||
msgid "Places"
|
||||
msgstr "Llocs"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:47
|
||||
msgid "Devices"
|
||||
msgstr "Dispositius"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:48
|
||||
msgid "Bookmarks"
|
||||
msgstr "Adreces d'interès"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:49
|
||||
msgid "Network"
|
||||
msgstr "Xarxa"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:48
|
||||
#, c-format
|
||||
msgid "Failed to launch \"%s\""
|
||||
msgstr "No s'ha pogut iniciar «%s»"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:121
|
||||
msgid "Home"
|
||||
msgstr "Inici"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:184
|
||||
msgid "File System"
|
||||
msgstr "Sistema de fitxers"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:188
|
||||
msgid "Browse network"
|
||||
msgstr "Navega per la xarxa"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:213
|
||||
msgid "CPU"
|
||||
msgstr "CPU"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:266
|
||||
msgid "Memory"
|
||||
msgstr "Memòria"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "El nom del tema que es carregarà des de ~/.themes/name/gnome-shell"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "Theme name"
|
||||
msgstr "Nom del tema"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:26
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "El nom del tema que es carregarà des de ~/.themes/name/gnome-shell"
|
||||
|
||||
#: ../extensions/workspace-indicator/extension.js:30
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Indicador de l'espai de treball"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:141
|
||||
msgid "Workspace names:"
|
||||
msgstr "Noms dels espais de treball:"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:152
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:186
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espai de treball %d"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:30
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:27
|
||||
#: ../extensions/xrandr-indicator/extension.js:31
|
||||
msgid "Left"
|
||||
msgstr "Esquerra"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:28
|
||||
#: ../extensions/xrandr-indicator/extension.js:32
|
||||
msgid "Right"
|
||||
msgstr "Dreta"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:29
|
||||
#: ../extensions/xrandr-indicator/extension.js:33
|
||||
msgid "Upside-down"
|
||||
msgstr "Capgira"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:78
|
||||
msgid "Configure display settings..."
|
||||
msgstr "Configura els paràmetres de visualització..."
|
||||
#: ../extensions/xrandr-indicator/extension.js:50
|
||||
msgid "Display"
|
||||
msgstr "Pantalla"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:80
|
||||
msgid "Display Settings"
|
||||
msgstr "Paràmetres de la pantalla"
|
||||
|
||||
#~ msgid "The alt tab behaviour."
|
||||
#~ msgstr "Comportament de l'«Alternate Tab»."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and "
|
||||
#~ "workspace_icons. See the configuration dialogs for details."
|
||||
#~ msgstr ""
|
||||
#~ "Defineix el comportament de l'«Alternate Tab». Els valors possibles són: "
|
||||
#~ "«all_thumbnails» (totes i les miniatures) i «workspace_icons» (espais de "
|
||||
#~ "treball i icones). Vegeu els diàlegs de configuració per saber-ne més."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This mode presents all applications from all workspaces in one selection "
|
||||
#~ "list. Instead of using the application icon of every window, it uses "
|
||||
#~ "small thumbnails resembling the window itself."
|
||||
#~ msgstr ""
|
||||
#~ "Aquest mode mostra totes les aplicacions de tots els espais de treball en "
|
||||
#~ "una sola llista de selecció. En comptes de fer servir la icona de "
|
||||
#~ "l'aplicació per cada finestra, fa servir miniatures de les mateixes "
|
||||
#~ "finestres de les aplicacions."
|
||||
|
||||
#~ msgid "Workspace & Icons"
|
||||
#~ msgstr "Espai de treball i icones"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This mode let's you switch between the applications of your current "
|
||||
#~ "workspace and gives you additionally the option to switch to the last "
|
||||
#~ "used application of your previous workspace. This is always the last "
|
||||
#~ "symbol in the list and is segregated by a separator/vertical line if "
|
||||
#~ "available. \n"
|
||||
#~ "Every window is represented by its application icon."
|
||||
#~ msgstr ""
|
||||
#~ "Aquest mode us permet canviar entre les aplicacions de l'espai de treball "
|
||||
#~ "actual i us dóna la possibilitat de canviar a l'última aplicació "
|
||||
#~ "utilitzada de l'espai de treball anterior. Es mostra, en cas d'estar "
|
||||
#~ "disponible, sempre com a l'última icona de la llista, separada de la "
|
||||
#~ "resta amb un separador vertical.\n"
|
||||
#~ "Cada finestra està representada per la seva icona d'aplicació."
|
||||
|
||||
#~ msgid "Move current selection to front before closing the popup"
|
||||
#~ msgstr ""
|
||||
#~ "Mou la selecció actual al primer pla abans de tancar el diàleg emergent"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The Alternate Tab can be used in different modes, that affect the way "
|
||||
#~ "windows are chosen and presented."
|
||||
#~ msgstr ""
|
||||
#~ "L'«Alternate Tab» es pot utilitzar de diferents maneres que canvien la "
|
||||
#~ "forma en que es seleccionen i es mostren les finestres."
|
||||
|
||||
#~ msgid "Removable Devices"
|
||||
#~ msgstr "Dispositius extraïbles"
|
||||
|
||||
#~ msgid "Configure display settings..."
|
||||
#~ msgstr "Configura els paràmetres de visualització..."
|
||||
|
||||
#~ msgid "Available"
|
||||
#~ msgstr "Disponible"
|
||||
|
||||
#~ msgid "Busy"
|
||||
#~ msgstr "Ocupat"
|
||||
|
||||
#~ msgid "My Account"
|
||||
#~ msgstr "El meu compte"
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "Bloca la pantalla"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "Canvia d'usuari"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "Surt..."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This is the first time you use the Alternate Tab extension. \n"
|
||||
#~ "Please choose your preferred behaviour:\n"
|
||||
#~ "\n"
|
||||
#~ "All & Thumbnails:\n"
|
||||
#~ " This mode presents all applications from all workspaces in one "
|
||||
#~ "selection \n"
|
||||
#~ " list. Instead of using the application icon of every window, it uses "
|
||||
#~ "small \n"
|
||||
#~ " thumbnails resembling the window itself. \n"
|
||||
#~ "\n"
|
||||
#~ "Workspace & Icons:\n"
|
||||
#~ " This mode let's you switch between the applications of your current \n"
|
||||
#~ " workspace and gives you additionally the option to switch to the last "
|
||||
#~ "used \n"
|
||||
#~ " application of your previous workspace. This is always the last "
|
||||
#~ "symbol in \n"
|
||||
#~ " the list and is segregated by a separator/vertical line if "
|
||||
#~ "available. \n"
|
||||
#~ " Every window is represented by its application icon. \n"
|
||||
#~ "\n"
|
||||
#~ "Native:\n"
|
||||
#~ " This mode is the native GNOME 3 behaviour or in other words: "
|
||||
#~ "Clicking \n"
|
||||
#~ " native switches the Alternate Tab extension off. \n"
|
||||
#~ msgstr ""
|
||||
#~ "Aquest és el primer cop que utilitzeu l'extensió «Alternate Tab». \n"
|
||||
#~ "Trieu el comportament que preferiu:\n"
|
||||
#~ "\n"
|
||||
#~ "Totes i miniatures:\n"
|
||||
#~ " Aquest mode presenta totes les aplicacions de tots els espais de "
|
||||
#~ "treball com a\n"
|
||||
#~ " una llista de selecció. En comptes de mostrar la icona d'aplicació de "
|
||||
#~ "cada finestra, mostra les \n"
|
||||
#~ " miniatures que representen el contingut de la finestra. \n"
|
||||
#~ "\n"
|
||||
#~ "Espai de treball i icones:\n"
|
||||
#~ " Aquest mode us permet canviar entre aplicacions de l'espai de treball "
|
||||
#~ "actual \n"
|
||||
#~ " i us dóna la possibilitat de canviar a l'última aplicació usada de "
|
||||
#~ "l'espai de \n"
|
||||
#~ " treball anterior. Aquest és sempre el darrer símbol a la llista i "
|
||||
#~ "està separat \n"
|
||||
#~ " per una línia vertical/separador quan està disponible. \n"
|
||||
#~ " Cada finestra es representa per la seva icona d'aplicació. \n"
|
||||
#~ "\n"
|
||||
#~ "Nadiu:\n"
|
||||
#~ " Aquest és el mode de comportament nadiu al GNOME 3 o amb altres "
|
||||
#~ "paraules: fent \n"
|
||||
#~ " clic inhabilita l'extensió «Alternate Tab». \n"
|
||||
|
||||
#~ msgid "Alt Tab Behaviour"
|
||||
#~ msgstr "Comportament de l'«Alternate Tab»"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancel·la"
|
||||
|
||||
#~ msgid "Ask the user for a default behaviour if true."
|
||||
#~ msgstr ""
|
||||
#~ "Si és «true» (cert) pregunta a l'usuari pel comportament per defecte."
|
||||
|
||||
#~ msgid "Indicates if Alternate Tab is newly installed"
|
||||
#~ msgstr "Indica si s'acaba d'instal·lar l'«Alternate Tab»"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The algorithm used to layout thumbnails in the overview. 'grid' to use "
|
||||
#~ "the default grid based algorithm, 'natural' to use another one that "
|
||||
#~ "reflects more the position and size of the actual window"
|
||||
#~ msgstr ""
|
||||
#~ "L'algoritme per posicionar les miniatures en la perspectiva general. Useu "
|
||||
#~ "«grid» (graella) per a utilitzar l'algoritme per defecte basat en "
|
||||
#~ "disposició en graella, o «natural» (natural) per a usar un algoritme que "
|
||||
#~ "reflexa millor la posició i mida de la finestra actual."
|
||||
|
||||
#~ msgid "Window placement strategy"
|
||||
#~ msgstr "Estratègia de posicionament de la finestra"
|
||||
|
||||
320
po/cs.po
320
po/cs.po
@@ -1,67 +1,108 @@
|
||||
# Czech translation for gnome-shell-extensions.
|
||||
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||
# Marek Černocký <marek@manet.cz>, 2011.
|
||||
#
|
||||
# Marek Černocký <marek@manet.cz>, 2011, 2012, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=extensions\n"
|
||||
"POT-Creation-Date: 2011-04-16 16:32+0000\n"
|
||||
"PO-Revision-Date: 2011-04-17 11:10+0200\n"
|
||||
"POT-Creation-Date: 2013-02-08 12:25+0000\n"
|
||||
"PO-Revision-Date: 2013-02-17 09:19+0100\n"
|
||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: cs\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Gtranslator 2.91.6\n"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:23
|
||||
#: ../extensions/alternative-status-menu/extension.js:27
|
||||
#: ../extensions/alternative-status-menu/extension.js:93
|
||||
msgid "Hibernate"
|
||||
msgstr "Uspat na disk"
|
||||
#: ../data/gnome-classic.desktop.in.h:1
|
||||
#: ../data/gnome-classic.session.desktop.in.in.h:1
|
||||
msgid "GNOME Classic"
|
||||
msgstr "GNOME klasik"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:26
|
||||
#: ../extensions/alternative-status-menu/extension.js:92
|
||||
#: ../data/gnome-classic.desktop.in.h:2
|
||||
msgid "This session logs you into GNOME Classic"
|
||||
msgstr "Toto sezení vás přihlásí do GNOME klasik"
|
||||
|
||||
#: ../data/gnome-shell-classic.desktop.in.in.h:1
|
||||
msgid "GNOME Shell Classic"
|
||||
msgstr "GNOME Shell klasik"
|
||||
|
||||
#: ../data/gnome-shell-classic.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Správa oken a spouštění aplikací"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:20
|
||||
msgid "Thumbnail only"
|
||||
msgstr "Pouze náhled"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:21
|
||||
msgid "Application icon only"
|
||||
msgstr "Pouze ikona aplikace"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:22
|
||||
msgid "Thumbnail and application icon"
|
||||
msgstr "Náhled a ikona aplikace"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:37
|
||||
msgid "Present windows as"
|
||||
msgstr "Představovat okna jako"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:62
|
||||
msgid "Show only windows in the current workspace"
|
||||
msgstr "Zobrazovat pouze okna z aktuální pracovní plochy"
|
||||
|
||||
#. add the new entries
|
||||
#: ../extensions/alternative-status-menu/extension.js:144
|
||||
msgid "Suspend"
|
||||
msgstr "Uspat do paměti"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:52
|
||||
msgid "Available"
|
||||
msgstr "Dostupný"
|
||||
#: ../extensions/alternative-status-menu/extension.js:147
|
||||
msgid "Hibernate"
|
||||
msgstr "Uspat na disk"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:57
|
||||
msgid "Busy"
|
||||
msgstr "Zaneprázdněný"
|
||||
#: ../extensions/alternative-status-menu/extension.js:150
|
||||
msgid "Power Off"
|
||||
msgstr "Vypnout"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:65
|
||||
msgid "My Account"
|
||||
msgstr "Můj účet"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
|
||||
msgid "Enable suspending"
|
||||
msgstr "Povolit uspávání do paměti"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:69
|
||||
msgid "System Settings"
|
||||
msgstr "Nastavení systému"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
|
||||
msgid "Control the visibility of the Suspend menu item"
|
||||
msgstr "Řídí viditelnost položky „Uspat do paměti“ v nabídce"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:76
|
||||
msgid "Lock Screen"
|
||||
msgstr "Zamknout obrazovku"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
|
||||
msgid "Enable hibernating"
|
||||
msgstr "Povolit uspávání na disk"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:80
|
||||
msgid "Switch User"
|
||||
msgstr "Přepnout uživatele"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
|
||||
msgid "Control the visibility of the Hibernate menu item"
|
||||
msgstr "Řídí viditelnost položky „Uspat na disk“ v nabídce"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:85
|
||||
msgid "Log Out..."
|
||||
msgstr "Odhlásit se…"
|
||||
#: ../extensions/apps-menu/extension.js:50
|
||||
msgid "Activities Overview"
|
||||
msgstr "Přehled činností"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:100
|
||||
msgid "Power Off..."
|
||||
msgstr "Vypnout…"
|
||||
#: ../extensions/apps-menu/extension.js:103
|
||||
msgid "Favorites"
|
||||
msgstr "Oblíbené"
|
||||
|
||||
#: ../extensions/apps-menu/extension.js:197
|
||||
msgid "Applications"
|
||||
msgstr "Aplikace"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Seznam aplikací a pracovních ploch"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -69,78 +110,197 @@ msgstr ""
|
||||
"Seznam řetězců, z nichž každý obsahuje ID aplikace (název souboru pracovní "
|
||||
"plochy), následovaný dvojtečkou a číslem pracovní plochy"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Seznam aplikací a pracovních ploch"
|
||||
#: ../extensions/auto-move-windows/prefs.js:55
|
||||
msgid "Application"
|
||||
msgstr "Aplikace"
|
||||
|
||||
#: ../extensions/dock/extension.js:116
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Přetažením sem přidáte do oblíbených"
|
||||
#: ../extensions/auto-move-windows/prefs.js:64
|
||||
#: ../extensions/auto-move-windows/prefs.js:106
|
||||
msgid "Workspace"
|
||||
msgstr "Pracovní plocha"
|
||||
|
||||
#: ../extensions/dock/extension.js:417
|
||||
msgid "New Window"
|
||||
msgstr "Nové okno"
|
||||
#: ../extensions/auto-move-windows/prefs.js:80
|
||||
msgid "Add rule"
|
||||
msgstr "Přidat pravidlo"
|
||||
|
||||
#: ../extensions/dock/extension.js:419
|
||||
msgid "Quit Application"
|
||||
msgstr "Ukončit aplikaci"
|
||||
#: ../extensions/auto-move-windows/prefs.js:94
|
||||
msgid "Create new matching rule"
|
||||
msgstr "Vytvoření nového srovnávacího pravidla"
|
||||
|
||||
#: ../extensions/dock/extension.js:424
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Odebrat z oblíbených"
|
||||
#: ../extensions/auto-move-windows/prefs.js:98
|
||||
msgid "Add"
|
||||
msgstr "Přidat"
|
||||
|
||||
#: ../extensions/dock/extension.js:425
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Přidat do oblíbených"
|
||||
#: ../extensions/drive-menu/extension.js:72
|
||||
#, c-format
|
||||
msgid "Ejecting drive '%s' failed:"
|
||||
msgstr "Vysunutí disku „%s“ selhalo:"
|
||||
|
||||
#: ../extensions/example/extension.js:11
|
||||
#: ../extensions/drive-menu/extension.js:89
|
||||
msgid "Removable devices"
|
||||
msgstr "Výměnná zařízení"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:106
|
||||
msgid "Open File"
|
||||
msgstr "Otevřít soubor"
|
||||
|
||||
#: ../extensions/example/extension.js:17
|
||||
msgid "Hello, world!"
|
||||
msgstr "Ahoj světe!"
|
||||
|
||||
#: ../extensions/gajim/extension.js:219
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s je pryč."
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
|
||||
msgid "Alternative greeting text."
|
||||
msgstr "Alternativní uvítací text"
|
||||
|
||||
#: ../extensions/gajim/extension.js:222
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s je odpojen."
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"If not empty, it contains the text that will be shown when clicking on the "
|
||||
"panel."
|
||||
msgstr ""
|
||||
"Pokud není prázdné, obsahuje text, který se objeví po kliknutí na panel."
|
||||
|
||||
#: ../extensions/gajim/extension.js:225
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s je připojen."
|
||||
#. TRANSLATORS: Example is the name of the extension, should not be
|
||||
#. translated
|
||||
#: ../extensions/example/prefs.js:30
|
||||
msgid ""
|
||||
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||
"as such it has little functionality on its own.\n"
|
||||
"Nevertheless it's possible to customize the greeting message."
|
||||
msgstr ""
|
||||
"Rozšíření Example vám má jen ukázat, jak sestavit dobře fungující rozšíření "
|
||||
"pro Shell, a tak je jeho praktické využití pramalé.\n"
|
||||
"Přesto si můžete alespoň upravit uvítací zprávu."
|
||||
|
||||
#: ../extensions/gajim/extension.js:228
|
||||
#: ../extensions/example/prefs.js:36
|
||||
msgid "Message:"
|
||||
msgstr "Zpráva:"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Použít větší část obrazovky pro okna"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
"Pomocí přizpůsobení měřítka obrazovky spolu se zmenšením ohraničení zkusit "
|
||||
"využít větší část obrazovky pro umístění náhledů oken. Toto nastavení se "
|
||||
"použije pouze dohromady se strategií umisťování „natural“."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Umístit název okna nahoru"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Pokud je zapnuto, umisťuje se název okna nad případný náhled, čímž se "
|
||||
"přepíše výchozí chování shellu, který jej umisťuje dolů. Změna tohoto "
|
||||
"nastavení vyžaduje restart shellu, aby se projevila."
|
||||
|
||||
#: ../extensions/places-menu/extension.js:57
|
||||
msgid "Places"
|
||||
msgstr "Místa"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:48
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s je zaneprázdněn."
|
||||
msgid "Failed to launch \"%s\""
|
||||
msgstr "Selhalo spuštění „%s“"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:121
|
||||
msgid "Home"
|
||||
msgstr "Domů"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:195
|
||||
msgid "Computer"
|
||||
msgstr "Počítač"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:199
|
||||
msgid "Browse Network"
|
||||
msgstr "Procházet síť"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:213
|
||||
msgid "CPU"
|
||||
msgstr "Procesor"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:266
|
||||
msgid "Memory"
|
||||
msgstr "Paměť"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "Název motivu, který se má načíst z ~/.themes/name/gnome-shell"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "Theme name"
|
||||
msgstr "Název motivu"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:26
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "Název motivu, který se má načíst z ~/.themes/name/gnome-shell"
|
||||
|
||||
#: ../extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in.h:1
|
||||
msgid "When to group windows"
|
||||
msgstr "Kdy seskupovat okna"
|
||||
|
||||
#: ../extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are \"never\" and \"always\"."
|
||||
msgstr ""
|
||||
"Rozhoduje, kdy se mají v seznamu oken seskupovat okna stejné aplikace. Možné "
|
||||
"hodnoty jsou „never“ (nikdy) a „always“ (vždy)."
|
||||
|
||||
#: ../extensions/window-list/prefs.js:30
|
||||
msgid "Window Grouping"
|
||||
msgstr "Seskupování oken"
|
||||
|
||||
#: ../extensions/window-list/prefs.js:49
|
||||
msgid "Never group windows"
|
||||
msgstr "Nikdy neseskupovat okna"
|
||||
|
||||
#: ../extensions/window-list/prefs.js:50
|
||||
msgid "Always group windows"
|
||||
msgstr "Vždy seskupovat okna"
|
||||
|
||||
#: ../extensions/workspace-indicator/extension.js:30
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Ukazatel pracovní plochy"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:141
|
||||
msgid "Workspace names:"
|
||||
msgstr "Názvy pracovních ploch"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:152
|
||||
msgid "Name"
|
||||
msgstr "Název"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:186
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Pracovní plocha %d"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:30
|
||||
msgid "Normal"
|
||||
msgstr "Normální"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:27
|
||||
#: ../extensions/xrandr-indicator/extension.js:31
|
||||
msgid "Left"
|
||||
msgstr "Doleva"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:28
|
||||
#: ../extensions/xrandr-indicator/extension.js:32
|
||||
msgid "Right"
|
||||
msgstr "Doprava"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:29
|
||||
#: ../extensions/xrandr-indicator/extension.js:33
|
||||
msgid "Upside-down"
|
||||
msgstr "Vzhůru nohama"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:78
|
||||
msgid "Configure display settings..."
|
||||
msgstr "Upravit nastavení zobrazení…"
|
||||
#: ../extensions/xrandr-indicator/extension.js:50
|
||||
msgid "Display"
|
||||
msgstr "Obrazovka"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:80
|
||||
msgid "Display Settings"
|
||||
msgstr "Nastavení obrazovky"
|
||||
|
||||
209
po/da.po
209
po/da.po
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-04-06 22:28+0200\n"
|
||||
"PO-Revision-Date: 2011-04-06 09:07+0000\n"
|
||||
"POT-Creation-Date: 2012-01-02 12:35+0100\n"
|
||||
"PO-Revision-Date: 2011-12-27 00:32+0000\n"
|
||||
"Last-Translator: Kris Thomsen <lakristho@gmail.com>\n"
|
||||
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
|
||||
"Language: da\n"
|
||||
@@ -18,6 +18,105 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. add the new entries
|
||||
#: ../extensions/alternative-status-menu/extension.js:68
|
||||
msgid "Suspend"
|
||||
msgstr "Dvale"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:73
|
||||
msgid "Hibernate"
|
||||
msgstr "Hviletilstand"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:78
|
||||
msgid "Power Off..."
|
||||
msgstr "Sluk..."
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:54
|
||||
msgid ""
|
||||
"This is the first time you use the Alternate Tab extension. \n"
|
||||
"Please choose your preferred behaviour:\n"
|
||||
"\n"
|
||||
"All & Thumbnails:\n"
|
||||
" This mode presents all applications from all workspaces in one "
|
||||
"selection \n"
|
||||
" list. Instead of using the application icon of every window, it uses "
|
||||
"small \n"
|
||||
" thumbnails resembling the window itself. \n"
|
||||
"\n"
|
||||
"Workspace & Icons:\n"
|
||||
" This mode let's you switch between the applications of your current \n"
|
||||
" workspace and gives you additionally the option to switch to the last "
|
||||
"used \n"
|
||||
" application of your previous workspace. This is always the last symbol "
|
||||
"in \n"
|
||||
" the list and is segregated by a separator/vertical line if available. \n"
|
||||
" Every window is represented by its application icon. \n"
|
||||
"\n"
|
||||
"If you whish to revert to the default behavior for the Alt-Tab switcher, "
|
||||
"just\n"
|
||||
"disable the extension from extensions.gnome.org or the Advanced Settings "
|
||||
"application."
|
||||
msgstr ""
|
||||
"Dette er første gang du bruger Alternate Tab-udvidelsen. \n"
|
||||
"Vælg venligst din foretrukne opførsel:\n"
|
||||
"\n"
|
||||
"Alle & miniaturebilleder:\n"
|
||||
" Denne tilstand præsenterer alle programmer fra alle arbejdsområder i en "
|
||||
"markerings- \n"
|
||||
" liste. I stedet for at bruge programikonet for hvert vindue, bruges et "
|
||||
"lille \n"
|
||||
" miniaturebillede af vinduet selv. \n"
|
||||
"\n"
|
||||
"Arbejdsområde & ikoner:\n"
|
||||
" Denne tilstand giver mulighed for at skifte mellem programmerne i dit "
|
||||
"nuværende \n"
|
||||
" arbejdsområde og giver dig derudover muligheden for at skifte til det "
|
||||
"seneste brugte \n"
|
||||
" program i dit tidligere arbejdsområde. Dette er altid det sidste symbol "
|
||||
"i \n"
|
||||
" listen og er visuelt adskilt af en vertikal linje, hvis tilgængelig. \n"
|
||||
" Hvert vindue er repræsenteret af dets programikon. \n"
|
||||
"\n"
|
||||
"Hvis du ønsker at skifte tilbage til standardopførslen for Alt-Tab-"
|
||||
"skifteren, skal du\n"
|
||||
"blot deaktivere udvidelsen fra extensions.gnome.org eller programmet "
|
||||
"Avancerede indstillinger."
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:295
|
||||
msgid "Alt Tab Behaviour"
|
||||
msgstr "Alt-Tab-opførsel"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:311
|
||||
msgid "All & Thumbnails"
|
||||
msgstr "Alle & miniaturebilleder"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:318
|
||||
msgid "Workspace & Icons"
|
||||
msgstr "Arbejdsområde & ikoner"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:325
|
||||
msgid "Cancel"
|
||||
msgstr "Annullér"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "Ask the user for a default behaviour if true."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid "Indicates if Alternate Tab is newly installed"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
|
||||
"workspace_icons."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
|
||||
#, fuzzy
|
||||
msgid "The alt tab behaviour."
|
||||
msgstr "Alt-Tab-opførsel"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
@@ -30,50 +129,120 @@ msgstr ""
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Liste over programmer og arbejdsområder"
|
||||
|
||||
#: ../extensions/dock/extension.js:116
|
||||
#: ../extensions/dock/extension.js:561
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Træk hertil for at føje til favoritter"
|
||||
|
||||
#: ../extensions/dock/extension.js:417
|
||||
#: ../extensions/dock/extension.js:896
|
||||
msgid "New Window"
|
||||
msgstr "Nyt vindue"
|
||||
|
||||
#: ../extensions/dock/extension.js:419
|
||||
#: ../extensions/dock/extension.js:898
|
||||
msgid "Quit Application"
|
||||
msgstr "Afslut program"
|
||||
|
||||
#: ../extensions/dock/extension.js:424
|
||||
#: ../extensions/dock/extension.js:903
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Fjern fra favoritter"
|
||||
|
||||
#: ../extensions/dock/extension.js:425
|
||||
#: ../extensions/dock/extension.js:904
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Føj til favoritter"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
|
||||
msgid "Autohide duration"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid "Autohide effect"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Icon size"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Position of the dock"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
msgid "Sets icon size of the dock."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
|
||||
msgid ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
|
||||
"'move'"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
|
||||
msgid "Sets the time duration of the autohide effect."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:69
|
||||
msgid "Open file manager"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/example/extension.js:11
|
||||
msgid "Hello, world!"
|
||||
msgstr "Hej verden!"
|
||||
|
||||
#: ../extensions/gajim/extension.js:219
|
||||
#: ../extensions/gajim/extension.js:227
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s er ikke til stede."
|
||||
|
||||
#: ../extensions/gajim/extension.js:222
|
||||
#: ../extensions/gajim/extension.js:230
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s er frakoblet."
|
||||
|
||||
#: ../extensions/gajim/extension.js:225
|
||||
#: ../extensions/gajim/extension.js:233
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s er tilgængelig."
|
||||
|
||||
#: ../extensions/gajim/extension.js:228
|
||||
#: ../extensions/gajim/extension.js:236
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s er optaget."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid "Place window captions on top"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid "Use more screen for windows"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/places-menu/extension.js:36
|
||||
msgid "Removable Devices"
|
||||
msgstr ""
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "Navnet på temaet, som indlæses fra ~/.themes/name/gnome-shell"
|
||||
@@ -101,3 +270,21 @@ msgstr "På hovedet"
|
||||
#: ../extensions/xrandr-indicator/extension.js:78
|
||||
msgid "Configure display settings..."
|
||||
msgstr "Konfigurér skærmindstillinger..."
|
||||
|
||||
#~ msgid "Notifications"
|
||||
#~ msgstr "Beskeder"
|
||||
|
||||
#~ msgid "Online Accounts"
|
||||
#~ msgstr "Online konti"
|
||||
|
||||
#~ msgid "System Settings"
|
||||
#~ msgstr "Systemindstillinger"
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "Lås skærm"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "Skift bruger"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "Log ud..."
|
||||
|
||||
511
po/de.po
511
po/de.po
@@ -1,153 +1,94 @@
|
||||
# German translation for gnome-shell-extensions.
|
||||
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||
# Mario Blättermann <mariobl@freenet.de>, 2011.
|
||||
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2011.
|
||||
# Mario Blättermann <mario.blaettermann@gmail.com>, 2011, 2012.
|
||||
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2011, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=extensions\n"
|
||||
"POT-Creation-Date: 2011-09-17 09:54+0000\n"
|
||||
"PO-Revision-Date: 2011-09-17 14:58+0100\n"
|
||||
"Last-Translator: Mario Blättermann <mariobl@freenet.de>\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-10-24 12:41+0200\n"
|
||||
"PO-Revision-Date: 2012-10-24 12:37+0100\n"
|
||||
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: \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"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-Language: German\n"
|
||||
"X-Poedit-Country: GERMANY\n"
|
||||
"X-Generator: Gtranslator 2.91.5\n"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:44
|
||||
msgid "Notifications"
|
||||
msgstr "Benachrichtigungen"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "The application icon mode."
|
||||
msgstr "Der Modus des Anwendungssymbols."
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:52
|
||||
msgid "Online Accounts"
|
||||
msgstr "Online-Konten"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
msgstr ""
|
||||
"Legt fest, wie die Fenster im Fensterumschalter angezeigt werden. Gültige "
|
||||
"Werte sind »thumbnail-only« (zeigt ein Vorschaubild des Fensters), »app-icon-"
|
||||
"only« (zeigt das Anwendungssymbol) oder »both« (beides)."
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:56
|
||||
msgid "System Settings"
|
||||
msgstr "Systemeinstellungen"
|
||||
#: ../extensions/alternate-tab/prefs.js:26
|
||||
msgid "Thumbnail only"
|
||||
msgstr "Nur Vorschaubild"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:63
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bildschirm sperren"
|
||||
#: ../extensions/alternate-tab/prefs.js:27
|
||||
msgid "Application icon only"
|
||||
msgstr "Nur Anwendungssymbol"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:68
|
||||
msgid "Switch User"
|
||||
msgstr "Benutzer wechseln"
|
||||
#: ../extensions/alternate-tab/prefs.js:28
|
||||
msgid "Thumbnail and application icon"
|
||||
msgstr "Vorschaubild und Anwendungssymbol"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:73
|
||||
msgid "Log Out..."
|
||||
msgstr "Abmelden …"
|
||||
#: ../extensions/alternate-tab/prefs.js:43
|
||||
msgid "Present windows as"
|
||||
msgstr "Fenster darstellen als"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:81
|
||||
#: ../extensions/alternate-tab/prefs.js:68
|
||||
msgid "Show only windows in the current workspace"
|
||||
msgstr "Nur Fenster der aktuellen Arbeitsfläche anzeigen"
|
||||
|
||||
#. add the new entries
|
||||
#: ../extensions/alternative-status-menu/extension.js:86
|
||||
msgid "Suspend"
|
||||
msgstr "Bereitschaft"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:87
|
||||
#: ../extensions/alternative-status-menu/extension.js:91
|
||||
msgid "Hibernate"
|
||||
msgstr "Ruhezustand"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:93
|
||||
msgid "Power Off..."
|
||||
#: ../extensions/alternative-status-menu/extension.js:96
|
||||
msgid "Power Off"
|
||||
msgstr "Ausschalten …"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:44
|
||||
msgid ""
|
||||
"This is the first time you use the Alternate Tab extension. \n"
|
||||
"Please choose your preferred behaviour:\n"
|
||||
"\n"
|
||||
"All & Thumbnails:\n"
|
||||
" This mode presents all applications from all workspaces in one "
|
||||
"selection \n"
|
||||
" list. Instead of using the application icon of every window, it uses "
|
||||
"small \n"
|
||||
" thumbnails resembling the window itself. \n"
|
||||
"\n"
|
||||
"Workspace & Icons:\n"
|
||||
" This mode let's you switch between the applications of your current \n"
|
||||
" workspace and gives you additionally the option to switch to the last "
|
||||
"used \n"
|
||||
" application of your previous workspace. This is always the last symbol "
|
||||
"in \n"
|
||||
" the list and is segregated by a separator/vertical line if available. \n"
|
||||
" Every window is represented by its application icon. \n"
|
||||
"\n"
|
||||
"Native:\n"
|
||||
" This mode is the native GNOME 3 behaviour or in other words: Clicking \n"
|
||||
" native switches the Alternate Tab extension off. \n"
|
||||
msgstr ""
|
||||
"Sie verwenden die Erweiterung »Alt-Tab« das erste Mal. \n"
|
||||
"Bitte wählen Sie das gewünschte Verhalten:\n"
|
||||
"\n"
|
||||
"Alle und Vorschaubilder:\n"
|
||||
" Dieser Modus stellt alle Anwendungen aus allen Arbeitsflächen in einer\n"
|
||||
" Auswahlliste dar. Anstelle des Anwendungssymbols jedes Fensters werden\n"
|
||||
" kleine Vorschaubilder dargestellt, die dem Fenster ähnlich sind. \n"
|
||||
"\n"
|
||||
"Arbeitsfläche und Symbole:\n"
|
||||
" Dieser Modus ermöglicht den Wechsel zwischen Anwendungen auf Ihrer \n"
|
||||
" aktuellen Arbeitsfläche und ermöglicht weiterhin, auf die zuletzt "
|
||||
"verwendete\n"
|
||||
" Anwendung der letzten Arbeitsfläche zu wechseln. Sie ist immer das "
|
||||
"letzte Symbol\n"
|
||||
" der Liste und ist durch einen Trenner (vertikale Linie) getrennt. \n"
|
||||
" Jedes Fenster wird durch das entsprechende Anwendungssymbol "
|
||||
"repräsentiert.\n"
|
||||
"\n"
|
||||
"Nativ:\n"
|
||||
" Dieser Modus entspricht dem nativen Verhalten von GNOME 3, d.h.\n"
|
||||
" die Erweiterung »Alt-Tab« wird ausgeschaltet. \n"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
|
||||
msgid "Enable suspending"
|
||||
msgstr "Bereitschaft einblenden"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:269
|
||||
msgid "Alt Tab Behaviour"
|
||||
msgstr "Verhalten bei Alt-Tab"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
|
||||
msgid "Control the visibility of the Suspend menu item"
|
||||
msgstr "Die Sichtbarkeit des Menüeintrags »Bereitschaft« festlegen"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:285
|
||||
msgid "All & Thumbnails"
|
||||
msgstr "Alle und Vorschaubilder"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
|
||||
msgid "Enable hibernating"
|
||||
msgstr "Ruhezustand einblenden"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:292
|
||||
msgid "Workspace & Icons"
|
||||
msgstr "Arbeitsbereich und Symbole"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:299
|
||||
msgid "Native"
|
||||
msgstr "Nativ"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:306
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "Ask the user for a default behaviour if true."
|
||||
msgstr ""
|
||||
"Falls wahr, so wird der Benutzer nach dem voreinzustellendem Verhalten "
|
||||
"gefragt."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid "Indicates if Alternate Tab is newly installed"
|
||||
msgstr "Gibt an, ob die Erweiterung »Alt-Tab« neu installiert wurde"
|
||||
|
||||
# Oder müssen die Werte doch übersetzt werden? -ck
|
||||
# Nein, dconf verhält sich hier nicht anders als gconf. Keinesfalls übersetzen! -mb
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
|
||||
"workspace_icons."
|
||||
msgstr ""
|
||||
"Legt das Verhalten bei Drücken von Alt-Tab fest. Mögliche Werte sind: "
|
||||
"»native«, »all_thumbnails« und »workspace_icons«."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
|
||||
msgid "The alt tab behaviour."
|
||||
msgstr "Das Verhalten bei Eingabe von Alt-Tab."
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
|
||||
msgid "Control the visibility of the Hibernate menu item"
|
||||
msgstr "Die Sichtbarkeit des Menüeintrags »Ruhezustand« festlegen"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Anwendungs- und Arbeitsflächenliste"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -156,125 +97,77 @@ msgstr ""
|
||||
"Datei) enthält, gefolgt von einem Doppelpunkt und der Nummer der "
|
||||
"Arbeitsfläche"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Anwendungs- und Arbeitsflächenliste"
|
||||
#: ../extensions/auto-move-windows/prefs.js:55
|
||||
msgid "Application"
|
||||
msgstr "Anwendung"
|
||||
|
||||
#: ../extensions/dock/extension.js:486
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Hierher ziehen, um zu Favoriten hinzuzufügen"
|
||||
#: ../extensions/auto-move-windows/prefs.js:64
|
||||
#: ../extensions/auto-move-windows/prefs.js:106
|
||||
msgid "Workspace"
|
||||
msgstr "Arbeitsfläche "
|
||||
|
||||
#: ../extensions/dock/extension.js:820
|
||||
msgid "New Window"
|
||||
msgstr "Neues Fenster"
|
||||
#: ../extensions/auto-move-windows/prefs.js:80
|
||||
msgid "Add rule"
|
||||
msgstr "Regel hinzufügen"
|
||||
|
||||
#: ../extensions/dock/extension.js:822
|
||||
msgid "Quit Application"
|
||||
msgstr "Anwendung beenden"
|
||||
#: ../extensions/auto-move-windows/prefs.js:94
|
||||
msgid "Create new matching rule"
|
||||
msgstr "Neue Übereinstimmungsregel erstellen"
|
||||
|
||||
#: ../extensions/dock/extension.js:827
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Aus Favoriten entfernen"
|
||||
#: ../extensions/auto-move-windows/prefs.js:98
|
||||
msgid "Add"
|
||||
msgstr "Hinzufügen"
|
||||
|
||||
#: ../extensions/dock/extension.js:828
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Zu Favoriten hinzufügen"
|
||||
#: ../extensions/drive-menu/extension.js:72
|
||||
#, c-format
|
||||
msgid "Ejecting drive '%s' failed:"
|
||||
msgstr "Auswerfen von Laufwerk »%s« schlug fehl:"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
|
||||
msgid "Autohide duration"
|
||||
msgstr "Dauer automatisch verbergen"
|
||||
#: ../extensions/drive-menu/extension.js:89
|
||||
msgid "Removable devices"
|
||||
msgstr "Wechseldatenträger"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid "Autohide effect"
|
||||
msgstr "Effekt automatisch verbergen"
|
||||
#: ../extensions/drive-menu/extension.js:106
|
||||
msgid "Open File"
|
||||
msgstr "Datei öffnen"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr "Automatisches Verbergen aktivieren/deaktivieren"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Icon size"
|
||||
msgstr "Symbolgröße"
|
||||
|
||||
# Dock = das Dock ? -ck
|
||||
# Sofern es sich nicht um das Original-Dash handelt, ja. -mb
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Position of the dock"
|
||||
msgstr "Position des Docks"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
msgid "Sets icon size of the dock."
|
||||
msgstr "Legt die Symbolgröße für das Dock fest"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
|
||||
msgid ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
|
||||
msgstr ""
|
||||
"Legt den Effekt für das versteckte Dock fest. Mögliche Werte sind »resize« "
|
||||
"und »rescale«"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
msgstr ""
|
||||
"Legt die Position des Docks auf dem Bildschirm fest. Mögliche Werte sind "
|
||||
"»right« und »left«"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
|
||||
msgid "Sets the time duration of the autohide effect."
|
||||
msgstr "Legt die Effektdauer für automatisches Verbergen fest."
|
||||
|
||||
#: ../extensions/example/extension.js:11
|
||||
#: ../extensions/example/extension.js:17
|
||||
msgid "Hello, world!"
|
||||
msgstr "Hallo, Welt!"
|
||||
|
||||
#: ../extensions/gajim/extension.js:227
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s ist abwesend."
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
|
||||
msgid "Alternative greeting text."
|
||||
msgstr "Alternative Begrüßungstext."
|
||||
|
||||
#: ../extensions/gajim/extension.js:230
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s ist abgemeldet."
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"If not empty, it contains the text that will be shown when clicking on the "
|
||||
"panel."
|
||||
msgstr ""
|
||||
"Falls nicht leer, ist dies der Text, der beim Anklicken des Panels angezeigt "
|
||||
"wird."
|
||||
|
||||
#: ../extensions/gajim/extension.js:233
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s ist angemeldet."
|
||||
#. TRANSLATORS: Example is the name of the extension, should not be
|
||||
#. translated
|
||||
#: ../extensions/example/prefs.js:30
|
||||
msgid ""
|
||||
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||
"as such it has little functionality on its own.\n"
|
||||
"Nevertheless it's possible to customize the greeting message."
|
||||
msgstr ""
|
||||
"Das Beispiel soll zeigen, wie sich korrekt verhaltende Erweiterungen für die "
|
||||
"Shell erstellt werden. Es enthält grundlegende Funktionalität.\n"
|
||||
"Es ist möglich, die Begrüßungsnachricht zu ändern."
|
||||
|
||||
#: ../extensions/gajim/extension.js:236
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s ist beschäftigt."
|
||||
#: ../extensions/example/prefs.js:36
|
||||
msgid "Message:"
|
||||
msgstr "Nachricht:"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Falls wahr, so werden die Fensterbeschriftungen über dem zugehörigen "
|
||||
"Vorschaubild platziert und damit die Voreinstellung der Shell übergangen. "
|
||||
"Eine Änderungseinstellung tritt erst mit einem Neustart der Shell in Kraft."
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Mehr Bildschirmbereich für Fenster verwenden"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Fensterbeschriftungen oben platzieren"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
|
||||
"default grid based algorithm, 'natural' to use another one that reflects "
|
||||
"more the position and size of the actual window"
|
||||
msgstr ""
|
||||
"Der Algorithmus zum Anordnen der Vorschaubilder in der Übersicht. »grid« "
|
||||
"verwendet den voreingestellten Raster-basierten Algorithmus, »natural« setzt "
|
||||
"einen anderen ein, der mehr die tatsächliche Position und Größe des Fensters "
|
||||
"berücksichtigt."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
@@ -286,46 +179,188 @@ msgstr ""
|
||||
"verkleinern. Diese Einstellung betrifft nur den natürlichen "
|
||||
"Platzierungsalgorithmus."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Mehr Bildschirmbereich für Fenster verwenden"
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Fensterbeschriftungen oben platzieren"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
|
||||
msgid "Window placement strategy"
|
||||
msgstr "Regeln zur Fensterplatzierung"
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Falls wahr, so werden die Fensterbeschriftungen über dem zugehörigen "
|
||||
"Vorschaubild platziert und damit die Voreinstellung der Shell übergangen. "
|
||||
"Eine Änderungseinstellung tritt erst mit einem Neustart der Shell in Kraft."
|
||||
|
||||
#: ../extensions/places-menu/extension.js:46
|
||||
msgid "Places"
|
||||
msgstr "Orte"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:47
|
||||
msgid "Devices"
|
||||
msgstr "Geräte"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:48
|
||||
msgid "Bookmarks"
|
||||
msgstr "Lesezeichen"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:49
|
||||
msgid "Network"
|
||||
msgstr "Netzwerk"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:48
|
||||
#, c-format
|
||||
msgid "Failed to launch \"%s\""
|
||||
msgstr "Starten von »%s« fehlgeschlagen"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:121
|
||||
msgid "Home"
|
||||
msgstr "Persönlicher Ordner"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:184
|
||||
msgid "File System"
|
||||
msgstr "Dateisystem"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:188
|
||||
msgid "Browse network"
|
||||
msgstr "Netzwerk durchsuchen"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:213
|
||||
msgid "CPU"
|
||||
msgstr "CPU"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:266
|
||||
msgid "Memory"
|
||||
msgstr "Speicher"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
|
||||
msgid "Theme name"
|
||||
msgstr "Themenname"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr ""
|
||||
"Der Name des Themas, welches aus ~/.themes/name/gnome-shell geladen werden "
|
||||
"soll"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "Theme name"
|
||||
msgstr "Themenname"
|
||||
#: ../extensions/workspace-indicator/extension.js:30
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Arbeitsflächenindikator"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:26
|
||||
#: ../extensions/workspace-indicator/prefs.js:141
|
||||
msgid "Workspace names:"
|
||||
msgstr "Namen der Arbeitsflächen:"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:152
|
||||
msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:186
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeitsfläche %d"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:30
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:27
|
||||
#: ../extensions/xrandr-indicator/extension.js:31
|
||||
msgid "Left"
|
||||
msgstr "Links"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:28
|
||||
#: ../extensions/xrandr-indicator/extension.js:32
|
||||
msgid "Right"
|
||||
msgstr "Rechts"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:29
|
||||
#: ../extensions/xrandr-indicator/extension.js:33
|
||||
msgid "Upside-down"
|
||||
msgstr "Kopfüber"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:78
|
||||
msgid "Configure display settings..."
|
||||
msgstr "Bildschirmeinstellungen festlegen …"
|
||||
#: ../extensions/xrandr-indicator/extension.js:50
|
||||
msgid "Display"
|
||||
msgstr "Anzeige"
|
||||
|
||||
#~ msgid "Available"
|
||||
#~ msgstr "Verfügbar"
|
||||
#: ../extensions/xrandr-indicator/extension.js:80
|
||||
msgid "Display Settings"
|
||||
msgstr "Bildschirmeinstellungen"
|
||||
|
||||
#~ msgid "Busy"
|
||||
#~ msgstr "Beschäftigt"
|
||||
#~ msgid "Drag here to add favorites"
|
||||
#~ msgstr "Hierher ziehen, um zu Favoriten hinzuzufügen"
|
||||
|
||||
#~ msgid "New Window"
|
||||
#~ msgstr "Neues Fenster"
|
||||
|
||||
#~ msgid "Quit Application"
|
||||
#~ msgstr "Anwendung beenden"
|
||||
|
||||
#~ msgid "Remove from Favorites"
|
||||
#~ msgstr "Aus Favoriten entfernen"
|
||||
|
||||
#~ msgid "Add to Favorites"
|
||||
#~ msgstr "Zu Favoriten hinzufügen"
|
||||
|
||||
# Dock = das Dock ? -ck
|
||||
# Sofern es sich nicht um das Original-Dash handelt, ja. -mb
|
||||
#~ msgid "Position of the dock"
|
||||
#~ msgstr "Position des Docks"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sets the position of the dock in the screen. Allowed values are 'right' "
|
||||
#~ "or 'left'"
|
||||
#~ msgstr ""
|
||||
#~ "Legt die Position des Docks auf dem Bildschirm fest. Mögliche Werte sind "
|
||||
#~ "»right« und »left«"
|
||||
|
||||
#~ msgid "Icon size"
|
||||
#~ msgstr "Symbolgröße"
|
||||
|
||||
#~ msgid "Sets icon size of the dock."
|
||||
#~ msgstr "Legt die Symbolgröße für das Dock fest"
|
||||
|
||||
#~ msgid "Enable/disable autohide"
|
||||
#~ msgstr "Automatisches Verbergen aktivieren/deaktivieren"
|
||||
|
||||
#~ msgid "Autohide effect"
|
||||
#~ msgstr "Effekt automatisch verbergen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' "
|
||||
#~ "and 'move'"
|
||||
#~ msgstr ""
|
||||
#~ "Legt den Effekt für das versteckte Dock fest. Mögliche Werte sind "
|
||||
#~ "»resize«, »rescale« und »move«"
|
||||
|
||||
#~ msgid "Autohide duration"
|
||||
#~ msgstr "Dauer automatisch verbergen"
|
||||
|
||||
#~ msgid "Sets the time duration of the autohide effect."
|
||||
#~ msgstr "Legt die Effektdauer für automatisches Verbergen fest."
|
||||
|
||||
#~ msgid "Monitor"
|
||||
#~ msgstr "Bildschirm"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sets monitor to display dock in. The default value (-1) is the primary "
|
||||
#~ "monitor."
|
||||
#~ msgstr ""
|
||||
#~ "Legt den Bildschirm fest, in dem das Dock angezeigt werden soll. Die "
|
||||
#~ "Voreinstellung (-1) entspricht dem primären Bildschirm."
|
||||
|
||||
#~ msgid "%s is away."
|
||||
#~ msgstr "%s ist abwesend."
|
||||
|
||||
#~ msgid "%s is offline."
|
||||
#~ msgstr "%s ist abgemeldet."
|
||||
|
||||
#~ msgid "%s is online."
|
||||
#~ msgstr "%s ist angemeldet."
|
||||
|
||||
#~ msgid "%s is busy."
|
||||
#~ msgstr "%s ist beschäftigt."
|
||||
|
||||
#~ msgid "Removable Devices"
|
||||
#~ msgstr "Wechseldatenträger"
|
||||
|
||||
#~ msgid "The alt tab behaviour."
|
||||
#~ msgstr "Das Verhalten bei Eingabe von Alt-Tab."
|
||||
|
||||
615
po/el.po
615
po/el.po
@@ -9,145 +9,85 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=extensions\n"
|
||||
"POT-Creation-Date: 2011-09-17 15:20+0000\n"
|
||||
"PO-Revision-Date: 2011-09-18 14:34+0300\n"
|
||||
"Last-Translator: Ιωάννης Ζαμπούκας <ioza1964@yahoo.gr>\n"
|
||||
"POT-Creation-Date: 2012-10-08 17:42+0000\n"
|
||||
"PO-Revision-Date: 2012-10-11 17:16+0200\n"
|
||||
"Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n"
|
||||
"Language-Team: Greek <team@gnome.gr>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bits\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:44
|
||||
msgid "Notifications"
|
||||
msgstr "Ειδοποιήσεις"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "The application icon mode."
|
||||
msgstr "Η λειτουργία εικονιδίου της εφαρμογής"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:52
|
||||
msgid "Online Accounts"
|
||||
msgstr "Λογαριασμοί διαδικτύου"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
msgstr ""
|
||||
"Διαμορφώνει πως τα παράθυρα θα εμφανίζονται στν εναλλαγή των παραθύρων. "
|
||||
"Έγκυρες ρυθμίσεις είναι 'thumbnail-only' (εμφανίζει μια μικρογραφία του "
|
||||
"παραθύρου), 'app-icon-only' (εμφανίζει μόνο το εικονίδιο της εφαρμογής) ή "
|
||||
"'both'."
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:56
|
||||
msgid "System Settings"
|
||||
msgstr "Ρυθμίσεις συστήματος"
|
||||
#: ../extensions/alternate-tab/prefs.js:26
|
||||
msgid "Thumbnail only"
|
||||
msgstr "Μόνο μικρογραφίες"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:63
|
||||
msgid "Lock Screen"
|
||||
msgstr "Κλείδωμα οθόνης"
|
||||
#: ../extensions/alternate-tab/prefs.js:27
|
||||
msgid "Application icon only"
|
||||
msgstr "Μόνο εικονίδια εφαρμογών"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:68
|
||||
msgid "Switch User"
|
||||
msgstr "Αλλαγή χρήστη"
|
||||
#: ../extensions/alternate-tab/prefs.js:28
|
||||
msgid "Thumbnail and application icon"
|
||||
msgstr "Εικονίδια μικρογραφιών και εφαρμογών"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:73
|
||||
msgid "Log Out..."
|
||||
msgstr "Αποσύνδεση…"
|
||||
#: ../extensions/alternate-tab/prefs.js:43
|
||||
msgid "Present windows as"
|
||||
msgstr "Παρουσίαση παραθύρων ως"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:81
|
||||
#: ../extensions/alternate-tab/prefs.js:68
|
||||
msgid "Show only windows in the current workspace"
|
||||
msgstr "Προβολή των παραθύρων μόνο στον τρέχων χώρο εργασίας"
|
||||
|
||||
#. add the new entries
|
||||
#: ../extensions/alternative-status-menu/extension.js:86
|
||||
msgid "Suspend"
|
||||
msgstr "Αναστολή"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:87
|
||||
#: ../extensions/alternative-status-menu/extension.js:91
|
||||
msgid "Hibernate"
|
||||
msgstr "Αδρανοποίηση"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:93
|
||||
msgid "Power Off..."
|
||||
msgstr "Σβήσιμο…"
|
||||
#: ../extensions/alternative-status-menu/extension.js:96
|
||||
msgid "Power Off"
|
||||
msgstr "Τερματισμός"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:44
|
||||
msgid ""
|
||||
"This is the first time you use the Alternate Tab extension. \n"
|
||||
"Please choose your preferred behaviour:\n"
|
||||
"\n"
|
||||
"All & Thumbnails:\n"
|
||||
" This mode presents all applications from all workspaces in one "
|
||||
"selection \n"
|
||||
" list. Instead of using the application icon of every window, it uses "
|
||||
"small \n"
|
||||
" thumbnails resembling the window itself. \n"
|
||||
"\n"
|
||||
"Workspace & Icons:\n"
|
||||
" This mode let's you switch between the applications of your current \n"
|
||||
" workspace and gives you additionally the option to switch to the last "
|
||||
"used \n"
|
||||
" application of your previous workspace. This is always the last symbol "
|
||||
"in \n"
|
||||
" the list and is segregated by a separator/vertical line if available. \n"
|
||||
" Every window is represented by its application icon. \n"
|
||||
"\n"
|
||||
"Native:\n"
|
||||
" This mode is the native GNOME 3 behaviour or in other words: Clicking \n"
|
||||
" native switches the Alternate Tab extension off. \n"
|
||||
msgstr ""
|
||||
"Αυτή είναι η πρώτη φορά που χρησιμοποιήσατε την εναλλακτική επέκταση "
|
||||
"στηλοθέτη. \n"
|
||||
"Παρακαλούμε επιλέξτε την συμπεριφορά που επιθυμείτε εσείς:\n"
|
||||
"\n"
|
||||
"Όλα & μικρογραφίες:\n"
|
||||
" Αυτή η κατάσταση εμφανίζει όλες τις εφαρμογές από όλους τους χώρους "
|
||||
"εργασίας σε μια επιλογή \n"
|
||||
" λίστα. Αντί να χρησιμοποιεί το εικονίδιο της εφαρμογής από κάθε "
|
||||
"παράθυρο, χρησιμοποιεί μικρές \n"
|
||||
" μικρογραφίες που μοιάζουν με το ίδιο το παράθυρο. \n"
|
||||
"\n"
|
||||
"Χώρος εργασίας & εικονίδια:\n"
|
||||
" Αυτή η λειτουργία σας επιτρέπει να κάνετε εναλλαγή μεταξύ των εφαρμογών "
|
||||
"του τρέχοντος \n"
|
||||
" χώρου εργασίας σας και σας δίνει επιπλέον τη δυνατότητα να μεταβείτε "
|
||||
"στην τελευταία χρησιμοποιημένη \n"
|
||||
" εφαρμογή του προηγούμενου χώρου εργασίας σας. Αυτό είναι πάντα το "
|
||||
"τελευταίο σύμβολο στη \n"
|
||||
" λίστα και είναι απομονωμένο από ένα διαχωριστικό/κάθετη γραμμή, εάν "
|
||||
"υπάρχει. \n"
|
||||
" Κάθε παράθυρο αντιπροσωπεύεται από εικονίδιο της εφαρμογής της. \n"
|
||||
"\n"
|
||||
"Μητρική:\n"
|
||||
" Αυτή η λειτουργία είναι η μητρική συμπεριφορά του GNOME 3 ή με άλλα "
|
||||
"λόγια: Αν κάνετε κλικ \n"
|
||||
" στο μητρική θέτει εκτός λειτουργίας την εναλλακτική επέκταση "
|
||||
"στηλοθέτη. \n"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
|
||||
msgid "Enable suspending"
|
||||
msgstr "Ενεργοποίηση αναστολής"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:269
|
||||
msgid "Alt Tab Behaviour"
|
||||
msgstr "Συμπεριφορά Alt Tab"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
|
||||
msgid "Control the visibility of the Suspend menu item"
|
||||
msgstr "Ελέγχει την ορατότητα του αντικειμένου Αναστολη"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:285
|
||||
msgid "All & Thumbnails"
|
||||
msgstr "Όλα & μικρογραφίες"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
|
||||
msgid "Enable hibernating"
|
||||
msgstr "Ενεργοποίηση αδρανοποίησης"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:292
|
||||
msgid "Workspace & Icons"
|
||||
msgstr "Χώρος εργασίας & εικονίδια"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:299
|
||||
msgid "Native"
|
||||
msgstr "Εγγενή"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:306
|
||||
msgid "Cancel"
|
||||
msgstr "Ακύρωση"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "Ask the user for a default behaviour if true."
|
||||
msgstr "Ρωτήστε τον χρήστη για μια προεπιλεγμένη συμπεριφορα εαν αληθεύει."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid "Indicates if Alternate Tab is newly installed"
|
||||
msgstr "Υποδεικνύει αν ο εναλλακτικός στηλοθέτης είναι νεοεισαχθείς"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
|
||||
"workspace_icons."
|
||||
msgstr ""
|
||||
"Ρυθμίζει την συμπεριφορά του Alt Tab. Πιθανές τιμές είναι οι εξής: μητρική, "
|
||||
"όλες_μικρογραφίες και εικονίδια_χώρου εργασίας."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
|
||||
msgid "The alt tab behaviour."
|
||||
msgstr "Η συμπεριφορά alt tab."
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
|
||||
msgid "Control the visibility of the Hibernate menu item"
|
||||
msgstr "Ελέγχει την ορατότητα του αντικειμένου Αδρανοποίηση"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Λίστα εφαρμογών και χώρου εργασίας"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -156,124 +96,175 @@ msgstr ""
|
||||
"(όνομα αρχείου επιφάνειας εργασίας), ακολουθούμενη από άνω και κάτω τελεία "
|
||||
"και τον αριθμό του χώρου εργασίας"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Λίστα εφαρμογής και χώρου εργασίας"
|
||||
#: ../extensions/auto-move-windows/prefs.js:55
|
||||
msgid "Application"
|
||||
msgstr "Εφαρμογή"
|
||||
|
||||
#: ../extensions/dock/extension.js:486
|
||||
#: ../extensions/auto-move-windows/prefs.js:64
|
||||
#: ../extensions/auto-move-windows/prefs.js:106
|
||||
msgid "Workspace"
|
||||
msgstr "Χώρος εργασίας"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:80
|
||||
msgid "Add rule"
|
||||
msgstr "Προσθήκη κανόνα"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:94
|
||||
msgid "Create new matching rule"
|
||||
msgstr "Δημιουργία νέου κανόνα που ταιριάζει"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:98
|
||||
msgid "Add"
|
||||
msgstr "Προσθήκη"
|
||||
|
||||
#: ../extensions/dock/extension.js:600
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Σύρετε εδώ για να προσθέσετε αγαπημένα"
|
||||
|
||||
#: ../extensions/dock/extension.js:820
|
||||
#: ../extensions/dock/extension.js:926
|
||||
msgid "New Window"
|
||||
msgstr "Νέο παράθυρο"
|
||||
|
||||
#: ../extensions/dock/extension.js:822
|
||||
#: ../extensions/dock/extension.js:928
|
||||
msgid "Quit Application"
|
||||
msgstr "Εγκατάλειψη εφαρμογής"
|
||||
|
||||
#: ../extensions/dock/extension.js:827
|
||||
#: ../extensions/dock/extension.js:933
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Απομάκρυνση από τα αγαπημένα"
|
||||
|
||||
#: ../extensions/dock/extension.js:828
|
||||
#: ../extensions/dock/extension.js:934
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Προσθήκη στα αγαπημένα"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
|
||||
msgid "Autohide duration"
|
||||
msgstr "Διάρκεια αυτόματης απόκρυψης"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid "Autohide effect"
|
||||
msgstr "Εφέ αυτόματης απόκρυψης"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr "Ενεργοποίηση/απενεργοποίηση αυτόματης απόκρυψης"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Icon size"
|
||||
msgstr "Μέγεθος εικονιδίου"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Position of the dock"
|
||||
msgstr "Θέση υποδοχέα"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
msgid "Sets icon size of the dock."
|
||||
msgstr "Ρυθμίζει το μέγεθος εικόνας του υποδοχέα."
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
|
||||
msgid ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
|
||||
msgstr ""
|
||||
"Ρυθμίζειτην επίδραση κρυψίματος του υποδοχέα. Επιτρεπόμενες τιμές είναι "
|
||||
"resize («αλλαγή μεγέθους») ή rescale («αλλαγή κλίμακας»)"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
msgstr ""
|
||||
"Ρυθμίζει τη θέση του υποδοχέα στην οθόνη. Επιτρεπόμενες τιμές είναι right («δεξιά») "
|
||||
"ή right («αριστερά»)"
|
||||
"Ρυθμίζει τη θέση του υποδοχέα στην οθόνη. Επιτρεπόμενες τιμές είναι right "
|
||||
"(«δεξιά») ή right («αριστερά»)"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Icon size"
|
||||
msgstr "Μέγεθος εικονιδίου"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Sets icon size of the dock."
|
||||
msgstr "Ρυθμίζει το μέγεθος εικόνας του υποδοχέα."
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr "Ενεργοποίηση/απενεργοποίηση αυτόματης απόκρυψης"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
msgid "Autohide effect"
|
||||
msgstr "Εφέ αυτόματης απόκρυψης"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
|
||||
msgid ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
|
||||
"'move'"
|
||||
msgstr ""
|
||||
"Ρυθμίζει το εφέ κρυψίματος του υποδοχέα. Επιτρεπόμενες τιμές είναι 'resize', "
|
||||
"'rescale' και 'move'"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
|
||||
msgid "Autohide duration"
|
||||
msgstr "Διάρκεια αυτόματης απόκρυψης"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
|
||||
msgid "Sets the time duration of the autohide effect."
|
||||
msgstr "Ρυθμίζει την χρονική διάρκεια του εφέ αυτόματης απόκρυψης."
|
||||
|
||||
#: ../extensions/example/extension.js:11
|
||||
msgid "Hello, world!"
|
||||
msgstr "Καλημέρα, Κόσμε!"
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:10
|
||||
msgid "Monitor"
|
||||
msgstr "Οθόνη"
|
||||
|
||||
#: ../extensions/gajim/extension.js:227
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:11
|
||||
msgid ""
|
||||
"Sets monitor to display dock in. The default value (-1) is the primary "
|
||||
"monitor."
|
||||
msgstr ""
|
||||
"Ορίζει την οθόνη για την εμφάνιση του ταμπλό. Η προεπιλεγμένη τιμή (-1) "
|
||||
"είναι η κύρια οθόνη."
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:72
|
||||
#, c-format
|
||||
msgid "Ejecting drive '%s' failed:"
|
||||
msgstr "Απέτυχε η εξαγωγή του δίσκου '%s':"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:89
|
||||
msgid "Removable devices"
|
||||
msgstr "Αφαιρούμενες συσκευές"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:106
|
||||
#| msgid "Open file manager"
|
||||
msgid "Open File"
|
||||
msgstr "Άνοιγμα αρχείου"
|
||||
|
||||
#: ../extensions/example/extension.js:17
|
||||
msgid "Hello, world!"
|
||||
msgstr "Γεια σου, κόσμε!"
|
||||
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
|
||||
msgid "Alternative greeting text."
|
||||
msgstr "Εναλλακτικό κείμενο χαιρετισμού"
|
||||
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"If not empty, it contains the text that will be shown when clicking on the "
|
||||
"panel."
|
||||
msgstr ""
|
||||
"Αν δεν είναι κενό, περιέχει το κείμενο που θα εμφανιστεί όταν θα κάνετε κλικ "
|
||||
"στον πίνακα εφαρμογών."
|
||||
|
||||
#. TRANSLATORS: Example is the name of the extension, should not be
|
||||
#. translated
|
||||
#: ../extensions/example/prefs.js:30
|
||||
msgid ""
|
||||
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||
"as such it has little functionality on its own.\n"
|
||||
"Nevertheless it's possible to customize the greeting message."
|
||||
msgstr ""
|
||||
"Το παράδειγμα στοχεύει να δείξει πώς να δημιουργήσουμε επεκτάσεις για το "
|
||||
"κέλυφος που συμπεριφέρονται σωστά και ως αυτού έχει μικρή λειτουργικότητα "
|
||||
"από μόνο του.\n"
|
||||
"Παρ' όλα αυτά είναι δυνατό να προσαρμόσετε το μήνυμα χαιρετισμού."
|
||||
|
||||
#: ../extensions/example/prefs.js:36
|
||||
msgid "Message:"
|
||||
msgstr "Μήνυμα:"
|
||||
|
||||
#: ../extensions/gajim/extension.js:226
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s είναι εκτός."
|
||||
|
||||
#: ../extensions/gajim/extension.js:230
|
||||
#: ../extensions/gajim/extension.js:229
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s είναι εκτός σύνδεσης."
|
||||
|
||||
#: ../extensions/gajim/extension.js:233
|
||||
#: ../extensions/gajim/extension.js:232
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s είναι σε σύνδεση."
|
||||
|
||||
#: ../extensions/gajim/extension.js:236
|
||||
#: ../extensions/gajim/extension.js:235
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s είναι απασχολημένος/η."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Αν αυτό αληθεύει, τοποθετήστε τους τίτλους παράθυρου στην κορυφή της "
|
||||
"αντίστοιχης μικρογραφίας, παρακάμπτοντας το προεπιλεγμένο του κελύφους πού "
|
||||
"το τοποθετεί στο κάτω μέρος. Η αλλαγή αυτής της ρύθμισης απαιτεί "
|
||||
"επανεκκίνηση του κέλυφους για να έχει κάποιο αποτέλεσμα."
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Χρησιμοποιήστε περισσότερη οθόνη για τα παράθυρα"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Τοποθετήστε τίτλους παράθυρου στην κορυφή"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
|
||||
"default grid based algorithm, 'natural' to use another one that reflects "
|
||||
"more the position and size of the actual window"
|
||||
msgstr ""
|
||||
"Ο αλγόριθμος που χρησιμοποιείται για την διάταξη μικρογραφιών στην "
|
||||
"επισκόπηση. grid («πλέγμα») να χρησιμοποιήσει τον αλγόριθμο που βασίζετε στο "
|
||||
"προεπιλεγμένο πλέγμα, natural («φυσικό») να χρησιμοποιήσει ένα άλλο που αντανακλά "
|
||||
"περισσότερο τη θέση και το μέγεθος της πραγματικού παράθυρου"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
@@ -284,40 +275,262 @@ msgstr ""
|
||||
"εδραιώνοντας τους περαιτέρω για να μειώσετε το πλαίσιο οριοθέτησης. Αυτή η "
|
||||
"ρύθμιση ισχύει μόνο με την στρατηγική φυσικής τοποθέτησης."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Χρησιμοποιήστε περισσότερη οθόνη για τα παράθυρα"
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Τοποθετήστε τίτλους παράθυρου στην κορυφή"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
|
||||
msgid "Window placement strategy"
|
||||
msgstr "Στρατηγική τοποθέτησης παραθύρου"
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Αν αυτό αληθεύει, τοποθετήστε τους τίτλους παράθυρου στην κορυφή της "
|
||||
"αντίστοιχης μικρογραφίας, παρακάμπτοντας το προεπιλεγμένο του κελύφους πού "
|
||||
"το τοποθετεί στο κάτω μέρος. Η αλλαγή αυτής της ρύθμισης απαιτεί "
|
||||
"επανεκκίνηση του κέλυφους για να έχει κάποιο αποτέλεσμα."
|
||||
|
||||
#: ../extensions/places-menu/extension.js:46
|
||||
msgid "Places"
|
||||
msgstr "Τοποθεσίες"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:47
|
||||
msgid "Devices"
|
||||
msgstr "Συσκευές"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:48
|
||||
msgid "Bookmarks"
|
||||
msgstr "Σελιδοδείκτες"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:49
|
||||
msgid "Network"
|
||||
msgstr "Δίκτυο"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:48
|
||||
#, c-format
|
||||
msgid "Failed to launch \"%s\""
|
||||
msgstr "Αποτυχία εκκίνησης \"%s\""
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:121
|
||||
msgid "Home"
|
||||
msgstr "Προσωπικός φάκελος"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:184
|
||||
msgid "File System"
|
||||
msgstr "Σύστημα αρχείων"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:188
|
||||
msgid "Browse network"
|
||||
msgstr "Περιήγηση δικτύου"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:213
|
||||
msgid "CPU"
|
||||
msgstr "CPU"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:266
|
||||
msgid "Memory"
|
||||
msgstr "Μνήμη"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
|
||||
msgid "Theme name"
|
||||
msgstr "Όνομα θέματος"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr ""
|
||||
"Το όνομα του θέματος, για να φορτωθεί από το αρχείο ~ / .themes / name / "
|
||||
"gnome-shell"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "Theme name"
|
||||
msgstr "Όνομα θέματος"
|
||||
#: ../extensions/workspace-indicator/extension.js:30
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Δείκτης χώρου εργασίας"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:26
|
||||
#: ../extensions/workspace-indicator/prefs.js:141
|
||||
msgid "Workspace names:"
|
||||
msgstr "Ονόματα χώρων εργασίας:"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:152
|
||||
msgid "Name"
|
||||
msgstr "Όνομα"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:186
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Χώρος εργασίας %d"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:30
|
||||
msgid "Normal"
|
||||
msgstr "Κανονικό"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:27
|
||||
#: ../extensions/xrandr-indicator/extension.js:31
|
||||
msgid "Left"
|
||||
msgstr "Αριστερά"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:28
|
||||
#: ../extensions/xrandr-indicator/extension.js:32
|
||||
msgid "Right"
|
||||
msgstr "Δεξιά"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:29
|
||||
#: ../extensions/xrandr-indicator/extension.js:33
|
||||
msgid "Upside-down"
|
||||
msgstr "Αναποδογυρισμένο"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:78
|
||||
msgid "Configure display settings..."
|
||||
msgstr "Διαμορφώστε τις ρυθμίσεις της οθόνης…"
|
||||
#: ../extensions/xrandr-indicator/extension.js:50
|
||||
msgid "Display"
|
||||
msgstr "Οθόνη"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:80
|
||||
msgid "Display Settings"
|
||||
msgstr "Ρυθμίσεις οθόνης"
|
||||
|
||||
#~ msgid "The alt tab behaviour."
|
||||
#~ msgstr "Η συμπεριφορά alt tab."
|
||||
|
||||
#~| msgid ""
|
||||
#~| "Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails "
|
||||
#~| "and workspace_icons."
|
||||
#~ msgid ""
|
||||
#~ "Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and "
|
||||
#~ "workspace_icons. See the configuration dialogs for details."
|
||||
#~ msgstr ""
|
||||
#~ "Ρυθμίζει την συμπεριφορά του Alt Tab. Πιθανές τιμές είναι οι εξής: "
|
||||
#~ "όλες_μικρογραφίες (all_thumbnails) και εικονίδια_χώρου εργασίας "
|
||||
#~ "(workspace_icons). Δείτε τις ρυθμίσεις διαλόγου για λεπτομέρειες."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This mode presents all applications from all workspaces in one selection "
|
||||
#~ "list. Instead of using the application icon of every window, it uses "
|
||||
#~ "small thumbnails resembling the window itself."
|
||||
#~ msgstr ""
|
||||
#~ "Αυτή η κατάσταση εμφανίζει όλες τις εφαρμογές απ' όλους τους χώρους "
|
||||
#~ "εργασίας σε μια λίστα επιλογής. Αντί να χρησιμοποιήσει το εικονίδιο της "
|
||||
#~ "εφαρμογής για κάθε παράθυρο, χρησιμοποιεί μικρογραφίες που μοιάζουν με το "
|
||||
#~ "ίδιο το παράθυρο."
|
||||
|
||||
#~ msgid "Workspace & Icons"
|
||||
#~ msgstr "Χώρος εργασίας & εικονίδια"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This mode let's you switch between the applications of your current "
|
||||
#~ "workspace and gives you additionally the option to switch to the last "
|
||||
#~ "used application of your previous workspace. This is always the last "
|
||||
#~ "symbol in the list and is segregated by a separator/vertical line if "
|
||||
#~ "available. \n"
|
||||
#~ "Every window is represented by its application icon."
|
||||
#~ msgstr ""
|
||||
#~ "Αυτή η κατάσταση σας επιτρέπει την εναλλαγή μεταξύ των εφαρμογών του "
|
||||
#~ "τωρινού χώρου εργασίας και σας δίνει επιπλέον την επιλογή να μεταβείτε "
|
||||
#~ "στην τελευταία χρησιμοποιημένη εφαρμογή του προηγούμενου χώρου εργασίας "
|
||||
#~ "σας. Αυτό είναι πάντα το τελευταίο σύμβολο στη λιστα και διαχωρίζεται από "
|
||||
#~ "μια κάθετη γραμμή αν είναι διαθέσιμη. \n"
|
||||
#~ "Κάθε παράθυρο αντιπροσωπεύεται από το εικονίδιο της εφαρμογής του."
|
||||
|
||||
#~ msgid "Move current selection to front before closing the popup"
|
||||
#~ msgstr ""
|
||||
#~ "Μετακινήστε τη τωρινή επιλογή προς τα εμπρός πριν το κλείσιμο του "
|
||||
#~ "αναδυόμενου"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
#~ "The Alternate Tab can be used in different modes, that affect the way "
|
||||
#~ "windows are chosen and presented."
|
||||
#~ msgstr ""
|
||||
#~ "Το Alternate Tab μπορεί να χρησιμοποιηθεί σε διαφορετικές καταστάσεις, οι "
|
||||
#~ "οποίες επηρεάζουν τον τρόπο που τα παράθυρα επιλέγονται και "
|
||||
#~ "παρουσιάζονται."
|
||||
|
||||
#~ msgid "Configure display settings..."
|
||||
#~ msgstr "Διαμορφώστε τις ρυθμίσεις της οθόνης…"
|
||||
|
||||
#~ msgid "Notifications"
|
||||
#~ msgstr "Ειδοποιήσεις"
|
||||
|
||||
#~ msgid "Online Accounts"
|
||||
#~ msgstr "Λογαριασμοί διαδικτύου"
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "Κλείδωμα οθόνης"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "Αλλαγή χρήστη"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "Αποσύνδεση…"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This is the first time you use the Alternate Tab extension. \n"
|
||||
#~ "Please choose your preferred behaviour:\n"
|
||||
#~ "\n"
|
||||
#~ "All & Thumbnails:\n"
|
||||
#~ " This mode presents all applications from all workspaces in one "
|
||||
#~ "selection \n"
|
||||
#~ " list. Instead of using the application icon of every window, it uses "
|
||||
#~ "small \n"
|
||||
#~ " thumbnails resembling the window itself. \n"
|
||||
#~ "\n"
|
||||
#~ "Workspace & Icons:\n"
|
||||
#~ " This mode let's you switch between the applications of your current \n"
|
||||
#~ " workspace and gives you additionally the option to switch to the last "
|
||||
#~ "used \n"
|
||||
#~ " application of your previous workspace. This is always the last "
|
||||
#~ "symbol in \n"
|
||||
#~ " the list and is segregated by a separator/vertical line if "
|
||||
#~ "available. \n"
|
||||
#~ " Every window is represented by its application icon. \n"
|
||||
#~ "\n"
|
||||
#~ "Native:\n"
|
||||
#~ " This mode is the native GNOME 3 behaviour or in other words: "
|
||||
#~ "Clicking \n"
|
||||
#~ " native switches the Alternate Tab extension off. \n"
|
||||
#~ msgstr ""
|
||||
#~ "Αυτή είναι η πρώτη φορά που χρησιμοποιήσατε την εναλλακτική επέκταση "
|
||||
#~ "στηλοθέτη. \n"
|
||||
#~ "Παρακαλούμε επιλέξτε την συμπεριφορά που επιθυμείτε εσείς:\n"
|
||||
#~ "\n"
|
||||
#~ "Όλα & μικρογραφίες:\n"
|
||||
#~ " Αυτή η κατάσταση εμφανίζει όλες τις εφαρμογές από όλους τους χώρους "
|
||||
#~ "εργασίας σε μια επιλογή \n"
|
||||
#~ " λίστα. Αντί να χρησιμοποιεί το εικονίδιο της εφαρμογής από κάθε "
|
||||
#~ "παράθυρο, χρησιμοποιεί μικρές \n"
|
||||
#~ " μικρογραφίες που μοιάζουν με το ίδιο το παράθυρο. \n"
|
||||
#~ "\n"
|
||||
#~ "Χώρος εργασίας & εικονίδια:\n"
|
||||
#~ " Αυτή η λειτουργία σας επιτρέπει να κάνετε εναλλαγή μεταξύ των "
|
||||
#~ "εφαρμογών του τρέχοντος \n"
|
||||
#~ " χώρου εργασίας σας και σας δίνει επιπλέον τη δυνατότητα να μεταβείτε "
|
||||
#~ "στην τελευταία χρησιμοποιημένη \n"
|
||||
#~ " εφαρμογή του προηγούμενου χώρου εργασίας σας. Αυτό είναι πάντα το "
|
||||
#~ "τελευταίο σύμβολο στη \n"
|
||||
#~ " λίστα και είναι απομονωμένο από ένα διαχωριστικό/κάθετη γραμμή, εάν "
|
||||
#~ "υπάρχει. \n"
|
||||
#~ " Κάθε παράθυρο αντιπροσωπεύεται από εικονίδιο της εφαρμογής της. \n"
|
||||
#~ "\n"
|
||||
#~ "Μητρική:\n"
|
||||
#~ " Αυτή η λειτουργία είναι η μητρική συμπεριφορά του GNOME 3 ή με άλλα "
|
||||
#~ "λόγια: Αν κάνετε κλικ \n"
|
||||
#~ " στο μητρική θέτει εκτός λειτουργίας την εναλλακτική επέκταση "
|
||||
#~ "στηλοθέτη. \n"
|
||||
|
||||
#~ msgid "Alt Tab Behaviour"
|
||||
#~ msgstr "Συμπεριφορά Alt Tab"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Ακύρωση"
|
||||
|
||||
#~ msgid "Ask the user for a default behaviour if true."
|
||||
#~ msgstr "Ρωτήστε τον χρήστη για μια προεπιλεγμένη συμπεριφορα εαν αληθεύει."
|
||||
|
||||
#~ msgid "Indicates if Alternate Tab is newly installed"
|
||||
#~ msgstr "Υποδεικνύει αν ο εναλλακτικός στηλοθέτης είναι νεοεισαχθείς"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The algorithm used to layout thumbnails in the overview. 'grid' to use "
|
||||
#~ "the default grid based algorithm, 'natural' to use another one that "
|
||||
#~ "reflects more the position and size of the actual window"
|
||||
#~ msgstr ""
|
||||
#~ "Ο αλγόριθμος που χρησιμοποιείται για την διάταξη μικρογραφιών στην "
|
||||
#~ "επισκόπηση. grid («πλέγμα») να χρησιμοποιήσει τον αλγόριθμο που βασίζετε "
|
||||
#~ "στο προεπιλεγμένο πλέγμα, natural («φυσικό») να χρησιμοποιήσει ένα άλλο "
|
||||
#~ "που αντανακλά περισσότερο τη θέση και το μέγεθος της πραγματικού παράθυρου"
|
||||
|
||||
#~ msgid "Window placement strategy"
|
||||
#~ msgstr "Στρατηγική τοποθέτησης παραθύρου"
|
||||
|
||||
575
po/en_GB.po
575
po/en_GB.po
@@ -2,308 +2,475 @@
|
||||
# Copyright (C) 2011 gnome-shell-extensions'S COPYRIGHT HOLDER.
|
||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||
# Bruce Cowan <bruce@bcowan.me.uk>, 2011.
|
||||
# Chris Leonard <cjlhomeaddress@gmail.com>, 2012.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-09-08 16:00+0100\n"
|
||||
"PO-Revision-Date: 2011-09-08 16:04+0100\n"
|
||||
"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
|
||||
"Language-Team: British English <en@li.org>\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=extensions\n"
|
||||
"POT-Creation-Date: 2012-09-20 13:47+0000\n"
|
||||
"PO-Revision-Date: 2012-09-21 21:00-0400\n"
|
||||
"Last-Translator: Chris Leonard <cjlhomeaddress@gmail.com>\n"
|
||||
"Language-Team: Sugar Labs\n"
|
||||
"Language: en_GB\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: Virtaal 0.7.1-beta1\n"
|
||||
"X-Generator: Virtaal 0.7.1\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:44
|
||||
msgid "Do Not Disturb"
|
||||
msgstr "Do Not Disturb"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "The application icon mode."
|
||||
msgstr "The application icon mode."
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:52
|
||||
msgid "Online Accounts"
|
||||
msgstr "Online Accounts"
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
msgstr ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:56
|
||||
msgid "System Settings"
|
||||
msgstr "System Settings"
|
||||
#: ../extensions/alternate-tab/prefs.js:26
|
||||
msgid "Thumbnail only"
|
||||
msgstr "Thumbnail only"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:63
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lock Screen"
|
||||
#: ../extensions/alternate-tab/prefs.js:27
|
||||
msgid "Application icon only"
|
||||
msgstr "Application icon only"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:28
|
||||
msgid "Thumbnail and application icon"
|
||||
msgstr "Thumbnail and application icon"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:43
|
||||
msgid "Present windows as"
|
||||
msgstr "Present windows as"
|
||||
|
||||
#: ../extensions/alternate-tab/prefs.js:68
|
||||
msgid "Show only windows in the current workspace"
|
||||
msgstr "Show only windows in the current workspace"
|
||||
|
||||
#. add the new entries
|
||||
#: ../extensions/alternative-status-menu/extension.js:68
|
||||
msgid "Switch User"
|
||||
msgstr "Switch User"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:73
|
||||
msgid "Log Out..."
|
||||
msgstr "Log Out…"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:81
|
||||
msgid "Suspend"
|
||||
msgstr "Suspend"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:87
|
||||
#: ../extensions/alternative-status-menu/extension.js:73
|
||||
msgid "Hibernate"
|
||||
msgstr "Hibernate"
|
||||
|
||||
#: ../extensions/alternative-status-menu/extension.js:93
|
||||
msgid "Power Off..."
|
||||
msgstr "Power Off…"
|
||||
#: ../extensions/alternative-status-menu/extension.js:78
|
||||
msgid "Power Off"
|
||||
msgstr "Power Off"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:44
|
||||
msgid ""
|
||||
"This is the first time you use the Alternate Tab extension. \n"
|
||||
"Please choose your preferred behaviour:\n"
|
||||
"\n"
|
||||
"All & Thumbnails:\n"
|
||||
" This mode presents all applications from all workspaces in one "
|
||||
"selection \n"
|
||||
" list. Instead of using the application icon of every window, it uses "
|
||||
"small \n"
|
||||
" thumbnails resembling the window itself. \n"
|
||||
"\n"
|
||||
"Workspace & Icons:\n"
|
||||
" This mode let's you switch between the applications of your current \n"
|
||||
" workspace and gives you additionally the option to switch to the last "
|
||||
"used \n"
|
||||
" application of your previous workspace. This is always the last symbol "
|
||||
"in \n"
|
||||
" the list and is segregated by a separator/vertical line if available. \n"
|
||||
" Every window is represented by its application icon. \n"
|
||||
"\n"
|
||||
"Native:\n"
|
||||
" This mode is the native GNOME 3 behaviour or in other words: Clicking \n"
|
||||
" native switches the Alternate Tab extension off. \n"
|
||||
msgstr ""
|
||||
"This is the first time you use the Alternate Tab extension. \n"
|
||||
"Please choose your preferred behaviour:\n"
|
||||
"\n"
|
||||
"All & Thumbnails:\n"
|
||||
" This mode presents all applications from all workspaces in one selection "
|
||||
" list. Instead of using the application icon of every window, it uses "
|
||||
"small \n"
|
||||
" thumbnails resembling the window itself. \n"
|
||||
"\n"
|
||||
"Workspace & Icons:\n"
|
||||
" This mode lets you switch between the applications of your current \n"
|
||||
" workspace and additionally gives you the option to switch to the last "
|
||||
"used \n"
|
||||
" application of your previous workspace. This is always the last symbol "
|
||||
"in \n"
|
||||
" the list and is segregated by a separator/vertical line if available. \n"
|
||||
" Every window is represented by its application icon. \n"
|
||||
"\n"
|
||||
"Native:\n"
|
||||
" This mode is the native GNOME 3 behaviour or in other words: Clicking \n"
|
||||
" native switches the Alternate Tab extension off. \n"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
|
||||
msgid "Enable suspending"
|
||||
msgstr "Enable suspending"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:269
|
||||
msgid "Alt Tab Behaviour"
|
||||
msgstr "Alt Tab Behaviour"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
|
||||
msgid "Control the visibility of the Suspend menu item"
|
||||
msgstr "Control the visibility of the Suspend menu item"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:285
|
||||
msgid "All & Thumbnails"
|
||||
msgstr "All & Thumbnails"
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
|
||||
msgid "Enable hibernating"
|
||||
msgstr "Enable hibernating"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:292
|
||||
msgid "Workspace & Icons"
|
||||
msgstr "Workspace & Icons"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:299
|
||||
msgid "Native"
|
||||
msgstr "Native"
|
||||
|
||||
#: ../extensions/alternate-tab/extension.js:306
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
|
||||
msgid "Ask the user for a default behaviour if true."
|
||||
msgstr "Ask the user for a default behaviour if true."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
|
||||
msgid "Indicates if Alternate Tab is newly installed"
|
||||
msgstr "Indicates if Alternate Tab is newly installed"
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
|
||||
"workspace_icons."
|
||||
msgstr ""
|
||||
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
|
||||
"workspace_icons."
|
||||
|
||||
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
|
||||
msgid "The alt tab behaviour."
|
||||
msgstr "The alt tab behaviour."
|
||||
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
|
||||
msgid "Control the visibility of the Hibernate menu item"
|
||||
msgstr "Control the visibility of the Hibernate menu item"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
msgstr ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Application and workspace list"
|
||||
|
||||
#: ../extensions/dock/extension.js:486
|
||||
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
msgstr ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:55
|
||||
msgid "Application"
|
||||
msgstr "Application"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:64
|
||||
#: ../extensions/auto-move-windows/prefs.js:106
|
||||
msgid "Workspace"
|
||||
msgstr "Workspace"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:80
|
||||
msgid "Add rule"
|
||||
msgstr "Add rule"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:94
|
||||
msgid "Create new matching rule"
|
||||
msgstr "Create new matching rule"
|
||||
|
||||
#: ../extensions/auto-move-windows/prefs.js:98
|
||||
msgid "Add"
|
||||
msgstr "Add"
|
||||
|
||||
#: ../extensions/dock/extension.js:600
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Drag here to add favourites"
|
||||
|
||||
#: ../extensions/dock/extension.js:820
|
||||
#: ../extensions/dock/extension.js:926
|
||||
msgid "New Window"
|
||||
msgstr "New Window"
|
||||
|
||||
#: ../extensions/dock/extension.js:822
|
||||
#: ../extensions/dock/extension.js:928
|
||||
msgid "Quit Application"
|
||||
msgstr "Quit Application"
|
||||
|
||||
#: ../extensions/dock/extension.js:827
|
||||
#: ../extensions/dock/extension.js:933
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Remove from Favourites"
|
||||
|
||||
#: ../extensions/dock/extension.js:828
|
||||
#: ../extensions/dock/extension.js:934
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Add to Favourites"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
|
||||
msgid "Autohide duration"
|
||||
msgstr "Autohide duration"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid "Autohide effect"
|
||||
msgstr "Autohide effect"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr "Enable/disable autohide"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Icon size"
|
||||
msgstr "Icon size"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Position of the dock"
|
||||
msgstr "Position of the dock"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
msgstr ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
|
||||
msgid "Icon size"
|
||||
msgstr "Icon size"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
|
||||
msgid "Sets icon size of the dock."
|
||||
msgstr "Sets icon size of the dock."
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
|
||||
msgid "Enable/disable autohide"
|
||||
msgstr "Enable/disable autohide"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
|
||||
msgid "Autohide effect"
|
||||
msgstr "Autohide effect"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
|
||||
msgid ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
|
||||
"'move'"
|
||||
msgstr ""
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
|
||||
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
|
||||
"'move'"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
msgstr ""
|
||||
"Sets the position of the dock in the screen. Allowed values are 'right' or "
|
||||
"'left'"
|
||||
msgid "Autohide duration"
|
||||
msgstr "Autohide duration"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
|
||||
msgid "Sets the time duration of the autohide effect."
|
||||
msgstr "Sets the time duration of the autohide effect."
|
||||
|
||||
#: ../extensions/example/extension.js:11
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:10
|
||||
msgid "Monitor"
|
||||
msgstr "Monitor"
|
||||
|
||||
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:11
|
||||
msgid ""
|
||||
"Sets monitor to display dock in. The default value (-1) is the primary "
|
||||
"monitor."
|
||||
msgstr ""
|
||||
"Sets monitor to display dock in. The default value (-1) is the primary "
|
||||
"monitor."
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:56
|
||||
msgid "Removable devices"
|
||||
msgstr "Removable devices"
|
||||
|
||||
#: ../extensions/drive-menu/extension.js:67
|
||||
msgid "Open file manager"
|
||||
msgstr "Open file manager"
|
||||
|
||||
#: ../extensions/example/extension.js:17
|
||||
msgid "Hello, world!"
|
||||
msgstr "Hello, world!"
|
||||
|
||||
#: ../extensions/gajim/extension.js:227
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
|
||||
msgid "Alternative greeting text."
|
||||
msgstr "Alternative greeting text."
|
||||
|
||||
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"If not empty, it contains the text that will be shown when clicking on the "
|
||||
"panel."
|
||||
msgstr ""
|
||||
"If not empty, it contains the text that will be shown when clicking on the "
|
||||
"panel."
|
||||
|
||||
#. TRANSLATORS: Example is the name of the extension, should not be
|
||||
#. translated
|
||||
#: ../extensions/example/prefs.js:30
|
||||
msgid ""
|
||||
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||
"as such it has little functionality on its own.\n"
|
||||
"Nevertheless it's possible to customize the greeting message."
|
||||
msgstr ""
|
||||
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||
"as such it has little functionality on its own.\n"
|
||||
"Nevertheless it's possible to customize the greeting message."
|
||||
|
||||
#: ../extensions/example/prefs.js:36
|
||||
msgid "Message:"
|
||||
msgstr "Message:"
|
||||
|
||||
#: ../extensions/gajim/extension.js:226
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s is away."
|
||||
|
||||
#: ../extensions/gajim/extension.js:230
|
||||
#: ../extensions/gajim/extension.js:229
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s is offline."
|
||||
|
||||
#: ../extensions/gajim/extension.js:233
|
||||
#: ../extensions/gajim/extension.js:232
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s is online."
|
||||
|
||||
#: ../extensions/gajim/extension.js:236
|
||||
#: ../extensions/gajim/extension.js:235
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s is busy."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Place window captions on top"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
|
||||
"default grid based algorithm, 'natural' to use another one that reflects "
|
||||
"more the position and size of the actual window"
|
||||
msgstr ""
|
||||
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
|
||||
"default grid based algorithm, 'natural' to use another one that reflects "
|
||||
"more the position and size of the actual window"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Use more screen for windows"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
|
||||
msgid "Window placement strategy"
|
||||
msgstr "Window placement strategy"
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Place window captions on top"
|
||||
|
||||
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
|
||||
#: ../extensions/places-menu/extension.js:46
|
||||
msgid "Places"
|
||||
msgstr "Places"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:47
|
||||
msgid "Devices"
|
||||
msgstr "Devices"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:48
|
||||
msgid "Bookmarks"
|
||||
msgstr "Bookmarks"
|
||||
|
||||
#: ../extensions/places-menu/extension.js:49
|
||||
msgid "Network"
|
||||
msgstr "Network"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:48
|
||||
#, c-format
|
||||
msgid "Failed to launch \"%s\""
|
||||
msgstr "Failed to launch \"%s\""
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:121
|
||||
msgid "Home"
|
||||
msgstr "Home"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:184
|
||||
msgid "File System"
|
||||
msgstr "File System"
|
||||
|
||||
#: ../extensions/places-menu/placeDisplay.js:188
|
||||
msgid "Browse network"
|
||||
msgstr "Browse network"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:213
|
||||
msgid "CPU"
|
||||
msgstr "CPU"
|
||||
|
||||
#: ../extensions/systemMonitor/extension.js:266
|
||||
msgid "Memory"
|
||||
msgstr "Memory"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "Theme name"
|
||||
msgstr "Theme name"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:26
|
||||
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
|
||||
#: ../extensions/workspace-indicator/extension.js:30
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Workspace Indicator"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:141
|
||||
msgid "Workspace names:"
|
||||
msgstr "Workspace names:"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:152
|
||||
msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
#: ../extensions/workspace-indicator/prefs.js:186
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Workspace %d"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:30
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:27
|
||||
#: ../extensions/xrandr-indicator/extension.js:31
|
||||
msgid "Left"
|
||||
msgstr "Left"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:28
|
||||
#: ../extensions/xrandr-indicator/extension.js:32
|
||||
msgid "Right"
|
||||
msgstr "Right"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:29
|
||||
#: ../extensions/xrandr-indicator/extension.js:33
|
||||
msgid "Upside-down"
|
||||
msgstr "Upside-down"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:78
|
||||
msgid "Configure display settings..."
|
||||
msgstr "Configure display settings…"
|
||||
#: ../extensions/xrandr-indicator/extension.js:50
|
||||
msgid "Display"
|
||||
msgstr "Display"
|
||||
|
||||
#: ../extensions/xrandr-indicator/extension.js:80
|
||||
msgid "Display Settings"
|
||||
msgstr "Display Settings"
|
||||
|
||||
#~ msgid "Do Not Disturb"
|
||||
#~ msgstr "Do Not Disturb"
|
||||
|
||||
#~ msgid "Online Accounts"
|
||||
#~ msgstr "Online Accounts"
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "Lock Screen"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "Switch User"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "Log Out…"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This is the first time you use the Alternate Tab extension. \n"
|
||||
#~ "Please choose your preferred behaviour:\n"
|
||||
#~ "\n"
|
||||
#~ "All & Thumbnails:\n"
|
||||
#~ " This mode presents all applications from all workspaces in one "
|
||||
#~ "selection \n"
|
||||
#~ " list. Instead of using the application icon of every window, it uses "
|
||||
#~ "small \n"
|
||||
#~ " thumbnails resembling the window itself. \n"
|
||||
#~ "\n"
|
||||
#~ "Workspace & Icons:\n"
|
||||
#~ " This mode let's you switch between the applications of your current \n"
|
||||
#~ " workspace and gives you additionally the option to switch to the last "
|
||||
#~ "used \n"
|
||||
#~ " application of your previous workspace. This is always the last "
|
||||
#~ "symbol in \n"
|
||||
#~ " the list and is segregated by a separator/vertical line if "
|
||||
#~ "available. \n"
|
||||
#~ " Every window is represented by its application icon. \n"
|
||||
#~ "\n"
|
||||
#~ "Native:\n"
|
||||
#~ " This mode is the native GNOME 3 behaviour or in other words: "
|
||||
#~ "Clicking \n"
|
||||
#~ " native switches the Alternate Tab extension off. \n"
|
||||
#~ msgstr ""
|
||||
#~ "This is the first time you use the Alternate Tab extension. \n"
|
||||
#~ "Please choose your preferred behaviour:\n"
|
||||
#~ "\n"
|
||||
#~ "All & Thumbnails:\n"
|
||||
#~ " This mode presents all applications from all workspaces in one "
|
||||
#~ "selection list. Instead of using the application icon of every "
|
||||
#~ "window, it uses small \n"
|
||||
#~ " thumbnails resembling the window itself. \n"
|
||||
#~ "\n"
|
||||
#~ "Workspace & Icons:\n"
|
||||
#~ " This mode lets you switch between the applications of your current \n"
|
||||
#~ " workspace and additionally gives you the option to switch to the last "
|
||||
#~ "used \n"
|
||||
#~ " application of your previous workspace. This is always the last "
|
||||
#~ "symbol in \n"
|
||||
#~ " the list and is segregated by a separator/vertical line if "
|
||||
#~ "available. \n"
|
||||
#~ " Every window is represented by its application icon. \n"
|
||||
#~ "\n"
|
||||
#~ "Native:\n"
|
||||
#~ " This mode is the native GNOME 3 behaviour or in other words: "
|
||||
#~ "Clicking \n"
|
||||
#~ " native switches the Alternate Tab extension off. \n"
|
||||
|
||||
#~ msgid "Alt Tab Behaviour"
|
||||
#~ msgstr "Alt Tab Behaviour"
|
||||
|
||||
#~ msgid "Native"
|
||||
#~ msgstr "Native"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancel"
|
||||
|
||||
#~ msgid "Ask the user for a default behaviour if true."
|
||||
#~ msgstr "Ask the user for a default behaviour if true."
|
||||
|
||||
#~ msgid "Indicates if Alternate Tab is newly installed"
|
||||
#~ msgstr "Indicates if Alternate Tab is newly installed"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails "
|
||||
#~ "and workspace_icons."
|
||||
#~ msgstr ""
|
||||
#~ "Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails "
|
||||
#~ "and workspace_icons."
|
||||
|
||||
#~ msgid "The alt tab behaviour."
|
||||
#~ msgstr "The alt tab behaviour."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The algorithm used to layout thumbnails in the overview. 'grid' to use "
|
||||
#~ "the default grid based algorithm, 'natural' to use another one that "
|
||||
#~ "reflects more the position and size of the actual window"
|
||||
#~ msgstr ""
|
||||
#~ "The algorithm used to layout thumbnails in the overview. 'grid' to use "
|
||||
#~ "the default grid based algorithm, 'natural' to use another one that "
|
||||
#~ "reflects more the position and size of the actual window"
|
||||
|
||||
#~ msgid "Window placement strategy"
|
||||
#~ msgstr "Window placement strategy"
|
||||
|
||||
#~ msgid "Configure display settings..."
|
||||
#~ msgstr "Configure display settings…"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user