Compare commits
555 Commits
message-tr
...
2.31.2
Author | SHA1 | Date | |
---|---|---|---|
ea3b2a5707 | |||
25eaf2a294 | |||
7bf748c579 | |||
04f33e8dc7 | |||
01c493565f | |||
f1e3104128 | |||
2ace472100 | |||
fff04d51b7 | |||
a1bfaac5a2 | |||
d80c1af1a3 | |||
cbde065a01 | |||
0b1c7320ab | |||
ce3f003e46 | |||
9fca747ef4 | |||
9455554453 | |||
4859eb63c4 | |||
e7220591ba | |||
20d579e7d8 | |||
52a68eb24a | |||
bc57574094 | |||
e4e92a2b38 | |||
023a274e41 | |||
5d0536d732 | |||
08b8b39a5d | |||
c972ff3ab4 | |||
98c2247c1b | |||
a97b8c1947 | |||
1dd2f2c6bc | |||
a9a513c621 | |||
2ce746e7dd | |||
11cde53108 | |||
fe542f8732 | |||
91319d5da2 | |||
5bd7b0dc31 | |||
c8f4adde7f | |||
b6a47cdf76 | |||
8b242dd4bd | |||
9b3e16595b | |||
2179f5836e | |||
320adb316d | |||
db36a90c48 | |||
5cfd72ff8b | |||
1d721c9080 | |||
5de1a15d98 | |||
b02089c435 | |||
ccdc6264da | |||
b736f52037 | |||
1af392b5f0 | |||
84716bccd4 | |||
f438ccfc53 | |||
fdd819e9f6 | |||
a3a09e6b2e | |||
7160e8a137 | |||
016ad69550 | |||
42e9b21b24 | |||
b6e3bf198d | |||
5e3eb5e8c3 | |||
ed1dc4649b | |||
5b586fdf3e | |||
703b21cef0 | |||
c7ec84eb33 | |||
4ce2620b68 | |||
ec6bc8f216 | |||
47a92e7fc0 | |||
e835cd2c2d | |||
6098dca0f8 | |||
21ff050a40 | |||
508001bfde | |||
410dfb2da3 | |||
74ccdbf3a9 | |||
80fc55b8ea | |||
dc424280a1 | |||
7b7c34a399 | |||
865976cfe7 | |||
81a497b476 | |||
dc1a6c746d | |||
27bcce0888 | |||
fdcb73d93e | |||
47dae0832b | |||
78e3126f97 | |||
12e45f275b | |||
7b32888322 | |||
44c2027b40 | |||
a90c81b2c7 | |||
8a25d49319 | |||
014ac2d388 | |||
1e3bf0ea7e | |||
54d11b65a1 | |||
6318c8e95b | |||
8c5bb8655d | |||
75b52d36f2 | |||
5111edb80b | |||
c4406d4ace | |||
3bd2f75866 | |||
6360d8bba6 | |||
f104a329b0 | |||
0e9c47bd56 | |||
2ca1fe3254 | |||
88211ed4bb | |||
266a0fb7d6 | |||
e6b91414de | |||
62afd2ffa3 | |||
37692513cf | |||
35bf6b0d36 | |||
0d1ac8cb5b | |||
b09b30616d | |||
daf133dca8 | |||
ae7f30483d | |||
d6fc2cc36f | |||
082a15bbc5 | |||
2bd64b6cab | |||
b1486f54c8 | |||
39a24b9a6d | |||
6e2ec7291e | |||
b0ba40f812 | |||
50c453c54d | |||
b71afe55d8 | |||
dd0882aa8b | |||
31914ab23b | |||
1816a6339d | |||
e9e2786fa3 | |||
024ab39c6d | |||
1210a78193 | |||
c55dbd5fbd | |||
263261cc86 | |||
077f0c56f1 | |||
e83656969e | |||
7d7ed7ce7a | |||
929073882f | |||
0513297029 | |||
704354be2c | |||
3715109ebe | |||
9d21b2cb25 | |||
7f56d06546 | |||
cf0664fcc6 | |||
26c8227df5 | |||
df43352441 | |||
7d705d4de3 | |||
4a0fbf03a8 | |||
54168fcd31 | |||
5012d64580 | |||
10ac42d6ad | |||
a277dfa9ce | |||
3d6c12121f | |||
98a093a279 | |||
7467e9e3a5 | |||
a7cd294403 | |||
29d89467b9 | |||
dc5dcc6139 | |||
6aaf4b87d5 | |||
4392516713 | |||
a9aa89e858 | |||
58c0abe600 | |||
d42263c1bc | |||
1d2f0e0e15 | |||
752c25bb7d | |||
df09e199b0 | |||
ab75c8cacc | |||
e94d54bffb | |||
5bce103a40 | |||
5ab852bfa3 | |||
439203349d | |||
2320c393c9 | |||
887f0f554b | |||
46c210c314 | |||
b4c3ab6726 | |||
95a6353dee | |||
cfea0649d8 | |||
045faf3f12 | |||
44ede8c942 | |||
1ddb775d59 | |||
cbcbd11ba0 | |||
bae07700a1 | |||
ca13cec01c | |||
f2af295867 | |||
0dffec661a | |||
bab5a006d8 | |||
f89b95c2aa | |||
f262473a3f | |||
b571ad0760 | |||
750672061a | |||
2ca5cfd6f5 | |||
8dd572d1cc | |||
b8647cc00e | |||
a9bdffc9e6 | |||
68723f191c | |||
5eafb29332 | |||
c92ce5983d | |||
fe52a9e1a1 | |||
1a25cd98ea | |||
611ca3c161 | |||
1dd4c7140e | |||
b9e58947cc | |||
73ab59f1d6 | |||
df8b03398f | |||
feaaefd8ba | |||
04200a4281 | |||
c6f84cfa59 | |||
103d0cba20 | |||
095e15fc11 | |||
ca2a11c57d | |||
9423d2c9ac | |||
6461db9df6 | |||
5ff609ed49 | |||
4aa2473d18 | |||
3f5bb8f98d | |||
0487630e03 | |||
d173f9e19d | |||
f53bf17331 | |||
ac54fed8d4 | |||
6deee27d14 | |||
d9f43e27a0 | |||
d1a178301f | |||
8b3d4857aa | |||
8d3abea6ef | |||
5060081db5 | |||
a8fa8a498a | |||
5635797cb9 | |||
468f30e4ab | |||
68b943d8ea | |||
994b4c0007 | |||
f9e4385e02 | |||
909b5ec43c | |||
7c37e94eda | |||
874dd14ddc | |||
d39d7b45e0 | |||
23e11175f8 | |||
aefa8af60e | |||
14a53cc43c | |||
a6be7ad6bd | |||
af05a9e268 | |||
eab96c66fd | |||
2a740448e1 | |||
94472ba9fa | |||
dfb110cd0f | |||
57dd02f6ae | |||
0b1430058a | |||
f2172c088e | |||
b93cb4b976 | |||
6744433245 | |||
01cd42bd51 | |||
bc3b208f41 | |||
049fea477b | |||
0ec4c66f96 | |||
8ad1da0db2 | |||
bd0bd22c63 | |||
e3b839360a | |||
968679f68c | |||
5d0e33e267 | |||
52f1cc6d19 | |||
1b2377370b | |||
5a6c9f176e | |||
a9fea8248c | |||
47644cad6a | |||
b7c6ec4b46 | |||
908b0fb727 | |||
e21aea6e13 | |||
6c13ca817d | |||
38009309e9 | |||
d98db2bd59 | |||
1f274c04fb | |||
ddfe9442fa | |||
8b792f8942 | |||
db96437f18 | |||
a614d72b00 | |||
ec6a6727e0 | |||
cc8a95572e | |||
d1108e1e7d | |||
744bc996db | |||
22bf4c8a93 | |||
46bce04788 | |||
9a2d883cf5 | |||
690deeb502 | |||
367eaf9161 | |||
f0e531310d | |||
cdef8bf5aa | |||
e9a9a5243c | |||
ee57dab846 | |||
9f68786547 | |||
c02b57efc3 | |||
7183aac362 | |||
011db9f34d | |||
7d8c3f1ecd | |||
087ac8470e | |||
3ce89e3c80 | |||
543a41bfea | |||
cb80dc6834 | |||
b55fd735f4 | |||
32fd323153 | |||
3aea09b614 | |||
374fd35476 | |||
20d3b1f8b1 | |||
7de5e78977 | |||
2da6507a87 | |||
5ca665bdde | |||
46f8d913a1 | |||
858a6bf827 | |||
89173544d4 | |||
163b2d0403 | |||
c83883f1f7 | |||
f6cbb14393 | |||
ffd25fe9e4 | |||
524e2ca8e2 | |||
33dca51650 | |||
58bb0044b2 | |||
79865172d3 | |||
730e8ffdf9 | |||
d128cc5af3 | |||
b5c2e1c98c | |||
2016e08f7b | |||
e752193a54 | |||
88a4256ad5 | |||
62ca7fb268 | |||
765779272f | |||
3333f30c42 | |||
732ba8576d | |||
a4481b38d2 | |||
176487834a | |||
394e01850b | |||
5f8391314a | |||
d593877548 | |||
d2bf7ec66c | |||
fe0f4060c4 | |||
40b0459174 | |||
a0b5a44fe9 | |||
5ce1e3fe92 | |||
8b3258cb09 | |||
22948b3d39 | |||
aa7de264e6 | |||
046e0609ab | |||
1a0d507316 | |||
b5853fe7e5 | |||
0f81c7efe0 | |||
0f0e3d9644 | |||
f6b4fa6e7e | |||
fbb88da134 | |||
83f11870da | |||
c635cb7016 | |||
dd23a61dbb | |||
2e00bc4aed | |||
6423cbfc92 | |||
ed3e287d91 | |||
347196d35c | |||
2ab3d069fb | |||
21641d8925 | |||
499c5737da | |||
40a8e9c1a6 | |||
2e98aab2e7 | |||
760b6ad9ed | |||
14434601a3 | |||
ae3d1423e5 | |||
d56fbf6d6a | |||
b7c60b02d1 | |||
d7075d9913 | |||
72cb4bf346 | |||
bffadf1b6e | |||
8552721983 | |||
ec36a0070e | |||
216dafd5b1 | |||
a4feb91644 | |||
778fd72e22 | |||
ff01bf68fd | |||
edbfafc5bd | |||
c20a7d4b01 | |||
c4e0e4197d | |||
71f63962a8 | |||
ef4c9b6f1f | |||
4d43424efd | |||
1f1f4432f6 | |||
98e60eb7e9 | |||
16bdff4f48 | |||
565cdf502c | |||
2dc8d9b462 | |||
ce6dd21cd3 | |||
e7066d12cf | |||
09df6a3818 | |||
17d1e06c7c | |||
e6b80927ad | |||
f9c5202dd1 | |||
a21ba292eb | |||
5429104f04 | |||
bb0a977edc | |||
77ed621c74 | |||
fc39919856 | |||
d8800c095a | |||
e5ba414f2d | |||
b8a9eec14f | |||
059504ca70 | |||
b2db95380b | |||
b6bb26e9ae | |||
126d02ae90 | |||
8d76e362a0 | |||
004cf3da5c | |||
fb9fd6925a | |||
ec725cc6d4 | |||
79fe60e6fb | |||
c793d7d0a4 | |||
1b7c3580e6 | |||
3c3e0b6f20 | |||
fd6863dda4 | |||
690be611ee | |||
18c5405b79 | |||
cfd63c7d4c | |||
49a9335f68 | |||
5b1d52c5e7 | |||
9f43ed3f95 | |||
0770fd5be5 | |||
3c8ba348c2 | |||
b84a7042f1 | |||
8ef75524ea | |||
cec62a7ca5 | |||
77fe0db623 | |||
e86c821878 | |||
02f67af464 | |||
fd310bc7b9 | |||
94d3e27c53 | |||
6aa02c5edc | |||
97e19d7d4a | |||
94f32030e6 | |||
721e1ea863 | |||
5331d3e360 | |||
f52744cfbc | |||
4749393ab5 | |||
975603d608 | |||
99346522e9 | |||
090335ad8b | |||
d8af8f7305 | |||
2a2b597e09 | |||
da1d43fc61 | |||
03a750176b | |||
1d2bb5c51c | |||
60046aaa4f | |||
a6df234528 | |||
5ead0de7ca | |||
229cfd9f80 | |||
01c267b095 | |||
33a6c41810 | |||
7040e9a63b | |||
901eabb82d | |||
b11aa5f676 | |||
ccaa11bb6b | |||
dd0fba4270 | |||
3f6759061d | |||
abc7b1ff02 | |||
75a677701d | |||
11656ebd89 | |||
d62b4cf130 | |||
c4b3d18e26 | |||
38b7904f92 | |||
c89ee2f8f2 | |||
c21e692652 | |||
071efd826c | |||
d27f19a561 | |||
7642040fc0 | |||
67e70df0c9 | |||
fc0acc9e37 | |||
3a7dc32659 | |||
36e761b7a5 | |||
9a1cb9c3db | |||
32e2ff7573 | |||
ea4b1c6c29 | |||
2d574047e4 | |||
8ded91e975 | |||
0b2eeccd4b | |||
fa5b0efdb4 | |||
7555915441 | |||
3e1b1d5789 | |||
8e759d7f32 | |||
caaa543385 | |||
dce4b2f325 | |||
fb7ed1ee28 | |||
a74cef9d2f | |||
c88d21d487 | |||
6f83b39ee4 | |||
f5c4e23c9c | |||
f1fb0d32c6 | |||
ed129b40a3 | |||
fd1ce40ee7 | |||
2b15f38730 | |||
86515f3943 | |||
9afb09128b | |||
e40063fc34 | |||
d20d815b45 | |||
ed36517615 | |||
fa60165764 | |||
3c9d0fbca6 | |||
8d31c2f4dc | |||
eaa1f9a0f4 | |||
3e19f41cba | |||
e6902a1f1c | |||
b1007ed811 | |||
54d385a0a9 | |||
df48e9d1c0 | |||
e3be74a31a | |||
a8aa0c085f | |||
cd78f1158c | |||
d9668bd425 | |||
dc3ff10c6f | |||
31f9da7b8f | |||
05e3a747d0 | |||
8db212db99 | |||
2494cc1637 | |||
ee75355e71 | |||
863f9f285b | |||
d7e0051bc6 | |||
2aa305b51d | |||
4006d7d57f | |||
0a566f70b6 | |||
be2801d1fa | |||
648126e598 | |||
8184b2c57b | |||
337eab614e | |||
20abc4cb99 | |||
5aca0b7704 | |||
74446ce3e0 | |||
7bb14bd8da | |||
ed75f0da63 | |||
d9008054cf | |||
b10d9c9ad7 | |||
5f855045a2 | |||
88737b2083 | |||
a50d64e8e9 | |||
4deef2a9ef | |||
dd9a29633a | |||
4407f0bd65 | |||
73fd896f3c | |||
f8acd0f6f6 | |||
ccc6a23f68 | |||
c236c501e7 | |||
2a0e0ae66f | |||
11276a3505 | |||
c90371d9d5 | |||
038a32330f | |||
fa1fe4fdd1 | |||
59d6029f47 | |||
33b3d05039 | |||
7486c09fbb | |||
3f750a5637 | |||
e54fe59723 | |||
38b20ca0a4 | |||
8c178378ae | |||
341b9a80c5 | |||
45e89bf34a | |||
c17e1249d5 | |||
262f92e0be | |||
da797dff35 | |||
7043215f5e | |||
5202dd5157 | |||
7c4765d053 | |||
69c8aef6c2 | |||
71786e50cf | |||
e5647c4f83 | |||
98a8dd682d | |||
af3b965e00 | |||
2dfe113a42 |
6
.gitignore
vendored
@ -18,12 +18,16 @@ config
|
||||
configure
|
||||
data/gnome-shell.desktop
|
||||
data/gnome-shell.desktop.in
|
||||
data/gnome-shell-clock-preferences.desktop
|
||||
data/gnome-shell-clock-preferences.desktop.in
|
||||
intltool-extract.in
|
||||
intltool-merge.in
|
||||
intltool-update.in
|
||||
libtool
|
||||
m4/
|
||||
omf.make
|
||||
po/*.gmo
|
||||
po/gnome-shell.pot
|
||||
po/Makefile.in.in
|
||||
po/POTFILES
|
||||
po/stamp-it
|
||||
@ -36,9 +40,11 @@ src/Makefile
|
||||
src/Makefile.in
|
||||
src/gnomeshell-taskpanel
|
||||
src/gnome-shell
|
||||
src/gnome-shell-clock-preferences
|
||||
src/test-recorder
|
||||
src/test-recorder.ogg
|
||||
src/test-theme
|
||||
src/st.h
|
||||
stamp-h1
|
||||
tests/run-test.sh
|
||||
xmldocs.make
|
||||
|
20
Makefile.am
@ -1,9 +1,13 @@
|
||||
SUBDIRS = data js src tests po
|
||||
# Point to our macro directory and pick up user flags from the environment
|
||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||
|
||||
SUBDIRS = data js src tests po man
|
||||
|
||||
EXTRA_DIST = \
|
||||
.project \
|
||||
.settings \
|
||||
autogen.sh
|
||||
autogen.sh \
|
||||
tools/check-for-missing.py
|
||||
|
||||
# These are files checked into Git that we don't want to distribute
|
||||
DIST_EXCLUDE = \
|
||||
@ -14,14 +18,4 @@ DIST_EXCLUDE = \
|
||||
|
||||
distcheck-hook:
|
||||
@echo "Checking disted files against files in git"
|
||||
@failed=false; \
|
||||
exclude=`(for p in $(DIST_EXCLUDE) ; do echo --exclude=$$p ; done)`; \
|
||||
for f in `cd $(srcdir) && git ls-files $$exclude` ; do \
|
||||
if ! test -e $(distdir)/$$f ; then \
|
||||
echo File missing from distribution: $$f ; \
|
||||
failed=true ; \
|
||||
fi \
|
||||
done ; \
|
||||
if $$failed ; then \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE)
|
||||
|
@ -5,7 +5,6 @@ srcdir=`dirname $0`
|
||||
test -z "$srcdir" && srcdir=.
|
||||
|
||||
PKG_NAME="gnome-shell"
|
||||
REQUIRED_AUTOMAKE_VERSION=1.10
|
||||
|
||||
(test -f $srcdir/configure.ac \
|
||||
&& test -d $srcdir/src) || {
|
||||
@ -15,7 +14,7 @@ REQUIRED_AUTOMAKE_VERSION=1.10
|
||||
}
|
||||
|
||||
which gnome-autogen.sh || {
|
||||
echo "You need to install gnome-common from GNOME Subversion (or from"
|
||||
echo "You need to install gnome-common from GNOME Git (or from"
|
||||
echo "your OS vendor's package manager)."
|
||||
exit 1
|
||||
}
|
||||
|
73
configure.ac
@ -1,30 +1,35 @@
|
||||
AC_INIT(gnome-shell, 2.28.1)
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[2.31.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_AUX_DIR(config)
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_AUX_DIR([config])
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip foreign])
|
||||
AM_INIT_AUTOMAKE([1.10 dist-bzip2 no-dist-gzip foreign])
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AC_DISABLE_STATIC
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
# Needed for per-target cflags, like in gnomeshell-taskpanel
|
||||
AM_PROG_CC_C_O
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
# Initialize libtool
|
||||
LT_PREREQ([2.2.6])
|
||||
LT_INIT([disable-static])
|
||||
|
||||
GETTEXT_PACKAGE=gnome-shell
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
||||
[The prefix for our gettext translation domains.])
|
||||
|
||||
PKG_PROG_PKG_CONFIG(0.16)
|
||||
|
||||
IT_PROG_INTLTOOL(0.26)
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
|
||||
PKG_PROG_PKG_CONFIG([0.22])
|
||||
|
||||
# GConf stuff
|
||||
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
|
||||
AM_GCONF_SOURCE_2
|
||||
|
||||
@ -50,15 +55,36 @@ fi
|
||||
|
||||
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||
|
||||
CLUTTER_MIN_VERSION=1.2.8
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.6.11
|
||||
GJS_MIN_VERSION=0.7
|
||||
MUTTER_MIN_VERSION=2.31.2
|
||||
GTK_MIN_VERSION=2.18.0
|
||||
|
||||
# Collect more than 20 libraries for a prize!
|
||||
PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-unix-2.0 gtk+-2.0 dbus-glib-1 mutter-plugins
|
||||
gjs-gi-1.0 libgnome-menu $recorder_modules gconf-2.0
|
||||
gdk-x11-2.0 clutter-x11-1.0 clutter-glx-1.0
|
||||
gnome-desktop-2.0 >= 2.26 libstartup-notification-1.0
|
||||
gobject-introspection-1.0 >= 0.6.5)
|
||||
PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-unix-2.0 dbus-glib-1
|
||||
gtk+-2.0 >= $GTK_MIN_VERSION
|
||||
mutter-plugins >= $MUTTER_MIN_VERSION
|
||||
gjs-gi-1.0 >= $GJS_MIN_VERSION
|
||||
libgnome-menu $recorder_modules gconf-2.0
|
||||
gdk-x11-2.0
|
||||
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
|
||||
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
||||
libstartup-notification-1.0
|
||||
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION)
|
||||
|
||||
# This is for the newly added application id bits, we can replace this with
|
||||
# a version check later
|
||||
saved_CFLAGS=$CFLAGS
|
||||
saved_LIBS=$LIBS
|
||||
CFLAGS=$MUTTER_PLUGIN_CFLAGS
|
||||
LIBS=$MUTTER_PLUGIN_LIBS
|
||||
AC_CHECK_FUNCS(sn_startup_sequence_get_application_id)
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LIBS=$saved_LIBS
|
||||
|
||||
PKG_CHECK_MODULES(TIDY, clutter-1.0)
|
||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-2.0 libcroco-0.6)
|
||||
PKG_CHECK_MODULES(BIG, clutter-1.0 gtk+-2.0 librsvg-2.0)
|
||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-2.0 libcroco-0.6 gnome-desktop-2.0 >= 2.26)
|
||||
PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-2.0)
|
||||
PKG_CHECK_MODULES(TRAY, gtk+-2.0)
|
||||
|
||||
@ -72,8 +98,10 @@ AC_SUBST(MUTTER_PLUGIN_DIR)
|
||||
|
||||
GJS_JS_DIR=`$PKG_CONFIG --variable=jsdir gjs-1.0`
|
||||
GJS_JS_NATIVE_DIR=`$PKG_CONFIG --variable=jsnativedir gjs-1.0`
|
||||
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
|
||||
AC_SUBST(GJS_JS_DIR)
|
||||
AC_SUBST(GJS_JS_NATIVE_DIR)
|
||||
AC_SUBST(GJS_CONSOLE)
|
||||
|
||||
AC_CHECK_FUNCS(fdwalk)
|
||||
AC_CHECK_HEADERS([sys/resource.h])
|
||||
@ -94,8 +122,7 @@ AC_SUBST(TYPELIBDIR)
|
||||
# Stay command-line compatible with the gnome-common configure option. Here
|
||||
# minimum/yes/maximum are the same, however.
|
||||
AC_ARG_ENABLE(compile_warnings,
|
||||
AC_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],
|
||||
[Turn on compiler warnings]),,
|
||||
AS_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],[Turn on compiler warnings]),,
|
||||
enable_compile_warnings=error)
|
||||
|
||||
changequote(,)dnl
|
||||
@ -122,13 +149,17 @@ changequote([,])dnl
|
||||
AC_PATH_PROG(mutter, [mutter])
|
||||
AC_SUBST(mutter)
|
||||
|
||||
AC_OUTPUT([
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
data/Makefile
|
||||
js/Makefile
|
||||
js/misc/Makefile
|
||||
js/ui/Makefile
|
||||
js/perf/Makefile
|
||||
js/prefs/Makefile
|
||||
src/Makefile
|
||||
tests/Makefile
|
||||
po/Makefile.in
|
||||
man/Makefile
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
@ -1,37 +1,50 @@
|
||||
desktopdir=$(datadir)/applications
|
||||
desktop_DATA = gnome-shell.desktop
|
||||
desktop_DATA = gnome-shell.desktop gnome-shell-clock-preferences.desktop
|
||||
|
||||
# We substitute in bindir so it works as an autostart
|
||||
# file when built in a non-system prefix
|
||||
gnome-shell.desktop.in: gnome-shell.desktop.in.in
|
||||
%.desktop.in:%.desktop.in.in
|
||||
$(AM_V_GEN) sed -e "s|@bindir[@]|$(bindir)|" \
|
||||
-e "s|@VERSION[@]|$(VERSION)|" \
|
||||
$< > $@ || rm $@
|
||||
|
||||
# Placeholder until we add intltool
|
||||
gnome-shell.desktop: gnome-shell.desktop.in
|
||||
%.desktop:%.desktop.in
|
||||
$(AM_V_GEN) sed s/^_// < $< > $@ || rm $@
|
||||
|
||||
dist_pkgdata_DATA = clock-preferences.ui
|
||||
|
||||
imagesdir = $(pkgdatadir)/images
|
||||
dist_images_DATA = \
|
||||
add-workspace.svg \
|
||||
app-well-glow.png \
|
||||
close-black.svg \
|
||||
magnifier.svg \
|
||||
remove-workspace.svg
|
||||
magnifier.svg
|
||||
|
||||
themedir = $(pkgdatadir)/theme
|
||||
dist_theme_DATA = \
|
||||
theme/gnome-shell.css \
|
||||
theme/close.svg \
|
||||
theme/add-workspace.svg \
|
||||
theme/close-window.svg \
|
||||
theme/scroll-button-down.png \
|
||||
theme/close.svg \
|
||||
theme/corner-ripple.png \
|
||||
theme/dialog-error.svg \
|
||||
theme/gnome-shell.css \
|
||||
theme/mosaic-view-active.svg \
|
||||
theme/mosaic-view.svg \
|
||||
theme/move-window-on-new.svg \
|
||||
theme/remove-workspace.svg \
|
||||
theme/scroll-button-down-hover.png \
|
||||
theme/scroll-button-up.png \
|
||||
theme/scroll-button-down.png \
|
||||
theme/scroll-button-up-hover.png \
|
||||
theme/scroll-vhandle.png \
|
||||
theme/scroll-button-up.png \
|
||||
theme/scroll-hhandle.svg \
|
||||
theme/scroll-vhandle.svg \
|
||||
theme/section-back.svg \
|
||||
theme/section-more.svg
|
||||
theme/section-more.svg \
|
||||
theme/section-more-open.svg \
|
||||
theme/single-view-active.svg \
|
||||
theme/single-view.svg \
|
||||
theme/ws-switch-arrow-left.svg \
|
||||
theme/ws-switch-arrow-right.svg
|
||||
|
||||
|
||||
schemadir = @GCONF_SCHEMA_FILE_DIR@
|
||||
schema_DATA = gnome-shell.schemas
|
||||
@ -39,11 +52,13 @@ schema_DATA = gnome-shell.schemas
|
||||
install-data-local:
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA)
|
||||
|
||||
EXTRA_DIST = \
|
||||
gnome-shell.desktop.in.in \
|
||||
EXTRA_DIST = \
|
||||
gnome-shell.desktop.in.in \
|
||||
gnome-shell-clock-preferences.desktop.in.in \
|
||||
$(schema_DATA)
|
||||
|
||||
CLEANFILES = \
|
||||
gnome-shell.desktop.in \
|
||||
CLEANFILES = \
|
||||
gnome-shell.desktop.in \
|
||||
gnome-shell-clock-preferences.desktop.in \
|
||||
$(desktop_DATA)
|
||||
|
||||
|
@ -1,70 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="59.995201"
|
||||
height="59.995102"
|
||||
id="svg3113"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.46"
|
||||
version="1.0"
|
||||
sodipodi:docname="add-workspace.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<defs
|
||||
id="defs3115">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective3121" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
gridtolerance="10000"
|
||||
guidetolerance="10"
|
||||
objecttolerance="10"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="375"
|
||||
inkscape:cy="520"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="641"
|
||||
inkscape:window-height="683"
|
||||
inkscape:window-x="4"
|
||||
inkscape:window-y="54" />
|
||||
<metadata
|
||||
id="metadata3118">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-498.57383,-439.50749)">
|
||||
<path
|
||||
id="path3269"
|
||||
d="M 528.57143,439.91129 C 512.23433,439.91129 498.97763,453.16795 498.97763,469.50504 C 498.97763,485.84214 512.23433,499.09881 528.57143,499.09879 C 544.90853,499.09879 558.16513,485.84215 558.16523,469.50504 C 558.16523,453.16794 544.90853,439.9113 528.57143,439.91129 z M 525.29023,451.16129 L 531.88393,451.16129 C 533.75363,451.16129 535.25893,452.66659 535.25893,454.53629 L 535.25893,462.84879 L 543.54023,462.84879 C 545.40973,462.84879 546.91523,464.35409 546.91523,466.22379 L 546.91523,472.81754 C 546.91523,474.68728 545.40993,476.19255 543.54023,476.19254 L 535.25893,476.19254 L 535.25893,484.47379 C 535.25893,486.34353 533.75363,487.8488 531.88393,487.84879 L 525.29023,487.84879 C 523.42053,487.84881 521.91523,486.34351 521.91523,484.47379 L 521.91523,476.19254 L 513.60263,476.19254 C 511.73313,476.19257 510.22773,474.68726 510.22763,472.81754 L 510.22763,466.22379 C 510.22763,464.35407 511.73303,462.8488 513.60263,462.84879 L 521.91523,462.84879 L 521.91523,454.53629 C 521.91523,452.66657 523.42043,451.1613 525.29023,451.16129 z"
|
||||
style="opacity:0.30701785;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.807603px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.6 KiB |
188
data/clock-preferences.ui
Normal file
@ -0,0 +1,188 @@
|
||||
<?xml version="1.0"?>
|
||||
<interface>
|
||||
<requires lib="gtk+" version="2.16"/>
|
||||
<!-- interface-naming-policy project-wide -->
|
||||
<object class="GtkDialog" id="prefs-dialog">
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Clock Preferences</property>
|
||||
<property name="window_position">center</property>
|
||||
<property name="type_hint">normal</property>
|
||||
<property name="has_separator">False</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">2</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">18</property>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame1">
|
||||
<property name="visible">True</property>
|
||||
<property name="label_xalign">0</property>
|
||||
<property name="shadow_type">none</property>
|
||||
<child>
|
||||
<object class="GtkAlignment" id="alignment1">
|
||||
<property name="visible">True</property>
|
||||
<property name="top_padding">6</property>
|
||||
<property name="left_padding">12</property>
|
||||
<property name="right_padding">6</property>
|
||||
<child>
|
||||
<object class="GtkHBox" id="hbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="12hr_radio">
|
||||
<property name="label" translatable="yes">_12 hour format</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="24hr_radio">
|
||||
<property name="label" translatable="yes">_24 hour format</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<property name="group">12hr_radio</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label_format">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Clock Format</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
</attributes>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame2">
|
||||
<property name="visible">True</property>
|
||||
<property name="label_xalign">0</property>
|
||||
<property name="shadow_type">none</property>
|
||||
<child>
|
||||
<object class="GtkAlignment" id="alignment2">
|
||||
<property name="visible">True</property>
|
||||
<property name="top_padding">6</property>
|
||||
<property name="left_padding">12</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="date_check">
|
||||
<property name="label" translatable="yes">Show the _date</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="seconds_check">
|
||||
<property name="label" translatable="yes">Show seco_nds</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label_display">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Panel Display</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
</attributes>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="padding">6</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkHButtonBox" id="dialog-action_area1">
|
||||
<property name="visible">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="prefs_close_button">
|
||||
<property name="label">gtk-close</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="0">prefs_close_button</action-widget>
|
||||
</action-widgets>
|
||||
</object>
|
||||
</interface>
|
@ -62,5 +62,5 @@
|
||||
clip-rule="evenodd"
|
||||
d="M10.5,3.5l2,2L10,8l2.5,2.5l-2,2L8,10l-2.5,2.5l-2-2L6,8L3.5,5.5l2-2L8,6L10.5,3.5 z M0,8c0-4.418,3.582-8,8-8s8,3.582,8,8s-3.582,8-8,8S0,12.418,0,8z"
|
||||
id="path2394"
|
||||
style="fill-opacity:1;fill:#000000" />
|
||||
style="fill-opacity:1;fill:#545454" />
|
||||
</svg>
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
15
data/gnome-shell-clock-preferences.desktop.in.in
Normal file
@ -0,0 +1,15 @@
|
||||
[Desktop Entry]
|
||||
_Name=Clock
|
||||
_Comment=Customize the panel clock
|
||||
Exec=@bindir@/gnome-shell-clock-preferences
|
||||
Icon=gnome-panel-clock
|
||||
Terminal=false
|
||||
Type=Application
|
||||
StartupNotify=true
|
||||
Categories=GNOME;GTK;Settings;DesktopSettings;
|
||||
OnlyShowIn=GNOME;
|
||||
X-GNOME-ShellOnly=true
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-shell
|
||||
X-GNOME-Bugzilla-Component=general
|
||||
X-GNOME-Bugzilla-Version=@VERSION@
|
@ -46,45 +46,98 @@
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/sidebar/visible</key>
|
||||
<applyto>/desktop/gnome/shell/sidebar/visible</applyto>
|
||||
<key>/schemas/desktop/gnome/shell/run_dialog/history</key>
|
||||
<applyto>/desktop/gnome/shell/run_dialog/history</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>list</type>
|
||||
<list_type>string</list_type>
|
||||
<default>[]</default>
|
||||
<locale name="C">
|
||||
<short>History for command (Alt-F2) dialog</short>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/clock/format</key>
|
||||
<applyto>/desktop/gnome/shell/clock/format</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default>
|
||||
<!-- Translators:
|
||||
This controls whether the GNOME panel clock should display time
|
||||
in 24 hour mode or 12 hour mode by default. The only valid values
|
||||
for this are "24-hour" and "12-hour".
|
||||
If your locale uses 24 hour time notation, translate this to
|
||||
"24-hour".
|
||||
If your locale uses 12 hour time notation with am/pm, translate
|
||||
this to "12-hour".
|
||||
|
||||
Do NOT translate this into anything else than "24-hour" or
|
||||
"12-hour". For example, if you translate this to "24 sata" or
|
||||
anything else that isn't "24-hour" or "12-hour", things will
|
||||
not work.
|
||||
-->
|
||||
24-hour
|
||||
</default>
|
||||
<locale name="C">
|
||||
<short>Hour format</short>
|
||||
<long>
|
||||
This key specifies the hour format used by the panel clock.
|
||||
Possible values are "12-hour", "24-hour", "unix" and "custom".
|
||||
If set to "unix", the clock will display time in seconds since Epoch,
|
||||
i.e. 1970-01-01.
|
||||
If set to "custom", the clock will display time according to the format
|
||||
specified in the custom_format key.
|
||||
Note that if set to either "unix" or "custom", the show_date and
|
||||
show_seconds keys are ignored.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/clock/custom_format</key>
|
||||
<applyto>/desktop/gnome/shell/clock/custom_format</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default></default>
|
||||
<locale name="C">
|
||||
<short>Custom format of the clock</short>
|
||||
<long>
|
||||
This key specifies the format used by the panel clock when the
|
||||
format key is set to "custom". You can use conversion specifiers
|
||||
understood by strftime() to obtain a specific format. See the
|
||||
strftime() manual for more information.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/clock/show_seconds</key>
|
||||
<applyto>/desktop/gnome/shell/clock/show_seconds</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Whether or not to display the sidebar</short>
|
||||
<short>Show time with seconds</short>
|
||||
<long>
|
||||
Determines whether or not the sidebar is visible.
|
||||
</long>
|
||||
If true and format is either "12-hour" or "24-hour",
|
||||
display seconds in time.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/sidebar/expanded</key>
|
||||
<applyto>/desktop/gnome/shell/sidebar/expanded</applyto>
|
||||
<key>/schemas/desktop/gnome/shell/clock/show_date</key>
|
||||
<applyto>/desktop/gnome/shell/clock/show_date</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>true</default>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Whether the sidebar should be in the expanded (wide) mode</short>
|
||||
<short>Show date in clock</short>
|
||||
<long>
|
||||
Controls the expanded/collapsed state of the sidebar.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/sidebar/widgets</key>
|
||||
<applyto>/desktop/gnome/shell/sidebar/widgets</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>list</type>
|
||||
<list_type>string</list_type>
|
||||
<default>[imports.ui.widget.ClockWidget,imports.ui.widget.AppsWidget,imports.ui.widget.RecentDocsWidget]</default>
|
||||
<locale name="C">
|
||||
<short>The widgets to display in the sidebar</short>
|
||||
<long>
|
||||
The widgets to display in the sidebar, in order from top to bottom. Each widget "name" is actually a JavaScript expression referring to a widget constructor object.
|
||||
</long>
|
||||
If true and format is either "12-hour" or "24-hour",
|
||||
display date in the clock, in addition to time.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
@ -103,6 +156,288 @@
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/recorder/framerate</key>
|
||||
<applyto>/desktop/gnome/shell/recorder/framerate</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>int</type>
|
||||
<default>15</default>
|
||||
<locale name="C">
|
||||
<short>Framerate used for recording screencasts.</short>
|
||||
<long>
|
||||
The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/recorder/pipeline</key>
|
||||
<applyto>/desktop/gnome/shell/recorder/pipeline</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default></default>
|
||||
<locale name="C">
|
||||
<short>The gstreamer pipeline used to encode the screencast</short>
|
||||
<long>
|
||||
Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch.
|
||||
The pipeline should have an unconnected sink pad where the recorded video is recorded. It will
|
||||
normally have a unconnected source pad; output from that pad will be written into the output file.
|
||||
However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar.
|
||||
When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! theoraenc ! oggmux' and records to Ogg Theora.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/recorder/file_extension</key>
|
||||
<applyto>/desktop/gnome/shell/recorder/file_extension</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default>ogv</default>
|
||||
<locale name="C">
|
||||
<short>File extension used for storing the screencast</short>
|
||||
<long>
|
||||
The filename for recorded screencasts will be a unique filename based on the current date, and use this extension.
|
||||
It should be changed when recording to a different container format.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/overview/workspaces_view</key>
|
||||
<applyto>/desktop/gnome/shell/overview/workspaces_view</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default>single</default>
|
||||
<locale name="C">
|
||||
<short>Overview workspace view mode</short>
|
||||
<long>
|
||||
The selected workspace view mode in the overview.
|
||||
Supported values are "single" and "grid".
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/windows/button_layout</key>
|
||||
<applyto>/desktop/gnome/shell/windows/button_layout</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default>:minimize,maximize,close</default>
|
||||
<locale name="C">
|
||||
<short>Arrangement of buttons on the titlebar</short>
|
||||
<long>
|
||||
Arrangement of buttons on the titlebar. The
|
||||
value should be a string, such as
|
||||
"menu:minimize,maximize,spacer,close"; the colon separates the
|
||||
left corner of the window from the right corner, and
|
||||
the button names are comma-separated. Duplicate buttons
|
||||
are not allowed. Unknown button names are silently ignored
|
||||
so that buttons can be added in future gnome-shell versions
|
||||
without breaking older versions.
|
||||
A special spacer tag can be used to insert some space between
|
||||
two adjacent buttons.
|
||||
|
||||
This key overrides /apps/metacity/general/button_layout when
|
||||
running GNOME Shell.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<!-- Magnifier -->
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/show_magnifier</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/show_magnifier</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Show or hide the magnifier</short>
|
||||
<long>
|
||||
Show or hide the magnifier and all of its zoom regions.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/mouse_tracking</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/mouse_tracking</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>int</type>
|
||||
<default>1</default>
|
||||
<locale name="C">
|
||||
<short>Mouse Tracking Mode</short>
|
||||
<long>
|
||||
Determines the position of the magnified mouse image within
|
||||
the magnified view and how it reacts to system mouse movement.
|
||||
The values are 0 - none: no mouse tracking; 1 - centered: the
|
||||
mouse image is displayed at the center of the zoom region
|
||||
(which also represents the point under the system mouse) and the
|
||||
magnified contents are scrolled as the system mouse moves; 2 -
|
||||
proportional: the position of the magnified mouse in the zoom
|
||||
region is proportionally the same as the position of the system
|
||||
mouse on screen; or 3 - push: when the magnified mouse
|
||||
intersects a boundary of the zoom region, the contents are
|
||||
scrolled into view.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/screen_position</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/screen_position</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>int</type>
|
||||
<default>3</default>
|
||||
<locale name="C">
|
||||
<short>Screen position</short>
|
||||
<long>
|
||||
The magnified view either fills the entire screen (1), or
|
||||
occupies the top-half (2), bottom-half (3), left-half (4), or
|
||||
right-half (5) of the screen.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/mag_factor</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/mag_factor</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>float</type>
|
||||
<default>2.0</default>
|
||||
<locale name="C">
|
||||
<short>Magnification factor</short>
|
||||
<long>
|
||||
The power of the magnification. A value of 1.0 means no
|
||||
magnification. A value of 2.0 doubles the size.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/lens_mode</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/lens_mode</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Enable lens mode</short>
|
||||
<long>
|
||||
Whether the magnified view should be centered over the location
|
||||
of the system mouse and move with it.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/scroll_at_edges</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/scroll_at_edges</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Scroll magnified contents beyond the edges of the desktop</short>
|
||||
<long>
|
||||
For centered mouse tracking, when the system pointer is at
|
||||
or near the edge of the screen, the magnified contents continue
|
||||
to scroll such that the screen edge moves into the magnified
|
||||
view.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<!-- Magnifier: Crosshairs -->
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/show_cross_hairs</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/show_cross_hairs</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Show or hide crosshairs</short>
|
||||
<long>
|
||||
Enables/disables display of crosshairs centered on the magnified mouse
|
||||
sprite.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/cross_hairs_thickness</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/cross_hairs_thickness</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>int</type>
|
||||
<default>8</default>
|
||||
<locale name="C">
|
||||
<short>Thickness of the crosshairs</short>
|
||||
<long>
|
||||
Width of the vertical and horizontal lines that make up the
|
||||
crosshairs.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/cross_hairs_color</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/cross_hairs_color</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default>#ff0000</default>
|
||||
<locale name="C">
|
||||
<short>Color of the crosshairs</short>
|
||||
<long>
|
||||
The color of the the vertical and horizontal lines that make up
|
||||
the crosshairs.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/cross_hairs_opacity</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/cross_hairs_opacity</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>int</type>
|
||||
<default>169</default>
|
||||
<locale name="C">
|
||||
<short>Opacity of the crosshairs</short>
|
||||
<long>
|
||||
Determines the transparency of the crosshairs, from fully opaque
|
||||
to fully transparent.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/cross_hairs_length</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/cross_hairs_length</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>int</type>
|
||||
<default>4096</default>
|
||||
<locale name="C">
|
||||
<short>Length of the crosshairs</short>
|
||||
<long>
|
||||
Determines the length of the vertical and horizontal lines that
|
||||
make up the crosshairs.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/cross_hairs_clip</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/cross_hairs_clip</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Clip the crosshairs at the center</short>
|
||||
<long>
|
||||
Determines whether the crosshairs intersect the magnified mouse
|
||||
sprite, or are clipped such that the ends of the horizontal
|
||||
and vertical lines surround the mouse image.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
</schemalist>
|
||||
|
||||
</gconfschemafile>
|
||||
|
@ -1,71 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="59.995201"
|
||||
height="59.995102"
|
||||
id="svg3113"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.46"
|
||||
version="1.0"
|
||||
sodipodi:docname="remove-workspace.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<defs
|
||||
id="defs3115">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective3121" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
gridtolerance="10000"
|
||||
guidetolerance="10"
|
||||
objecttolerance="10"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="4.5"
|
||||
inkscape:cx="-8.1974244"
|
||||
inkscape:cy="38.948933"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1400"
|
||||
inkscape:window-height="971"
|
||||
inkscape:window-x="454"
|
||||
inkscape:window-y="105" />
|
||||
<metadata
|
||||
id="metadata3118">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-498.57383,-439.50749)">
|
||||
<path
|
||||
style="opacity:0.30701785;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.807603px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||
d="M 30 0.40625 C 13.662899 0.40624999 0.40625 13.66291 0.40625 30 C 0.40624999 46.337101 13.6629 59.59377 30 59.59375 C 46.337099 59.593749 59.59365 46.33711 59.59375 30 C 59.59375 13.662901 46.3371 0.40626 30 0.40625 z M 15.03125 23.34375 L 44.96875 23.34375 C 46.83825 23.343751 48.34375 24.84905 48.34375 26.71875 L 48.34375 33.3125 C 48.34375 35.182239 46.83845 36.68751 44.96875 36.6875 L 15.03125 36.6875 C 13.16175 36.687529 11.65635 35.18222 11.65625 33.3125 L 11.65625 26.71875 C 11.65625 24.849031 13.16165 23.34376 15.03125 23.34375 z "
|
||||
transform="translate(498.57383,439.50749)"
|
||||
id="path2382" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.8 KiB |
98
data/theme/add-workspace.svg
Normal file
@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="23"
|
||||
height="15"
|
||||
id="svg6375"
|
||||
version="1.1"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
sodipodi:docname="New document 13">
|
||||
<defs
|
||||
id="defs6377">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 16 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="32 : 16 : 1"
|
||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
||||
id="perspective6383" />
|
||||
<inkscape:perspective
|
||||
id="perspective6366"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="11.197802"
|
||||
inkscape:cx="16"
|
||||
inkscape:cy="16"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata6380">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,-17)">
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g6243"
|
||||
transform="translate(-986.28859,-658.2796)">
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:0.98770495;stroke:#666666;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
id="rect5318"
|
||||
width="22"
|
||||
height="14"
|
||||
x="986.89801"
|
||||
y="675.86743"
|
||||
rx="0.49999979"
|
||||
ry="0.5" />
|
||||
<g
|
||||
id="g5320"
|
||||
transform="translate(402.77304,-12.882544)">
|
||||
<path
|
||||
id="path5322"
|
||||
d="m 595.125,692.53048 0,6.43903"
|
||||
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
id="path5324"
|
||||
d="m 598.34451,695.75 -6.43902,0"
|
||||
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.2 KiB |
BIN
data/theme/corner-ripple.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
222
data/theme/dialog-error.svg
Normal file
@ -0,0 +1,222 @@
|
||||
<?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="24"
|
||||
height="24"
|
||||
id="svg4908"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="dialog-error.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
inkscape:export-filename="/home/andreas/project/gnome-icon-theme/scalable/actions/process-stop.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90"
|
||||
version="1.0">
|
||||
<defs
|
||||
id="defs4910">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 24 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="48 : 24 : 1"
|
||||
inkscape:persp3d-origin="24 : 16 : 1"
|
||||
id="perspective25" />
|
||||
<radialGradient
|
||||
gradientTransform="matrix(1.349881,0,0,1.349881,-3.498814,-1.810859)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
r="9.7183542"
|
||||
fy="4.9892726"
|
||||
fx="9.6893959"
|
||||
cy="4.9892726"
|
||||
cx="9.6893959"
|
||||
id="radialGradient5177"
|
||||
xlink:href="#linearGradient5171"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
gradientTransform="matrix(2.417917,0,0,2.417917,-14.17917,-4.903184)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
r="9.7785711"
|
||||
fy="3.458019"
|
||||
fx="10"
|
||||
cy="3.458019"
|
||||
cx="10"
|
||||
id="radialGradient5157"
|
||||
xlink:href="#linearGradient5151"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.928125,0,0,0.3143011,0.7718789,12.358015)"
|
||||
r="9.0598059"
|
||||
fy="18.022524"
|
||||
fx="10.739184"
|
||||
cy="18.022524"
|
||||
cx="10.739184"
|
||||
id="radialGradient5145"
|
||||
xlink:href="#linearGradient5139"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient5139"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop5141"
|
||||
offset="0"
|
||||
style="stop-color:black;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop5143"
|
||||
offset="1"
|
||||
style="stop-color:black;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5151"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop5153"
|
||||
offset="0"
|
||||
style="stop-color:white;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop5155"
|
||||
offset="1"
|
||||
style="stop-color:white;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5171">
|
||||
<stop
|
||||
id="stop5173"
|
||||
offset="0"
|
||||
style="stop-color:#fe3a00;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop5175"
|
||||
offset="1"
|
||||
style="stop-color:#c00;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.627417"
|
||||
inkscape:cx="24.442987"
|
||||
inkscape:cy="10.142308"
|
||||
inkscape:current-layer="g7001"
|
||||
showgrid="false"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:window-width="1674"
|
||||
inkscape:window-height="970"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
width="48px"
|
||||
height="48px"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata4913">
|
||||
<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>Stop Process</dc:title>
|
||||
<dc:date>December 2006</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:contributor>
|
||||
<cc:Agent>
|
||||
<dc:title>Andreas Nilsson</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:contributor>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>stop</rdf:li>
|
||||
<rdf:li>halt</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,-24)">
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
id="g7001"
|
||||
transform="matrix(1.4566048,0,0,1.4455352,0.4112881,1.2324709)">
|
||||
<path
|
||||
transform="matrix(0.91468137,0,0,0.70055266,-1.8812476,17.474032)"
|
||||
d="m 19.79899,18.022524 a 9.0598059,3.0935922 0 1 1 -18.1196115,0 9.0598059,3.0935922 0 1 1 18.1196115,0 z"
|
||||
sodipodi:ry="3.0935922"
|
||||
sodipodi:rx="9.0598059"
|
||||
sodipodi:cy="18.022524"
|
||||
sodipodi:cx="10.739184"
|
||||
id="path5137"
|
||||
style="color:#000000;fill:url(#radialGradient5145);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
transform="matrix(0.87347736,0,0,0.83068052,-0.79308842,15.602788)"
|
||||
d="m 19.25,9.625 a 9.25,9.25 0 1 1 -18.5,0 9.25,9.25 0 1 1 18.5,0 z"
|
||||
sodipodi:ry="9.25"
|
||||
sodipodi:rx="9.25"
|
||||
sodipodi:cy="9.625"
|
||||
sodipodi:cx="10"
|
||||
id="path4262"
|
||||
style="color:#000000;fill:url(#radialGradient5177);fill-opacity:1;fill-rule:nonzero;stroke:#a40000;stroke-width:0.47435912;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.35393258;color:#000000;fill:none;stroke:url(#radialGradient5157);stroke-width:0.49999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
id="path5149"
|
||||
sodipodi:cx="10"
|
||||
sodipodi:cy="9.625"
|
||||
sodipodi:rx="9.25"
|
||||
sodipodi:ry="9.25"
|
||||
d="m 19.25,9.625 a 9.25,9.25 0 1 1 -18.5,0 9.25,9.25 0 1 1 18.5,0 z"
|
||||
transform="matrix(0.82868359,0,0,0.78808147,-0.34515141,16.012803)" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path5159"
|
||||
d="m 4.834121,20.642783 6.215127,5.91061"
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.21219134;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.21219146;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 11.04925,20.622826 4.8159529,26.553393"
|
||||
id="path5161"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.0 KiB |
@ -26,6 +26,10 @@
|
||||
color: #0000e0;
|
||||
}
|
||||
|
||||
.label-shadow {
|
||||
color: rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
StScrollBar
|
||||
{
|
||||
padding: 0px;
|
||||
@ -37,36 +41,48 @@ StScrollView
|
||||
scrollbar-height: 16px;
|
||||
}
|
||||
|
||||
StButton#up-stepper
|
||||
StScrollView > .top-shadow
|
||||
{
|
||||
border-image: url("scroll-button-up.png") 5;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: #111111;
|
||||
background-gradient-end: rgba(17, 17, 17, 0);
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
StButton#up-stepper:hover,
|
||||
StButton#up-stepper:active
|
||||
StScrollView > .bottom-shadow
|
||||
{
|
||||
border-image: url("scroll-button-up-hover.png") 5;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: rgba(17, 17, 17, 0);
|
||||
background-gradient-end: #111111;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
StButton#down-stepper
|
||||
{
|
||||
border-image: url("scroll-button-down.png") 5;
|
||||
}
|
||||
|
||||
StButton#down-stepper:hover,
|
||||
StButton#down-stepper:active
|
||||
{
|
||||
border-image: url("scroll-button-down-hover.png") 5;
|
||||
StScrollBar {
|
||||
background-color: #080808;
|
||||
border: 1px solid #2d2d2d;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
StScrollBar StButton#vhandle
|
||||
{
|
||||
border-image: url("scroll-vhandle.png") 5;
|
||||
background-image: url("scroll-vhandle.svg");
|
||||
background-color: #252525;
|
||||
border: 1px solid #080808;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
StScrollBar StButton#hhandle
|
||||
{
|
||||
background-image: url("scroll-hhandle.svg");
|
||||
background-color: #252525;
|
||||
border: 1px solid #080808;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
StScrollBar StButton#hhandle:hover,
|
||||
StScrollBar StButton#vhandle:hover
|
||||
{
|
||||
border-image: url("scroll-vhandle.png") 5;
|
||||
background-color: #292929;
|
||||
}
|
||||
|
||||
StTooltip {
|
||||
@ -82,13 +98,12 @@ StTooltip {
|
||||
#panel {
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: #161616;
|
||||
background-gradient-end: #000000;
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
#panelLeft, #panelCenter, #panelRight {
|
||||
spacing: 4px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#panelLeft {
|
||||
@ -101,7 +116,46 @@ StTooltip {
|
||||
|
||||
.panel-button:pressed {
|
||||
background-color: rgba(50,76,111,0.98);
|
||||
border-radius: 4px;
|
||||
border-radius: 4px 4px 0px 0px;
|
||||
}
|
||||
|
||||
.panel-menu-boxpointer {
|
||||
-arrow-border-radius: 9px;
|
||||
-arrow-background-color: rgba(0,0,0,0.9);
|
||||
-arrow-border-width: 2px;
|
||||
-arrow-border-color: #5f5f5f;
|
||||
-arrow-base: 30px;
|
||||
-arrow-rise: 15px;
|
||||
}
|
||||
|
||||
.panel-menu {
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
.panel-menu-content {
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
.panel-menu-item {
|
||||
padding: 6px 20px;
|
||||
}
|
||||
|
||||
.panel-menu-item:active {
|
||||
background-color: #4c4c4c;
|
||||
}
|
||||
|
||||
.panel-image-menu-item {
|
||||
spacing: 12px;
|
||||
}
|
||||
|
||||
.panel-separator-menu-item {
|
||||
-gradient-height: 2px;
|
||||
-gradient-start: rgba(8,8,8,0);
|
||||
-gradient-end: #333333;
|
||||
-margin-horizontal: 30px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
#appMenu {
|
||||
@ -114,25 +168,126 @@ StTooltip {
|
||||
}
|
||||
|
||||
.panel-button {
|
||||
padding: 4px 12px 3px;
|
||||
padding: 0px 12px;
|
||||
border-radius: 5px;
|
||||
border-radius-bottomleft: 0px;
|
||||
border-radius-bottomright: 0px;
|
||||
font: 16px sans-serif;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.panel-button:active, .panel-button:checked {
|
||||
background-color: #314a6c;
|
||||
.panel-button:active, .panel-button:checked, .panel-button:pressed {
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: #3c3c3c;
|
||||
background-gradient-end: #131313;
|
||||
}
|
||||
|
||||
#panelActivities {
|
||||
border-radius-topleft: 0px;
|
||||
}
|
||||
|
||||
#panelStatus {
|
||||
border-radius-topright: 0px;
|
||||
}
|
||||
|
||||
#panelStatusMenu {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
/* Overlay */
|
||||
#statusTray {
|
||||
spacing: 14px;
|
||||
}
|
||||
|
||||
#statusTray:compact {
|
||||
spacing: 8px;
|
||||
}
|
||||
|
||||
/* Overview */
|
||||
|
||||
.overview {
|
||||
background-color: #111;
|
||||
}
|
||||
|
||||
.info-bar {
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
spacing: 20px;
|
||||
}
|
||||
|
||||
.info-bar-link-button {
|
||||
background-color: #2d2d2d;
|
||||
padding: 2px 14px;
|
||||
border-radius: 10px;
|
||||
border: 1px solid #181818;
|
||||
}
|
||||
|
||||
.info-bar-link-button:hover {
|
||||
border: 1px solid #666666;
|
||||
}
|
||||
|
||||
.new-workspace-area {
|
||||
border: 2px solid rgba(255, 255, 255, 0.8);
|
||||
border-radius: 10px;
|
||||
background-color: #111;
|
||||
}
|
||||
|
||||
.new-workspace-area-internal {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: rgba(16, 16, 16, 0);
|
||||
background-gradient-end: rgba(16, 16, 16, 1.0);
|
||||
background-image: url("move-window-on-new.svg");
|
||||
}
|
||||
|
||||
.new-workspace-area:hover {
|
||||
border: 2px solid rgba(255, 255, 255, 1.0);
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: rgba(130, 130, 130, 0.9);
|
||||
background-gradient-end: rgba(16, 16, 16, 0.9);
|
||||
}
|
||||
|
||||
.left-workspaces-shadow {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: rgba(16, 16, 16, 1.0);
|
||||
background-gradient-end: rgba(16, 16, 16, 0.0);
|
||||
}
|
||||
|
||||
.right-workspaces-shadow {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-end: rgba(16, 16, 16, 1.0);
|
||||
background-gradient-start: rgba(16, 16, 16, 0);
|
||||
}
|
||||
|
||||
.workspaces {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.workspaces.single {
|
||||
spacing: 25px;
|
||||
}
|
||||
|
||||
.workspaces.mosaic {
|
||||
spacing: 15px;
|
||||
}
|
||||
|
||||
.workspaces-bar {
|
||||
height: 48px;
|
||||
}
|
||||
|
||||
.workspaces-bar {
|
||||
spacing: 5px;
|
||||
}
|
||||
|
||||
.workspace-indicator {
|
||||
width: 24px;
|
||||
height: 16px;
|
||||
background: rgba(155,155,155,0.8);
|
||||
border-spacing: 16px;
|
||||
}
|
||||
|
||||
.workspace-indicator.active {
|
||||
background: rgba(255,255,255,0.8);
|
||||
}
|
||||
|
||||
.window-caption {
|
||||
background: rgba(0,0,0,0.8);
|
||||
border: 1px solid rgba(128,128,128,0.40);
|
||||
@ -146,14 +301,56 @@ StTooltip {
|
||||
background-image: url("close-window.svg");
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
-st-shadow: -2px 2px 6px rgba(0,0,0,0.5);
|
||||
-shell-close-overlap: 16px;
|
||||
}
|
||||
|
||||
.single-view-controls {
|
||||
padding: 0px 15px;
|
||||
}
|
||||
|
||||
.workspace-controls {
|
||||
width: 24px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.workspace-controls.add {
|
||||
background-image: url("add-workspace.svg");
|
||||
}
|
||||
|
||||
.workspace-controls.remove {
|
||||
background-image: url("remove-workspace.svg");
|
||||
}
|
||||
|
||||
.workspace-controls.switch-single {
|
||||
background-image: url("single-view.svg");
|
||||
}
|
||||
|
||||
.workspace-controls.switch-mosaic {
|
||||
background-image: url("mosaic-view.svg");
|
||||
}
|
||||
|
||||
.workspace-controls.switch-single:checked {
|
||||
background-image: url("single-view-active.svg");
|
||||
}
|
||||
|
||||
.workspace-controls.switch-mosaic:checked {
|
||||
background-image: url("mosaic-view-active.svg");
|
||||
}
|
||||
|
||||
#SwitchScroll {
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
#SwitchScroll #hhandle {
|
||||
border-radius: 7px;
|
||||
}
|
||||
|
||||
/* Dash */
|
||||
|
||||
#dash {
|
||||
color: #5f5f5f;
|
||||
background-color: rgba(0,0,0,0.75);
|
||||
font-size: 12px;
|
||||
padding: 0px 14px;
|
||||
}
|
||||
|
||||
@ -163,11 +360,25 @@ StTooltip {
|
||||
|
||||
#searchEntry {
|
||||
padding: 4px;
|
||||
border-bottom: 1px solid #262626;
|
||||
border-radius: 4px;
|
||||
color: #a8a8a8;
|
||||
border: 1px solid #565656;
|
||||
background-color: #404040;
|
||||
caret-color: #fff;
|
||||
caret-size: 1px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
#searchEntry:active {
|
||||
background-color: #c4c4c4;
|
||||
#searchEntry:focus {
|
||||
color: #545454;
|
||||
border: 1px solid #3a3a3a;
|
||||
background-color: #e8e8e8;
|
||||
caret-color: #545454;
|
||||
-st-shadow: 0px 0px 6px 2px rgba(255,255,255,0.9);
|
||||
}
|
||||
|
||||
#searchEntry:hover {
|
||||
border: 1px solid #767676;
|
||||
}
|
||||
|
||||
.dash-section {
|
||||
@ -175,17 +386,9 @@ StTooltip {
|
||||
}
|
||||
|
||||
.section-header {
|
||||
border: 1px solid #262626;
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: #161616;
|
||||
background-gradient-end: #000000;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.section-header-inner {
|
||||
border: 1px solid #000000;
|
||||
padding: 0px 4px;
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
@ -208,7 +411,6 @@ StTooltip {
|
||||
}
|
||||
|
||||
.dash-section-content {
|
||||
font-size: 14px;
|
||||
color: #ffffff;
|
||||
spacing: 8px;
|
||||
}
|
||||
@ -222,17 +424,18 @@ StTooltip {
|
||||
height: 9px;
|
||||
}
|
||||
|
||||
.dash-pane {
|
||||
background-color: rgba(0,0,0,0.95);
|
||||
border: 1px solid #262626;
|
||||
padding: 4px;
|
||||
spacing: 4px;
|
||||
.more-link-expander.open {
|
||||
background-image: url("section-more-open.svg");
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
}
|
||||
|
||||
.dash-pane-close {
|
||||
background-image: url("close.svg");
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
.dash-pane {
|
||||
border-radius: 10px;
|
||||
background-color: #111111;
|
||||
border: 2px solid #868686;
|
||||
color: #ffffff;
|
||||
padding: 30px 10px 10px 20px;
|
||||
}
|
||||
|
||||
.dash-search-section-header {
|
||||
@ -242,7 +445,6 @@ StTooltip {
|
||||
|
||||
.dash-search-section-results {
|
||||
color: #ffffff;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.dash-search-section-list-results {
|
||||
@ -250,12 +452,18 @@ StTooltip {
|
||||
}
|
||||
|
||||
.dash-search-result-content {
|
||||
padding: 2px;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.dash-search-result-content:selected {
|
||||
padding: 1px;
|
||||
border: 1px solid #262626;
|
||||
padding: 2px;
|
||||
border: 1px solid #5c5c5c;
|
||||
border-radius: 2px;
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
.dash-results-container {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
/* GenericDisplay */
|
||||
@ -296,22 +504,56 @@ StTooltip {
|
||||
|
||||
/* Apps */
|
||||
|
||||
.overview-pane {
|
||||
width: 440px;
|
||||
}
|
||||
|
||||
#dashAppWell {
|
||||
spacing: 2px;
|
||||
-shell-grid-item-size: 74px;
|
||||
spacing: 6px;
|
||||
-shell-grid-item-size: 70px;
|
||||
}
|
||||
|
||||
.all-app {
|
||||
border-radius: 10px;
|
||||
background-color: #111111;
|
||||
border: 2px solid #868686;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.all-app-controls-panel {
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.all-app-scroll-view {
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.app-well-app {
|
||||
border: 1px solid #080808;
|
||||
border-radius: 2px;
|
||||
border: 1px solid #181818;
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
width: 74px;
|
||||
height: 74px;
|
||||
font-size: 12px;
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.app-well-app.running {
|
||||
background-gradient-direction: vertical;
|
||||
background-gradient-start: #3d3d3d;
|
||||
background-gradient-end: #181818;
|
||||
}
|
||||
|
||||
.app-well-app.selected {
|
||||
border: 1px solid #666666;
|
||||
}
|
||||
|
||||
.app-well-app:hover {
|
||||
border: 1px solid #202020;
|
||||
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);
|
||||
}
|
||||
|
||||
.app-well-app:active {
|
||||
@ -319,19 +561,19 @@ StTooltip {
|
||||
border: 1px solid #5f5f5f;
|
||||
}
|
||||
|
||||
.app-well-app-glow {
|
||||
-shell-glow-extend-vertical: 3px;
|
||||
-shell-glow-shrink-horizontal: 3px;
|
||||
}
|
||||
|
||||
.app-well-menu {
|
||||
border: 1px solid #5f5f5f;
|
||||
border-radius: 4px;
|
||||
padding: 4px;
|
||||
background-color: rgba(0,0,0,0.9);
|
||||
color: #ffffff;
|
||||
-shell-arrow-width: 12px;
|
||||
-shell-menu-spacing: 4px;
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.app-well-menu-arrow {
|
||||
border-color: #5f5f5f;
|
||||
color: rgba(0,0,0,0.9);
|
||||
width: 12px;
|
||||
}
|
||||
|
||||
.app-well-menu-item:hover {
|
||||
@ -346,12 +588,49 @@ StTooltip {
|
||||
|
||||
/* Places */
|
||||
|
||||
.places-actions {
|
||||
spacing: 4px;
|
||||
.places-section {
|
||||
spacing-columns: 4px;
|
||||
spacing-rows: 4px;
|
||||
}
|
||||
|
||||
#placesDevices {
|
||||
padding-top: 4px;
|
||||
.places-item-box {
|
||||
spacing: 2px;
|
||||
}
|
||||
|
||||
.places-item {
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
border: 1px solid #181818;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
.places-item:hover {
|
||||
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);
|
||||
}
|
||||
|
||||
/* Recent items */
|
||||
|
||||
.recent-docs-item-box {
|
||||
spacing: 2px;
|
||||
}
|
||||
|
||||
.recent-docs-item {
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
border: 1px solid #181818;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
.recent-docs-item:hover {
|
||||
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);
|
||||
}
|
||||
|
||||
/* LookingGlass */
|
||||
@ -361,7 +640,7 @@ StTooltip {
|
||||
background-color: rgba(0,0,0,0.85);
|
||||
spacing: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid rgba(0,0,172,0.85);
|
||||
border: 2px solid grey;
|
||||
border-radius: 4px;
|
||||
|
||||
color: #88ff66;
|
||||
@ -381,27 +660,69 @@ StTooltip {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
#LookingGlassDialog .notebook-tab:hover {
|
||||
color: #00ff00;
|
||||
}
|
||||
|
||||
#LookingGlassDialog .notebook-tab:selected {
|
||||
border: 1px solid #88ff66;
|
||||
padding: 1px;
|
||||
border-radius: 4px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#LookingGlassDialog StLabel
|
||||
#LookingGlassDialog .lg-inspector-title {
|
||||
font-weight: bold;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.lg-dialog StLabel
|
||||
{
|
||||
color: #88ff66;
|
||||
}
|
||||
|
||||
#LookingGlassDialog StEntry
|
||||
.lg-dialog StEntry
|
||||
{
|
||||
color: #88ff66;
|
||||
}
|
||||
|
||||
.lg-obj-inspector-title
|
||||
{
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.lg-obj-inspector-button
|
||||
{
|
||||
border: 1px solid #88ff66;
|
||||
padding: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.lg-obj-inspector-button:hover
|
||||
{
|
||||
border: 1px solid #00ff00;
|
||||
}
|
||||
|
||||
.lg-dialog .shell-link
|
||||
{
|
||||
color: #88ff66;
|
||||
}
|
||||
|
||||
.lg-dialog .shell-link:hover
|
||||
{
|
||||
color: #00ff00;
|
||||
}
|
||||
|
||||
#LookingGlassDialog StBoxLayout#EvalBox
|
||||
{
|
||||
padding: 4px;
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
#LookingGlassDialog StBoxLayout#ResultsArea
|
||||
{
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
#lookingGlassExtensions {
|
||||
padding: 4px;
|
||||
}
|
||||
@ -425,6 +746,14 @@ StTooltip {
|
||||
spacing: 6px;
|
||||
}
|
||||
|
||||
#LookingGlassPropertyInspector {
|
||||
background: rgba(0, 0, 0, 0.9);
|
||||
border: 2px solid grey;
|
||||
border-radius: 4px;
|
||||
padding: 6px;
|
||||
color: #88ff66;
|
||||
}
|
||||
|
||||
/* Calendar popup */
|
||||
|
||||
#calendarPopup {
|
||||
@ -481,19 +810,101 @@ StTooltip {
|
||||
}
|
||||
|
||||
#notification {
|
||||
border-radius: 5px;
|
||||
font-size: 16px;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
background: rgba(0,0,0,0.9);
|
||||
color: white;
|
||||
padding: 2px 10px;
|
||||
spacing: 10px;
|
||||
padding: 2px 10px 10px 10px;
|
||||
spacing-rows: 5px;
|
||||
spacing-columns: 10px;
|
||||
max-width: 40em;
|
||||
}
|
||||
|
||||
#summary-notification-bin #notification {
|
||||
/* message-tray.height + notification.padding-bottom */
|
||||
padding-bottom: 38px;
|
||||
}
|
||||
|
||||
#notification-scrollview {
|
||||
max-height: 10em;
|
||||
}
|
||||
|
||||
#notification-scrollview > .top-shadow, #notification-scrollview > .bottom-shadow {
|
||||
height: 1em;
|
||||
}
|
||||
|
||||
#notification-body {
|
||||
spacing: 5px;
|
||||
}
|
||||
|
||||
#notification-actions {
|
||||
spacing: 5px;
|
||||
}
|
||||
|
||||
.notification-button {
|
||||
border: 2px rgba(0,0,0,0.0);
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
background: #c0c0c0;
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.notification-button:hover {
|
||||
border: 2px solid white;
|
||||
}
|
||||
|
||||
.notification-button:active {
|
||||
border: 2px solid white;
|
||||
background: #808080;
|
||||
}
|
||||
|
||||
.chat-received {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: #606060;
|
||||
background-gradient-end: #000000;
|
||||
|
||||
min-width: 20em;
|
||||
}
|
||||
|
||||
.chat-sent {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: #000000;
|
||||
background-gradient-end: #606060;
|
||||
}
|
||||
|
||||
.chat-response {
|
||||
border: 1px solid white;
|
||||
}
|
||||
|
||||
/* The spacing and padding on the summary is tricky; we want to keep
|
||||
* the icons from touching each other or the edges of the screen, but
|
||||
* we also want them to be "Fitts"-y with respect to the edges, so the
|
||||
* summary area's bottom and right padding must actually be part of
|
||||
* the icons. However, we can't put *all* of the padding into the
|
||||
* icons, because then the summary would be 0x0 when there were no
|
||||
* icons in it, and so you wouldn't be able to hover over it to
|
||||
* activate it.
|
||||
*
|
||||
* The padding-right on the non-rightmost icons is noticeable and
|
||||
* slightly annoying. If StBoxLayout implemented the ":last-child"
|
||||
* pseudo-class we could fix that...
|
||||
*/
|
||||
#summary-mode {
|
||||
spacing: 10px;
|
||||
padding: 2px 4px;
|
||||
spacing: 6px;
|
||||
padding: 2px 0px 0px 4px;
|
||||
}
|
||||
|
||||
.summary-icon {
|
||||
padding: 0px 4px 2px 0px;
|
||||
}
|
||||
|
||||
/* App Switcher */
|
||||
#altTabPopup {
|
||||
padding: 8px;
|
||||
spacing: 16px;
|
||||
}
|
||||
|
||||
.switcher-list {
|
||||
background: rgba(0,0,0,0.8);
|
||||
border: 1px solid rgba(128,128,128,0.40);
|
||||
@ -504,6 +915,26 @@ StTooltip {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.switcher-list-item-container {
|
||||
spacing: 8px;
|
||||
}
|
||||
|
||||
.thumbnail-scroll-gradient-left {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: rgba(51, 51, 51, 1.0);
|
||||
background-gradient-end: rgba(51, 51, 51, 0);
|
||||
border-radius: 8px;
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.thumbnail-scroll-gradient-right {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: rgba(51, 51, 51, 0);
|
||||
background-gradient-end: rgba(51, 51, 51, 1.0);
|
||||
border-radius: 8px;
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.switcher-list .item-box {
|
||||
padding: 8px;
|
||||
border-radius: 4px;
|
||||
@ -516,7 +947,6 @@ StTooltip {
|
||||
|
||||
.switcher-list .thumbnail {
|
||||
width: 256px;
|
||||
height: 256px;
|
||||
}
|
||||
|
||||
.switcher-list .outlined-item-box {
|
||||
@ -536,3 +966,102 @@ StTooltip {
|
||||
background: rgba(255,255,255,0.33);
|
||||
}
|
||||
|
||||
.ripple-box {
|
||||
width: 52px;
|
||||
height: 52px;
|
||||
background-image: url("corner-ripple.png");
|
||||
}
|
||||
|
||||
.switcher-arrow {
|
||||
border-color: rgba(0,0,0,0);
|
||||
color: #808080;
|
||||
}
|
||||
|
||||
.switcher-arrow:highlighted {
|
||||
border-color: rgba(0,0,0,0);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Workspace Switcher */
|
||||
.workspace-switcher-container {
|
||||
background: rgba(0,0,0,0.8);
|
||||
border: 1px solid rgba(128,128,128,0.40);
|
||||
border-radius: 8px;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.workspace-switcher {
|
||||
background: transparent;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
padding: 4px;
|
||||
spacing: 4.5px;
|
||||
}
|
||||
|
||||
.ws-switcher-active-left {
|
||||
height: 98px;
|
||||
border: 0px;
|
||||
background: rgba(255,255,255,0.5);
|
||||
background-image: url("ws-switch-arrow-left.svg");
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.ws-switcher-active-right {
|
||||
height: 98px;
|
||||
border: 0px;
|
||||
background: rgba(255,255,255,0.5);
|
||||
background-image: url("ws-switch-arrow-right.svg");
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.ws-switcher-box {
|
||||
height: 96px;
|
||||
border: 2px solid rgba(85,85,85,0.5);
|
||||
background: transparent;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
/* Run Dialog */
|
||||
.run-dialog-label {
|
||||
font: 12px sans-serif;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.run-dialog-error-icon {
|
||||
background-image: url("dialog-error.svg");
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.run-dialog-error-label {
|
||||
font: 16px sans-serif;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.run-dialog-entry {
|
||||
font: 14px sans-serif;
|
||||
font-weight: bold;
|
||||
width: 320px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.run-dialog {
|
||||
padding: 8px;
|
||||
border: 1px solid rgba(128,128,128,0.40);
|
||||
border-radius: 4px;
|
||||
background: rgba(0,0,0,0.8);
|
||||
}
|
||||
|
||||
.lightbox {
|
||||
background-color: rgba(0, 0, 0, 0.27);
|
||||
}
|
||||
|
||||
/* Magnifier */
|
||||
|
||||
.magnifier-zoom-region {
|
||||
border: 2px solid rgba(128, 0, 0, 255);
|
||||
}
|
||||
|
||||
.magnifier-zoom-region.full-screen {
|
||||
border-width: 0px;
|
||||
}
|
||||
|
113
data/theme/mosaic-view-active.svg
Normal file
@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="16"
|
||||
id="svg6503"
|
||||
version="1.1"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
sodipodi:docname="mosaic-view-active.svg">
|
||||
<defs
|
||||
id="defs6505">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 16 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="32 : 16 : 1"
|
||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
||||
id="perspective6511" />
|
||||
<inkscape:perspective
|
||||
id="perspective6494"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="11.197802"
|
||||
inkscape:cx="-15.97056"
|
||||
inkscape:cy="16"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata6508">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,-16)">
|
||||
<g
|
||||
style="display:inline;fill:#cbcbcb;fill-opacity:1"
|
||||
transform="translate(-449.85476,-685.85869)"
|
||||
id="g5306">
|
||||
<rect
|
||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none"
|
||||
id="rect5308"
|
||||
width="11"
|
||||
height="7"
|
||||
x="450.5"
|
||||
y="710.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
<rect
|
||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
|
||||
id="rect5310"
|
||||
width="11"
|
||||
height="7"
|
||||
x="462.5"
|
||||
y="702.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
<rect
|
||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999976000000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
|
||||
id="rect5312"
|
||||
width="11"
|
||||
height="7"
|
||||
x="450.5"
|
||||
y="702.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
<rect
|
||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
|
||||
id="rect5314"
|
||||
width="11"
|
||||
height="7"
|
||||
x="462.5"
|
||||
y="710.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
113
data/theme/mosaic-view.svg
Normal file
@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="16"
|
||||
id="svg6503"
|
||||
version="1.1"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
sodipodi:docname="New document 19">
|
||||
<defs
|
||||
id="defs6505">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 16 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="32 : 16 : 1"
|
||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
||||
id="perspective6511" />
|
||||
<inkscape:perspective
|
||||
id="perspective6494"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="11.197802"
|
||||
inkscape:cx="16"
|
||||
inkscape:cy="16"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata6508">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,-16)">
|
||||
<g
|
||||
style="display:inline"
|
||||
transform="translate(-449.85476,-685.85869)"
|
||||
id="g5306">
|
||||
<rect
|
||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none"
|
||||
id="rect5308"
|
||||
width="11"
|
||||
height="7"
|
||||
x="450.5"
|
||||
y="710.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
<rect
|
||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
|
||||
id="rect5310"
|
||||
width="11"
|
||||
height="7"
|
||||
x="462.5"
|
||||
y="702.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
<rect
|
||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
|
||||
id="rect5312"
|
||||
width="11"
|
||||
height="7"
|
||||
x="450.5"
|
||||
y="702.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
<rect
|
||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
|
||||
id="rect5314"
|
||||
width="11"
|
||||
height="7"
|
||||
x="462.5"
|
||||
y="710.5"
|
||||
rx="0.99999958"
|
||||
ry="1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.6 KiB |
89
data/theme/move-window-on-new.svg
Normal file
@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="98"
|
||||
height="98"
|
||||
id="svg6375"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="add-workspace.svg">
|
||||
<defs
|
||||
id="defs6377">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 16 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="32 : 16 : 1"
|
||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
||||
id="perspective6383" />
|
||||
<inkscape:perspective
|
||||
id="perspective6366"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.9590209"
|
||||
inkscape:cx="56.650687"
|
||||
inkscape:cy="20.635343"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata6380">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,66)">
|
||||
<g
|
||||
id="g2824"
|
||||
transform="matrix(11.568551,0,0,11.698271,-78.828159,-304.81518)">
|
||||
<path
|
||||
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 11.07363,21.36834 0,6.43903"
|
||||
id="path5322" />
|
||||
<path
|
||||
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
d="m 14.29314,24.58786 -6.43902,0"
|
||||
id="path5324" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:0.98823529"
|
||||
d="m 48.239516,97.908047 c -0.41677,-0.05102 -1.269253,-0.222408 -1.894408,-0.380859 -4.088493,-1.036262 -7.520781,-4.753234 -8.330163,-9.021094 -0.154947,-0.817026 -0.257819,-6.68112 -0.257819,-14.696556 l 0,-13.337088 -13.829177,-0.08909 C 10.802042,60.298796 10.026884,60.268266 8.6851548,59.783022 3.6288503,57.954375 0.62673331,53.828648 0.62673331,48.708554 c 0,-5.625522 4.25936019,-10.425065 9.97721469,-11.242548 0.987903,-0.141242 7.368912,-0.254994 14.460646,-0.257791 l 12.692532,-0.005 0,-13.586668 c 0,-14.6441583 0.03287,-15.0698926 1.364686,-17.6753047 2.185477,-4.2754229 6.938193,-6.75739913 11.687647,-6.10355607 3.382776,0.46569661 6.737962,2.72496967 8.414081,5.66577137 1.480816,2.5981315 1.519067,3.0522448 1.519067,18.0333334 l 0,13.666424 12.692533,0.005 c 7.091733,0.0028 13.472742,0.116549 14.460646,0.257791 6.395303,0.914337 10.804785,6.623716 9.941157,12.871766 -0.698243,5.051565 -4.792685,9.104635 -9.941157,9.840713 -0.987904,0.141242 -7.368913,0.254995 -14.460646,0.257791 l -12.692533,0.005 0,13.801945 c 0,13.031417 -0.02798,13.895893 -0.501177,15.484801 -1.526902,5.127058 -6.919246,8.802262 -12.001914,8.18002 z"
|
||||
id="path2828"
|
||||
transform="translate(0,-66)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.0 KiB |
92
data/theme/remove-workspace.svg
Normal file
@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="23"
|
||||
height="15"
|
||||
id="svg5501"
|
||||
version="1.1"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
sodipodi:docname="add-workspace.svg">
|
||||
<defs
|
||||
id="defs5503">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 16 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="32 : 16 : 1"
|
||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
||||
id="perspective5509" />
|
||||
<inkscape:perspective
|
||||
id="perspective5314"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="11.197802"
|
||||
inkscape:cx="-0.074583208"
|
||||
inkscape:cy="16"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-grids="true"
|
||||
inkscape:snap-bbox="true" />
|
||||
<metadata
|
||||
id="metadata5506">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,-17)">
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g6239"
|
||||
transform="translate(-953.97989,-657.32287)">
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:0.98770495;stroke:#666666;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
id="rect5318-6"
|
||||
width="22"
|
||||
height="14"
|
||||
x="954.5"
|
||||
y="675"
|
||||
rx="0.49999979"
|
||||
ry="0.5" />
|
||||
<path
|
||||
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
d="m 968.71951,682 -6.43902,0"
|
||||
id="path5324-5" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
64
data/theme/scroll-hhandle.svg
Normal file
@ -0,0 +1,64 @@
|
||||
<?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="10"
|
||||
height="4"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="scroll-hhandle.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
</defs>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<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">
|
||||
<rect
|
||||
style="fill:#323232;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="rect3592"
|
||||
width="2"
|
||||
height="4"
|
||||
x="0"
|
||||
y="0"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#rect3592"
|
||||
id="use2825"
|
||||
transform="translate(8,0)"
|
||||
width="10"
|
||||
height="4" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#use2825"
|
||||
id="use2827"
|
||||
transform="translate(-4,0)"
|
||||
width="10"
|
||||
height="4" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 323 B |
62
data/theme/scroll-vhandle.svg
Normal file
@ -0,0 +1,62 @@
|
||||
<?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="4"
|
||||
height="10"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="scroll-hhandle.svg">
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<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">
|
||||
<rect
|
||||
style="fill:#323232;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="rect3592"
|
||||
width="2"
|
||||
height="4"
|
||||
x="0"
|
||||
y="-4"
|
||||
rx="0"
|
||||
ry="0"
|
||||
transform="matrix(0,1,-1,0,0,0)" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#rect3592"
|
||||
id="use3705"
|
||||
transform="translate(0,4)"
|
||||
width="4"
|
||||
height="10" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#use3705"
|
||||
id="use3707"
|
||||
transform="translate(0,4)"
|
||||
width="4"
|
||||
height="10" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
87
data/theme/section-more-open.svg
Normal file
@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="5.8600588"
|
||||
height="9"
|
||||
id="svg3647"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="section-more.svg">
|
||||
<defs
|
||||
id="defs3649">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective3655" />
|
||||
<inkscape:perspective
|
||||
id="perspective3603"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="82.777778"
|
||||
inkscape:cx="2.9300294"
|
||||
inkscape:cy="5.466443"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata3652">
|
||||
<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(-262.78425,-490.71933)">
|
||||
<path
|
||||
transform="matrix(0,-0.98149546,0.71467449,0,25.404986,578.15569)"
|
||||
d="M 88.830127,340 80.169873,340 84.5,332.5 88.830127,340 z"
|
||||
inkscape:randomized="0"
|
||||
inkscape:rounded="0"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:arg2="1.5707963"
|
||||
sodipodi:arg1="0.52359878"
|
||||
sodipodi:r2="2.5"
|
||||
sodipodi:r1="5"
|
||||
sodipodi:cy="337.5"
|
||||
sodipodi:cx="84.5"
|
||||
sodipodi:sides="3"
|
||||
id="path5497-5"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.59699643;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
sodipodi:type="star" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
81
data/theme/single-view-active.svg
Normal file
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="16"
|
||||
id="svg6446"
|
||||
version="1.1"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
sodipodi:docname="single-view-active.svg">
|
||||
<defs
|
||||
id="defs6448">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 16 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="32 : 16 : 1"
|
||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
||||
id="perspective6454" />
|
||||
<inkscape:perspective
|
||||
id="perspective6441"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="11.197802"
|
||||
inkscape:cx="0.014720032"
|
||||
inkscape:cy="16"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata6451">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,-17)">
|
||||
<rect
|
||||
ry="0.5"
|
||||
rx="0.49999979"
|
||||
y="17.483809"
|
||||
x="0.53483802"
|
||||
height="15"
|
||||
width="23"
|
||||
id="rect5304"
|
||||
style="fill:#cccccc;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
81
data/theme/single-view.svg
Normal file
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="16"
|
||||
id="svg6446"
|
||||
version="1.1"
|
||||
inkscape:version="0.47pre4 r22446"
|
||||
sodipodi:docname="single-view.svg">
|
||||
<defs
|
||||
id="defs6448">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 16 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="32 : 16 : 1"
|
||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
||||
id="perspective6454" />
|
||||
<inkscape:perspective
|
||||
id="perspective6441"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="11.197802"
|
||||
inkscape:cx="0.014720032"
|
||||
inkscape:cy="16"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata6451">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,-17)">
|
||||
<rect
|
||||
ry="0.5"
|
||||
rx="0.49999979"
|
||||
y="17.483809"
|
||||
x="0.53483802"
|
||||
height="15"
|
||||
width="23"
|
||||
id="rect5304"
|
||||
style="fill:#626262;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
96
data/theme/ws-switch-arrow-left.svg
Normal file
@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="96" height="96" id="svg25070" version="1.1" inkscape:version="0.47 r22583" sodipodi:docname="dark-arrow-larger.svg">
|
||||
<defs id="defs25072">
|
||||
<inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 24 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="48 : 24 : 1" inkscape:persp3d-origin="24 : 16 : 1" id="perspective25078"/>
|
||||
<inkscape:perspective id="perspective24985" inkscape:persp3d-origin="0.5 : 0.33333333 : 1" inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d"/>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4034-0-4" id="linearGradient24957" gradientUnits="userSpaceOnUse" gradientTransform="translate(6)" x1="-86.552246" y1="185.439" x2="-83.37072" y2="197.31261"/>
|
||||
<linearGradient inkscape:collect="always" id="linearGradient4034-0-4">
|
||||
<stop style="stop-color: rgb(238, 238, 236); stop-opacity: 1;" offset="0" id="stop4036-5-7"/>
|
||||
<stop style="stop-color: rgb(186, 189, 182); stop-opacity: 1;" offset="1" id="stop4038-9-6"/>
|
||||
</linearGradient>
|
||||
<filter id="filter24765" inkscape:label="Invert" x="0" y="0" width="1" height="1" inkscape:menu="Color" inkscape:menu-tooltip="Invert colors" color-interpolation-filters="sRGB">
|
||||
<feColorMatrix id="feColorMatrix24767" type="saturate" values="1" result="fbSourceGraphic"/>
|
||||
<feColorMatrix id="feColorMatrix24769" in="fbSourceGraphic" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4632-1-3-9-3-2" id="linearGradient24955" gradientUnits="userSpaceOnUse" gradientTransform="translate(-5)" x1="-74.520325" y1="169.06032" x2="-74.520325" y2="205.94189"/>
|
||||
<linearGradient id="linearGradient4632-1-3-9-3-2">
|
||||
<stop style="stop-color: rgb(238, 238, 236); stop-opacity: 1;" offset="0" id="stop4634-1-8-3-9-0"/>
|
||||
<stop id="stop4636-1-9-9-8-8" offset="0.0274937" style="stop-color: rgb(255, 255, 255); stop-opacity: 1;"/>
|
||||
<stop id="stop4638-8-3-9-6-6" offset="0.274937" style="stop-color: rgb(242, 242, 242); stop-opacity: 1;"/>
|
||||
<stop id="stop4640-8-5-7-8-9" offset="0.38707438" style="stop-color: rgb(238, 238, 236); stop-opacity: 1;"/>
|
||||
<stop id="stop4642-5-41-9-6-9" offset="0.66528589" style="stop-color: rgb(217, 218, 216); stop-opacity: 1;"/>
|
||||
<stop id="stop4644-5-2-7-9-2" offset="0.76745707" style="stop-color: rgb(223, 224, 221); stop-opacity: 1;"/>
|
||||
<stop style="stop-color: rgb(240, 240, 240); stop-opacity: 1;" offset="1" id="stop4646-3-2-3-7-3"/>
|
||||
</linearGradient>
|
||||
<radialGradient inkscape:collect="always" xlink:href="#linearGradient4869-4-1" id="radialGradient24959" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0075, 0, 0, 1.0075, -5.4544, -1.25141)" cx="-33.412369" cy="185.74171" fx="-33.412369" fy="185.74171" r="2.3554697"/>
|
||||
<linearGradient id="linearGradient4869-4-1">
|
||||
<stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop4871-6-2"/>
|
||||
<stop id="stop4879-7-4" offset="0.31807542" style="stop-color: rgb(238, 238, 236); stop-opacity: 1;"/>
|
||||
<stop id="stop4877-6-1" offset="0.74691135" style="stop-color: rgb(200, 201, 198); stop-opacity: 1;"/>
|
||||
<stop style="stop-color: rgb(211, 215, 207); stop-opacity: 1;" offset="1" id="stop4873-1-0"/>
|
||||
</linearGradient>
|
||||
<filter id="filter25011" inkscape:label="Invert" x="0" y="0" width="1" height="1" inkscape:menu="Color" inkscape:menu-tooltip="Invert colors" color-interpolation-filters="sRGB">
|
||||
<feColorMatrix id="feColorMatrix25013" type="saturate" values="1" result="fbSourceGraphic"/>
|
||||
<feColorMatrix id="feColorMatrix25015" in="fbSourceGraphic" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<radialGradient inkscape:collect="always" xlink:href="#linearGradient4869-4-0" id="radialGradient24961" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0075, 0, 0, 1.0075, -5.4544, -1.25141)" cx="-33.412369" cy="185.74171" fx="-33.412369" fy="185.74171" r="2.3554697"/>
|
||||
<linearGradient id="linearGradient4869-4-0">
|
||||
<stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop4871-6-8"/>
|
||||
<stop id="stop4879-7-5" offset="0.31807542" style="stop-color: rgb(238, 238, 236); stop-opacity: 1;"/>
|
||||
<stop id="stop4877-6-5" offset="0.74691135" style="stop-color: rgb(200, 201, 198); stop-opacity: 1;"/>
|
||||
<stop style="stop-color: rgb(211, 215, 207); stop-opacity: 1;" offset="1" id="stop4873-1-4"/>
|
||||
</linearGradient>
|
||||
<filter id="filter25023" inkscape:label="Invert" x="0" y="0" width="1" height="1" inkscape:menu="Color" inkscape:menu-tooltip="Invert colors" color-interpolation-filters="sRGB">
|
||||
<feColorMatrix id="feColorMatrix25025" type="saturate" values="1" result="fbSourceGraphic"/>
|
||||
<feColorMatrix id="feColorMatrix25027" in="fbSourceGraphic" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4941" id="linearGradient24963" gradientUnits="userSpaceOnUse" x1="-39.858727" y1="184.61784" x2="-38.244785" y2="188.84898"/>
|
||||
<linearGradient inkscape:collect="always" id="linearGradient4941">
|
||||
<stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop4943"/>
|
||||
<stop style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" offset="1" id="stop4945"/>
|
||||
</linearGradient>
|
||||
<filter id="filter25033" inkscape:label="Invert" x="0" y="0" width="1" height="1" inkscape:menu="Color" inkscape:menu-tooltip="Invert colors" color-interpolation-filters="sRGB">
|
||||
<feColorMatrix id="feColorMatrix25035" type="saturate" values="1" result="fbSourceGraphic"/>
|
||||
<feColorMatrix id="feColorMatrix25037" in="fbSourceGraphic" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<linearGradient inkscape:collect="always" xlink:href="#linearGradient4941-7" id="linearGradient24965" gradientUnits="userSpaceOnUse" x1="-39.858727" y1="184.61784" x2="-38.244785" y2="188.84898"/>
|
||||
<linearGradient inkscape:collect="always" id="linearGradient4941-7">
|
||||
<stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop4943-2"/>
|
||||
<stop style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" offset="1" id="stop4945-5"/>
|
||||
</linearGradient>
|
||||
<filter id="filter25043" inkscape:label="Invert" x="0" y="0" width="1" height="1" inkscape:menu="Color" inkscape:menu-tooltip="Invert colors" color-interpolation-filters="sRGB">
|
||||
<feColorMatrix id="feColorMatrix25045" type="saturate" values="1" result="fbSourceGraphic"/>
|
||||
<feColorMatrix id="feColorMatrix25047" in="fbSourceGraphic" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<filter id="filter25049" inkscape:label="Invert" x="0" y="0" width="1" height="1" inkscape:menu="Color" inkscape:menu-tooltip="Invert colors" color-interpolation-filters="sRGB">
|
||||
<feColorMatrix id="feColorMatrix25051" type="saturate" values="1" result="fbSourceGraphic"/>
|
||||
<feColorMatrix id="feColorMatrix25053" in="fbSourceGraphic" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<filter id="filter25055" inkscape:label="Invert" x="0" y="0" width="1" height="1" inkscape:menu="Color" inkscape:menu-tooltip="Invert colors" color-interpolation-filters="sRGB">
|
||||
<feColorMatrix id="feColorMatrix25057" type="saturate" values="1" result="fbSourceGraphic"/>
|
||||
<feColorMatrix id="feColorMatrix25059" in="fbSourceGraphic" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="2.8284271" inkscape:cx="48.631638" inkscape:cy="57.536221" inkscape:current-layer="layer1" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:window-width="1200" inkscape:window-height="851" inkscape:window-x="0" inkscape:window-y="52" inkscape:window-maximized="0"/>
|
||||
<metadata id="metadata25075">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" transform="translate(0, 48)">
|
||||
<g id="g4030-1-8" transform="matrix(2, 0, 0, 2, 193.25, -374.967)" style="stroke: rgb(0, 0, 0); display: inline; stroke-opacity: 1;">
|
||||
<path sodipodi:nodetypes="ccc" id="path3165-7-3" d="m -72.5,173.5 -14,14 14,14" style="overflow: visible; marker: none; color: rgb(0, 0, 0); fill: none; stroke: rgb(0, 0, 0); stroke-width: 7; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-opacity: 1; stroke-dasharray: none; stroke-dashoffset: 0pt; visibility: visible; display: inline;"/>
|
||||
</g>
|
||||
<path sodipodi:type="arc" style="overflow: visible; marker: none; color: rgb(0, 0, 0); fill: rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 0.523439; visibility: visible; display: inline;" id="path4050-2-7-9-4" sodipodi:cx="-38.59375" sodipodi:cy="186.40625" sodipodi:rx="2.09375" sodipodi:ry="2.09375" d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z" transform="matrix(3.34328, 0, 0, 3.34328, 185.28, -623.176)"/>
|
||||
<path sodipodi:type="arc" style="overflow: visible; marker: none; color: rgb(0, 0, 0); fill: rgb(0, 0, 0); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 0.523439; visibility: visible; display: inline;" id="path4050-2-7-9-4-8" sodipodi:cx="-38.59375" sodipodi:cy="186.40625" sodipodi:rx="2.09375" sodipodi:ry="2.09375" d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z" transform="matrix(3.34328, 0, 0, 3.34328, 207.28, -623.176)"/>
|
||||
<path sodipodi:type="arc" style="overflow: visible; marker: none; color: rgb(0, 0, 0); fill: none; stroke: rgb(0, 0, 0); stroke-width: 0.697921; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-opacity: 1; stroke-dasharray: none; stroke-dashoffset: 0pt; visibility: visible; display: inline;" id="path4050-2-7-9-4-0" sodipodi:cx="-38.59375" sodipodi:cy="186.40625" sodipodi:rx="2.09375" sodipodi:ry="2.09375" d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z" transform="matrix(2.86565, 0, 0, 2.86565, 166.846, -534.143)"/>
|
||||
<path sodipodi:type="arc" style="overflow: visible; marker: none; color: rgb(0, 0, 0); fill: none; stroke: rgb(0, 0, 0); stroke-width: 0.697921; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-opacity: 1; stroke-dasharray: none; stroke-dashoffset: 0pt; visibility: visible; display: inline;" id="path4050-2-7-9-4-0-9" sodipodi:cx="-38.59375" sodipodi:cy="186.40625" sodipodi:rx="2.09375" sodipodi:ry="2.09375" d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z" transform="matrix(2.86565, 0, 0, 2.86565, 188.846, -534.143)"/>
|
||||
<path style="overflow: visible; marker: none; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; text-indent: 0pt; text-align: start; text-decoration: none; line-height: normal; letter-spacing: normal; word-spacing: normal; text-transform: none; direction: ltr; text-anchor: start; opacity: 0.35; color: rgb(0, 0, 0); fill: none; stroke: rgb(0, 0, 0); stroke-width: 1; stroke-miterlimit: 4; stroke-dasharray: none; visibility: visible; display: inline; font-family: Bitstream Vera Sans; stroke-opacity: 1;" d="m 317.06251,365.96875 c -0.76948,0.0224 -1.52555,0.35464 -2.0625,0.90625 l -16.125,16.125 16.125,16.125 c 1.11265,1.11265 3.13735,1.11265 4.25,0 1.11265,-1.11264 1.11265,-3.13735 0,-4.25 l -11.875,-11.875 11.875,-11.875 c 0.86584,-0.83655 1.1475,-2.22114 0.6773,-3.32947 -0.47021,-1.10834 -1.66156,-1.86802 -2.8648,-1.82678 z" id="path3165-7-3-1" sodipodi:nodetypes="ccccscccsc" transform="matrix(2, 0, 0, 2, -586, -765.967)"/>
|
||||
<path style="overflow: visible; marker: none; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; text-indent: 0pt; text-align: start; text-decoration: none; line-height: normal; letter-spacing: normal; word-spacing: normal; text-transform: none; direction: ltr; text-anchor: start; color: rgb(0, 0, 0); fill: none; stroke: rgb(0, 0, 0); stroke-width: 1; stroke-linecap: round; stroke-miterlimit: 4; stroke-dasharray: none; visibility: visible; display: inline; font-family: Bitstream Vera Sans; stroke-opacity: 1;" d="m 320.08435,397.03059 c 0.007,-0.79449 -0.27079,-1.59203 -0.83434,-2.15559 L 307.37501,383 m 12.5523,-15.20447 c -0.47021,-1.10834 -1.66156,-1.86802 -2.8648,-1.82678 -0.76948,0.0224 -1.52555,0.35464 -2.0625,0.90625 L 298.87501,383" id="path3165-7-3-1-9" sodipodi:nodetypes="ccccccc" transform="matrix(2, 0, 0, 2, -586, -765.967)"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 13 KiB |
331
data/theme/ws-switch-arrow-right.svg
Normal file
@ -0,0 +1,331 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
version="1.1"
|
||||
width="96"
|
||||
height="96"
|
||||
id="svg25070">
|
||||
<defs
|
||||
id="defs25072">
|
||||
<linearGradient
|
||||
x1="-86.552246"
|
||||
y1="185.439"
|
||||
x2="-83.37072"
|
||||
y2="197.31261"
|
||||
id="linearGradient24957"
|
||||
xlink:href="#linearGradient4034-0-4"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(6,0)" />
|
||||
<linearGradient
|
||||
id="linearGradient4034-0-4">
|
||||
<stop
|
||||
id="stop4036-5-7"
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop4038-9-6"
|
||||
style="stop-color:#babdb6;stop-opacity:1"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
x="0"
|
||||
y="0"
|
||||
width="1"
|
||||
height="1"
|
||||
color-interpolation-filters="sRGB"
|
||||
id="filter24765">
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphic"
|
||||
values="1"
|
||||
type="saturate"
|
||||
id="feColorMatrix24767" />
|
||||
<feColorMatrix
|
||||
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||
in="fbSourceGraphic"
|
||||
id="feColorMatrix24769" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
x1="-74.520325"
|
||||
y1="169.06032"
|
||||
x2="-74.520325"
|
||||
y2="205.94189"
|
||||
id="linearGradient24955"
|
||||
xlink:href="#linearGradient4632-1-3-9-3-2"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-5,0)" />
|
||||
<linearGradient
|
||||
id="linearGradient4632-1-3-9-3-2">
|
||||
<stop
|
||||
id="stop4634-1-8-3-9-0"
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop4636-1-9-9-8-8"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0.0274937" />
|
||||
<stop
|
||||
id="stop4638-8-3-9-6-6"
|
||||
style="stop-color:#f2f2f2;stop-opacity:1"
|
||||
offset="0.274937" />
|
||||
<stop
|
||||
id="stop4640-8-5-7-8-9"
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.38707438" />
|
||||
<stop
|
||||
id="stop4642-5-41-9-6-9"
|
||||
style="stop-color:#d9dad8;stop-opacity:1"
|
||||
offset="0.66528589" />
|
||||
<stop
|
||||
id="stop4644-5-2-7-9-2"
|
||||
style="stop-color:#dfe0dd;stop-opacity:1"
|
||||
offset="0.76745707" />
|
||||
<stop
|
||||
id="stop4646-3-2-3-7-3"
|
||||
style="stop-color:#f0f0f0;stop-opacity:1"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
cx="-33.412369"
|
||||
cy="185.74171"
|
||||
r="2.3554697"
|
||||
fx="-33.412369"
|
||||
fy="185.74171"
|
||||
id="radialGradient24959"
|
||||
xlink:href="#linearGradient4869-4-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0075,0,0,1.0075,-5.4544,-1.25141)" />
|
||||
<linearGradient
|
||||
id="linearGradient4869-4-1">
|
||||
<stop
|
||||
id="stop4871-6-2"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop4879-7-4"
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.31807542" />
|
||||
<stop
|
||||
id="stop4877-6-1"
|
||||
style="stop-color:#c8c9c6;stop-opacity:1"
|
||||
offset="0.74691135" />
|
||||
<stop
|
||||
id="stop4873-1-0"
|
||||
style="stop-color:#d3d7cf;stop-opacity:1"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
x="0"
|
||||
y="0"
|
||||
width="1"
|
||||
height="1"
|
||||
color-interpolation-filters="sRGB"
|
||||
id="filter25011">
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphic"
|
||||
values="1"
|
||||
type="saturate"
|
||||
id="feColorMatrix25013" />
|
||||
<feColorMatrix
|
||||
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||
in="fbSourceGraphic"
|
||||
id="feColorMatrix25015" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
cx="-33.412369"
|
||||
cy="185.74171"
|
||||
r="2.3554697"
|
||||
fx="-33.412369"
|
||||
fy="185.74171"
|
||||
id="radialGradient24961"
|
||||
xlink:href="#linearGradient4869-4-0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0075,0,0,1.0075,-5.4544,-1.25141)" />
|
||||
<linearGradient
|
||||
id="linearGradient4869-4-0">
|
||||
<stop
|
||||
id="stop4871-6-8"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop4879-7-5"
|
||||
style="stop-color:#eeeeec;stop-opacity:1"
|
||||
offset="0.31807542" />
|
||||
<stop
|
||||
id="stop4877-6-5"
|
||||
style="stop-color:#c8c9c6;stop-opacity:1"
|
||||
offset="0.74691135" />
|
||||
<stop
|
||||
id="stop4873-1-4"
|
||||
style="stop-color:#d3d7cf;stop-opacity:1"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
x="0"
|
||||
y="0"
|
||||
width="1"
|
||||
height="1"
|
||||
color-interpolation-filters="sRGB"
|
||||
id="filter25023">
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphic"
|
||||
values="1"
|
||||
type="saturate"
|
||||
id="feColorMatrix25025" />
|
||||
<feColorMatrix
|
||||
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||
in="fbSourceGraphic"
|
||||
id="feColorMatrix25027" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
x1="-39.858727"
|
||||
y1="184.61784"
|
||||
x2="-38.244785"
|
||||
y2="188.84898"
|
||||
id="linearGradient24963"
|
||||
xlink:href="#linearGradient4941"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient4941">
|
||||
<stop
|
||||
id="stop4943"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop4945"
|
||||
style="stop-color:#ffffff;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
x="0"
|
||||
y="0"
|
||||
width="1"
|
||||
height="1"
|
||||
color-interpolation-filters="sRGB"
|
||||
id="filter25033">
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphic"
|
||||
values="1"
|
||||
type="saturate"
|
||||
id="feColorMatrix25035" />
|
||||
<feColorMatrix
|
||||
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||
in="fbSourceGraphic"
|
||||
id="feColorMatrix25037" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
x1="-39.858727"
|
||||
y1="184.61784"
|
||||
x2="-38.244785"
|
||||
y2="188.84898"
|
||||
id="linearGradient24965"
|
||||
xlink:href="#linearGradient4941-7"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient4941-7">
|
||||
<stop
|
||||
id="stop4943-2"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop4945-5"
|
||||
style="stop-color:#ffffff;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
x="0"
|
||||
y="0"
|
||||
width="1"
|
||||
height="1"
|
||||
color-interpolation-filters="sRGB"
|
||||
id="filter25043">
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphic"
|
||||
values="1"
|
||||
type="saturate"
|
||||
id="feColorMatrix25045" />
|
||||
<feColorMatrix
|
||||
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||
in="fbSourceGraphic"
|
||||
id="feColorMatrix25047" />
|
||||
</filter>
|
||||
<filter
|
||||
x="0"
|
||||
y="0"
|
||||
width="1"
|
||||
height="1"
|
||||
color-interpolation-filters="sRGB"
|
||||
id="filter25049">
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphic"
|
||||
values="1"
|
||||
type="saturate"
|
||||
id="feColorMatrix25051" />
|
||||
<feColorMatrix
|
||||
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||
in="fbSourceGraphic"
|
||||
id="feColorMatrix25053" />
|
||||
</filter>
|
||||
<filter
|
||||
x="0"
|
||||
y="0"
|
||||
width="1"
|
||||
height="1"
|
||||
color-interpolation-filters="sRGB"
|
||||
id="filter25055">
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphic"
|
||||
values="1"
|
||||
type="saturate"
|
||||
id="feColorMatrix25057" />
|
||||
<feColorMatrix
|
||||
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"
|
||||
in="fbSourceGraphic"
|
||||
id="feColorMatrix25059" />
|
||||
</filter>
|
||||
</defs>
|
||||
<g
|
||||
transform="translate(0,48)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(-2,0,0,2,-97.2497,-374.967)"
|
||||
id="g4030-1-8"
|
||||
style="stroke:#000000;stroke-opacity:1;display:inline">
|
||||
<path
|
||||
d="m -72.5,173.5 -14,14 14,14"
|
||||
id="path3165-7-3"
|
||||
style="color:#000000;fill:none;stroke:#000000;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
</g>
|
||||
<path
|
||||
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||
transform="matrix(-3.34328,0,0,3.34328,-89.2797,-623.176)"
|
||||
id="path4050-2-7-9-4"
|
||||
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52343899;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||
transform="matrix(-3.34328,0,0,3.34328,-111.2797,-623.176)"
|
||||
id="path4050-2-7-9-4-8"
|
||||
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52343899;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||
transform="matrix(-2.86565,0,0,2.86565,-70.8457,-534.143)"
|
||||
id="path4050-2-7-9-4-0"
|
||||
style="color:#000000;fill:none;stroke:#000000;stroke-width:0.69792098;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
d="m -36.5,186.40625 a 2.09375,2.09375 0 1 1 -4.1875,0 2.09375,2.09375 0 1 1 4.1875,0 z"
|
||||
transform="matrix(-2.86565,0,0,2.86565,-92.8457,-534.143)"
|
||||
id="path4050-2-7-9-4-0-9"
|
||||
style="color:#000000;fill:none;stroke:#000000;stroke-width:0.69792098;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
d="m 47.87528,-34.0295 c 1.53896,0.0448 3.0511,0.70928 4.125,1.8125 l 32.25,32.25 -32.25,32.25 c -2.2253,2.2253 -6.2747,2.2253 -8.5,0 -2.2253,-2.22528 -2.2253,-6.2747 0,-8.5 l 23.75,-23.75 -23.75,-23.75 c -1.73168,-1.6731 -2.295,-4.44228 -1.3546,-6.65894 0.94042,-2.21668 3.32312,-3.73604 5.7296,-3.65356 z"
|
||||
id="path3165-7-3-1"
|
||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;opacity:0.35;color:#000000;fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans" />
|
||||
<path
|
||||
d="m 41.8316,28.09418 c -0.014,-1.58898 0.54158,-3.18406 1.66868,-4.31118 l 23.75,-23.75 m -25.1046,-30.40894 c 0.94042,-2.21668 3.32312,-3.73604 5.7296,-3.65356 1.53896,0.0448 3.0511,0.70928 4.125,1.8125 l 32.25,32.25"
|
||||
id="path3165-7-3-1-9"
|
||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#000000;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 12 KiB |
@ -1 +1 @@
|
||||
SUBDIRS = misc ui
|
||||
SUBDIRS = misc ui perf prefs
|
||||
|
@ -3,4 +3,6 @@ jsmiscdir = $(pkgdatadir)/js/misc
|
||||
dist_jsmisc_DATA = \
|
||||
docInfo.js \
|
||||
format.js \
|
||||
params.js
|
||||
gnomeSession.js \
|
||||
params.js \
|
||||
telepathy.js
|
||||
|
@ -3,8 +3,9 @@
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const St = imports.gi.St;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
const Search = imports.ui.search;
|
||||
@ -30,7 +31,7 @@ DocInfo.prototype = {
|
||||
},
|
||||
|
||||
createIcon : function(size) {
|
||||
return Shell.TextureCache.get_default().load_recent_thumbnail(size, this.recentInfo);
|
||||
return St.TextureCache.get_default().load_recent_thumbnail(size, this.recentInfo);
|
||||
},
|
||||
|
||||
launch : function() {
|
||||
@ -147,6 +148,6 @@ DocManager.prototype = {
|
||||
}
|
||||
return multipleMatches.concat(prefixMatches.concat(substringMatches));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(DocManager.prototype);
|
||||
|
45
js/misc/gnomeSession.js
Normal file
@ -0,0 +1,45 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const DBus = imports.dbus;
|
||||
const Lang = imports.lang;
|
||||
|
||||
const PresenceIface = {
|
||||
name: 'org.gnome.SessionManager.Presence',
|
||||
methods: [{ name: 'SetStatus',
|
||||
inSignature: 'u' }],
|
||||
properties: [{ name: 'status',
|
||||
signature: 'u',
|
||||
access: 'readwrite' }],
|
||||
signals: [{ name: 'StatusChanged',
|
||||
inSignature: 'u' }]
|
||||
};
|
||||
|
||||
const PresenceStatus = {
|
||||
AVAILABLE: 0,
|
||||
INVISIBLE: 1,
|
||||
BUSY: 2,
|
||||
IDLE: 3
|
||||
};
|
||||
|
||||
function Presence() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
Presence.prototype = {
|
||||
_init: function() {
|
||||
DBus.session.proxifyObject(this, 'org.gnome.SessionManager', '/org/gnome/SessionManager/Presence', this);
|
||||
},
|
||||
|
||||
getStatus: function(callback) {
|
||||
this.GetRemote('status', Lang.bind(this,
|
||||
function(status, ex) {
|
||||
if (!ex)
|
||||
callback(this, status);
|
||||
}));
|
||||
},
|
||||
|
||||
setStatus: function(status) {
|
||||
this.SetStatusRemote(status);
|
||||
}
|
||||
};
|
||||
DBus.proxifyPrototype(Presence.prototype, PresenceIface);
|
@ -2,7 +2,7 @@
|
||||
|
||||
// parse:
|
||||
// @params: caller-provided parameter object, or %null
|
||||
// @default: function-provided defaults object
|
||||
// @defaults: function-provided defaults object
|
||||
// @allowExtras: whether or not to allow properties not in @default
|
||||
//
|
||||
// Examines @params and fills in default values from @defaults for
|
||||
@ -10,24 +10,26 @@
|
||||
// @allowExtras is not %true, it will throw an error if @params
|
||||
// contains any properties that aren't in @defaults.
|
||||
//
|
||||
// If @params is %null, this returns @defaults.
|
||||
// If @params is %null, this returns the values from @defaults.
|
||||
//
|
||||
// Return value: the updated params
|
||||
// Return value: a new object, containing the merged parameters from
|
||||
// @params and @defaults
|
||||
function parse(params, defaults, allowExtras) {
|
||||
let ret = {}, prop;
|
||||
|
||||
if (!params)
|
||||
return defaults;
|
||||
params = {};
|
||||
|
||||
if (!allowExtras) {
|
||||
for (let prop in params) {
|
||||
if (!(prop in defaults))
|
||||
throw new Error('Unrecognized parameter "' + prop + '"');
|
||||
}
|
||||
for (prop in params) {
|
||||
if (!(prop in defaults) && !allowExtras)
|
||||
throw new Error('Unrecognized parameter "' + prop + '"');
|
||||
ret[prop] = params[prop];
|
||||
}
|
||||
|
||||
for (let prop in defaults) {
|
||||
if (!(prop in params))
|
||||
params[prop] = defaults[prop];
|
||||
for (prop in defaults) {
|
||||
if (!(prop in params))
|
||||
ret[prop] = defaults[prop];
|
||||
}
|
||||
|
||||
return params;
|
||||
return ret;
|
||||
}
|
372
js/misc/telepathy.js
Normal file
@ -0,0 +1,372 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const DBus = imports.dbus;
|
||||
|
||||
// D-Bus utils; should eventually move to gjs.
|
||||
// https://bugzilla.gnome.org/show_bug.cgi?id=610859
|
||||
|
||||
function makeProxyClass(iface) {
|
||||
let constructor = function() { this._init.apply(this, arguments); };
|
||||
|
||||
constructor.prototype._init = function(bus, name, path) {
|
||||
bus.proxifyObject(this, name, path);
|
||||
};
|
||||
|
||||
DBus.proxifyPrototype(constructor.prototype, iface);
|
||||
return constructor;
|
||||
}
|
||||
|
||||
function nameToPath(name) {
|
||||
return '/' + name.replace('.', '/', 'g');
|
||||
};
|
||||
|
||||
function pathToName(path) {
|
||||
if (path[0] != '/')
|
||||
throw new Error('not a D-Bus path: ' + path);
|
||||
return path.substr(1).replace('/', '.', 'g');
|
||||
};
|
||||
|
||||
// This is tp_escape_as_identifier() from telepathy-glib
|
||||
function escapeAsIdentifier(name) {
|
||||
if (!name)
|
||||
return '_';
|
||||
|
||||
// first char is replaced with _XX if it's non-alpha,
|
||||
// later chars are replaced with _XX if they're non-alphanumeric
|
||||
if (name.length == 1) {
|
||||
return name.replace(/[^a-zA-Z]/, _hexEscape);
|
||||
} else {
|
||||
return (name[0].replace(/[^a-zA-Z]/, _hexEscape) +
|
||||
name.substring(1).replace(/[^a-zA-Z0-9]/g, _hexEscape));
|
||||
}
|
||||
}
|
||||
|
||||
function _hexEscape(ch) {
|
||||
return '_' + ch.charCodeAt(0).toString(16);
|
||||
}
|
||||
|
||||
// Telepathy D-Bus interface definitions. Note that most of these are
|
||||
// incomplete, and only cover the methods/properties/signals that
|
||||
// we're currently using.
|
||||
|
||||
const TELEPATHY = 'org.freedesktop.Telepathy';
|
||||
|
||||
const CLIENT_NAME = TELEPATHY + '.Client';
|
||||
const ClientIface = {
|
||||
name: CLIENT_NAME,
|
||||
properties: [
|
||||
{ name: 'Interfaces',
|
||||
signature: 'as',
|
||||
access: 'read' }
|
||||
]
|
||||
};
|
||||
|
||||
const CLIENT_APPROVER_NAME = TELEPATHY + '.Client.Approver';
|
||||
const ClientApproverIface = {
|
||||
name: CLIENT_APPROVER_NAME,
|
||||
methods: [
|
||||
{ name: 'AddDispatchOperation',
|
||||
inSignature: 'a(oa{sv})oa{sv}',
|
||||
outSignature: '' }
|
||||
],
|
||||
properties: [
|
||||
{ name: 'ApproverChannelFilter',
|
||||
signature: 'aa{sv}',
|
||||
access: 'read' }
|
||||
]
|
||||
};
|
||||
|
||||
const CLIENT_HANDLER_NAME = TELEPATHY + '.Client.Handler';
|
||||
const ClientHandlerIface = {
|
||||
name: CLIENT_HANDLER_NAME,
|
||||
methods: [
|
||||
{ name: 'HandleChannels',
|
||||
inSignature: 'ooa(oa{sv})aota{sv}',
|
||||
outSignature: '' }
|
||||
],
|
||||
properties: [
|
||||
{ name: 'HandlerChannelFilter',
|
||||
signature: 'aa{sv}',
|
||||
access: 'read' }
|
||||
]
|
||||
};
|
||||
|
||||
const CLIENT_OBSERVER_NAME = TELEPATHY + '.Client.Observer';
|
||||
const ClientObserverIface = {
|
||||
name: CLIENT_OBSERVER_NAME,
|
||||
methods: [
|
||||
{ name: 'ObserveChannels',
|
||||
inSignature: 'ooa(oa{sv})oaoa{sv}',
|
||||
outSignature: '' }
|
||||
],
|
||||
properties: [
|
||||
{ name: 'ObserverChannelFilter',
|
||||
signature: 'aa{sv}',
|
||||
access: 'read' }
|
||||
]
|
||||
};
|
||||
|
||||
const CHANNEL_DISPATCH_OPERATION_NAME = TELEPATHY + '.ChannelDispatchOperation';
|
||||
const ChannelDispatchOperationIface = {
|
||||
name: CHANNEL_DISPATCH_OPERATION_NAME,
|
||||
methods: [
|
||||
{ name: 'HandleWith',
|
||||
inSignature: 's',
|
||||
outSignature: '' },
|
||||
{ name: 'Claim',
|
||||
inSignature: '',
|
||||
outSignature: '' }
|
||||
]
|
||||
};
|
||||
let ChannelDispatchOperation = makeProxyClass(ChannelDispatchOperationIface);
|
||||
|
||||
const CONNECTION_NAME = TELEPATHY + '.Connection';
|
||||
const ConnectionIface = {
|
||||
name: CONNECTION_NAME,
|
||||
signals: [
|
||||
{ name: 'StatusChanged',
|
||||
inSignature: 'uu' }
|
||||
]
|
||||
};
|
||||
let Connection = makeProxyClass(ConnectionIface);
|
||||
|
||||
const ConnectionStatus = {
|
||||
CONNECTED: 0,
|
||||
CONNECTING: 1,
|
||||
DISCONNECTED: 2
|
||||
};
|
||||
|
||||
const CONNECTION_ALIASING_NAME = CONNECTION_NAME + '.Interface.Aliasing';
|
||||
const ConnectionAliasingIface = {
|
||||
name: CONNECTION_ALIASING_NAME,
|
||||
methods: [
|
||||
{ name: 'RequestAliases',
|
||||
inSignature: 'au',
|
||||
outSignature: 'as'
|
||||
}
|
||||
],
|
||||
signals: [
|
||||
{ name: 'AliasesChanged',
|
||||
inSignature: 'a(us)' }
|
||||
]
|
||||
};
|
||||
let ConnectionAliasing = makeProxyClass(ConnectionAliasingIface);
|
||||
|
||||
const CONNECTION_AVATARS_NAME = CONNECTION_NAME + '.Interface.Avatars';
|
||||
const ConnectionAvatarsIface = {
|
||||
name: CONNECTION_AVATARS_NAME,
|
||||
methods: [
|
||||
{ name: 'GetKnownAvatarTokens',
|
||||
inSignature: 'au',
|
||||
outSignature: 'a{us}'
|
||||
},
|
||||
{ name: 'RequestAvatars',
|
||||
inSignature: 'au',
|
||||
outSignature: ''
|
||||
}
|
||||
],
|
||||
signals: [
|
||||
{ name: 'AvatarRetrieved',
|
||||
inSignature: 'usays'
|
||||
},
|
||||
{ name: 'AvatarUpdated',
|
||||
inSignature: 'us'
|
||||
}
|
||||
]
|
||||
};
|
||||
let ConnectionAvatars = makeProxyClass(ConnectionAvatarsIface);
|
||||
|
||||
const CONNECTION_CONTACTS_NAME = CONNECTION_NAME + '.Interface.Contacts';
|
||||
const ConnectionContactsIface = {
|
||||
name: CONNECTION_CONTACTS_NAME,
|
||||
methods: [
|
||||
{ name: 'GetContactAttributes',
|
||||
inSignature: 'auasb',
|
||||
outSignature: 'a{ua{sv}}'
|
||||
}
|
||||
]
|
||||
};
|
||||
let ConnectionContacts = makeProxyClass(ConnectionContactsIface);
|
||||
|
||||
const CONNECTION_REQUESTS_NAME = CONNECTION_NAME + '.Interface.Requests';
|
||||
const ConnectionRequestsIface = {
|
||||
name: CONNECTION_REQUESTS_NAME,
|
||||
methods: [
|
||||
{ name: 'CreateChannel',
|
||||
inSignature: 'a{sv}',
|
||||
outSignature: 'oa{sv}'
|
||||
},
|
||||
{ name: 'EnsureChannel',
|
||||
inSignature: 'a{sv}',
|
||||
outSignature: 'boa{sv}'
|
||||
}
|
||||
],
|
||||
properties: [
|
||||
{ name: 'Channels',
|
||||
signature: 'a(oa{sv})',
|
||||
access: 'read' }
|
||||
],
|
||||
signals: [
|
||||
{ name: 'NewChannels',
|
||||
inSignature: 'a(oa{sv})'
|
||||
},
|
||||
{ name: 'ChannelClosed',
|
||||
inSignature: 'o'
|
||||
}
|
||||
]
|
||||
};
|
||||
let ConnectionRequests = makeProxyClass(ConnectionRequestsIface);
|
||||
|
||||
const CONNECTION_SIMPLE_PRESENCE_NAME = CONNECTION_NAME + '.Interface.SimplePresence';
|
||||
const ConnectionSimplePresenceIface = {
|
||||
name: CONNECTION_SIMPLE_PRESENCE_NAME,
|
||||
methods: [
|
||||
{ name: 'SetPresence',
|
||||
inSignature: 'ss'
|
||||
},
|
||||
{ name: 'GetPresences',
|
||||
inSignature: 'au',
|
||||
outSignature: 'a{u(uss)}'
|
||||
}
|
||||
],
|
||||
signals: [
|
||||
{ name: 'PresencesChanged',
|
||||
inSignature: 'a{u(uss)}' }
|
||||
]
|
||||
};
|
||||
let ConnectionSimplePresence = makeProxyClass(ConnectionSimplePresenceIface);
|
||||
|
||||
const ConnectionPresenceType = {
|
||||
UNSET: 0,
|
||||
OFFLINE: 1,
|
||||
AVAILABLE: 2,
|
||||
AWAY: 3,
|
||||
EXTENDED_AWAY: 4,
|
||||
HIDDEN: 5,
|
||||
BUSY: 6,
|
||||
UNKNOWN: 7,
|
||||
ERROR: 8
|
||||
};
|
||||
|
||||
const HandleType = {
|
||||
NONE: 0,
|
||||
CONTACT: 1,
|
||||
ROOM: 2,
|
||||
LIST: 3,
|
||||
GROUP: 4
|
||||
};
|
||||
|
||||
const CHANNEL_NAME = TELEPATHY + '.Channel';
|
||||
const ChannelIface = {
|
||||
name: CHANNEL_NAME,
|
||||
signals: [
|
||||
{ name: 'Closed',
|
||||
inSignature: '' }
|
||||
]
|
||||
};
|
||||
let Channel = makeProxyClass(ChannelIface);
|
||||
|
||||
const CHANNEL_TEXT_NAME = CHANNEL_NAME + '.Type.Text';
|
||||
const ChannelTextIface = {
|
||||
name: CHANNEL_TEXT_NAME,
|
||||
methods: [
|
||||
{ name: 'ListPendingMessages',
|
||||
inSignature: 'b',
|
||||
outSignature: 'a(uuuuus)'
|
||||
},
|
||||
{ name: 'AcknowledgePendingMessages',
|
||||
inSignature: 'au',
|
||||
outSignature: ''
|
||||
},
|
||||
{ name: 'Send',
|
||||
inSignature: 'us',
|
||||
outSignature: ''
|
||||
}
|
||||
],
|
||||
signals: [
|
||||
{ name: 'Received',
|
||||
inSignature: 'uuuuus' }
|
||||
]
|
||||
};
|
||||
let ChannelText = makeProxyClass(ChannelTextIface);
|
||||
|
||||
const ChannelTextMessageType = {
|
||||
NORMAL: 0,
|
||||
ACTION: 1,
|
||||
NOTICE: 2,
|
||||
AUTO_REPLY: 3,
|
||||
DELIVERY_REPORT: 4
|
||||
};
|
||||
|
||||
const CHANNEL_CONTACT_LIST_NAME = CHANNEL_NAME + '.Type.ContactList';
|
||||
// There is no interface associated with ContactList; it's just a
|
||||
// special kind of Channel.Interface.Group
|
||||
|
||||
const CHANNEL_GROUP_NAME = CHANNEL_NAME + '.Interface.Group';
|
||||
const ChannelGroupIface = {
|
||||
name: CHANNEL_GROUP_NAME,
|
||||
properties: [
|
||||
{ name: 'Members',
|
||||
signature: 'au',
|
||||
access: 'read' }
|
||||
],
|
||||
signals: [
|
||||
{ name: 'MembersChanged',
|
||||
inSignature: 'sauauauauuu' }
|
||||
]
|
||||
};
|
||||
let ChannelGroup = makeProxyClass(ChannelGroupIface);
|
||||
|
||||
const ACCOUNT_MANAGER_NAME = TELEPATHY + '.AccountManager';
|
||||
const AccountManagerIface = {
|
||||
name: ACCOUNT_MANAGER_NAME,
|
||||
properties: [
|
||||
{ name: 'ValidAccounts',
|
||||
signature: 'ao',
|
||||
access: 'read' }
|
||||
],
|
||||
signals: [
|
||||
{ name: 'AccountValidityChanged',
|
||||
inSignature: 'ob' }
|
||||
]
|
||||
};
|
||||
let AccountManager = makeProxyClass(AccountManagerIface);
|
||||
|
||||
const ACCOUNT_NAME = TELEPATHY + '.Account';
|
||||
const AccountIface = {
|
||||
name: ACCOUNT_NAME,
|
||||
properties: [
|
||||
{ name: 'Connection',
|
||||
signature: 'o',
|
||||
access: 'read' }
|
||||
]
|
||||
};
|
||||
let Account = makeProxyClass(AccountIface);
|
||||
|
||||
const CHANNEL_DISPATCHER_NAME = TELEPATHY + '.ChannelDispatcher';
|
||||
const ChannelDispatcherIface = {
|
||||
name: CHANNEL_DISPATCHER_NAME,
|
||||
methods: [
|
||||
{ name: 'EnsureChannel',
|
||||
inSignature: 'oa{sv}xs',
|
||||
outSignature: 'o' }
|
||||
]
|
||||
};
|
||||
let ChannelDispatcher = makeProxyClass(ChannelDispatcherIface);
|
||||
|
||||
const CHANNEL_REQUEST_NAME = TELEPATHY + '.ChannelRequest';
|
||||
const ChannelRequestIface = {
|
||||
name: CHANNEL_REQUEST_NAME,
|
||||
methods: [
|
||||
{ name: 'Proceed',
|
||||
inSignature: '',
|
||||
outSignature: '' }
|
||||
],
|
||||
signals: [
|
||||
{ name: 'Failed',
|
||||
signature: 'ss' },
|
||||
{ name: 'Succeeded',
|
||||
signature: '' }
|
||||
]
|
||||
};
|
||||
let ChannelRequest = makeProxyClass(ChannelRequestIface);
|
4
js/perf/Makefile.am
Normal file
@ -0,0 +1,4 @@
|
||||
jsperfdir = $(pkgdatadir)/js/perf
|
||||
|
||||
dist_jsperf_DATA = \
|
||||
core.js
|
102
js/perf/core.js
Normal file
@ -0,0 +1,102 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Scripting = imports.ui.scripting;
|
||||
|
||||
// This performance script measure the most important (core) performance
|
||||
// metrics for the shell. By looking at the output metrics of this script
|
||||
// someone should be able to get an idea of how well the shell is performing
|
||||
// on a particular system.
|
||||
|
||||
let METRICS = {
|
||||
overviewLatencyFirst:
|
||||
{ description: "Time to first frame after triggering overview, first time",
|
||||
units: "us" },
|
||||
overviewFramesFirst:
|
||||
{ description: "Frames displayed when going to overview, first time",
|
||||
units: "frames" },
|
||||
overviewLatencySubsequent:
|
||||
{ description: "Time to first frame after triggering overview, second time",
|
||||
units: "us"},
|
||||
overviewFramesSubsequent:
|
||||
{ description: "Frames displayed when going to overview, second time",
|
||||
units: "us" },
|
||||
usedAfterOverview:
|
||||
{ description: "Malloc'ed bytes after the overview is shown once",
|
||||
units: "B" },
|
||||
leakedAfterOverview:
|
||||
{ description: "Additional malloc'ed bytes the second time the overview is shown",
|
||||
units: "B" }
|
||||
};
|
||||
|
||||
function run() {
|
||||
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
||||
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
||||
Scripting.defineScriptEvent("afterShowHide", "After a show/hide cycle for the overview");
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
yield Scripting.waitLeisure();
|
||||
for (let i = 0; i < 2; i++) {
|
||||
Scripting.scriptEvent('overviewShowStart');
|
||||
Main.overview.show();
|
||||
yield Scripting.waitLeisure();
|
||||
Scripting.scriptEvent('overviewShowDone');
|
||||
|
||||
Main.overview.hide();
|
||||
yield Scripting.waitLeisure();
|
||||
|
||||
global.gc();
|
||||
yield Scripting.sleep(1000);
|
||||
Scripting.collectStatistics();
|
||||
Scripting.scriptEvent('afterShowHide');
|
||||
}
|
||||
}
|
||||
|
||||
let showingOverview = false;
|
||||
let overviewShowStart;
|
||||
let overviewFrames;
|
||||
let overviewLatency;
|
||||
let mallocUsedSize = 0;
|
||||
let overviewShowCount = 0;
|
||||
let firstOverviewUsedSize;
|
||||
|
||||
function script_overviewShowStart(time) {
|
||||
showingOverview = true;
|
||||
overviewShowStart = time;
|
||||
overviewFrames = 0;
|
||||
}
|
||||
|
||||
function script_overviewShowDone(time) {
|
||||
showingOverview = false;
|
||||
|
||||
overviewShowCount++;
|
||||
|
||||
if (overviewShowCount == 1) {
|
||||
METRICS.overviewLatencyFirst.value = overviewLatency;
|
||||
METRICS.overviewFramesFirst.value = overviewFrames;
|
||||
} else {
|
||||
METRICS.overviewLatencySubsequent.value = overviewLatency;
|
||||
METRICS.overviewFramesSubsequent.value = overviewFrames;
|
||||
}
|
||||
}
|
||||
|
||||
function script_afterShowHide(time) {
|
||||
if (overviewShowCount == 1) {
|
||||
METRICS.usedAfterOverview.value = mallocUsedSize;
|
||||
} else {
|
||||
METRICS.leakedAfterOverview.value = mallocUsedSize - METRICS.usedAfterOverview.value;
|
||||
}
|
||||
}
|
||||
|
||||
function malloc_usedSize(time, bytes) {
|
||||
mallocUsedSize = bytes;
|
||||
}
|
||||
|
||||
function clutter_stagePaintDone(time) {
|
||||
if (showingOverview) {
|
||||
if (overviewFrames == 0)
|
||||
overviewLatency = time - overviewShowStart;
|
||||
|
||||
overviewFrames++;
|
||||
}
|
||||
}
|
4
js/prefs/Makefile.am
Normal file
@ -0,0 +1,4 @@
|
||||
jsprefsdir = $(pkgdatadir)/js/prefs
|
||||
|
||||
dist_jsprefs_DATA = \
|
||||
clockPreferences.js
|
93
js/prefs/clockPreferences.js
Normal file
@ -0,0 +1,93 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const GConf = imports.gi.GConf;
|
||||
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const GCONF_DIR = '/desktop/gnome/shell/clock';
|
||||
const FORMAT_KEY = GCONF_DIR + '/format';
|
||||
const SHOW_DATE_KEY = GCONF_DIR + '/show_date';
|
||||
const SHOW_SECONDS_KEY = GCONF_DIR + '/show_seconds';
|
||||
|
||||
|
||||
function ClockPreferences(uiFile) {
|
||||
this._init(uiFile);
|
||||
};
|
||||
|
||||
ClockPreferences.prototype = {
|
||||
_init: function(uiFile) {
|
||||
let builder = new Gtk.Builder();
|
||||
builder.add_from_file(uiFile);
|
||||
|
||||
this._dialog = builder.get_object('prefs-dialog');
|
||||
this._dialog.connect('response', Lang.bind(this, this._onResponse));
|
||||
|
||||
this._12hrRadio = builder.get_object('12hr_radio');
|
||||
this._24hrRadio = builder.get_object('24hr_radio');
|
||||
this._dateCheck = builder.get_object('date_check');
|
||||
this._secondsCheck = builder.get_object('seconds_check');
|
||||
|
||||
delete builder;
|
||||
|
||||
this._gconf = GConf.Client.get_default();
|
||||
this._gconf.add_dir(GCONF_DIR, GConf.ClientPreloadType.PRELOAD_NONE);
|
||||
this._notifyId = this._gconf.notify_add(GCONF_DIR,
|
||||
Lang.bind(this,
|
||||
this._updateDialog));
|
||||
|
||||
this._12hrRadio.connect('toggled', Lang.bind(this,
|
||||
function() {
|
||||
let format = this._12hrRadio.active ? '12-hour' : '24-hour';
|
||||
this._gconf.set_string(FORMAT_KEY, format);
|
||||
}));
|
||||
this._dateCheck.connect('toggled', Lang.bind(this,
|
||||
function() {
|
||||
this._gconf.set_bool(SHOW_DATE_KEY, this._dateCheck.active);
|
||||
}));
|
||||
this._secondsCheck.connect('toggled', Lang.bind(this,
|
||||
function() {
|
||||
this._gconf.set_bool(SHOW_SECONDS_KEY,
|
||||
this._secondsCheck.active);
|
||||
}));
|
||||
|
||||
this._updateDialog();
|
||||
},
|
||||
|
||||
show: function() {
|
||||
this._dialog.show_all();
|
||||
},
|
||||
|
||||
_updateDialog: function() {
|
||||
let format = this._gconf.get_string(FORMAT_KEY);
|
||||
this._12hrRadio.active = (format == "12-hour");
|
||||
this._24hrRadio.active = (format == "24-hour");
|
||||
|
||||
this._dateCheck.active = this._gconf.get_bool(SHOW_DATE_KEY);
|
||||
this._secondsCheck.active = this._gconf.get_bool(SHOW_SECONDS_KEY);
|
||||
},
|
||||
|
||||
_onResponse: function() {
|
||||
this._dialog.destroy();
|
||||
this._gconf.notify_remove(this._notifyId);
|
||||
this.emit('destroy');
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(ClockPreferences.prototype);
|
||||
|
||||
function main(params) {
|
||||
if ('progName' in params)
|
||||
GLib.set_prgname(params['progName']);
|
||||
Gtk.init(null, null);
|
||||
|
||||
let clockPrefs = new ClockPreferences(params['uiFile']);
|
||||
clockPrefs.connect('destroy',
|
||||
function() {
|
||||
Gtk.main_quit();
|
||||
});
|
||||
clockPrefs.show();
|
||||
|
||||
Gtk.main();
|
||||
}
|
@ -4,17 +4,20 @@ dist_jsui_DATA = \
|
||||
altTab.js \
|
||||
appDisplay.js \
|
||||
appFavorites.js \
|
||||
boxpointer.js \
|
||||
calendar.js \
|
||||
chrome.js \
|
||||
dash.js \
|
||||
dnd.js \
|
||||
docDisplay.js \
|
||||
environment.js \
|
||||
extensionSystem.js \
|
||||
extensionSystem.js \
|
||||
genericDisplay.js \
|
||||
lightbox.js \
|
||||
link.js \
|
||||
lookingGlass.js \
|
||||
magnifier.js \
|
||||
magnifierDBus.js \
|
||||
main.js \
|
||||
messageTray.js \
|
||||
notificationDaemon.js \
|
||||
@ -22,12 +25,14 @@ dist_jsui_DATA = \
|
||||
panel.js \
|
||||
placeDisplay.js \
|
||||
runDialog.js \
|
||||
search.js \
|
||||
scripting.js \
|
||||
search.js \
|
||||
shellDBus.js \
|
||||
sidebar.js \
|
||||
statusMenu.js \
|
||||
telepathyClient.js \
|
||||
tweener.js \
|
||||
widget.js \
|
||||
widgetBox.js \
|
||||
windowAttentionHandler.js \
|
||||
windowManager.js \
|
||||
workspaces.js
|
||||
workspacesView.js \
|
||||
workspaceSwitcherPopup.js \
|
||||
workspace.js
|
||||
|
477
js/ui/altTab.js
@ -1,6 +1,5 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const Lang = imports.lang;
|
||||
@ -14,22 +13,17 @@ const St = imports.gi.St;
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const POPUP_ARROW_COLOR = new Clutter.Color();
|
||||
POPUP_ARROW_COLOR.from_pixel(0xffffffff);
|
||||
const POPUP_UNFOCUSED_ARROW_COLOR = new Clutter.Color();
|
||||
POPUP_UNFOCUSED_ARROW_COLOR.from_pixel(0x808080ff);
|
||||
const TRANSPARENT_COLOR = new Clutter.Color();
|
||||
TRANSPARENT_COLOR.from_pixel(0x00000000);
|
||||
|
||||
const POPUP_APPICON_SIZE = 96;
|
||||
const POPUP_LIST_SPACING = 8;
|
||||
const POPUP_SCROLL_TIME = 0.10; // seconds
|
||||
|
||||
const DISABLE_HOVER_TIMEOUT = 500; // milliseconds
|
||||
|
||||
const THUMBNAIL_SIZE = 256;
|
||||
const THUMBNAIL_DEFAULT_SIZE = 256;
|
||||
const THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
||||
const THUMBNAIL_FADE_TIME = 0.2; // seconds
|
||||
|
||||
const iconSizes = [96, 64, 48, 32, 22];
|
||||
|
||||
function mod(a, b) {
|
||||
return (a + b) % b;
|
||||
}
|
||||
@ -40,18 +34,19 @@ function AltTabPopup() {
|
||||
|
||||
AltTabPopup.prototype = {
|
||||
_init : function() {
|
||||
this.actor = new Clutter.Group({ reactive: true,
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: global.screen_width,
|
||||
height: global.screen_height });
|
||||
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 = 0;
|
||||
this._currentWindow = -1;
|
||||
this._thumbnailTimeoutId = 0;
|
||||
this._motionTimeoutId = 0;
|
||||
|
||||
@ -59,12 +54,73 @@ AltTabPopup.prototype = {
|
||||
// the switcher appears underneath the current pointer location
|
||||
this._disableHover();
|
||||
|
||||
global.stage.add_actor(this.actor);
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
},
|
||||
|
||||
_getPreferredWidth: function (actor, forHeight, alloc) {
|
||||
alloc.min_size = global.screen_width;
|
||||
alloc.natural_size = global.screen_width;
|
||||
},
|
||||
|
||||
_getPreferredHeight: function (actor, forWidth, alloc) {
|
||||
alloc.min_size = global.screen_height;
|
||||
alloc.natural_size = global.screen_height;
|
||||
},
|
||||
|
||||
_allocate: function (actor, box, flags) {
|
||||
let childBox = new Clutter.ActorBox();
|
||||
let focus = global.get_focus_monitor();
|
||||
|
||||
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
|
||||
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
|
||||
let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
|
||||
let vPadding = this.actor.get_theme_node().get_vertical_padding();
|
||||
let hPadding = leftPadding + rightPadding;
|
||||
|
||||
// Allocate the appSwitcher
|
||||
// We select a size based on an icon size that does not overflow the screen
|
||||
let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(focus.width - hPadding);
|
||||
let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight);
|
||||
childBox.x1 = Math.max(focus.x + leftPadding, focus.x + Math.floor((focus.width - childNaturalWidth) / 2));
|
||||
childBox.x2 = Math.min(childBox.x1 + focus.width - hPadding, childBox.x1 + childNaturalWidth);
|
||||
childBox.y1 = focus.y + Math.floor((focus.height - childNaturalHeight) / 2);
|
||||
childBox.y2 = childBox.y1 + childNaturalHeight;
|
||||
this._appSwitcher.actor.allocate(childBox, flags);
|
||||
|
||||
// Allocate the thumbnails
|
||||
// We try to avoid overflowing the screen so we base the resulting size on
|
||||
// those calculations
|
||||
if (this._thumbnails) {
|
||||
let icon = this._appIcons[this._currentApp].actor;
|
||||
// Force a stage relayout to make sure we get the correct position
|
||||
global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, 0, 0);
|
||||
let [posX, posY] = icon.get_transformed_position();
|
||||
let thumbnailCenter = posX + icon.width / 2;
|
||||
let [childMinWidth, childNaturalWidth] = this._thumbnails.actor.get_preferred_width(-1);
|
||||
childBox.x1 = Math.max(focus.x + leftPadding, Math.floor(thumbnailCenter - childNaturalWidth / 2));
|
||||
if (childBox.x1 + childNaturalWidth > focus.x + focus.width - hPadding) {
|
||||
let offset = childBox.x1 + childNaturalWidth - focus.width + hPadding;
|
||||
childBox.x1 = Math.max(focus.x + leftPadding, childBox.x1 - offset - hPadding);
|
||||
}
|
||||
|
||||
let [found, spacing] = this.actor.get_theme_node().get_length('spacing', false);
|
||||
if (!found)
|
||||
spacing = 0;
|
||||
|
||||
childBox.x2 = childBox.x1 + childNaturalWidth;
|
||||
if (childBox.x2 > focus.x + focus.width - rightPadding)
|
||||
childBox.x2 = focus.x + focus.width - rightPadding;
|
||||
childBox.y1 = this._appSwitcher.actor.allocation.y2 + spacing;
|
||||
this._thumbnails.addClones(focus.height - bottomPadding - childBox.y1);
|
||||
let [childMinHeight, childNaturalHeight] = this._thumbnails.actor.get_preferred_height(-1);
|
||||
childBox.y2 = childBox.y1 + childNaturalHeight;
|
||||
this._thumbnails.actor.allocate(childBox, flags);
|
||||
}
|
||||
},
|
||||
|
||||
show : function(backward) {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let apps = tracker.get_running_apps ("");
|
||||
let apps = tracker.get_running_apps ('');
|
||||
|
||||
if (!apps.length)
|
||||
return false;
|
||||
@ -84,10 +140,6 @@ AltTabPopup.prototype = {
|
||||
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
|
||||
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
|
||||
|
||||
let primary = global.get_primary_monitor();
|
||||
this._appSwitcher.actor.x = primary.x + Math.floor((primary.width - this._appSwitcher.actor.width) / 2);
|
||||
this._appSwitcher.actor.y = primary.y + Math.floor((primary.height - this._appSwitcher.actor.height) / 2);
|
||||
|
||||
this._appIcons = this._appSwitcher.icons;
|
||||
|
||||
// Make the initial selection
|
||||
@ -112,8 +164,9 @@ AltTabPopup.prototype = {
|
||||
this._select(0, 1, true);
|
||||
else
|
||||
this._select(1);
|
||||
} else
|
||||
} else {
|
||||
this._select(1);
|
||||
}
|
||||
}
|
||||
|
||||
// There's a race condition; if the user released Alt before
|
||||
@ -121,7 +174,7 @@ AltTabPopup.prototype = {
|
||||
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
|
||||
// details.) So we check now. (Have to do this after updating
|
||||
// selection.)
|
||||
let mods = global.get_modifier_keys();
|
||||
let [x, y, mods] = global.get_pointer();
|
||||
if (!(mods & Gdk.ModifierType.MOD1_MASK)) {
|
||||
this._finish();
|
||||
return false;
|
||||
@ -138,10 +191,16 @@ AltTabPopup.prototype = {
|
||||
},
|
||||
|
||||
_nextWindow : function() {
|
||||
// We actually want the second window if we're in the unset state
|
||||
if (this._currentWindow == -1)
|
||||
this._currentWindow = 0;
|
||||
return mod(this._currentWindow + 1,
|
||||
this._appIcons[this._currentApp].cachedWindows.length);
|
||||
},
|
||||
_previousWindow : function() {
|
||||
// Also assume second window here
|
||||
if (this._currentWindow == -1)
|
||||
this._currentWindow = 1;
|
||||
return mod(this._currentWindow - 1,
|
||||
this._appIcons[this._currentApp].cachedWindows.length);
|
||||
},
|
||||
@ -161,7 +220,7 @@ AltTabPopup.prototype = {
|
||||
this.destroy();
|
||||
else if (this._thumbnailsFocused) {
|
||||
if (keysym == Clutter.Tab) {
|
||||
if (shift && this._currentWindow == 0)
|
||||
if (shift && (this._currentWindow == 0 || this._currentWindow == -1))
|
||||
this._select(this._previousApp());
|
||||
else if (!shift && this._currentWindow == this._appIcons[this._currentApp].cachedWindows.length - 1)
|
||||
this._select(this._nextApp());
|
||||
@ -181,7 +240,7 @@ AltTabPopup.prototype = {
|
||||
else if (keysym == Clutter.Right || keysym == Clutter.d)
|
||||
this._select(this._nextApp());
|
||||
else if (keysym == Clutter.Down || keysym == Clutter.s)
|
||||
this._select(this._currentApp, this._currentWindow);
|
||||
this._select(this._currentApp, 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -200,7 +259,7 @@ AltTabPopup.prototype = {
|
||||
let direction = event.get_scroll_direction();
|
||||
if (direction == Clutter.ScrollDirection.UP) {
|
||||
if (this._thumbnailsFocused) {
|
||||
if (this._currentWindow == 0)
|
||||
if (this._currentWindow == 0 || this._currentWindow == -1)
|
||||
this._select(this._previousApp());
|
||||
else
|
||||
this._select(this._currentApp, this._previousWindow());
|
||||
@ -234,10 +293,17 @@ AltTabPopup.prototype = {
|
||||
_appActivated : function(appSwitcher, n) {
|
||||
// If the user clicks on the selected app, activate the
|
||||
// selected window; otherwise (eg, they click on an app while
|
||||
// !mouseActive) activate the first window of the clicked-on
|
||||
// app.
|
||||
let window = (n == this._currentApp) ? this._currentWindow : 0;
|
||||
Main.activateWindow(this._appIcons[n].cachedWindows[window]);
|
||||
// !mouseActive) activate the the clicked-on app.
|
||||
if (n == this._currentApp) {
|
||||
let window;
|
||||
if (this._currentWindow >= 0)
|
||||
window = this._appIcons[this._currentApp].cachedWindows[this._currentWindow];
|
||||
else
|
||||
window = null;
|
||||
this._appIcons[this._currentApp].app.activate_window(window, global.get_current_time());
|
||||
} else {
|
||||
this._appIcons[n].app.activate_window(null, global.get_current_time());
|
||||
}
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
@ -249,7 +315,8 @@ AltTabPopup.prototype = {
|
||||
},
|
||||
|
||||
_windowActivated : function(thumbnailList, n) {
|
||||
Main.activateWindow(this._appIcons[this._currentApp].cachedWindows[n]);
|
||||
let appIcon = this._appIcons[this._currentApp];
|
||||
Main.activateWindow(appIcon.cachedWindows[n]);
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
@ -276,8 +343,11 @@ AltTabPopup.prototype = {
|
||||
|
||||
_finish : function() {
|
||||
let app = this._appIcons[this._currentApp];
|
||||
let window = app.cachedWindows[this._currentWindow];
|
||||
Main.activateWindow(window);
|
||||
if (this._currentWindow >= 0) {
|
||||
Main.activateWindow(app.cachedWindows[this._currentWindow]);
|
||||
} else {
|
||||
app.app.activate_window(null, global.get_current_time());
|
||||
}
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
@ -289,6 +359,9 @@ AltTabPopup.prototype = {
|
||||
if (this._haveModal)
|
||||
Main.popModal(this.actor);
|
||||
|
||||
if (this._thumbnails)
|
||||
this._destroyThumbnails();
|
||||
|
||||
if (this._keyPressEventId)
|
||||
global.stage.disconnect(this._keyPressEventId);
|
||||
if (this._keyReleaseEventId)
|
||||
@ -339,7 +412,7 @@ AltTabPopup.prototype = {
|
||||
this._thumbnailsFocused = (window != null) && !forceAppFocus;
|
||||
|
||||
this._currentApp = app;
|
||||
this._currentWindow = window ? window : 0;
|
||||
this._currentWindow = window ? window : -1;
|
||||
this._appSwitcher.highlight(app, this._thumbnailsFocused);
|
||||
|
||||
if (window != null) {
|
||||
@ -351,18 +424,23 @@ AltTabPopup.prototype = {
|
||||
!forceAppFocus) {
|
||||
this._thumbnailTimeoutId = Mainloop.timeout_add (
|
||||
THUMBNAIL_POPUP_TIME,
|
||||
Lang.bind(this, function () {
|
||||
this._select(this._currentApp, 0, true);
|
||||
return false;
|
||||
}));
|
||||
Lang.bind(this, this._timeoutPopupThumbnails));
|
||||
}
|
||||
},
|
||||
|
||||
_timeoutPopupThumbnails: function() {
|
||||
if (!this._thumbnails)
|
||||
this._createThumbnails();
|
||||
this._thumbnailTimeoutId = 0;
|
||||
this._thumbnailsFocused = false;
|
||||
return false;
|
||||
},
|
||||
|
||||
_destroyThumbnails : function() {
|
||||
Tweener.addTween(this._thumbnails.actor,
|
||||
{ opacity: 0,
|
||||
time: THUMBNAIL_FADE_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() { this.destroy(); }
|
||||
});
|
||||
this._thumbnails = null;
|
||||
@ -375,38 +453,11 @@ AltTabPopup.prototype = {
|
||||
|
||||
this.actor.add_actor(this._thumbnails.actor);
|
||||
|
||||
let thumbnailCenter;
|
||||
if (this._thumbnails.actor.width < this._appSwitcher.actor.width) {
|
||||
// Center the thumbnails under the corresponding AppIcon.
|
||||
// If this is being called when the switcher is first
|
||||
// being brought up, then nothing will have been assigned
|
||||
// an allocation yet, and the get_transformed_position()
|
||||
// call will return 0,0.
|
||||
// (http://bugzilla.openedhand.com/show_bug.cgi?id=1115).
|
||||
// Calling clutter_actor_get_allocation_box() would force
|
||||
// it to properly allocate itself, but we can't call that
|
||||
// because it has an out-caller-allocates arg. So we use
|
||||
// clutter_stage_get_actor_at_pos(), which will force a
|
||||
// reallocation as a side effect.
|
||||
global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, 0, 0);
|
||||
|
||||
let icon = this._appIcons[this._currentApp].actor;
|
||||
let [stageX, stageY] = icon.get_transformed_position();
|
||||
thumbnailCenter = stageX + icon.width / 2;
|
||||
} else {
|
||||
// Center the thumbnails on the monitor
|
||||
let primary = global.get_primary_monitor();
|
||||
thumbnailCenter = primary.x + primary.width / 2;
|
||||
}
|
||||
|
||||
this._thumbnails.actor.x = Math.floor(thumbnailCenter - this._thumbnails.actor.width / 2);
|
||||
this._thumbnails.actor.y = this._appSwitcher.actor.y + this._appSwitcher.actor.height + POPUP_LIST_SPACING;
|
||||
|
||||
this._thumbnails.actor.opacity = 0;
|
||||
Tweener.addTween(this._thumbnails.actor,
|
||||
{ opacity: 255,
|
||||
time: THUMBNAIL_FADE_TIME,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -417,23 +468,100 @@ function SwitcherList(squareItems) {
|
||||
|
||||
SwitcherList.prototype = {
|
||||
_init : function(squareItems) {
|
||||
this.actor = new St.Bin({ style_class: 'switcher-list' });
|
||||
this.actor = new Shell.GenericContainer({ style_class: 'switcher-list' });
|
||||
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._allocateTop));
|
||||
|
||||
// Here we use a GenericContainer so that we can force all the
|
||||
// children except the separator to have the same width.
|
||||
this._list = new Shell.GenericContainer();
|
||||
this._list.spacing = POPUP_LIST_SPACING;
|
||||
this._list = new Shell.GenericContainer({ style_class: 'switcher-list-item-container' });
|
||||
this._list.spacing = 0;
|
||||
this._list.connect('style-changed', Lang.bind(this, function() {
|
||||
let [found, spacing] = this._list.get_theme_node().get_length('spacing', false);
|
||||
this._list.spacing = (found) ? spacing : 0;
|
||||
}));
|
||||
|
||||
this._list.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
|
||||
this._list.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
|
||||
this._list.connect('allocate', Lang.bind(this, this._allocate));
|
||||
|
||||
this.actor.add_actor(this._list);
|
||||
this._clipBin = new St.Bin({style_class: 'cbin'});
|
||||
this._clipBin.child = this._list;
|
||||
this.actor.add_actor(this._clipBin);
|
||||
|
||||
this._leftGradient = new St.BoxLayout({style_class: 'thumbnail-scroll-gradient-left', vertical: true});
|
||||
this._rightGradient = new St.BoxLayout({style_class: 'thumbnail-scroll-gradient-right', vertical: true});
|
||||
this.actor.add_actor(this._leftGradient);
|
||||
this.actor.add_actor(this._rightGradient);
|
||||
|
||||
// Those arrows indicate whether scrolling in one direction is possible
|
||||
this._leftArrow = new St.DrawingArea({ style_class: 'switcher-arrow',
|
||||
pseudo_class: 'highlighted' });
|
||||
this._leftArrow.connect('repaint', Lang.bind(this,
|
||||
function (area) {
|
||||
Shell.draw_box_pointer(area, Shell.PointerDirection.LEFT);
|
||||
}));
|
||||
|
||||
this._rightArrow = new St.DrawingArea({ style_class: 'switcher-arrow',
|
||||
pseudo_class: 'highlighted' });
|
||||
this._rightArrow.connect('repaint', Lang.bind(this,
|
||||
function (area) {
|
||||
Shell.draw_box_pointer(area, Shell.PointerDirection.RIGHT);
|
||||
}));
|
||||
|
||||
this.actor.add_actor(this._leftArrow);
|
||||
this.actor.add_actor(this._rightArrow);
|
||||
|
||||
this._items = [];
|
||||
this._highlighted = -1;
|
||||
this._separator = null;
|
||||
this._squareItems = squareItems;
|
||||
this._minSize = 0;
|
||||
this._scrollableRight = true;
|
||||
this._scrollableLeft = false;
|
||||
},
|
||||
|
||||
_allocateTop: function(actor, box, flags) {
|
||||
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
|
||||
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
|
||||
|
||||
let childBox = new Clutter.ActorBox();
|
||||
let scrollable = this._minSize > box.x2 - box.x1;
|
||||
|
||||
this._clipBin.allocate(box, flags);
|
||||
|
||||
childBox.x1 = 0;
|
||||
childBox.y1 = 0;
|
||||
childBox.x2 = this._leftGradient.width;
|
||||
childBox.y2 = this.actor.height;
|
||||
this._leftGradient.allocate(childBox, flags);
|
||||
this._leftGradient.opacity = (this._scrollableLeft && scrollable) ? 255 : 0;
|
||||
|
||||
childBox.x1 = (this.actor.allocation.x2 - this.actor.allocation.x1) - this._rightGradient.width;
|
||||
childBox.y1 = 0;
|
||||
childBox.x2 = childBox.x1 + this._rightGradient.width;
|
||||
childBox.y2 = this.actor.height;
|
||||
this._rightGradient.allocate(childBox, flags);
|
||||
this._rightGradient.opacity = (this._scrollableRight && scrollable) ? 255 : 0;
|
||||
|
||||
let arrowWidth = Math.floor(leftPadding / 3);
|
||||
let arrowHeight = arrowWidth * 2;
|
||||
childBox.x1 = leftPadding / 2;
|
||||
childBox.y1 = this.actor.height / 2 - arrowWidth;
|
||||
childBox.x2 = childBox.x1 + arrowWidth;
|
||||
childBox.y2 = childBox.y1 + arrowHeight;
|
||||
this._leftArrow.allocate(childBox, flags);
|
||||
this._leftArrow.opacity = this._leftGradient.opacity;
|
||||
|
||||
arrowWidth = Math.floor(rightPadding / 3);
|
||||
arrowHeight = arrowWidth * 2;
|
||||
childBox.x1 = this.actor.width - arrowWidth - rightPadding / 2;
|
||||
childBox.y1 = this.actor.height / 2 - arrowWidth;
|
||||
childBox.x2 = childBox.x1 + arrowWidth;
|
||||
childBox.y2 = childBox.y1 + arrowHeight;
|
||||
this._rightArrow.allocate(childBox, flags);
|
||||
this._rightArrow.opacity = this._rightGradient.opacity;
|
||||
},
|
||||
|
||||
addItem : function(item) {
|
||||
@ -455,7 +583,7 @@ SwitcherList.prototype = {
|
||||
},
|
||||
|
||||
addSeparator: function () {
|
||||
let box = new St.Bin({ style_class: 'separator' })
|
||||
let box = new St.Bin({ style_class: 'separator' });
|
||||
this._separator = box;
|
||||
this._list.add_actor(box);
|
||||
},
|
||||
@ -472,6 +600,49 @@ SwitcherList.prototype = {
|
||||
else
|
||||
this._items[this._highlighted].style_class = 'selected-item-box';
|
||||
}
|
||||
|
||||
let monitor = global.get_focus_monitor();
|
||||
let itemSize = this._items[index].allocation.x2 - this._items[index].allocation.x1;
|
||||
let [posX, posY] = this._items[index].get_transformed_position();
|
||||
posX += this.actor.x;
|
||||
if (posX + itemSize > monitor.width + monitor.x)
|
||||
this._scrollToRight();
|
||||
else if (posX < 0)
|
||||
this._scrollToLeft();
|
||||
|
||||
},
|
||||
|
||||
_scrollToLeft : function() {
|
||||
let x = this._items[this._highlighted].allocation.x1;
|
||||
this._scrollableRight = true;
|
||||
Tweener.addTween(this._list, { anchor_x: x,
|
||||
time: POPUP_SCROLL_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function () {
|
||||
if (this._highlighted == 0) {
|
||||
this._scrollableLeft = false;
|
||||
this.actor.queue_relayout();
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
_scrollToRight : function() {
|
||||
this._scrollableLeft = true;
|
||||
let monitor = global.get_focus_monitor();
|
||||
let padding = this.actor.get_theme_node().get_horizontal_padding();
|
||||
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
|
||||
let x = this._items[this._highlighted].allocation.x2 - monitor.width + padding + parentPadding;
|
||||
Tweener.addTween(this._list, { anchor_x: x,
|
||||
time: POPUP_SCROLL_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function () {
|
||||
if (this._highlighted == this._items.length - 1) {
|
||||
this._scrollableRight = false;
|
||||
this.actor.queue_relayout();
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
_itemActivated: function(n) {
|
||||
@ -512,7 +683,8 @@ SwitcherList.prototype = {
|
||||
|
||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||
alloc.min_size = this._items.length * maxChildMin + separatorWidth + totalSpacing;
|
||||
alloc.nat_size = this._items.length * maxChildNat + separatorWidth + totalSpacing;
|
||||
alloc.natural_size = alloc.min_size;
|
||||
this._minSize = alloc.min_size;
|
||||
},
|
||||
|
||||
_getPreferredHeight: function (actor, forWidth, alloc) {
|
||||
@ -528,11 +700,11 @@ SwitcherList.prototype = {
|
||||
if (this._squareItems) {
|
||||
let [childMin, childNat] = this._maxChildWidth(-1);
|
||||
maxChildMin = Math.max(childMin, maxChildMin);
|
||||
maxChildNat = Math.max(childNat, maxChildNat);
|
||||
maxChildNat = maxChildMin;
|
||||
}
|
||||
|
||||
alloc.min_size = maxChildMin;
|
||||
alloc.nat_size = maxChildNat;
|
||||
alloc.natural_size = maxChildNat;
|
||||
},
|
||||
|
||||
_allocate: function (actor, box, flags) {
|
||||
@ -553,6 +725,18 @@ SwitcherList.prototype = {
|
||||
let x = 0;
|
||||
let children = this._list.get_children();
|
||||
let childBox = new Clutter.ActorBox();
|
||||
|
||||
let focus = global.get_focus_monitor();
|
||||
let parentRightPadding = this.actor.get_parent().get_theme_node().get_padding(St.Side.RIGHT);
|
||||
if (this.actor.allocation.x2 == focus.x + focus.width - parentRightPadding) {
|
||||
if (this._squareItems)
|
||||
childWidth = childHeight;
|
||||
else {
|
||||
let [childMin, childNat] = children[0].get_preferred_width(childHeight);
|
||||
childWidth = childMin;
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
if (this._items.indexOf(children[i]) != -1) {
|
||||
let [childMin, childNat] = children[i].get_preferred_height(childWidth);
|
||||
@ -577,6 +761,14 @@ SwitcherList.prototype = {
|
||||
// we don't allocate it.
|
||||
}
|
||||
}
|
||||
|
||||
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
|
||||
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
|
||||
let topPadding = this.actor.get_theme_node().get_padding(St.Side.TOP);
|
||||
let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
|
||||
|
||||
// Clip the area for scrolling
|
||||
this._clipBin.set_clip(0, -topPadding, (this.actor.allocation.x2 - this.actor.allocation.x1) - leftPadding - rightPadding, this.actor.height + bottomPadding);
|
||||
}
|
||||
};
|
||||
|
||||
@ -589,14 +781,22 @@ function AppIcon(app) {
|
||||
AppIcon.prototype = {
|
||||
_init: function(app) {
|
||||
this.app = app;
|
||||
this.actor = new St.BoxLayout({ style_class: "alt-tab-app",
|
||||
this.actor = new St.BoxLayout({ style_class: 'alt-tab-app',
|
||||
vertical: true });
|
||||
this._icon = this.app.create_icon_texture(POPUP_APPICON_SIZE);
|
||||
this.actor.add(this._icon, { x_fill: false, y_fill: false } );
|
||||
this._label = new St.Label({ text: this.app.get_name() });
|
||||
this.actor.add(this._label, { x_fill: false });
|
||||
this.icon = null;
|
||||
this._iconBin = new St.Bin();
|
||||
|
||||
this.actor.add(this._iconBin, { x_fill: false, y_fill: false } );
|
||||
this.label = new St.Label({ text: this.app.get_name() });
|
||||
this.actor.add(this.label, { x_fill: false });
|
||||
},
|
||||
|
||||
set_size: function(size) {
|
||||
this.icon = this.app.create_icon_texture(size);
|
||||
this._iconBin.set_size(size, size);
|
||||
this._iconBin.child = this.icon;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function AppSwitcher(apps) {
|
||||
this._init(apps);
|
||||
@ -636,6 +836,44 @@ AppSwitcher.prototype = {
|
||||
this._addIcon(otherIcons[i]);
|
||||
|
||||
this._curApp = -1;
|
||||
this._iconSize = 0;
|
||||
},
|
||||
|
||||
_getPreferredHeight: function (actor, forWidth, alloc) {
|
||||
let j = 0;
|
||||
let height = 0;
|
||||
|
||||
while(this._items.length > 1 && this._items[j].style_class != 'item-box') {
|
||||
j++;
|
||||
}
|
||||
let iconPadding = this._items[j].get_theme_node().get_horizontal_padding();
|
||||
let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
|
||||
let iconSpacing = iconNaturalHeight + iconPadding;
|
||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||
if (this._separator)
|
||||
totalSpacing += this._separator.width + this._list.spacing;
|
||||
|
||||
for(let i = 0; i < iconSizes.length; i++) {
|
||||
this._iconSize = iconSizes[i];
|
||||
height = iconSizes[i] + iconSpacing;
|
||||
let w = height * this._items.length + totalSpacing;
|
||||
if (w <= forWidth)
|
||||
break;
|
||||
}
|
||||
|
||||
if (this._items.length == 1) {
|
||||
this._iconSize = iconSizes[0];
|
||||
height = iconSizes[0] + iconSpacing;
|
||||
}
|
||||
|
||||
for(let i = 0; i < this.icons.length; i++) {
|
||||
if (this.icons[i].icon != null)
|
||||
break;
|
||||
this.icons[i].set_size(this._iconSize);
|
||||
}
|
||||
|
||||
alloc.min_size = height;
|
||||
alloc.natural_size = height;
|
||||
},
|
||||
|
||||
_allocate: function (actor, box, flags) {
|
||||
@ -663,16 +901,13 @@ AppSwitcher.prototype = {
|
||||
// thumbnails are visible (ie, when the app icon is supposed to be
|
||||
// in justOutline mode). Apps with multiple windows will normally
|
||||
// show a dim arrow, but show a bright arrow when they are
|
||||
// highlighted; their redraw handler will use the right color
|
||||
// based on this._curApp; we just need to do a queue_relayout() to
|
||||
// force it to redraw. (queue_redraw() doesn't work because
|
||||
// ShellDrawingArea only redraws on allocate.)
|
||||
// highlighted.
|
||||
highlight : function(n, justOutline) {
|
||||
if (this._curApp != -1) {
|
||||
if (this.icons[this._curApp].cachedWindows.length == 1)
|
||||
this._arrows[this._curApp].hide();
|
||||
else
|
||||
this._arrows[this._curApp].queue_relayout();
|
||||
this._arrows[this._curApp].remove_style_pseudo_class('highlighted');
|
||||
}
|
||||
|
||||
SwitcherList.prototype.highlight.call(this, n, justOutline);
|
||||
@ -682,7 +917,7 @@ AppSwitcher.prototype = {
|
||||
if (justOutline && this.icons[this._curApp].cachedWindows.length == 1)
|
||||
this._arrows[this._curApp].show();
|
||||
else
|
||||
this._arrows[this._curApp].queue_relayout();
|
||||
this._arrows[this._curApp].add_style_pseudo_class('highlighted');
|
||||
}
|
||||
},
|
||||
|
||||
@ -691,12 +926,10 @@ AppSwitcher.prototype = {
|
||||
this.addItem(appIcon.actor);
|
||||
|
||||
let n = this._arrows.length;
|
||||
let arrow = new St.DrawingArea();
|
||||
arrow.connect('redraw', Lang.bind(this,
|
||||
function (area, texture) {
|
||||
Shell.draw_box_pointer(texture, Shell.PointerDirection.DOWN,
|
||||
TRANSPARENT_COLOR,
|
||||
this._curApp == n ? POPUP_ARROW_COLOR : POPUP_UNFOCUSED_ARROW_COLOR);
|
||||
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);
|
||||
@ -731,44 +964,74 @@ ThumbnailList.prototype = {
|
||||
|
||||
let activeWorkspace = global.screen.get_active_workspace();
|
||||
|
||||
// We fake the value of "separatorAdded" when the app has no window
|
||||
// We fake the value of 'separatorAdded' when the app has no window
|
||||
// on the current workspace, to avoid displaying a useless separator in
|
||||
// that case.
|
||||
let separatorAdded = windows.length == 0 || windows[0].get_workspace() != activeWorkspace;
|
||||
|
||||
this._labels = new Array();
|
||||
this._thumbnailBins = new Array();
|
||||
this._clones = new Array();
|
||||
this._windows = windows;
|
||||
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
if (!separatorAdded && windows[i].get_workspace() != activeWorkspace) {
|
||||
this.addSeparator();
|
||||
separatorAdded = true;
|
||||
}
|
||||
|
||||
let mutterWindow = windows[i].get_compositor_private();
|
||||
let windowTexture = mutterWindow.get_texture ();
|
||||
let [width, height] = windowTexture.get_size();
|
||||
let scale = Math.min(1.0, THUMBNAIL_SIZE / width, THUMBNAIL_SIZE / height);
|
||||
|
||||
let box = new St.BoxLayout({ style_class: "thumbnail-box",
|
||||
let box = new St.BoxLayout({ style_class: 'thumbnail-box',
|
||||
vertical: true });
|
||||
|
||||
let bin = new St.Bin({ style_class: "thumbnail" });
|
||||
let clone = new Clutter.Clone ({ source: windowTexture,
|
||||
reactive: true,
|
||||
width: width * scale,
|
||||
height: height * scale });
|
||||
let bin = new St.Bin({ style_class: 'thumbnail' });
|
||||
|
||||
bin.add_actor(clone);
|
||||
box.add_actor(bin);
|
||||
this._thumbnailBins.push(bin);
|
||||
|
||||
let title = windows[i].get_title();
|
||||
if (title) {
|
||||
let name = new St.Label({ text: title });
|
||||
// St.Label doesn't support text-align so use a Bin
|
||||
let bin = new St.Bin({ x_align: St.Align.MIDDLE });
|
||||
this._labels.push(bin);
|
||||
bin.add_actor(name);
|
||||
box.add_actor(bin);
|
||||
}
|
||||
|
||||
this.addItem(box);
|
||||
}
|
||||
},
|
||||
|
||||
addClones : function (availHeight) {
|
||||
if (!this._thumbnailBins.length)
|
||||
return;
|
||||
let totalPadding = this._items[0].get_theme_node().get_horizontal_padding() + this._items[0].get_theme_node().get_vertical_padding();
|
||||
totalPadding += this.actor.get_theme_node().get_horizontal_padding() + this.actor.get_theme_node().get_vertical_padding();
|
||||
let [labelMinHeight, labelNaturalHeight] = this._labels[0].get_preferred_height(-1);
|
||||
let [found, spacing] = this._items[0].child.get_theme_node().get_length('spacing', false);
|
||||
if (!found)
|
||||
spacing = 0;
|
||||
|
||||
availHeight = Math.min(availHeight - labelNaturalHeight - totalPadding - spacing, THUMBNAIL_DEFAULT_SIZE);
|
||||
let binHeight = availHeight + this._items[0].get_theme_node().get_vertical_padding() + this.actor.get_theme_node().get_vertical_padding() - spacing;
|
||||
binHeight = Math.min(THUMBNAIL_DEFAULT_SIZE, binHeight);
|
||||
|
||||
for (let i = 0; i < this._thumbnailBins.length; i++) {
|
||||
let mutterWindow = this._windows[i].get_compositor_private();
|
||||
let windowTexture = mutterWindow.get_texture ();
|
||||
let [width, height] = windowTexture.get_size();
|
||||
let scale = Math.min(1.0, THUMBNAIL_DEFAULT_SIZE / width, availHeight / height);
|
||||
let clone = new Clutter.Clone ({ source: windowTexture,
|
||||
reactive: true,
|
||||
width: width * scale,
|
||||
height: height * scale });
|
||||
|
||||
this._thumbnailBins[i].set_height(binHeight);
|
||||
this._thumbnailBins[i].add_actor(clone);
|
||||
this._clones.push(clone);
|
||||
}
|
||||
|
||||
// Make sure we only do this once
|
||||
this._thumbnailBins = new Array();
|
||||
}
|
||||
};
|
||||
|
@ -3,7 +3,10 @@
|
||||
const Shell = imports.gi.Shell;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
|
||||
function AppFavorites() {
|
||||
this._init();
|
||||
@ -61,23 +64,50 @@ AppFavorites.prototype = {
|
||||
return appId in this._favorites;
|
||||
},
|
||||
|
||||
addFavorite: function(appId) {
|
||||
_addFavorite: function(appId) {
|
||||
if (appId in this._favorites)
|
||||
return;
|
||||
return false;
|
||||
|
||||
let app = Shell.AppSystem.get_default().get_app(appId);
|
||||
|
||||
if (!app)
|
||||
return;
|
||||
return false;
|
||||
|
||||
let ids = this._getIds();
|
||||
ids.push(appId);
|
||||
this._gconf.set_string_list(this.FAVORITE_APPS_KEY, ids);
|
||||
this._favorites[appId] = app;
|
||||
return true;
|
||||
},
|
||||
|
||||
addFavorite: function(appId) {
|
||||
if (!this._addFavorite(appId))
|
||||
return;
|
||||
|
||||
let app = Shell.AppSystem.get_default().get_app(appId);
|
||||
|
||||
Main.overview.infoBar.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
|
||||
this._removeFavorite(appId);
|
||||
}));
|
||||
},
|
||||
|
||||
_removeFavorite: function(appId) {
|
||||
if (!appId in this._favorites)
|
||||
return false;
|
||||
|
||||
let ids = this._getIds().filter(function (id) { return id != appId; });
|
||||
this._gconf.set_string_list(this.FAVORITE_APPS_KEY, ids);
|
||||
return true;
|
||||
},
|
||||
|
||||
removeFavorite: function(appId) {
|
||||
if (!appId in this._favorites)
|
||||
if (!this._removeFavorite(appId))
|
||||
return;
|
||||
let ids = this._getIds().filter(function (id) { return id != appId; });
|
||||
this._gconf.set_string_list(this.FAVORITE_APPS_KEY, ids);
|
||||
|
||||
Main.overview.infoBar.setMessage(_("%s has been removed from your favorites.").format(this._favorites[appId].get_name()),
|
||||
Lang.bind(this, function () {
|
||||
this._addFavorite(appId);
|
||||
}));
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(AppFavorites.prototype);
|
||||
|
591
js/ui/appIcon.js
@ -1,591 +0,0 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const GenericDisplay = imports.ui.genericDisplay;
|
||||
const AppFavorites = imports.ui.appFavorites;
|
||||
const Main = imports.ui.main;
|
||||
const Workspaces = imports.ui.workspaces;
|
||||
|
||||
const GLOW_COLOR = new Clutter.Color();
|
||||
GLOW_COLOR.from_pixel(0x4f6ba4ff);
|
||||
const GLOW_PADDING_HORIZONTAL = 3;
|
||||
const GLOW_PADDING_VERTICAL = 3;
|
||||
|
||||
const APPICON_DEFAULT_ICON_SIZE = 48;
|
||||
|
||||
const APPICON_PADDING = 1;
|
||||
const APPICON_BORDER_WIDTH = 1;
|
||||
const APPICON_CORNER_RADIUS = 4;
|
||||
|
||||
const APPICON_MENU_POPUP_TIMEOUT_MS = 600;
|
||||
|
||||
const APPICON_DEFAULT_BORDER_COLOR = new Clutter.Color();
|
||||
APPICON_DEFAULT_BORDER_COLOR.from_pixel(0x787878ff);
|
||||
const APPICON_MENU_BACKGROUND_COLOR = new Clutter.Color();
|
||||
APPICON_MENU_BACKGROUND_COLOR.from_pixel(0x292929ff);
|
||||
const APPICON_MENU_FONT = 'Sans 14px';
|
||||
const APPICON_MENU_COLOR = new Clutter.Color();
|
||||
APPICON_MENU_COLOR.from_pixel(0xffffffff);
|
||||
const APPICON_MENU_SELECTED_COLOR = new Clutter.Color();
|
||||
APPICON_MENU_SELECTED_COLOR.from_pixel(0x005b97ff);
|
||||
const APPICON_MENU_SEPARATOR_COLOR = new Clutter.Color();
|
||||
APPICON_MENU_SEPARATOR_COLOR.from_pixel(0x787878ff);
|
||||
const APPICON_MENU_BORDER_WIDTH = 1;
|
||||
const APPICON_MENU_ARROW_SIZE = 12;
|
||||
const APPICON_MENU_CORNER_RADIUS = 4;
|
||||
const APPICON_MENU_PADDING = 4;
|
||||
|
||||
const TRANSPARENT_COLOR = new Clutter.Color();
|
||||
TRANSPARENT_COLOR.from_pixel(0x00000000);
|
||||
|
||||
const MenuType = { NONE: 0, ON_RIGHT: 1, BELOW: 2 };
|
||||
|
||||
function AppIcon(params) {
|
||||
this._init(params);
|
||||
}
|
||||
|
||||
AppIcon.prototype = {
|
||||
_init : function(params) {
|
||||
this.app = params.app;
|
||||
if (!this.app)
|
||||
throw new Error('AppIcon constructor requires "app" param');
|
||||
|
||||
this._menuType = ('menuType' in params) ? params.menuType : MenuType.NONE;
|
||||
this._iconSize = ('size' in params) ? params.size : APPICON_DEFAULT_ICON_SIZE;
|
||||
this._showGlow = ('glow' in params) ? params.glow : false;
|
||||
|
||||
this.actor = new Shell.ButtonBox({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
border: APPICON_BORDER_WIDTH,
|
||||
corner_radius: APPICON_CORNER_RADIUS,
|
||||
padding: APPICON_PADDING,
|
||||
reactive: true });
|
||||
this.actor._delegate = this;
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this.highlight_border_color = APPICON_DEFAULT_BORDER_COLOR;
|
||||
|
||||
if (this._menuType != MenuType.NONE) {
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._updateMenuOnButtonPress));
|
||||
this.actor.connect('notify::hover', Lang.bind(this, this._updateMenuOnHoverChanged));
|
||||
this.actor.connect('activate', Lang.bind(this, this._updateMenuOnActivate));
|
||||
|
||||
this._menuTimeoutId = 0;
|
||||
this._menu = null;
|
||||
}
|
||||
|
||||
let iconBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
x_align: Big.BoxAlignment.CENTER,
|
||||
y_align: Big.BoxAlignment.CENTER,
|
||||
width: this._iconSize,
|
||||
height: this._iconSize });
|
||||
this.icon = this.app.create_icon_texture(this._iconSize);
|
||||
iconBox.append(this.icon, Big.BoxPackFlags.NONE);
|
||||
|
||||
this.actor.append(iconBox, Big.BoxPackFlags.EXPAND);
|
||||
|
||||
let nameBox = new Shell.GenericContainer();
|
||||
nameBox.connect('get-preferred-width', Lang.bind(this, this._nameBoxGetPreferredWidth));
|
||||
nameBox.connect('get-preferred-height', Lang.bind(this, this._nameBoxGetPreferredHeight));
|
||||
nameBox.connect('allocate', Lang.bind(this, this._nameBoxAllocate));
|
||||
this._nameBox = nameBox;
|
||||
|
||||
this._name = new St.Label({ style_class: "app-icon-label",
|
||||
text: this.app.get_name() });
|
||||
this._name.clutter_text.line_alignment = Pango.Alignment.CENTER;
|
||||
nameBox.add_actor(this._name);
|
||||
if (this._showGlow) {
|
||||
this._glowBox = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL });
|
||||
this._nameBox.add_actor(this._glowBox);
|
||||
this._glowBox.lower(this._name);
|
||||
this._appWindowChangedId = this.app.connect('windows-changed', Lang.bind(this, this._rerenderGlow));
|
||||
this._rerenderGlow();
|
||||
} else {
|
||||
this._glowBox = null;
|
||||
this._appWindowChangedId = 0;
|
||||
}
|
||||
|
||||
this.actor.append(nameBox, Big.BoxPackFlags.NONE);
|
||||
},
|
||||
|
||||
_nameBoxGetPreferredWidth: function (nameBox, forHeight, alloc) {
|
||||
let [min, natural] = this._name.get_preferred_width(forHeight);
|
||||
alloc.min_size = min + GLOW_PADDING_HORIZONTAL * 2;
|
||||
alloc.natural_size = natural + GLOW_PADDING_HORIZONTAL * 2;
|
||||
},
|
||||
|
||||
_nameBoxGetPreferredHeight: function (nameBox, forWidth, alloc) {
|
||||
let [min, natural] = this._name.get_preferred_height(forWidth);
|
||||
alloc.min_size = min + GLOW_PADDING_VERTICAL * 2;
|
||||
alloc.natural_size = natural + GLOW_PADDING_VERTICAL * 2;
|
||||
},
|
||||
|
||||
_nameBoxAllocate: function (nameBox, box, flags) {
|
||||
let childBox = new Clutter.ActorBox();
|
||||
let [minWidth, naturalWidth] = this._name.get_preferred_width(-1);
|
||||
let [minHeight, naturalHeight] = this._name.get_preferred_height(-1);
|
||||
let availWidth = box.x2 - box.x1;
|
||||
let availHeight = box.y2 - box.y1;
|
||||
let targetWidth = availWidth;
|
||||
let xPadding = 0;
|
||||
if (naturalWidth < availWidth) {
|
||||
xPadding = Math.floor((availWidth - naturalWidth) / 2);
|
||||
}
|
||||
childBox.x1 = xPadding;
|
||||
childBox.x2 = availWidth - xPadding;
|
||||
childBox.y1 = GLOW_PADDING_VERTICAL;
|
||||
childBox.y2 = availHeight - GLOW_PADDING_VERTICAL;
|
||||
this._name.allocate(childBox, flags);
|
||||
|
||||
// Now the glow
|
||||
if (this._glowBox != null) {
|
||||
let glowPaddingHoriz = Math.max(0, xPadding - GLOW_PADDING_HORIZONTAL);
|
||||
glowPaddingHoriz = Math.max(GLOW_PADDING_HORIZONTAL, glowPaddingHoriz);
|
||||
childBox.x1 = glowPaddingHoriz;
|
||||
childBox.x2 = availWidth - glowPaddingHoriz;
|
||||
childBox.y1 = 0;
|
||||
childBox.y2 = availHeight;
|
||||
this._glowBox.allocate(childBox, flags);
|
||||
}
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
if (this._appWindowChangedId > 0)
|
||||
this.app.disconnect(this._appWindowChangedId);
|
||||
},
|
||||
|
||||
_rerenderGlow: function() {
|
||||
if (!this._showGlow)
|
||||
return;
|
||||
this._glowBox.get_children().forEach(function (a) { a.destroy(); });
|
||||
let glowPath = GLib.filename_to_uri(global.imagedir + 'app-well-glow.png', '');
|
||||
let windows = this.app.get_windows();
|
||||
for (let i = 0; i < windows.length && i < 3; i++) {
|
||||
let glow = Shell.TextureCache.get_default().load_uri_sync(Shell.TextureCachePolicy.FOREVER,
|
||||
glowPath, -1, -1);
|
||||
glow.keep_aspect_ratio = false;
|
||||
this._glowBox.append(glow, Big.BoxPackFlags.EXPAND);
|
||||
}
|
||||
},
|
||||
|
||||
// AppIcon itself is not a draggable, but if you want to make
|
||||
// a subclass of it draggable, you can use this method to create
|
||||
// a drag actor
|
||||
createDragActor: function() {
|
||||
return this.app.create_icon_texture(this._iconSize);
|
||||
},
|
||||
|
||||
setHighlight: function(highlight) {
|
||||
if (highlight) {
|
||||
this.actor.border_color = this.highlight_border_color;
|
||||
} else {
|
||||
this.actor.border_color = TRANSPARENT_COLOR;
|
||||
}
|
||||
},
|
||||
|
||||
_updateMenuOnActivate: function(actor, event) {
|
||||
if (this._menuTimeoutId != 0) {
|
||||
Mainloop.source_remove(this._menuTimeoutId);
|
||||
this._menuTimeoutId = 0;
|
||||
}
|
||||
this.emit('activate');
|
||||
return false;
|
||||
},
|
||||
|
||||
_updateMenuOnHoverChanged: function() {
|
||||
if (!this.actor.hover && this._menuTimeoutId != 0) {
|
||||
Mainloop.source_remove(this._menuTimeoutId);
|
||||
this._menuTimeoutId = 0;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
_updateMenuOnButtonPress: function(actor, event) {
|
||||
let button = event.get_button();
|
||||
if (button == 1) {
|
||||
if (this._menuTimeoutId != 0)
|
||||
Mainloop.source_remove(this._menuTimeoutId);
|
||||
this._menuTimeoutId = Mainloop.timeout_add(APPICON_MENU_POPUP_TIMEOUT_MS,
|
||||
Lang.bind(this, function () { this.popupMenu(button); }));
|
||||
} else if (button == 3) {
|
||||
this.popupMenu(button);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
popupMenu: function(activatingButton) {
|
||||
if (this._menuTimeoutId != 0) {
|
||||
Mainloop.source_remove(this._menuTimeoutId);
|
||||
this._menuTimeoutId = 0;
|
||||
}
|
||||
|
||||
this.actor.fake_release();
|
||||
|
||||
if (!this._menu) {
|
||||
this._menu = new AppIconMenu(this, this._menuType);
|
||||
this._menu.connect('highlight-window', Lang.bind(this, function (menu, window) {
|
||||
this.highlightWindow(window);
|
||||
}));
|
||||
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)
|
||||
this.menuPoppedUp();
|
||||
else
|
||||
this.menuPoppedDown();
|
||||
}));
|
||||
}
|
||||
|
||||
this._menu.popup(activatingButton);
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
// Default implementations; AppDisplay.RunningWellItem overrides these
|
||||
highlightWindow: function(window) {
|
||||
this.emit('highlight-window', window);
|
||||
},
|
||||
|
||||
activateWindow: function(window) {
|
||||
this.emit('activate-window', window);
|
||||
},
|
||||
|
||||
menuPoppedUp: function() {
|
||||
this.emit('menu-popped-up', this._menu);
|
||||
},
|
||||
|
||||
menuPoppedDown: function() {
|
||||
this.emit('menu-popped-down', this._menu);
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(AppIcon.prototype);
|
||||
|
||||
function AppIconMenu(source, type) {
|
||||
this._init(source, type);
|
||||
}
|
||||
|
||||
AppIconMenu.prototype = {
|
||||
_init: function(source, type) {
|
||||
this._source = source;
|
||||
this._type = type;
|
||||
|
||||
this.actor = new Shell.GenericContainer({ 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._windowContainer = new Shell.Menu({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
border_color: source.highlight_border_color,
|
||||
border: APPICON_MENU_BORDER_WIDTH,
|
||||
background_color: APPICON_MENU_BACKGROUND_COLOR,
|
||||
padding: 4,
|
||||
corner_radius: APPICON_MENU_CORNER_RADIUS,
|
||||
width: Main.overview._dash.actor.width * 0.75 });
|
||||
this._windowContainer.connect('unselected', Lang.bind(this, this._onItemUnselected));
|
||||
this._windowContainer.connect('selected', Lang.bind(this, this._onItemSelected));
|
||||
this._windowContainer.connect('cancelled', Lang.bind(this, this._onWindowSelectionCancelled));
|
||||
this._windowContainer.connect('activate', Lang.bind(this, this._onItemActivate));
|
||||
this.actor.add_actor(this._windowContainer);
|
||||
|
||||
// Stay popped up on release over application icon
|
||||
this._windowContainer.set_persistent_source(this._source.actor);
|
||||
|
||||
// Intercept events while the menu has the pointer grab to do window-related effects
|
||||
this._windowContainer.connect('enter-event', Lang.bind(this, this._onMenuEnter));
|
||||
this._windowContainer.connect('leave-event', Lang.bind(this, this._onMenuLeave));
|
||||
this._windowContainer.connect('button-release-event', Lang.bind(this, this._onMenuButtonRelease));
|
||||
|
||||
this._arrow = new St.DrawingArea();
|
||||
this._arrow.connect('redraw', Lang.bind(this, function (area, texture) {
|
||||
Shell.draw_box_pointer(texture,
|
||||
this._type == MenuType.ON_RIGHT ? Shell.PointerDirection.LEFT : Shell.PointerDirection.UP,
|
||||
source.highlight_border_color,
|
||||
APPICON_MENU_BACKGROUND_COLOR);
|
||||
}));
|
||||
this.actor.add_actor(this._arrow);
|
||||
|
||||
// Chain our visibility and lifecycle to that of the source
|
||||
source.actor.connect('notify::mapped', Lang.bind(this, function () {
|
||||
if (!source.actor.mapped)
|
||||
this._windowContainer.popdown();
|
||||
}));
|
||||
source.actor.connect('destroy', Lang.bind(this, function () { this.actor.destroy(); }));
|
||||
|
||||
global.stage.add_actor(this.actor);
|
||||
},
|
||||
|
||||
_getPreferredWidth: function(actor, forHeight, alloc) {
|
||||
let [min, natural] = this._windowContainer.get_preferred_width(forHeight);
|
||||
if (this._type == MenuType.ON_RIGHT) {
|
||||
min += APPICON_MENU_ARROW_SIZE;
|
||||
natural += APPICON_MENU_ARROW_SIZE;
|
||||
}
|
||||
alloc.min_size = min;
|
||||
alloc.natural_size = natural;
|
||||
},
|
||||
|
||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||
let [min, natural] = this._windowContainer.get_preferred_height(forWidth);
|
||||
if (this._type == MenuType.BELOW) {
|
||||
min += APPICON_MENU_ARROW_SIZE;
|
||||
natural += APPICON_MENU_ARROW_SIZE;
|
||||
}
|
||||
alloc.min_size = min;
|
||||
alloc.natural_size = natural;
|
||||
},
|
||||
|
||||
_allocate: function(actor, box, flags) {
|
||||
let childBox = new Clutter.ActorBox();
|
||||
|
||||
let width = box.x2 - box.x1;
|
||||
let height = box.y2 - box.y1;
|
||||
|
||||
if (this._type == MenuType.ON_RIGHT) {
|
||||
childBox.x1 = 0;
|
||||
childBox.x2 = APPICON_MENU_ARROW_SIZE;
|
||||
childBox.y1 = Math.floor((height / 2) - (APPICON_MENU_ARROW_SIZE / 2));
|
||||
childBox.y2 = childBox.y1 + APPICON_MENU_ARROW_SIZE;
|
||||
this._arrow.allocate(childBox, flags);
|
||||
|
||||
childBox.x1 = APPICON_MENU_ARROW_SIZE - APPICON_MENU_BORDER_WIDTH;
|
||||
childBox.x2 = width;
|
||||
childBox.y1 = 0;
|
||||
childBox.y2 = height;
|
||||
this._windowContainer.allocate(childBox, flags);
|
||||
} else /* MenuType.BELOW */ {
|
||||
childBox.x1 = Math.floor((width / 2) - (APPICON_MENU_ARROW_SIZE / 2));
|
||||
childBox.x2 = childBox.x1 + APPICON_MENU_ARROW_SIZE;
|
||||
childBox.y1 = 0;
|
||||
childBox.y2 = APPICON_MENU_ARROW_SIZE;
|
||||
this._arrow.allocate(childBox, flags);
|
||||
|
||||
childBox.x1 = 0;
|
||||
childBox.x2 = width;
|
||||
childBox.y1 = APPICON_MENU_ARROW_SIZE - APPICON_MENU_BORDER_WIDTH;
|
||||
childBox.y2 = height;
|
||||
this._windowContainer.allocate(childBox, flags);
|
||||
}
|
||||
},
|
||||
|
||||
_redisplay: function() {
|
||||
this._windowContainer.remove_all();
|
||||
|
||||
let windows = this._source.app.get_windows();
|
||||
|
||||
this._windowContainer.show();
|
||||
|
||||
let iconsDiffer = false;
|
||||
let texCache = Shell.TextureCache.get_default();
|
||||
if (windows.length > 0) {
|
||||
let firstIcon = windows[0].mini_icon;
|
||||
for (let i = 1; i < windows.length; i++) {
|
||||
if (!texCache.pixbuf_equal(windows[i].mini_icon, firstIcon)) {
|
||||
iconsDiffer = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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 icon = null;
|
||||
if (iconsDiffer)
|
||||
icon = Shell.TextureCache.get_default().bind_pixbuf_property(windows[i], "mini-icon");
|
||||
|
||||
let box = this._appendMenuItem(icon, windows[i].title);
|
||||
box._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(null, _("New Window")) : null;
|
||||
|
||||
if (windows.length > 0)
|
||||
this._appendSeparator();
|
||||
this._toggleFavoriteMenuItem = this._appendMenuItem(null, isFavorite ? _("Remove from Favorites")
|
||||
: _("Add to Favorites"));
|
||||
|
||||
this._highlightedItem = null;
|
||||
},
|
||||
|
||||
_appendSeparator: function () {
|
||||
let box = new Big.Box({ padding_top: 2, padding_bottom: 2 });
|
||||
box.append(new Clutter.Rectangle({ height: 1,
|
||||
color: APPICON_MENU_SEPARATOR_COLOR }),
|
||||
Big.BoxPackFlags.EXPAND);
|
||||
this._windowContainer.append_separator(box, Big.BoxPackFlags.NONE);
|
||||
},
|
||||
|
||||
_appendMenuItem: function(iconTexture, labelText) {
|
||||
/* Use padding here rather than spacing in the box above so that
|
||||
* we have a larger reactive area.
|
||||
*/
|
||||
let box = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
padding_top: 4,
|
||||
padding_bottom: 4,
|
||||
spacing: 4,
|
||||
reactive: true });
|
||||
let vCenter;
|
||||
if (iconTexture != null) {
|
||||
vCenter = new Big.Box({ y_align: Big.BoxAlignment.CENTER });
|
||||
vCenter.append(iconTexture, Big.BoxPackFlags.NONE);
|
||||
box.append(vCenter, Big.BoxPackFlags.NONE);
|
||||
}
|
||||
vCenter = new Big.Box({ y_align: Big.BoxAlignment.CENTER });
|
||||
let label = new Clutter.Text({ text: labelText,
|
||||
font_name: APPICON_MENU_FONT,
|
||||
ellipsize: Pango.EllipsizeMode.END,
|
||||
color: APPICON_MENU_COLOR });
|
||||
vCenter.append(label, Big.BoxPackFlags.NONE);
|
||||
box.append(vCenter, Big.BoxPackFlags.NONE);
|
||||
this._windowContainer.append(box, Big.BoxPackFlags.NONE);
|
||||
return box;
|
||||
},
|
||||
|
||||
popup: function(activatingButton) {
|
||||
let [stageX, stageY] = this._source.actor.get_transformed_position();
|
||||
let [stageWidth, stageHeight] = this._source.actor.get_transformed_size();
|
||||
|
||||
this._redisplay();
|
||||
|
||||
this._windowContainer.popup(activatingButton, global.get_current_time());
|
||||
|
||||
this.emit('popup', true);
|
||||
|
||||
let x, y;
|
||||
if (this._type == MenuType.ON_RIGHT) {
|
||||
x = Math.floor(stageX + stageWidth);
|
||||
y = Math.floor(stageY + (stageHeight / 2) - (this.actor.height / 2));
|
||||
} else {
|
||||
x = Math.floor(stageX + (stageWidth / 2) - (this.actor.width / 2));
|
||||
y = Math.floor(stageY + stageHeight);
|
||||
}
|
||||
|
||||
this.actor.set_position(x, y);
|
||||
this.actor.show();
|
||||
},
|
||||
|
||||
popdown: function() {
|
||||
this._windowContainer.popdown();
|
||||
this.emit('popup', false);
|
||||
this.actor.hide();
|
||||
},
|
||||
|
||||
selectWindow: function(metaWindow) {
|
||||
this._selectMenuItemForWindow(metaWindow);
|
||||
},
|
||||
|
||||
_findMetaWindowForActor: function (actor) {
|
||||
if (actor._delegate instanceof Workspaces.WindowClone)
|
||||
return actor._delegate.metaWindow;
|
||||
else if (actor.get_meta_window)
|
||||
return actor.get_meta_window();
|
||||
return null;
|
||||
},
|
||||
|
||||
// This function is called while the menu has a pointer grab; what we want
|
||||
// to do is see if the mouse was released over a window representation
|
||||
_onMenuButtonRelease: function (actor, event) {
|
||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
||||
if (metaWindow) {
|
||||
this.emit('activate-window', metaWindow);
|
||||
}
|
||||
},
|
||||
|
||||
_updateHighlight: function (item) {
|
||||
if (this._highlightedItem) {
|
||||
this._highlightedItem.background_color = TRANSPARENT_COLOR;
|
||||
this.emit('highlight-window', null);
|
||||
}
|
||||
this._highlightedItem = item;
|
||||
if (this._highlightedItem) {
|
||||
this._highlightedItem.background_color = APPICON_MENU_SELECTED_COLOR;
|
||||
let window = this._highlightedItem._window;
|
||||
if (window)
|
||||
this.emit('highlight-window', window);
|
||||
}
|
||||
},
|
||||
|
||||
_selectMenuItemForWindow: function (metaWindow) {
|
||||
let children = this._windowContainer.get_children();
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let child = children[i];
|
||||
let menuMetaWindow = child._window;
|
||||
if (menuMetaWindow == metaWindow)
|
||||
this._updateHighlight(child);
|
||||
}
|
||||
},
|
||||
|
||||
// Called while menu has a pointer grab
|
||||
_onMenuEnter: function (actor, event) {
|
||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
||||
if (metaWindow) {
|
||||
this._selectMenuItemForWindow(metaWindow);
|
||||
}
|
||||
},
|
||||
|
||||
// Called while menu has a pointer grab
|
||||
_onMenuLeave: function (actor, event) {
|
||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
||||
if (metaWindow) {
|
||||
this._updateHighlight(null);
|
||||
}
|
||||
},
|
||||
|
||||
_onItemUnselected: function (actor, child) {
|
||||
this._updateHighlight(null);
|
||||
},
|
||||
|
||||
_onItemSelected: function (actor, child) {
|
||||
this._updateHighlight(child);
|
||||
},
|
||||
|
||||
_onItemActivate: function (actor, child) {
|
||||
if (child._window) {
|
||||
let metaWindow = child._window;
|
||||
this.emit('activate-window', metaWindow);
|
||||
} else if (child == this._newWindowMenuItem) {
|
||||
this._source.app.launch();
|
||||
this.emit('activate-window', null);
|
||||
} 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.popdown();
|
||||
},
|
||||
|
||||
_onWindowSelectionCancelled: function () {
|
||||
this.emit('highlight-window', null);
|
||||
this.popdown();
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(AppIconMenu.prototype);
|
164
js/ui/boxpointer.js
Normal file
@ -0,0 +1,164 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Cairo = imports.cairo;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
/**
|
||||
* BoxPointer:
|
||||
* @side: A St.Side type; currently only St.Side.TOP is implemented
|
||||
* @binProperties: Properties to set on contained bin
|
||||
*
|
||||
* An actor which displays a triangle "arrow" pointing to a given
|
||||
* side. The .bin property is a container in which content can be
|
||||
* placed. The arrow position may be controlled via setArrowOrigin().
|
||||
*
|
||||
*/
|
||||
function BoxPointer(side, binProperties) {
|
||||
this._init(side, binProperties);
|
||||
}
|
||||
|
||||
BoxPointer.prototype = {
|
||||
_init: function(arrowSide, binProperties) {
|
||||
if (arrowSide != St.Side.TOP)
|
||||
throw new Error('Not implemented');
|
||||
this._arrowSide = arrowSide;
|
||||
this._arrowOrigin = 0;
|
||||
this.actor = new St.Bin({ x_fill: true,
|
||||
y_fill: true });
|
||||
this._container = new Shell.GenericContainer();
|
||||
this.actor.set_child(this._container);
|
||||
this._container.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
|
||||
this._container.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
|
||||
this._container.connect('allocate', Lang.bind(this, this._allocate));
|
||||
this.bin = new St.Bin(binProperties);
|
||||
this._container.add_actor(this.bin);
|
||||
this._border = new St.DrawingArea();
|
||||
this._border.connect('repaint', Lang.bind(this, this._drawBorder));
|
||||
this._container.add_actor(this._border);
|
||||
this.bin.raise(this._border);
|
||||
},
|
||||
|
||||
_adjustAllocationForArrow: function(isWidth, alloc) {
|
||||
let themeNode = this.actor.get_theme_node();
|
||||
let found, borderWidth, base, rise;
|
||||
[found, borderWidth] = themeNode.get_length('-arrow-border-width', false);
|
||||
alloc.min_size += borderWidth * 2;
|
||||
alloc.natural_size += borderWidth * 2;
|
||||
if ((!isWidth && (this._arrowSide == St.Side.TOP || this._arrowSide == St.Side.BOTTOM))
|
||||
|| (isWidth && (this._arrowSide == St.Side.LEFT || this._arrowSide == St.Side.RIGHT))) {
|
||||
let [found, rise] = themeNode.get_length('-arrow-rise', false);
|
||||
alloc.min_size += rise;
|
||||
alloc.natural_size += rise;
|
||||
}
|
||||
},
|
||||
|
||||
_getPreferredWidth: function(actor, forHeight, alloc) {
|
||||
let [minInternalSize, natInternalSize] = this.bin.get_preferred_width(forHeight);
|
||||
alloc.min_size = minInternalSize;
|
||||
alloc.natural_size = natInternalSize;
|
||||
this._adjustAllocationForArrow(true, alloc);
|
||||
},
|
||||
|
||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||
let [minSize, naturalSize] = this.bin.get_preferred_height(forWidth);
|
||||
alloc.min_size = minSize;
|
||||
alloc.natural_size = naturalSize;
|
||||
this._adjustAllocationForArrow(false, alloc);
|
||||
},
|
||||
|
||||
_allocate: function(actor, box, flags) {
|
||||
let themeNode = this.actor.get_theme_node();
|
||||
let found, borderWidth, borderRadius, rise, base;
|
||||
[found, borderWidth] = themeNode.get_length('-arrow-border-width', false);
|
||||
[found, rise] = themeNode.get_length('-arrow-rise', false);
|
||||
let childBox = new Clutter.ActorBox();
|
||||
let availWidth = box.x2 - box.x1;
|
||||
let availHeight = box.y2 - box.y1;
|
||||
|
||||
childBox.x1 = 0;
|
||||
childBox.y1 = 0;
|
||||
childBox.x2 = availWidth;
|
||||
childBox.y2 = availHeight;
|
||||
this._border.allocate(childBox, flags);
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
childBox.x1 = borderWidth;
|
||||
childBox.y1 = rise + borderWidth;
|
||||
childBox.x2 = availWidth - borderWidth;
|
||||
childBox.y2 = availHeight - borderWidth;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
this.bin.allocate(childBox, flags);
|
||||
},
|
||||
|
||||
_drawBorder: function(area) {
|
||||
let themeNode = this.actor.get_theme_node();
|
||||
|
||||
let found, borderWidth, borderRadius, rise, base;
|
||||
[found, borderWidth] = themeNode.get_length('-arrow-border-width', false);
|
||||
[found, base] = themeNode.get_length('-arrow-base', false);
|
||||
[found, rise] = themeNode.get_length('-arrow-rise', false);
|
||||
[found, borderRadius] = themeNode.get_length('-arrow-border-radius', false);
|
||||
|
||||
let halfBorder = borderWidth / 2;
|
||||
|
||||
let borderColor = new Clutter.Color();
|
||||
themeNode.get_color('-arrow-border-color', false, borderColor);
|
||||
let backgroundColor = new Clutter.Color();
|
||||
themeNode.get_color('-arrow-background-color', false, backgroundColor);
|
||||
|
||||
let [width, height] = area.get_surface_size();
|
||||
let [boxWidth, boxHeight] = [width, height];
|
||||
if (this._arrowSide == St.Side.TOP || this._arrowSide == St.Side.BOTTOM) {
|
||||
boxHeight -= rise;
|
||||
} else {
|
||||
boxWidth -= rise;
|
||||
}
|
||||
let cr = area.get_context();
|
||||
Clutter.cairo_set_source_color(cr, borderColor);
|
||||
if (this._arrowSide == St.Side.TOP) {
|
||||
cr.translate(0, rise);
|
||||
}
|
||||
cr.moveTo(borderRadius, halfBorder);
|
||||
if (this._arrowSide == St.Side.TOP) {
|
||||
cr.translate(0, -rise);
|
||||
let halfBase = Math.floor(base/2);
|
||||
cr.lineTo(this._arrowOrigin - halfBase, rise + halfBorder);
|
||||
cr.lineTo(this._arrowOrigin, halfBorder);
|
||||
cr.lineTo(this._arrowOrigin + halfBase, rise + halfBorder);
|
||||
cr.translate(0, rise);
|
||||
}
|
||||
cr.lineTo(boxWidth - borderRadius, halfBorder);
|
||||
cr.arc(boxWidth - borderRadius - halfBorder, borderRadius + halfBorder, borderRadius,
|
||||
3*Math.PI/2, Math.PI*2);
|
||||
cr.lineTo(boxWidth - halfBorder, boxHeight - borderRadius);
|
||||
cr.arc(boxWidth - borderRadius - halfBorder, boxHeight - borderRadius - halfBorder, borderRadius,
|
||||
0, Math.PI/2);
|
||||
cr.lineTo(borderRadius, boxHeight - halfBorder);
|
||||
cr.arc(borderRadius + halfBorder, boxHeight - borderRadius - halfBorder, borderRadius,
|
||||
Math.PI/2, Math.PI);
|
||||
cr.lineTo(halfBorder, borderRadius);
|
||||
cr.arc(borderRadius + halfBorder, borderRadius + halfBorder, borderRadius,
|
||||
Math.PI, 3*Math.PI/2);
|
||||
Clutter.cairo_set_source_color(cr, backgroundColor);
|
||||
cr.fillPreserve();
|
||||
Clutter.cairo_set_source_color(cr, borderColor);
|
||||
cr.setLineWidth(borderWidth);
|
||||
cr.stroke();
|
||||
},
|
||||
|
||||
// @origin: Coordinate specifying middle of the arrow, along
|
||||
// the Y axis for St.Side.LEFT, St.Side.RIGHT from the top and X axis from
|
||||
// the left for St.Side.TOP and St.Side.BOTTOM.
|
||||
setArrowOrigin: function(origin) {
|
||||
if (this._arrowOrigin != origin) {
|
||||
this._arrowOrigin = origin;
|
||||
this._border.queue_repaint();
|
||||
}
|
||||
}
|
||||
};
|
@ -16,7 +16,7 @@ function _sameDay(dateA, dateB) {
|
||||
|
||||
function Calendar() {
|
||||
this._init();
|
||||
};
|
||||
}
|
||||
|
||||
Calendar.prototype = {
|
||||
_init: function() {
|
||||
@ -24,27 +24,27 @@ Calendar.prototype = {
|
||||
// GTK+ by preference uses nl_langinfo (NL_TIME_FIRST_WEEKDAY). We probably
|
||||
// should add a C function so we can do the full handling.
|
||||
this._weekStart = NaN;
|
||||
let weekStartString = Gettext_gtk20.gettext("calendar:week_start:0");
|
||||
if (weekStartString.indexOf("calendar:week_start:") == 0) {
|
||||
let weekStartString = Gettext_gtk20.gettext('calendar:week_start:0');
|
||||
if (weekStartString.indexOf('calendar:week_start:') == 0) {
|
||||
this._weekStart = parseInt(weekStartString.substring(20));
|
||||
}
|
||||
|
||||
if (isNaN(this._weekStart) || this._weekStart < 0 || this._weekStart > 6) {
|
||||
log("Translation of 'calendar:week_start:0' in GTK+ is not correct");
|
||||
this.weekStart = 0;
|
||||
log('Translation of "calendar:week_start:0" in GTK+ is not correct');
|
||||
this._weekStart = 0;
|
||||
}
|
||||
|
||||
// Find the ordering for month/year in the calendar heading
|
||||
switch (Gettext_gtk20.gettext("calendar:MY")) {
|
||||
case "calendar:MY":
|
||||
this._headerFormat = "%B %Y";
|
||||
switch (Gettext_gtk20.gettext('calendar:MY')) {
|
||||
case 'calendar:MY':
|
||||
this._headerFormat = '%B %Y';
|
||||
break;
|
||||
case "calendar:YM":
|
||||
this._headerFormat = "%Y %B";
|
||||
case 'calendar:YM':
|
||||
this._headerFormat = '%Y %B';
|
||||
break;
|
||||
default:
|
||||
log("Translation of 'calendar:MY' in GTK+ is not correct");
|
||||
this._headerFormat = "%B %Y";
|
||||
log('Translation of "calendar:MY" in GTK+ is not correct');
|
||||
this._headerFormat = '%B %Y';
|
||||
break;
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ Calendar.prototype = {
|
||||
this.date = new Date();
|
||||
|
||||
this.actor = new St.Table({ homogeneous: false,
|
||||
style_class: "calendar",
|
||||
style_class: 'calendar',
|
||||
reactive: true });
|
||||
|
||||
this.actor.connect('scroll-event',
|
||||
@ -63,16 +63,21 @@ Calendar.prototype = {
|
||||
this.actor.add(this._topBox,
|
||||
{ row: 0, col: 0, col_span: 7 });
|
||||
|
||||
let back = new St.Button({ label: "<", style_class: 'calendar-change-month' });
|
||||
let [backlabel, forwardlabel] = ['<', '>'];
|
||||
if (St.Widget.get_default_direction () == St.TextDirection.RTL) {
|
||||
[backlabel, forwardlabel] = [forwardlabel, backlabel];
|
||||
}
|
||||
|
||||
let back = new St.Button({ label: backlabel, style_class: 'calendar-change-month' });
|
||||
this._topBox.add(back);
|
||||
back.connect("clicked", Lang.bind(this, this._prevMonth));
|
||||
back.connect('clicked', Lang.bind(this, this._prevMonth));
|
||||
|
||||
this._dateLabel = new St.Label();
|
||||
this._topBox.add(this._dateLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE });
|
||||
|
||||
let forward = new St.Button({ label: ">", style_class: 'calendar-change-month' });
|
||||
let forward = new St.Button({ label: forwardlabel, style_class: 'calendar-change-month' });
|
||||
this._topBox.add(forward);
|
||||
forward.connect("clicked", Lang.bind(this, this._nextMonth));
|
||||
forward.connect('clicked', Lang.bind(this, this._nextMonth));
|
||||
|
||||
// We need to figure out the abbreviated localized names for the days of the week;
|
||||
// we do this by just getting the next 7 days starting from right now and then putting
|
||||
@ -81,10 +86,10 @@ Calendar.prototype = {
|
||||
iter.setSeconds(0); // Leap second protection. Hah!
|
||||
iter.setHours(12);
|
||||
for (let i = 0; i < 7; i++) {
|
||||
this.actor.add(new St.Label({ text: iter.toLocaleFormat("%a") }),
|
||||
this.actor.add(new St.Label({ text: iter.toLocaleFormat('%a') }),
|
||||
{ row: 1,
|
||||
col: (7 + iter.getDay() - this._weekStart) % 7,
|
||||
x_fill: false, x_align: 1.0 });
|
||||
x_fill: false, x_align: St.Align.END });
|
||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||
}
|
||||
|
||||
@ -156,14 +161,14 @@ Calendar.prototype = {
|
||||
while (true) {
|
||||
let label = new St.Label({ text: iter.getDate().toString() });
|
||||
if (_sameDay(now, iter))
|
||||
label.style_class = "calendar-day calendar-today";
|
||||
label.style_class = 'calendar-day calendar-today';
|
||||
else if (iter.getMonth() != this.date.getMonth())
|
||||
label.style_class = "calendar-day calendar-other-month-day";
|
||||
label.style_class = 'calendar-day calendar-other-month-day';
|
||||
else
|
||||
label.style_class = "calendar-day";
|
||||
label.style_class = 'calendar-day';
|
||||
this.actor.add(label,
|
||||
{ row: row, col: (7 + iter.getDay() - this._weekStart) % 7,
|
||||
x_fill: false, x_align: 1.0 });
|
||||
x_fill: false, x_align: St.Align.END });
|
||||
|
||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||
if (iter.getDay() == this._weekStart) {
|
||||
|
166
js/ui/chrome.js
@ -5,6 +5,7 @@ const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
@ -13,6 +14,19 @@ const Params = imports.misc.params;
|
||||
// normal mode (ie, outside the Overview), that surrounds the main
|
||||
// workspace content.
|
||||
|
||||
const Visibility = {
|
||||
FULL: 1,
|
||||
FULLSCREEN: 2,
|
||||
OVERVIEW: 3
|
||||
};
|
||||
|
||||
const defaultParams = {
|
||||
visibleInOverview: false,
|
||||
visibleInFullscreen: false,
|
||||
affectsStruts: true,
|
||||
affectsInputRegion: true
|
||||
};
|
||||
|
||||
function Chrome() {
|
||||
this._init();
|
||||
}
|
||||
@ -20,12 +34,13 @@ function Chrome() {
|
||||
Chrome.prototype = {
|
||||
_init: function() {
|
||||
// The group itself has zero size so it doesn't interfere with DND
|
||||
this.actor = new Clutter.Group({ width: 0, height: 0 });
|
||||
global.stage.add_actor(this.actor);
|
||||
this.nonOverviewActor = new Clutter.Group();
|
||||
this.actor.add_actor(this.nonOverviewActor);
|
||||
this.actor = new Shell.GenericContainer({ width: 0, height: 0 });
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
this.actor.connect('allocate', Lang.bind(this, this._allocated));
|
||||
|
||||
this._obscuredByFullscreen = false;
|
||||
this._inFullscreen = false;
|
||||
this._inOverview = false;
|
||||
this.visibility = Visibility.FULL;
|
||||
|
||||
this._trackedActors = [];
|
||||
|
||||
@ -44,6 +59,12 @@ Chrome.prototype = {
|
||||
this._queueUpdateRegions();
|
||||
},
|
||||
|
||||
_allocated: function(actor, box, flags) {
|
||||
let children = this.actor.get_children();
|
||||
for (let i = 0; i < children.length; i++)
|
||||
children[i].allocate_preferred_size(flags);
|
||||
},
|
||||
|
||||
_verifyAncestry: function(actor, ancestor) {
|
||||
while (actor) {
|
||||
if (actor == ancestor)
|
||||
@ -67,19 +88,15 @@ Chrome.prototype = {
|
||||
//
|
||||
// If %visibleInOverview is %true in @params, @actor will remain
|
||||
// visible when the overview is brought up. Otherwise it will
|
||||
// automatically be hidden. If %affectsStruts or %affectsInputRegion
|
||||
// is %false, the actor will not have the indicated effect.
|
||||
// automatically be hidden. Likewise, if %visibleInFullscreen is
|
||||
// %true, the actor will be visible even when a fullscreen window
|
||||
// should be covering it.
|
||||
//
|
||||
// If %affectsStruts or %affectsInputRegion is %false, the actor
|
||||
// will not have the indicated effect.
|
||||
addActor: function(actor, params) {
|
||||
params = Params.parse(params, { visibleInOverview: false,
|
||||
affectsStruts: true,
|
||||
affectsInputRegion: true });
|
||||
|
||||
if (params.visibleInOverview)
|
||||
this.actor.add_actor(actor);
|
||||
else
|
||||
this.nonOverviewActor.add_actor(actor);
|
||||
|
||||
this._trackActor(actor, params.affectsInputRegion, params.affectsStruts);
|
||||
this.actor.add_actor(actor);
|
||||
this._trackActor(actor, params);
|
||||
},
|
||||
|
||||
// trackActor:
|
||||
@ -89,13 +106,32 @@ Chrome.prototype = {
|
||||
// Tells the chrome to track @actor, which must be a descendant
|
||||
// of an actor added via addActor(). This can be used to extend the
|
||||
// struts or input region to cover specific children.
|
||||
//
|
||||
// @params can have any of the same values as in addActor(), though
|
||||
// some possibilities don't make sense (eg, trying to have a
|
||||
// %visibleInOverview child of a non-%visibleInOverview parent).
|
||||
// By default, @actor has the same params as its chrome ancestor.
|
||||
trackActor: function(actor, params) {
|
||||
if (!this._verifyAncestry(actor, this.actor))
|
||||
let ancestor = actor.get_parent();
|
||||
let index = this._findActor(ancestor);
|
||||
while (ancestor && index == -1) {
|
||||
ancestor = ancestor.get_parent();
|
||||
index = this._findActor(ancestor);
|
||||
}
|
||||
if (!ancestor)
|
||||
throw new Error('actor is not a descendent of the chrome layer');
|
||||
|
||||
params = Params.parse(params, { affectsStruts: true,
|
||||
affectsInputRegion: true });
|
||||
this._trackActor(actor, params.affectsInputRegion, params.affectsStruts);
|
||||
let ancestorData = this._trackedActors[index];
|
||||
if (!params)
|
||||
params = {};
|
||||
// We can't use Params.parse here because we want to drop
|
||||
// the extra values like ancestorData.actor
|
||||
for (let prop in defaultParams) {
|
||||
if (!params[prop])
|
||||
params[prop] = ancestorData[prop];
|
||||
}
|
||||
|
||||
this._trackActor(actor, params);
|
||||
},
|
||||
|
||||
// untrackActor:
|
||||
@ -111,10 +147,7 @@ Chrome.prototype = {
|
||||
//
|
||||
// Removes @actor from the chrome layer
|
||||
removeActor: function(actor) {
|
||||
if (actor.get_parent() == this.nonOverviewActor)
|
||||
this.nonOverviewActor.remove_actor(actor);
|
||||
else
|
||||
this.actor.remove_actor(actor);
|
||||
this.actor.remove_actor(actor);
|
||||
this._untrackActor(actor);
|
||||
},
|
||||
|
||||
@ -127,16 +160,12 @@ Chrome.prototype = {
|
||||
return -1;
|
||||
},
|
||||
|
||||
_trackActor: function(actor, inputRegion, strut) {
|
||||
let actorData;
|
||||
|
||||
_trackActor: function(actor, params) {
|
||||
if (this._findActor(actor) != -1)
|
||||
throw new Error('trying to re-track existing chrome actor');
|
||||
|
||||
actorData = { actor: actor,
|
||||
inputRegion: inputRegion,
|
||||
strut: strut };
|
||||
|
||||
let actorData = Params.parse(params, defaultParams);
|
||||
actorData.actor = actor;
|
||||
actorData.visibleId = actor.connect('notify::visible',
|
||||
Lang.bind(this, this._queueUpdateRegions));
|
||||
actorData.allocationId = actor.connect('notify::allocation',
|
||||
@ -170,16 +199,40 @@ Chrome.prototype = {
|
||||
this._untrackActor(actor);
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
for (let i = 0; i < this._trackedActors.length; i++) {
|
||||
let actorData = this._trackedActors[i];
|
||||
if (this._inOverview && !actorData.visibleInOverview)
|
||||
this.actor.set_skip_paint(actorData.actor, true);
|
||||
else if (this._inFullscreen && !actorData.visibleInFullscreen)
|
||||
this.actor.set_skip_paint(actorData.actor, true);
|
||||
else
|
||||
this.actor.set_skip_paint(actorData.actor, false);
|
||||
}
|
||||
|
||||
let newVisibility;
|
||||
if (this._inOverview)
|
||||
newVisibility = Visibility.OVERVIEW;
|
||||
else if (this._inFullscreen)
|
||||
newVisibility = Visibility.FULLSCREEN;
|
||||
else
|
||||
newVisibility = Visibility.FULL;
|
||||
|
||||
if (newVisibility != this.visibility) {
|
||||
this.visibility = newVisibility;
|
||||
this.emit('visibility-changed', this.visibility);
|
||||
}
|
||||
},
|
||||
|
||||
_overviewShowing: function() {
|
||||
this.actor.show();
|
||||
this.nonOverviewActor.hide();
|
||||
this._inOverview = true;
|
||||
this._updateVisibility();
|
||||
this._queueUpdateRegions();
|
||||
},
|
||||
|
||||
_overviewHidden: function() {
|
||||
if (this._obscuredByFullscreen)
|
||||
this.actor.hide();
|
||||
this.nonOverviewActor.show();
|
||||
this._inOverview = false;
|
||||
this._updateVisibility();
|
||||
this._queueUpdateRegions();
|
||||
},
|
||||
|
||||
@ -196,7 +249,7 @@ Chrome.prototype = {
|
||||
// The chrome layer should be visible unless there is a window
|
||||
// with layer FULLSCREEN, or a window with layer
|
||||
// OVERRIDE_REDIRECT that covers the whole screen.
|
||||
// ("override_redirect" is not actually a layer above all
|
||||
// ('override_redirect' is not actually a layer above all
|
||||
// other windows, but this seems to be how mutter treats it
|
||||
// currently...) If we wanted to be extra clever, we could
|
||||
// figure out when an OVERRIDE_REDIRECT window was trying to
|
||||
@ -205,26 +258,40 @@ Chrome.prototype = {
|
||||
|
||||
// @windows is sorted bottom to top.
|
||||
|
||||
this._obscuredByFullscreen = false;
|
||||
let wasInFullscreen = this._inFullscreen;
|
||||
this._inFullscreen = false;
|
||||
for (let i = windows.length - 1; i > -1; i--) {
|
||||
let layer = windows[i].get_meta_window().get_layer();
|
||||
|
||||
if (layer == Meta.StackLayer.OVERRIDE_REDIRECT ||
|
||||
layer == Meta.StackLayer.FULLSCREEN) {
|
||||
// There are 3 cases we check here for:
|
||||
// 1.) Monitor sized window
|
||||
// 2.) Window with a position somewhere on the primary screen having the _NET_WM_FULLSCREEN flag set
|
||||
// 3.) Window that is partly off screen (tries to hide its decorations) which might have negative coords
|
||||
// We check for 1.) and 2.) by checking if the upper right corner is on the primary monitor, but avoid the case
|
||||
// where it overlaps with the secondary screen (like window.x + window.width == primary.x + primary.width)
|
||||
// For 3.) we just ignore negative values as they don't really make sense
|
||||
|
||||
if (layer == Meta.StackLayer.FULLSCREEN) {
|
||||
if (Math.max(windows[i].x, 0) >= primary.x && Math.max(windows[i].x, 0) < primary.x + primary.width &&
|
||||
Math.max(windows[i].y, 0) >= primary.y && Math.max(windows[i].y, 0) < primary.y + primary.height) {
|
||||
this._inFullscreen = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (layer == Meta.StackLayer.OVERRIDE_REDIRECT) {
|
||||
if (windows[i].x <= primary.x &&
|
||||
windows[i].x + windows[i].width >= primary.x + primary.width &&
|
||||
windows[i].y <= primary.y &&
|
||||
windows[i].y + windows[i].height >= primary.y + primary.height) {
|
||||
this._obscuredByFullscreen = true;
|
||||
this._inFullscreen = true;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
let shouldBeVisible = !this._obscuredByFullscreen || Main.overview.visible;
|
||||
if (this.actor.visible != shouldBeVisible) {
|
||||
this.actor.visible = shouldBeVisible;
|
||||
if (this._inFullscreen != wasInFullscreen) {
|
||||
this._updateVisibility();
|
||||
this._queueUpdateRegions();
|
||||
}
|
||||
},
|
||||
@ -236,7 +303,7 @@ Chrome.prototype = {
|
||||
|
||||
for (i = 0; i < this._trackedActors.length; i++) {
|
||||
let actorData = this._trackedActors[i];
|
||||
if (!actorData.inputRegion && !actorData.strut)
|
||||
if (!actorData.affectsInputRegion && !actorData.affectsStruts)
|
||||
continue;
|
||||
|
||||
let [x, y] = actorData.actor.get_transformed_position();
|
||||
@ -247,10 +314,12 @@ Chrome.prototype = {
|
||||
h = Math.round(h);
|
||||
let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h});
|
||||
|
||||
if (actorData.inputRegion && actorData.actor.get_paint_visibility())
|
||||
if (actorData.affectsInputRegion &&
|
||||
actorData.actor.get_paint_visibility() &&
|
||||
!this.actor.get_skip_paint(actorData.actor))
|
||||
rects.push(rect);
|
||||
|
||||
if (!actorData.strut)
|
||||
if (!actorData.affectsStruts)
|
||||
continue;
|
||||
|
||||
// Metacity wants to know what side of the screen the
|
||||
@ -302,3 +371,4 @@ Chrome.prototype = {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Chrome.prototype);
|
||||
|
482
js/ui/dash.js
@ -1,6 +1,5 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Mainloop = imports.mainloop;
|
||||
@ -13,6 +12,7 @@ const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const DND = imports.ui.dnd;
|
||||
const DocDisplay = imports.ui.docDisplay;
|
||||
const PlaceDisplay = imports.ui.placeDisplay;
|
||||
const GenericDisplay = imports.ui.genericDisplay;
|
||||
@ -22,37 +22,8 @@ const Search = imports.ui.search;
|
||||
// 25 search results (per result type) should be enough for everyone
|
||||
const MAX_RENDERED_SEARCH_RESULTS = 25;
|
||||
|
||||
const DEFAULT_PADDING = 4;
|
||||
const DEFAULT_SPACING = 4;
|
||||
|
||||
const BACKGROUND_COLOR = new Clutter.Color();
|
||||
BACKGROUND_COLOR.from_pixel(0x000000c0);
|
||||
|
||||
const PRELIGHT_COLOR = new Clutter.Color();
|
||||
PRELIGHT_COLOR.from_pixel(0x4f6fadaa);
|
||||
|
||||
const TEXT_COLOR = new Clutter.Color();
|
||||
TEXT_COLOR.from_pixel(0x5f5f5fff);
|
||||
const BRIGHTER_TEXT_COLOR = new Clutter.Color();
|
||||
BRIGHTER_TEXT_COLOR.from_pixel(0xbbbbbbff);
|
||||
const BRIGHT_TEXT_COLOR = new Clutter.Color();
|
||||
BRIGHT_TEXT_COLOR.from_pixel(0xffffffff);
|
||||
const SEARCH_TEXT_COLOR = new Clutter.Color();
|
||||
SEARCH_TEXT_COLOR.from_pixel(0x333333ff);
|
||||
|
||||
const SEARCH_CURSOR_COLOR = BRIGHT_TEXT_COLOR;
|
||||
const HIGHLIGHTED_SEARCH_CURSOR_COLOR = SEARCH_TEXT_COLOR;
|
||||
|
||||
const SEARCH_BORDER_BOTTOM_COLOR = new Clutter.Color();
|
||||
SEARCH_BORDER_BOTTOM_COLOR.from_pixel(0x191919ff);
|
||||
|
||||
const BROWSE_ACTIVATED_BG = new Clutter.Color();
|
||||
BROWSE_ACTIVATED_BG.from_pixel(0x303030f0);
|
||||
|
||||
const APPS = "apps";
|
||||
const PREFS = "prefs";
|
||||
const DOCS = "docs";
|
||||
const PLACES = "places";
|
||||
const DOCS = 'docs';
|
||||
const PLACES = 'places';
|
||||
|
||||
/*
|
||||
* Returns the index in an array of a given length that is obtained
|
||||
@ -68,11 +39,7 @@ function _getIndexWrapped(index, increment, length) {
|
||||
}
|
||||
|
||||
function _createDisplay(displayType, flags) {
|
||||
if (displayType == APPS)
|
||||
return new AppDisplay.AppDisplay(false, flags);
|
||||
else if (displayType == PREFS)
|
||||
return new AppDisplay.AppDisplay(true, flags);
|
||||
else if (displayType == DOCS)
|
||||
if (displayType == DOCS)
|
||||
return new DocDisplay.DocDisplay(flags);
|
||||
else if (displayType == PLACES)
|
||||
return new PlaceDisplay.PlaceDisplay(flags);
|
||||
@ -87,7 +54,7 @@ Pane.prototype = {
|
||||
_init: function () {
|
||||
this._open = false;
|
||||
|
||||
this.actor = new St.BoxLayout({ style_class: "dash-pane",
|
||||
this.actor = new St.BoxLayout({ style_class: 'dash-pane',
|
||||
vertical: true,
|
||||
reactive: true });
|
||||
this.actor.connect('button-press-event', Lang.bind(this, function (a, e) {
|
||||
@ -97,13 +64,8 @@ Pane.prototype = {
|
||||
|
||||
let chromeTop = new St.BoxLayout();
|
||||
|
||||
let closeIcon = new St.Button({ style_class: "dash-pane-close" });
|
||||
closeIcon.connect('clicked', Lang.bind(this, function (b, e) {
|
||||
this.close();
|
||||
}));
|
||||
let dummy = new St.Bin();
|
||||
chromeTop.add(dummy, { expand: true });
|
||||
chromeTop.add(closeIcon, { x_align: St.Align.END });
|
||||
this.actor.add(chromeTop);
|
||||
|
||||
this.content = new St.BoxLayout({ vertical: true });
|
||||
@ -142,7 +104,7 @@ Pane.prototype = {
|
||||
else
|
||||
this.open();
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Pane.prototype);
|
||||
|
||||
function ResultArea(displayType, flags) {
|
||||
@ -151,17 +113,15 @@ function ResultArea(displayType, flags) {
|
||||
|
||||
ResultArea.prototype = {
|
||||
_init : function(displayType, flags) {
|
||||
this.actor = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL });
|
||||
this.resultsContainer = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
spacing: DEFAULT_PADDING
|
||||
});
|
||||
this.actor.append(this.resultsContainer, Big.BoxPackFlags.EXPAND);
|
||||
this.actor = new St.BoxLayout({ vertical: true });
|
||||
this.resultsContainer = new St.BoxLayout({ style_class: 'dash-results-container' });
|
||||
this.actor.add(this.resultsContainer, { expand: true });
|
||||
|
||||
this.display = _createDisplay(displayType, flags);
|
||||
this.resultsContainer.append(this.display.actor, Big.BoxPackFlags.EXPAND);
|
||||
this.resultsContainer.add(this.display.actor, { expand: true });
|
||||
this.display.load();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Utility function shared between ResultPane and the DocDisplay in the main dash.
|
||||
// Connects to the detail signal of the display, and on-demand creates a new
|
||||
@ -177,7 +137,7 @@ function createPaneForDetails(dash, display) {
|
||||
detailPane.destroyContent();
|
||||
}
|
||||
}));
|
||||
dash._addPane(detailPane);
|
||||
dash._addPane(detailPane, St.Align.START);
|
||||
}
|
||||
|
||||
if (index >= 0) {
|
||||
@ -217,7 +177,7 @@ ResultPane.prototype = {
|
||||
}));
|
||||
return resultArea.display;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function SearchEntry() {
|
||||
this._init();
|
||||
@ -225,76 +185,44 @@ function SearchEntry() {
|
||||
|
||||
SearchEntry.prototype = {
|
||||
_init : function() {
|
||||
this.actor = new St.BoxLayout({ name: "searchEntry",
|
||||
reactive: true });
|
||||
let box = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
y_align: Big.BoxAlignment.CENTER });
|
||||
this.actor.add(box, { expand: true });
|
||||
this.actor.connect('button-press-event', Lang.bind(this, function () {
|
||||
this._resetTextState(true);
|
||||
return false;
|
||||
}));
|
||||
this.actor = new St.Entry({ name: 'searchEntry',
|
||||
hint_text: _("Find") });
|
||||
this.entry = this.actor.clutter_text;
|
||||
|
||||
this.actor.clutter_text.connect('text-changed', Lang.bind(this,
|
||||
function() {
|
||||
if (this.isActive())
|
||||
this.actor.set_secondary_icon_from_file(global.imagedir +
|
||||
'close-black.svg');
|
||||
else
|
||||
this.actor.set_secondary_icon_from_file(null);
|
||||
}));
|
||||
this.actor.connect('secondary-icon-clicked', Lang.bind(this,
|
||||
function() {
|
||||
this.reset();
|
||||
}));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this.pane = null;
|
||||
|
||||
this._defaultText = _("Find...");
|
||||
this._capturedEventId = 0;
|
||||
},
|
||||
|
||||
let textProperties = { font_name: "Sans 16px" };
|
||||
let entryProperties = { editable: true,
|
||||
activatable: true,
|
||||
single_line_mode: true,
|
||||
color: SEARCH_TEXT_COLOR,
|
||||
cursor_color: SEARCH_CURSOR_COLOR };
|
||||
Lang.copyProperties(textProperties, entryProperties);
|
||||
this.entry = new Clutter.Text(entryProperties);
|
||||
show: function() {
|
||||
if (this._capturedEventId == 0)
|
||||
this._capturedEventId = global.stage.connect('captured-event',
|
||||
Lang.bind(this, this._onCapturedEvent));
|
||||
this.entry.set_cursor_visible(true);
|
||||
this.entry.set_selection(0, 0);
|
||||
},
|
||||
|
||||
this.entry.connect('notify::text', Lang.bind(this, function () {
|
||||
this._resetTextState(false);
|
||||
}));
|
||||
box.append(this.entry, Big.BoxPackFlags.EXPAND);
|
||||
|
||||
// Mark as editable just to get a cursor
|
||||
let defaultTextProperties = { ellipsize: Pango.EllipsizeMode.END,
|
||||
text: this._defaultText,
|
||||
editable: true,
|
||||
color: TEXT_COLOR,
|
||||
cursor_visible: false,
|
||||
single_line_mode: true };
|
||||
Lang.copyProperties(textProperties, defaultTextProperties);
|
||||
this._defaultText = new Clutter.Text(defaultTextProperties);
|
||||
box.add_actor(this._defaultText);
|
||||
this.entry.connect('notify::allocation', Lang.bind(this, function () {
|
||||
this._repositionDefaultText();
|
||||
}));
|
||||
|
||||
this._iconBox = new Big.Box({ x_align: Big.BoxAlignment.CENTER,
|
||||
y_align: Big.BoxAlignment.CENTER,
|
||||
padding_right: 4 });
|
||||
box.append(this._iconBox, Big.BoxPackFlags.END);
|
||||
|
||||
let magnifierUri = "file://" + global.imagedir + "magnifier.svg";
|
||||
this._magnifierIcon = Shell.TextureCache.get_default().load_uri_sync(Shell.TextureCachePolicy.FOREVER,
|
||||
magnifierUri, 18, 18);
|
||||
let closeUri = "file://" + global.imagedir + "close-black.svg";
|
||||
this._closeIcon = Shell.TextureCache.get_default().load_uri_sync(Shell.TextureCachePolicy.FOREVER,
|
||||
closeUri, 18, 18);
|
||||
this._closeIcon.reactive = true;
|
||||
this._closeIcon.connect('button-press-event', Lang.bind(this, function () {
|
||||
// Resetting this.entry.text will trigger notify::text signal which will
|
||||
// result in this._resetTextState() being called, but we should not rely
|
||||
// on that not short-circuiting if the text was already empty, so we call
|
||||
// this._resetTextState() explicitly in that case.
|
||||
if (this.entry.text == '')
|
||||
this._resetTextState(false);
|
||||
else
|
||||
this.entry.text = '';
|
||||
|
||||
// Return true to stop the signal emission, so that this.actor doesn't get
|
||||
// the button-press-event and re-highlight itself.
|
||||
return true;
|
||||
}));
|
||||
this._repositionDefaultText();
|
||||
this._resetTextState();
|
||||
hide: function() {
|
||||
if (this.isActive())
|
||||
this.reset();
|
||||
if (this._capturedEventId > 0) {
|
||||
global.stage.disconnect(this._capturedEventId);
|
||||
this._capturedEventId = 0;
|
||||
}
|
||||
},
|
||||
|
||||
setPane: function (pane) {
|
||||
@ -303,35 +231,93 @@ SearchEntry.prototype = {
|
||||
|
||||
reset: function () {
|
||||
this.entry.text = '';
|
||||
global.stage.set_key_focus(null);
|
||||
this.entry.set_cursor_visible(true);
|
||||
this.entry.set_selection(0, 0);
|
||||
},
|
||||
|
||||
getText: function () {
|
||||
return this.entry.text;
|
||||
return this.entry.get_text().replace(/^\s+/g, '').replace(/\s+$/g, '');
|
||||
},
|
||||
|
||||
_resetTextState: function (searchEntryClicked) {
|
||||
let text = this.getText();
|
||||
this._iconBox.remove_all();
|
||||
// We highlight the search box if the user starts typing in it
|
||||
// or just clicks in it to indicate that the search is active.
|
||||
if (text != '' || searchEntryClicked) {
|
||||
if (!searchEntryClicked)
|
||||
this._defaultText.hide();
|
||||
this._iconBox.append(this._closeIcon, Big.BoxPackFlags.NONE);
|
||||
this.actor.set_style_pseudo_class('active');
|
||||
this.entry.cursor_color = HIGHLIGHTED_SEARCH_CURSOR_COLOR;
|
||||
} else {
|
||||
this._defaultText.show();
|
||||
this._iconBox.append(this._magnifierIcon, Big.BoxPackFlags.NONE);
|
||||
this.actor.set_style_pseudo_class(null);
|
||||
this.entry.cursor_color = SEARCH_CURSOR_COLOR;
|
||||
// some search term has been entered
|
||||
isActive: function() {
|
||||
return this.actor.get_text() != '';
|
||||
},
|
||||
|
||||
// the entry does not show the hint
|
||||
_isActivated: function() {
|
||||
return this.entry.text == this.actor.get_text();
|
||||
},
|
||||
|
||||
_onCapturedEvent: function(actor, event) {
|
||||
let source = event.get_source();
|
||||
let panelEvent = false;
|
||||
|
||||
if (source) {
|
||||
let parent = source;
|
||||
do {
|
||||
if (parent == Main.panel.actor)
|
||||
break;
|
||||
} while ((parent = parent.get_parent()) != null);
|
||||
panelEvent = (parent != null);
|
||||
}
|
||||
|
||||
switch (event.type()) {
|
||||
case Clutter.EventType.BUTTON_PRESS:
|
||||
// the user clicked outside after activating the entry, but
|
||||
// with no search term entered - cancel the search
|
||||
if (source != this.entry && this.entry.text == '') {
|
||||
this.reset();
|
||||
// allow only panel events to continue
|
||||
return !panelEvent;
|
||||
}
|
||||
return false;
|
||||
case Clutter.EventType.KEY_PRESS:
|
||||
// If neither the stage nor our entry have key focus, some
|
||||
// "special" actor grabbed the focus (run dialog, looking
|
||||
// glass); we don't want to interfere with that
|
||||
let focus = global.stage.get_key_focus();
|
||||
if (focus != global.stage && focus != this.entry)
|
||||
return false;
|
||||
|
||||
let sym = event.get_key_symbol();
|
||||
|
||||
// If we have an active search, Escape cancels it - if we
|
||||
// haven't, the key is ignored
|
||||
if (sym == Clutter.Escape)
|
||||
if (this._isActivated()) {
|
||||
this.reset();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Ignore non-printable keys
|
||||
if (!Clutter.keysym_to_unicode(sym))
|
||||
return false;
|
||||
|
||||
// Search started - move the key focus to the entry and
|
||||
// "repeat" the event
|
||||
if (!this._isActivated()) {
|
||||
global.stage.set_key_focus(this.entry);
|
||||
this.entry.event(event, false);
|
||||
}
|
||||
|
||||
return false;
|
||||
default:
|
||||
// Suppress all other events outside the panel while the entry
|
||||
// is activated and no search has been entered - any click
|
||||
// outside the entry will cancel the search
|
||||
return (this.entry.text == '' && !panelEvent);
|
||||
}
|
||||
},
|
||||
|
||||
_repositionDefaultText: function () {
|
||||
// Offset a little to show the cursor
|
||||
this._defaultText.set_position(this.entry.x + 4, this.entry.y);
|
||||
this._defaultText.set_size(this.entry.width, this.entry.height);
|
||||
_onDestroy: function() {
|
||||
if (this._capturedEventId > 0) {
|
||||
global.stage.disconnect(this._capturedEventId);
|
||||
this._capturedEventId = 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(SearchEntry.prototype);
|
||||
@ -363,10 +349,15 @@ SearchResult.prototype = {
|
||||
this.actor.set_child(content);
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onResultClicked));
|
||||
|
||||
let draggable = DND.makeDraggable(this.actor);
|
||||
},
|
||||
|
||||
setSelected: function(selected) {
|
||||
this._content.set_style_pseudo_class(selected ? 'selected' : null);
|
||||
if (selected)
|
||||
this._content.add_style_pseudo_class('selected');
|
||||
else
|
||||
this._content.remove_style_pseudo_class('selected');
|
||||
},
|
||||
|
||||
activate: function() {
|
||||
@ -376,8 +367,23 @@ SearchResult.prototype = {
|
||||
|
||||
_onResultClicked: function(actor, event) {
|
||||
this.activate();
|
||||
},
|
||||
|
||||
getDragActorSource: function() {
|
||||
return this.metaInfo['icon'];
|
||||
},
|
||||
|
||||
getDragActor: function(stageX, stageY) {
|
||||
return new Clutter.Clone({ source: this.metaInfo['icon'] });
|
||||
},
|
||||
|
||||
shellWorkspaceLaunch: function() {
|
||||
if (this.provider.dragActivateResult)
|
||||
this.provider.dragActivateResult(this.metaInfo.id);
|
||||
else
|
||||
this.provider.activateResult(this.metaInfo.id);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function OverflowSearchResults(provider) {
|
||||
this._init(provider);
|
||||
@ -391,6 +397,10 @@ OverflowSearchResults.prototype = {
|
||||
this.actor = new St.OverflowBox({ style_class: 'dash-search-section-list-results' });
|
||||
},
|
||||
|
||||
getVisibleResultCount: function() {
|
||||
return this.actor.get_n_visible();
|
||||
},
|
||||
|
||||
renderResults: function(results, terms) {
|
||||
for (let i = 0; i < results.length && i < MAX_RENDERED_SEARCH_RESULTS; i++) {
|
||||
let result = results[i];
|
||||
@ -400,10 +410,6 @@ OverflowSearchResults.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
getVisibleCount: function() {
|
||||
return this.actor.get_n_visible();
|
||||
},
|
||||
|
||||
selectIndex: function(index) {
|
||||
let nVisible = this.actor.get_n_visible();
|
||||
let children = this.actor.get_children();
|
||||
@ -420,8 +426,14 @@ OverflowSearchResults.prototype = {
|
||||
targetActor._delegate.setSelected(true);
|
||||
this.selectionIndex = index;
|
||||
return true;
|
||||
},
|
||||
|
||||
activateSelected: function() {
|
||||
let children = this.actor.get_children();
|
||||
let targetActor = children[this.selectionIndex];
|
||||
targetActor._delegate.activate();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function SearchResults(searchSystem) {
|
||||
this._init(searchSystem);
|
||||
@ -433,9 +445,8 @@ SearchResults.prototype = {
|
||||
|
||||
this.actor = new St.BoxLayout({ name: 'dashSearchResults',
|
||||
vertical: true });
|
||||
this._searchingNotice = new St.Label({ style_class: 'dash-search-starting',
|
||||
text: _("Searching...") });
|
||||
this.actor.add(this._searchingNotice);
|
||||
this._statusText = new St.Label({ style_class: 'dash-search-statustext' });
|
||||
this.actor.add(this._statusText);
|
||||
this._selectedProvider = -1;
|
||||
this._providers = this._searchSystem.getProviders();
|
||||
this._providerMeta = [];
|
||||
@ -485,13 +496,14 @@ SearchResults.prototype = {
|
||||
|
||||
reset: function() {
|
||||
this._searchSystem.reset();
|
||||
this._searchingNotice.hide();
|
||||
this._statusText.hide();
|
||||
this._clearDisplay();
|
||||
},
|
||||
|
||||
startingSearch: function() {
|
||||
this.reset();
|
||||
this._searchingNotice.show();
|
||||
this._statusText.set_text(_("Searching..."));
|
||||
this._statusText.show();
|
||||
},
|
||||
|
||||
_metaForProvider: function(provider) {
|
||||
@ -501,9 +513,16 @@ SearchResults.prototype = {
|
||||
updateSearch: function (searchString) {
|
||||
let results = this._searchSystem.updateSearch(searchString);
|
||||
|
||||
this._searchingNotice.hide();
|
||||
this._clearDisplay();
|
||||
|
||||
if (results.length == 0) {
|
||||
this._statusText.set_text(_("No matching results."));
|
||||
this._statusText.show();
|
||||
return true;
|
||||
} else {
|
||||
this._statusText.hide();
|
||||
}
|
||||
|
||||
let terms = this._searchSystem.getTerms();
|
||||
|
||||
for (let i = 0; i < results.length; i++) {
|
||||
@ -511,7 +530,7 @@ SearchResults.prototype = {
|
||||
let meta = this._metaForProvider(provider);
|
||||
meta.actor.show();
|
||||
meta.resultDisplay.renderResults(providerResults, terms);
|
||||
meta.count.set_text(""+providerResults.length);
|
||||
meta.count.set_text('' + providerResults.length);
|
||||
}
|
||||
|
||||
this.selectDown(false);
|
||||
@ -527,7 +546,7 @@ SearchResults.prototype = {
|
||||
let success;
|
||||
let index = resultDisplay.getSelectionIndex();
|
||||
if (up && index == -1)
|
||||
index = resultDisplay.getVisibleCount() - 1;
|
||||
index = resultDisplay.getVisibleResultCount() - 1;
|
||||
else if (up)
|
||||
index = index - 1;
|
||||
else
|
||||
@ -578,11 +597,10 @@ SearchResults.prototype = {
|
||||
return;
|
||||
let meta = this._providerMeta[current];
|
||||
let resultDisplay = meta.resultDisplay;
|
||||
let children = resultDisplay.actor.get_children();
|
||||
let targetActor = children[resultDisplay.getSelectionIndex()];
|
||||
targetActor._delegate.activate();
|
||||
resultDisplay.activateSelected();
|
||||
Main.overview.hide();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function MoreLink() {
|
||||
this._init();
|
||||
@ -590,12 +608,12 @@ function MoreLink() {
|
||||
|
||||
MoreLink.prototype = {
|
||||
_init : function () {
|
||||
this.actor = new St.BoxLayout({ style_class: "more-link",
|
||||
this.actor = new St.BoxLayout({ style_class: 'more-link',
|
||||
reactive: true });
|
||||
this.pane = null;
|
||||
|
||||
let expander = new St.Bin({ style_class: "more-link-expander" });
|
||||
this.actor.add(expander, { expand: true, y_fill: false });
|
||||
this._expander = new St.Bin({ style_class: 'more-link-expander' });
|
||||
this.actor.add(this._expander, { expand: true, y_fill: false });
|
||||
},
|
||||
|
||||
activate: function() {
|
||||
@ -610,9 +628,13 @@ MoreLink.prototype = {
|
||||
setPane: function (pane) {
|
||||
this._pane = pane;
|
||||
this._pane.connect('open-state-changed', Lang.bind(this, function(pane, isOpen) {
|
||||
if (isOpen)
|
||||
this._expander.add_style_class_name('open');
|
||||
else
|
||||
this._expander.remove_style_class_name('open');
|
||||
}));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(MoreLink.prototype);
|
||||
|
||||
@ -622,11 +644,11 @@ function BackLink() {
|
||||
|
||||
BackLink.prototype = {
|
||||
_init : function () {
|
||||
this.actor = new St.Button({ style_class: "section-header-back",
|
||||
this.actor = new St.Button({ style_class: 'section-header-back',
|
||||
reactive: true });
|
||||
this.actor.set_child(new St.Bin({ style_class: "section-header-back-image" }));
|
||||
this.actor.set_child(new St.Bin({ style_class: 'section-header-back-image' }));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function SectionHeader(title, suppressBrowse) {
|
||||
this._init(title, suppressBrowse);
|
||||
@ -634,12 +656,12 @@ function SectionHeader(title, suppressBrowse) {
|
||||
|
||||
SectionHeader.prototype = {
|
||||
_init : function (title, suppressBrowse) {
|
||||
this.actor = new St.Bin({ style_class: "section-header",
|
||||
this.actor = new St.Bin({ style_class: 'section-header',
|
||||
x_align: St.Align.START,
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
reactive: !suppressBrowse });
|
||||
this._innerBox = new St.BoxLayout({ style_class: "section-header-inner" });
|
||||
this._innerBox = new St.BoxLayout({ style_class: 'section-header-inner' });
|
||||
this.actor.set_child(this._innerBox);
|
||||
|
||||
this.backLink = new BackLink();
|
||||
@ -649,12 +671,12 @@ SectionHeader.prototype = {
|
||||
this.emit('back-link-activated');
|
||||
}));
|
||||
|
||||
let textBox = new St.BoxLayout({ style_class: "section-text-content" });
|
||||
this.text = new St.Label({ style_class: "section-title",
|
||||
let textBox = new St.BoxLayout({ style_class: 'section-text-content' });
|
||||
this.text = new St.Label({ style_class: 'section-title',
|
||||
text: title });
|
||||
textBox.add(this.text, { x_align: St.Align.START });
|
||||
|
||||
this.countText = new St.Label({ style_class: "section-count" });
|
||||
this.countText = new St.Label({ style_class: 'section-count' });
|
||||
textBox.add(this.countText, { expand: true, x_fill: false, x_align: St.Align.END });
|
||||
this.countText.hide();
|
||||
|
||||
@ -690,14 +712,14 @@ SectionHeader.prototype = {
|
||||
},
|
||||
|
||||
setCountText : function(countText) {
|
||||
if (countText == "") {
|
||||
if (countText == '') {
|
||||
this.countText.hide();
|
||||
} else {
|
||||
this.countText.show();
|
||||
this.countText.text = countText;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(SectionHeader.prototype);
|
||||
|
||||
@ -707,21 +729,21 @@ function SearchSectionHeader(title, onClick) {
|
||||
|
||||
SearchSectionHeader.prototype = {
|
||||
_init : function(title, onClick) {
|
||||
this.actor = new St.Button({ style_class: "dash-search-section-header",
|
||||
this.actor = new St.Button({ style_class: 'dash-search-section-header',
|
||||
x_fill: true,
|
||||
y_fill: true });
|
||||
let box = new St.BoxLayout();
|
||||
this.actor.set_child(box);
|
||||
let titleText = new St.Label({ style_class: "dash-search-section-title",
|
||||
let titleText = new St.Label({ style_class: 'dash-search-section-title',
|
||||
text: title });
|
||||
this.countText = new St.Label({ style_class: "dash-search-section-count" });
|
||||
this.countText = new St.Label({ style_class: 'dash-search-section-count' });
|
||||
|
||||
box.add(titleText);
|
||||
box.add(this.countText, { expand: true, x_fill: false, x_align: St.Align.END });
|
||||
|
||||
this.actor.connect('clicked', onClick);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function Section(titleString, suppressBrowse) {
|
||||
this._init(titleString, suppressBrowse);
|
||||
@ -737,7 +759,7 @@ Section.prototype = {
|
||||
vertical: true });
|
||||
this.actor.add(this.content);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function Dash() {
|
||||
this._init();
|
||||
@ -754,14 +776,14 @@ Dash.prototype = {
|
||||
// of the Group actor ends up including the width of its hidden children, so we were getting a reactive object as
|
||||
// wide as the details pane that was blocking the clicks to the workspaces underneath it even when the details pane
|
||||
// was actually hidden.
|
||||
this.actor = new St.BoxLayout({ name: "dash",
|
||||
this.actor = new St.BoxLayout({ name: 'dash',
|
||||
vertical: true,
|
||||
reactive: true });
|
||||
|
||||
// The searchArea just holds the entry
|
||||
this.searchArea = new St.BoxLayout({ name: "dashSearchArea",
|
||||
this.searchArea = new St.BoxLayout({ name: 'dashSearchArea',
|
||||
vertical: true });
|
||||
this.sectionArea = new St.BoxLayout({ name: "dashSections",
|
||||
this.sectionArea = new St.BoxLayout({ name: 'dashSections',
|
||||
vertical: true });
|
||||
|
||||
this.actor.add(this.searchArea);
|
||||
@ -787,12 +809,11 @@ Dash.prototype = {
|
||||
this.actor.add(this.searchResults.actor);
|
||||
this.searchResults.actor.hide();
|
||||
|
||||
this._keyPressId = 0;
|
||||
this._searchTimeoutId = 0;
|
||||
this._searchEntry.entry.connect('text-changed', Lang.bind(this, function (se, prop) {
|
||||
let text = this._searchEntry.getText();
|
||||
text = text.replace(/^\s+/g, "").replace(/\s+$/g, "");
|
||||
let searchPreviouslyActive = this._searchActive;
|
||||
this._searchActive = text != '';
|
||||
this._searchActive = this._searchEntry.isActive();
|
||||
this._searchPending = this._searchActive && !searchPreviouslyActive;
|
||||
if (this._searchPending) {
|
||||
this.searchResults.startingSearch();
|
||||
@ -823,35 +844,6 @@ Dash.prototype = {
|
||||
this.searchResults.activateSelected();
|
||||
return true;
|
||||
}));
|
||||
this._searchEntry.entry.connect('key-press-event', Lang.bind(this, function (se, e) {
|
||||
let symbol = e.get_key_symbol();
|
||||
if (symbol == Clutter.Escape) {
|
||||
// Escape will keep clearing things back to the desktop.
|
||||
// If we have an active search, we remove it.
|
||||
if (this._searchActive)
|
||||
this._searchEntry.reset();
|
||||
// Next, if we're in one of the "more" modes or showing the details pane, close them
|
||||
else if (this._activePane != null)
|
||||
this._activePane.close();
|
||||
// Finally, just close the Overview entirely
|
||||
else
|
||||
Main.overview.hide();
|
||||
return true;
|
||||
} else if (symbol == Clutter.Up) {
|
||||
if (!this._searchActive)
|
||||
return true;
|
||||
this.searchResults.selectUp(false);
|
||||
|
||||
return true;
|
||||
} else if (symbol == Clutter.Down) {
|
||||
if (!this._searchActive)
|
||||
return true;
|
||||
|
||||
this.searchResults.selectDown(false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}));
|
||||
|
||||
/***** Applications *****/
|
||||
|
||||
@ -859,13 +851,12 @@ Dash.prototype = {
|
||||
let appWell = new AppDisplay.AppWell();
|
||||
this._appsSection.content.add(appWell.actor, { expand: true });
|
||||
|
||||
this._moreAppsPane = null;
|
||||
this._allApps = null;
|
||||
this._appsSection.header.moreLink.connect('activated', Lang.bind(this, function (link) {
|
||||
if (this._moreAppsPane == null) {
|
||||
this._moreAppsPane = new ResultPane(this);
|
||||
this._moreAppsPane.packResults(APPS);
|
||||
this._addPane(this._moreAppsPane);
|
||||
link.setPane(this._moreAppsPane);
|
||||
if (this._allApps == null) {
|
||||
this._allApps = new AppDisplay.AllAppDisplay();
|
||||
this._addPane(this._allApps, St.Align.START);
|
||||
link.setPane(this._allApps);
|
||||
}
|
||||
}));
|
||||
|
||||
@ -875,14 +866,14 @@ Dash.prototype = {
|
||||
|
||||
/* Translators: This is in the sense of locations for documents,
|
||||
network locations, etc. */
|
||||
this._placesSection = new Section(_("PLACES"), true);
|
||||
this._placesSection = new Section(_("PLACES & DEVICES"), true);
|
||||
let placesDisplay = new PlaceDisplay.DashPlaceDisplay();
|
||||
this._placesSection.content.add(placesDisplay.actor, { expand: true });
|
||||
this.sectionArea.add(this._placesSection.actor);
|
||||
|
||||
/***** Documents *****/
|
||||
|
||||
this._docsSection = new Section(_("RECENT DOCUMENTS"));
|
||||
this._docsSection = new Section(_("RECENT ITEMS"));
|
||||
|
||||
this._docDisplay = new DocDisplay.DashDocDisplay();
|
||||
this._docsSection.content.add(this._docDisplay.actor, { expand: true });
|
||||
@ -892,7 +883,7 @@ Dash.prototype = {
|
||||
if (this._moreDocsPane == null) {
|
||||
this._moreDocsPane = new ResultPane(this);
|
||||
this._moreDocsPane.packResults(DOCS);
|
||||
this._addPane(this._moreDocsPane);
|
||||
this._addPane(this._moreDocsPane, St.Align.END);
|
||||
link.setPane(this._moreDocsPane);
|
||||
}
|
||||
}));
|
||||
@ -906,6 +897,40 @@ Dash.prototype = {
|
||||
this.sectionArea.add(this._docsSection.actor, { expand: true });
|
||||
},
|
||||
|
||||
_onKeyPress: function(stage, event) {
|
||||
// If neither the stage nor the search entry have key focus, some
|
||||
// "special" actor grabbed the focus (run dialog, looking glass);
|
||||
// we don't want to interfere with that
|
||||
let focus = stage.get_key_focus();
|
||||
if (focus != stage && focus != this._searchEntry.entry)
|
||||
return false;
|
||||
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol == Clutter.Escape) {
|
||||
// If we're in one of the "more" modes or showing the
|
||||
// details pane, close them
|
||||
if (this._activePane != null)
|
||||
this._activePane.close();
|
||||
// Otherwise, just close the Overview entirely
|
||||
else
|
||||
Main.overview.hide();
|
||||
return true;
|
||||
} else if (symbol == Clutter.Up) {
|
||||
if (!this._searchActive)
|
||||
return true;
|
||||
this.searchResults.selectUp(false);
|
||||
|
||||
return true;
|
||||
} else if (symbol == Clutter.Down) {
|
||||
if (!this._searchActive)
|
||||
return true;
|
||||
|
||||
this.searchResults.selectDown(false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
_doSearch: function () {
|
||||
this._searchTimeoutId = 0;
|
||||
let text = this._searchEntry.getText();
|
||||
@ -915,14 +940,21 @@ Dash.prototype = {
|
||||
},
|
||||
|
||||
show: function() {
|
||||
global.stage.set_key_focus(this._searchEntry.entry);
|
||||
this._searchEntry.show();
|
||||
if (this._keyPressId == 0)
|
||||
this._keyPressId = global.stage.connect('key-press-event',
|
||||
Lang.bind(this, this._onKeyPress));
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
this._firstSelectAfterOverlayShow = true;
|
||||
this._searchEntry.reset();
|
||||
this._searchEntry.hide();
|
||||
if (this._activePane != null)
|
||||
this._activePane.close();
|
||||
if (this._keyPressId > 0) {
|
||||
global.stage.disconnect(this._keyPressId);
|
||||
this._keyPressId = 0;
|
||||
}
|
||||
},
|
||||
|
||||
closePanes: function () {
|
||||
@ -930,7 +962,7 @@ Dash.prototype = {
|
||||
this._activePane.close();
|
||||
},
|
||||
|
||||
_addPane: function(pane) {
|
||||
_addPane: function(pane, align) {
|
||||
pane.connect('open-state-changed', Lang.bind(this, function (pane, isOpen) {
|
||||
if (isOpen) {
|
||||
if (pane != this._activePane && this._activePane != null) {
|
||||
@ -941,7 +973,7 @@ Dash.prototype = {
|
||||
this._activePane = null;
|
||||
}
|
||||
}));
|
||||
Main.overview.addPane(pane);
|
||||
Main.overview.addPane(pane, align);
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Dash.prototype);
|
||||
|
138
js/ui/dnd.js
@ -1,11 +1,18 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil -*- */
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const St = imports.gi.St;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const Params = imports.misc.params;
|
||||
|
||||
// Time to scale down to maxDragActorSize
|
||||
const SCALE_ANIMATION_TIME = 0.25;
|
||||
// Time to animate to original position on cancel
|
||||
const SNAP_BACK_ANIMATION_TIME = 0.25;
|
||||
|
||||
let eventHandlerActor = null;
|
||||
@ -16,7 +23,7 @@ function _getEventHandlerActor() {
|
||||
eventHandlerActor = new Clutter.Rectangle();
|
||||
eventHandlerActor.width = 0;
|
||||
eventHandlerActor.height = 0;
|
||||
global.stage.add_actor(eventHandlerActor);
|
||||
Main.uiGroup.add_actor(eventHandlerActor);
|
||||
// We connect to 'event' rather than 'captured-event' because the capturing phase doesn't happen
|
||||
// when you've grabbed the pointer.
|
||||
eventHandlerActor.connect('event',
|
||||
@ -27,31 +34,49 @@ function _getEventHandlerActor() {
|
||||
return eventHandlerActor;
|
||||
}
|
||||
|
||||
function _Draggable(actor, manualMode) {
|
||||
this._init(actor, manualMode);
|
||||
function _Draggable(actor, params) {
|
||||
this._init(actor, params);
|
||||
}
|
||||
|
||||
_Draggable.prototype = {
|
||||
_init : function(actor, manualMode) {
|
||||
_init : function(actor, params) {
|
||||
params = Params.parse(params, { manualMode: false,
|
||||
dragActorMaxSize: undefined,
|
||||
dragActorOpacity: undefined });
|
||||
|
||||
this.actor = actor;
|
||||
if (!manualMode)
|
||||
if (!params.manualMode)
|
||||
this.actor.connect('button-press-event',
|
||||
Lang.bind(this, this._onButtonPress));
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, function() {
|
||||
this.disconnectAll();
|
||||
}));
|
||||
this._onEventId = null;
|
||||
|
||||
this._dragActorMaxSize = params.dragActorMaxSize;
|
||||
this._dragActorOpacity = params.dragActorOpacity;
|
||||
|
||||
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
||||
this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
|
||||
this._snapBackInProgress = false; // The drag has been cancelled and the item is in the process of snapping back.
|
||||
},
|
||||
|
||||
_onButtonPress : function (actor, event) {
|
||||
// FIXME: we should make sure it's button 1, but we can't currently
|
||||
// check that from JavaScript
|
||||
if (event.get_button() != 1)
|
||||
return false;
|
||||
|
||||
if (Tweener.getTweenCount(actor))
|
||||
return false;
|
||||
|
||||
this._buttonDown = true;
|
||||
this._grabActor();
|
||||
// special case St.Clickable: grabbing the pointer would mess up the
|
||||
// internal state, so we start the drag manually on hover change
|
||||
if (this.actor instanceof St.Clickable)
|
||||
this.actor.connect('notify::hover',
|
||||
Lang.bind(this, this._onClickableHoverChanged));
|
||||
else
|
||||
this._grabActor();
|
||||
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
this._dragStartX = stageX;
|
||||
@ -60,6 +85,15 @@ _Draggable.prototype = {
|
||||
return false;
|
||||
},
|
||||
|
||||
_onClickableHoverChanged: function(button) {
|
||||
if (button.hover || !button.held)
|
||||
return;
|
||||
|
||||
button.fake_release();
|
||||
this.startDrag(this._dragStartX, this._dragStartY,
|
||||
global.get_current_time());
|
||||
},
|
||||
|
||||
_grabActor: function() {
|
||||
Clutter.grab_pointer(this.actor);
|
||||
this._onEventId = this.actor.connect('event',
|
||||
@ -140,8 +174,8 @@ _Draggable.prototype = {
|
||||
this._ungrabActor();
|
||||
this._grabEvents();
|
||||
|
||||
this._dragStartX = stageX;
|
||||
this._dragStartY = stageY;
|
||||
this._dragX = this._dragStartX = stageX;
|
||||
this._dragY = this._dragStartY = stageY;
|
||||
|
||||
if (this.actor._delegate && this.actor._delegate.getDragActor) {
|
||||
this._dragActor = this.actor._delegate.getDragActor(this._dragStartX, this._dragStartY);
|
||||
@ -154,10 +188,9 @@ _Draggable.prototype = {
|
||||
// the dragActor over it. Otherwise, center it
|
||||
// around the pointer
|
||||
let [sourceX, sourceY] = this._dragActorSource.get_transformed_position();
|
||||
let [sourceWidth, sourceHeight] = this._dragActorSource.get_transformed_size();
|
||||
let x, y;
|
||||
if (stageX > sourceX && stageX <= sourceX + sourceWidth &&
|
||||
stageY > sourceY && stageY <= sourceY + sourceHeight) {
|
||||
if (stageX > sourceX && stageX <= sourceX + this._dragActor.width &&
|
||||
stageY > sourceY && stageY <= sourceY + this._dragActor.height) {
|
||||
x = sourceX;
|
||||
y = sourceY;
|
||||
} else {
|
||||
@ -193,6 +226,45 @@ _Draggable.prototype = {
|
||||
|
||||
this._dragActor.reparent(this.actor.get_stage());
|
||||
this._dragActor.raise_top();
|
||||
|
||||
this._dragOrigOpacity = this._dragActor.opacity;
|
||||
if (this._dragActorOpacity != undefined)
|
||||
this._dragActor.opacity = this._dragActorOpacity;
|
||||
|
||||
this._snapBackX = this._dragStartX + this._dragOffsetX;
|
||||
this._snapBackY = this._dragStartY + this._dragOffsetY;
|
||||
this._snapBackScale = this._dragActor.scale_x;
|
||||
|
||||
if (this._dragActorMaxSize != undefined) {
|
||||
let [scaledWidth, scaledHeight] = this._dragActor.get_transformed_size();
|
||||
let currentSize = Math.max(scaledWidth, scaledHeight);
|
||||
if (currentSize > this._dragActorMaxSize) {
|
||||
let scale = this._dragActorMaxSize / currentSize;
|
||||
let origScale = this._dragActor.scale_x;
|
||||
let origDragOffsetX = this._dragOffsetX;
|
||||
let origDragOffsetY = this._dragOffsetY;
|
||||
|
||||
// The position of the actor changes as we scale
|
||||
// around the drag position, but we can't just tween
|
||||
// to the final position because that tween would
|
||||
// fight with updates as the user continues dragging
|
||||
// the mouse; instead we do the position computations in
|
||||
// an onUpdate() function.
|
||||
Tweener.addTween(this._dragActor,
|
||||
{ scale_x: scale * origScale,
|
||||
scale_y: scale * origScale,
|
||||
time: SCALE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onUpdate: function() {
|
||||
let currentScale = this._dragActor.scale_x / origScale;
|
||||
this._dragOffsetX = currentScale * origDragOffsetX;
|
||||
this._dragOffsetY = currentScale * origDragOffsetY;
|
||||
this._dragActor.set_position(this._dragX + this._dragOffsetX,
|
||||
this._dragY + this._dragOffsetY);
|
||||
},
|
||||
onUpdateScope: this });
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_maybeStartDrag: function(event) {
|
||||
@ -211,6 +283,8 @@ _Draggable.prototype = {
|
||||
|
||||
_updateDragPosition : function (event) {
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
this._dragX = stageX;
|
||||
this._dragY = stageY;
|
||||
|
||||
// If we are dragging, update the position
|
||||
if (this._dragActor) {
|
||||
@ -220,8 +294,7 @@ _Draggable.prototype = {
|
||||
// we have to temporarily hide this._dragActor.
|
||||
this._dragActor.hide();
|
||||
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
||||
stageX + this._dragOffsetX,
|
||||
stageY + this._dragOffsetY);
|
||||
stageX, stageY);
|
||||
this._dragActor.show();
|
||||
while (target) {
|
||||
if (target._delegate && target._delegate.handleDragOver) {
|
||||
@ -230,8 +303,8 @@ _Draggable.prototype = {
|
||||
// We can check the return value of the function and break the loop if it's true if we don't want
|
||||
// to continue checking the parents.
|
||||
target._delegate.handleDragOver(this.actor._delegate, this._dragActor,
|
||||
(stageX + this._dragOffsetX - targX) / target.scale_x,
|
||||
(stageY + this._dragOffsetY - targY) / target.scale_y,
|
||||
(stageX - targX) / target.scale_x,
|
||||
(stageY - targY) / target.scale_y,
|
||||
event.get_time());
|
||||
}
|
||||
target = target.get_parent();
|
||||
@ -280,8 +353,8 @@ _Draggable.prototype = {
|
||||
// Snap back to the actor source if the source is still around, snap back
|
||||
// to the original location if the actor itself was being dragged or the
|
||||
// source is no longer around.
|
||||
let snapBackX = this._dragStartX + this._dragOffsetX;
|
||||
let snapBackY = this._dragStartY + this._dragOffsetY;
|
||||
let snapBackX = this._snapBackX;
|
||||
let snapBackY = this._snapBackY;
|
||||
if (this._dragActorSource && this._dragActorSource.visible) {
|
||||
[snapBackX, snapBackY] = this._dragActorSource.get_transformed_position();
|
||||
}
|
||||
@ -291,8 +364,11 @@ _Draggable.prototype = {
|
||||
Tweener.addTween(this._dragActor,
|
||||
{ x: snapBackX,
|
||||
y: snapBackY,
|
||||
scale_x: this._snapBackScale,
|
||||
scale_y: this._snapBackScale,
|
||||
opacity: this._dragOrigOpacity,
|
||||
time: SNAP_BACK_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._onSnapBackComplete,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [this._dragActor, eventTime]
|
||||
@ -326,10 +402,24 @@ Signals.addSignalMethods(_Draggable.prototype);
|
||||
/**
|
||||
* makeDraggable:
|
||||
* @actor: Source actor
|
||||
* @manualMode: If given, do not automatically start drag and drop on click
|
||||
* @params: (optional) Additional parameters
|
||||
*
|
||||
* Create an object which controls drag and drop for the given actor.
|
||||
*
|
||||
* If %manualMode is %true in @params, do not automatically start
|
||||
* drag and drop on click
|
||||
*
|
||||
* If %dragActorMaxSize is present in @params, the drag actor will
|
||||
* be scaled down to be no larger than that size in pixels.
|
||||
*
|
||||
* If %dragActorOpacity is present in @params, the drag actor will
|
||||
* will be set to have that opacity during the drag.
|
||||
*
|
||||
* Note that when the drag actor is the source actor and the drop
|
||||
* succeeds, the actor scale and opacity aren't reset; if the drop
|
||||
* target wants to reuse the actor, it's up to the drop target to
|
||||
* reset these values.
|
||||
*/
|
||||
function makeDraggable(actor, manualMode) {
|
||||
return new _Draggable(actor, manualMode);
|
||||
function makeDraggable(actor, params) {
|
||||
return new _Draggable(actor, params);
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
@ -42,7 +41,7 @@ DocDisplayItem.prototype = {
|
||||
GenericDisplay.GenericDisplayItem.prototype._init.call(this);
|
||||
this._docInfo = docInfo;
|
||||
|
||||
this._setItemInfo(docInfo.name, "");
|
||||
this._setItemInfo(docInfo.name, '');
|
||||
|
||||
this._timeoutTime = -1;
|
||||
this._resetTimeDisplay(currentSecs);
|
||||
@ -81,12 +80,12 @@ DocDisplayItem.prototype = {
|
||||
// Creates and returns a large preview icon, but only if this._docInfo is an image file
|
||||
// and we were able to generate a pixbuf from it successfully.
|
||||
_createLargePreviewIcon : function() {
|
||||
if (this._docInfo.mimeType == null || this._docInfo.mimeType.indexOf("image/") != 0)
|
||||
if (this._docInfo.mimeType == null || this._docInfo.mimeType.indexOf('image/') != 0)
|
||||
return null;
|
||||
|
||||
try {
|
||||
return Shell.TextureCache.get_default().load_uri_sync(Shell.TextureCachePolicy.NONE,
|
||||
this._docInfo.uri, -1, -1);
|
||||
return St.TextureCache.get_default().load_uri_sync(St.TextureCachePolicy.NONE,
|
||||
this._docInfo.uri, -1, -1);
|
||||
} catch (e) {
|
||||
// An exception will be raised when the image format isn't know
|
||||
/* FIXME: http://bugzilla.gnome.org/show_bug.cgi?id=591480: should
|
||||
@ -267,24 +266,26 @@ function DashDocDisplayItem(docInfo) {
|
||||
DashDocDisplayItem.prototype = {
|
||||
_init: function(docInfo) {
|
||||
this._info = docInfo;
|
||||
this.actor = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
spacing: DEFAULT_SPACING,
|
||||
reactive: true });
|
||||
this.actor.connect('button-release-event', Lang.bind(this, function () {
|
||||
this._icon = docInfo.createIcon(DASH_DOCS_ICON_SIZE);
|
||||
|
||||
this.actor = new St.Clickable({ style_class: 'recent-docs-item',
|
||||
reactive: true,
|
||||
x_align: St.Align.START });
|
||||
|
||||
let box = new St.BoxLayout({ style_class: 'recent-docs-item-box' });
|
||||
this.actor.set_child(box);
|
||||
|
||||
box.add(this._icon);
|
||||
|
||||
let text = new St.Label({ text: docInfo.name });
|
||||
box.add(text);
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, function () {
|
||||
docInfo.launch();
|
||||
Main.overview.hide();
|
||||
}));
|
||||
|
||||
this.actor._delegate = this;
|
||||
|
||||
this._icon = docInfo.createIcon(DASH_DOCS_ICON_SIZE);
|
||||
let iconBox = new Big.Box({ y_align: Big.BoxAlignment.CENTER });
|
||||
iconBox.append(this._icon, Big.BoxPackFlags.NONE);
|
||||
this.actor.append(iconBox, Big.BoxPackFlags.NONE);
|
||||
let name = new St.Label({ style_class: 'dash-recent-docs-item',
|
||||
text: docInfo.name });
|
||||
this.actor.append(name, Big.BoxPackFlags.EXPAND);
|
||||
|
||||
let draggable = DND.makeDraggable(this.actor);
|
||||
},
|
||||
|
||||
@ -357,34 +358,37 @@ DashDocDisplay.prototype = {
|
||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||
let children = actor.get_children();
|
||||
|
||||
// Two columns, where we go vertically down first. So just take
|
||||
// the height of half of the children as our preferred height.
|
||||
// The width of an item is our allocated width, minus spacing, divided in half.
|
||||
this._itemWidth = Math.floor((forWidth - DEFAULT_SPACING) / 2);
|
||||
|
||||
let maxNatural = 0;
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let child = children[i];
|
||||
let [minSize, naturalSize] = child.get_preferred_height(this._itemWidth);
|
||||
maxNatural = Math.max(maxNatural, naturalSize);
|
||||
}
|
||||
|
||||
this._itemHeight = maxNatural;
|
||||
|
||||
let firstColumnChildren = Math.ceil(children.length / 2);
|
||||
|
||||
let natural = 0;
|
||||
for (let i = 0; i < firstColumnChildren; i++) {
|
||||
let child = children[i];
|
||||
let [minSize, naturalSize] = child.get_preferred_height(-1);
|
||||
natural += naturalSize;
|
||||
|
||||
if (i > 0 && i < children.length - 1) {
|
||||
natural += DEFAULT_SPACING;
|
||||
}
|
||||
}
|
||||
alloc.natural_size = natural;
|
||||
alloc.natural_size = (firstColumnChildren * maxNatural +
|
||||
(firstColumnChildren - 1) * DEFAULT_SPACING);
|
||||
},
|
||||
|
||||
_allocate: function(actor, box, flags) {
|
||||
let width = box.x2 - box.x1;
|
||||
let height = box.y2 - box.y1;
|
||||
|
||||
// Make sure this._itemWidth/Height have been computed, even
|
||||
// if the parent actor didn't check our size before allocating.
|
||||
// (Not clear if that is required or not as a Clutter
|
||||
// invariant; this is safe and cheap because of caching.)
|
||||
actor.get_preferred_height(width);
|
||||
|
||||
let children = actor.get_children();
|
||||
|
||||
// The width of an item is our allocated width, minus spacing, divided in half.
|
||||
let itemWidth = Math.floor((width - DEFAULT_SPACING) / 2);
|
||||
let x = box.x1;
|
||||
let y = box.y1;
|
||||
let x = 0;
|
||||
let y = 0;
|
||||
let columnIndex = 0;
|
||||
let i = 0;
|
||||
// Loop over the children, going vertically down first. When we run
|
||||
@ -393,9 +397,7 @@ DashDocDisplay.prototype = {
|
||||
while (i < children.length) {
|
||||
let child = children[i];
|
||||
|
||||
let [minSize, naturalSize] = child.get_preferred_height(-1);
|
||||
|
||||
if (y + naturalSize > box.y2) {
|
||||
if (y + this._itemHeight > box.y2) {
|
||||
// Is this the second column, or we're in
|
||||
// the first column and can't even fit one
|
||||
// item? In that case, break.
|
||||
@ -404,9 +406,9 @@ DashDocDisplay.prototype = {
|
||||
}
|
||||
// Set x to the halfway point.
|
||||
columnIndex += 1;
|
||||
x = x + itemWidth + DEFAULT_SPACING;
|
||||
x = x + this._itemWidth + DEFAULT_SPACING;
|
||||
// And y is back to the top.
|
||||
y = box.y1;
|
||||
y = 0;
|
||||
// Retry this same item, now that we're in the second column.
|
||||
// By looping back to the top here, we re-test the size
|
||||
// again for the second column.
|
||||
@ -416,13 +418,13 @@ DashDocDisplay.prototype = {
|
||||
let childBox = new Clutter.ActorBox();
|
||||
childBox.x1 = x;
|
||||
childBox.y1 = y;
|
||||
childBox.x2 = childBox.x1 + itemWidth;
|
||||
childBox.y2 = y + naturalSize;
|
||||
childBox.x2 = childBox.x1 + this._itemWidth;
|
||||
childBox.y2 = y + this._itemHeight;
|
||||
|
||||
y = childBox.y2 + DEFAULT_SPACING;
|
||||
|
||||
child.show();
|
||||
child.allocate(childBox, flags);
|
||||
this.actor.set_skip_paint(child, false);
|
||||
|
||||
i++;
|
||||
}
|
||||
@ -438,7 +440,6 @@ DashDocDisplay.prototype = {
|
||||
this._checkDocExistence = false;
|
||||
}
|
||||
|
||||
let skipPaint = [];
|
||||
for (; i < children.length; i++)
|
||||
this.actor.set_skip_paint(children[i], true);
|
||||
},
|
||||
@ -485,7 +486,7 @@ DocSearchProvider.prototype = {
|
||||
__proto__: Search.SearchProvider.prototype,
|
||||
|
||||
_init: function(name) {
|
||||
Search.SearchProvider.prototype._init.call(this, _("DOCUMENTS"));
|
||||
Search.SearchProvider.prototype._init.call(this, _("RECENT ITEMS"));
|
||||
this._docManager = DocInfo.getDocManager();
|
||||
},
|
||||
|
||||
@ -512,6 +513,6 @@ DocSearchProvider.prototype = {
|
||||
},
|
||||
|
||||
expandSearch: function(terms) {
|
||||
log("TODO expand docs search");
|
||||
log('TODO expand docs search');
|
||||
}
|
||||
};
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Gettext_gtk20 = imports.gettext.domain('gtk20');
|
||||
|
||||
@ -28,15 +29,57 @@ function _patchContainerClass(containerClass) {
|
||||
};
|
||||
}
|
||||
|
||||
_patchContainerClass(St.BoxLayout);
|
||||
_patchContainerClass(St.Table);
|
||||
// Replace @method with something that throws an error instead
|
||||
function _blockMethod(method, replacement, reason) {
|
||||
let match = method.match(/^(.+)\.([^.]+)$/);
|
||||
if (!match)
|
||||
throw new Error('Bad method name "' + method + '"');
|
||||
let proto = 'imports.gi.' + match[1] + '.prototype';
|
||||
let property = match[2];
|
||||
|
||||
if (!global.set_property_mutable(proto, property, true))
|
||||
throw new Error('Bad method name "' + method + '"');
|
||||
|
||||
// eval() is evil in general, but we know it's safe here since
|
||||
// set_property_mutable() would have failed if proto was
|
||||
// malformed.
|
||||
let node = eval(proto);
|
||||
|
||||
let msg = 'Do not use "' + method + '".';
|
||||
if (replacement)
|
||||
msg += ' Use "' + replacement + '" instead.';
|
||||
if (reason)
|
||||
msg += ' (' + reason + ')';
|
||||
|
||||
node[property] = function() {
|
||||
throw new Error(msg);
|
||||
};
|
||||
|
||||
global.set_property_mutable(proto, property, false);
|
||||
}
|
||||
|
||||
function init() {
|
||||
Tweener.init();
|
||||
String.prototype.format = Format.format;
|
||||
|
||||
// Set the default direction for St widgets (this needs to be done before any use of St)
|
||||
if (Gettext_gtk20.gettext("default:LTR") == "default:RTL") {
|
||||
if (Gettext_gtk20.gettext('default:LTR') == 'default:RTL') {
|
||||
St.Widget.set_default_direction(St.TextDirection.RTL);
|
||||
}
|
||||
|
||||
_patchContainerClass(St.BoxLayout);
|
||||
_patchContainerClass(St.Table);
|
||||
|
||||
_blockMethod('Clutter.Event.get_state', 'Shell.get_event_state',
|
||||
'gjs\'s handling of Clutter.ModifierType is broken. See bug 597292.');
|
||||
_blockMethod('Gdk.Display.get_pointer', 'global.get_pointer',
|
||||
'gjs\'s handling of Gdk.ModifierType is broken. See bug 597292.');
|
||||
_blockMethod('Gdk.Window.get_pointer', 'global.get_pointer',
|
||||
'gjs\'s handling of Gdk.ModifierType is broken. See bug 597292.');
|
||||
|
||||
// Now close the back door to prevent extensions from trying to
|
||||
// abuse it. We can't actually delete it since
|
||||
// Shell.Global.prototype itself is read-only.
|
||||
global.set_property_mutable('imports.gi.Shell.Global.prototype', 'set_property_mutable', true);
|
||||
Shell.Global.prototype.set_property_mutable = undefined;
|
||||
}
|
||||
|
@ -119,13 +119,12 @@ function loadExtension(dir, enabled, type) {
|
||||
}
|
||||
|
||||
function init() {
|
||||
let userConfigPath = GLib.get_user_config_dir();
|
||||
let userExtensionsPath = GLib.build_filenamev([userConfigPath, 'gnome-shell', 'extensions']);
|
||||
let userExtensionsPath = GLib.build_filenamev([global.userdatadir, 'extensions']);
|
||||
userExtensionsDir = Gio.file_new_for_path(userExtensionsPath);
|
||||
try {
|
||||
userExtensionsDir.make_directory_with_parents(null);
|
||||
} catch (e) {
|
||||
global.logError(""+e);
|
||||
global.logError('' + e);
|
||||
}
|
||||
|
||||
disabledExtensions = Shell.GConf.get_default().get_string_list('disabled_extensions');
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
@ -21,25 +20,9 @@ const RedisplayFlags = { NONE: 0,
|
||||
SUBSEARCH: 1 << 2,
|
||||
IMMEDIATE: 1 << 3 };
|
||||
|
||||
const ITEM_DISPLAY_DESCRIPTION_COLOR = new Clutter.Color();
|
||||
ITEM_DISPLAY_DESCRIPTION_COLOR.from_pixel(0xffffffbb);
|
||||
const DISPLAY_CONTROL_SELECTED_COLOR = new Clutter.Color();
|
||||
DISPLAY_CONTROL_SELECTED_COLOR.from_pixel(0x112288ff);
|
||||
const PREVIEW_BOX_BACKGROUND_COLOR = new Clutter.Color();
|
||||
PREVIEW_BOX_BACKGROUND_COLOR.from_pixel(0xADADADf0);
|
||||
|
||||
const DEFAULT_PADDING = 4;
|
||||
|
||||
// Used by subclasses
|
||||
const ITEM_DISPLAY_ICON_SIZE = 48;
|
||||
const DEFAULT_COLUMN_GAP = 6;
|
||||
|
||||
const PREVIEW_ICON_SIZE = 96;
|
||||
const PREVIEW_BOX_PADDING = 6;
|
||||
const PREVIEW_BOX_SPACING = DEFAULT_PADDING;
|
||||
const PREVIEW_BOX_CORNER_RADIUS = 10;
|
||||
// how far relative to the full item width the preview box should be placed
|
||||
const PREVIEW_PLACING = 3/4;
|
||||
const PREVIEW_DETAILS_MIN_WIDTH = PREVIEW_ICON_SIZE * 2;
|
||||
|
||||
/* This is a virtual class that represents a single display item containing
|
||||
* a name, a description, and an icon. It allows selecting an item and represents
|
||||
@ -51,7 +34,7 @@ function GenericDisplayItem() {
|
||||
|
||||
GenericDisplayItem.prototype = {
|
||||
_init: function() {
|
||||
this.actor = new St.BoxLayout({ style_class: "generic-display-item",
|
||||
this.actor = new St.BoxLayout({ style_class: 'generic-display-item',
|
||||
reactive: true });
|
||||
|
||||
this.actor._delegate = this;
|
||||
@ -105,7 +88,10 @@ GenericDisplayItem.prototype = {
|
||||
// Highlights the item by setting a different background color than the default
|
||||
// if isSelected is true, removes the highlighting otherwise.
|
||||
markSelected: function(isSelected) {
|
||||
this.actor.set_style_pseudo_class(isSelected ? "selected" : null);
|
||||
if (isSelected)
|
||||
this.actor.add_style_pseudo_class('selected');
|
||||
else
|
||||
this.actor.remove_style_pseudo_class('selected');
|
||||
},
|
||||
|
||||
/*
|
||||
@ -114,11 +100,10 @@ GenericDisplayItem.prototype = {
|
||||
*/
|
||||
createDetailsActor: function() {
|
||||
|
||||
let details = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
spacing: PREVIEW_BOX_SPACING });
|
||||
let details = new St.BoxLayout({ style_class: 'generic-display-container',
|
||||
vertical: true });
|
||||
|
||||
let mainDetails = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
spacing: PREVIEW_BOX_SPACING });
|
||||
let mainDetails = new St.BoxLayout({ style_class: 'generic-display-container' });
|
||||
|
||||
// Inner box with name and description
|
||||
let textDetails = new St.BoxLayout({ style_class: 'generic-display-details',
|
||||
@ -132,21 +117,19 @@ GenericDisplayItem.prototype = {
|
||||
|
||||
this._detailsDescriptions.push(detailsDescription);
|
||||
|
||||
mainDetails.append(textDetails, Big.BoxPackFlags.EXPAND);
|
||||
mainDetails.add(textDetails, { expand: true });
|
||||
|
||||
let previewIcon = this._createPreviewIcon();
|
||||
let largePreviewIcon = this._createLargePreviewIcon();
|
||||
|
||||
if (previewIcon != null && largePreviewIcon == null) {
|
||||
mainDetails.prepend(previewIcon, Big.BoxPackFlags.NONE);
|
||||
mainDetails.insert_actor(previewIcon, 0);
|
||||
}
|
||||
|
||||
details.append(mainDetails, Big.BoxPackFlags.NONE);
|
||||
details.add(mainDetails);
|
||||
|
||||
if (largePreviewIcon != null) {
|
||||
let largePreview = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL });
|
||||
largePreview.append(largePreviewIcon, Big.BoxPackFlags.NONE);
|
||||
details.append(largePreview, Big.BoxPackFlags.NONE);
|
||||
details.add(largePreviewIcon);
|
||||
}
|
||||
|
||||
return details;
|
||||
@ -161,7 +144,7 @@ GenericDisplayItem.prototype = {
|
||||
|
||||
// Performes an action associated with launching this item, such as opening a file or an application.
|
||||
launch: function() {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
//// Protected methods ////
|
||||
@ -193,12 +176,12 @@ GenericDisplayItem.prototype = {
|
||||
this._icon = this._createIcon();
|
||||
this._iconBin.set_child(this._icon);
|
||||
|
||||
this._name = new St.Label({ style_class: "generic-display-item-name",
|
||||
this._name = new St.Label({ style_class: 'generic-display-item-name',
|
||||
text: nameText });
|
||||
this._infoText.add(this._name);
|
||||
|
||||
this._description = new St.Label({ style_class: "generic-display-item-description",
|
||||
text: descriptionText ? descriptionText : "" });
|
||||
this._description = new St.Label({ style_class: 'generic-display-item-description',
|
||||
text: descriptionText ? descriptionText : '' });
|
||||
this._infoText.add(this._description);
|
||||
},
|
||||
|
||||
@ -225,12 +208,12 @@ GenericDisplayItem.prototype = {
|
||||
|
||||
// Returns an icon for the item.
|
||||
_createIcon: function() {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
// Returns a preview icon for the item.
|
||||
_createPreviewIcon: function() {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
//// Private methods ////
|
||||
@ -240,7 +223,7 @@ Signals.addSignalMethods(GenericDisplayItem.prototype);
|
||||
|
||||
const GenericDisplayFlags = {
|
||||
DISABLE_VSCROLLING: 1 << 0
|
||||
}
|
||||
};
|
||||
|
||||
/* This is a virtual class that represents a display containing a collection of items
|
||||
* that can be filtered with a search string.
|
||||
@ -257,13 +240,15 @@ GenericDisplay.prototype = {
|
||||
|
||||
if (disableVScrolling) {
|
||||
this.actor = this._list = new Shell.OverflowList({ spacing: 6,
|
||||
item_height: 50 });
|
||||
item_height: 50 });
|
||||
} else {
|
||||
this.actor = new St.ScrollView({ x_fill: true, y_fill: true });
|
||||
this.actor.get_hscroll_bar().hide();
|
||||
this.actor = new St.ScrollView({ x_fill: true,
|
||||
y_fill: false,
|
||||
vshadows: true });
|
||||
this._list = new St.BoxLayout({ style_class: 'generic-display-container',
|
||||
vertical: true });
|
||||
this.actor.add_actor(this._list);
|
||||
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
}
|
||||
|
||||
this._pendingRedisplay = RedisplayFlags.NONE;
|
||||
@ -371,7 +356,7 @@ GenericDisplay.prototype = {
|
||||
// TODO: figure out why this._list.displayedCount is returning a
|
||||
// positive number when this._mathedItems.length is 0
|
||||
// This can be triggered if a search string is entered for which there are no matches.
|
||||
// log("this._mathedItems.length: " + this._matchedItems.length + " this._list.displayedCount " + this._list.displayedCount);
|
||||
// log('this._mathedItems.length: ' + this._matchedItems.length + ' this._list.displayedCount ' + this._list.displayedCount);
|
||||
return this._matchedItemKeys.length > 0;
|
||||
},
|
||||
|
||||
@ -417,7 +402,7 @@ GenericDisplay.prototype = {
|
||||
// and adds it to the list of displayed items, but does not yet display it.
|
||||
_addDisplayItem : function(itemId) {
|
||||
if (this._displayedItems.hasOwnProperty(itemId)) {
|
||||
log("Tried adding a display item for " + itemId + ", but an item with this item id is already among displayed items.");
|
||||
log('Tried adding a display item for ' + itemId + ', but an item with this item id is already among displayed items.');
|
||||
return;
|
||||
}
|
||||
|
||||
@ -476,7 +461,7 @@ GenericDisplay.prototype = {
|
||||
// Return true if there's an active search or other constraint
|
||||
// on the list
|
||||
_filterActive: function() {
|
||||
return this._search != "";
|
||||
return this._search != '';
|
||||
},
|
||||
|
||||
// Called when we are resetting state
|
||||
@ -599,32 +584,32 @@ GenericDisplay.prototype = {
|
||||
// Implementation should return %true if we are up to date, and %false
|
||||
// if a full reload occurred.
|
||||
_refreshCache: function() {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
// Sets the list of the displayed items based on the default sorting order.
|
||||
// The default sorting order is specific to each implementing class.
|
||||
_setDefaultList: function() {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
// Compares items associated with the item ids based on the order in which the
|
||||
// items should be displayed.
|
||||
// Intended to be used as a compareFunction for array.sort().
|
||||
// Returns an integer value indicating the result of the comparison.
|
||||
// Compares items associated with the item ids based on the order in which the
|
||||
// items should be displayed.
|
||||
// Intended to be used as a compareFunction for array.sort().
|
||||
// Returns an integer value indicating the result of the comparison.
|
||||
_compareItems: function(itemIdA, itemIdB) {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
// Checks if the item info can be a match for the search string.
|
||||
// Returns a boolean flag indicating if that's the case.
|
||||
_isInfoMatching: function(itemInfo, search) {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
// Creates a display item based on itemInfo.
|
||||
_createDisplayItem: function(itemInfo) {
|
||||
throw new Error("Not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
//// Private methods ////
|
||||
@ -698,7 +683,7 @@ GenericDisplay.prototype = {
|
||||
|
||||
this._selectedIndex = index;
|
||||
if (index < 0)
|
||||
return
|
||||
return;
|
||||
|
||||
// Mark the new item as selected and create its details pane
|
||||
let item = this._findDisplayedByIndex(index);
|
||||
|
@ -2,16 +2,13 @@
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const SHADE_COLOR = new Clutter.Color();
|
||||
SHADE_COLOR.from_pixel(0x00000044);
|
||||
const Meta = imports.gi.Meta;
|
||||
const St = imports.gi.St;
|
||||
|
||||
/**
|
||||
* Lightbox:
|
||||
* @container: parent Clutter.Container
|
||||
* @inhibitEvents: whether to inhibit events for @container
|
||||
* @width: (optional) shade actor width
|
||||
* @height: (optional) shade actor height
|
||||
*
|
||||
@ -29,24 +26,23 @@ SHADE_COLOR.from_pixel(0x00000044);
|
||||
* @container and will track any changes in its size. You can override
|
||||
* this by passing an explicit width and height
|
||||
*/
|
||||
function Lightbox(container, width, height) {
|
||||
this._init(container, width, height);
|
||||
function Lightbox(container, inhibitEvents, width, height) {
|
||||
this._init(container, inhibitEvents, width, height);
|
||||
}
|
||||
|
||||
Lightbox.prototype = {
|
||||
_init : function(container, width, height) {
|
||||
_init : function(container, inhibitEvents, width, height) {
|
||||
this._container = container;
|
||||
this._children = container.get_children();
|
||||
this.actor = new Clutter.Rectangle({ color: SHADE_COLOR,
|
||||
x: 0,
|
||||
y: 0,
|
||||
border_width: 0,
|
||||
reactive: true });
|
||||
this.actor = new St.Bin({ x: 0,
|
||||
y: 0,
|
||||
style_class: 'lightbox',
|
||||
reactive: inhibitEvents });
|
||||
|
||||
container.add_actor(this.actor);
|
||||
this.actor.raise_top();
|
||||
|
||||
this._destroySignalId = this.actor.connect('destroy', Lang.bind(this, this.destroy));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
if (width && height) {
|
||||
this.actor.width = width;
|
||||
@ -65,8 +61,13 @@ Lightbox.prototype = {
|
||||
},
|
||||
|
||||
_allocationChanged : function(container, box, flags) {
|
||||
this.actor.width = this._container.width;
|
||||
this.actor.height = this._container.height;
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
||||
this.actor.width = this.width;
|
||||
this.actor.height = this.height;
|
||||
return false;
|
||||
}));
|
||||
this.width = this._container.width;
|
||||
this.height = this._container.height;
|
||||
},
|
||||
|
||||
_actorAdded : function(container, newChild) {
|
||||
@ -134,18 +135,24 @@ Lightbox.prototype = {
|
||||
/**
|
||||
* destroy:
|
||||
*
|
||||
* Destroys the lightbox. This is called automatically if the
|
||||
* lightbox's container is destroyed.
|
||||
* Destroys the lightbox.
|
||||
*/
|
||||
destroy : function() {
|
||||
this.actor.destroy();
|
||||
},
|
||||
|
||||
/**
|
||||
* _onDestroy:
|
||||
*
|
||||
* This is called when the lightbox' actor is destroyed, either
|
||||
* by destroying its container or by explicitly calling this.destroy().
|
||||
*/
|
||||
_onDestroy: function() {
|
||||
if (this._allocationChangedSignalId != 0)
|
||||
this._container.disconnect(this._allocationChangedSignalId);
|
||||
this._container.disconnect(this._actorAddedSignalId);
|
||||
this._container.disconnect(this._actorRemovedSignalId);
|
||||
|
||||
this.actor.disconnect(this._destroySignalId);
|
||||
|
||||
this.highlight(null);
|
||||
this.actor.destroy();
|
||||
}
|
||||
};
|
||||
|
@ -12,6 +12,7 @@ function Link(props) {
|
||||
Link.prototype = {
|
||||
_init : function(props) {
|
||||
let realProps = { reactive: true,
|
||||
track_hover: true,
|
||||
style_class: 'shell-link' };
|
||||
// The user can pass in reactive: false to override the above and get
|
||||
// a non-reactive link (a link to the current page, perhaps)
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Pango = imports.gi.Pango;
|
||||
const St = imports.gi.St;
|
||||
@ -18,22 +18,22 @@ const Tweener = imports.ui.tweener;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
/* Imports...feel free to add here as needed */
|
||||
var commandHeader = "const Clutter = imports.gi.Clutter; " +
|
||||
"const GLib = imports.gi.GLib; " +
|
||||
"const Gtk = imports.gi.Gtk; " +
|
||||
"const Mainloop = imports.mainloop; " +
|
||||
"const Meta = imports.gi.Meta; " +
|
||||
"const Shell = imports.gi.Shell; " +
|
||||
"const Main = imports.ui.main; " +
|
||||
"const Lang = imports.lang; " +
|
||||
"const Tweener = imports.ui.tweener; " +
|
||||
var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
|
||||
'const GLib = imports.gi.GLib; ' +
|
||||
'const Gtk = imports.gi.Gtk; ' +
|
||||
'const Mainloop = imports.mainloop; ' +
|
||||
'const Meta = imports.gi.Meta; ' +
|
||||
'const Shell = imports.gi.Shell; ' +
|
||||
'const Main = imports.ui.main; ' +
|
||||
'const Lang = imports.lang; ' +
|
||||
'const Tweener = imports.ui.tweener; ' +
|
||||
/* Utility functions...we should probably be able to use these
|
||||
* in the shell core code too. */
|
||||
"const stage = global.stage; " +
|
||||
"const color = function(pixel) { let c= new Clutter.Color(); c.from_pixel(pixel); return c; }; " +
|
||||
'const stage = global.stage; ' +
|
||||
'const color = function(pixel) { let c= new Clutter.Color(); c.from_pixel(pixel); return c; }; ' +
|
||||
/* Special lookingGlass functions */
|
||||
"const it = Main.lookingGlass.getIt(); " +
|
||||
"const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); ";
|
||||
'const it = Main.lookingGlass.getIt(); ' +
|
||||
'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); ';
|
||||
|
||||
function Notebook() {
|
||||
this._init();
|
||||
@ -43,14 +43,16 @@ Notebook.prototype = {
|
||||
_init: function() {
|
||||
this.actor = new St.BoxLayout({ vertical: true });
|
||||
|
||||
this.tabControls = new St.BoxLayout({ style_class: "labels" });
|
||||
this.tabControls = new St.BoxLayout({ style_class: 'labels' });
|
||||
|
||||
this._selectedIndex = -1;
|
||||
this._tabs = [];
|
||||
},
|
||||
|
||||
appendPage: function(name, child) {
|
||||
let labelBox = new St.BoxLayout({ style_class: "notebook-tab" });
|
||||
let labelBox = new St.BoxLayout({ style_class: 'notebook-tab',
|
||||
reactive: true,
|
||||
track_hover: true });
|
||||
let label = new St.Button({ label: name });
|
||||
label.connect('clicked', Lang.bind(this, function () {
|
||||
this.selectChild(child);
|
||||
@ -84,7 +86,7 @@ Notebook.prototype = {
|
||||
if (this._selectedIndex < 0)
|
||||
return;
|
||||
let tabData = this._tabs[this._selectedIndex];
|
||||
tabData.labelBox.set_style_pseudo_class(null);
|
||||
tabData.labelBox.remove_style_pseudo_class('selected');
|
||||
tabData.scrollView.hide();
|
||||
this._selectedIndex = -1;
|
||||
},
|
||||
@ -98,7 +100,7 @@ Notebook.prototype = {
|
||||
return;
|
||||
}
|
||||
let tabData = this._tabs[index];
|
||||
tabData.labelBox.set_style_pseudo_class('selected');
|
||||
tabData.labelBox.add_style_pseudo_class('selected');
|
||||
tabData.scrollView.show();
|
||||
this._selectedIndex = index;
|
||||
this.emit('selection', tabData.child);
|
||||
@ -136,9 +138,43 @@ Notebook.prototype = {
|
||||
let vAdjust = tabData.scrollView.vscroll.adjustment;
|
||||
vAdjust.value = vAdjust.upper - vAdjust.page_size;
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Notebook.prototype);
|
||||
|
||||
function objectToString(o) {
|
||||
if (typeof(o) == typeof(objectToString)) {
|
||||
// special case this since the default is way, way too verbose
|
||||
return "<js function>";
|
||||
} else {
|
||||
return "" + o;
|
||||
}
|
||||
}
|
||||
|
||||
function ObjLink(o, title) {
|
||||
this._init(o, title);
|
||||
}
|
||||
|
||||
ObjLink.prototype = {
|
||||
__proto__: Link.Link,
|
||||
|
||||
_init: function(o, title) {
|
||||
let text;
|
||||
if (title)
|
||||
text = title;
|
||||
else
|
||||
text = objectToString(o);
|
||||
text = GLib.markup_escape_text(text, -1);
|
||||
this._obj = o;
|
||||
Link.Link.prototype._init.call(this, { label: text });
|
||||
this.actor.get_child().single_line_mode = true;
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
},
|
||||
|
||||
_onClicked: function (link) {
|
||||
Main.lookingGlass.inspectObject(this._obj, this.actor);
|
||||
}
|
||||
};
|
||||
|
||||
function Result(command, o, index) {
|
||||
this._init(command, o, index);
|
||||
}
|
||||
@ -148,109 +184,176 @@ Result.prototype = {
|
||||
this.index = index;
|
||||
this.o = o;
|
||||
|
||||
this.actor = new Big.Box();
|
||||
this.actor = new St.BoxLayout({ vertical: true });
|
||||
|
||||
let cmdTxt = new St.Label({ text: command });
|
||||
cmdTxt.ellipsize = Pango.EllipsizeMode.END;
|
||||
|
||||
this.actor.append(cmdTxt, Big.BoxPackFlags.NONE);
|
||||
let resultTxt = new St.Label({ text: "r(" + index + ") = " + o });
|
||||
resultTxt.ellipsize = Pango.EllipsizeMode.END;
|
||||
|
||||
this.actor.append(resultTxt, Big.BoxPackFlags.NONE);
|
||||
let line = new Clutter.Rectangle({ name: "Separator",
|
||||
height: 1 });
|
||||
let padBin = new St.Bin({ name: "Separator", x_fill: true, y_fill: true });
|
||||
cmdTxt.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||
this.actor.add(cmdTxt);
|
||||
let box = new St.BoxLayout({});
|
||||
this.actor.add(box);
|
||||
let resultTxt = new St.Label({ text: 'r(' + index + ') = ' });
|
||||
resultTxt.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||
box.add(resultTxt);
|
||||
let objLink = new ObjLink(o);
|
||||
box.add(objLink.actor);
|
||||
let line = new Clutter.Rectangle({ name: 'Separator' });
|
||||
let padBin = new St.Bin({ name: 'Separator', x_fill: true, y_fill: true });
|
||||
padBin.add_actor(line);
|
||||
this.actor.append(padBin, Big.BoxPackFlags.NONE);
|
||||
this.actor.add(padBin);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function ActorHierarchy() {
|
||||
function WindowList() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
ActorHierarchy.prototype = {
|
||||
WindowList.prototype = {
|
||||
_init : function () {
|
||||
this._previousTarget = null;
|
||||
this._target = null;
|
||||
|
||||
this._parentList = [];
|
||||
|
||||
this.actor = new St.BoxLayout({ name: "ActorHierarchy", vertical: true });
|
||||
this.actor = new St.BoxLayout({ name: 'Windows', vertical: true, style: 'spacing: 8px' });
|
||||
let display = global.screen.get_display();
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
this._updateId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._updateWindowList));
|
||||
display.connect('window-created', Lang.bind(this, this._updateWindowList));
|
||||
tracker.connect('tracked-windows-changed', Lang.bind(this, this._updateWindowList));
|
||||
},
|
||||
|
||||
setTarget: function(actor) {
|
||||
this._previousTarget = this._target;
|
||||
this.target = actor;
|
||||
|
||||
this.actor.get_children().forEach(function (child) { child.destroy(); });
|
||||
|
||||
if (!(actor instanceof Clutter.Actor))
|
||||
return;
|
||||
|
||||
if (this.target == null)
|
||||
return;
|
||||
|
||||
this._parentList = [];
|
||||
let parent = actor;
|
||||
while ((parent = parent.get_parent()) != null) {
|
||||
this._parentList.push(parent);
|
||||
|
||||
let link = new St.Label({ reactive: true,
|
||||
text: "" + parent });
|
||||
this.actor.add_actor(link);
|
||||
let parentTarget = parent;
|
||||
link.connect('button-press-event', Lang.bind(this, function () {
|
||||
this._selectByActor(parentTarget);
|
||||
return true;
|
||||
}));
|
||||
}
|
||||
this.emit('selection', actor);
|
||||
},
|
||||
|
||||
_selectByActor: function(actor) {
|
||||
let idx = this._parentList.indexOf(actor);
|
||||
let children = this.actor.get_children();
|
||||
let link = children[idx];
|
||||
this.emit('selection', actor);
|
||||
}
|
||||
}
|
||||
Signals.addSignalMethods(ActorHierarchy.prototype);
|
||||
|
||||
function PropertyInspector() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
PropertyInspector.prototype = {
|
||||
_init : function () {
|
||||
this._target = null;
|
||||
|
||||
this._parentList = [];
|
||||
|
||||
this.actor = new St.BoxLayout({ name: "PropertyInspector", vertical: true });
|
||||
},
|
||||
|
||||
setTarget: function(actor) {
|
||||
this.target = actor;
|
||||
|
||||
this.actor.get_children().forEach(function (child) { child.destroy(); });
|
||||
|
||||
for (let propName in actor) {
|
||||
let valueStr;
|
||||
try {
|
||||
valueStr = "" + actor[propName];
|
||||
} catch (e) {
|
||||
valueStr = '<error>';
|
||||
_updateWindowList: function() {
|
||||
this.actor.get_children().forEach(function (actor) { actor.destroy(); });
|
||||
let windows = global.get_windows();
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let metaWindow = windows[i].metaWindow;
|
||||
metaWindow.connect('unmanaged', Lang.bind(this, this._updateWindowList));
|
||||
let box = new St.BoxLayout({ vertical: true });
|
||||
this.actor.add(box);
|
||||
let windowLink = new ObjLink(metaWindow, metaWindow.title);
|
||||
box.add(windowLink.actor, { x_align: St.Align.START, x_fill: false });
|
||||
let propsBox = new St.BoxLayout({ vertical: true, style: 'padding-left: 6px;' });
|
||||
box.add(propsBox);
|
||||
propsBox.add(new St.Label({ text: 'wmclass: ' + metaWindow.get_wm_class() }));
|
||||
let app = tracker.get_window_app(metaWindow);
|
||||
if (app != null && !app.is_transient()) {
|
||||
let icon = app.create_icon_texture(22);
|
||||
let propBox = new St.BoxLayout({ style: 'spacing: 6px; ' });
|
||||
propsBox.add(propBox);
|
||||
propBox.add(new St.Label({ text: 'app: ' }), { y_fill: false });
|
||||
let appLink = new ObjLink(app, app.get_id());
|
||||
propBox.add(appLink.actor, { y_fill: false });
|
||||
propBox.add(icon, { y_fill: false });
|
||||
} else {
|
||||
propsBox.add(new St.Label({ text: '<untracked>' }));
|
||||
}
|
||||
let propText = propName + ": " + valueStr;
|
||||
let propDisplay = new St.Label({ reactive: true,
|
||||
text: propText });
|
||||
this.actor.add_actor(propDisplay);
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(WindowList.prototype);
|
||||
|
||||
function ObjInspector() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
ObjInspector.prototype = {
|
||||
_init : function () {
|
||||
this._obj = null;
|
||||
this._previousObj = null;
|
||||
|
||||
this._parentList = [];
|
||||
|
||||
this.actor = new St.ScrollView({ x_fill: true, y_fill: true });
|
||||
this.actor.get_hscroll_bar().hide();
|
||||
this._container = new St.BoxLayout({ name: 'LookingGlassPropertyInspector',
|
||||
style_class: 'lg-dialog',
|
||||
vertical: true });
|
||||
this.actor.add_actor(this._container);
|
||||
},
|
||||
|
||||
selectObject: function(obj, skipPrevious) {
|
||||
if (!skipPrevious)
|
||||
this._previousObj = this._obj;
|
||||
else
|
||||
this._previousObj = null;
|
||||
this._obj = obj;
|
||||
|
||||
this._container.get_children().forEach(function (child) { child.destroy(); });
|
||||
|
||||
let hbox = new St.BoxLayout({ style_class: 'lg-obj-inspector-title' });
|
||||
this._container.add_actor(hbox);
|
||||
let label = new St.Label({ text: 'Inspecting: %s: %s'.format(typeof(obj),
|
||||
objectToString(obj)) });
|
||||
label.single_line_mode = true;
|
||||
hbox.add(label, { expand: true, y_fill: false });
|
||||
let button = new St.Button({ label: 'Insert', style_class: 'lg-obj-inspector-button' });
|
||||
button.connect('clicked', Lang.bind(this, this._onInsert));
|
||||
hbox.add(button);
|
||||
|
||||
if (this._previousObj != null) {
|
||||
button = new St.Button({ label: 'Back', style_class: 'lg-obj-inspector-button' });
|
||||
button.connect('clicked', Lang.bind(this, this._onBack));
|
||||
hbox.add(button);
|
||||
}
|
||||
|
||||
button = new St.Button({ style_class: 'window-close' });
|
||||
button.connect('clicked', Lang.bind(this, this.close));
|
||||
hbox.add(button);
|
||||
if (typeof(obj) == typeof({})) {
|
||||
for (let propName in obj) {
|
||||
let valueStr;
|
||||
let link;
|
||||
try {
|
||||
let prop = obj[propName];
|
||||
link = new ObjLink(prop).actor;
|
||||
} catch (e) {
|
||||
link = new St.Label({ text: '<error>' });
|
||||
}
|
||||
let hbox = new St.BoxLayout();
|
||||
let propText = propName + ": " + valueStr;
|
||||
hbox.add(new St.Label({ text: propName + ': ' }));
|
||||
hbox.add(link);
|
||||
this._container.add_actor(hbox);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
open: function(sourceActor) {
|
||||
if (this._open)
|
||||
return;
|
||||
this._previousObj = null;
|
||||
this._open = true;
|
||||
this.actor.show();
|
||||
if (sourceActor) {
|
||||
this.actor.set_scale(0, 0);
|
||||
let [sourceX, sourceY] = sourceActor.get_transformed_position();
|
||||
let [sourceWidth, sourceHeight] = sourceActor.get_transformed_size();
|
||||
this.actor.move_anchor_point(Math.floor(sourceX + sourceWidth / 2),
|
||||
Math.floor(sourceY + sourceHeight / 2));
|
||||
Tweener.addTween(this.actor, { scale_x: 1, scale_y: 1,
|
||||
transition: "easeOutQuad",
|
||||
time: 0.2 });
|
||||
} else {
|
||||
this.actor.set_scale(1, 1);
|
||||
}
|
||||
},
|
||||
|
||||
close: function() {
|
||||
if (!this._open)
|
||||
return;
|
||||
this._open = false;
|
||||
this.actor.hide();
|
||||
this._previousObj = null;
|
||||
this._obj = null;
|
||||
},
|
||||
|
||||
_onInsert: function() {
|
||||
let obj = this._obj;
|
||||
this.close();
|
||||
Main.lookingGlass.insertObject(obj);
|
||||
},
|
||||
|
||||
_onBack: function() {
|
||||
this.selectObject(this._previousObj, true);
|
||||
}
|
||||
};
|
||||
|
||||
function Inspector() {
|
||||
this._init();
|
||||
}
|
||||
@ -259,14 +362,14 @@ Inspector.prototype = {
|
||||
_init: function() {
|
||||
let width = 150;
|
||||
let primary = global.get_primary_monitor();
|
||||
let eventHandler = new St.BoxLayout({ name: "LookingGlassDialog",
|
||||
let eventHandler = new St.BoxLayout({ name: 'LookingGlassDialog',
|
||||
vertical: false,
|
||||
y: primary.y + Math.floor(primary.height / 2),
|
||||
reactive: true });
|
||||
eventHandler.connect('notify::allocation', Lang.bind(this, function () {
|
||||
eventHandler.x = primary.x + Math.floor((primary.width - eventHandler.width) / 2);
|
||||
}));
|
||||
global.stage.add_actor(eventHandler);
|
||||
Main.uiGroup.add_actor(eventHandler);
|
||||
let displayText = new St.Label();
|
||||
eventHandler.add(displayText, { expand: true });
|
||||
|
||||
@ -295,7 +398,14 @@ Inspector.prototype = {
|
||||
let target = global.stage.get_actor_at_pos(Clutter.PickMode.ALL,
|
||||
stageX,
|
||||
stageY);
|
||||
displayText.text = '<inspect x: ' + stageX + ' y: ' + stageY + '> ' + target;
|
||||
let id, style_class;
|
||||
if (target instanceof St.Widget) {
|
||||
id = target.get_theme_node().get_element_id();
|
||||
style_class = target.get_theme_node().get_element_class();
|
||||
}
|
||||
let position = '<inspect x: ' + stageX + ' y: ' + stageY + '>';
|
||||
let style = '<style id: ' + id + ' class: ' + style_class + '>';
|
||||
displayText.text = position + ' ' + style + ' ' + target;
|
||||
if (borderPaintTarget != null)
|
||||
borderPaintTarget.disconnect(borderPaintId);
|
||||
borderPaintTarget = target;
|
||||
@ -304,7 +414,7 @@ Inspector.prototype = {
|
||||
}));
|
||||
Clutter.grab_pointer(eventHandler);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(Inspector.prototype);
|
||||
|
||||
@ -322,13 +432,13 @@ ErrorLog.prototype = {
|
||||
},
|
||||
|
||||
_formatTime: function(d){
|
||||
function pad(n) { return n < 10 ? '0' + n : n };
|
||||
function pad(n) { return n < 10 ? '0' + n : n; }
|
||||
return d.getUTCFullYear()+'-'
|
||||
+ pad(d.getUTCMonth()+1)+'-'
|
||||
+ pad(d.getUTCDate())+'T'
|
||||
+ pad(d.getUTCHours())+':'
|
||||
+ pad(d.getUTCMinutes())+':'
|
||||
+ pad(d.getUTCSeconds())+'Z'
|
||||
+ pad(d.getUTCSeconds())+'Z';
|
||||
},
|
||||
|
||||
_renderText: function() {
|
||||
@ -338,11 +448,11 @@ ErrorLog.prototype = {
|
||||
let stack = Main._getAndClearErrorStack();
|
||||
for (let i = 0; i < stack.length; i++) {
|
||||
let logItem = stack[i];
|
||||
text += logItem.category + " t=" + this._formatTime(new Date(logItem.timestamp)) + " " + logItem.message + "\n";
|
||||
text += logItem.category + ' t=' + this._formatTime(new Date(logItem.timestamp)) + ' ' + logItem.message + '\n';
|
||||
}
|
||||
this.text.text = text;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function Extensions() {
|
||||
this._init();
|
||||
@ -398,7 +508,7 @@ Extensions.prototype = {
|
||||
case ExtensionSystem.ExtensionState.OUT_OF_DATE:
|
||||
return _("Out of date");
|
||||
}
|
||||
return "Unknown"; // Not translated, shouldn't appear
|
||||
return 'Unknown'; // Not translated, shouldn't appear
|
||||
},
|
||||
|
||||
_createExtensionDisplay: function(meta) {
|
||||
@ -444,7 +554,7 @@ function LookingGlass() {
|
||||
LookingGlass.prototype = {
|
||||
_init : function() {
|
||||
this._idleHistorySaveId = 0;
|
||||
let historyPath = global.configdir + "/lookingglass-history.txt";
|
||||
let historyPath = global.userdatadir + '/lookingglass-history.txt';
|
||||
this._historyFile = Gio.file_new_for_path(historyPath);
|
||||
this._savedText = null;
|
||||
this._historyNavIndex = -1;
|
||||
@ -463,22 +573,27 @@ LookingGlass.prototype = {
|
||||
// Sort of magic, but...eh.
|
||||
this._maxItems = 150;
|
||||
|
||||
this.actor = new St.BoxLayout({ name: "LookingGlassDialog",
|
||||
this.actor = new St.BoxLayout({ name: 'LookingGlassDialog',
|
||||
style_class: 'lg-dialog',
|
||||
vertical: true,
|
||||
visible: false });
|
||||
|
||||
let gconf = Shell.GConf.get_default();
|
||||
gconf.watch_directory("/desktop/gnome/interface");
|
||||
gconf.connect("changed::/desktop/gnome/interface/monospace_font_name",
|
||||
gconf.watch_directory('/desktop/gnome/interface');
|
||||
gconf.connect('changed::/desktop/gnome/interface/monospace_font_name',
|
||||
Lang.bind(this, this._updateFont));
|
||||
this._updateFont();
|
||||
|
||||
global.stage.add_actor(this.actor);
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
|
||||
let toolbar = new St.BoxLayout({ name: "Toolbar" });
|
||||
this._objInspector = new ObjInspector();
|
||||
Main.uiGroup.add_actor(this._objInspector.actor);
|
||||
this._objInspector.actor.hide();
|
||||
|
||||
let toolbar = new St.BoxLayout({ name: 'Toolbar' });
|
||||
this.actor.add_actor(toolbar);
|
||||
let inspectIcon = Shell.TextureCache.get_default().load_gicon(new Gio.ThemedIcon({ name: 'gtk-color-picker' }),
|
||||
24);
|
||||
let inspectIcon = St.TextureCache.get_default().load_gicon(new Gio.ThemedIcon({ name: 'gtk-color-picker' }),
|
||||
24);
|
||||
toolbar.add_actor(inspectIcon);
|
||||
inspectIcon.reactive = true;
|
||||
inspectIcon.connect('button-press-event', Lang.bind(this, function () {
|
||||
@ -486,7 +601,6 @@ LookingGlass.prototype = {
|
||||
inspector.connect('target', Lang.bind(this, function(i, target, stageX, stageY) {
|
||||
this._pushResult('<inspect x:' + stageX + ' y:' + stageY + '>',
|
||||
target);
|
||||
this._hierarchy.setTarget(target);
|
||||
}));
|
||||
inspector.connect('closed', Lang.bind(this, function() {
|
||||
this.actor.show();
|
||||
@ -504,18 +618,17 @@ LookingGlass.prototype = {
|
||||
toolbar.add(emptyBox, { expand: true });
|
||||
toolbar.add_actor(notebook.tabControls);
|
||||
|
||||
this._evalBox = new St.BoxLayout({ name: "EvalBox", vertical: true });
|
||||
this._evalBox = new St.BoxLayout({ name: 'EvalBox', vertical: true });
|
||||
notebook.appendPage('Evaluator', this._evalBox);
|
||||
|
||||
this._resultsArea = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
spacing: 4 });
|
||||
this._resultsArea = new St.BoxLayout({ name: 'ResultsArea', vertical: true });
|
||||
this._evalBox.add(this._resultsArea, { expand: true });
|
||||
|
||||
let entryArea = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL });
|
||||
let entryArea = new St.BoxLayout({ name: 'EntryArea' });
|
||||
this._evalBox.add_actor(entryArea);
|
||||
|
||||
let label = new St.Label({ text: 'js>>> ' });
|
||||
entryArea.append(label, Big.BoxPackFlags.NONE);
|
||||
entryArea.add(label);
|
||||
|
||||
this._entry = new St.Entry();
|
||||
/* unmapping the edit box will un-focus it, undo that */
|
||||
@ -523,17 +636,14 @@ LookingGlass.prototype = {
|
||||
if (child == this._evalBox)
|
||||
global.stage.set_key_focus(this._entry);
|
||||
}));
|
||||
entryArea.append(this._entry, Big.BoxPackFlags.EXPAND);
|
||||
entryArea.add(this._entry, { expand: true });
|
||||
|
||||
this._hierarchy = new ActorHierarchy();
|
||||
notebook.appendPage('Hierarchy', this._hierarchy.actor);
|
||||
|
||||
this._propInspector = new PropertyInspector();
|
||||
notebook.appendPage('Properties', this._propInspector.actor);
|
||||
this._hierarchy.connect('selection', Lang.bind(this, function (h, actor) {
|
||||
this._pushResult('<parent selection>', actor);
|
||||
this._windowList = new WindowList();
|
||||
this._windowList.connect('selected', Lang.bind(this, function(list, window) {
|
||||
notebook.selectIndex(0);
|
||||
this._pushResult('<window selection>', window);
|
||||
}));
|
||||
notebook.appendPage('Windows', this._windowList.actor);
|
||||
|
||||
this._errorLog = new ErrorLog();
|
||||
notebook.appendPage('Errors', this._errorLog.actor);
|
||||
@ -547,7 +657,7 @@ LookingGlass.prototype = {
|
||||
// newline-separated.
|
||||
text.replace('\n', ' ');
|
||||
// Strip leading and trailing whitespace
|
||||
text = text.replace(/^\s+/g, "").replace(/\s+$/g, "");
|
||||
text = text.replace(/^\s+/g, '').replace(/\s+$/g, '');
|
||||
if (text == '')
|
||||
return true;
|
||||
this._evaluate(text);
|
||||
@ -583,7 +693,7 @@ LookingGlass.prototype = {
|
||||
|
||||
_updateFont: function() {
|
||||
let gconf = Shell.GConf.get_default();
|
||||
let fontName = gconf.get_string("/desktop/gnome/interface/monospace_font_name");
|
||||
let fontName = gconf.get_string('/desktop/gnome/interface/monospace_font_name');
|
||||
// This is mishandled by the scanner - should by Pango.FontDescription_from_string(fontName);
|
||||
// https://bugzilla.gnome.org/show_bug.cgi?id=595889
|
||||
let fontDesc = Pango.Font.description_from_string(fontName);
|
||||
@ -621,8 +731,7 @@ LookingGlass.prototype = {
|
||||
let index = this._results.length + this._offset;
|
||||
let result = new Result('>>> ' + command, obj, index);
|
||||
this._results.push(result);
|
||||
this._resultsArea.append(result.actor, Big.BoxPackFlags.NONE);
|
||||
this._propInspector.setTarget(obj);
|
||||
this._resultsArea.add(result.actor);
|
||||
if (this._borderPaintTarget != null) {
|
||||
this._borderPaintTarget.disconnect(this._borderPaintId);
|
||||
this._borderPaintTarget = null;
|
||||
@ -657,11 +766,10 @@ LookingGlass.prototype = {
|
||||
try {
|
||||
resultObj = eval(fullCmd);
|
||||
} catch (e) {
|
||||
resultObj = "<exception " + e + ">";
|
||||
resultObj = '<exception ' + e + '>';
|
||||
}
|
||||
|
||||
this._pushResult(command, resultObj);
|
||||
this._hierarchy.setTarget(null);
|
||||
this._entry.text = '';
|
||||
},
|
||||
|
||||
@ -691,6 +799,9 @@ LookingGlass.prototype = {
|
||||
this.actor.y = this._hiddenY;
|
||||
this.actor.width = myWidth;
|
||||
this.actor.height = myHeight;
|
||||
this._objInspector.actor.set_size(Math.floor(myWidth * 0.8), Math.floor(myHeight * 0.8));
|
||||
this._objInspector.actor.set_position(this.actor.x + Math.floor(myWidth * 0.1),
|
||||
this._targetY + Math.floor(myHeight * 0.1));
|
||||
},
|
||||
|
||||
slaveTo: function(actor) {
|
||||
@ -701,11 +812,24 @@ LookingGlass.prototype = {
|
||||
this._resizeTo(actor);
|
||||
},
|
||||
|
||||
insertObject: function(obj) {
|
||||
this._pushResult('<insert>', obj);
|
||||
},
|
||||
|
||||
inspectObject: function(obj, sourceActor) {
|
||||
this._objInspector.open(sourceActor);
|
||||
this._objInspector.selectObject(obj);
|
||||
},
|
||||
|
||||
// Handle key events which are relevant for all tabs of the LookingGlass
|
||||
_globalKeyPressEvent : function(actor, event) {
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol == Clutter.Escape) {
|
||||
this.close();
|
||||
if (this._objInspector.actor.visible) {
|
||||
this._objInspector.close();
|
||||
} else {
|
||||
this.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -730,7 +854,7 @@ LookingGlass.prototype = {
|
||||
global.stage.set_key_focus(this._entry);
|
||||
|
||||
Tweener.addTween(this.actor, { time: 0.5,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
y: this._targetY
|
||||
});
|
||||
},
|
||||
@ -742,6 +866,8 @@ LookingGlass.prototype = {
|
||||
if (this._keyPressEventId)
|
||||
global.stage.disconnect(this._keyPressEventId);
|
||||
|
||||
this._objInspector.actor.hide();
|
||||
|
||||
this._historyNavIndex = -1;
|
||||
this._open = false;
|
||||
Tweener.removeTweens(this.actor);
|
||||
@ -755,7 +881,7 @@ LookingGlass.prototype = {
|
||||
Main.popModal(this.actor);
|
||||
|
||||
Tweener.addTween(this.actor, { time: 0.5,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
y: this._hiddenY,
|
||||
onComplete: Lang.bind(this, function () {
|
||||
this.actor.hide();
|
||||
|
1479
js/ui/magnifier.js
Normal file
375
js/ui/magnifierDBus.js
Normal file
@ -0,0 +1,375 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const DBus = imports.dbus;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const MAG_SERVICE_NAME = 'org.gnome.Magnifier';
|
||||
const MAG_SERVICE_PATH = '/org/gnome/Magnifier';
|
||||
const ZOOM_SERVICE_NAME = 'org.gnome.Magnifier.ZoomRegion';
|
||||
const ZOOM_SERVICE_PATH = '/org/gnome/Magnifier/ZoomRegion';
|
||||
|
||||
// Subset of gnome-mag's Magnifier dbus interface -- to be expanded. See:
|
||||
// http://git.gnome.org/browse/gnome-mag/tree/xml/...Magnifier.xml
|
||||
const MagnifierIface = {
|
||||
name: MAG_SERVICE_NAME,
|
||||
methods: [
|
||||
{ name: 'setActive', inSignature: 'b', outSignature: '' },
|
||||
{ name: 'isActive', inSignature: '', outSignature: 'b' },
|
||||
{ name: 'showCursor', inSignature: '', outSignature: '' },
|
||||
{ name: 'hideCursor', inSignature: '', outSignature: '' },
|
||||
{ name: 'createZoomRegion', inSignature: 'ddaiai', outSignature: 'o' },
|
||||
{ name: 'addZoomRegion', inSignature: 'o', outSignature: 'b' },
|
||||
{ name: 'getZoomRegions', inSignature: '', outSignature: 'ao' },
|
||||
{ name: 'clearAllZoomRegions', inSignature: '', outSignature: '' },
|
||||
{ name: 'fullScreenCapable', inSignature: '', outSignature: 'b' },
|
||||
|
||||
{ name: 'setCrosswireSize', inSignature: 'i', outSignature: '' },
|
||||
{ name: 'getCrosswireSize', inSignature: '', outSignature: 'i' },
|
||||
{ name: 'setCrosswireLength', inSignature: 'i', outSignature: '' },
|
||||
{ name: 'getCrosswireLength', inSignature: '', outSignature: 'i' },
|
||||
{ name: 'setCrosswireClip', inSignature: 'b', outSignature: '' },
|
||||
{ name: 'getCrosswireClip', inSignature: '', outSignature: 'b' },
|
||||
{ name: 'setCrosswireColor', inSignature: 'u', outSignature: '' },
|
||||
{ name: 'getCrosswireColor', inSignature: '', outSignature: 'u' }
|
||||
],
|
||||
signals: [],
|
||||
properties: []
|
||||
};
|
||||
|
||||
// Subset of gnome-mag's ZoomRegion dbus interface -- to be expanded. See:
|
||||
// http://git.gnome.org/browse/gnome-mag/tree/xml/...ZoomRegion.xml
|
||||
const ZoomRegionIface = {
|
||||
name: ZOOM_SERVICE_NAME,
|
||||
methods: [
|
||||
{ name: 'setMagFactor', inSignature: 'dd', outSignature: ''},
|
||||
{ name: 'getMagFactor', inSignature: '', outSignature: 'dd' },
|
||||
{ name: 'setRoi', inSignature: 'ai', outSignature: '' },
|
||||
{ name: 'getRoi', inSignature: '', outSignature: 'ai' },
|
||||
{ name: 'shiftContentsTo', inSignature: 'ii', outSignature: 'b' },
|
||||
{ name: 'moveResize', inSignature: 'ai', outSignature: '' }
|
||||
],
|
||||
signals: [],
|
||||
properties: []
|
||||
};
|
||||
|
||||
// For making unique ZoomRegion DBus proxy object paths of the form:
|
||||
// '/org/gnome/Magnifier/ZoomRegion/zoomer0',
|
||||
// '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc.
|
||||
let _zoomRegionInstanceCount = 0;
|
||||
|
||||
function ShellMagnifier() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
ShellMagnifier.prototype = {
|
||||
_init: function() {
|
||||
this._zoomers = {};
|
||||
DBus.session.exportObject(MAG_SERVICE_PATH, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* setActive:
|
||||
* @activate: Boolean to activate or de-activate the magnifier.
|
||||
*/
|
||||
setActive: function(activate) {
|
||||
Main.magnifier.setActive(activate);
|
||||
},
|
||||
|
||||
/**
|
||||
* isActive:
|
||||
* @return Whether the magnifier is active (boolean).
|
||||
*/
|
||||
isActive: function() {
|
||||
return Main.magnifier.isActive();
|
||||
},
|
||||
|
||||
/**
|
||||
* showCursor:
|
||||
* Show the system mouse pointer.
|
||||
*/
|
||||
showCursor: function() {
|
||||
Main.magnifier.showSystemCursor();
|
||||
},
|
||||
|
||||
/**
|
||||
* hideCursor:
|
||||
* Hide the system mouse pointer.
|
||||
*/
|
||||
hideCursor: function() {
|
||||
Main.magnifier.hideSystemCursor();
|
||||
},
|
||||
|
||||
/**
|
||||
* createZoomRegion:
|
||||
* Create a new ZoomRegion and return its object path.
|
||||
* @xMagFactor: The power to set horizontal magnification of the
|
||||
* ZoomRegion. A value of 1.0 means no magnification. A
|
||||
* value of 2.0 doubles the size.
|
||||
* @yMagFactor: The power to set the vertical magnification of the
|
||||
* ZoomRegion.
|
||||
* @roi Array of integers defining the region of the
|
||||
* screen/desktop to magnify. The array has the form
|
||||
* [x, y, width, height].
|
||||
* @viewPort Array of integers, [ x, y, width, height ] that defines
|
||||
* the position of the ZoomRegion on screen.
|
||||
* @return The newly created ZoomRegion.
|
||||
*/
|
||||
createZoomRegion: function(xMagFactor, yMagFactor, roi, viewPort) {
|
||||
let ROI = { x: roi[0], y: roi[1], width: roi[2], height: roi[3] };
|
||||
let viewBox = { x: viewPort[0], y: viewPort[1], width: viewPort[2], height: viewPort[3] };
|
||||
let realZoomRegion = Main.magnifier.createZoomRegion(xMagFactor, yMagFactor, ROI, viewBox);
|
||||
let objectPath = ZOOM_SERVICE_PATH + '/zoomer' + _zoomRegionInstanceCount;
|
||||
_zoomRegionInstanceCount++;
|
||||
|
||||
let zoomRegionProxy = new ShellMagnifierZoomRegion(objectPath, realZoomRegion);
|
||||
let proxyAndZoomRegion = {};
|
||||
proxyAndZoomRegion.proxy = zoomRegionProxy;
|
||||
proxyAndZoomRegion.zoomRegion = realZoomRegion;
|
||||
this._zoomers[objectPath] = proxyAndZoomRegion;
|
||||
return objectPath;
|
||||
},
|
||||
|
||||
/**
|
||||
* addZoomRegion:
|
||||
* Append the given ZoomRegion to the magnifier's list of ZoomRegions.
|
||||
* @zoomerObjectPath: The object path for the zoom region proxy.
|
||||
*/
|
||||
addZoomRegion: function(zoomerObjectPath) {
|
||||
let proxyAndZoomRegion = this._zoomers[zoomerObjectPath];
|
||||
if (proxyAndZoomRegion && proxyAndZoomRegion.zoomRegion) {
|
||||
Main.magnifier.addZoomRegion(proxyAndZoomRegion.zoomRegion);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* getZoomRegions:
|
||||
* Return a list of ZoomRegion object paths for this Magnifier.
|
||||
* @return: The Magnifier's zoom region list as an array of DBus object
|
||||
* paths.
|
||||
*/
|
||||
getZoomRegions: function() {
|
||||
// There may be more ZoomRegions in the magnifier itself than have
|
||||
// been added through dbus. Make sure all of them are associated with
|
||||
// an object path and proxy.
|
||||
let zoomRegions = Main.magnifier.getZoomRegions();
|
||||
let objectPaths = [];
|
||||
let thoseZoomers = this._zoomers;
|
||||
zoomRegions.forEach (function(aZoomRegion, index, array) {
|
||||
let found = false;
|
||||
for (let objectPath in thoseZoomers) {
|
||||
let proxyAndZoomRegion = thoseZoomers[objectPath];
|
||||
if (proxyAndZoomRegion.zoomRegion === aZoomRegion) {
|
||||
objectPaths.push(objectPath);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
// Got a ZoomRegion with no DBus proxy, make one.
|
||||
let newPath = ZOOM_SERVICE_PATH + '/zoomer' + _zoomRegionInstanceCount;
|
||||
_zoomRegionInstanceCount++;
|
||||
let zoomRegionProxy = new ShellMagnifierZoomRegion(newPath, aZoomRegion);
|
||||
let proxyAndZoomer = {};
|
||||
proxyAndZoomer.proxy = zoomRegionProxy;
|
||||
proxyAndZoomer.zoomRegion = aZoomRegion;
|
||||
thoseZoomers[newPath] = proxyAndZoomer;
|
||||
objectPaths.push(newPath);
|
||||
}
|
||||
});
|
||||
return objectPaths;
|
||||
},
|
||||
|
||||
/**
|
||||
* clearAllZoomRegions:
|
||||
* Remove all the zoom regions from this Magnfier's ZoomRegion list.
|
||||
*/
|
||||
clearAllZoomRegions: function() {
|
||||
Main.magnifier.clearAllZoomRegions();
|
||||
for (let objectPath in this._zoomers) {
|
||||
let proxyAndZoomer = this._zoomers[objectPath];
|
||||
proxyAndZoomer.proxy = null;
|
||||
proxyAndZoomer.zoomRegion = null;
|
||||
delete this._zoomers[objectPath];
|
||||
DBus.session.unexportObject(proxyAndZoomer);
|
||||
}
|
||||
this._zoomers = {};
|
||||
},
|
||||
|
||||
/**
|
||||
* fullScreenCapable:
|
||||
* Consult if the Magnifier can magnify in full-screen mode.
|
||||
* @return Always return true.
|
||||
*/
|
||||
fullScreenCapable: function() {
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* setCrosswireSize:
|
||||
* Set the crosswire size of all ZoomRegions.
|
||||
* @size: The thickness of each line in the cross wire.
|
||||
*/
|
||||
setCrosswireSize: function(size) {
|
||||
Main.magnifier.setCrosshairsThickness(size);
|
||||
},
|
||||
|
||||
/**
|
||||
* getCrosswireSize:
|
||||
* Get the crosswire size of all ZoomRegions.
|
||||
* @return: The thickness of each line in the cross wire.
|
||||
*/
|
||||
getCrosswireSize: function() {
|
||||
return Main.magnifier.getCrosshairsThickness();
|
||||
},
|
||||
|
||||
/**
|
||||
* setCrosswireLength:
|
||||
* Set the crosswire length of all zoom-regions..
|
||||
* @size: The length of each line in the cross wire.
|
||||
*/
|
||||
setCrosswireLength: function(length) {
|
||||
Main.magnifier.setCrosshairsLength(length);
|
||||
},
|
||||
|
||||
/**
|
||||
* setCrosswireSize:
|
||||
* Set the crosswire size of all zoom-regions.
|
||||
* @size: The thickness of each line in the cross wire.
|
||||
*/
|
||||
getCrosswireLength: function() {
|
||||
return Main.magnifier.getCrosshairsLength();
|
||||
},
|
||||
|
||||
/**
|
||||
* setCrosswireClip:
|
||||
* Set if the crosswire will be clipped by the cursor image..
|
||||
* @clip: Flag to indicate whether to clip the crosswire.
|
||||
*/
|
||||
setCrosswireClip: function(clip) {
|
||||
Main.magnifier.setCrosshairsClip(clip);
|
||||
},
|
||||
|
||||
/**
|
||||
* getCrosswireClip:
|
||||
* Get the crosswire clip value.
|
||||
* @return: Whether the crosswire is clipped by the cursor image.
|
||||
*/
|
||||
getCrosswireClip: function() {
|
||||
return Main.magnifier.getCrosshairsClip();
|
||||
},
|
||||
|
||||
/**
|
||||
* setCrosswireColor:
|
||||
* Set the crosswire color of all ZoomRegions.
|
||||
* @color: Unsigned int of the form rrggbbaa.
|
||||
*/
|
||||
setCrosswireColor: function(color) {
|
||||
Main.magnifier.setCrosshairsColor('#' + color.toString(16));
|
||||
},
|
||||
|
||||
/**
|
||||
* getCrosswireClip:
|
||||
* Get the crosswire color of all ZoomRegions.
|
||||
* @return: The crosswire color as an unsigned int in the form rrggbbaa.
|
||||
*/
|
||||
getCrosswireColor: function() {
|
||||
let colorString = Main.magnifier.getCrosshairsColor();
|
||||
// Drop the leading '#'.
|
||||
return parseInt(colorString.slice(1), 16);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* ShellMagnifierZoomRegion:
|
||||
* Object that implements the DBus ZoomRegion interface.
|
||||
* @zoomerObjectPath: String that is the path to a DBus ZoomRegion.
|
||||
* @zoomRegion: The actual zoom region associated with the object path.
|
||||
*/
|
||||
function ShellMagnifierZoomRegion(zoomerObjectPath, zoomRegion) {
|
||||
this._init(zoomerObjectPath, zoomRegion);
|
||||
}
|
||||
|
||||
ShellMagnifierZoomRegion.prototype = {
|
||||
_init: function(zoomerObjectPath, zoomRegion) {
|
||||
this._zoomRegion = zoomRegion;
|
||||
DBus.session.proxifyObject(this, ZOOM_SERVICE_NAME, zoomerObjectPath);
|
||||
DBus.session.exportObject(zoomerObjectPath, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* setMagFactor:
|
||||
* @xMagFactor: The power to set the horizontal magnification factor to
|
||||
* of the magnified view. A value of 1.0 means no
|
||||
* magnification. A value of 2.0 doubles the size.
|
||||
* @yMagFactor: The power to set the vertical magnification factor to
|
||||
* of the magnified view.
|
||||
*/
|
||||
setMagFactor: function(xMagFactor, yMagFactor) {
|
||||
this._zoomRegion.setMagFactor(xMagFactor, yMagFactor);
|
||||
},
|
||||
|
||||
/**
|
||||
* getMagFactor:
|
||||
* @return an array, [xMagFactor, yMagFactor], containing the horizontal
|
||||
* and vertical magnification powers. A value of 1.0 means no
|
||||
* magnification. A value of 2.0 means the contents are doubled
|
||||
* in size, and so on.
|
||||
*/
|
||||
getMagFactor: function() {
|
||||
return this._zoomRegion.getMagFactor();
|
||||
},
|
||||
|
||||
/**
|
||||
* setRoi:
|
||||
* Sets the "region of interest" that the ZoomRegion is magnifying.
|
||||
* @roi Array, [x, y, width, height], defining the region of the screen to
|
||||
* magnify. The values are in screen (unmagnified) coordinate
|
||||
* space.
|
||||
*/
|
||||
setRoi: function(roi) {
|
||||
let roiObject = { x: roi[0], y: roi[1], width: roi[2], height: roi[3] };
|
||||
this._zoomRegion.setROI(roiObject);
|
||||
},
|
||||
|
||||
/**
|
||||
* getRoi:
|
||||
* Retrieves the "region of interest" -- the rectangular bounds of that part
|
||||
* of the desktop that the magnified view is showing (x, y, width, height).
|
||||
* The bounds are given in non-magnified coordinates.
|
||||
* @return an array, [x, y, width, height], representing the bounding
|
||||
* rectangle of what is shown in the magnified view.
|
||||
*/
|
||||
getRoi: function() {
|
||||
return this._zoomRegion.getROI();
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the "region of interest" by centering the given screen coordinate
|
||||
* within the zoom region.
|
||||
* @x The x-coord of the point to place at the center of the zoom region.
|
||||
* @y The y-coord.
|
||||
* @return Whether the shift was successful (for GS-mag, this is always
|
||||
* true).
|
||||
*/
|
||||
shiftContentsTo: function(x, y) {
|
||||
this._zoomRegion.scrollContentsTo(x, y);
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* moveResize
|
||||
* Sets the position and size of the ZoomRegion on screen.
|
||||
* @viewPort Array, [x, y, width, height], defining the position and size
|
||||
* on screen to place the zoom region.
|
||||
*/
|
||||
moveResize: function(viewPort) {
|
||||
let viewRect = { x: viewPort[0], y: viewPort[1], width: viewPort[2], height: viewPort[3] };
|
||||
this._zoomRegion.setViewPort(viewRect);
|
||||
}
|
||||
};
|
||||
|
||||
DBus.conformExport(ShellMagnifier.prototype, MagnifierIface);
|
||||
DBus.conformExport(ShellMagnifierZoomRegion.prototype, ZoomRegionIface);
|
147
js/ui/main.js
@ -1,5 +1,11 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
imports.gi.versions.Clutter = '1.0';
|
||||
imports.gi.versions.Gio = '2.0';
|
||||
imports.gi.versions.Gdk = '2.0';
|
||||
imports.gi.versions.GdkPixbuf = '2.0';
|
||||
imports.gi.versions.Gtk = '2.0';
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const DBus = imports.dbus;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
@ -22,35 +28,42 @@ const PlaceDisplay = imports.ui.placeDisplay;
|
||||
const RunDialog = imports.ui.runDialog;
|
||||
const LookingGlass = imports.ui.lookingGlass;
|
||||
const NotificationDaemon = imports.ui.notificationDaemon;
|
||||
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
|
||||
const Scripting = imports.ui.scripting;
|
||||
const ShellDBus = imports.ui.shellDBus;
|
||||
const Sidebar = imports.ui.sidebar;
|
||||
const TelepathyClient = imports.ui.telepathyClient;
|
||||
const WindowManager = imports.ui.windowManager;
|
||||
const Magnifier = imports.ui.magnifier;
|
||||
|
||||
const DEFAULT_BACKGROUND_COLOR = new Clutter.Color();
|
||||
DEFAULT_BACKGROUND_COLOR.from_pixel(0x2266bbff);
|
||||
|
||||
let chrome = null;
|
||||
let panel = null;
|
||||
let sidebar = null;
|
||||
let placesManager = null;
|
||||
let overview = null;
|
||||
let runDialog = null;
|
||||
let lookingGlass = null;
|
||||
let wm = null;
|
||||
let notificationDaemon = null;
|
||||
let notificationPopup = null;
|
||||
let messageTray = null;
|
||||
let notificationDaemon = null;
|
||||
let windowAttentionHandler = null;
|
||||
let telepathyClient = null;
|
||||
let recorder = null;
|
||||
let shellDBusService = null;
|
||||
let modalCount = 0;
|
||||
let modalActorFocusStack = [];
|
||||
let uiGroup = null;
|
||||
let magnifier = null;
|
||||
let _errorLogStack = [];
|
||||
let _startDate;
|
||||
|
||||
let background = null;
|
||||
|
||||
function start() {
|
||||
// Add a binding for "global" in the global JS namespace; (gjs
|
||||
// Add a binding for 'global' in the global JS namespace; (gjs
|
||||
// keeps the web browser convention of having that namespace be
|
||||
// called "window".)
|
||||
// called 'window'.)
|
||||
window.global = Shell.Global.get();
|
||||
|
||||
// Now monkey patch utility functions into the global proxy;
|
||||
@ -59,7 +72,7 @@ function start() {
|
||||
global.logError = _logError;
|
||||
global.log = _logDebug;
|
||||
|
||||
Gio.DesktopAppInfo.set_desktop_env("GNOME");
|
||||
Gio.DesktopAppInfo.set_desktop_env('GNOME');
|
||||
|
||||
global.grab_dbus_service();
|
||||
shellDBusService = new ShellDBus.GnomeShell();
|
||||
@ -87,40 +100,36 @@ function start() {
|
||||
// when we are running inside Xephyr.
|
||||
global.stage.color = DEFAULT_BACKGROUND_COLOR;
|
||||
|
||||
// Mutter currently hardcodes putting "Yessir. The compositor is running""
|
||||
// in the Overview. Clear that out.
|
||||
let children = global.overlay_group.get_children();
|
||||
for (let i = 0; i < children.length; i++)
|
||||
children[i].destroy();
|
||||
|
||||
let themeContext = St.ThemeContext.get_for_stage (global.stage);
|
||||
let stylesheetPath = global.datadir + "/theme/gnome-shell.css";
|
||||
let stylesheetPath = global.datadir + '/theme/gnome-shell.css';
|
||||
let theme = new St.Theme ({ application_stylesheet: stylesheetPath });
|
||||
themeContext.set_theme (theme);
|
||||
|
||||
global.connect('panel-run-dialog', function(panel) {
|
||||
// Make sure not more than one run dialog is shown.
|
||||
getRunDialog().open();
|
||||
});
|
||||
let shellwm = global.window_manager;
|
||||
shellwm.takeover_keybinding("panel_main_menu");
|
||||
shellwm.connect("keybinding::panel_main_menu", function () {
|
||||
shellwm.takeover_keybinding('panel_main_menu');
|
||||
shellwm.connect('keybinding::panel_main_menu', function () {
|
||||
overview.toggle();
|
||||
});
|
||||
shellwm.takeover_keybinding("panel_run_dialog");
|
||||
shellwm.connect("keybinding::panel_run_dialog", function () {
|
||||
shellwm.takeover_keybinding('panel_run_dialog');
|
||||
shellwm.connect('keybinding::panel_run_dialog', function () {
|
||||
getRunDialog().open();
|
||||
});
|
||||
|
||||
// Set up stage hierarchy to group all UI actors under one container.
|
||||
uiGroup = new Clutter.Group();
|
||||
global.window_group.reparent(uiGroup);
|
||||
global.overlay_group.reparent(uiGroup);
|
||||
global.stage.add_actor(uiGroup);
|
||||
|
||||
placesManager = new PlaceDisplay.PlacesManager();
|
||||
overview = new Overview.Overview();
|
||||
chrome = new Chrome.Chrome();
|
||||
panel = new Panel.Panel();
|
||||
sidebar = new Sidebar.Sidebar();
|
||||
wm = new WindowManager.WindowManager();
|
||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||
notificationPopup = new MessageTray.Notification();
|
||||
messageTray = new MessageTray.MessageTray();
|
||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||
telepathyClient = new TelepathyClient.Client();
|
||||
|
||||
_startDate = new Date();
|
||||
|
||||
@ -132,11 +141,25 @@ function start() {
|
||||
if (recorder.is_recording()) {
|
||||
recorder.pause();
|
||||
} else {
|
||||
//read the parameters from GConf always in case they have changed
|
||||
let gconf = Shell.GConf.get_default();
|
||||
recorder.set_framerate(gconf.get_int('recorder/framerate'));
|
||||
recorder.set_filename('shell-%d%u-%c.' + gconf.get_string('recorder/file_extension'));
|
||||
let pipeline = gconf.get_string('recorder/pipeline');
|
||||
if (!pipeline.match(/^\s*$/))
|
||||
recorder.set_pipeline(pipeline);
|
||||
else
|
||||
recorder.set_pipeline(null);
|
||||
|
||||
recorder.record();
|
||||
}
|
||||
});
|
||||
|
||||
_relayout();
|
||||
background = global.create_root_pixmap_actor();
|
||||
global.stage.add_actor(background);
|
||||
background.lower_bottom();
|
||||
|
||||
global.connect('screen-size-changed', _relayout);
|
||||
|
||||
ExtensionSystem.init();
|
||||
ExtensionSystem.loadExtensions();
|
||||
@ -145,13 +168,26 @@ function start() {
|
||||
|
||||
let display = global.screen.get_display();
|
||||
display.connect('overlay-key', Lang.bind(overview, overview.toggle));
|
||||
global.connect('panel-main-menu', Lang.bind(overview, overview.toggle));
|
||||
|
||||
global.stage.connect('captured-event', _globalKeyPressHandler);
|
||||
|
||||
// Install magnifier.
|
||||
magnifier = new Magnifier.Magnifier();
|
||||
|
||||
// Perform initial relayout here
|
||||
_relayout();
|
||||
|
||||
_log('info', 'loaded at ' + _startDate);
|
||||
log('GNOME Shell started at ' + _startDate);
|
||||
|
||||
Mainloop.idle_add(_removeUnusedWorkspaces);
|
||||
|
||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||
if (perfModuleName) {
|
||||
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
||||
let module = eval('imports.perf.' + perfModuleName + ';');
|
||||
Scripting.runPerfScript(module, perfOutput);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -172,7 +208,7 @@ function _log(category, msg) {
|
||||
for (let i = 2; i < arguments.length; i++) {
|
||||
text += JSON.stringify(arguments[i]);
|
||||
if (i < arguments.length - 1)
|
||||
text += " ";
|
||||
text += ' ';
|
||||
}
|
||||
}
|
||||
_errorLogStack.push({timestamp: new Date().getTime(),
|
||||
@ -200,6 +236,15 @@ function _relayout() {
|
||||
panel.actor.set_position(primary.x, primary.y);
|
||||
panel.actor.set_size(primary.width, Panel.PANEL_HEIGHT);
|
||||
overview.relayout();
|
||||
|
||||
background.set_size(global.screen_width, global.screen_height);
|
||||
|
||||
// To avoid updating the position and size of the workspaces
|
||||
// in the overview, we just hide the overview. The positions
|
||||
// will be updated when it is next shown. We do the same for
|
||||
// the calendar popdown.
|
||||
overview.hide();
|
||||
panel.hideCalendar();
|
||||
}
|
||||
|
||||
// metacity-clutter currently uses the same prefs as plain metacity,
|
||||
@ -252,8 +297,8 @@ function _globalKeyPressHandler(actor, event) {
|
||||
if (symbol == Clutter.Print) {
|
||||
// We want to be able to take screenshots of the shell at all times
|
||||
let gconf = Shell.GConf.get_default();
|
||||
let command = gconf.get_string("/apps/metacity/keybinding_commands/command_screenshot");
|
||||
if (command != null && command != "") {
|
||||
let command = gconf.get_string('/apps/metacity/keybinding_commands/command_screenshot');
|
||||
if (command != null && command != '') {
|
||||
let [ok, len, args] = GLib.shell_parse_argv(command);
|
||||
let p = new Shell.Process({'args' : args});
|
||||
p.run();
|
||||
@ -263,6 +308,9 @@ function _globalKeyPressHandler(actor, event) {
|
||||
}
|
||||
} else if (type == Clutter.EventType.KEY_RELEASE) {
|
||||
let symbol = event.get_key_symbol();
|
||||
let keyCode = event.get_key_code();
|
||||
let modifierState = Shell.get_event_state(event);
|
||||
// Check the overview key first, this isn't a Meta.KeyBindingAction yet
|
||||
if (symbol == Clutter.Super_L || symbol == Clutter.Super_R) {
|
||||
// The super key is the default for triggering the overview, and should
|
||||
// get us out of the overview when we are already in it.
|
||||
@ -270,8 +318,25 @@ function _globalKeyPressHandler(actor, event) {
|
||||
overview.hide();
|
||||
|
||||
return true;
|
||||
} else if (symbol == Clutter.F2 && (Shell.get_event_state(event) & Clutter.ModifierType.MOD1_MASK)) {
|
||||
getRunDialog().open();
|
||||
}
|
||||
|
||||
// Whitelist some of the Metacity actions
|
||||
let display = global.screen.get_display();
|
||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||
|
||||
// This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType
|
||||
let action = display.get_keybinding_action(symbol, keyCode, modifierState);
|
||||
switch (action) {
|
||||
case Meta.KeyBindingAction.WORKSPACE_LEFT:
|
||||
wm.actionMoveWorkspaceLeft();
|
||||
return true;
|
||||
case Meta.KeyBindingAction.WORKSPACE_RIGHT:
|
||||
wm.actionMoveWorkspaceRight();
|
||||
return true;
|
||||
case Meta.KeyBindingAction.PANEL_RUN_DIALOG:
|
||||
case Meta.KeyBindingAction.COMMAND_2:
|
||||
getRunDialog().open();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -306,7 +371,7 @@ function _findModal(actor) {
|
||||
function pushModal(actor) {
|
||||
if (modalCount == 0) {
|
||||
if (!global.begin_modal(global.get_current_time())) {
|
||||
log("pushModal: invocation of begin_modal failed");
|
||||
log('pushModal: invocation of begin_modal failed');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -381,12 +446,14 @@ function getRunDialog() {
|
||||
* activateWindow:
|
||||
* @window: the Meta.Window to activate
|
||||
* @time: (optional) current event time
|
||||
* @workspaceNum: (optional) window's workspace number
|
||||
*
|
||||
* Activates @window, switching to its workspace first if necessary
|
||||
* Activates @window, switching to its workspace first if necessary,
|
||||
* and switching out of the overview if it's currently active
|
||||
*/
|
||||
function activateWindow(window, time) {
|
||||
function activateWindow(window, time, workspaceNum) {
|
||||
let activeWorkspaceNum = global.screen.get_active_workspace_index();
|
||||
let windowWorkspaceNum = window.get_workspace().index();
|
||||
let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index();
|
||||
|
||||
if (!time)
|
||||
time = global.get_current_time();
|
||||
@ -397,6 +464,8 @@ function activateWindow(window, time) {
|
||||
} else {
|
||||
window.activate(time);
|
||||
}
|
||||
|
||||
overview.hide();
|
||||
}
|
||||
|
||||
// TODO - replace this timeout with some system to guess when the user might
|
||||
@ -445,7 +514,7 @@ function _queueBeforeRedraw(workId) {
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, function () {
|
||||
_runBeforeRedrawQueue();
|
||||
return false;
|
||||
}, null);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -469,7 +538,7 @@ function _queueBeforeRedraw(workId) {
|
||||
*/
|
||||
function initializeDeferredWork(actor, callback, props) {
|
||||
// Turn into a string so we can use as an object property
|
||||
let workId = "" + (++_deferredWorkSequence);
|
||||
let workId = '' + (++_deferredWorkSequence);
|
||||
_deferredWorkData[workId] = { 'actor': actor,
|
||||
'callback': callback };
|
||||
actor.connect('notify::mapped', function () {
|
||||
@ -499,7 +568,7 @@ function initializeDeferredWork(actor, callback, props) {
|
||||
function queueDeferredWork(workId) {
|
||||
let data = _deferredWorkData[workId];
|
||||
if (!data) {
|
||||
global.logError("invalid work id ", workId);
|
||||
global.logError('invalid work id ', workId);
|
||||
return;
|
||||
}
|
||||
if (_deferredWorkQueue.indexOf(workId) < 0)
|
||||
|
@ -5,6 +5,7 @@ const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Mainloop = imports.mainloop;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
@ -12,6 +13,26 @@ const Params = imports.misc.params;
|
||||
|
||||
let nextNotificationId = 1;
|
||||
|
||||
// Should really be defined in dbus.js
|
||||
const BusIface = {
|
||||
name: 'org.freedesktop.DBus',
|
||||
methods: [{ name: 'GetConnectionUnixProcessID',
|
||||
inSignature: 's',
|
||||
outSignature: 'i' }]
|
||||
};
|
||||
|
||||
const Bus = function () {
|
||||
this._init();
|
||||
};
|
||||
|
||||
Bus.prototype = {
|
||||
_init: function() {
|
||||
DBus.session.proxifyObject(this, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
|
||||
}
|
||||
};
|
||||
|
||||
DBus.proxifyPrototype(Bus.prototype, BusIface);
|
||||
|
||||
const NotificationDaemonIface = {
|
||||
name: 'org.freedesktop.Notifications',
|
||||
methods: [{ name: 'Notify',
|
||||
@ -49,6 +70,16 @@ const Urgency = {
|
||||
CRITICAL: 2
|
||||
};
|
||||
|
||||
const rewriteRules = {
|
||||
'XChat': [
|
||||
{ pattern: /^XChat: Private message from: (\S*) \(.*\)$/,
|
||||
replacement: '<$1>' },
|
||||
{ pattern: /^XChat: New public message from: (\S*) \((.*)\)$/,
|
||||
replacement: '$2 <$1>' },
|
||||
{ pattern: /^XChat: Highlighted message from: (\S*) \((.*)\)$/,
|
||||
replacement: '$2 <$1>' }
|
||||
]
|
||||
};
|
||||
function NotificationDaemon() {
|
||||
this._init();
|
||||
}
|
||||
@ -66,6 +97,13 @@ NotificationDaemon.prototype = {
|
||||
DBus.MANY_INSTANCES,
|
||||
Lang.bind(this, this._acquiredName),
|
||||
Lang.bind(this, this._lostName));
|
||||
|
||||
this._currentNotifications = {};
|
||||
|
||||
Shell.WindowTracker.get_default().connect('notify::focus-app',
|
||||
Lang.bind(this, this._onFocusAppChanged));
|
||||
Main.overview.connect('hidden',
|
||||
Lang.bind(this, this._onFocusAppChanged));
|
||||
},
|
||||
|
||||
_acquiredName: function() {
|
||||
@ -83,10 +121,10 @@ NotificationDaemon.prototype = {
|
||||
// kill the notification-daemon. pkill is more portable
|
||||
// than killall, but on Linux at least it won't match if
|
||||
// you pass more than 15 characters of the process name...
|
||||
// However, if you use the "-f" flag to match the entire
|
||||
// However, if you use the '-f' flag to match the entire
|
||||
// command line, it will work, but we have to be careful
|
||||
// in that case that we don't match "gedit
|
||||
// notification-daemon.c" or whatever...
|
||||
// in that case that we don't match 'gedit
|
||||
// notification-daemon.c' or whatever...
|
||||
let p = new Shell.Process({ args: ['pkill', '-f',
|
||||
'^([^ ]*/)?(notification-daemon|notify-osd)$']});
|
||||
p.run();
|
||||
@ -94,51 +132,104 @@ NotificationDaemon.prototype = {
|
||||
},
|
||||
|
||||
_sourceId: function(id) {
|
||||
return 'notification-' + id;
|
||||
return 'source-' + id;
|
||||
},
|
||||
|
||||
Notify: function(appName, replacesId, icon, summary, body,
|
||||
actions, hints, timeout) {
|
||||
let id, source = null;
|
||||
let source = Main.messageTray.getSource(this._sourceId(appName));
|
||||
let id = null;
|
||||
|
||||
if (replacesId != 0) {
|
||||
id = replacesId;
|
||||
source = Main.messageTray.getSource(this._sourceId(id));
|
||||
// source may be null if the current source was destroyed
|
||||
// right as the client sent the new notification
|
||||
// Filter out notifications from Empathy, since we
|
||||
// handle that information from telepathyClient.js
|
||||
if (appName == 'Empathy') {
|
||||
id = nextNotificationId++;
|
||||
Mainloop.idle_add(Lang.bind(this,
|
||||
function () {
|
||||
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
|
||||
}));
|
||||
return id;
|
||||
}
|
||||
|
||||
if (source == null) {
|
||||
id = nextNotificationId++;
|
||||
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
|
||||
|
||||
source = new Source(this._sourceId(id), icon, hints);
|
||||
// Source may be null if we have never received a notification
|
||||
// from this app or if all notifications from this app have
|
||||
// been acknowledged.
|
||||
if (source == null) {
|
||||
source = new Source(this._sourceId(appName), icon, hints);
|
||||
Main.messageTray.add(source);
|
||||
|
||||
source.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
source.destroy();
|
||||
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
|
||||
}));
|
||||
|
||||
let sender = DBus.getCurrentMessageContext().sender;
|
||||
let busProxy = new Bus();
|
||||
busProxy.GetConnectionUnixProcessIDRemote(sender, function (result, excp) {
|
||||
let app = Shell.WindowTracker.get_default().get_app_from_pid(result);
|
||||
if (app)
|
||||
source.setApp(app);
|
||||
});
|
||||
} else {
|
||||
source.update(icon, hints);
|
||||
}
|
||||
|
||||
summary = GLib.markup_escape_text(summary, -1);
|
||||
if (body)
|
||||
source.notify('<b>' + summary + '</b>: ' + body);
|
||||
else
|
||||
source.notify('<b>' + summary + '</b>');
|
||||
|
||||
let rewrites = rewriteRules[appName];
|
||||
if (rewrites) {
|
||||
for (let i = 0; i < rewrites.length; i++) {
|
||||
let rule = rewrites[i];
|
||||
if (summary.search(rule.pattern) != -1)
|
||||
summary = summary.replace(rule.pattern, rule.replacement);
|
||||
}
|
||||
}
|
||||
|
||||
let notification;
|
||||
if (replacesId != 0) {
|
||||
id = replacesId;
|
||||
notification = this._currentNotifications[id];
|
||||
}
|
||||
|
||||
if (notification == null) {
|
||||
id = nextNotificationId++;
|
||||
notification = new MessageTray.Notification(id, source, summary, body, true);
|
||||
this._currentNotifications[id] = notification;
|
||||
notification.connect('dismissed', Lang.bind(this,
|
||||
function(n) {
|
||||
n.destroy();
|
||||
this._emitNotificationClosed(n.id, NotificationClosedReason.DISMISSED);
|
||||
}));
|
||||
} else {
|
||||
// passing in true as the last parameter will clear out extra actors,
|
||||
// such as actions
|
||||
notification.update(summary, body, true);
|
||||
}
|
||||
|
||||
if (actions.length) {
|
||||
for (let i = 0; i < actions.length - 1; i += 2)
|
||||
notification.addButton(actions[i], actions[i + 1]);
|
||||
notification.connect('action-invoked', Lang.bind(this, this._actionInvoked, source, id));
|
||||
}
|
||||
|
||||
notification.setUrgent(hints.urgency == Urgency.CRITICAL);
|
||||
|
||||
source.notify(notification);
|
||||
return id;
|
||||
},
|
||||
|
||||
CloseNotification: function(id) {
|
||||
let source = Main.messageTray.getSource(this._sourceId(id));
|
||||
if (source)
|
||||
source.destroy();
|
||||
let notification = this._currentNotifications[id];
|
||||
if (notification)
|
||||
notification.destroy();
|
||||
this._emitNotificationClosed(id, NotificationClosedReason.APP_CLOSED);
|
||||
},
|
||||
|
||||
GetCapabilities: function() {
|
||||
return [
|
||||
// 'actions',
|
||||
'actions',
|
||||
'body',
|
||||
// 'body-hyperlinks',
|
||||
// 'body-images',
|
||||
@ -158,11 +249,30 @@ NotificationDaemon.prototype = {
|
||||
];
|
||||
},
|
||||
|
||||
_onFocusAppChanged: function() {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
if (tracker.focus_app)
|
||||
Main.messageTray.removeSourceByApp(tracker.focus_app);
|
||||
},
|
||||
|
||||
_actionInvoked: function(notification, action, source, id) {
|
||||
this._emitActionInvoked(id, action);
|
||||
source.destroy();
|
||||
},
|
||||
|
||||
_emitNotificationClosed: function(id, reason) {
|
||||
delete this._currentNotifications[id];
|
||||
DBus.session.emit_signal('/org/freedesktop/Notifications',
|
||||
'org.freedesktop.Notifications',
|
||||
'NotificationClosed', 'uu',
|
||||
[id, reason]);
|
||||
},
|
||||
|
||||
_emitActionInvoked: function(id, action) {
|
||||
DBus.session.emit_signal('/org/freedesktop/Notifications',
|
||||
'org.freedesktop.Notifications',
|
||||
'ActionInvoked', 'us',
|
||||
[id, action]);
|
||||
}
|
||||
};
|
||||
|
||||
@ -178,15 +288,20 @@ Source.prototype = {
|
||||
_init: function(sourceId, icon, hints) {
|
||||
MessageTray.Source.prototype._init.call(this, sourceId);
|
||||
|
||||
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
|
||||
this.app = null;
|
||||
this._openAppRequested = false;
|
||||
|
||||
this.update(icon, hints);
|
||||
},
|
||||
|
||||
update: function(icon, hints) {
|
||||
this._icon = icon;
|
||||
this._iconData = hints.icon_data;
|
||||
this._urgency = hints.urgency;
|
||||
},
|
||||
|
||||
createIcon: function(size) {
|
||||
let textureCache = Shell.TextureCache.get_default();
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
|
||||
if (this._icon) {
|
||||
if (this._icon.substr(0, 7) == 'file://')
|
||||
@ -214,5 +329,29 @@ Source.prototype = {
|
||||
}
|
||||
return textureCache.load_icon_name(stockIcon, size);
|
||||
}
|
||||
},
|
||||
|
||||
clicked: function() {
|
||||
this.openApp();
|
||||
MessageTray.Source.prototype.clicked.call(this);
|
||||
},
|
||||
|
||||
setApp: function(app) {
|
||||
this.app = app;
|
||||
if (this._openAppRequested)
|
||||
this.openApp();
|
||||
},
|
||||
|
||||
openApp: function() {
|
||||
if (this.app == null) {
|
||||
this._openAppRequested = true;
|
||||
return;
|
||||
}
|
||||
let windows = this.app.get_windows();
|
||||
if (windows.length > 0) {
|
||||
let mostRecentWindow = windows[0];
|
||||
Main.activateWindow(mostRecentWindow);
|
||||
}
|
||||
this._openAppRequested = false;
|
||||
}
|
||||
};
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
@ -8,6 +7,9 @@ const Mainloop = imports.mainloop;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const DocDisplay = imports.ui.docDisplay;
|
||||
@ -16,10 +18,7 @@ const Main = imports.ui.main;
|
||||
const Panel = imports.ui.panel;
|
||||
const Dash = imports.ui.dash;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Workspaces = imports.ui.workspaces;
|
||||
|
||||
const ROOT_OVERVIEW_COLOR = new Clutter.Color();
|
||||
ROOT_OVERVIEW_COLOR.from_pixel(0x000000ff);
|
||||
const WorkspacesView = imports.ui.workspacesView;
|
||||
|
||||
// Time for initial animation going into Overview mode
|
||||
const ANIMATION_TIME = 0.25;
|
||||
@ -73,10 +72,101 @@ const SHADOW_WIDTH = 6;
|
||||
|
||||
const NUMBER_OF_SECTIONS_IN_SEARCH = 2;
|
||||
|
||||
const INFO_BAR_HIDE_TIMEOUT = 10;
|
||||
|
||||
let wideScreen = false;
|
||||
let displayGridColumnWidth = null;
|
||||
let displayGridRowHeight = null;
|
||||
let addRemoveButtonSize = null;
|
||||
|
||||
function InfoBar() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
InfoBar.prototype = {
|
||||
_init: function() {
|
||||
this.actor = new St.Bin({ style_class: 'info-bar-panel',
|
||||
x_fill: true,
|
||||
y_fill: false });
|
||||
this._label = new St.Label();
|
||||
this._undo = new St.Button({ style_class: 'info-bar-link-button' });
|
||||
|
||||
let bin = new St.Bin({ x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.MIDDLE });
|
||||
this.actor.set_child(bin);
|
||||
|
||||
let box = new St.BoxLayout({ style_class: 'info-bar' });
|
||||
bin.set_child(box);
|
||||
this._timeoutId = 0;
|
||||
|
||||
box.add(this._label, {'y-fill' : false, 'y-align' : St.Align.MIDDLE});
|
||||
box.add(this._undo);
|
||||
|
||||
this.actor.set_opacity(0);
|
||||
|
||||
this._undoCallback = null;
|
||||
this._undo.connect('clicked', Lang.bind(this, this._onUndoClicked));
|
||||
},
|
||||
|
||||
_onUndoClicked: function() {
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
this._timeoutId = 0;
|
||||
|
||||
if (this._undoCallback)
|
||||
this._undoCallback();
|
||||
this.actor.set_opacity(0);
|
||||
this._undoCallback = null;
|
||||
},
|
||||
|
||||
_hideDone: function() {
|
||||
this._undoCallback = null;
|
||||
},
|
||||
|
||||
_hide: function() {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
transition: 'easeOutQuad',
|
||||
time: ANIMATION_TIME,
|
||||
onComplete: this._hideDone,
|
||||
onCompleteScope: this
|
||||
});
|
||||
},
|
||||
|
||||
_onTimeout: function() {
|
||||
this._timeoutId = 0;
|
||||
this._hide();
|
||||
return false;
|
||||
},
|
||||
|
||||
setMessage: function(text, undoCallback, undoLabel) {
|
||||
if (this._timeoutId)
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
|
||||
this._timeout = false;
|
||||
|
||||
this._label.text = text;
|
||||
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
transition: 'easeOutQuad',
|
||||
time: ANIMATION_TIME
|
||||
});
|
||||
|
||||
this._timeoutId = Mainloop.timeout_add_seconds(INFO_BAR_HIDE_TIMEOUT, Lang.bind(this, this._onTimeout));
|
||||
|
||||
if (undoLabel)
|
||||
this._undo.label = undoLabel;
|
||||
else
|
||||
this._undo.label = _("Undo");
|
||||
|
||||
this._undoCallback = undoCallback;
|
||||
if (undoCallback)
|
||||
this._undo.show();
|
||||
else
|
||||
this._undo.hide();
|
||||
}
|
||||
};
|
||||
|
||||
function Overview() {
|
||||
this._init();
|
||||
@ -84,9 +174,14 @@ function Overview() {
|
||||
|
||||
Overview.prototype = {
|
||||
_init : function() {
|
||||
this._group = new Clutter.Group();
|
||||
this._group = new St.BoxLayout({ style_class: 'overview' });
|
||||
this._group._delegate = this;
|
||||
|
||||
this.infoBar = new InfoBar();
|
||||
this._group.add_actor(this.infoBar.actor);
|
||||
|
||||
this._workspacesManager = null;
|
||||
|
||||
this.visible = false;
|
||||
this.animationInProgress = false;
|
||||
this._hideInProgress = false;
|
||||
@ -110,7 +205,7 @@ Overview.prototype = {
|
||||
this._group.add_actor(this._transparentBackground);
|
||||
|
||||
// Background color for the Overview
|
||||
this._backOver = new Clutter.Rectangle({ color: ROOT_OVERVIEW_COLOR });
|
||||
this._backOver = new St.Label();
|
||||
this._group.add_actor(this._backOver);
|
||||
|
||||
this._group.hide();
|
||||
@ -121,8 +216,7 @@ Overview.prototype = {
|
||||
this._group.add_actor(this._dash.actor);
|
||||
|
||||
// Container to hold popup pane chrome.
|
||||
this._paneContainer = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
spacing: 6 });
|
||||
this._paneContainer = new St.BoxLayout({ style_class: 'overview-pane' });
|
||||
// Note here we explicitly don't set the paneContainer to be reactive yet; that's done
|
||||
// inside the notify::visible handler on panes.
|
||||
this._paneContainer.connect('button-release-event', Lang.bind(this, function(background) {
|
||||
@ -132,11 +226,23 @@ Overview.prototype = {
|
||||
this._group.add_actor(this._paneContainer);
|
||||
|
||||
this._transparentBackground.lower_bottom();
|
||||
this._paneContainer.lower_bottom();
|
||||
this._paneContainer.hide();
|
||||
|
||||
this._coverPane.lower_bottom();
|
||||
|
||||
this._workspaces = null;
|
||||
this.workspaces = null;
|
||||
},
|
||||
|
||||
_onViewChanged: function() {
|
||||
if (!this.visible)
|
||||
return;
|
||||
|
||||
this.workspaces = this._workspacesManager.workspacesView;
|
||||
|
||||
// Show new workspacesView
|
||||
this._group.add_actor(this.workspaces.actor);
|
||||
this._workspacesBar.raise(this.workspaces.actor);
|
||||
this._dash.actor.raise(this.workspaces.actor);
|
||||
},
|
||||
|
||||
_recalculateGridSizes: function () {
|
||||
@ -157,6 +263,9 @@ Overview.prototype = {
|
||||
|
||||
relayout: function () {
|
||||
let primary = global.get_primary_monitor();
|
||||
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
|
||||
|
||||
this._recalculateGridSizes();
|
||||
|
||||
this._group.set_position(primary.x, primary.y);
|
||||
|
||||
@ -176,19 +285,32 @@ Overview.prototype = {
|
||||
this._workspacesHeight = Math.floor(displayGridRowHeight * workspaceRowsUsed
|
||||
- WORKSPACE_GRID_PADDING * (primary.height / primary.width) * 2);
|
||||
|
||||
this._workspacesX = displayGridColumnWidth + WORKSPACE_GRID_PADDING;
|
||||
if (rtl) {
|
||||
this._workspacesX = WORKSPACE_GRID_PADDING;
|
||||
} else {
|
||||
this._workspacesX = displayGridColumnWidth + WORKSPACE_GRID_PADDING;
|
||||
}
|
||||
this._workspacesY = Math.floor(displayGridRowHeight + WORKSPACE_GRID_PADDING * (primary.height / primary.width));
|
||||
|
||||
this._dash.actor.set_position(0, contentY);
|
||||
if (rtl) {
|
||||
this._dash.actor.set_position(primary.width - displayGridColumnWidth, contentY);
|
||||
} else {
|
||||
this._dash.actor.set_position(0, contentY);
|
||||
}
|
||||
|
||||
this._dash.actor.set_size(displayGridColumnWidth, contentHeight);
|
||||
this._dash.searchArea.height = this._workspacesY - contentY;
|
||||
this._dash.sectionArea.height = this._workspacesHeight;
|
||||
this._dash.searchResults.actor.height = this._workspacesHeight;
|
||||
|
||||
this.infoBar.actor.set_position(displayGridColumnWidth, Panel.PANEL_HEIGHT);
|
||||
this.infoBar.actor.set_size(primary.width - displayGridColumnWidth, this._workspacesY - Panel.PANEL_HEIGHT);
|
||||
this.infoBar.actor.raise_top();
|
||||
|
||||
// place the 'Add Workspace' button in the bottom row of the grid
|
||||
addRemoveButtonSize = Math.floor(displayGridRowHeight * 3/5);
|
||||
this._addButtonX = this._workspacesX + this._workspacesWidth - addRemoveButtonSize;
|
||||
this._addButtonY = primary.height - Math.floor(displayGridRowHeight * 4/5);
|
||||
this._workspacesBarX = this._workspacesX;
|
||||
this._workspacesBarWidth = this._workspacesWidth;
|
||||
this._workspacesBarY = primary.height - displayGridRowHeight;
|
||||
|
||||
// The parent (this._group) is positioned at the top left of the primary monitor
|
||||
// while this._backOver occupies the entire screen.
|
||||
@ -199,17 +321,22 @@ Overview.prototype = {
|
||||
this._workspacesY);
|
||||
// Dynamic width
|
||||
this._paneContainer.height = this._workspacesHeight;
|
||||
if (rtl) {
|
||||
this._paneContainer.connect('notify::width', Lang.bind(this, function (paneContainer) {
|
||||
paneContainer.x = this._dash.actor.x - (DEFAULT_PADDING + paneContainer.width);
|
||||
}));
|
||||
}
|
||||
|
||||
this._transparentBackground.set_position(this._paneContainer.x, this._paneContainer.y);
|
||||
this._transparentBackground.set_size(primary.width - this._paneContainer.x,
|
||||
this._paneContainer.height);
|
||||
this._transparentBackground.set_position(primary.x, primary.y);
|
||||
this._transparentBackground.set_size(primary.width, primary.height);
|
||||
|
||||
if (this._activeDisplayPane != null)
|
||||
this._activeDisplayPane.actor.width = displayGridColumnWidth * 2;
|
||||
},
|
||||
|
||||
addPane: function (pane) {
|
||||
this._paneContainer.append(pane.actor, Big.BoxPackFlags.NONE);
|
||||
addPane: function (pane, align) {
|
||||
pane.actor.height = .9 * this._workspacesHeight;
|
||||
this._paneContainer.add(pane.actor, { expand: true,
|
||||
y_fill: false,
|
||||
y_align: align });
|
||||
// When a pane is displayed, we raise the transparent background to the top
|
||||
// and connect to button-release-event on it, then raise the pane above that.
|
||||
// The idea here is that clicking anywhere outside the pane should close it.
|
||||
@ -217,17 +344,24 @@ Overview.prototype = {
|
||||
let backgroundEventId = null;
|
||||
pane.connect('open-state-changed', Lang.bind(this, function (pane, isOpen) {
|
||||
if (isOpen) {
|
||||
pane.actor.width = displayGridColumnWidth * 2;
|
||||
this._activeDisplayPane = pane;
|
||||
this._transparentBackground.raise_top();
|
||||
this._paneContainer.raise_top();
|
||||
this._paneContainer.show();
|
||||
this._paneReady = false;
|
||||
if (backgroundEventId != null)
|
||||
this._transparentBackground.disconnect(backgroundEventId);
|
||||
backgroundEventId = this._transparentBackground.connect('button-release-event', Lang.bind(this, function () {
|
||||
this._activeDisplayPane.close();
|
||||
backgroundEventId = this._transparentBackground.connect('captured-event', Lang.bind(this, function (actor, event) {
|
||||
if (event.get_source() != this._transparentBackground)
|
||||
return false;
|
||||
if (event.type() == Clutter.EventType.BUTTON_PRESS)
|
||||
this._paneReady = true;
|
||||
if (event.type() == Clutter.EventType.BUTTON_RELEASE
|
||||
&& this._paneReady)
|
||||
this._activeDisplayPane.close();
|
||||
return true;
|
||||
}));
|
||||
this._workspaces.actor.opacity = 64;
|
||||
this.workspaces.actor.opacity = 64;
|
||||
} else if (pane == this._activeDisplayPane) {
|
||||
this._activeDisplayPane = null;
|
||||
if (backgroundEventId != null) {
|
||||
@ -235,8 +369,8 @@ Overview.prototype = {
|
||||
backgroundEventId = null;
|
||||
}
|
||||
this._transparentBackground.lower_bottom();
|
||||
this._paneContainer.lower_bottom();
|
||||
this._workspaces.actor.opacity = 255;
|
||||
this._paneContainer.hide();
|
||||
this.workspaces.actor.opacity = 255;
|
||||
}
|
||||
}));
|
||||
},
|
||||
@ -262,13 +396,13 @@ Overview.prototype = {
|
||||
// Returns the scale the Overview has when we just start zooming out
|
||||
// to overview mode. That is, when just the active workspace is showing.
|
||||
getZoomedInScale : function() {
|
||||
return 1 / this._workspaces.getScale();
|
||||
return 1 / this.workspaces.getScale();
|
||||
},
|
||||
|
||||
// Returns the position the Overview has when we just start zooming out
|
||||
// to overview mode. That is, when just the active workspace is showing.
|
||||
getZoomedInPosition : function() {
|
||||
let [posX, posY] = this._workspaces.getActiveWorkspacePosition();
|
||||
let [posX, posY] = this.workspaces.getActiveWorkspacePosition();
|
||||
let scale = this.getZoomedInScale();
|
||||
|
||||
return [- posX * scale, - posY * scale];
|
||||
@ -296,20 +430,28 @@ Overview.prototype = {
|
||||
this._dash.show();
|
||||
|
||||
/* TODO: make this stuff dynamic */
|
||||
this._workspaces = new Workspaces.Workspaces(this._workspacesWidth, this._workspacesHeight,
|
||||
this._workspacesX, this._workspacesY);
|
||||
this._group.add_actor(this._workspaces.actor);
|
||||
this._workspacesManager =
|
||||
new WorkspacesView.WorkspacesManager(this._workspacesWidth,
|
||||
this._workspacesHeight,
|
||||
this._workspacesX,
|
||||
this._workspacesY);
|
||||
this._workspacesManager.connect('view-changed',
|
||||
Lang.bind(this, this._onViewChanged));
|
||||
this.workspaces = this._workspacesManager.workspacesView;
|
||||
this._group.add_actor(this.workspaces.actor);
|
||||
|
||||
// The workspaces actor is as big as the screen, so we have to raise the dash above it
|
||||
// for drag and drop to work. In the future we should fix the workspaces to not
|
||||
// be as big as the screen.
|
||||
this._dash.actor.raise(this._workspaces.actor);
|
||||
this._dash.actor.raise(this.workspaces.actor);
|
||||
|
||||
// Create (+) button
|
||||
this._addButton = new AddWorkspaceButton(addRemoveButtonSize, this._addButtonX, this._addButtonY, Lang.bind(this, this._acceptNewWorkspaceDrop));
|
||||
this._addButton.actor.connect('button-release-event', Lang.bind(this, this._addNewWorkspace));
|
||||
this._group.add_actor(this._addButton.actor);
|
||||
this._addButton.actor.raise(this._workspaces.actor);
|
||||
this._workspacesBar = this._workspacesManager.controlsBar.actor;
|
||||
this._workspacesBar.set_position(this._workspacesBarX,
|
||||
this._workspacesBarY);
|
||||
this._workspacesBar.width = this._workspacesBarWidth;
|
||||
|
||||
this._group.add_actor(this._workspacesBar);
|
||||
this._workspacesBar.raise(this.workspaces.actor);
|
||||
|
||||
// All the the actors in the window group are completely obscured,
|
||||
// hiding the group holding them while the Overview is displayed greatly
|
||||
@ -339,7 +481,7 @@ Overview.prototype = {
|
||||
onCompleteScope: this
|
||||
});
|
||||
|
||||
// Make Dash fade in so that it doesn't appear to big.
|
||||
// Make Dash fade in so that it doesn't appear too big.
|
||||
this._dash.actor.opacity = 0;
|
||||
Tweener.addTween(this._dash.actor,
|
||||
{ opacity: 255,
|
||||
@ -359,11 +501,7 @@ Overview.prototype = {
|
||||
this._hideInProgress = true;
|
||||
if (this._activeDisplayPane != null)
|
||||
this._activeDisplayPane.close();
|
||||
this._workspaces.hide();
|
||||
|
||||
this._addButton.actor.destroy();
|
||||
this._addButton.actor = null;
|
||||
this._addButton = null;
|
||||
this.workspaces.hide();
|
||||
|
||||
// Create a zoom in effect by transforming the Overview group so that
|
||||
// the active workspace fills up the whole screen. The opposite
|
||||
@ -408,21 +546,7 @@ Overview.prototype = {
|
||||
* and will return %null.
|
||||
*/
|
||||
getWorkspacesForWindow: function(metaWindow) {
|
||||
return this._workspaces;
|
||||
},
|
||||
|
||||
/**
|
||||
* activateWindow:
|
||||
* @metaWindow: A #MetaWindow
|
||||
* @time: Event timestamp integer
|
||||
*
|
||||
* Make the given MetaWindow be the focus window, switching
|
||||
* to the workspace it's on if necessary. This function
|
||||
* should only be used when the Overview is currently active;
|
||||
* outside of that, use the relevant methods on MetaDisplay.
|
||||
*/
|
||||
activateWindow: function (metaWindow, time) {
|
||||
this._workspaces.activateWindowFromOverview(metaWindow, time);
|
||||
return this.workspaces;
|
||||
},
|
||||
|
||||
//// Private methods ////
|
||||
@ -440,8 +564,13 @@ Overview.prototype = {
|
||||
_hideDone: function() {
|
||||
global.window_group.show();
|
||||
|
||||
this._workspaces.destroy();
|
||||
this._workspaces = null;
|
||||
this.workspaces.destroy();
|
||||
this.workspaces = null;
|
||||
|
||||
this._workspacesBar.destroy();
|
||||
this._workspacesBar = null;
|
||||
|
||||
this._workspacesManager = null;
|
||||
|
||||
this._dash.hide();
|
||||
this._group.hide();
|
||||
@ -454,43 +583,6 @@ Overview.prototype = {
|
||||
|
||||
Main.popModal(this._dash.actor);
|
||||
this.emit('hidden');
|
||||
},
|
||||
|
||||
_addNewWorkspace: function() {
|
||||
global.screen.append_new_workspace(false, global.get_current_time());
|
||||
},
|
||||
|
||||
_acceptNewWorkspaceDrop: function(source, dropActor, x, y, time) {
|
||||
this._addNewWorkspace();
|
||||
return this._workspaces.acceptNewWorkspaceDrop(source, dropActor, x, y, time);
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Overview.prototype);
|
||||
|
||||
function AddWorkspaceButton(buttonSize, buttonX, buttonY, acceptDropCallback) {
|
||||
this._init(buttonSize, buttonX, buttonY, acceptDropCallback);
|
||||
}
|
||||
|
||||
AddWorkspaceButton.prototype = {
|
||||
_init: function(buttonSize, buttonX, buttonY, acceptDropCallback) {
|
||||
this.actor = new Clutter.Group({ x: buttonX,
|
||||
y: buttonY,
|
||||
width: global.screen_width - buttonX,
|
||||
height: global.screen_height - buttonY,
|
||||
reactive: true });
|
||||
this.actor._delegate = this;
|
||||
this._acceptDropCallback = acceptDropCallback;
|
||||
|
||||
let plus = new Clutter.Texture({ x: 0,
|
||||
y: 0,
|
||||
width: buttonSize,
|
||||
height: buttonSize });
|
||||
plus.set_from_file(global.imagedir + 'add-workspace.svg');
|
||||
this.actor.add_actor(plus);
|
||||
},
|
||||
|
||||
// Draggable target interface
|
||||
acceptDrop: function(source, actor, x, y, time) {
|
||||
return this._acceptDropCallback(source, actor, x, y, time);
|
||||
}
|
||||
};
|
||||
|
1033
js/ui/panel.js
@ -1,6 +1,5 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Pango = imports.gi.Pango;
|
||||
const GLib = imports.gi.GLib;
|
||||
@ -59,7 +58,7 @@ PlaceInfo.prototype = {
|
||||
isRemovable: function() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function PlaceDeviceInfo(mount) {
|
||||
this._init(mount);
|
||||
@ -72,12 +71,12 @@ PlaceDeviceInfo.prototype = {
|
||||
this._mount = mount;
|
||||
this.name = mount.get_name();
|
||||
this._lowerName = this.name.toLowerCase();
|
||||
this.id = "mount:" + mount.get_root().get_uri();
|
||||
this.id = 'mount:' + mount.get_root().get_uri();
|
||||
},
|
||||
|
||||
iconFactory: function(size) {
|
||||
let icon = this._mount.get_icon();
|
||||
return Shell.TextureCache.get_default().load_gicon(icon, size);
|
||||
return St.TextureCache.get_default().load_gicon(icon, size);
|
||||
},
|
||||
|
||||
launch: function() {
|
||||
@ -93,13 +92,26 @@ PlaceDeviceInfo.prototype = {
|
||||
if (!this.isRemovable())
|
||||
return;
|
||||
|
||||
this._mount.unmount(0, null, Lang.bind(this, this._removeFinish), null);
|
||||
if (this._mount.can_eject())
|
||||
this._mount.eject(0, null, Lang.bind(this, this._removeFinish));
|
||||
else
|
||||
this._mount.unmount(0, null, Lang.bind(this, this._removeFinish));
|
||||
},
|
||||
|
||||
_removeFinish: function(o, res, data) {
|
||||
this._mount.unmount_finish(res);
|
||||
try {
|
||||
if (this._mount.can_eject())
|
||||
this._mount.eject_finish(res);
|
||||
else
|
||||
this._mount.unmount_finish(res);
|
||||
} catch (e) {
|
||||
let message = _("Failed to unmount '%s'").format(o.get_name());
|
||||
Main.overview.infoBar.setMessage(message,
|
||||
Lang.bind(this, this.remove),
|
||||
_("Retry"));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
function PlacesManager() {
|
||||
@ -114,7 +126,7 @@ PlacesManager.prototype = {
|
||||
this._defaultPlaces = [];
|
||||
this._mounts = [];
|
||||
this._bookmarks = [];
|
||||
this._isDesktopHome = false;
|
||||
this._isDesktopHome = gconf.get_boolean(DESKTOP_IS_HOME_KEY);
|
||||
|
||||
let homeFile = Gio.file_new_for_path (GLib.get_home_dir());
|
||||
let homeUri = homeFile.get_uri();
|
||||
@ -122,7 +134,7 @@ PlacesManager.prototype = {
|
||||
let homeIcon = Shell.util_get_icon_for_uri (homeUri);
|
||||
this._home = new PlaceInfo('special:home', homeLabel,
|
||||
function(size) {
|
||||
return Shell.TextureCache.get_default().load_gicon(homeIcon, size);
|
||||
return St.TextureCache.get_default().load_gicon(homeIcon, size);
|
||||
},
|
||||
function() {
|
||||
Gio.app_info_launch_default_for_uri(homeUri, global.create_app_launch_context());
|
||||
@ -135,7 +147,7 @@ PlacesManager.prototype = {
|
||||
let desktopIcon = Shell.util_get_icon_for_uri (desktopUri);
|
||||
this._desktopMenu = new PlaceInfo('special:desktop', desktopLabel,
|
||||
function(size) {
|
||||
return Shell.TextureCache.get_default().load_gicon(desktopIcon, size);
|
||||
return St.TextureCache.get_default().load_gicon(desktopIcon, size);
|
||||
},
|
||||
function() {
|
||||
Gio.app_info_launch_default_for_uri(desktopUri, global.create_app_launch_context());
|
||||
@ -143,7 +155,7 @@ PlacesManager.prototype = {
|
||||
|
||||
this._connect = new PlaceInfo('special:connect', _("Connect to..."),
|
||||
function (size) {
|
||||
return Shell.TextureCache.get_default().load_icon_name("applications-internet", size);
|
||||
return St.TextureCache.get_default().load_icon_name('applications-internet', size);
|
||||
},
|
||||
function () {
|
||||
new Shell.Process({ args: ['nautilus-connect-server'] }).run();
|
||||
@ -156,7 +168,7 @@ PlacesManager.prototype = {
|
||||
try {
|
||||
networkApp = Shell.AppSystem.get_default().load_from_desktop_file('network-scheme.desktop');
|
||||
} catch(e) {
|
||||
log("Cannot create \"Network\" item, .desktop file not found or corrupt.");
|
||||
log('Cannot create "Network" item, .desktop file not found or corrupt.');
|
||||
}
|
||||
}
|
||||
|
||||
@ -172,6 +184,7 @@ PlacesManager.prototype = {
|
||||
|
||||
this._defaultPlaces.push(this._home);
|
||||
|
||||
this._desktopMenuIndex = this._defaultPlaces.length;
|
||||
if (!this._isDesktopHome)
|
||||
this._defaultPlaces.push(this._desktopMenu);
|
||||
|
||||
@ -195,7 +208,7 @@ PlacesManager.prototype = {
|
||||
this._volumeMonitor.connect('drive-changed', Lang.bind(this, this._updateDevices));
|
||||
this._updateDevices();
|
||||
|
||||
this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), ".gtk-bookmarks"]);
|
||||
this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']);
|
||||
this._bookmarksFile = Gio.file_new_for_path(this._bookmarksPath);
|
||||
let monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null);
|
||||
this._bookmarkTimeoutId = 0;
|
||||
@ -211,7 +224,6 @@ PlacesManager.prototype = {
|
||||
}));
|
||||
|
||||
this._reloadBookmarks();
|
||||
this._updateDesktopMenuVisibility();
|
||||
|
||||
gconf.connect('changed::' + DESKTOP_IS_HOME_KEY, Lang.bind(this, this._updateDesktopMenuVisibility));
|
||||
|
||||
@ -310,7 +322,7 @@ PlacesManager.prototype = {
|
||||
|
||||
let item = new PlaceInfo('bookmark:' + bookmark, label,
|
||||
function(size) {
|
||||
return Shell.TextureCache.get_default().load_gicon(icon, size);
|
||||
return St.TextureCache.get_default().load_gicon(icon, size);
|
||||
},
|
||||
function() {
|
||||
Gio.app_info_launch_default_for_uri(bookmark, global.create_app_launch_context());
|
||||
@ -327,6 +339,12 @@ PlacesManager.prototype = {
|
||||
let gconf = Shell.GConf.get_default();
|
||||
this._isDesktopHome = gconf.get_boolean(DESKTOP_IS_HOME_KEY);
|
||||
|
||||
if (this._isDesktopHome)
|
||||
this._removeById(this._defaultPlaces, 'special:desktop');
|
||||
else
|
||||
this._defaultPlaces.splice(this._desktopMenuIndex, 0,
|
||||
this._desktopMenu);
|
||||
|
||||
/* See comment in _updateDevices for explanation why there are two signals. */
|
||||
this.emit('defaults-updated');
|
||||
this.emit('places-updated');
|
||||
@ -353,13 +371,13 @@ PlacesManager.prototype = {
|
||||
return this._mounts;
|
||||
},
|
||||
|
||||
_lookupById: function(sourceArray, id) {
|
||||
_lookupIndexById: function(sourceArray, id) {
|
||||
for (let i = 0; i < sourceArray.length; i++) {
|
||||
let place = sourceArray[i];
|
||||
if (place.id == id)
|
||||
return place;
|
||||
return i;
|
||||
}
|
||||
return null;
|
||||
return -1;
|
||||
},
|
||||
|
||||
lookupPlaceById: function(id) {
|
||||
@ -372,7 +390,11 @@ PlacesManager.prototype = {
|
||||
sourceArray = this._mounts;
|
||||
else if (type == 'bookmark')
|
||||
sourceArray = this._bookmarks;
|
||||
return this._lookupById(sourceArray, id);
|
||||
return sourceArray[this._lookupIndexById(sourceArray, id)];
|
||||
},
|
||||
|
||||
_removeById: function(sourceArray, id) {
|
||||
sourceArray.splice(this._lookupIndexById(sourceArray, id), 1);
|
||||
}
|
||||
};
|
||||
|
||||
@ -391,31 +413,36 @@ DashPlaceDisplayItem.prototype = {
|
||||
this.name = info.name;
|
||||
this._info = info;
|
||||
this._icon = info.iconFactory(PLACES_ICON_SIZE);
|
||||
this.actor = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
spacing: 4 });
|
||||
let text = new St.Button({ style_class: 'places-item',
|
||||
label: info.name,
|
||||
x_align: St.Align.START });
|
||||
text.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
let iconBox = new St.Bin({ child: this._icon, reactive: true });
|
||||
iconBox.connect('button-release-event',
|
||||
Lang.bind(this, this._onClicked));
|
||||
this.actor.append(iconBox, Big.BoxPackFlags.NONE);
|
||||
this.actor.append(text, Big.BoxPackFlags.EXPAND);
|
||||
|
||||
this.actor = new St.Clickable({ style_class: 'places-item',
|
||||
reactive: true,
|
||||
x_align: St.Align.START,
|
||||
x_fill: true });
|
||||
|
||||
let box = new St.BoxLayout({ style_class: 'places-item-box' });
|
||||
this.actor.set_child(box);
|
||||
|
||||
let bin = new St.Bin({ child: this._icon });
|
||||
box.add(bin);
|
||||
|
||||
let text = new St.Label({ text: info.name });
|
||||
box.add(text, { expand: true, x_fill: true });
|
||||
|
||||
if (info.isRemovable()) {
|
||||
let removeIcon = Shell.TextureCache.get_default().load_icon_name ('media-eject', PLACES_ICON_SIZE);
|
||||
let removeIconBox = new St.Button({ child: removeIcon,
|
||||
reactive: true });
|
||||
this.actor.append(removeIconBox, Big.BoxPackFlags.NONE);
|
||||
let removeIcon = St.TextureCache.get_default().load_icon_name ('media-eject', PLACES_ICON_SIZE);
|
||||
let removeIconBox = new St.Clickable({ child: removeIcon,
|
||||
reactive: true });
|
||||
box.add(removeIconBox);
|
||||
removeIconBox.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
this._info.remove();
|
||||
}));
|
||||
}
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
|
||||
this.actor._delegate = this;
|
||||
let draggable = DND.makeDraggable(this.actor);
|
||||
this._draggable = DND.makeDraggable(this.actor);
|
||||
},
|
||||
|
||||
_onClicked: function(b) {
|
||||
@ -449,28 +476,12 @@ DashPlaceDisplay.prototype = {
|
||||
// look better in that there would be an even number of items left+right,
|
||||
// but it seems like we want some sort of differentiation between actions
|
||||
// like "Connect to server..." and regular folders
|
||||
this.actor = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
spacing: 4 });
|
||||
this._leftBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL });
|
||||
this.actor.append(this._leftBox, Big.BoxPackFlags.EXPAND);
|
||||
this._rightBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL });
|
||||
this.actor.append(this._rightBox, Big.BoxPackFlags.EXPAND);
|
||||
this.actor = new St.Table({ style_class: 'places-section',
|
||||
homogeneous: true });
|
||||
|
||||
// Subdivide left into actions and devices
|
||||
this._actionsBox = new St.BoxLayout({ style_class: 'places-actions',
|
||||
vertical: true });
|
||||
|
||||
this._devBox = new St.BoxLayout({ style_class: 'places-actions',
|
||||
name: 'placesDevices',
|
||||
vertical: true });
|
||||
|
||||
this._dirsBox = new St.BoxLayout({ style_class: 'places-actions',
|
||||
vertical: true });
|
||||
|
||||
this._leftBox.append(this._actionsBox, Big.BoxPackFlags.NONE);
|
||||
this._leftBox.append(this._devBox, Big.BoxPackFlags.NONE);
|
||||
|
||||
this._rightBox.append(this._dirsBox, Big.BoxPackFlags.NONE);
|
||||
this._defaultsList = [];
|
||||
this._bookmarksList = [];
|
||||
this._mountsList = [];
|
||||
|
||||
Main.placesManager.connect('defaults-updated', Lang.bind(this, this._updateDefaults));
|
||||
Main.placesManager.connect('bookmarks-updated', Lang.bind(this, this._updateBookmarks));
|
||||
@ -482,27 +493,40 @@ DashPlaceDisplay.prototype = {
|
||||
},
|
||||
|
||||
_updateDefaults: function() {
|
||||
this._actionsBox.destroy_children();
|
||||
for (let i = 0; i < this._defaultsList.length; i++)
|
||||
this._defaultsList[i].destroy();
|
||||
|
||||
this._defaultsList = [];
|
||||
let places = Main.placesManager.getDefaultPlaces();
|
||||
for (let i = 0; i < places.length; i++)
|
||||
this._actionsBox.add(new DashPlaceDisplayItem(places[i]).actor);
|
||||
for (let i = 0; i < places.length; i++) {
|
||||
this._defaultsList[i] = new DashPlaceDisplayItem(places[i]).actor;
|
||||
this.actor.add(this._defaultsList[i], {row: i, col: 0});
|
||||
}
|
||||
this._updateMounts();
|
||||
},
|
||||
|
||||
_updateMounts: function() {
|
||||
this._devBox.destroy_children();
|
||||
for (let i = 0; i < this._mountsList.length; i++)
|
||||
this._mountsList[i].destroy();
|
||||
|
||||
this._mountsList = [];
|
||||
let places = Main.placesManager.getMounts();
|
||||
for (let i = 0; i < places.length; i++)
|
||||
this._devBox.add(new DashPlaceDisplayItem(places[i]).actor);
|
||||
for (let i = 0; i < places.length; i++) {
|
||||
this._mountsList[i] = new DashPlaceDisplayItem(places[i]).actor;
|
||||
this.actor.add(this._mountsList[i], {row: this._defaultsList.length + i, col: 0});
|
||||
}
|
||||
},
|
||||
|
||||
_updateBookmarks: function() {
|
||||
this._dirsBox.destroy_children();
|
||||
for (let i = 0; i < this._bookmarksList.length; i++)
|
||||
this._bookmarksList[i].destroy();
|
||||
|
||||
this._bookmarksList = [];
|
||||
let places = Main.placesManager.getBookmarks();
|
||||
for (let i = 0; i < places.length; i ++)
|
||||
this._dirsBox.add(new DashPlaceDisplayItem(places[i]).actor);
|
||||
for (let i = 0; i < places.length; i ++) {
|
||||
this._bookmarksList[i] = new DashPlaceDisplayItem(places[i]).actor;
|
||||
this.actor.add(this._bookmarksList[i], {row: i, col: 1});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -516,7 +540,7 @@ PlaceSearchProvider.prototype = {
|
||||
__proto__: Search.SearchProvider.prototype,
|
||||
|
||||
_init: function() {
|
||||
Search.SearchProvider.prototype._init.call(this, _("PLACES"));
|
||||
Search.SearchProvider.prototype._init.call(this, _("PLACES & DEVICES"));
|
||||
},
|
||||
|
||||
getResultMeta: function(resultId) {
|
||||
@ -571,4 +595,4 @@ PlaceSearchProvider.prototype = {
|
||||
let places = previousResults.map(function (id) { return Main.placesManager.lookupPlaceById(id); });
|
||||
return this._searchPlaces(places, terms);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -1,12 +1,12 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const St = imports.gi.St;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
@ -15,18 +15,11 @@ const _ = Gettext.gettext;
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const BOX_BACKGROUND_COLOR = new Clutter.Color();
|
||||
BOX_BACKGROUND_COLOR.from_pixel(0x000000cc);
|
||||
|
||||
const BOX_TEXT_COLOR = new Clutter.Color();
|
||||
BOX_TEXT_COLOR.from_pixel(0xffffffff);
|
||||
|
||||
const DIALOG_WIDTH = 320;
|
||||
const DIALOG_PADDING = 6;
|
||||
const ICON_SIZE = 24;
|
||||
const ICON_BOX_SIZE = 36;
|
||||
const MAX_FILE_DELETED_BEFORE_INVALID = 10;
|
||||
|
||||
const HISTORY_KEY = 'run_dialog/history';
|
||||
const HISTORY_LIMIT = 512;
|
||||
|
||||
function CommandCompleter() {
|
||||
this._init();
|
||||
}
|
||||
@ -35,6 +28,7 @@ CommandCompleter.prototype = {
|
||||
_init : function() {
|
||||
this._changedCount = 0;
|
||||
this._paths = GLib.getenv('PATH').split(':');
|
||||
this._paths.push(GLib.get_home_dir());
|
||||
this._valid = false;
|
||||
this._updateInProgress = false;
|
||||
this._childs = new Array(this._paths.length);
|
||||
@ -42,7 +36,14 @@ CommandCompleter.prototype = {
|
||||
for (let i = 0; i < this._paths.length; i++) {
|
||||
this._childs[i] = [];
|
||||
let file = Gio.file_new_for_path(this._paths[i]);
|
||||
let info = file.query_info(Gio.FILE_ATTRIBUTE_STANDARD_TYPE, Gio.FileQueryInfoFlags.NONE, null);
|
||||
let info;
|
||||
try {
|
||||
info = file.query_info(Gio.FILE_ATTRIBUTE_STANDARD_TYPE, Gio.FileQueryInfoFlags.NONE, null);
|
||||
} catch (e) {
|
||||
// FIXME catchall
|
||||
this._paths[i] = null;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (info.get_attribute_uint32(Gio.FILE_ATTRIBUTE_STANDARD_TYPE) != Gio.FileType.DIRECTORY)
|
||||
continue;
|
||||
@ -50,15 +51,18 @@ CommandCompleter.prototype = {
|
||||
this._paths[i] = file.get_path();
|
||||
this._monitors[i] = file.monitor_directory(Gio.FileMonitorFlags.NONE, null);
|
||||
if (this._monitors[i] != null) {
|
||||
this._monitors[i].connect("changed", Lang.bind(this, this._onChanged));
|
||||
this._monitors[i].connect('changed', Lang.bind(this, this._onChanged));
|
||||
}
|
||||
}
|
||||
this._paths = this._paths.filter(function(a) {
|
||||
return a != null;
|
||||
});
|
||||
this._update(0);
|
||||
},
|
||||
|
||||
_onGetEnumerateComplete : function(obj, res) {
|
||||
this._enumerator = obj.enumerate_children_finish(res);
|
||||
this._enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onNextFileComplete), null);
|
||||
this._enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onNextFileComplete));
|
||||
},
|
||||
|
||||
_onNextFileComplete : function(obj, res) {
|
||||
@ -67,7 +71,7 @@ CommandCompleter.prototype = {
|
||||
this._childs[this._i].push(files[i].get_name());
|
||||
}
|
||||
if (files.length) {
|
||||
this._enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onNextFileComplete), null);
|
||||
this._enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onNextFileComplete));
|
||||
} else {
|
||||
this._enumerator.close(null);
|
||||
this._enumerator = null;
|
||||
@ -94,7 +98,7 @@ CommandCompleter.prototype = {
|
||||
}
|
||||
let file = Gio.file_new_for_path(this._paths[i]);
|
||||
this._childs[this._i] = [];
|
||||
file.enumerate_children_async(Gio.FILE_ATTRIBUTE_STANDARD_NAME, Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onGetEnumerateComplete), null);
|
||||
file.enumerate_children_async(Gio.FILE_ATTRIBUTE_STANDARD_NAME, Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onGetEnumerateComplete));
|
||||
},
|
||||
|
||||
_onChanged : function(m, f, of, type) {
|
||||
@ -128,7 +132,7 @@ CommandCompleter.prototype = {
|
||||
},
|
||||
|
||||
getCompletion: function(text) {
|
||||
let common = "";
|
||||
let common = '';
|
||||
let notInit = true;
|
||||
if (!this._valid) {
|
||||
this._update(0);
|
||||
@ -141,7 +145,7 @@ CommandCompleter.prototype = {
|
||||
break;
|
||||
}
|
||||
if (k == 0)
|
||||
return "";
|
||||
return '';
|
||||
return s1.substr(0, k);
|
||||
}
|
||||
function _hasPrefix(s1, prefix) {
|
||||
@ -166,17 +170,25 @@ CommandCompleter.prototype = {
|
||||
|
||||
function RunDialog() {
|
||||
this._init();
|
||||
};
|
||||
}
|
||||
|
||||
RunDialog.prototype = {
|
||||
_init : function() {
|
||||
this._isOpen = false;
|
||||
|
||||
let gconf = Shell.GConf.get_default();
|
||||
gconf.connect('changed::development_tools', Lang.bind(this, function () {
|
||||
this._enableInternalCommands = gconf.get_boolean('development_tools');
|
||||
this._gconf = Shell.GConf.get_default();
|
||||
this._gconf.connect('changed::development_tools', Lang.bind(this, function () {
|
||||
this._enableInternalCommands = this._gconf.get_boolean('development_tools');
|
||||
}));
|
||||
this._enableInternalCommands = this._gconf.get_boolean('development_tools');
|
||||
|
||||
this._history = this._gconf.get_string_list(HISTORY_KEY);
|
||||
this._historyIndex = -1;
|
||||
|
||||
this._gconf.connect('changed::' + HISTORY_KEY, Lang.bind(this, function() {
|
||||
this._history = this._gconf.get_string_list(HISTORY_KEY);
|
||||
this._historyIndex = this._history.length;
|
||||
}));
|
||||
this._enableInternalCommands = gconf.get_boolean('development_tools');
|
||||
|
||||
this._internalCommands = { 'lg':
|
||||
Lang.bind(this, function() {
|
||||
@ -200,87 +212,69 @@ RunDialog.prototype = {
|
||||
// All actors are inside _group. We create it initially
|
||||
// hidden then show it in show()
|
||||
this._group = new Clutter.Group({ visible: false,
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: global.screen_width,
|
||||
height: global.screen_height });
|
||||
global.stage.add_actor(this._group);
|
||||
x: 0, y: 0 });
|
||||
Main.uiGroup.add_actor(this._group);
|
||||
|
||||
let lightbox = new Lightbox.Lightbox(this._group);
|
||||
let lightbox = new Lightbox.Lightbox(this._group, true);
|
||||
|
||||
this._boxH = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
x_align: Big.BoxAlignment.CENTER,
|
||||
y_align: Big.BoxAlignment.CENTER });
|
||||
this._box = new St.Bin({ x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.MIDDLE });
|
||||
|
||||
this._group.add_actor(this._boxH);
|
||||
lightbox.highlight(this._boxH);
|
||||
this._group.add_actor(this._box);
|
||||
lightbox.highlight(this._box);
|
||||
|
||||
let boxV = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
y_align: Big.BoxAlignment.CENTER });
|
||||
let dialogBox = new St.BoxLayout({ style_class: 'run-dialog', vertical: true });
|
||||
|
||||
this._boxH.append(boxV, Big.BoxPackFlags.NONE);
|
||||
this._box.set_child(dialogBox);
|
||||
|
||||
let label = new St.Label({ style_class: 'run-dialog-label',
|
||||
text: _("Please enter a command:") });
|
||||
|
||||
let dialogBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
background_color: BOX_BACKGROUND_COLOR,
|
||||
corner_radius: 4,
|
||||
reactive: false,
|
||||
padding: DIALOG_PADDING,
|
||||
width: DIALOG_WIDTH });
|
||||
dialogBox.add(label, { expand: true, y_fill: false });
|
||||
|
||||
this._boxH.append(dialogBox, Big.BoxPackFlags.NONE);
|
||||
let entry = new St.Entry({ style_class: 'run-dialog-entry' });
|
||||
|
||||
let label = new Clutter.Text({ color: BOX_TEXT_COLOR,
|
||||
font_name: '18px Sans',
|
||||
text: _("Please enter a command:") });
|
||||
this._entryText = entry.clutter_text;
|
||||
dialogBox.add(entry, { expand: true });
|
||||
|
||||
dialogBox.append(label, Big.BoxPackFlags.EXPAND);
|
||||
this._errorBox = new St.BoxLayout();
|
||||
|
||||
this._entry = new Clutter.Text({ color: BOX_TEXT_COLOR,
|
||||
font_name: '20px Sans Bold',
|
||||
editable: true,
|
||||
activatable: true,
|
||||
singleLineMode: true });
|
||||
dialogBox.add(this._errorBox, { expand: true });
|
||||
|
||||
dialogBox.append(this._entry, Big.BoxPackFlags.EXPAND);
|
||||
let errorIcon = new St.Button({ style_class: 'run-dialog-error-icon' });
|
||||
|
||||
this._errorBox = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
padding_top: DIALOG_PADDING });
|
||||
|
||||
dialogBox.append(this._errorBox, Big.BoxPackFlags.EXPAND);
|
||||
|
||||
let iconBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
y_align: Big.BoxAlignment.CENTER,
|
||||
x_align: Big.BoxAlignment.CENTER,
|
||||
width: ICON_BOX_SIZE,
|
||||
height: ICON_BOX_SIZE });
|
||||
|
||||
this._errorBox.append(iconBox, Big.BoxPackFlags.NONE);
|
||||
this._errorBox.add(errorIcon);
|
||||
|
||||
this._commandError = false;
|
||||
|
||||
let errorIcon = Shell.TextureCache.get_default().load_icon_name("gtk-dialog-error", ICON_SIZE);
|
||||
iconBox.append(errorIcon, Big.BoxPackFlags.EXPAND);
|
||||
this._errorMessage = new St.Label({ style_class: 'run-dialog-error-label' });
|
||||
this._errorMessage.clutter_text.line_wrap = true;
|
||||
|
||||
this._errorMessage = new Clutter.Text({ color: BOX_TEXT_COLOR,
|
||||
font_name: '18px Sans Bold',
|
||||
line_wrap: true });
|
||||
|
||||
this._errorBox.append(this._errorMessage, Big.BoxPackFlags.EXPAND);
|
||||
this._errorBox.add(this._errorMessage, { expand: true });
|
||||
|
||||
this._errorBox.hide();
|
||||
|
||||
this._entry.connect('activate', Lang.bind(this, function (o, e) {
|
||||
this._run(o.get_text());
|
||||
if (!this._commandError)
|
||||
this.close();
|
||||
}));
|
||||
|
||||
this._pathCompleter = new Gio.FilenameCompleter();
|
||||
this._commandCompleter = new CommandCompleter();
|
||||
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
|
||||
this._entry.connect('key-press-event', Lang.bind(this, function(o, e) {
|
||||
this._entryText.connect('key-press-event', Lang.bind(this, function(o, e) {
|
||||
let symbol = e.get_key_symbol();
|
||||
if (symbol == Clutter.Down) {
|
||||
this._setCommandFromHistory(this._historyIndex++);
|
||||
return true;
|
||||
}
|
||||
if (symbol == Clutter.Up) {
|
||||
this._setCommandFromHistory(this._historyIndex--);
|
||||
return true;
|
||||
}
|
||||
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
|
||||
if (Shell.get_event_state(e) & Clutter.ModifierType.CONTROL_MASK)
|
||||
this._run(o.get_text(), true);
|
||||
else
|
||||
this._run(o.get_text(), false);
|
||||
if (!this._commandError)
|
||||
this.close();
|
||||
}
|
||||
if (symbol == Clutter.Escape) {
|
||||
this.close();
|
||||
return true;
|
||||
@ -325,36 +319,84 @@ RunDialog.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
_run : function(command) {
|
||||
_saveHistory : function() {
|
||||
if (this._history.length > HISTORY_LIMIT) {
|
||||
this._history.splice(0, this._history.length - HISTORY_LIMIT);
|
||||
}
|
||||
this._gconf.set_string_list(HISTORY_KEY, this._history);
|
||||
},
|
||||
|
||||
_run : function(input, inTerminal) {
|
||||
let command = input;
|
||||
|
||||
if (this._history.length > 0 && this._history[this._history.length - 1] != input) {
|
||||
this._history.push(input);
|
||||
this._saveHistory();
|
||||
}
|
||||
|
||||
this._commandError = false;
|
||||
let f;
|
||||
if (this._enableInternalCommands)
|
||||
f = this._internalCommands[command];
|
||||
f = this._internalCommands[input];
|
||||
else
|
||||
f = null;
|
||||
if (f) {
|
||||
f();
|
||||
} else if (command) {
|
||||
} else if (input) {
|
||||
try {
|
||||
if (inTerminal)
|
||||
command = 'gnome-terminal -x ' + input;
|
||||
let [ok, len, args] = GLib.shell_parse_argv(command);
|
||||
let p = new Shell.Process({'args' : args});
|
||||
let p = new Shell.Process({ 'args' : args });
|
||||
p.run();
|
||||
} catch (e) {
|
||||
this._commandError = true;
|
||||
/*
|
||||
* The exception contains an error string like:
|
||||
* Error invoking Shell.run: Failed to execute child process "foo"
|
||||
* (No such file or directory)
|
||||
* We are only interested in the actual error, so parse that out.
|
||||
*/
|
||||
let m = /.+\((.+)\)/.exec(e);
|
||||
let errorStr = _("Execution of '%s' failed:").format(command) + "\n" + m[1];
|
||||
this._errorMessage.set_text(errorStr);
|
||||
this._errorBox.show();
|
||||
// Mmmh, that failed - see if @input matches an existing file
|
||||
let path = null;
|
||||
if (input.charAt(0) == '/') {
|
||||
path = input;
|
||||
} else {
|
||||
if (input.charAt(0) == '~')
|
||||
input = input.slice(1);
|
||||
path = GLib.get_home_dir() + '/' + input;
|
||||
}
|
||||
|
||||
if (GLib.file_test(path, GLib.FileTest.EXISTS)) {
|
||||
let file = Gio.file_new_for_path(path);
|
||||
Gio.app_info_launch_default_for_uri(file.get_uri(),
|
||||
global.create_app_launch_context());
|
||||
} else {
|
||||
this._commandError = true;
|
||||
// The exception contains an error string like:
|
||||
// Error invoking Shell.run: Failed to execute child
|
||||
// process "foo" (No such file or directory)
|
||||
// We are only interested in the actual error, so parse
|
||||
//that out.
|
||||
let m = /.+\((.+)\)/.exec(e);
|
||||
let errorStr = _("Execution of '%s' failed:").format(command) + '\n' + m[1];
|
||||
this._errorMessage.set_text(errorStr);
|
||||
|
||||
this._errorBox.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_setCommandFromHistory: function(lastI) {
|
||||
if (this._historyIndex < 0)
|
||||
this._historyIndex = 0;
|
||||
if (this._historyIndex > this._history.length)
|
||||
this._historyIndex = this._history.length;
|
||||
|
||||
let text = this._entryText.get_text();
|
||||
if (text) {
|
||||
this._history[lastI] = text;
|
||||
}
|
||||
if (this._history[this._historyIndex]) {
|
||||
this._entryText.set_text(this._history[this._historyIndex]);
|
||||
} else
|
||||
this._entryText.set_text('');
|
||||
},
|
||||
|
||||
open : function() {
|
||||
if (this._isOpen) // Already shown
|
||||
return;
|
||||
@ -365,13 +407,15 @@ RunDialog.prototype = {
|
||||
// Position the dialog on the current monitor
|
||||
let monitor = global.get_focus_monitor();
|
||||
|
||||
this._boxH.set_position(monitor.x, monitor.y);
|
||||
this._boxH.set_size(monitor.width, monitor.height);
|
||||
this._historyIndex = this._history.length;
|
||||
|
||||
this._box.set_position(monitor.x, monitor.y);
|
||||
this._box.set_size(monitor.width, monitor.height);
|
||||
|
||||
this._isOpen = true;
|
||||
this._group.show();
|
||||
|
||||
global.stage.set_key_focus(this._entry);
|
||||
global.stage.set_key_focus(this._entryText);
|
||||
},
|
||||
|
||||
close : function() {
|
||||
@ -384,7 +428,7 @@ RunDialog.prototype = {
|
||||
this._commandError = false;
|
||||
|
||||
this._group.hide();
|
||||
this._entry.set_text('');
|
||||
this._entryText.set_text('');
|
||||
|
||||
Main.popModal(this._group);
|
||||
}
|
||||
|
261
js/ui/scripting.js
Normal file
@ -0,0 +1,261 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
// This module provides functionality for driving the shell user interface
|
||||
// in an automated fashion. The primary current use case for this is
|
||||
// automated performance testing (see runPerfScript()), but it could
|
||||
// be applied to other forms of automation, such as testing for
|
||||
// correctness as well.
|
||||
//
|
||||
// When scripting an automated test we want to make a series of calls
|
||||
// in a linear fashion, but we also want to be able to let the main
|
||||
// loop run so actions can finish. For this reason we write the script
|
||||
// as a generator function that yields when it want to let the main
|
||||
// loop run.
|
||||
//
|
||||
// yield Scripting.sleep(1000);
|
||||
// main.overview.show();
|
||||
// yield Scripting.waitLeisure();
|
||||
//
|
||||
// While it isn't important to the person writing the script, the actual
|
||||
// yielded result is a function that the caller uses to provide the
|
||||
// callback for resuming the script.
|
||||
|
||||
/**
|
||||
* sleep:
|
||||
* @milliseconds: number of milliseconds to wait
|
||||
*
|
||||
* Used within an automation script to pause the the execution of the
|
||||
* current script for the specified amount of time. Use as
|
||||
* 'yield Scripting.sleep(500);'
|
||||
*/
|
||||
function sleep(milliseconds) {
|
||||
let cb;
|
||||
|
||||
Mainloop.timeout_add(milliseconds, function() {
|
||||
if (cb)
|
||||
cb();
|
||||
return false;
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* waitLeisure:
|
||||
*
|
||||
* Used within an automation script to pause the the execution of the
|
||||
* current script until the shell is completely idle. Use as
|
||||
* 'yield Scripting.waitLeisure();'
|
||||
*/
|
||||
function waitLeisure() {
|
||||
let cb;
|
||||
|
||||
global.run_at_leisure(function() {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* defineScriptEvent
|
||||
* @name: The event will be called script.<name>
|
||||
* @description: Short human-readable description of the event
|
||||
*
|
||||
* Convenience function to define a zero-argument performance event
|
||||
* within the 'script' namespace that is reserved for events defined locally
|
||||
* within a performance automation script
|
||||
*/
|
||||
function defineScriptEvent(name, description) {
|
||||
Shell.PerfLog.get_default().define_event("script." + name,
|
||||
description,
|
||||
"");
|
||||
}
|
||||
|
||||
/**
|
||||
* scriptEvent
|
||||
* @name: Name registered with defineScriptEvent()
|
||||
*
|
||||
* Convenience function to record a script-local performance event
|
||||
* previously defined with defineScriptEvent
|
||||
*/
|
||||
function scriptEvent(name) {
|
||||
Shell.PerfLog.get_default().event("script." + name);
|
||||
}
|
||||
|
||||
/**
|
||||
* collectStatistics
|
||||
*
|
||||
* Convenience function to trigger statistics collection
|
||||
*/
|
||||
function collectStatistics() {
|
||||
Shell.PerfLog.get_default().collect_statistics();
|
||||
}
|
||||
|
||||
function _step(g, finish, onError) {
|
||||
try {
|
||||
let waitFunction = g.next();
|
||||
waitFunction(function() {
|
||||
_step(g, finish, onError);
|
||||
});
|
||||
} catch (err if err instanceof StopIteration) {
|
||||
if (finish)
|
||||
finish();
|
||||
} catch (err) {
|
||||
if (onError)
|
||||
onError(err);
|
||||
}
|
||||
}
|
||||
|
||||
function _collect(scriptModule, outputFile) {
|
||||
let eventHandlers = {};
|
||||
|
||||
for (let f in scriptModule) {
|
||||
let m = /([A-Za-z]+)_([A-Za-z]+)/.exec(f);
|
||||
if (m)
|
||||
eventHandlers[m[1] + "." + m[2]] = scriptModule[f];
|
||||
}
|
||||
|
||||
Shell.PerfLog.get_default().replay(
|
||||
function(time, eventName, signature, arg) {
|
||||
if (eventName in eventHandlers)
|
||||
eventHandlers[eventName](time, arg);
|
||||
});
|
||||
|
||||
if ('finish' in scriptModule)
|
||||
scriptModule.finish();
|
||||
|
||||
if (outputFile) {
|
||||
let f = Gio.file_new_for_path(outputFile);
|
||||
let raw = f.replace(null, false,
|
||||
Gio.FileCreateFlags.NONE,
|
||||
null);
|
||||
let out = Gio.BufferedOutputStream.new_sized (raw, 4096);
|
||||
Shell.write_string_to_stream (out, "{\n");
|
||||
|
||||
Shell.write_string_to_stream(out, '"events":\n');
|
||||
Shell.PerfLog.get_default().dump_events(out);
|
||||
|
||||
let monitors = global.get_monitors()
|
||||
let primary = global.get_primary_monitor()
|
||||
Shell.write_string_to_stream(out, ',\n"monitors":\n[');
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
let monitor = monitors[i];
|
||||
let is_primary = (monitor.x == primary.x &&
|
||||
monitor.y == primary.y &&
|
||||
monitor.width == primary.width &&
|
||||
monitor.height == primary.height);
|
||||
if (i != 0)
|
||||
Shell.write_string_to_stream(out, ', ');
|
||||
Shell.write_string_to_stream(out, '"%s%dx%d+%d+%d"'.format(is_primary ? "*" : "",
|
||||
monitor.width, monitor.height,
|
||||
monitor.x, monitor.y));
|
||||
}
|
||||
Shell.write_string_to_stream(out, ' ]');
|
||||
|
||||
Shell.write_string_to_stream(out, ',\n"metrics":\n[ ');
|
||||
let first = true;
|
||||
for (let name in scriptModule.METRICS) {
|
||||
let metric = scriptModule.METRICS[name];
|
||||
|
||||
if (!first)
|
||||
Shell.write_string_to_stream(out, ',\n ');
|
||||
first = false;
|
||||
|
||||
Shell.write_string_to_stream(out,
|
||||
'{ "name": ' + JSON.stringify(name) + ',\n' +
|
||||
' "description": ' + JSON.stringify(metric.description) + ',\n' +
|
||||
' "units": ' + JSON.stringify(metric.units) + ',\n' +
|
||||
' "value": ' + JSON.stringify(metric.value) + ' }');
|
||||
}
|
||||
Shell.write_string_to_stream(out, ' ]');
|
||||
|
||||
Shell.write_string_to_stream (out, ',\n"log":\n');
|
||||
Shell.PerfLog.get_default().dump_log(out);
|
||||
|
||||
Shell.write_string_to_stream (out, '\n}\n');
|
||||
out.close(null);
|
||||
} else {
|
||||
let metrics = [];
|
||||
for (let metric in scriptModule.METRICS)
|
||||
metrics.push(metric);
|
||||
|
||||
metrics.sort();
|
||||
|
||||
print ('------------------------------------------------------------');
|
||||
for (let i = 0; i < metrics.length; i++) {
|
||||
let metric = metrics[i];
|
||||
print ('# ' + scriptModule.METRIC_DESCRIPTIONS[metric]);
|
||||
print (metric + ': ' + scriptModule.METRICS[metric]);
|
||||
}
|
||||
print ('------------------------------------------------------------');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* runPerfScript
|
||||
* @scriptModule: module object with run and finish functions
|
||||
* and event handlers
|
||||
*
|
||||
* Runs a script for automated collection of performance data. The
|
||||
* script is defined as a Javascript module with specified contents.
|
||||
*
|
||||
* First the run() function within the module will be called as a
|
||||
* generator to automate a series of actions. These actions will
|
||||
* trigger performance events and the script can also record its
|
||||
* own performance events.
|
||||
*
|
||||
* Then the recorded event log is replayed using handler functions
|
||||
* within the module. The handler for the event 'foo.bar' is called
|
||||
* foo_bar().
|
||||
*
|
||||
* Finally if the module has a function called finish(), that will
|
||||
* be called.
|
||||
*
|
||||
* The event handler and finish functions are expected to fill in
|
||||
* metrics to an object within the module called METRICS. Each
|
||||
* property of this object represents an individual metric. The
|
||||
* name of the property is the name of the metric, the value
|
||||
* of the property is an object with the following properties:
|
||||
*
|
||||
* description: human readable description of the metric
|
||||
* units: a string representing the units of the metric. It has
|
||||
* the form '<unit> <unit> ... / <unit> / <unit> ...'. Certain
|
||||
* unit values are recognized: s, ms, us, B, KiB, MiB. Other
|
||||
* values can appear but are uninterpreted. Examples 's',
|
||||
* '/ s', 'frames', 'frames / s', 'MiB / s / frame'
|
||||
* value: computed value of the metric
|
||||
*
|
||||
* The resulting metrics will be written to @outputFile as JSON, or,
|
||||
* if @outputFile is not provided, logged.
|
||||
*
|
||||
* After running the script and collecting statistics from the
|
||||
* event log, GNOME Shell will exit.
|
||||
**/
|
||||
function runPerfScript(scriptModule, outputFile) {
|
||||
Shell.PerfLog.get_default().set_enabled(true);
|
||||
|
||||
let g = scriptModule.run();
|
||||
|
||||
_step(g,
|
||||
function() {
|
||||
_collect(scriptModule, outputFile);
|
||||
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||
},
|
||||
function(err) {
|
||||
log("Script failed: " + err + "\n" + err.stack);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
});
|
||||
}
|
@ -40,7 +40,7 @@ SearchResultDisplay.prototype = {
|
||||
* The terms are useful for search match highlighting.
|
||||
*/
|
||||
renderResults: function(results, terms) {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -67,7 +67,7 @@ SearchResultDisplay.prototype = {
|
||||
* Returns: The number of actors visible.
|
||||
*/
|
||||
getVisibleResultCount: function() {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -79,7 +79,14 @@ SearchResultDisplay.prototype = {
|
||||
* available.
|
||||
*/
|
||||
selectIndex: function() {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
* Activate the currently selected search result.
|
||||
*/
|
||||
activateSelected: function() {
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
};
|
||||
|
||||
@ -120,7 +127,7 @@ SearchProvider.prototype = {
|
||||
* or network queries.
|
||||
*/
|
||||
getInitialResultSet: function(terms) {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -137,7 +144,7 @@ SearchProvider.prototype = {
|
||||
* result set, rather than possibly performing a full re-query.
|
||||
*/
|
||||
getSubsearchResultSet: function(previousResults, newTerms) {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -148,7 +155,7 @@ SearchProvider.prototype = {
|
||||
* properties which describe the given search result.
|
||||
*/
|
||||
getResultMeta: function(id) {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -187,7 +194,7 @@ SearchProvider.prototype = {
|
||||
* Called when the user chooses a given result.
|
||||
*/
|
||||
activateResult: function(id) {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -198,9 +205,9 @@ SearchProvider.prototype = {
|
||||
* displaying search results for that item type.
|
||||
*/
|
||||
expandSearch: function(terms) {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(SearchProvider.prototype);
|
||||
|
||||
function SearchSystem() {
|
||||
@ -231,7 +238,7 @@ SearchSystem.prototype = {
|
||||
},
|
||||
|
||||
updateSearch: function(searchString) {
|
||||
searchString = searchString.replace(/^\s+/g, "").replace(/\s+$/g, "");
|
||||
searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, '');
|
||||
if (searchString == '')
|
||||
return null;
|
||||
|
||||
@ -268,5 +275,5 @@ SearchSystem.prototype = {
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(SearchSystem.prototype);
|
||||
|
@ -8,16 +8,16 @@ const Mainloop = imports.mainloop;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const GnomeShellIface = {
|
||||
name: "org.gnome.Shell",
|
||||
methods: [{ name: "Eval",
|
||||
inSignature: "s",
|
||||
outSignature: "bs"
|
||||
name: 'org.gnome.Shell',
|
||||
methods: [{ name: 'Eval',
|
||||
inSignature: 's',
|
||||
outSignature: 'bs'
|
||||
}
|
||||
],
|
||||
signals: [],
|
||||
properties: [{ name: "OverviewActive",
|
||||
signature: "b",
|
||||
access: "readwrite" }]
|
||||
properties: [{ name: 'OverviewActive',
|
||||
signature: 'b',
|
||||
access: 'readwrite' }]
|
||||
};
|
||||
|
||||
function GnomeShell() {
|
||||
@ -50,7 +50,7 @@ GnomeShell.prototype = {
|
||||
returnValue = JSON.stringify(eval(code));
|
||||
// A hack; DBus doesn't have null/undefined
|
||||
if (returnValue == undefined)
|
||||
returnValue = "";
|
||||
returnValue = '';
|
||||
success = true;
|
||||
} catch (e) {
|
||||
returnValue = JSON.stringify(e);
|
||||
|
186
js/ui/sidebar.js
@ -1,186 +0,0 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Panel = imports.ui.panel;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Widget = imports.ui.widget;
|
||||
const WidgetBox = imports.ui.widgetBox;
|
||||
|
||||
const SIDEBAR_SPACING = 4;
|
||||
const SIDEBAR_PADDING = 4;
|
||||
|
||||
// The total sidebar width is the widget width plus the widget padding
|
||||
// (counted twice for the widget box, and once again for the
|
||||
// out-of-screen padding), plus the empty space between the border of
|
||||
// the bar and of the windows
|
||||
const SIDEBAR_COLLAPSED_WIDTH = Widget.COLLAPSED_WIDTH + 3 * WidgetBox.WIDGETBOX_PADDING + SIDEBAR_PADDING;
|
||||
const SIDEBAR_EXPANDED_WIDTH = Widget.EXPANDED_WIDTH + 3 * WidgetBox.WIDGETBOX_PADDING + SIDEBAR_PADDING;
|
||||
|
||||
function Sidebar() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
Sidebar.prototype = {
|
||||
_init : function() {
|
||||
// The top-left corner of the sidebar is fixed at:
|
||||
// x = -WidgetBox.WIDGETBOX_PADDING, y = Panel.PANEL_HEIGHT.
|
||||
// (The negative X is so that we don't see the rounded
|
||||
// WidgetBox corners on the screen edge side.)
|
||||
this.actor = new Clutter.Group({ x: -WidgetBox.WIDGETBOX_PADDING,
|
||||
y: Panel.PANEL_HEIGHT,
|
||||
width: SIDEBAR_EXPANDED_WIDTH });
|
||||
|
||||
// The actual widgets go into a Big.Box inside this.actor. The
|
||||
// box's width will vary during the expand/collapse animations,
|
||||
// but this.actor's width will remain constant until we adjust
|
||||
// it at the end of the animation, because we don't want the
|
||||
// wm strut to move and cause windows to move multiple times
|
||||
// during the animation.
|
||||
this.box = new Big.Box ({ padding_top: SIDEBAR_PADDING,
|
||||
padding_bottom: SIDEBAR_PADDING,
|
||||
padding_right: 0,
|
||||
padding_left: 0,
|
||||
spacing: SIDEBAR_SPACING });
|
||||
this.actor.add_actor(this.box);
|
||||
|
||||
this._gconf = Shell.GConf.get_default();
|
||||
|
||||
this._expanded = this._gconf.get_boolean ("sidebar/expanded");
|
||||
if (!this._expanded)
|
||||
this.actor.width = SIDEBAR_COLLAPSED_WIDTH;
|
||||
|
||||
this._visible = this._gconf.get_boolean ("sidebar/visible");
|
||||
if (this._visible)
|
||||
Main.chrome.addActor(this.actor);
|
||||
|
||||
this._widgets = [];
|
||||
this.addWidget(new ToggleWidget());
|
||||
|
||||
let default_widgets = this._gconf.get_string_list("sidebar/widgets");
|
||||
for (let i = 0; i < default_widgets.length; i++)
|
||||
this.addWidget(default_widgets[i]);
|
||||
|
||||
this._gconf.connect('changed::sidebar/expanded',
|
||||
Lang.bind(this, this._expandedChanged));
|
||||
this._gconf.connect('changed::sidebar/visible',
|
||||
Lang.bind(this, this._visibleChanged));
|
||||
|
||||
this._adjustPosition();
|
||||
},
|
||||
|
||||
addWidget: function(widget) {
|
||||
let widgetBox;
|
||||
try {
|
||||
widgetBox = new WidgetBox.WidgetBox(widget, this._expanded);
|
||||
} catch(e) {
|
||||
logError(e, "Failed to add widget '" + widget + "'");
|
||||
return;
|
||||
}
|
||||
|
||||
this.box.append(widgetBox.actor, Big.BoxPackFlags.NONE);
|
||||
this._widgets.push(widgetBox);
|
||||
this._adjustPosition();
|
||||
},
|
||||
|
||||
_adjustPosition: function() {
|
||||
let primary=global.get_primary_monitor();
|
||||
|
||||
this.actor.y = Math.max(primary.y + Panel.PANEL_HEIGHT,primary.height/2 - this.actor.height/2);
|
||||
this.actor.x = primary.x;
|
||||
},
|
||||
|
||||
_visibleChanged: function() {
|
||||
let visible = this._gconf.get_boolean("sidebar/visible");
|
||||
if (visible == this._visible)
|
||||
return;
|
||||
|
||||
this._visible = visible;
|
||||
if (visible)
|
||||
Main.chrome.addActor(this.actor);
|
||||
else
|
||||
Main.chrome.removeActor(this.actor);
|
||||
},
|
||||
|
||||
_expandedChanged: function() {
|
||||
let expanded = this._gconf.get_boolean("sidebar/expanded");
|
||||
if (expanded == this._expanded)
|
||||
return;
|
||||
|
||||
this._expanded = expanded;
|
||||
if (expanded)
|
||||
this._expand();
|
||||
else
|
||||
this._collapse();
|
||||
},
|
||||
|
||||
_expand: function() {
|
||||
this._expanded = true;
|
||||
for (let i = 0; i < this._widgets.length; i++)
|
||||
this._widgets[i].expand();
|
||||
|
||||
// Updated the strut/stage area after the animation completes
|
||||
Tweener.addTween(this, { time: WidgetBox.ANIMATION_TIME,
|
||||
onComplete: function () {
|
||||
this.actor.width = SIDEBAR_EXPANDED_WIDTH;
|
||||
} });
|
||||
},
|
||||
|
||||
_collapse: function() {
|
||||
this._expanded = false;
|
||||
for (let i = 0; i < this._widgets.length; i++)
|
||||
this._widgets[i].collapse();
|
||||
|
||||
// Updated the strut/stage area after the animation completes
|
||||
Tweener.addTween(this, { time: WidgetBox.ANIMATION_TIME,
|
||||
onComplete: function () {
|
||||
this.actor.width = SIDEBAR_COLLAPSED_WIDTH;
|
||||
} });
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
this.hide();
|
||||
|
||||
for (let i = 0; i < this._widgets.length; i++)
|
||||
this._widgets[i].destroy();
|
||||
this.actor.destroy();
|
||||
}
|
||||
};
|
||||
|
||||
const LEFT_DOUBLE_ARROW = "\u00AB";
|
||||
const RIGHT_DOUBLE_ARROW = "\u00BB";
|
||||
|
||||
function ToggleWidget() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
ToggleWidget.prototype = {
|
||||
__proto__ : Widget.Widget.prototype,
|
||||
|
||||
_init : function() {
|
||||
this._gconf = Shell.GConf.get_default();
|
||||
|
||||
this.actor = new Clutter.Text({ font_name: "Sans Bold 16px",
|
||||
text: LEFT_DOUBLE_ARROW,
|
||||
reactive: true });
|
||||
this.actor.connect('button-release-event',
|
||||
Lang.bind(this, this._collapse));
|
||||
this.collapsedActor = new Clutter.Text({ font_name: "Sans Bold 16px",
|
||||
text: RIGHT_DOUBLE_ARROW,
|
||||
reactive: true });
|
||||
this.collapsedActor.connect('button-release-event',
|
||||
Lang.bind(this, this._expand));
|
||||
},
|
||||
|
||||
_collapse : function () {
|
||||
this._gconf.set_boolean ("sidebar/expanded", false);
|
||||
},
|
||||
|
||||
_expand : function () {
|
||||
this._gconf.set_boolean ("sidebar/expanded", true);
|
||||
}
|
||||
};
|
@ -1,16 +1,14 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const DBus = imports.dbus;
|
||||
const Gdm = imports.gi.Gdm;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const GnomeSession = imports.misc.gnomeSession;
|
||||
const Panel = imports.ui.panel;
|
||||
|
||||
// Adapted from gdm/gui/user-switch-applet/applet.c
|
||||
@ -18,25 +16,28 @@ const Panel = imports.ui.panel;
|
||||
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
|
||||
// Copyright (C) 2008,2009 Red Hat, Inc.
|
||||
|
||||
const SIDEBAR_VISIBLE_KEY = 'sidebar/visible';
|
||||
|
||||
function StatusMenu() {
|
||||
function StatusMenuButton() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
StatusMenu.prototype = {
|
||||
StatusMenuButton.prototype = {
|
||||
__proto__: Panel.PanelMenuButton.prototype,
|
||||
|
||||
_init: function() {
|
||||
Panel.PanelMenuButton.prototype._init.call(this, St.Align.START);
|
||||
let box = new St.BoxLayout({ name: 'panelStatusMenu' });
|
||||
this.actor.set_child(box);
|
||||
|
||||
this._gdm = Gdm.UserManager.ref_default();
|
||||
this._user = this._gdm.get_user(GLib.get_user_name());
|
||||
this._presence = new GnomeSessionPresence();
|
||||
this._presence = new GnomeSession.Presence();
|
||||
|
||||
this.actor = new St.BoxLayout({ name: 'StatusMenu' });
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._iconBox = new St.Bin();
|
||||
this.actor.add(this._iconBox, { y_align: St.Align.MIDDLE });
|
||||
box.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
|
||||
|
||||
let textureCache = Shell.TextureCache.get_default();
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
// FIXME: these icons are all wrong (likewise in createSubMenu)
|
||||
this._availableIcon = textureCache.load_icon_name('gtk-yes', 16);
|
||||
this._busyIcon = textureCache.load_icon_name('gtk-no', 16);
|
||||
@ -47,7 +48,7 @@ StatusMenu.prototype = {
|
||||
this._presence.getStatus(Lang.bind(this, this._updatePresenceIcon));
|
||||
|
||||
this._name = new St.Label({ text: this._user.get_real_name() });
|
||||
this.actor.add(this._name, { expand: true, y_align: St.Align.MIDDLE });
|
||||
box.add(this._name, { y_align: St.Align.MIDDLE, y_fill: false });
|
||||
this._userNameChangedId = this._user.connect('notify::display-name', Lang.bind(this, this._updateUserName));
|
||||
|
||||
this._createSubMenu();
|
||||
@ -67,110 +68,70 @@ StatusMenu.prototype = {
|
||||
_updateSwitchUser: function() {
|
||||
let users = this._gdm.list_users();
|
||||
if (users.length > 1)
|
||||
this._loginScreenItem.show();
|
||||
this._loginScreenItem.actor.show();
|
||||
else
|
||||
this._loginScreenItem.hide();
|
||||
this._loginScreenItem.actor.hide();
|
||||
},
|
||||
|
||||
_updatePresenceIcon: function(presence, status) {
|
||||
if (status == GnomeSessionPresenceStatus.AVAILABLE)
|
||||
if (status == GnomeSession.PresenceStatus.AVAILABLE)
|
||||
this._iconBox.child = this._availableIcon;
|
||||
else if (status == GnomeSessionPresenceStatus.BUSY)
|
||||
else if (status == GnomeSession.PresenceStatus.BUSY)
|
||||
this._iconBox.child = this._busyIcon;
|
||||
else if (status == GnomeSessionPresenceStatus.INVISIBLE)
|
||||
else if (status == GnomeSession.PresenceStatus.INVISIBLE)
|
||||
this._iconBox.child = this._invisibleIcon;
|
||||
else
|
||||
this._iconBox.child = this._idleIcon;
|
||||
},
|
||||
|
||||
// The menu
|
||||
|
||||
_createImageMenuItem: function(label, iconName, forceIcon) {
|
||||
let image = new Gtk.Image();
|
||||
let item = new Gtk.ImageMenuItem({ label: label,
|
||||
image: image,
|
||||
always_show_image: forceIcon == true });
|
||||
item.connect('style-set', Lang.bind(this,
|
||||
function() {
|
||||
image.set_from_icon_name(iconName, Gtk.IconSize.MENU);
|
||||
}));
|
||||
|
||||
return item;
|
||||
},
|
||||
|
||||
_createSubMenu: function() {
|
||||
this._menu = new Gtk.Menu();
|
||||
this._menu.connect('deactivate', Lang.bind(this, function() { this.emit('deactivated'); }));
|
||||
|
||||
let item;
|
||||
|
||||
item = this._createImageMenuItem(_('Available'), 'gtk-yes', true);
|
||||
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSessionPresenceStatus.AVAILABLE));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
item = new Panel.PanelImageMenuItem(_("Available"), 'gtk-yes', true);
|
||||
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSession.PresenceStatus.AVAILABLE));
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_('Busy'), 'gtk-no', true);
|
||||
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSessionPresenceStatus.BUSY));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
item = new Panel.PanelImageMenuItem(_("Busy"), 'gtk-no', true);
|
||||
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSession.PresenceStatus.BUSY));
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_('Invisible'), 'gtk-close', true);
|
||||
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSessionPresenceStatus.INVISIBLE));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
item = new Panel.PanelImageMenuItem(_("Invisible"), 'gtk-close', true);
|
||||
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSession.PresenceStatus.INVISIBLE));
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = new Gtk.SeparatorMenuItem();
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
item = new Panel.PanelSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_('Account Information...'), 'user-info');
|
||||
item = new Panel.PanelImageMenuItem(_("Account Information..."), 'user-info');
|
||||
item.connect('activate', Lang.bind(this, this._onAccountInformationActivate));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
let gconf = Shell.GConf.get_default();
|
||||
item = new Gtk.CheckMenuItem({ label: _('Sidebar'),
|
||||
active: gconf.get_boolean(SIDEBAR_VISIBLE_KEY) });
|
||||
item.connect('activate', Lang.bind(this,
|
||||
function() {
|
||||
gconf.set_boolean(SIDEBAR_VISIBLE_KEY, this._sidebarItem.active);
|
||||
}));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
this._sidebarItem = item;
|
||||
|
||||
item = this._createImageMenuItem(_('System Preferences...'), 'preferences-desktop');
|
||||
item = new Panel.PanelImageMenuItem(_("System Preferences..."), 'preferences-desktop');
|
||||
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = new Gtk.SeparatorMenuItem();
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
item = new Panel.PanelSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_('Lock Screen'), 'system-lock-screen');
|
||||
item = new Panel.PanelImageMenuItem(_("Lock Screen"), 'system-lock-screen');
|
||||
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_('Switch User'), 'system-users');
|
||||
item = new Panel.PanelImageMenuItem(_("Switch User"), 'system-users');
|
||||
item.connect('activate', Lang.bind(this, this._onLoginScreenActivate));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
this.menu.addMenuItem(item);
|
||||
this._loginScreenItem = item;
|
||||
|
||||
item = this._createImageMenuItem(_('Log Out...'), 'system-log-out');
|
||||
item = new Panel.PanelImageMenuItem(_("Log Out..."), 'system-log-out');
|
||||
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_('Shut Down...'), 'system-shutdown');
|
||||
item = new Panel.PanelImageMenuItem(_("Shut Down..."), 'system-shutdown');
|
||||
item.connect('activate', Lang.bind(this, this._onShutDownActivate));
|
||||
this._menu.append(item);
|
||||
item.show();
|
||||
this.menu.addMenuItem(item);
|
||||
},
|
||||
|
||||
_setPresenceStatus: function(item, status) {
|
||||
_setPresenceStatus: function(item, event, status) {
|
||||
this._presence.setStatus(status);
|
||||
},
|
||||
|
||||
@ -205,93 +166,5 @@ StatusMenu.prototype = {
|
||||
// on failure
|
||||
let p = new Shell.Process({'args' : args});
|
||||
p.run();
|
||||
},
|
||||
|
||||
// shell_status_menu_toggle:
|
||||
// @event: event causing the toggle
|
||||
//
|
||||
// If the menu is not currently up, pops it up. Otherwise, hides it.
|
||||
// Popping up may fail if another grab is already active; check with
|
||||
// isActive().
|
||||
toggle: function(event) {
|
||||
if (this._menu.visible)
|
||||
this._menu.popdown();
|
||||
else {
|
||||
// We don't want to overgrab a Mutter grab with the grab
|
||||
// that GTK+ uses on menus.
|
||||
if (global.display_is_grabbed())
|
||||
return;
|
||||
|
||||
let [menuWidth, menuHeight] = this._menu.get_size_request ();
|
||||
|
||||
let panel;
|
||||
for (panel = this.actor; panel; panel = panel.get_parent()) {
|
||||
if (panel._delegate instanceof Panel.Panel)
|
||||
break;
|
||||
}
|
||||
|
||||
let [panelX, panelY] = panel.get_transformed_position();
|
||||
let [panelWidth, panelHeight] = panel.get_transformed_size();
|
||||
|
||||
let menuX = Math.round(panelX + panelWidth - menuWidth);
|
||||
let menuY = Math.round(panelY + panelHeight);
|
||||
|
||||
Shell.popup_menu(this._menu, event.get_button(), event.get_time(),
|
||||
menuX, menuY);
|
||||
}
|
||||
},
|
||||
|
||||
// isActive:
|
||||
//
|
||||
// Gets whether the menu is currently popped up
|
||||
//
|
||||
// Return value: %true if the menu is currently popped up
|
||||
isActive: function() {
|
||||
return this._menu.visible;
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(StatusMenu.prototype);
|
||||
|
||||
|
||||
const GnomeSessionPresenceIface = {
|
||||
name: 'org.gnome.SessionManager.Presence',
|
||||
methods: [{ name: 'SetStatus',
|
||||
inSignature: 'u' }],
|
||||
properties: [{ name: 'status',
|
||||
signature: 'u',
|
||||
access: 'readwrite' }],
|
||||
signals: [{ name: 'StatusChanged',
|
||||
inSignature: 'u' }]
|
||||
};
|
||||
|
||||
const GnomeSessionPresenceStatus = {
|
||||
AVAILABLE: 0,
|
||||
INVISIBLE: 1,
|
||||
BUSY: 2,
|
||||
IDLE: 3
|
||||
};
|
||||
|
||||
function GnomeSessionPresence() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
GnomeSessionPresence.prototype = {
|
||||
_init: function() {
|
||||
DBus.session.proxifyObject(this, 'org.gnome.SessionManager', '/org/gnome/SessionManager/Presence', this);
|
||||
this.connect('StatusChanged', Lang.bind(this, function (proxy, status) { this.status = status; }));
|
||||
},
|
||||
|
||||
getStatus: function(callback) {
|
||||
this.GetRemote('status', Lang.bind(this,
|
||||
function(status, ex) {
|
||||
if (!ex)
|
||||
callback(this, status);
|
||||
}));
|
||||
},
|
||||
|
||||
setStatus: function(status) {
|
||||
this.SetStatusRemote(status);
|
||||
}
|
||||
};
|
||||
DBus.proxifyPrototype(GnomeSessionPresence.prototype, GnomeSessionPresenceIface);
|
||||
|
||||
|
686
js/ui/telepathyClient.js
Normal file
@ -0,0 +1,686 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const DBus = imports.dbus;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const Telepathy = imports.misc.telepathy;
|
||||
|
||||
let contactManager;
|
||||
let channelDispatcher;
|
||||
|
||||
// See Notification.appendMessage
|
||||
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
||||
const SCROLLBACK_RECENT_LENGTH = 20;
|
||||
const SCROLLBACK_IDLE_LENGTH = 5;
|
||||
|
||||
// A 'Qualified_Property_Value_Map' that represents a single-user
|
||||
// text-based chat.
|
||||
let singleUserTextChannel = {};
|
||||
singleUserTextChannel[Telepathy.CHANNEL_NAME + '.ChannelType'] = Telepathy.CHANNEL_TEXT_NAME;
|
||||
singleUserTextChannel[Telepathy.CHANNEL_NAME + '.TargetHandleType'] = Telepathy.HandleType.CONTACT;
|
||||
|
||||
// Some protocols only support 'multi-user' chats, and single-user
|
||||
// chats are just treated as multi-user chats with only one other
|
||||
// participant. Telepathy uses HandleType.NONE for all chats in these
|
||||
// protocols; there's no good way for us to tell if the channel is
|
||||
// single- or multi-user.
|
||||
let oneOrMoreUserTextChannel = {};
|
||||
oneOrMoreUserTextChannel[Telepathy.CHANNEL_NAME + '.ChannelType'] = Telepathy.CHANNEL_TEXT_NAME;
|
||||
oneOrMoreUserTextChannel[Telepathy.CHANNEL_NAME + '.TargetHandleType'] = Telepathy.HandleType.NONE;
|
||||
|
||||
// The (non-chat) channel indicating the users whose presence
|
||||
// information we subscribe to
|
||||
let subscribedContactsChannel = {};
|
||||
subscribedContactsChannel[Telepathy.CHANNEL_NAME + '.ChannelType'] = Telepathy.CHANNEL_CONTACT_LIST_NAME;
|
||||
subscribedContactsChannel[Telepathy.CHANNEL_NAME + '.TargetHandleType'] = Telepathy.HandleType.LIST;
|
||||
subscribedContactsChannel[Telepathy.CHANNEL_NAME + '.TargetID'] = 'subscribe';
|
||||
|
||||
|
||||
// This is GNOME Shell's implementation of the Telepathy 'Client'
|
||||
// interface. Specifically, the shell is a Telepathy 'Observer', which
|
||||
// lets us see messages even if they belong to another app (eg,
|
||||
// Empathy).
|
||||
|
||||
function Client() {
|
||||
this._init();
|
||||
};
|
||||
|
||||
Client.prototype = {
|
||||
_init : function() {
|
||||
let name = Telepathy.CLIENT_NAME + '.GnomeShell';
|
||||
DBus.session.exportObject(Telepathy.nameToPath(name), this);
|
||||
DBus.session.acquire_name(name, DBus.SINGLE_INSTANCE,
|
||||
function (name) { /* FIXME: acquired */ },
|
||||
function (name) { /* FIXME: lost */ });
|
||||
|
||||
this._accounts = {};
|
||||
this._sources = {};
|
||||
|
||||
contactManager = new ContactManager();
|
||||
contactManager.connect('presence-changed', Lang.bind(this, this._presenceChanged));
|
||||
|
||||
channelDispatcher = new Telepathy.ChannelDispatcher(DBus.session,
|
||||
Telepathy.CHANNEL_DISPATCHER_NAME,
|
||||
Telepathy.nameToPath(Telepathy.CHANNEL_DISPATCHER_NAME));
|
||||
|
||||
// Acquire existing connections. (Needed to make things work
|
||||
// through a restart.)
|
||||
let accountManager = new Telepathy.AccountManager(DBus.session,
|
||||
Telepathy.ACCOUNT_MANAGER_NAME,
|
||||
Telepathy.nameToPath(Telepathy.ACCOUNT_MANAGER_NAME));
|
||||
accountManager.GetRemote('ValidAccounts', Lang.bind(this,
|
||||
function (accounts, err) {
|
||||
if (!accounts)
|
||||
return;
|
||||
|
||||
for (let i = 0; i < accounts.length; i++)
|
||||
this._gotAccount(accounts[i]);
|
||||
}));
|
||||
accountManager.connect('AccountValidityChanged', Lang.bind(this, this._accountValidityChanged));
|
||||
},
|
||||
|
||||
_accountValidityChanged: function(accountManager, accountPath, valid) {
|
||||
if (!valid) {
|
||||
delete this._accounts[accountPath];
|
||||
// We don't need to clean up connections, sources, etc; they'll
|
||||
// get Closed and cleaned up independently.
|
||||
} else
|
||||
this._gotAccount(accountPath);
|
||||
},
|
||||
|
||||
_gotAccount: function(accountPath) {
|
||||
let account = new Telepathy.Account(DBus.session,
|
||||
Telepathy.ACCOUNT_MANAGER_NAME,
|
||||
accountPath);
|
||||
this._accounts[accountPath] = account;
|
||||
account.GetRemote('Connection', Lang.bind(this,
|
||||
function (connPath, err) {
|
||||
if (!connPath || connPath == '/')
|
||||
return;
|
||||
|
||||
let connReq = new Telepathy.ConnectionRequests(DBus.session,
|
||||
Telepathy.pathToName(connPath),
|
||||
connPath);
|
||||
connReq.GetRemote('Channels', Lang.bind(this,
|
||||
function(channels, err) {
|
||||
if (!channels)
|
||||
return;
|
||||
|
||||
this._addChannels(accountPath, connPath, channels);
|
||||
}));
|
||||
|
||||
contactManager.addConnection(connPath);
|
||||
}));
|
||||
},
|
||||
|
||||
get Interfaces() {
|
||||
return [ Telepathy.CLIENT_OBSERVER_NAME ];
|
||||
},
|
||||
|
||||
get ObserverChannelFilter() {
|
||||
return [ singleUserTextChannel, oneOrMoreUserTextChannel ];
|
||||
},
|
||||
|
||||
ObserveChannels: function(accountPath, connPath, channels,
|
||||
dispatchOperation, requestsSatisfied,
|
||||
observerInfo) {
|
||||
this._addChannels(accountPath, connPath, channels);
|
||||
},
|
||||
|
||||
_addChannels: function(accountPath, connPath, channelDetailsList) {
|
||||
for (let i = 0; i < channelDetailsList.length; i++) {
|
||||
let [channelPath, props] = channelDetailsList[i];
|
||||
|
||||
// If this is being called from the startup code then it
|
||||
// won't have passed through our filters, so we need to
|
||||
// check the channel/targetHandle type ourselves.
|
||||
|
||||
let channelType = props[Telepathy.CHANNEL_NAME + '.ChannelType'];
|
||||
if (channelType != Telepathy.CHANNEL_TEXT_NAME)
|
||||
continue;
|
||||
|
||||
let targetHandleType = props[Telepathy.CHANNEL_NAME + '.TargetHandleType'];
|
||||
if (targetHandleType != Telepathy.HandleType.CONTACT &&
|
||||
targetHandleType != Telepathy.HandleType.NONE)
|
||||
continue;
|
||||
|
||||
let targetHandle = props[Telepathy.CHANNEL_NAME + '.TargetHandle'];
|
||||
let targetId = props[Telepathy.CHANNEL_NAME + '.TargetID'];
|
||||
|
||||
if (this._sources[connPath + ':' + targetHandle])
|
||||
continue;
|
||||
|
||||
let source = new Source(accountPath, connPath, channelPath,
|
||||
targetHandle, targetHandleType, targetId);
|
||||
this._sources[connPath + ':' + targetHandle] = source;
|
||||
source.connect('destroy', Lang.bind(this,
|
||||
function() {
|
||||
delete this._sources[connPath + ':' + targetHandle];
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
_presenceChanged: function(contactManager, connPath, handle,
|
||||
type, message) {
|
||||
let source = this._sources[connPath + ':' + handle];
|
||||
if (!source)
|
||||
return;
|
||||
|
||||
source.setPresence(type, message);
|
||||
}
|
||||
};
|
||||
DBus.conformExport(Client.prototype, Telepathy.ClientIface);
|
||||
DBus.conformExport(Client.prototype, Telepathy.ClientObserverIface);
|
||||
|
||||
|
||||
function ContactManager() {
|
||||
this._init();
|
||||
};
|
||||
|
||||
ContactManager.prototype = {
|
||||
_init: function() {
|
||||
this._connections = {};
|
||||
// Note that if we changed this to '/telepathy/avatars' then
|
||||
// we would share cache files with empathy. But since this is
|
||||
// not documented/guaranteed, it seems a little sketchy
|
||||
this._cacheDir = GLib.get_user_cache_dir() + '/gnome-shell/avatars';
|
||||
},
|
||||
|
||||
addConnection: function(connPath) {
|
||||
let info = this._connections[connPath];
|
||||
if (info)
|
||||
return info;
|
||||
|
||||
info = {};
|
||||
|
||||
// Figure out the cache subdirectory for this connection by
|
||||
// parsing the connection manager name (eg, 'gabble') and
|
||||
// protocol name (eg, 'jabber') from the Connection's path.
|
||||
// Telepathy requires the D-Bus path for a connection to have
|
||||
// a specific form, and explicitly says that clients are
|
||||
// allowed to parse it.
|
||||
let match = connPath.match(/\/org\/freedesktop\/Telepathy\/Connection\/([^\/]*\/[^\/]*)\/.*/);
|
||||
if (!match)
|
||||
throw new Error('Could not parse connection path ' + connPath);
|
||||
|
||||
info.cacheDir = this._cacheDir + '/' + match[1];
|
||||
GLib.mkdir_with_parents(info.cacheDir, 0700);
|
||||
|
||||
// info.names[handle] is @handle's real name
|
||||
// info.tokens[handle] is the token for @handle's avatar
|
||||
info.names = {};
|
||||
info.tokens = {};
|
||||
|
||||
// info.icons[handle] is an array of the icon actors currently
|
||||
// being displayed for @handle. These will be updated
|
||||
// automatically if @handle's avatar changes.
|
||||
info.icons = {};
|
||||
|
||||
let connName = Telepathy.pathToName(connPath);
|
||||
|
||||
info.connectionAvatars = new Telepathy.ConnectionAvatars(DBus.session, connName, connPath);
|
||||
info.updatedId = info.connectionAvatars.connect(
|
||||
'AvatarUpdated', Lang.bind(this, this._avatarUpdated));
|
||||
info.retrievedId = info.connectionAvatars.connect(
|
||||
'AvatarRetrieved', Lang.bind(this, this._avatarRetrieved));
|
||||
|
||||
info.connectionContacts = new Telepathy.ConnectionContacts(DBus.session, connName, connPath);
|
||||
|
||||
info.connectionPresence = new Telepathy.ConnectionSimplePresence(DBus.session, connName, connPath);
|
||||
info.presenceChangedId = info.connectionPresence.connect(
|
||||
'PresencesChanged', Lang.bind(this, this._presencesChanged));
|
||||
|
||||
let conn = new Telepathy.Connection(DBus.session, connName, connPath);
|
||||
info.statusChangedId = conn.connect('StatusChanged', Lang.bind(this,
|
||||
function (status, reason) {
|
||||
if (status == Telepathy.ConnectionStatus.DISCONNECTED)
|
||||
this._removeConnection(conn);
|
||||
}));
|
||||
|
||||
let connReq = new Telepathy.ConnectionRequests(DBus.session,
|
||||
connName, connPath);
|
||||
connReq.EnsureChannelRemote(subscribedContactsChannel, Lang.bind(this,
|
||||
function (result, err) {
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
let [mine, channelPath, props] = result;
|
||||
this._gotContactsChannel(connPath, channelPath, props);
|
||||
}));
|
||||
|
||||
this._connections[connPath] = info;
|
||||
return info;
|
||||
},
|
||||
|
||||
_gotContactsChannel: function(connPath, channelPath, props) {
|
||||
let info = this._connections[connPath];
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
info.contactsGroup = new Telepathy.ChannelGroup(DBus.session,
|
||||
Telepathy.pathToName(connPath),
|
||||
channelPath);
|
||||
info.contactsListChangedId =
|
||||
info.contactsGroup.connect('MembersChanged', Lang.bind(this, this._contactsListChanged, info));
|
||||
|
||||
info.contactsGroup.GetRemote('Members', Lang.bind(this,
|
||||
function(contacts, err) {
|
||||
if (!contacts)
|
||||
return;
|
||||
|
||||
info.connectionContacts.GetContactAttributesRemote(
|
||||
contacts, [Telepathy.CONNECTION_ALIASING_NAME], false,
|
||||
Lang.bind(this, this._gotContactAttributes, info));
|
||||
}));
|
||||
},
|
||||
|
||||
_contactsListChanged: function(group, message, added, removed,
|
||||
local_pending, remote_pending,
|
||||
actor, reason, info) {
|
||||
for (let i = 0; i < removed.length; i++)
|
||||
delete info.names[removed[i]];
|
||||
|
||||
info.connectionContacts.GetContactAttributesRemote(
|
||||
added, [Telepathy.CONNECTION_ALIASING_NAME], false,
|
||||
Lang.bind(this, this._gotContactAttributes, info));
|
||||
},
|
||||
|
||||
_gotContactAttributes: function(attrs, err, info) {
|
||||
if (!attrs)
|
||||
return;
|
||||
|
||||
for (let handle in attrs)
|
||||
info.names[handle] = attrs[handle][Telepathy.CONNECTION_ALIASING_NAME + '/alias'];
|
||||
},
|
||||
|
||||
_presencesChanged: function(conn, presences, err) {
|
||||
if (!presences)
|
||||
return;
|
||||
|
||||
let info = this._connections[conn.getPath()];
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
for (let handle in presences) {
|
||||
let [type, status, message] = presences[handle];
|
||||
this.emit('presence-changed', conn.getPath(), handle, type, message);
|
||||
}
|
||||
},
|
||||
|
||||
_removeConnection: function(conn) {
|
||||
let info = this._connections[conn.getPath()];
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
conn.disconnect(info.statusChangedId);
|
||||
info.connectionAvatars.disconnect(info.updatedId);
|
||||
info.connectionAvatars.disconnect(info.retrievedId);
|
||||
info.connectionPresence.disconnect(info.presenceChangedId);
|
||||
info.contactsGroup.disconnect(info.contactsListChangedId);
|
||||
|
||||
delete this._connections[conn.getPath()];
|
||||
},
|
||||
|
||||
_getFileForToken: function(info, token) {
|
||||
return info.cacheDir + '/' + Telepathy.escapeAsIdentifier(token);
|
||||
},
|
||||
|
||||
_setIcon: function(iconBox, info, handle) {
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
let token = info.tokens[handle];
|
||||
let file;
|
||||
|
||||
if (token) {
|
||||
file = this._getFileForToken(info, token);
|
||||
if (!GLib.file_test(file, GLib.FileTest.EXISTS))
|
||||
file = null;
|
||||
}
|
||||
|
||||
if (file) {
|
||||
let uri = GLib.filename_to_uri(file, null);
|
||||
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size);
|
||||
} else {
|
||||
iconBox.child = textureCache.load_icon_name('stock_person', iconBox._size);
|
||||
}
|
||||
},
|
||||
|
||||
_updateIcons: function(info, handle) {
|
||||
if (!info.icons[handle])
|
||||
return;
|
||||
|
||||
for (let i = 0; i < info.icons[handle].length; i++) {
|
||||
let iconBox = info.icons[handle][i];
|
||||
this._setIcon(iconBox, info, handle);
|
||||
}
|
||||
},
|
||||
|
||||
_avatarUpdated: function(conn, handle, token) {
|
||||
let info = this._connections[conn.getPath()];
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
if (info.tokens[handle] == token)
|
||||
return;
|
||||
|
||||
info.tokens[handle] = token;
|
||||
if (token != '') {
|
||||
let file = this._getFileForToken(info, token);
|
||||
if (!GLib.file_test(file, GLib.FileTest.EXISTS)) {
|
||||
info.connectionAvatars.RequestAvatarsRemote([handle]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
this._updateIcons(info, handle);
|
||||
},
|
||||
|
||||
_avatarRetrieved: function(conn, handle, token, avatarData, mimeType) {
|
||||
let info = this._connections[conn.getPath()];
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
let file = this._getFileForToken(info, token);
|
||||
let success = false;
|
||||
try {
|
||||
success = GLib.file_set_contents(file, avatarData, avatarData.length);
|
||||
} catch (e) {
|
||||
logError(e, 'Error caching avatar data');
|
||||
}
|
||||
|
||||
if (success)
|
||||
this._updateIcons(info, handle);
|
||||
},
|
||||
|
||||
createAvatar: function(conn, handle, size) {
|
||||
let iconBox = new St.Bin({ style_class: 'avatar-box' });
|
||||
iconBox._size = size;
|
||||
|
||||
let info = this._connections[conn.getPath()];
|
||||
if (!info)
|
||||
info = this.addConnection(conn.getPath());
|
||||
|
||||
if (!info.icons[handle])
|
||||
info.icons[handle] = [];
|
||||
info.icons[handle].push(iconBox);
|
||||
|
||||
iconBox.connect('destroy', Lang.bind(this,
|
||||
function() {
|
||||
let i = info.icons[handle].indexOf(iconBox);
|
||||
if (i != -1)
|
||||
info.icons[handle].splice(i, 1);
|
||||
}));
|
||||
|
||||
// If we already have the icon cached and know its token, this
|
||||
// will fill it in. Otherwise it will fill in the default
|
||||
// icon.
|
||||
this._setIcon(iconBox, info, handle);
|
||||
|
||||
// Asynchronously load the real avatar if we don't have it yet.
|
||||
if (info.tokens[handle] == null) {
|
||||
info.connectionAvatars.GetKnownAvatarTokensRemote([handle], Lang.bind(this,
|
||||
function (tokens, err) {
|
||||
let token = tokens && tokens[handle] ? tokens[handle] : '';
|
||||
this._avatarUpdated(conn, handle, token);
|
||||
}));
|
||||
}
|
||||
|
||||
return iconBox;
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(ContactManager.prototype);
|
||||
|
||||
|
||||
function Source(accountPath, connPath, channelPath, targetHandle, targetHandleType, targetId) {
|
||||
this._init(accountPath, connPath, channelPath, targetHandle, targetHandleType, targetId);
|
||||
}
|
||||
|
||||
Source.prototype = {
|
||||
__proto__: MessageTray.Source.prototype,
|
||||
|
||||
_init: function(accountPath, connPath, channelPath, targetHandle, targetHandleType, targetId) {
|
||||
MessageTray.Source.prototype._init.call(this, targetId);
|
||||
|
||||
this._accountPath = accountPath;
|
||||
|
||||
let connName = Telepathy.pathToName(connPath);
|
||||
this._conn = new Telepathy.Connection(DBus.session, connName, connPath);
|
||||
this._channel = new Telepathy.Channel(DBus.session, connName, channelPath);
|
||||
this._closedId = this._channel.connect('Closed', Lang.bind(this, this._channelClosed));
|
||||
|
||||
this._targetHandle = targetHandle;
|
||||
this._targetHandleType = targetHandleType;
|
||||
this._targetId = targetId;
|
||||
|
||||
this.name = this._targetId;
|
||||
if (targetHandleType == Telepathy.HandleType.CONTACT) {
|
||||
let aliasing = new Telepathy.ConnectionAliasing(DBus.session, connName, connPath);
|
||||
aliasing.RequestAliasesRemote([this._targetHandle], Lang.bind(this,
|
||||
function (aliases, err) {
|
||||
if (aliases && aliases.length)
|
||||
this.name = aliases[0];
|
||||
}));
|
||||
}
|
||||
|
||||
// Since we only create sources when receiving a message, this
|
||||
// is a plausible default
|
||||
this._presence = Telepathy.ConnectionPresenceType.AVAILABLE;
|
||||
|
||||
this._channelText = new Telepathy.ChannelText(DBus.session, connName, channelPath);
|
||||
this._receivedId = this._channelText.connect('Received', Lang.bind(this, this._messageReceived));
|
||||
|
||||
this._channelText.ListPendingMessagesRemote(false, Lang.bind(this, this._gotPendingMessages));
|
||||
},
|
||||
|
||||
createIcon: function(size) {
|
||||
return contactManager.createAvatar(this._conn, this._targetHandle, size);
|
||||
},
|
||||
|
||||
clicked: function() {
|
||||
channelDispatcher.EnsureChannelRemote(this._accountPath,
|
||||
{ 'org.freedesktop.Telepathy.Channel.ChannelType': Telepathy.CHANNEL_TEXT_NAME,
|
||||
'org.freedesktop.Telepathy.Channel.TargetHandle': this._targetHandle,
|
||||
'org.freedesktop.Telepathy.Channel.TargetHandleType': this._targetHandleType },
|
||||
global.get_current_time(),
|
||||
'',
|
||||
Lang.bind(this, this._gotChannelRequest));
|
||||
|
||||
MessageTray.Source.prototype.clicked.call(this);
|
||||
},
|
||||
|
||||
_gotChannelRequest: function (chanReqPath, ex) {
|
||||
if (ex) {
|
||||
log ('EnsureChannelRemote failed? ' + ex);
|
||||
return;
|
||||
}
|
||||
|
||||
let chanReq = new Telepathy.ChannelRequest(DBus.session, Telepathy.CHANNEL_DISPATCHER_NAME, chanReqPath);
|
||||
chanReq.ProceedRemote();
|
||||
},
|
||||
|
||||
_gotPendingMessages: function(msgs, err) {
|
||||
if (!msgs)
|
||||
return;
|
||||
|
||||
for (let i = 0; i < msgs.length; i++)
|
||||
this._messageReceived.apply(this, [this._channel].concat(msgs[i]));
|
||||
},
|
||||
|
||||
_channelClosed: function() {
|
||||
this._channel.disconnect(this._closedId);
|
||||
this._channelText.disconnect(this._receivedId);
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
_ensureNotification: function() {
|
||||
if (!Main.messageTray.contains(this))
|
||||
Main.messageTray.add(this);
|
||||
|
||||
if (!this._notification)
|
||||
this._notification = new Notification(this._targetId, this);
|
||||
},
|
||||
|
||||
_messageReceived: function(channel, id, timestamp, sender,
|
||||
type, flags, text) {
|
||||
this._ensureNotification();
|
||||
this._notification.appendMessage(text);
|
||||
this.notify(this._notification);
|
||||
},
|
||||
|
||||
respond: function(text) {
|
||||
this._channelText.SendRemote(Telepathy.ChannelTextMessageType.NORMAL, text);
|
||||
},
|
||||
|
||||
setPresence: function(presence, message) {
|
||||
let msg, notify;
|
||||
|
||||
if (presence == Telepathy.ConnectionPresenceType.AVAILABLE) {
|
||||
msg = _("%s is online.").format(this.name);
|
||||
notify = (this._presence == Telepathy.ConnectionPresenceType.OFFLINE);
|
||||
} else if (presence == Telepathy.ConnectionPresenceType.OFFLINE ||
|
||||
presence == Telepathy.ConnectionPresenceType.EXTENDED_AWAY) {
|
||||
presence = Telepathy.ConnectionPresenceType.OFFLINE;
|
||||
msg = _("%s is offline.").format(this.name);
|
||||
notify = (this._presence != Telepathy.ConnectionPresenceType.OFFLINE);
|
||||
} else if (presence == Telepathy.ConnectionPresenceType.AWAY) {
|
||||
msg = _("%s is away.").format(this.name);
|
||||
notify = false;
|
||||
} else if (presence == Telepathy.ConnectionPresenceType.BUSY) {
|
||||
msg = _("%s is busy.").format(this.name);
|
||||
notify = false;
|
||||
} else
|
||||
return;
|
||||
|
||||
this._presence = presence;
|
||||
|
||||
if (message)
|
||||
msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
|
||||
|
||||
this._ensureNotification();
|
||||
this._notification.appendMessage(msg, true);
|
||||
if (notify)
|
||||
this.notify(this._notification);
|
||||
}
|
||||
};
|
||||
|
||||
function Notification(id, source) {
|
||||
this._init(id, source);
|
||||
}
|
||||
|
||||
Notification.prototype = {
|
||||
__proto__: MessageTray.Notification.prototype,
|
||||
|
||||
_init: function(id, source) {
|
||||
MessageTray.Notification.prototype._init.call(this, id, source, source.name);
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||
|
||||
this._responseEntry = new St.Entry({ style_class: 'chat-response' });
|
||||
this._responseEntry.clutter_text.connect('key-focus-in', Lang.bind(this, this._onEntryFocused));
|
||||
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));
|
||||
this.setActionArea(this._responseEntry);
|
||||
|
||||
this._history = [];
|
||||
},
|
||||
|
||||
appendMessage: function(text, asTitle) {
|
||||
if (asTitle)
|
||||
this.update(text);
|
||||
else
|
||||
this.update(this.source.name, text);
|
||||
this._append(text, 'chat-received');
|
||||
},
|
||||
|
||||
_append: function(text, style) {
|
||||
let body = this.addBody(text);
|
||||
body.add_style_class_name(style);
|
||||
this.scrollTo(St.Side.BOTTOM);
|
||||
|
||||
let now = new Date().getTime() / 1000;
|
||||
this._history.unshift({ actor: body, time: now });
|
||||
|
||||
if (this._history.length > 1) {
|
||||
// Keep the scrollback from growing too long. If the most
|
||||
// recent message (before the one we just added) is within
|
||||
// SCROLLBACK_RECENT_TIME, we will keep
|
||||
// SCROLLBACK_RECENT_LENGTH previous messages. Otherwise
|
||||
// we'll keep SCROLLBACK_IDLE_LENGTH messages.
|
||||
|
||||
let lastMessageTime = this._history[1].time;
|
||||
let maxLength = (lastMessageTime < now - SCROLLBACK_RECENT_TIME) ?
|
||||
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
|
||||
if (this._history.length > maxLength) {
|
||||
let expired = this._history.splice(maxLength);
|
||||
for (let i = 0; i < expired.length; i++)
|
||||
expired[i].actor.destroy();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_onButtonPress: function(notification, event) {
|
||||
if (!this._active)
|
||||
return false;
|
||||
|
||||
let source = event.get_source ();
|
||||
while (source) {
|
||||
if (source == notification)
|
||||
return false;
|
||||
source = source.get_parent();
|
||||
}
|
||||
|
||||
// @source is outside @notification, which has to mean that
|
||||
// we have a pointer grab, and the user clicked outside the
|
||||
// notification, so we should deactivate.
|
||||
this._deactivate();
|
||||
return true;
|
||||
},
|
||||
|
||||
_onEntryFocused: function() {
|
||||
if (this._active)
|
||||
return;
|
||||
|
||||
if (!Main.pushModal(this.actor))
|
||||
return;
|
||||
Clutter.grab_pointer(this.actor);
|
||||
|
||||
this._active = true;
|
||||
Main.messageTray.lock();
|
||||
},
|
||||
|
||||
_onEntryActivated: function() {
|
||||
let text = this._responseEntry.get_text();
|
||||
if (text == '') {
|
||||
this._deactivate();
|
||||
return;
|
||||
}
|
||||
|
||||
this._responseEntry.set_text('');
|
||||
this._append(text, 'chat-sent');
|
||||
this.source.respond(text);
|
||||
},
|
||||
|
||||
_deactivate: function() {
|
||||
if (this._active) {
|
||||
Clutter.ungrab_pointer(this.actor);
|
||||
Main.popModal(this.actor);
|
||||
global.stage.set_key_focus(null);
|
||||
|
||||
// We have to do this after calling popModal(), because
|
||||
// that will return the keyboard focus to
|
||||
// this._responseEntry (because that's where it was when
|
||||
// pushModal() was called), which will cause
|
||||
// _onEntryFocused() to be called again, but we don't want
|
||||
// it to do anything.
|
||||
this._active = false;
|
||||
|
||||
Main.messageTray.unlock();
|
||||
}
|
||||
}
|
||||
};
|
@ -46,7 +46,7 @@ let slowDownFactor = 1.0;
|
||||
|
||||
// Called from Main.start
|
||||
function init() {
|
||||
let slowdownEnv = GLib.getenv("GNOME_SHELL_SLOWDOWN_FACTOR");
|
||||
let slowdownEnv = GLib.getenv('GNOME_SHELL_SLOWDOWN_FACTOR');
|
||||
if (slowdownEnv) {
|
||||
let factor = parseFloat(slowdownEnv);
|
||||
if (!isNaN(factor) && factor > 0.0)
|
||||
@ -178,7 +178,7 @@ function resumeTweens() {
|
||||
function registerSpecialProperty(name, getFunction, setFunction,
|
||||
parameters, preProcessFunction) {
|
||||
Tweener.registerSpecialProperty(name, getFunction, setFunction,
|
||||
parameters, preProcessFunction);
|
||||
parameters, preProcessFunction);
|
||||
}
|
||||
|
||||
function registerSpecialPropertyModifier(name, modifyFunction, getFunction) {
|
||||
@ -190,7 +190,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
|
||||
}
|
||||
|
||||
|
||||
// The "FrameTicker" object is an object used to feed new frames to
|
||||
// The 'FrameTicker' object is an object used to feed new frames to
|
||||
// Tweener so it can update values and redraw. The default frame
|
||||
// ticker for Tweener just uses a simple timeout at a fixed frame rate
|
||||
// and has no idea of "catching up" by dropping frames.
|
||||
@ -243,12 +243,14 @@ ClutterFrameTicker.prototype = {
|
||||
|
||||
start : function() {
|
||||
this._timeline.start();
|
||||
global.begin_work();
|
||||
},
|
||||
|
||||
stop : function() {
|
||||
this._timeline.stop();
|
||||
this._startTime = -1;
|
||||
this._currentTime = -1;
|
||||
global.end_work();
|
||||
}
|
||||
};
|
||||
|
||||
|
364
js/ui/widget.js
@ -1,364 +0,0 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Lang = imports.lang;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const AppFavorites = imports.ui.appFavorites;
|
||||
const DocInfo = imports.misc.docInfo;
|
||||
|
||||
const COLLAPSED_WIDTH = 24;
|
||||
const EXPANDED_WIDTH = 200;
|
||||
|
||||
const STATE_EXPANDED = 0;
|
||||
const STATE_COLLAPSING = 1;
|
||||
const STATE_COLLAPSED = 2;
|
||||
const STATE_EXPANDING = 3;
|
||||
const STATE_POPPING_OUT = 4;
|
||||
const STATE_POPPED_OUT = 5;
|
||||
const STATE_POPPING_IN = 6;
|
||||
|
||||
function Widget() {
|
||||
}
|
||||
|
||||
Widget.prototype = {
|
||||
// _init():
|
||||
//
|
||||
// Your widget constructor. Your constructor function should look
|
||||
// like:
|
||||
//
|
||||
// function MyWidgetType() {
|
||||
// this._init.apply(this, arguments);
|
||||
// }
|
||||
//
|
||||
// and your _init method should start by doing:
|
||||
//
|
||||
// Widget.Widget.prototype._init.apply(this, arguments);
|
||||
//
|
||||
// The _init method must define a field named "actor" containing
|
||||
// the Clutter.Actor to show in expanded mode. This actor will be
|
||||
// clipped to Widget.EXPANDED_WIDTH. Most widgets will also define
|
||||
// a field named "title" containing the title string to show above
|
||||
// the widget in the sidebar.
|
||||
//
|
||||
// If you want to have a separate collapsed view, you can define a
|
||||
// field "collapsedActor" containing the Clutter.Actor to show in
|
||||
// that mode. (It may be the same actor.) This actor will be
|
||||
// clipped to Widget.COLLAPSED_WIDTH, and will normally end up
|
||||
// having the same height as the main actor.
|
||||
//
|
||||
// If you do not set a collapsedActor, then you must set a title,
|
||||
// since that is what will be displayed in collapsed mode, and
|
||||
// in this case (and only in this case), the widget will support
|
||||
// pop-out, meaning that if the user hovers over its title while
|
||||
// the sidebar is collapsed, the widget's expanded view will pop
|
||||
// out of the sidebar until either the cursor moves out of it,
|
||||
// or else the widget calls this.activated() on itself.
|
||||
_init: function (initialState) {
|
||||
this.state = initialState;
|
||||
},
|
||||
|
||||
// destroy():
|
||||
//
|
||||
// Optional. Will be called when the widget is removed from the
|
||||
// sidebar. (Note that you don't need to destroy the actors,
|
||||
// since they will be destroyed for you.)
|
||||
|
||||
// collapse():
|
||||
//
|
||||
// Optional. Called during the sidebar collapse process, at the
|
||||
// point when the expanded sidebar has slid offscreen, but the
|
||||
// collapsed sidebar has not yet slid onscreen.
|
||||
|
||||
// expand():
|
||||
//
|
||||
// Optional. Called during the sidebar expand process, at the
|
||||
// point when the collapsed sidebar has slid offscreen, but the
|
||||
// expanded sidebar has not yet slid onscreen.
|
||||
|
||||
// activated():
|
||||
//
|
||||
// Emits the "activated" signal for you, which will cause pop-out
|
||||
// to end.
|
||||
activated: function() {
|
||||
this.emit('activated');
|
||||
}
|
||||
|
||||
// state:
|
||||
//
|
||||
// A field set on your widget by the sidebar. Will contain one of
|
||||
// the Widget.STATE_* values. (Eg, Widget.STATE_EXPANDED).
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(Widget.prototype);
|
||||
|
||||
|
||||
function ClockWidget() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
|
||||
ClockWidget.prototype = {
|
||||
__proto__ : Widget.prototype,
|
||||
|
||||
_init: function() {
|
||||
Widget.prototype._init.apply(this, arguments);
|
||||
|
||||
this.actor = new Clutter.Text({ font_name: "Sans Bold 16px",
|
||||
text: "",
|
||||
// Give an explicit height to ensure
|
||||
// it's the same in both modes
|
||||
height: COLLAPSED_WIDTH });
|
||||
|
||||
this.collapsedActor = new Clutter.CairoTexture({ width: COLLAPSED_WIDTH,
|
||||
height: COLLAPSED_WIDTH,
|
||||
surface_width: COLLAPSED_WIDTH,
|
||||
surface_height: COLLAPSED_WIDTH });
|
||||
|
||||
this._update();
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this.timer)
|
||||
Mainloop.source_remove(this.timer);
|
||||
},
|
||||
|
||||
expand: function() {
|
||||
this._update();
|
||||
},
|
||||
|
||||
collapse: function() {
|
||||
this._update();
|
||||
},
|
||||
|
||||
_update: function() {
|
||||
let time = new Date();
|
||||
let msec_remaining = 60000 - (1000 * time.getSeconds() +
|
||||
time.getMilliseconds());
|
||||
if (msec_remaining < 500) {
|
||||
time.setMinutes(time.getMinutes() + 1);
|
||||
msec_remaining += 60000;
|
||||
}
|
||||
|
||||
if (this.state == STATE_COLLAPSED || this.state == STATE_COLLAPSING)
|
||||
this._updateCairo(time);
|
||||
else
|
||||
this._updateText(time);
|
||||
|
||||
if (this.timer)
|
||||
Mainloop.source_remove(this.timer);
|
||||
this.timer = Mainloop.timeout_add(msec_remaining, Lang.bind(this, this._update));
|
||||
return false;
|
||||
},
|
||||
|
||||
_updateText: function(time) {
|
||||
// Translators: This is a time format.
|
||||
this.actor.set_text(time.toLocaleFormat(_("%H:%M")));
|
||||
},
|
||||
|
||||
_updateCairo: function(time) {
|
||||
Shell.draw_clock(this.collapsedActor,
|
||||
time.getHours() % 12,
|
||||
time.getMinutes());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const ITEM_ICON_SIZE = 48;
|
||||
const ITEM_PADDING = 1;
|
||||
const ITEM_SPACING = 4;
|
||||
|
||||
const ITEM_BG_COLOR = new Clutter.Color();
|
||||
ITEM_BG_COLOR.from_pixel(0x00000000);
|
||||
const ITEM_NAME_COLOR = new Clutter.Color();
|
||||
ITEM_NAME_COLOR.from_pixel(0x000000ff);
|
||||
|
||||
function LauncherWidget() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
|
||||
LauncherWidget.prototype = {
|
||||
__proto__ : Widget.prototype,
|
||||
|
||||
addItem : function(info) {
|
||||
let item = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
width: EXPANDED_WIDTH,
|
||||
height: ITEM_ICON_SIZE,
|
||||
padding: ITEM_PADDING,
|
||||
spacing: ITEM_SPACING,
|
||||
reactive: true });
|
||||
item._info = info;
|
||||
item.append(info.createIcon(ITEM_ICON_SIZE), Big.BoxPackFlags.NONE);
|
||||
item.append(new Clutter.Text({ color: ITEM_NAME_COLOR,
|
||||
font_name: "Sans 14px",
|
||||
ellipsize: Pango.EllipsizeMode.END,
|
||||
text: info.name }),
|
||||
Big.BoxPackFlags.NONE);
|
||||
|
||||
this.actor.append(item, Big.BoxPackFlags.NONE);
|
||||
item.connect('button-press-event', Lang.bind(this, this._buttonPress));
|
||||
item.connect('button-release-event', Lang.bind(this, this._buttonRelease));
|
||||
item.connect('leave-event', Lang.bind(this, this._leave));
|
||||
item.connect('enter-event', Lang.bind(this, this._enter));
|
||||
|
||||
if (!this.collapsedActor)
|
||||
return;
|
||||
|
||||
item = new Big.Box({ width: COLLAPSED_WIDTH,
|
||||
height: COLLAPSED_WIDTH,
|
||||
padding: ITEM_PADDING,
|
||||
reactive: true });
|
||||
item._info = info;
|
||||
item.append(info.createIcon(COLLAPSED_WIDTH - 2 * ITEM_PADDING),
|
||||
Big.BoxPackFlags.NONE);
|
||||
|
||||
this.collapsedActor.append(item, Big.BoxPackFlags.NONE);
|
||||
item.connect('button-press-event', Lang.bind(this, this._buttonPress));
|
||||
item.connect('button-release-event', Lang.bind(this, this._buttonRelease));
|
||||
item.connect('leave-event', Lang.bind(this, this._leave));
|
||||
item.connect('enter-event', Lang.bind(this, this._enter));
|
||||
},
|
||||
|
||||
clear : function() {
|
||||
let children, i;
|
||||
|
||||
children = this.actor.get_children();
|
||||
for (i = 0; i < children.length; i++)
|
||||
children[i].destroy();
|
||||
|
||||
if (this.collapsedActor) {
|
||||
children = this.collapsedActor.get_children();
|
||||
for (i = 0; i < children.length; i++)
|
||||
children[i].destroy();
|
||||
}
|
||||
},
|
||||
|
||||
_buttonPress : function(item) {
|
||||
Clutter.grab_pointer(item);
|
||||
item._buttonDown = true;
|
||||
item._inItem = true;
|
||||
this._updateItemState(item);
|
||||
return true;
|
||||
},
|
||||
|
||||
_leave : function(item, evt) {
|
||||
if (evt.get_source() == item && item._buttonDown) {
|
||||
item._inItem = false;
|
||||
this._updateItemState(item);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
_enter : function(item, evt) {
|
||||
if (evt.get_source() == item && item._buttonDown) {
|
||||
item._inItem = true;
|
||||
this._updateItemState(item);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
_buttonRelease : function(item) {
|
||||
Clutter.ungrab_pointer(item);
|
||||
item._buttonDown = false;
|
||||
this._updateItemState(item);
|
||||
|
||||
if (item._inItem) {
|
||||
item._info.launch();
|
||||
this.activated();
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
_updateItemState : function(item) {
|
||||
if (item._buttonDown && item._inItem) {
|
||||
item.padding_top = item.padding_left = 2 * ITEM_PADDING;
|
||||
item.padding_bottom = item.padding_right = 0;
|
||||
} else
|
||||
item.padding = ITEM_PADDING;
|
||||
}
|
||||
};
|
||||
|
||||
function AppsWidgetInfo(appInfo) {
|
||||
this._init(appInfo);
|
||||
}
|
||||
|
||||
AppsWidgetInfo.prototype = {
|
||||
_init : function(appInfo) {
|
||||
this._info = appInfo;
|
||||
this.name = appInfo.get_name();
|
||||
},
|
||||
|
||||
createIcon : function(size) {
|
||||
return this._info.create_icon_texture(size);
|
||||
},
|
||||
|
||||
launch : function() {
|
||||
this._info.launch();
|
||||
}
|
||||
}
|
||||
|
||||
function AppsWidget() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
|
||||
AppsWidget.prototype = {
|
||||
__proto__ : LauncherWidget.prototype,
|
||||
|
||||
_init : function() {
|
||||
Widget.prototype._init.apply(this, arguments);
|
||||
|
||||
this.title = _("Applications");
|
||||
this.actor = new Big.Box({ spacing: 2 });
|
||||
this.collapsedActor = new Big.Box({ spacing: 2});
|
||||
|
||||
let appSystem = Shell.AppSystem.get_default();
|
||||
let apps = AppFavorites.getAppFavorites().getFavorites();
|
||||
for (let i = 0; i < apps.length; i++) {
|
||||
this.addItem(new AppsWidgetInfo(apps[i]));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function RecentDocsWidget() {
|
||||
this._init.apply(this, arguments);
|
||||
}
|
||||
|
||||
RecentDocsWidget.prototype = {
|
||||
__proto__ : LauncherWidget.prototype,
|
||||
|
||||
_init : function() {
|
||||
Widget.prototype._init.apply(this, arguments);
|
||||
|
||||
this.title = _("Recent Documents");
|
||||
this.actor = new Big.Box({ spacing: 2 });
|
||||
|
||||
this._recentManager = Gtk.RecentManager.get_default();
|
||||
this._recentManager.connect('changed', Lang.bind(this, this._recentChanged));
|
||||
this._recentChanged();
|
||||
},
|
||||
|
||||
_recentChanged: function() {
|
||||
let i;
|
||||
|
||||
this.clear();
|
||||
|
||||
let items = [];
|
||||
let docs = this._recentManager.get_items();
|
||||
for (i = 0; i < docs.length; i++) {
|
||||
let docInfo = new DocInfo.DocInfo (docs[i]);
|
||||
|
||||
items.push(docInfo);
|
||||
}
|
||||
|
||||
items.sort(function (a,b) { return b.timestamp - a.timestamp; });
|
||||
for (i = 0; i < Math.min(items.length, 5); i++)
|
||||
this.addItem(items[i]);
|
||||
}
|
||||
};
|
@ -1,381 +0,0 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Widget = imports.ui.widget;
|
||||
|
||||
const WIDGETBOX_BG_COLOR = new Clutter.Color();
|
||||
WIDGETBOX_BG_COLOR.from_pixel(0xf0f0f0ff);
|
||||
const BLACK = new Clutter.Color();
|
||||
BLACK.from_pixel(0x000000ff);
|
||||
|
||||
const WIDGETBOX_PADDING = 2;
|
||||
const ANIMATION_TIME = 0.5;
|
||||
const POP_IN_LAG = 250; /* milliseconds */
|
||||
|
||||
function WidgetBox(widget, expanded) {
|
||||
this._init(widget, expanded);
|
||||
}
|
||||
|
||||
WidgetBox.prototype = {
|
||||
_init: function(widget, expanded) {
|
||||
this.state = expanded ? Widget.STATE_EXPANDED : Widget.STATE_COLLAPSED;
|
||||
|
||||
if (widget instanceof Widget.Widget) {
|
||||
this._widget = widget;
|
||||
this._widget.state = this.state;
|
||||
} else {
|
||||
let ctor = this._ctorFromName(widget);
|
||||
this._widget = new ctor(this.state);
|
||||
}
|
||||
|
||||
if (!this._widget.actor)
|
||||
throw new Error("widget has no actor");
|
||||
else if (!this._widget.title && !this._widget.collapsedActor)
|
||||
throw new Error("widget has neither title nor collapsedActor");
|
||||
|
||||
this.state = expanded ? Widget.STATE_EXPANDED : Widget.STATE_COLLAPSED;
|
||||
|
||||
// The structure of a WidgetBox:
|
||||
//
|
||||
// The top level is a Clutter.Group, which exists to make
|
||||
// pop-out work correctly; when another widget pops out, its
|
||||
// width will increase, which will in turn cause the sidebar's
|
||||
// width to increase, which will cause the sidebar to increase
|
||||
// the width of each of its children (the WidgetBoxes). But we
|
||||
// don't want the non-popped-out widgets to expand, so we make
|
||||
// the top-level actor be a Clutter.Group, which will accept
|
||||
// the new width from the Sidebar, but not impose it on its
|
||||
// own child.
|
||||
//
|
||||
// Inside the toplevel group is a horizontal Big.Box
|
||||
// containing 2 Clutter.Groups; one for the collapsed state
|
||||
// (cgroup) and one for the expanded state (egroup). Each
|
||||
// group contains a single vertical Big.Box (cbox and ebox
|
||||
// respectively), which have the appropriate fixed width. The
|
||||
// cbox contains either the collapsed widget actor or else the
|
||||
// rotated title. The ebox contains the horizontal title (if
|
||||
// any), separator line, and the expanded widget actor. (If
|
||||
// the widget doesn't have a collapsed actor, and therefore
|
||||
// supports pop-out, then it will also have a vertical line
|
||||
// between the two groups, which will only be shown during
|
||||
// pop-out.)
|
||||
//
|
||||
// In the expanded view, cgroup is hidden and egroup is shown.
|
||||
// When animating to the collapsed view, first the ebox is
|
||||
// slid offscreen by giving it increasingly negative x
|
||||
// coordinates within egroup. Then once it's fully offscreen,
|
||||
// we hide egroup, show cgroup, and slide cbox back in in the
|
||||
// same way.
|
||||
//
|
||||
// The pop-out view works similarly to the second half of the
|
||||
// collapsed-to-expanded transition, except that the
|
||||
// horizontal title gets hidden to avoid duplication.
|
||||
|
||||
this.actor = new Clutter.Group();
|
||||
this._hbox = new Big.Box({ background_color: WIDGETBOX_BG_COLOR,
|
||||
padding_top: WIDGETBOX_PADDING,
|
||||
padding_bottom: WIDGETBOX_PADDING,
|
||||
padding_right: WIDGETBOX_PADDING,
|
||||
// Left padding is here to make up for
|
||||
// the X offset used for the sidebar
|
||||
// to hide its rounded corners
|
||||
padding_left: 2 * WIDGETBOX_PADDING,
|
||||
spacing: WIDGETBOX_PADDING,
|
||||
corner_radius: WIDGETBOX_PADDING,
|
||||
orientation: Big.BoxOrientation.HORIZONTAL,
|
||||
reactive: true });
|
||||
this.actor.add_actor(this._hbox);
|
||||
|
||||
this._cgroup = new Clutter.Group({ clip_to_allocation: true });
|
||||
this._hbox.append(this._cgroup, Big.BoxPackFlags.NONE);
|
||||
|
||||
this._cbox = new Big.Box({ width: Widget.COLLAPSED_WIDTH,
|
||||
clip_to_allocation: true });
|
||||
this._cgroup.add_actor(this._cbox);
|
||||
|
||||
if (this._widget.collapsedActor) {
|
||||
if (this._widget.collapsedActor == this._widget.actor)
|
||||
this._singleActor = true;
|
||||
else {
|
||||
this._cbox.append(this._widget.collapsedActor,
|
||||
Big.BoxPackFlags.NONE);
|
||||
}
|
||||
} else {
|
||||
let vtitle = new Clutter.Text({ font_name: "Sans 16px",
|
||||
text: this._widget.title,
|
||||
rotation_angle_z: -90.0 });
|
||||
let signalId = vtitle.connect('notify::allocation',
|
||||
function () {
|
||||
vtitle.disconnect(signalId);
|
||||
vtitle.set_anchor_point(vtitle.natural_width, 0);
|
||||
vtitle.set_size(vtitle.natural_height,
|
||||
vtitle.natural_width);
|
||||
});
|
||||
this._vtitle = vtitle;
|
||||
this._cbox.append(this._vtitle, Big.BoxPackFlags.NONE);
|
||||
|
||||
this._vline = new Clutter.Rectangle({ color: BLACK, width: 1 });
|
||||
this._hbox.append(this._vline, Big.BoxPackFlags.NONE);
|
||||
this._vline.hide();
|
||||
|
||||
// Set up pop-out
|
||||
this._eventHandler = this._hbox.connect('captured-event',
|
||||
Lang.bind(this, this._popEventHandler));
|
||||
this._activationHandler = this._widget.connect('activated',
|
||||
Lang.bind(this, this._activationHandler));
|
||||
}
|
||||
|
||||
this._egroup = new Clutter.Group({ clip_to_allocation: true });
|
||||
this._hbox.append(this._egroup, Big.BoxPackFlags.NONE);
|
||||
|
||||
this._ebox = new Big.Box({ spacing: WIDGETBOX_PADDING,
|
||||
width: Widget.EXPANDED_WIDTH,
|
||||
clip_to_allocation: true });
|
||||
this._egroup.add_actor(this._ebox);
|
||||
|
||||
if (this._widget.title) {
|
||||
this._htitle = new Clutter.Text({ font_name: "Sans 16px",
|
||||
text: this._widget.title });
|
||||
this._ebox.append(this._htitle, Big.BoxPackFlags.NONE);
|
||||
|
||||
this._hline = new Clutter.Rectangle({ color: BLACK, height: 1 });
|
||||
this._ebox.append(this._hline, Big.BoxPackFlags.NONE);
|
||||
}
|
||||
|
||||
this._ebox.append(this._widget.actor, Big.BoxPackFlags.NONE);
|
||||
|
||||
if (expanded)
|
||||
this._setWidgetExpanded();
|
||||
else
|
||||
this._setWidgetCollapsed();
|
||||
},
|
||||
|
||||
// Given a name like "imports.ui.widget.ClockWidget", turn that
|
||||
// into a constructor function
|
||||
_ctorFromName: function(name) {
|
||||
// Make sure it's a valid import
|
||||
if (!name.match(/^imports(\.[a-zA-Z0-9_]+)+$/))
|
||||
throw new Error("widget name must start with 'imports.'");
|
||||
if (name.match(/^imports\.gi\./))
|
||||
throw new Error("cannot import widget from GIR");
|
||||
|
||||
let ctor = eval(name);
|
||||
|
||||
// Make sure it's really a constructor
|
||||
if (!ctor || typeof(ctor) != "function")
|
||||
throw new Error("widget name is not a constructor");
|
||||
|
||||
// Make sure it's a widget
|
||||
let proto = ctor.prototype;
|
||||
while (proto && proto != Widget.Widget.prototype)
|
||||
proto = proto.__proto__;
|
||||
if (!proto)
|
||||
throw new Error("widget does not inherit from Widget prototype");
|
||||
|
||||
return ctor;
|
||||
},
|
||||
|
||||
expand: function() {
|
||||
Tweener.addTween(this._cbox, { x: -Widget.COLLAPSED_WIDTH,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad",
|
||||
onComplete: this._expandPart1Complete,
|
||||
onCompleteScope: this });
|
||||
this.state = this._widget.state = Widget.STATE_EXPANDING;
|
||||
},
|
||||
|
||||
_setWidgetExpanded: function() {
|
||||
this._cgroup.hide();
|
||||
this._egroup.show();
|
||||
|
||||
if (this._singleActor) {
|
||||
this._widget.actor.unparent();
|
||||
this._ebox.append(this._widget.actor, Big.BoxPackFlags.NONE);
|
||||
}
|
||||
|
||||
if (this._htitle) {
|
||||
this._htitle.show();
|
||||
this._hline.show();
|
||||
}
|
||||
},
|
||||
|
||||
_expandPart1Complete: function() {
|
||||
this._cbox.x = 0;
|
||||
this._setWidgetExpanded();
|
||||
|
||||
if (this._widget.expand) {
|
||||
try {
|
||||
this._widget.expand();
|
||||
} catch (e) {
|
||||
logError(e, 'Widget failed to expand');
|
||||
}
|
||||
}
|
||||
|
||||
this._ebox.x = -Widget.EXPANDED_WIDTH;
|
||||
Tweener.addTween(this._ebox, { x: 0,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad",
|
||||
onComplete: this._expandComplete,
|
||||
onCompleteScope: this });
|
||||
},
|
||||
|
||||
_expandComplete: function() {
|
||||
this.state = this._widget.state = Widget.STATE_EXPANDED;
|
||||
},
|
||||
|
||||
collapse: function() {
|
||||
Tweener.addTween(this._ebox, { x: -Widget.EXPANDED_WIDTH,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad",
|
||||
onComplete: this._collapsePart1Complete,
|
||||
onCompleteScope: this });
|
||||
this.state = this._widget.state = Widget.STATE_COLLAPSING;
|
||||
},
|
||||
|
||||
_setWidgetCollapsed: function() {
|
||||
this._egroup.hide();
|
||||
this._cgroup.show();
|
||||
|
||||
if (this._singleActor) {
|
||||
this._widget.actor.unparent();
|
||||
this._cbox.append(this._widget.actor, Big.BoxPackFlags.NONE);
|
||||
}
|
||||
|
||||
if (this._htitle) {
|
||||
this._htitle.hide();
|
||||
this._hline.hide();
|
||||
}
|
||||
|
||||
if (this._vtitle)
|
||||
this._cbox.height = this._ebox.height;
|
||||
},
|
||||
|
||||
_collapsePart1Complete: function() {
|
||||
this._ebox.x = 0;
|
||||
this._setWidgetCollapsed();
|
||||
|
||||
if (this._widget.collapse) {
|
||||
try {
|
||||
this._widget.collapse();
|
||||
} catch (e) {
|
||||
logError(e, 'Widget failed to collapse');
|
||||
}
|
||||
}
|
||||
|
||||
this._cbox.x = -Widget.COLLAPSED_WIDTH;
|
||||
Tweener.addTween(this._cbox, { x: 0,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad",
|
||||
onComplete: this._collapseComplete,
|
||||
onCompleteScope: this });
|
||||
},
|
||||
|
||||
_collapseComplete: function() {
|
||||
this.state = this._widget.state = Widget.STATE_COLLAPSED;
|
||||
},
|
||||
|
||||
_popEventHandler: function(actor, event) {
|
||||
let type = event.type();
|
||||
|
||||
if (type == Clutter.EventType.ENTER) {
|
||||
this._clearPopInTimeout();
|
||||
if (this.state == Widget.STATE_COLLAPSED ||
|
||||
this.state == Widget.STATE_COLLAPSING) {
|
||||
this._popOut();
|
||||
return false;
|
||||
}
|
||||
} else if (type == Clutter.EventType.LEAVE &&
|
||||
(this.state == Widget.STATE_POPPED_OUT ||
|
||||
this.state == Widget.STATE_POPPING_OUT)) {
|
||||
// If moving into another actor within this._hbox, let the
|
||||
// event be propagated
|
||||
let into = event.get_related();
|
||||
while (into) {
|
||||
if (into == this._hbox)
|
||||
return false;
|
||||
into = into.get_parent();
|
||||
}
|
||||
|
||||
// Else, moving out of this._hbox
|
||||
this._setPopInTimeout();
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_activationHandler: function() {
|
||||
if (this.state == Widget.STATE_POPPED_OUT)
|
||||
this._popIn();
|
||||
},
|
||||
|
||||
_popOut: function() {
|
||||
if (this.state != Widget.STATE_COLLAPSED &&
|
||||
this.state != Widget.STATE_COLLAPSING)
|
||||
return;
|
||||
|
||||
this._vline.show();
|
||||
this._egroup.show();
|
||||
this._ebox.x = -Widget.EXPANDED_WIDTH;
|
||||
Tweener.addTween(this._ebox, { x: 0,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad",
|
||||
onComplete: this._popOutComplete,
|
||||
onCompleteScope: this });
|
||||
this.state = this._widget.state = Widget.STATE_POPPING_OUT;
|
||||
|
||||
Main.chrome.trackActor(this._hbox, { affectsStruts: false });
|
||||
},
|
||||
|
||||
_popOutComplete: function() {
|
||||
this.state = this._widget.state = Widget.STATE_POPPED_OUT;
|
||||
},
|
||||
|
||||
_setPopInTimeout: function() {
|
||||
this._clearPopInTimeout();
|
||||
this._popInTimeout = Mainloop.timeout_add(POP_IN_LAG, Lang.bind(this, function () { this._popIn(); return false; }));
|
||||
},
|
||||
|
||||
_clearPopInTimeout: function() {
|
||||
if (this._popInTimeout) {
|
||||
Mainloop.source_remove(this._popInTimeout);
|
||||
delete this._popInTimeout;
|
||||
}
|
||||
},
|
||||
|
||||
_popIn: function() {
|
||||
this._clearPopInTimeout();
|
||||
|
||||
if (this.state != Widget.STATE_POPPED_OUT &&
|
||||
this.state != Widget.STATE_POPPING_OUT)
|
||||
return;
|
||||
|
||||
Tweener.addTween(this._ebox, { x: -Widget.EXPANDED_WIDTH,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad",
|
||||
onComplete: this._popInComplete,
|
||||
onCompleteScope: this });
|
||||
},
|
||||
|
||||
_popInComplete: function() {
|
||||
this.state = this._widget.state = Widget.STATE_COLLAPSED;
|
||||
this._vline.hide();
|
||||
this._egroup.hide();
|
||||
this._ebox.x = 0;
|
||||
|
||||
Main.chrome.untrackActor(this._hbox);
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._widget.destroy)
|
||||
this._widget.destroy();
|
||||
}
|
||||
};
|
||||
|
109
js/ui/windowAttentionHandler.js
Normal file
@ -0,0 +1,109 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Gettext = imports.gettext.domain('gnome-shell');
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
|
||||
function WindowAttentionHandler() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
WindowAttentionHandler.prototype = {
|
||||
_init : function() {
|
||||
let display = global.screen.get_display();
|
||||
display.connect('window-demands-attention', Lang.bind(this, this._onWindowDemandsAttention));
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
this._startupIds = {};
|
||||
tracker.connect('startup-sequence-changed', Lang.bind(this, this._onStartupSequenceChanged));
|
||||
},
|
||||
|
||||
_onStartupSequenceChanged : function(tracker) {
|
||||
let sequences = tracker.get_startup_sequences();
|
||||
this._startupIds = {};
|
||||
for(let i = 0; i < sequences.length; i++) {
|
||||
this._startupIds[sequences[i].get_id()] = true;
|
||||
}
|
||||
},
|
||||
|
||||
_sourceId : function(appId) {
|
||||
return 'attention-' + appId;
|
||||
},
|
||||
|
||||
_getTitle : function(app, window) {
|
||||
if (this._startupIds[window.get_startup_id()])
|
||||
return app.get_name();
|
||||
else
|
||||
return window.title;
|
||||
},
|
||||
|
||||
_getBanner : function(app, window) {
|
||||
if (this._startupIds[window.get_startup_id()])
|
||||
return _("%s has finished starting").format(app.get_name());
|
||||
else
|
||||
return _("'%s' is ready").format(window.title);
|
||||
},
|
||||
|
||||
_onWindowDemandsAttention : function(display, window) {
|
||||
// We don't want to show the notification when the window is already focused,
|
||||
// because this is rather pointless.
|
||||
// Some apps (like GIMP) do things like setting the urgency hint on the
|
||||
// toolbar windows which would result into a notification even though GIMP itself is
|
||||
// focused.
|
||||
// We are just ignoring the hint on skip_taskbar windows for now.
|
||||
// (Which is the same behaviour as with metacity + panel)
|
||||
|
||||
if (!window || window.has_focus() || window.is_skip_taskbar())
|
||||
return;
|
||||
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let app = tracker.get_window_app(window);
|
||||
|
||||
let source = Main.messageTray.getSource(this._sourceId(app.get_id()));
|
||||
if (source == null) {
|
||||
source = new Source(this._sourceId(app.get_id()), app, window);
|
||||
Main.messageTray.add(source);
|
||||
source.connect('clicked', Lang.bind(this, function() { source.destroy(); }));
|
||||
}
|
||||
|
||||
let notification = new MessageTray.Notification(window.get_startup_id(), source, this._getTitle(app, window), this._getBanner(app, window), true);
|
||||
source.notify(notification);
|
||||
|
||||
window.connect('notify::title', Lang.bind(this, function(win) {
|
||||
notification.update(this._getTitle(app, win), this._getBanner(app, win), false);
|
||||
}));
|
||||
window.connect('notify::demands-attention', Lang.bind(this, function() { source.destroy(); }));
|
||||
window.connect('focus', Lang.bind(this, function() { source.destroy(); }));
|
||||
window.connect('unmanaged', Lang.bind(this, function() { source.destroy(); }));
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
function Source(sourceId, app, window) {
|
||||
this._init(sourceId, app, window);
|
||||
}
|
||||
|
||||
Source.prototype = {
|
||||
__proto__ : MessageTray.Source.prototype,
|
||||
|
||||
_init: function(sourceId, app, window) {
|
||||
MessageTray.Source.prototype._init.call(this, sourceId);
|
||||
this._window = window;
|
||||
this._app = app;
|
||||
},
|
||||
|
||||
createIcon : function(size) {
|
||||
return this._app.create_icon_texture(size);
|
||||
},
|
||||
|
||||
clicked : function() {
|
||||
Main.activateWindow(this._window);
|
||||
MessageTray.Source.prototype.clicked.call(this);
|
||||
}
|
||||
|
||||
};
|
@ -5,8 +5,10 @@ const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const AltTab = imports.ui.altTab;
|
||||
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
@ -18,8 +20,9 @@ function WindowManager() {
|
||||
|
||||
WindowManager.prototype = {
|
||||
_init : function() {
|
||||
let shellwm = global.window_manager;
|
||||
this._shellwm = global.window_manager;
|
||||
|
||||
this._keyBindingHandlers = [];
|
||||
this._minimizing = [];
|
||||
this._maximizing = [];
|
||||
this._unmaximizing = [];
|
||||
@ -27,21 +30,35 @@ WindowManager.prototype = {
|
||||
this._destroying = [];
|
||||
|
||||
this._switchData = null;
|
||||
shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
|
||||
shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
|
||||
shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
|
||||
shellwm.connect('kill-minimize', Lang.bind(this, this._minimizeWindowDone));
|
||||
shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow));
|
||||
shellwm.connect('kill-maximize', Lang.bind(this, this._maximizeWindowDone));
|
||||
shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
|
||||
shellwm.connect('kill-unmaximize', Lang.bind(this, this._unmaximizeWindowDone));
|
||||
shellwm.connect('map', Lang.bind(this, this._mapWindow));
|
||||
shellwm.connect('kill-map', Lang.bind(this, this._mapWindowDone));
|
||||
shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
|
||||
shellwm.connect('kill-destroy', Lang.bind(this, this._destroyWindowDone));
|
||||
this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
|
||||
this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
|
||||
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
|
||||
this._shellwm.connect('kill-minimize', Lang.bind(this, this._minimizeWindowDone));
|
||||
this._shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow));
|
||||
this._shellwm.connect('kill-maximize', Lang.bind(this, this._maximizeWindowDone));
|
||||
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
|
||||
this._shellwm.connect('kill-unmaximize', Lang.bind(this, this._unmaximizeWindowDone));
|
||||
this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
|
||||
this._shellwm.connect('kill-map', Lang.bind(this, this._mapWindowDone));
|
||||
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
|
||||
this._shellwm.connect('kill-destroy', Lang.bind(this, this._destroyWindowDone));
|
||||
|
||||
shellwm.takeover_keybinding('switch_windows');
|
||||
shellwm.connect('keybinding::switch_windows', Lang.bind(this, this._startAppSwitcher));
|
||||
this._workspaceSwitcherPopup = null;
|
||||
this.setKeybindingHandler('switch_to_workspace_left', Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setKeybindingHandler('switch_to_workspace_right', Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setKeybindingHandler('switch_to_workspace_up', Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setKeybindingHandler('switch_to_workspace_down', Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setKeybindingHandler('switch_windows', Lang.bind(this, this._startAppSwitcher));
|
||||
},
|
||||
|
||||
setKeybindingHandler: function(keybinding, handler){
|
||||
if (this._keyBindingHandlers[keybinding])
|
||||
this._shellwm.disconnect(this._keyBindingHandlers[keybinding]);
|
||||
else
|
||||
this._shellwm.takeover_keybinding(keybinding);
|
||||
|
||||
this._keyBindingHandlers[keybinding] =
|
||||
this._shellwm.connect('keybinding::' + keybinding, handler);
|
||||
},
|
||||
|
||||
_shouldAnimate : function(actor) {
|
||||
@ -74,11 +91,19 @@ WindowManager.prototype = {
|
||||
* maybe TODO: get icon geometry passed through and move the window towards it?
|
||||
*/
|
||||
this._minimizing.push(actor);
|
||||
|
||||
let primary = global.get_primary_monitor();
|
||||
let xDest = primary.x;
|
||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
|
||||
xDest += primary.width;
|
||||
|
||||
Tweener.addTween(actor,
|
||||
{ scale_x: 0.0,
|
||||
scale_y: 0.0,
|
||||
x: xDest,
|
||||
y: 0,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._minimizeWindowDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm, actor],
|
||||
@ -127,17 +152,15 @@ WindowManager.prototype = {
|
||||
return;
|
||||
}
|
||||
|
||||
actor.move_anchor_point_from_gravity(Clutter.Gravity.CENTER);
|
||||
actor.set_scale(0.0, 0.0);
|
||||
actor.opacity = 0;
|
||||
actor.show();
|
||||
|
||||
/* scale window up from 0x0 to normal size */
|
||||
/* Fade window in */
|
||||
this._mapping.push(actor);
|
||||
Tweener.addTween(actor,
|
||||
{ scale_x: 1.0,
|
||||
scale_y: 1.0,
|
||||
{ opacity: 255,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._mapWindowDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm, actor],
|
||||
@ -150,8 +173,7 @@ WindowManager.prototype = {
|
||||
_mapWindowDone : function(shellwm, actor) {
|
||||
if (this._removeEffect(this._mapping, actor)) {
|
||||
Tweener.removeTweens(actor);
|
||||
actor.set_scale(1.0, 1.0);
|
||||
actor.move_anchor_point_from_gravity(Clutter.Gravity.NORTH_WEST);
|
||||
actor.opacity = 255;
|
||||
shellwm.completed_map(actor);
|
||||
}
|
||||
},
|
||||
@ -236,7 +258,7 @@ WindowManager.prototype = {
|
||||
{ x: xDest,
|
||||
y: yDest,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._switchWorkspaceDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm]
|
||||
@ -245,7 +267,7 @@ WindowManager.prototype = {
|
||||
{ x: 0,
|
||||
y: 0,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
},
|
||||
|
||||
@ -272,9 +294,55 @@ WindowManager.prototype = {
|
||||
},
|
||||
|
||||
_startAppSwitcher : function(shellwm, binding, window, backwards) {
|
||||
/* prevent a corner case where both popups show up at once */
|
||||
if (this._workspaceSwitcherPopup != null)
|
||||
this._workspaceSwitcherPopup.actor.hide();
|
||||
|
||||
let tabPopup = new AltTab.AltTabPopup();
|
||||
|
||||
if (!tabPopup.show(backwards))
|
||||
tabPopup.destroy();
|
||||
},
|
||||
|
||||
_showWorkspaceSwitcher : function(shellwm, binding, window, backwards) {
|
||||
/* We don't support this kind of layout */
|
||||
if (binding == 'switch_to_workspace_up' || binding == 'switch_to_workspace_down')
|
||||
return;
|
||||
|
||||
if (global.screen.n_workspaces == 1)
|
||||
return;
|
||||
|
||||
if (this._workspaceSwitcherPopup == null)
|
||||
this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup();
|
||||
|
||||
if (binding == 'switch_to_workspace_left') {
|
||||
this.actionMoveWorkspaceLeft();
|
||||
}
|
||||
|
||||
if (binding == 'switch_to_workspace_right') {
|
||||
this.actionMoveWorkspaceRight();
|
||||
}
|
||||
},
|
||||
|
||||
actionMoveWorkspaceLeft: function() {
|
||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||
if (activeWorkspaceIndex > 0) {
|
||||
global.screen.get_workspace_by_index(activeWorkspaceIndex - 1).activate(global.get_current_time());
|
||||
if (!Main.overview.visible)
|
||||
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex - 1);
|
||||
} else if (!Main.overview.visible) {
|
||||
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex);
|
||||
}
|
||||
},
|
||||
|
||||
actionMoveWorkspaceRight: function() {
|
||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||
if (activeWorkspaceIndex < global.screen.n_workspaces - 1) {
|
||||
global.screen.get_workspace_by_index(activeWorkspaceIndex + 1).activate(global.get_current_time());
|
||||
if (!Main.overview.visible)
|
||||
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, activeWorkspaceIndex + 1);
|
||||
} else if (!Main.overview.visible) {
|
||||
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, activeWorkspaceIndex);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
100
js/ui/workspaceSwitcherPopup.js
Normal file
@ -0,0 +1,100 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const ANIMATION_TIME = 0.075;
|
||||
const DISPLAY_TIMEOUT = 600;
|
||||
|
||||
const LEFT = -1;
|
||||
const RIGHT = 1;
|
||||
|
||||
function WorkspaceSwitcherPopup() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
WorkspaceSwitcherPopup.prototype = {
|
||||
_init : function() {
|
||||
this.actor = new Clutter.Group({ reactive: true,
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: global.screen_width,
|
||||
height: global.screen_height });
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
|
||||
this._scaleWidth = global.screen_width / global.screen_height;
|
||||
|
||||
this._container = new St.BoxLayout({ style_class: 'workspace-switcher-container' });
|
||||
this._list = new St.BoxLayout({ style_class: 'workspace-switcher' });
|
||||
|
||||
this._container.add(this._list);
|
||||
|
||||
this.actor.add_actor(this._container);
|
||||
|
||||
this._redraw();
|
||||
|
||||
this._position();
|
||||
|
||||
this.actor.show();
|
||||
this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout));
|
||||
},
|
||||
|
||||
_redraw : function(direction, activeWorkspaceIndex) {
|
||||
this._list.destroy_children();
|
||||
|
||||
for (let i = 0; i < global.screen.n_workspaces; i++) {
|
||||
let indicator = null;
|
||||
|
||||
if (i == activeWorkspaceIndex && direction == LEFT)
|
||||
indicator = new St.Bin({ style_class: 'ws-switcher-active-left' });
|
||||
else if(i == activeWorkspaceIndex && direction == RIGHT)
|
||||
indicator = new St.Bin({ style_class: 'ws-switcher-active-right' });
|
||||
else
|
||||
indicator = new St.Bin({ style_class: 'ws-switcher-box' });
|
||||
|
||||
this._list.add(indicator);
|
||||
indicator.set_width(Math.round(indicator.get_height() * this._scaleWidth));
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
_position: function() {
|
||||
let focus = global.get_focus_monitor();
|
||||
this._container.x = focus.x + Math.floor((focus.width - this._container.width) / 2);
|
||||
this._container.y = focus.y + Math.floor((focus.height - this._container.height) / 2);
|
||||
},
|
||||
|
||||
_show : function() {
|
||||
Tweener.addTween(this._container, { opacity: 255,
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
this._position();
|
||||
this.actor.show();
|
||||
},
|
||||
|
||||
display : function(direction, activeWorkspaceIndex) {
|
||||
this._redraw(direction, activeWorkspaceIndex);
|
||||
if (this._timeoutId != 0)
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout));
|
||||
this._show();
|
||||
},
|
||||
|
||||
_onTimeout : function() {
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
this._timeoutId = 0;
|
||||
Tweener.addTween(this._container, { opacity: 0.0,
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() { this.actor.hide(); },
|
||||
onCompleteScope: this
|
||||
});
|
||||
}
|
||||
};
|
1677
js/ui/workspacesView.js
Normal file
1
man/Makefile.am
Normal file
@ -0,0 +1 @@
|
||||
dist_man_MANS = gnome-shell.1
|
99
man/gnome-shell.1
Normal file
@ -0,0 +1,99 @@
|
||||
.\" Copyright (c) 2009, Marcelo Jorge Vieira (metal) <metal@alucinados.com>
|
||||
.\"
|
||||
.\" This is free documentation; you can redistribute it and/or
|
||||
.\" modify it under the terms of the GNU General Public License as
|
||||
.\" published by the Free Software Foundation; either version 2 of
|
||||
.\" the License, or (at your option) any later version.
|
||||
.\"
|
||||
.\" The GNU General Public License's references to "object code"
|
||||
.\" and "executables" are to be interpreted as the output of any
|
||||
.\" document formatting or typesetting system, including
|
||||
.\" intermediate and printed output.
|
||||
.\"
|
||||
.\" This manual is distributed in the hope that it will be useful,
|
||||
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
.\" GNU General Public License for more details.
|
||||
.\"
|
||||
.\" You should have received a copy of the GNU General Public
|
||||
.\" License along with this manual; if not, write to the Free
|
||||
.\" Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
.\" Boston, MA 02111-1301 USA.
|
||||
.TH GNOME-SHELL 1
|
||||
.SH NAME
|
||||
gnome-shell \- Graphical shell for the GNOME desktop
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B gnome-shell [options]
|
||||
|
||||
.SH DESCRIPTION
|
||||
GNOME Shell provides core user interface functions for the GNOME 3
|
||||
desktop, like switching to windows and launching applications. GNOME
|
||||
Shell takes advantage of the capabilities of modern graphics hardware
|
||||
and introduces innovative user interface concepts to provide a
|
||||
visually attractive and easy to use experience.
|
||||
|
||||
.SH OPTIONS
|
||||
|
||||
.TP
|
||||
.B \-r, \-\-replace
|
||||
Replace the running metacity/gnome-panel
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-v, \-\-verbose
|
||||
Shows details about the results of running `gnome-shell'.
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-g, \-\-debug
|
||||
Run under a debugger
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-debug\-command
|
||||
Command to use for debugging (defaults to 'gdb \-\-args')
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-sync
|
||||
.br
|
||||
Make X calls synchronously, useful when debugging down X errors
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-xephyr
|
||||
Run a debugging instance inside Xephyr
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-geometry
|
||||
Specify Xephyr screen geometry
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-w, \-\-wide
|
||||
Use widescreen (1280x800) with Xephyr
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-create\-extension
|
||||
Create a new GNOME Shell extension
|
||||
|
||||
.TP
|
||||
.B \-\-eval\-file
|
||||
Evaluate the contents of the given JavaScript file
|
||||
.br
|
||||
|
||||
.SH BUGS
|
||||
The bug tracker can be reached by visiting the website
|
||||
\fIhttps://bugzilla.gnome.org/buglist.cgi?product=gnome-shell\fR
|
||||
|
||||
Before sending a bug report, please verify that you have the latest
|
||||
version of gnome-shell. Many bugs (major and minor) are fixed at each
|
||||
release, and if yours is out of date, the problem may already have
|
||||
been solved.
|
||||
|
||||
.SH ADDITIONAL INFORMATION
|
||||
|
||||
For further information, visit the website \fIhttp://live.gnome.org/GnomeShell\fR
|
@ -1,4 +1,5 @@
|
||||
ar
|
||||
bg
|
||||
ca
|
||||
cs
|
||||
da
|
||||
@ -22,6 +23,10 @@ pt_BR
|
||||
ro
|
||||
ru
|
||||
sl
|
||||
sr
|
||||
sr@latin
|
||||
sv
|
||||
tr
|
||||
uk
|
||||
vi
|
||||
zh_CN
|
||||
|
@ -1,12 +1,18 @@
|
||||
data/gnome-shell.desktop.in.in
|
||||
data/gnome-shell-clock-preferences.desktop.in.in
|
||||
[type: gettext/glade]data/clock-preferences.ui
|
||||
js/ui/appDisplay.js
|
||||
js/ui/appIcon.js
|
||||
js/ui/appFavorites.js
|
||||
js/ui/dash.js
|
||||
js/ui/docDisplay.js
|
||||
js/ui/lookingGlass.js
|
||||
js/ui/overview.js
|
||||
js/ui/panel.js
|
||||
js/ui/placeDisplay.js
|
||||
js/ui/runDialog.js
|
||||
js/ui/widget.js
|
||||
js/ui/statusMenu.js
|
||||
js/ui/windowAttentionHandler.js
|
||||
js/ui/workspacesView.js
|
||||
src/gdmuser/gdm-user.c
|
||||
src/shell-global.c
|
||||
src/shell-uri-util.c
|
||||
|
@ -1 +1,2 @@
|
||||
data/gnome-shell.desktop.in
|
||||
data/gnome-shell-clock-preferences.desktop.in
|
||||
|
350
po/ar.po
@ -1,13 +1,13 @@
|
||||
# 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>, 2009.
|
||||
# Khaled Hosny <khaledhosny@eglug.org>, 2009, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: HEAD\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-11-08 20:55+0200\n"
|
||||
"PO-Revision-Date: 2009-11-08 20:55+0300\n"
|
||||
"POT-Creation-Date: 2010-05-15 23:40+0300\n"
|
||||
"PO-Revision-Date: 2010-05-15 23:40+0300\n"
|
||||
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
|
||||
"Language-Team: Arabic <doc@arabeyes.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -15,8 +15,8 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ar\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
"X-Generator: Virtaal 0.4.1\n"
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Virtaal 0.6.0\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
@ -26,106 +26,237 @@ msgstr "صدفة جنوم"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "إدارة النوافذ وإطلاق التطبيقات"
|
||||
|
||||
#: ../js/ui/appDisplay.js:332
|
||||
msgid "Frequent"
|
||||
msgstr "متكرر"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "الساعة"
|
||||
|
||||
#: ../js/ui/appDisplay.js:867
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "اسحب إلى هنا ليضاف إلى المفضّلة"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "طوّع ساعة اللوحة"
|
||||
|
||||
#: ../js/ui/appIcon.js:426
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "التطبيقات"
|
||||
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "التفضيلات"
|
||||
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "نافذة جديدة"
|
||||
|
||||
#: ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "أزِل من المفضّلة"
|
||||
|
||||
#: ../js/ui/appIcon.js:431
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "أضِف إلى المفضّلة"
|
||||
|
||||
#: ../js/ui/dash.js:267
|
||||
msgid "Find..."
|
||||
msgstr "ابحث..."
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "اسحب إلى هنا ليضاف إلى المفضّلة"
|
||||
|
||||
#: ../js/ui/dash.js:376
|
||||
msgid "More"
|
||||
msgstr "المزيد"
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "أضيف %s إلى مفضلتك."
|
||||
|
||||
#: ../js/ui/dash.js:532
|
||||
msgid "(see all)"
|
||||
msgstr "(انظر الكل)"
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "أزيل %s من مفضّلتك."
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:711 ../js/ui/dash.js:773
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "التطبيقات"
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "ابحث"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "يبحث..."
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "لا نتائج مطابقة."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:731
|
||||
msgid "PLACES"
|
||||
msgstr "الأماكن"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "الأماكن والأجهزة"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:738 ../js/ui/dash.js:783
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "المستندات الحديثة"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "العناصر الحديثة"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:763 ../js/ui/dash.js:947
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "نتائج البحث"
|
||||
#: ../js/ui/lookingGlass.js:354
|
||||
msgid "No extensions installed"
|
||||
msgstr "لم تثبّت أية امتدادات"
|
||||
|
||||
#: ../js/ui/dash.js:778
|
||||
msgid "PREFERENCES"
|
||||
msgstr "التفضيلات"
|
||||
#: ../js/ui/lookingGlass.js:391
|
||||
msgid "Enabled"
|
||||
msgstr "مفعّل"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:393
|
||||
msgid "Disabled"
|
||||
msgstr "معطّل"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:395
|
||||
msgid "Error"
|
||||
msgstr "خطأ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:397
|
||||
msgid "Out of date"
|
||||
msgstr "غير محدث"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:422
|
||||
msgid "View Source"
|
||||
msgstr "اعرض المصدر"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:428
|
||||
msgid "Web Page"
|
||||
msgstr "صفحة الوب"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "تراجع"
|
||||
|
||||
#: ../js/ui/panel.js:535
|
||||
msgid "Quit"
|
||||
msgstr "أنهِ"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:274
|
||||
#: ../js/ui/panel.js:740
|
||||
msgid "Activities"
|
||||
msgstr "الأنشطة"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:491
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:955
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%A %e %B، %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:956
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%A %e %B، %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:960
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%A %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:961
|
||||
msgid "%a %R"
|
||||
msgstr "%A %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:968
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%A %e %B، %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:969
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%A %e %B، %l:%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:973
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%A %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:974
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%A %Ol:%OM %p"
|
||||
|
||||
#: ../js/ui/places.js:178
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "فشل فصْل '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "أعد المحاولة"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "اتّصل ب..."
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "من فضلك اكتب أمرا:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "فشل تنفيذ '%s':"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%OH:%OM"
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "متاح"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "التطبيقات"
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "مشغول"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "المستندات الحديثة"
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "خفي"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "معلومات الحساب..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "تفضيلات النظام..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "أوصد الشاشة"
|
||||
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "بدّل المستخدم"
|
||||
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "اخرج..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "أطفئ..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "انتهى %s من البدء"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "'%s' جاهز"
|
||||
|
||||
#: ../js/ui/workspacesView.js:239
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "تعذّر إضافة مساحة عمل جديدة، لتجاوز أقصى عدد من مساحات العمل."
|
||||
|
||||
#: ../js/ui/workspacesView.js:256
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "لا يمكن حذف مساحة العمل الأولى."
|
||||
|
||||
#: ../src/shell-global.c:979
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "منذ أقل من دقيقة"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:983
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -136,7 +267,7 @@ msgstr[3] "منذ %d دقائق"
|
||||
msgstr[4] "منذ %d دقيقة"
|
||||
msgstr[5] "منذ %d دقيقة"
|
||||
|
||||
#: ../src/shell-global.c:827
|
||||
#: ../src/shell-global.c:988
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -147,7 +278,7 @@ msgstr[3] "منذ %d ساعات"
|
||||
msgstr[4] "منذ %d ساعة"
|
||||
msgstr[5] "منذ %d ساعة"
|
||||
|
||||
#: ../src/shell-global.c:830
|
||||
#: ../src/shell-global.c:993
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -158,7 +289,7 @@ msgstr[3] "منذ %d أيام"
|
||||
msgstr[4] "منذ %d يوما"
|
||||
msgstr[5] "منذ %d يوم"
|
||||
|
||||
#: ../src/shell-global.c:833
|
||||
#: ../src/shell-global.c:998
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -169,67 +300,17 @@ msgstr[3] "منذ %d أسابيع"
|
||||
msgstr[4] "منذ %d أسبوعا"
|
||||
msgstr[5] "منذ %d أسبوع"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "مجهول"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "تعذّر إيصاد الشاشة: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "تعذّر ضبك حافظة الشاشة مؤقتا لتكون شاشة خالية: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "تعذّر الخروج: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "معلومات الحساب..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "الشريط الجانبي"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "تفضيلات النظام..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "أوصد الشاشة"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "بدّل المستخدم"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "اخرج..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "أطفئ..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "مجلد المنزل"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "نظام الملفات"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "ابحث"
|
||||
|
||||
@ -238,10 +319,49 @@ msgstr "ابحث"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%OH:%OM"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "التطبيقات"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "المستندات الحديثة"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "متكرر"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "المزيد"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(انظر الكل)"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "الأماكن"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "نتائج البحث"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "مجهول"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "تعذّر إيصاد الشاشة: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr "تعذّر ضبك حافظة الشاشة مؤقتا لتكون شاشة خالية: %s"
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "تعذّر الخروج: %s"
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "الشريط الجانبي"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "استعرض"
|
||||
|
263
po/bg.po
Normal file
@ -0,0 +1,263 @@
|
||||
# Bulgarian translation of gnome-shell po-file.
|
||||
# Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Ivaylo Valkov <ivaylo@e-valkov.org>, 2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-03-18 13:09+0200\n"
|
||||
"PO-Revision-Date: 2010-03-18 11:30+0200\n"
|
||||
"Last-Translator: Ivaylo Valkov <ivaylo@e-valkov.org>\n"
|
||||
"Language-Team: Bulgarian <dict@fsa-bg.org>\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"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "Обвивка на GNOME"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Управление на прозорци и стартиране на програми"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ПРОГРАМИ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ПРЕДПОЧИТАНИЯ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
msgid "New Window"
|
||||
msgstr "Нов прозорец"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Премахване от „Любими“"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Добавяне в „Любими“"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Довлачете до тук обектите за да ги добавите към „Любими“"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "Програмата „%s“ беше добавена в „Любими“"
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Програмата „%s“ беше премахната от „Любими“"
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Търсене"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
msgid "Searching..."
|
||||
msgstr "Търсене…"
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
msgid "No matching results."
|
||||
msgstr "Няма съвпадения."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:871 ../js/ui/placeDisplay.js:536
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "МЕСТА И УСТРОЙСТВА"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "СКОРО ОТВАРЯНИ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Няма инсталирани разширения"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Включено"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Изключено"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Грешка"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Остаряло"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Преглед на програмния код"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Домашна страница"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Отмяна"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Дейности"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %R"
|
||||
msgstr "%a, %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %H:%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Неуспех при демонтиране на „%s“"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
msgid "Retry"
|
||||
msgstr "Повторен опит"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
msgid "Connect to..."
|
||||
msgstr "Свързване към…"
|
||||
|
||||
#: ../js/ui/runDialog.js:221
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Въведете команда:"
|
||||
|
||||
#: ../js/ui/runDialog.js:344
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Неуспешно изпълнение на „%s“:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Налично"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Заето"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Невидимо"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Информация за настройките на потребителя…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Странична лента"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Системни настройки…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Заключване на екрана"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Смяна на потребител"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Изход…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Изключване на компютъра…"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Програми"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Скоро отваряни документи"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Преди по-малко от минута"
|
||||
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "преди %d минута"
|
||||
msgstr[1] "преди %d минути"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "преди %d час"
|
||||
msgstr[1] "преди %d часа"
|
||||
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "преди %d ден"
|
||||
msgstr[1] "преди %d дни"
|
||||
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "преди %d седмица"
|
||||
msgstr[1] "преди %d седмици"
|
||||
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Домашна папка"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Файлова система"
|
||||
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Търсене"
|
||||
|
||||
#. Translators: the first string is the name of a gvfs
|
||||
#. * method, and the second string is a path. For
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
288
po/cs.po
@ -1,14 +1,14 @@
|
||||
# Czech translation of gnome-shell.
|
||||
# Copyright (C) 2009 the author(s) of gnome-shell.
|
||||
# Copyright (C) 2009, 2010 the author(s) of gnome-shell.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Andre Klapper <ak-47@gmx.net>, 2009.
|
||||
# Petr Kovar <pknbe@volny.cz>, 2009.
|
||||
# Petr Kovar <pknbe@volny.cz>, 2009, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-11-05 18:03+0100\n"
|
||||
"PO-Revision-Date: 2009-11-05 18:03+0100\n"
|
||||
"POT-Creation-Date: 2010-03-29 00:49+0200\n"
|
||||
"PO-Revision-Date: 2010-03-29 00:49+0200\n"
|
||||
"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
|
||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -25,88 +25,177 @@ msgstr "Prostředí GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Správa oken a spouštění aplikací"
|
||||
|
||||
#: ../js/ui/appDisplay.js:332
|
||||
msgid "Frequent"
|
||||
msgstr "Časté"
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:312 ../js/ui/dash.js:855
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLIKACE"
|
||||
|
||||
#: ../js/ui/appDisplay.js:867
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Oblíbené přidáte přetažením sem"
|
||||
#: ../js/ui/appDisplay.js:344
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PŘEDVOLBY"
|
||||
|
||||
#: ../js/ui/appIcon.js:426
|
||||
#: ../js/ui/appDisplay.js:756
|
||||
msgid "New Window"
|
||||
msgstr "Nové okno"
|
||||
|
||||
#: ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:760
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Odstranit z oblíbených"
|
||||
|
||||
#: ../js/ui/appIcon.js:431
|
||||
#: ../js/ui/appDisplay.js:761
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Přidat mezi oblíbené"
|
||||
|
||||
#: ../js/ui/dash.js:267
|
||||
msgid "Find..."
|
||||
msgstr "Najít..."
|
||||
#: ../js/ui/appDisplay.js:1113
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Oblíbené přidáte přetažením sem"
|
||||
|
||||
#: ../js/ui/dash.js:376
|
||||
msgid "More"
|
||||
msgstr "Více"
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s byl přidán mezi oblíbené."
|
||||
|
||||
#: ../js/ui/dash.js:532
|
||||
msgid "(see all)"
|
||||
msgstr "(zobrazit vše)"
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s byl odstraněn z oblíbených."
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:711 ../js/ui/dash.js:773
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLIKACE"
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Najít"
|
||||
|
||||
#: ../js/ui/dash.js:510
|
||||
msgid "Searching..."
|
||||
msgstr "Hledá se..."
|
||||
|
||||
#: ../js/ui/dash.js:524
|
||||
msgid "No matching results."
|
||||
msgstr "Neodpovídá ani jeden z výsledků."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:731
|
||||
msgid "PLACES"
|
||||
msgstr "MÍSTA"
|
||||
#: ../js/ui/dash.js:874 ../js/ui/placeDisplay.js:582
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "MÍSTA A ZAŘÍZENÍ"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:738 ../js/ui/dash.js:783
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "NEDÁVNÉ DOKUMENTY"
|
||||
#: ../js/ui/dash.js:881 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "NEDÁVNÉ POLOŽKY"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:763 ../js/ui/dash.js:947
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "VÝSLEDKY HLEDÁNÍ"
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nejsou nainstalována žádná rozšíření"
|
||||
|
||||
#: ../js/ui/dash.js:778
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PŘEDVOLBY"
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Povoleno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Zakázáno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Chyba"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Neaktuální"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Zobrazit zdroj"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Webová stránka"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Zpět"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:274
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Činnosti"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:491
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %H:%M"
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %R"
|
||||
msgstr "%A, %R"
|
||||
|
||||
#: ../js/ui/places.js:178
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%A, %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Nelze odpojit \"%s\""
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Opakovat"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Připojit se k..."
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Zadejte prosím příkaz:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:376
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Vykonání \"%s\" selhalo:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Přítomen"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Zaneprázdněn"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Neviditelný"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Informace o účtu..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Postranní lišta"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Předvolby systému..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Uzamknout obrazovku"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Přepnout uživatele"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Odhlásit..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Vypnout..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
@ -120,11 +209,21 @@ msgstr "Aplikace"
|
||||
msgid "Recent Documents"
|
||||
msgstr "Nedávné dokumenty"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "Spouštění %s dokončeno"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "Připraveno \"%s\""
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Před méně než minutou"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -132,7 +231,7 @@ msgstr[0] "Před %d minutou"
|
||||
msgstr[1] "Před %d minutami"
|
||||
msgstr[2] "Před %d minutami"
|
||||
|
||||
#: ../src/shell-global.c:827
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -140,7 +239,7 @@ msgstr[0] "Před %d hodinou"
|
||||
msgstr[1] "Před %d hodinami"
|
||||
msgstr[2] "Před %d hodinami"
|
||||
|
||||
#: ../src/shell-global.c:830
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -148,7 +247,7 @@ msgstr[0] "Před %d dnem"
|
||||
msgstr[1] "Před %d dny"
|
||||
msgstr[2] "Před %d dny"
|
||||
|
||||
#: ../src/shell-global.c:833
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -156,67 +255,17 @@ msgstr[0] "Před %d týdnem"
|
||||
msgstr[1] "Před %d týdny"
|
||||
msgstr[2] "Před %d týdny"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Neznámé"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Nelze uzamknout obrazovku: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "Šetřič obrazovky nelze dočasně nastavit na prázdnou obrazovku: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Nelze se odhlásit: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Informace o účtu..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Postranní lišta"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Předvolby systému..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Uzamknout obrazovku"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Přepnout uživatele"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Odhlásit..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Vypnout..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Domovská složka"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Systém souborů"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Hledat"
|
||||
|
||||
@ -225,11 +274,38 @@ msgstr "Hledat"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "Časté"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "Více"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(zobrazit vše)"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "MÍSTA"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "VÝSLEDKY HLEDÁNÍ"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Neznámé"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Nelze uzamknout obrazovku: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr "Šetřič obrazovky nelze dočasně nastavit na prázdnou obrazovku: %s"
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Nelze se odhlásit: %s"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "Procházet"
|
||||
|
||||
|
259
po/da.po
@ -1,14 +1,14 @@
|
||||
# Danish translation of gnome-shell
|
||||
# Copyright (C) 2009 gnome-shell
|
||||
# Copyright (C) 2010 gnome-shell
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Kris Thomsen <lakristho@gmail.com>, 2009.
|
||||
# Kris Thomsen <lakristho@gmail.com>, 2009, 2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-10-21 22:51+0200\n"
|
||||
"PO-Revision-Date: 2009-10-18 17:32+0200\n"
|
||||
"POT-Creation-Date: 2010-02-23 22:07+0100\n"
|
||||
"PO-Revision-Date: 2010-02-11 22:32+0200\n"
|
||||
"Last-Translator: Kris Thomsen <lakristho@gmail.com>\n"
|
||||
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -24,84 +24,166 @@ msgstr "Skal til GNOME"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Vinduehåndtering og åbning af programmer"
|
||||
|
||||
#: ../js/ui/appDisplay.js:332
|
||||
msgid "Frequent"
|
||||
msgstr "Ofte"
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:180 ../js/ui/dash.js:881
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "PROGRAMMER"
|
||||
|
||||
#: ../js/ui/appIcon.js:410
|
||||
#: ../js/ui/appDisplay.js:204
|
||||
msgid "PREFERENCES"
|
||||
msgstr "INDSTILLINGER"
|
||||
|
||||
#: ../js/ui/appDisplay.js:582
|
||||
msgid "New Window"
|
||||
msgstr "Nyt vindue"
|
||||
|
||||
#: ../js/ui/appIcon.js:414
|
||||
#: ../js/ui/appDisplay.js:586
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Fjern fra favoritter"
|
||||
|
||||
#: ../js/ui/appIcon.js:415
|
||||
#: ../js/ui/appDisplay.js:587
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Tilføj til favoritter"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
#: ../js/ui/appDisplay.js:939
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Træk hertil for at tilføje til favoritter"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, fuzzy, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Fjern fra favoritter"
|
||||
|
||||
#: ../js/ui/dash.js:235
|
||||
msgid "Find..."
|
||||
msgstr "Find..."
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "Mere"
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Søger..."
|
||||
|
||||
#: ../js/ui/dash.js:543
|
||||
msgid "(see all)"
|
||||
msgstr "(se alle)"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:725 ../js/ui/dash.js:787
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "PROGRAMMER"
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Ingen matchende resultater."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:745
|
||||
msgid "PLACES"
|
||||
msgstr "STEDER"
|
||||
#: ../js/ui/dash.js:900 ../js/ui/placeDisplay.js:529
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "STEDER & ENHEDER"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:752 ../js/ui/dash.js:797
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "SENESTE DOKUMENTER"
|
||||
#: ../js/ui/dash.js:907 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "SENESTE ELEMENTER"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:777 ../js/ui/dash.js:961
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "SØGERESULTATER"
|
||||
#: ../js/ui/lookingGlass.js:356
|
||||
msgid "No extensions installed"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/dash.js:792
|
||||
msgid "PREFERENCES"
|
||||
msgstr "INDSTILLINGER"
|
||||
#: ../js/ui/lookingGlass.js:393
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:395
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:397
|
||||
msgid "Error"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:399
|
||||
msgid "Out of date"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:424
|
||||
msgid "View Source"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:430
|
||||
msgid "Web Page"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/overview.js:92
|
||||
msgid "Undo"
|
||||
msgstr ""
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:274
|
||||
#: ../js/ui/panel.js:336
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:491
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:560
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:563
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#: ../js/ui/places.js:178
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
msgid "Connect to..."
|
||||
msgstr "Forbind til..."
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:245
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Indtast en kommando:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:361
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Kørsel af \"%s\" mislykkedes:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Kontoinformation..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Sidebjælke"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Systemindstillinger..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lås skærm"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Skift bruger"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Log ud..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Luk ned..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
@ -115,99 +197,49 @@ msgstr "Programmer"
|
||||
msgid "Recent Documents"
|
||||
msgstr "Seneste dokumenter"
|
||||
|
||||
#: ../src/shell-global.c:812
|
||||
#: ../src/shell-global.c:954
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Mindre end et minut siden"
|
||||
|
||||
#: ../src/shell-global.c:815
|
||||
#: ../src/shell-global.c:958
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d minut siden"
|
||||
msgstr[1] "%d minutter siden"
|
||||
|
||||
#: ../src/shell-global.c:818
|
||||
#: ../src/shell-global.c:963
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d time siden"
|
||||
msgstr[1] "%d timer siden"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../src/shell-global.c:968
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d dag siden"
|
||||
msgstr[1] "%d dage siden"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:973
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d uge siden"
|
||||
msgstr[1] "%d uger siden"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Ukendt"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Kan ikke låse skærm: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "Kan ikke midlertidigt sætte pauseskærm til blank skærm: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Kan ikke logge ud: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Kontoinformation..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Sidebjælke"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Systemindstillinger..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lås skærm"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Skift bruger"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Log ud..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Luk ned..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Hjemmemappe"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Filsystem"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Søg"
|
||||
|
||||
@ -216,11 +248,38 @@ msgstr "Søg"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "Ofte"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "Mere"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(se alle)"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "STEDER"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "SØGERESULTATER"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Ukendt"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Kan ikke låse skærm: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr "Kan ikke midlertidigt sætte pauseskærm til blank skærm: %s"
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Kan ikke logge ud: %s"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "Gennemse"
|
||||
|
||||
|
388
po/de.po
@ -2,24 +2,28 @@
|
||||
# Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
#
|
||||
# workspace - Arbeitsfläche
|
||||
#
|
||||
# Hendrik Brandt <heb@gnome-de.org>, 2009.
|
||||
# Hendrik Richter <hendrikr@gnome.org>, 2009.
|
||||
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009.
|
||||
# Mario Blättermann <mariobl@gnome.org>, 2009.
|
||||
# Mario Blättermann <mariobl@gnome.org>, 2009, 2010.
|
||||
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&component=general\n"
|
||||
"POT-Creation-Date: 2009-10-16 20:05+0000\n"
|
||||
"PO-Revision-Date: 2009-10-17 23:37+0200\n"
|
||||
"Last-Translator: Christian Kirbach <Christian.Kirbach@googlemail.com>\n"
|
||||
"Language-Team: German <gnome-de@gnome.org>\n"
|
||||
"POT-Creation-Date: 2010-05-17 18:24+0000\n"
|
||||
"PO-Revision-Date: 2010-05-18 22:06+0100\n"
|
||||
"Last-Translator: Mario Blättermann <mariobl@gnome.org>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\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-Poedit-Language: German\n"
|
||||
"X-Poedit-Country: GERMANY\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
@ -29,192 +33,307 @@ msgstr "GNOME-Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Fenster verwalten und Anwendungen starten"
|
||||
|
||||
#: ../js/ui/appDisplay.js:335
|
||||
msgid "Frequent"
|
||||
msgstr "Häufig"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Uhr"
|
||||
|
||||
#: ../js/ui/appIcon.js:407
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Die Uhr im Panel anpassen"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
#| msgid "<b>Clock Format</b>"
|
||||
msgid "Clock Format"
|
||||
msgstr "Uhr-Format"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Uhr-Einstellungen"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
#| msgid "<b>Panel Display</b>"
|
||||
msgid "Panel Display"
|
||||
msgstr "Panel-Anzeige"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "_Sekunden anzeigen"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "_Datum anzeigen"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "_12-Stunden-Format"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24-Stunden-Format"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ANWENDUNGEN"
|
||||
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "EINSTELLUNGEN"
|
||||
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "Neues Fenster"
|
||||
|
||||
#: ../js/ui/appIcon.js:420
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Aus Favoriten entfernen"
|
||||
|
||||
#: ../js/ui/appIcon.js:421
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Zu Favoriten hinzufügen"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
msgid "Find..."
|
||||
msgstr "Suchen …"
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Hier ablegen, um zu Favoriten hinzuzufügen"
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "Mehr"
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
|
||||
|
||||
#: ../js/ui/dash.js:543
|
||||
msgid "(see all)"
|
||||
msgstr "(alle sehen)"
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s wurde aus Ihren Favoriten entfernt"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:725 ../js/ui/dash.js:787
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ANWENDUNGEN"
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Suchen"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Suche läuft …"
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Keine passenden Ergebnisse."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:745
|
||||
msgid "PLACES"
|
||||
msgstr "ORTE"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "ORTE UND GERÄTE"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:752 ../js/ui/dash.js:797
|
||||
msgid "RECENT DOCUMENTS"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ZULETZT GEÖFFNETE DOKUMENTE"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:777 ../js/ui/dash.js:961
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "SUCHERGEBNISSE"
|
||||
#: ../js/ui/lookingGlass.js:466
|
||||
msgid "No extensions installed"
|
||||
msgstr "Keine Erweiterungen installiert"
|
||||
|
||||
#: ../js/ui/dash.js:792
|
||||
msgid "PREFERENCES"
|
||||
msgstr "EINSTELLUNGEN"
|
||||
#: ../js/ui/lookingGlass.js:503
|
||||
msgid "Enabled"
|
||||
msgstr "Aktiviert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:505
|
||||
msgid "Disabled"
|
||||
msgstr "Deaktiviert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:507
|
||||
msgid "Error"
|
||||
msgstr "Fehler"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:509
|
||||
msgid "Out of date"
|
||||
msgstr "Veraltet"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:534
|
||||
msgid "View Source"
|
||||
msgstr "Quelle zeigen"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:540
|
||||
msgid "Web Page"
|
||||
msgstr "Webseite"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "Rückgängig"
|
||||
|
||||
#: ../js/ui/panel.js:535
|
||||
msgid "Quit"
|
||||
msgstr "Beenden"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:273
|
||||
#: ../js/ui/panel.js:740
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitäten"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:465
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:955
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a, %e. %b, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:956
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a, %e. %b, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:960
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:961
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:968
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a, %e. %b, %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:969
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a, %e. %b, %H:%M"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:973
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:974
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#: ../js/ui/places.js:178
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "»%s« konnte nicht ausgehängt werden"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Erneut versuchen"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Verbinden mit …"
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Bitte geben Sie einen Befehl ein:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Ausführung von »%s« ist gescheitert:"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:162
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Verfügbar"
|
||||
|
||||
#: ../js/ui/widget.js:316
|
||||
msgid "Applications"
|
||||
msgstr "Anwendungen"
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Beschäftigt"
|
||||
|
||||
#: ../js/ui/widget.js:341
|
||||
msgid "Recent Documents"
|
||||
msgstr "Zuletzt geöffnete Dokumente"
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Unsichtbar"
|
||||
|
||||
#: ../src/shell-global.c:812
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Benutzerinformationen …"
|
||||
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Systemeinstellungen …"
|
||||
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bildschirm sperren"
|
||||
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Benutzer wechseln"
|
||||
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Abmelden …"
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "Ausschalten …"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "Start von %s ist abgeschlossen"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "»%s« ist bereit"
|
||||
|
||||
#: ../js/ui/workspacesView.js:239
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Es kann keine weitere Arbeitsfläche hinzugefügt werden, weil das Maximum an "
|
||||
"Arbeitsflächen erreicht worden ist."
|
||||
|
||||
#: ../js/ui/workspacesView.js:256
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Die erste Arbeitsfläche kann nicht entfernt werden."
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Vor weniger als einer Minute"
|
||||
|
||||
#: ../src/shell-global.c:815
|
||||
#: ../src/shell-global.c:980
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "Vor %d Minute"
|
||||
msgstr[1] "Vor %d Minuten"
|
||||
|
||||
#: ../src/shell-global.c:818
|
||||
#: ../src/shell-global.c:985
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "Vor %d Stunde"
|
||||
msgstr[1] "Vor %d Stunden"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../src/shell-global.c:990
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "Vor %d Tag"
|
||||
msgstr[1] "Vor %d Tagen"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:995
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "Vor %d Woche"
|
||||
msgstr[1] "Vor %d Wochen"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Bildschirm kann nicht gesperrt werden: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr ""
|
||||
"Der Bildschirmschoner kann vorübergehend nicht auf einen leeren Schirm "
|
||||
"gesetzt werden: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Abmelden ist nicht möglich: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Benutzerinformationen …"
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Seitenleiste"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Systemeinstellungen …"
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bildschirm sperren"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Benutzer wechseln"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Abmelden …"
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Ausschalten …"
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Persönlicher Ordner"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Dateisystem"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Suchen"
|
||||
|
||||
@ -223,11 +342,52 @@ msgstr "Suchen"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Seitenleiste"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Anwendungen"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "Zuletzt geöffnete Dokumente"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "Häufig"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "Mehr"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(alle sehen)"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "ORTE"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "SUCHERGEBNISSE"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Unbekannt"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Bildschirm kann nicht gesperrt werden: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr ""
|
||||
#~ "Der Bildschirmschoner kann vorübergehend nicht auf einen leeren Schirm "
|
||||
#~ "gesetzt werden: %s"
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Abmelden ist nicht möglich: %s"
|
||||
|
||||
#~ msgid "Find apps or documents"
|
||||
#~ msgstr "Anwendungen oder Dokumente suchen"
|
||||
|
||||
|
312
po/el.po
@ -7,10 +7,10 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell.po.master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=general\n"
|
||||
"POT-Creation-Date: 2009-10-04 08:03+0000\n"
|
||||
"PO-Revision-Date: 2009-10-04 10:25+0200\n"
|
||||
"Last-Translator: Jennie Petoumenou <epetoumenou@gmail.com>\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-03-28 10:46+0300\n"
|
||||
"PO-Revision-Date: 2010-03-28 10:53+0200\n"
|
||||
"Last-Translator: Kostas Papadimas <pkst@gnome.org>\n"
|
||||
"Language-Team: Greek <<team AT BLOCKSPAM gnome DOT gr>>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -26,151 +26,244 @@ msgstr "Κέλυφος GNOME"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Διαχείριση παραθύρων και εκκίνηση εφαρμογών"
|
||||
|
||||
#. left side
|
||||
#: ../js/ui/panel.js:271
|
||||
msgid "Activities"
|
||||
msgstr "Δραστηριότητες"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:461
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
msgid "Find..."
|
||||
msgstr "Εύρεση..."
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "Περισσότερα"
|
||||
|
||||
#: ../js/ui/dash.js:543
|
||||
msgid "(see all)"
|
||||
msgstr "(εμφάνιση όλων)"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:763 ../js/ui/dash.js:825
|
||||
#: ../js/ui/appDisplay.js:312
|
||||
#: ../js/ui/dash.js:855
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ΕΦΑΡΜΟΓΕΣ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:344
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ΠΡΟΤΙΜΗΣΕΙΣ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:756
|
||||
msgid "New Window"
|
||||
msgstr "Νέο παράθυρο"
|
||||
|
||||
#: ../js/ui/appDisplay.js:760
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Αφαίρεση από τα αγαπημένα"
|
||||
|
||||
#: ../js/ui/appDisplay.js:761
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Προσθήκη στα αγαπημένα"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1113
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Σύρετε εδώ για να προσθέσετε αγαπημένα"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s προστέθηκε στα αγαπημένα σας"
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s αφαιρέθηκε από τα αγαπημένα σας"
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Εύρεση"
|
||||
|
||||
#: ../js/ui/dash.js:510
|
||||
msgid "Searching..."
|
||||
msgstr "Αναζήτηση..."
|
||||
|
||||
#: ../js/ui/dash.js:524
|
||||
msgid "No matching results."
|
||||
msgstr "Δεν βρέθηκαν ταιριάσματα."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:783
|
||||
msgid "PLACES"
|
||||
msgstr "ΤΟΠΟΘΕΣΙΕΣ"
|
||||
#: ../js/ui/dash.js:874
|
||||
#: ../js/ui/placeDisplay.js:582
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "ΤΟΠΟΘΕΣΙΕΣ $ ΣΥΣΚΕΥΕΣ"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:790 ../js/ui/dash.js:835
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "ΠΡΟΣΦΑΤΑ ΕΓΓΡΑΦΑ"
|
||||
#: ../js/ui/dash.js:881
|
||||
#: ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ΠΡΟΣΦΑΤΑ ΑΝΤΙΚΕΙΜΕΝΑ"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:815 ../js/ui/dash.js:955
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "ΑΠΟΤΕΛΕΣΜΑΤΑ ΑΝΑΖΗΤΗΣΗΣ"
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Δεν υπάρχουν εγκατεστημένες επεκτάσεις"
|
||||
|
||||
#: ../js/ui/dash.js:830
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ΠΡΟΤΙΜΗΣΕΙΣ"
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Σφάλμα"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Προβολή πηγής"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Ιστοσελίδα"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Αναίρεση"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Δραστηριότητες"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Αποτυχία αποπροσάρτησης '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Προσπάθεια ξανά"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Σύνδεση σε..."
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Παρακαλώ εισάγετε μία εντολή:"
|
||||
|
||||
#: ../src/shell-global.c:812
|
||||
#: ../js/ui/runDialog.js:376
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Η εκτέλεση του '%s' απέτυχε:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Διαθέσιμος"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Απασχολημένος"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Αόρατος"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Πληροφορίες λογαριασμού..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Πλευρική στήλη"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Προστιμήσεις συστήματος..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Κλείδωμα οθόνης"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Αλλαγή χρήστη"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Αποσύνδεση..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Τερματισμός..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Εφαρμογές"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Πρόσφατα έγγραφα"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s ολοκλήρωσε την εκκίνηση "
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Λιγότερο από ένα λεπτό πριν"
|
||||
|
||||
#: ../src/shell-global.c:815
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d λεπτό πριν"
|
||||
msgstr[1] "%d λεπτά πριν"
|
||||
|
||||
#: ../src/shell-global.c:818
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d ώρα πριν"
|
||||
msgstr[1] "%d ώρες πριν"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d ημέρα πριν"
|
||||
msgstr[1] "%d ημέρες πριν"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d εβδομάδα πριν"
|
||||
msgstr[1] "%d εβδομάδες πριν"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Άγνωστο"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Αδύνατο το κλείδωμα της οθόνης: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "Δεν είναι δυνατή η προσωρινή ρύθμιση της προστασίας οθόνης σε κενή οθόνη: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Αδύνατη η αποσύνδεση: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Πληροφορίες λογαριασμού..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Πλευρική στήλη"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Προστιμήσεις συστήματος..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Κλείδωμα οθόνης"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Αλλαγή χρήστη"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Αποσύνδεση..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Τερματισμός..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Προσωπικός φάκελος"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Σύστημα αρχείων"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Αναζήτηση"
|
||||
|
||||
@ -179,8 +272,27 @@ msgstr "Αναζήτηση"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "Περισσότερα"
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(εμφάνιση όλων)"
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "ΤΟΠΟΘΕΣΙΕΣ"
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "ΑΠΟΤΕΛΕΣΜΑΤΑ ΑΝΑΖΗΤΗΣΗΣ"
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Άγνωστο"
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Αδύνατο το κλείδωμα της οθόνης: %s"
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr ""
|
||||
#~ "Δεν είναι δυνατή η προσωρινή ρύθμιση της προστασίας οθόνης σε κενή οθόνη: "
|
||||
#~ "%s"
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Αδύνατη η αποσύνδεση: %s"
|
||||
|
||||
|
308
po/en_GB.po
@ -2,20 +2,22 @@
|
||||
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Philip Withnall <philip@tecnocode.co.uk>, 2009.
|
||||
#
|
||||
# Bruce Cowan <bcowan@fastmail.co.uk>, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&component=general\n"
|
||||
"POT-Creation-Date: 2009-09-12 12:41+0000\n"
|
||||
"PO-Revision-Date: 2009-09-12 12:41+0000\n"
|
||||
"Last-Translator: Philip Withnall <philip@tecnocode.co.uk>\n"
|
||||
"Language-Team: British English <en_GB@li.org>\n"
|
||||
"POT-Creation-Date: 2010-03-20 22:31+0000\n"
|
||||
"PO-Revision-Date: 2010-03-20 22:32+0100\n"
|
||||
"Last-Translator: Bruce Cowan <bcowan@fastmail.co.uk>\n"
|
||||
"Language-Team: British English <en@li.org>\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.5.2\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
@ -25,151 +27,231 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Window management and application launching"
|
||||
|
||||
#. left side
|
||||
#: ../js/ui/panel.js:269
|
||||
msgid "Activities"
|
||||
msgstr "Activities"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:452
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
msgid "Find..."
|
||||
msgstr "Find…"
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "Browse"
|
||||
msgstr "Browse"
|
||||
|
||||
#: ../js/ui/dash.js:536
|
||||
msgid "(see all)"
|
||||
msgstr "(see all)"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:753 ../js/ui/dash.js:809
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APPLICATIONS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERENCES"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
msgid "New Window"
|
||||
msgstr "New Window"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Remove from Favourites"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Add to Favourites"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Drag here to add favourites"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s has been added to your favourites."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s has been removed from your favourites."
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Find"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
msgid "Searching..."
|
||||
msgstr "Searching…"
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
msgid "No matching results."
|
||||
msgstr "No matching results."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:773
|
||||
msgid "PLACES"
|
||||
msgstr "PLACES"
|
||||
#: ../js/ui/dash.js:871 ../js/ui/placeDisplay.js:579
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "PLACES & DEVICES"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:780 ../js/ui/dash.js:819
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "RECENT DOCUMENTS"
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "RECENT ITEMS"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:799 ../js/ui/dash.js:931
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "SEARCH RESULTS"
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "No extensions installed"
|
||||
|
||||
#: ../js/ui/dash.js:814
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERENCES"
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Enabled"
|
||||
|
||||
#: ../js/ui/runDialog.js:90
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Disabled"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Out of date"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "View Source"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Web Page"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Undo"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Activities"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Failed to unmount '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
msgid "Retry"
|
||||
msgstr "Retry"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
msgid "Connect to..."
|
||||
msgstr "Connect to…"
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Please enter a command:"
|
||||
|
||||
#: ../src/shell-global.c:799
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Execution of '%s' failed:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Available"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Busy"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Invisible"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Account Information…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Sidebar"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "System Preferences…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lock Screen"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Switch User"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Log Out…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Shut Down…"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Applications"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Recent Documents"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Less than a minute ago"
|
||||
|
||||
#: ../src/shell-global.c:802
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d minute ago"
|
||||
msgstr[1] "%d minutes ago"
|
||||
|
||||
#: ../src/shell-global.c:805
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d hour ago"
|
||||
msgstr[1] "%d hours ago"
|
||||
|
||||
#: ../src/shell-global.c:808
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d day ago"
|
||||
msgstr[1] "%d days ago"
|
||||
|
||||
#: ../src/shell-global.c:811
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d week ago"
|
||||
msgstr[1] "%d weeks ago"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Unknown"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Can't lock screen: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "Can't temporarily set screensaver to blank screen: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Can't logout: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Account Information…"
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Sidebar"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "System Preferences…"
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lock Screen"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Switch User"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Log Out…"
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Shut Down…"
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Home Folder"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "File System"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Search"
|
||||
|
||||
@ -178,7 +260,31 @@ msgstr "Search"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "Browse"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(see all)"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "PLACES"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "SEARCH RESULTS"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Unknown"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Can't lock screen: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr "Can't temporarily set screensaver to blank screen: %s"
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Can't logout: %s"
|
||||
|
292
po/es.po
@ -1,15 +1,15 @@
|
||||
# Spanish translation of gnome-shell.
|
||||
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010.
|
||||
#
|
||||
# Jorge González <jorgegonz@svn.gnome.org>, 2009.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&component=general\n"
|
||||
"POT-Creation-Date: 2009-12-18 15:06+0000\n"
|
||||
"PO-Revision-Date: 2009-12-19 14:41+0100\n"
|
||||
"POT-Creation-Date: 2010-05-19 16:31+0000\n"
|
||||
"PO-Revision-Date: 2010-05-25 18:28+0200\n"
|
||||
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
|
||||
"Language-Team: Español <gnome-es-list@gnome.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -25,115 +25,286 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Gestión de ventanas e inicio de aplicaciones"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Reloj"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Personalizar el reloj del panel"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
#| msgid "<b>Clock Format</b>"
|
||||
msgid "Clock Format"
|
||||
msgstr "Formato del reloj"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Preferencias del reloj"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
#| msgid "<b>Panel Display</b>"
|
||||
msgid "Panel Display"
|
||||
msgstr "Panel de visualización"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Mostrar los segu_ndos"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Mostrar la _fecha"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "Formato _12 horas"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "Formato _24 horas"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:852
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLICACIONES"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERENCIAS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:707 ../js/ui/appIcon.js:425
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "Ventana nueva"
|
||||
|
||||
#: ../js/ui/appDisplay.js:711 ../js/ui/appIcon.js:429
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Quitar de los favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:712 ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Añadir a los favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1064
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Arrastrar aquí para añadir a los favoritos"
|
||||
|
||||
#: ../js/ui/dash.js:240
|
||||
msgid "Find..."
|
||||
msgstr "Buscar…"
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "Se ha añadido %s a sus favoritos."
|
||||
|
||||
#: ../js/ui/dash.js:437
|
||||
#| msgid "Search"
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Se ha quitado %s de sus favoritos."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Buscar"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Buscando…"
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "No se encontró ningún resultado coincidente."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:872 ../js/ui/placeDisplay.js:471
|
||||
msgid "PLACES"
|
||||
msgstr "LUGARES"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "LUGARES Y DISPOSITIVOS"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:879
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "DOCUMENTOS RECIENTES"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ELEMENTOS RECIENTES"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:466
|
||||
msgid "No extensions installed"
|
||||
msgstr "No hay extensiones instaladas"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:503
|
||||
msgid "Enabled"
|
||||
msgstr "Activado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:505
|
||||
msgid "Disabled"
|
||||
msgstr "Desactivado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:507
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:509
|
||||
msgid "Out of date"
|
||||
msgstr "Caducado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:534
|
||||
msgid "View Source"
|
||||
msgstr "Ver fuente"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:540
|
||||
msgid "Web Page"
|
||||
msgstr "Página web"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "Deshacer"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:227
|
||||
#: ../js/ui/panel.js:774
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:440
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:989
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e de %b, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:990
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %e de %b, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:994
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:995
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1002
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e de %b, %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1003
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %e de %b, %H:%M"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1007
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1008
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:99
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Falló al desmontar «%s»"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Reintentar"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Conectar a…"
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Introduzca un comando:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Falló la ejecución de «%s»:"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Disponible"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Aplicaciones"
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Ocupado"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documentos recientes"
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Invisible"
|
||||
|
||||
#: ../src/shell-global.c:826
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Información de la cuenta…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferencias del sistema…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bloquear la pantalla"
|
||||
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Cambiar de usuario"
|
||||
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Salir…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "Apagar…"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s finalizó su lanzamiento"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "«%s» está preparado"
|
||||
|
||||
#: ../js/ui/workspacesView.js:239
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"No se puede añadir un área de trabajo nueva porque se ha llegado al límite "
|
||||
"de áreas de trabajo."
|
||||
|
||||
#: ../js/ui/workspacesView.js:256
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "No se puede quitar el primer área de trabajo."
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Hace menos de un minuto"
|
||||
|
||||
#: ../src/shell-global.c:829
|
||||
#: ../src/shell-global.c:980
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "Hace %d minuto"
|
||||
msgstr[1] "Hace %d minutos"
|
||||
|
||||
#: ../src/shell-global.c:832
|
||||
#: ../src/shell-global.c:985
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "Hace %d hora"
|
||||
msgstr[1] "Hace %d horas"
|
||||
|
||||
#: ../src/shell-global.c:835
|
||||
#: ../src/shell-global.c:990
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "Hace %d día"
|
||||
msgstr[1] "Hace %d días"
|
||||
|
||||
#: ../src/shell-global.c:838
|
||||
#: ../src/shell-global.c:995
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -164,6 +335,24 @@ msgstr "Buscar"
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Quit"
|
||||
#~ msgstr "Salir"
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Barra lateral"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Aplicaciones"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "Documentos recientes"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "LUGARES"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "Frecuentes"
|
||||
|
||||
@ -190,27 +379,6 @@ msgstr "%1$s: %2$s"
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "No se puede salir de la sesión: %s"
|
||||
|
||||
#~ msgid "Account Information..."
|
||||
#~ msgstr "Información de la cuenta…"
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Barra lateral"
|
||||
|
||||
#~ msgid "System Preferences..."
|
||||
#~ msgstr "Preferencias del sistema…"
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "Bloquear la pantalla"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "Cambiar de usuario"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "Salir…"
|
||||
|
||||
#~ msgid "Shut Down..."
|
||||
#~ msgstr "Apagar…"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "Examine"
|
||||
|
||||
|
257
po/fi.po
@ -1,14 +1,14 @@
|
||||
# gnome-shell Finnish translation
|
||||
# Copyright (C) 2009 Timo Jyrinki
|
||||
# Copyright (C) 2009-2010 Timo Jyrinki
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Timo Jyrinki <timo.jyrinki@iki.fi>, 2009.
|
||||
# Timo Jyrinki <timo.jyrinki@iki.fi>, 2009-2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-11-04 11:16+0200\n"
|
||||
"PO-Revision-Date: 2009-11-04 11:16+0200\n"
|
||||
"POT-Creation-Date: 2010-03-01 20:24+0200\n"
|
||||
"PO-Revision-Date: 2010-03-01 20:27+0200\n"
|
||||
"Last-Translator: Timo Jyrinki <timo.jyrinki@iki.fi>\n"
|
||||
"Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -24,87 +24,165 @@ msgstr ""
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Ikkunanhallinta ja sovelluksien käynnistäminen"
|
||||
|
||||
#: ../js/ui/appDisplay.js:332
|
||||
msgid "Frequent"
|
||||
msgstr "Usein käytetyt"
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:180 ../js/ui/dash.js:881
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "SOVELLUKSET"
|
||||
|
||||
#: ../js/ui/appDisplay.js:867
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Raahaa tähän lisätäksesi suosikkeihin"
|
||||
#: ../js/ui/appDisplay.js:204
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ASETUKSET"
|
||||
|
||||
#: ../js/ui/appIcon.js:426
|
||||
#: ../js/ui/appDisplay.js:582
|
||||
msgid "New Window"
|
||||
msgstr "Uusi ikkuna"
|
||||
|
||||
#: ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:586
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Poista suosikeista"
|
||||
|
||||
#: ../js/ui/appIcon.js:431
|
||||
#: ../js/ui/appDisplay.js:587
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Lisää suosikkeihin"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
#: ../js/ui/appDisplay.js:939
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Raahaa tähän lisätäksesi suosikkeihin"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s on lisätty suosikkeihin."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s on poistettu suosikeista."
|
||||
|
||||
#: ../js/ui/dash.js:235
|
||||
msgid "Find..."
|
||||
msgstr "Etsi..."
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "Lisää"
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Haetaan..."
|
||||
|
||||
#: ../js/ui/dash.js:543
|
||||
msgid "(see all)"
|
||||
msgstr "(näytä kaikki)"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:725 ../js/ui/dash.js:787
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "SOVELLUKSET"
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Ei tuloksia."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:745
|
||||
msgid "PLACES"
|
||||
msgstr "SIJAINNIT"
|
||||
#: ../js/ui/dash.js:900 ../js/ui/placeDisplay.js:529
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "SIJAINNIT JA LAITTEET"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:752 ../js/ui/dash.js:797
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "VIIMEISIMMÄT ASIAKIRJAT"
|
||||
#: ../js/ui/dash.js:907 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "VIIMEISIMMÄT"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:777 ../js/ui/dash.js:961
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "HAKUTULOKSET"
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Laajennuksia ei asennettu"
|
||||
|
||||
#: ../js/ui/dash.js:792
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ASETUKSET"
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Käytössä"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Ei käytössä"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Virhe"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Ei ajan tasalla"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Näytä lähde"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "WWW-sivu"
|
||||
|
||||
#: ../js/ui/overview.js:92
|
||||
msgid "Undo"
|
||||
msgstr "Kumoa"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:274
|
||||
#: ../js/ui/panel.js:399
|
||||
msgid "Activities"
|
||||
msgstr "Toiminnot"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:491
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:623
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:626
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %I.%M"
|
||||
|
||||
#: ../js/ui/places.js:178
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
msgid "Connect to..."
|
||||
msgstr "Yhdistä..."
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:220
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Syötä komento:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:328
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr ""
|
||||
msgstr "”%s” suorittaminen epäonnistui:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Tavoitettavissa"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Kiireinen"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Näkymätön"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Käyttäjätilin tiedot..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Sivupalkki"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Järjestelmän asetukset"
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lukitse näyttö"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Vaihda käyttäjää"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Kirjaudu ulos..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Sammuta..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
@ -119,99 +197,49 @@ msgstr "Sovellukset"
|
||||
msgid "Recent Documents"
|
||||
msgstr "Viimeisimmät asiakirjat"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Alle minuutti sitten"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d minuutti sitten"
|
||||
msgstr[1] "%d minuuttia sitten"
|
||||
|
||||
#: ../src/shell-global.c:827
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d tunti sitten"
|
||||
msgstr[1] "%d tuntia sitten"
|
||||
|
||||
#: ../src/shell-global.c:830
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d päivä sitten"
|
||||
msgstr[1] "%d päivää sitten"
|
||||
|
||||
#: ../src/shell-global.c:833
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d viikko sitten"
|
||||
msgstr[1] "%d viikkoa sitten"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Tuntematon"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Näyttöä ei voi lukita: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Käyttäjätilin tiedot..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Sivupalkki"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Järjestelmän asetukset"
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lukitse näyttö"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Vaihda käyttäjää"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Kirjaudu ulos..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Sammuta..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Kotikansio"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Tiedostojärjestelmä"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Haku"
|
||||
|
||||
@ -220,7 +248,28 @@ msgstr "Haku"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "Usein käytetyt"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "Lisää"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(näytä kaikki)"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "SIJAINNIT"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "HAKUTULOKSET"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Tuntematon"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Näyttöä ei voi lukita: %s"
|
||||
|
345
po/fr.po
@ -1,17 +1,19 @@
|
||||
# French translations for gnome-shell package.
|
||||
# Copyright (C) 2009 THE gnome-shell'S COPYRIGHT HOLDER
|
||||
# Copyright (C) 2009-2010 Listed translators
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
#
|
||||
# Mathieu Bridon <bochecha@fedoraproject.org>, 2009.
|
||||
# Mathieu Bridon <bochecha@fedoraproject.org>, 2009
|
||||
# Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>, 2010
|
||||
# Claude Paroz <claude@2xlibre.net>, 2010
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master fr\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&component=general\n"
|
||||
"POT-Creation-Date: 2009-11-13 17:44+0000\n"
|
||||
"PO-Revision-Date: 2009-12-05 16:43+0100\n"
|
||||
"Last-Translator: Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>\n"
|
||||
"POT-Creation-Date: 2010-05-15 22:41+0000\n"
|
||||
"PO-Revision-Date: 2010-03-09 22:55+0100\n"
|
||||
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
|
||||
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -26,183 +28,305 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Gestion des fenêtres et lancement des applications"
|
||||
|
||||
#: ../js/ui/appDisplay.js:696
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Glisser ici pour ajouter aux favoris"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Horloge"
|
||||
|
||||
#: ../js/ui/appIcon.js:425
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Personnaliser l'horloge du tableau de bord"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Format de l'horloge"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Panel Display"
|
||||
msgstr "Affichage dans le tableau de bord"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Préférences de l'horloge"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Afficher les _secondes"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Afficher la _date"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "Format _12 heures"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "Format _24 heures"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APPLICATIONS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PRÉFÉRENCES"
|
||||
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "Nouvelle fenêtre"
|
||||
|
||||
#: ../js/ui/appIcon.js:429
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Enlever des favoris"
|
||||
|
||||
#: ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Ajouter aux favoris"
|
||||
|
||||
#: ../js/ui/dash.js:237
|
||||
msgid "Find..."
|
||||
msgstr "Rechercher..."
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Glisser ici pour ajouter aux favoris"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:656 ../js/ui/dash.js:718
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APPLICATIONS"
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s a été ajouté à vos favoris."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s a été supprimé de vos favoris."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Rechercher"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Recherche en cours..."
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Aucun résultat correspondant."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:676 ../js/ui/dash.js:733
|
||||
msgid "PLACES"
|
||||
msgstr "RACCOURCIS"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "RACCOURCIS et PÉRIPHÉRIQUES"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:683 ../js/ui/dash.js:728
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "DOCUMENTS RÉCENTS"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ÉLÉMENTS RÉCENTS"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:708 ../js/ui/dash.js:898
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "RÉSULTATS DE LA RECHERCHE"
|
||||
#: ../js/ui/lookingGlass.js:354
|
||||
msgid "No extensions installed"
|
||||
msgstr "Aucune extension installée"
|
||||
|
||||
#: ../js/ui/dash.js:723
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PRÉFÉRENCES"
|
||||
#: ../js/ui/lookingGlass.js:391
|
||||
msgid "Enabled"
|
||||
msgstr "Activé"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:393
|
||||
msgid "Disabled"
|
||||
msgstr "Désactivé"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:395
|
||||
msgid "Error"
|
||||
msgstr "Erreur"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:397
|
||||
msgid "Out of date"
|
||||
msgstr "Périmé"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:422
|
||||
msgid "View Source"
|
||||
msgstr "Afficher la source"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:428
|
||||
msgid "Web Page"
|
||||
msgstr "Page Web"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "Annuler"
|
||||
|
||||
#: ../js/ui/panel.js:535
|
||||
msgid "Quit"
|
||||
msgstr "Quitter"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:274
|
||||
#: ../js/ui/panel.js:740
|
||||
msgid "Activities"
|
||||
msgstr "Activités"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:491
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %H:%M"
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:955
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e %b, %R:%S"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:84
|
||||
#: ../js/ui/panel.js:956
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %e %b, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:960
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:961
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:968
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:969
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %e %b, %l:%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:973
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:974
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Impossible de monter « %s »"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Réessayer"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Connexion à..."
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Veuillez saisir une commande :"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Exécution de « %s » impossible :"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Disponible"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Applications"
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Occupé"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documents récents"
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Invisible"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Informations personnelles..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Préférences du système..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Verrouiller l'écran"
|
||||
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Changer d'utilisateur"
|
||||
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Fermer la session..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "Éteindre..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "Lancement de %s terminé"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "« %s » est prêt"
|
||||
|
||||
#: ../js/ui/workspacesView.js:239
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Impossible d'ajouter un espace de travail car le nombre maximum d'espaces de "
|
||||
"travail est atteint."
|
||||
|
||||
#: ../js/ui/workspacesView.js:256
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Impossible de supprimer le premier espace de travail."
|
||||
|
||||
#: ../src/shell-global.c:979
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Il y a moins d'une minute"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:983
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "Il y a %d minute"
|
||||
msgstr[1] "Il y a %d minutes"
|
||||
|
||||
#: ../src/shell-global.c:827
|
||||
#: ../src/shell-global.c:988
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "Il y a %d heure"
|
||||
msgstr[1] "Il y a %d heures"
|
||||
|
||||
#: ../src/shell-global.c:830
|
||||
#: ../src/shell-global.c:993
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "Il y a %d jour"
|
||||
msgstr[1] "Il y a %d jours"
|
||||
|
||||
#: ../src/shell-global.c:833
|
||||
#: ../src/shell-global.c:998
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "Il y a %d semaine"
|
||||
msgstr[1] "Il y a %d semaines"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Inconnu"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Impossible de verrouiller l'écran : %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr ""
|
||||
"Impossible de régler temporairement l'écran de veille sur un écran vide : %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Impossible de fermer la session : %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Informations personnelles..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Barre latérale"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Préférences du système..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Verrouiller l'écran"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Changer d'utilisateur"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Fermer la session..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Éteindre..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Dossier personnel"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Système de fichiers"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Recherche"
|
||||
|
||||
@ -211,10 +335,7 @@ msgstr "Recherche"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s : %2$s"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "Parcourir"
|
||||
|
223
po/gl.po
@ -1,17 +1,17 @@
|
||||
# Galician translation for gnome-shell.
|
||||
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Fran Diéguez <fran.dieguez@mabishu.com>, 2009.
|
||||
# Anton Meixome <certima@certima.net>, 2009.
|
||||
# Antón Méixome <meixome@certima.net>, 2009.
|
||||
# Fran Diéguez <frandieguez@ubuntu.com>, 2009, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-12-28 17:07+0100\n"
|
||||
"PO-Revision-Date: 2009-12-28 08:11+0100\n"
|
||||
"Last-Translator: Antón Méixome <meixome@certima.net>\n"
|
||||
"Language-Team: Galician Proxecto Trasno <proxecto@trasno.net>\n"
|
||||
"POT-Creation-Date: 2010-04-09 19:17+0200\n"
|
||||
"PO-Revision-Date: 2010-04-09 19:40+0200\n"
|
||||
"Last-Translator: Fran Diéguez <frandieguez@ubuntu.com>\n"
|
||||
"Language-Team: Galician <gnome@g11n.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
@ -25,116 +25,209 @@ msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Xestor de xanelas e lanzamento de aplicativos"
|
||||
msgstr "Xestor de xanelas e inicio de aplicativos"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:858
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLICATIVOS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERENCIAS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:707 ../js/ui/appIcon.js:425
|
||||
#: ../js/ui/appDisplay.js:723
|
||||
msgid "New Window"
|
||||
msgstr "Xanela nova"
|
||||
|
||||
#: ../js/ui/appDisplay.js:711 ../js/ui/appIcon.js:429
|
||||
#: ../js/ui/appDisplay.js:727
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Eliminar de Favoritos"
|
||||
msgstr "Eliminar dos favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:712 ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Engadir a Favoritos"
|
||||
msgstr "Engadir aos favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1064
|
||||
#: ../js/ui/appDisplay.js:1055
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Arrastra aquí para engadir favoritos"
|
||||
msgstr "Arrastre aquí para engadir aos favoritos"
|
||||
|
||||
#: ../js/ui/dash.js:240
|
||||
msgid "Find..."
|
||||
msgstr "Buscar..."
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s foi engadido aos seus favoritos."
|
||||
|
||||
#: ../js/ui/dash.js:437
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s foi eliminado dos seus favoritos."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Buscar"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Buscando..."
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Non hai resultados que coincidan."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:878 ../js/ui/placeDisplay.js:519
|
||||
msgid "PLACES"
|
||||
msgstr "LUGARES"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "LUGARES e DISPOSITIVOS"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:885
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "DOCUMENTOS RECENTES"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ELEMENTOS RECENTES"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:362
|
||||
msgid "No extensions installed"
|
||||
msgstr "Non hai ningunha extensión instalada"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:399
|
||||
msgid "Enabled"
|
||||
msgstr "Activado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:401
|
||||
msgid "Disabled"
|
||||
msgstr "Desactivado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:403
|
||||
msgid "Error"
|
||||
msgstr "Erro"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:405
|
||||
msgid "Out of date"
|
||||
msgstr "Desactualizado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:430
|
||||
msgid "View Source"
|
||||
msgstr "Ver fonte"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:436
|
||||
msgid "Web Page"
|
||||
msgstr "Páxina web"
|
||||
|
||||
#: ../js/ui/overview.js:181
|
||||
msgid "Undo"
|
||||
msgstr "Desfacer"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:227
|
||||
#: ../js/ui/panel.js:374
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:440
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:594
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:597
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Produciuse un fallo ao montar '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Reintentar"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Conectar con..."
|
||||
|
||||
#: ../js/ui/runDialog.js:235
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Insira unha orde:"
|
||||
|
||||
#: ../js/ui/runDialog.js:351
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Fallou a execución de %s"
|
||||
msgstr "Produciuse un fallo na execución de %s"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Available"
|
||||
msgstr "Dispoñíbel"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Aplicativos"
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "Busy"
|
||||
msgstr "Ocupado"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documentos recentes"
|
||||
#: ../js/ui/statusMenu.js:115
|
||||
msgid "Invisible"
|
||||
msgstr "Invisíbel"
|
||||
|
||||
#: ../src/shell-global.c:890
|
||||
#: ../js/ui/statusMenu.js:124
|
||||
msgid "Account Information..."
|
||||
msgstr "Información da conta..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferencias do sistema..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:138
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bloquear pantalla"
|
||||
|
||||
#: ../js/ui/statusMenu.js:143
|
||||
msgid "Switch User"
|
||||
msgstr "Cambiar de usuario"
|
||||
|
||||
#: ../js/ui/statusMenu.js:149
|
||||
msgid "Log Out..."
|
||||
msgstr "Saír da sesión..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:154
|
||||
msgid "Shut Down..."
|
||||
msgstr "Apagar..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s rematou de iniarse"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "'%s' está preparado"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Hai menos dun minuto"
|
||||
|
||||
#: ../src/shell-global.c:893
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "hai %d minuto"
|
||||
msgstr[1] "hai %d minutos"
|
||||
|
||||
#: ../src/shell-global.c:896
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "hai %d hora"
|
||||
msgstr[1] "hai %d horas"
|
||||
|
||||
#: ../src/shell-global.c:899
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "hai %d día"
|
||||
msgstr[1] "hai %d días"
|
||||
|
||||
#: ../src/shell-global.c:902
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -165,6 +258,21 @@ msgstr "Buscar"
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Barra lateral"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%M:%H"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Aplicativos"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "Documentos recentes"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "LUGARES"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "RESULTADOS DA BUSCA"
|
||||
|
||||
@ -182,27 +290,6 @@ msgstr "%1$s: %2$s"
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Non foi posíbel pechar a sesión: %s"
|
||||
|
||||
#~ msgid "Account Information..."
|
||||
#~ msgstr "Información da conta..."
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Barra lateral"
|
||||
|
||||
#~ msgid "System Preferences..."
|
||||
#~ msgstr "Preferencias do sistema..."
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "Bloquear pantalla"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "Cambiar de usuario"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "Saír da sesión..."
|
||||
|
||||
#~ msgid "Shut Down..."
|
||||
#~ msgstr "Apagar..."
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "Explorar"
|
||||
|
||||
|
290
po/hu.po
@ -2,13 +2,13 @@
|
||||
# Copyright 2009. Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
#
|
||||
# Gabor Kelemen <kelemeng at gnome dot hu>, 2009.
|
||||
# Gabor Kelemen <kelemeng at gnome dot hu>, 2009, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-09-28 13:41+0200\n"
|
||||
"PO-Revision-Date: 2009-09-28 13:42+0200\n"
|
||||
"POT-Creation-Date: 2010-03-24 14:25+0100\n"
|
||||
"PO-Revision-Date: 2010-03-24 14:26+0100\n"
|
||||
"Last-Translator: Gabor Kelemen <kelemeng at gnome dot hu>\n"
|
||||
"Language-Team: Hungarian <gnome at fsf dot hu>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -25,153 +25,241 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Ablakkezelés és alkalmazásindítás"
|
||||
|
||||
#. left side
|
||||
#: ../js/ui/panel.js:269
|
||||
msgid "Activities"
|
||||
msgstr "Tevékenységek"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:452
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a., %k.%M"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
msgid "Find..."
|
||||
msgstr "Keresés…"
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "Több"
|
||||
|
||||
#: ../js/ui/dash.js:543
|
||||
msgid "(see all)"
|
||||
msgstr "(összes megjelenítése)"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:763 ../js/ui/dash.js:825
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ALKALMAZÁSOK"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "BEÁLLÍTÁSOK"
|
||||
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
msgid "New Window"
|
||||
msgstr "Új ablak"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Eltávolítás a Kedvencek közül"
|
||||
|
||||
#: ../js/ui/appDisplay.js:734
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Hozzáadás a Kedvencekhez"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1086
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Ide húzással kedvenceket vehet fel"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s felvéve a Kedvencek közé."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s eltávolítva a Kedvencek közül"
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Keresés"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
msgid "Searching..."
|
||||
msgstr "Keresés…"
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
msgid "No matching results."
|
||||
msgstr "Nincs találat."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:783
|
||||
msgid "PLACES"
|
||||
msgstr "HELYEK"
|
||||
#: ../js/ui/dash.js:871 ../js/ui/placeDisplay.js:580
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "HELYEK ÉS ESZKÖZÖK"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:790 ../js/ui/dash.js:835
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "LEGUTÓBBI DOKUMENTUMOK"
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "LEGUTÓBBI ELEMEK"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:815 ../js/ui/dash.js:958
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "TALÁLATOK"
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nincsenek kiterjesztések telepítve"
|
||||
|
||||
#: ../js/ui/dash.js:830
|
||||
msgid "PREFERENCES"
|
||||
msgstr "BEÁLLÍTÁSOK"
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Engedélyezve"
|
||||
|
||||
#: ../js/ui/runDialog.js:94
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Tiltva"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Hiba"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Elavult"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Forrás megtekintése"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Weblap"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Visszavonás"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Tevékenységek"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %p %l.%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "„%s” leválasztása meghiúsult"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
msgid "Retry"
|
||||
msgstr "Újra"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
msgid "Connect to..."
|
||||
msgstr "Kapcsolódás…"
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Adjon meg egy parancsot:"
|
||||
|
||||
#: ../src/shell-global.c:799
|
||||
#: ../js/ui/runDialog.js:376
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "„%s” végrehajtása meghiúsult:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Elérhető"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Elfoglalt"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Láthatatlan"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Fiókinformációk…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Oldalsáv"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Rendszerbeállítások…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Képernyő zárolása"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Felhasználóváltás"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Kijelentkezés…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Leállítás…"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%k.%M"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Alkalmazások"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Legutóbbi dokumentumok"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s indítása befejeződött"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "„%s” kész"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Kevesebb, mint egy perce"
|
||||
|
||||
#: ../src/shell-global.c:802
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d perce"
|
||||
msgstr[1] "%d perce"
|
||||
|
||||
#: ../src/shell-global.c:805
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d órája"
|
||||
msgstr[1] "%d órája"
|
||||
|
||||
#: ../src/shell-global.c:808
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d napja"
|
||||
msgstr[1] "%d napja"
|
||||
|
||||
#: ../src/shell-global.c:811
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d hete"
|
||||
msgstr[1] "%d hete"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Ismeretlen"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Nem lehet zárolni a képernyőt: %s "
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr ""
|
||||
"Átmenetileg nem lehet beállítani a képernyővédőt a képernyő elsötétítésére: %"
|
||||
"s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Nem lehet kijelentkezni: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Fiókinformációk…"
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Oldalsáv"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Rendszerbeállítások…"
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Képernyő zárolása"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Felhasználóváltás"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Kijelentkezés…"
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Leállítás…"
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Saját mappa"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Fájlrendszer"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Oldalsáv"
|
||||
|
||||
@ -180,7 +268,7 @@ msgstr "Oldalsáv"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
225
po/it.po
@ -1,14 +1,14 @@
|
||||
# Italian translations for gnome-shell package.
|
||||
# Copyright (C) 2009 the gnome-shell copyright holder
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Milo Casagrande <milo@ubuntu.com>, 2009.
|
||||
#
|
||||
# Milo Casagrande <milo@ubuntu.com>, 2009, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-12-28 21:58+0100\n"
|
||||
"PO-Revision-Date: 2009-12-28 21:59+0100\n"
|
||||
"POT-Creation-Date: 2010-04-06 21:27+0200\n"
|
||||
"PO-Revision-Date: 2010-04-06 22:51+0200\n"
|
||||
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
|
||||
"Language-Team: Italian <tp@lists.linux.it>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -25,114 +25,211 @@ msgid "Window management and application launching"
|
||||
msgstr "Gestione finestre e avvio applicazioni"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:858
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "Applicazioni"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "Preferenze"
|
||||
|
||||
#: ../js/ui/appDisplay.js:707 ../js/ui/appIcon.js:425
|
||||
#: ../js/ui/appDisplay.js:723
|
||||
msgid "New Window"
|
||||
msgstr "Nuova finestra"
|
||||
|
||||
#: ../js/ui/appDisplay.js:711 ../js/ui/appIcon.js:429
|
||||
#: ../js/ui/appDisplay.js:727
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Rimuovi dai preferiti"
|
||||
|
||||
#: ../js/ui/appDisplay.js:712 ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Aggiungi ai preferiti"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1064
|
||||
#: ../js/ui/appDisplay.js:1055
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Trascinare qui per aggiungere ai preferiti"
|
||||
|
||||
#: ../js/ui/dash.js:240
|
||||
msgid "Find..."
|
||||
msgstr "Trova..."
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s è stato aggiunto ai preferiti."
|
||||
|
||||
#: ../js/ui/dash.js:437
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s è stato rimosso dai preferiti."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Trova"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Ricerca..."
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Nessun risultato."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:878 ../js/ui/placeDisplay.js:519
|
||||
msgid "PLACES"
|
||||
msgstr "Risorse"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "Risorse e dispositivi"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:885
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "Documenti recenti"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "Elementi recenti"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:362
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nessuna estensione installata"
|
||||
|
||||
# (ndt) o abilitata?
|
||||
#: ../js/ui/lookingGlass.js:399
|
||||
msgid "Enabled"
|
||||
msgstr "Abilitato"
|
||||
|
||||
# (ndt) o disabilitata?
|
||||
#: ../js/ui/lookingGlass.js:401
|
||||
msgid "Disabled"
|
||||
msgstr "Disabilitato"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:403
|
||||
msgid "Error"
|
||||
msgstr "Errore"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:405
|
||||
msgid "Out of date"
|
||||
msgstr "Non aggiornato"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:430
|
||||
msgid "View Source"
|
||||
msgstr "Visualizza sorgente"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:436
|
||||
msgid "Web Page"
|
||||
msgstr "Pagina web"
|
||||
|
||||
#: ../js/ui/overview.js:181
|
||||
msgid "Undo"
|
||||
msgstr "Annulla"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:227
|
||||
#: ../js/ui/panel.js:374
|
||||
msgid "Activities"
|
||||
msgstr "Attività"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:594
|
||||
msgid "%a %R"
|
||||
msgstr "%a %k.%M"
|
||||
|
||||
# (ndt) proviamo col k, se non funge, sappiamo il perché...
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:440
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:597
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %k.%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
# (ndt) libera, ma unmount non si può proprio vedere...
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Impossibile scollegare «%s»"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Riprova"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Connetti a..."
|
||||
|
||||
#: ../js/ui/runDialog.js:235
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Inserire un comando:"
|
||||
|
||||
#: ../js/ui/runDialog.js:351
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Esecuzione di «%s» non riuscita:"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%k.%M"
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Available"
|
||||
msgstr "Disponibile"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Applicazioni"
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "Busy"
|
||||
msgstr "Non disponibile"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documenti recenti"
|
||||
#: ../js/ui/statusMenu.js:115
|
||||
msgid "Invisible"
|
||||
msgstr "Invisibile"
|
||||
|
||||
#: ../src/shell-global.c:890
|
||||
#: ../js/ui/statusMenu.js:124
|
||||
msgid "Account Information..."
|
||||
msgstr "Informazioni account..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferenze di sistema..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:138
|
||||
msgid "Lock Screen"
|
||||
msgstr "Blocca schermo"
|
||||
|
||||
#: ../js/ui/statusMenu.js:143
|
||||
msgid "Switch User"
|
||||
msgstr "Cambia utente"
|
||||
|
||||
#: ../js/ui/statusMenu.js:149
|
||||
msgid "Log Out..."
|
||||
msgstr "Termina sessione..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:154
|
||||
msgid "Shut Down..."
|
||||
msgstr "Arresta..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "Avvio di %s completato"
|
||||
|
||||
# (ndt) dovrebbe essere il nome dell'applicazione
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "«%s» è pronto"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Meno di un minuto fa"
|
||||
|
||||
#: ../src/shell-global.c:893
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d minuto fa"
|
||||
msgstr[1] "%d minuti fa"
|
||||
|
||||
#: ../src/shell-global.c:896
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d ora fa"
|
||||
msgstr[1] "%d ore fa"
|
||||
|
||||
#: ../src/shell-global.c:899
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d giorno fa"
|
||||
msgstr[1] "%d giorni fa"
|
||||
|
||||
#: ../src/shell-global.c:902
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -163,51 +260,3 @@ msgstr "Cerca"
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "Frequente"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "Altro"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(vedi tutto)"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "Risultati ricerca"
|
||||
|
||||
# (ndt) valutare se vada al femminile
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Sconosciuto"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Impossibile bloccare lo schermo: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr ""
|
||||
#~ "Impossibile impostare temporaneamente il salva schermo a schermo nero: %s "
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Impossibile terminare la sessione: %s"
|
||||
|
||||
#~ msgid "Account Information..."
|
||||
#~ msgstr "Informazioni account..."
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Barra laterale"
|
||||
|
||||
#~ msgid "System Preferences..."
|
||||
#~ msgstr "Preferenze di sistema..."
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "Blocca schermo"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "Cambia utente"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "Termina sessione..."
|
||||
|
||||
# (ndt) da valutare... pare che ora anche Windows usi 'Arresta...'...
|
||||
#~ msgid "Shut Down..."
|
||||
#~ msgstr "Spegni..."
|
||||
|
338
po/nb.po
@ -1,14 +1,14 @@
|
||||
# Norwegian bokmål translation of gnome-shell.
|
||||
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Kjartan Maraas <kmaraas@broadpark.no>, 2009.
|
||||
# Kjartan Maraas <kmaraas@broadpark.no>, 2009-2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 0.4\n"
|
||||
"Project-Id-Version: gnome-shell 2.28.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-10-03 10:47+0200\n"
|
||||
"PO-Revision-Date: 2009-10-03 10:48+0200\n"
|
||||
"POT-Creation-Date: 2010-05-24 16:28+0200\n"
|
||||
"PO-Revision-Date: 2010-05-24 16:29+0200\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@broadpark.no>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -24,151 +24,299 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Vindushåndtering og oppstart av programmer"
|
||||
|
||||
#. left side
|
||||
#: ../js/ui/panel.js:271
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Klokke"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:461
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Tilpass klokken på panelet"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
msgid "Find..."
|
||||
msgstr "Finn..."
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Klokkeformat"
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "Mer"
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Brukervalg for klokke"
|
||||
|
||||
#: ../js/ui/dash.js:543
|
||||
msgid "(see all)"
|
||||
msgstr "(se alle)"
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Panelvisning"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Vis seku_nder"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Vis _dato"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "_12-timers format"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24-timers format"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:763 ../js/ui/dash.js:825
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "PROGRAMMER"
|
||||
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "BRUKERVALG"
|
||||
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "Nytt vindu"
|
||||
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Fjern fra favoritter"
|
||||
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Legg til i favoritter"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Dra hit for å legge til favoritter"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s ble lagt til i dine favoritter."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s ble fjernet fra dine favoritter."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Finn"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Søker..."
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Ingen treff."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:783
|
||||
msgid "PLACES"
|
||||
msgstr "STEDER"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "STEDER & ENHETER"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:790 ../js/ui/dash.js:835
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "SISTE DOKUMENTER"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "SISTE OPPFØRINGER"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:815 ../js/ui/dash.js:955
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "SØKERESULTATER"
|
||||
#: ../js/ui/lookingGlass.js:466
|
||||
msgid "No extensions installed"
|
||||
msgstr "Ingen utvidelser installert"
|
||||
|
||||
#: ../js/ui/dash.js:830
|
||||
msgid "PREFERENCES"
|
||||
msgstr "BRUKERVALG"
|
||||
#: ../js/ui/lookingGlass.js:503
|
||||
msgid "Enabled"
|
||||
msgstr "Aktivert"
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/lookingGlass.js:505
|
||||
msgid "Disabled"
|
||||
msgstr "Deaktivert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:507
|
||||
msgid "Error"
|
||||
msgstr "Feil"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:509
|
||||
msgid "Out of date"
|
||||
msgstr "Utdatert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:534
|
||||
msgid "View Source"
|
||||
msgstr "Vis kildekode"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:540
|
||||
msgid "Web Page"
|
||||
msgstr "Nettside"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "Angre"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:887
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:1102
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e %b, %R.%S"
|
||||
|
||||
#: ../js/ui/panel.js:1103
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %e %b, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:1107
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R.%S"
|
||||
|
||||
#: ../js/ui/panel.js:1108
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1115
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %l.%M.%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:1116
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %e %b, %l.%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1120
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l.%M.%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:1121
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l.%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Klarte ikke å avmontere «%s»"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Prøv igjen"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Koble til..."
|
||||
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Oppgi en kommando:"
|
||||
|
||||
#: ../src/shell-global.c:812
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Kjøring av «%s» feilet:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Tilgjengelig"
|
||||
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Opptatt"
|
||||
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Usynlig"
|
||||
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Kontoinformasjon..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Brukervalg for systemet..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lås skjerm"
|
||||
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Bytt bruker"
|
||||
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Logg ut..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "Avslutt..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s er ferdig startet"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "«%s» er klar"
|
||||
|
||||
#: ../js/ui/workspacesView.js:239
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "Kan ikke legge til nytt arbeidsområde fordi grensen for maksimalt antall arbeidsområder er nådd."
|
||||
|
||||
#: ../js/ui/workspacesView.js:256
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Kan ikke fjerne første arbeidsområde"
|
||||
|
||||
#: ../src/shell-global.c:1027
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Mindre enn ett minutt siden"
|
||||
|
||||
#: ../src/shell-global.c:815
|
||||
#: ../src/shell-global.c:1031
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d minutt siden"
|
||||
msgstr[1] "%d minutter siden"
|
||||
|
||||
#: ../src/shell-global.c:818
|
||||
#: ../src/shell-global.c:1036
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d time siden"
|
||||
msgstr[1] "%d timer siden"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../src/shell-global.c:1041
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d dag siden"
|
||||
msgstr[1] "%d dager siden"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:1046
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d uke siden"
|
||||
msgstr[1] "%d uker siden"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjent"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Kan ikke låse skjermen: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "Kan ikke sette skjermsparer midlertidig til blank skjerm: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Kan ikke logge ut: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Kontoinformasjon..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Sidelinje"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Brukervalg for systemet..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lås skjerm"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Bytt bruker"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Logg ut..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Slå av..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Hjemmemappe"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Filsystem"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Søk"
|
||||
|
||||
@ -177,7 +325,7 @@ msgstr "Søk"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
292
po/nl.po
@ -2,13 +2,13 @@
|
||||
#
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
#
|
||||
# Sander Dijkhuis <sander.dijkhuis@gmail.com>, 2009.
|
||||
# Sander Dijkhuis <sander.dijkhuis@gmail.com>, 2009, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-08-29 14:37+0200\n"
|
||||
"PO-Revision-Date: 2009-08-29 15:10+0200\n"
|
||||
"POT-Creation-Date: 2010-03-31 13:34+0200\n"
|
||||
"PO-Revision-Date: 2010-04-02 22:18+0200\n"
|
||||
"Last-Translator: Sander Dijkhuis <sander.dijkhuis@gmail.com>\n"
|
||||
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -18,153 +18,247 @@ msgstr ""
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
msgstr "Gnome Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Vensterbeheer en toepassingen starten"
|
||||
|
||||
#. left side
|
||||
#: ../js/ui/panel.js:271
|
||||
msgid "Activities"
|
||||
msgstr "Activiteiten"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:451
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %k:%M"
|
||||
|
||||
#: ../js/ui/dash.js:256
|
||||
msgid "Find..."
|
||||
msgstr "Zoeken…"
|
||||
|
||||
#: ../js/ui/dash.js:374
|
||||
msgid "Browse"
|
||||
msgstr "Bladeren"
|
||||
|
||||
#: ../js/ui/dash.js:451
|
||||
msgid "(see all)"
|
||||
msgstr "(alles tonen)"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:634 ../js/ui/dash.js:682
|
||||
#: ../js/ui/appDisplay.js:312 ../js/ui/dash.js:855
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "TOEPASSINGEN"
|
||||
|
||||
#: ../js/ui/appDisplay.js:344
|
||||
msgid "PREFERENCES"
|
||||
msgstr "VOORKEUREN"
|
||||
|
||||
#: ../js/ui/appDisplay.js:734
|
||||
msgid "New Window"
|
||||
msgstr "Nieuw venster"
|
||||
|
||||
#: ../js/ui/appDisplay.js:738
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Uit favorieten verwijderen"
|
||||
|
||||
#: ../js/ui/appDisplay.js:739
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Aan favorieten toevoegen"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1091
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Hierheen slepen om favorieten toe te voegen"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s is toegevoegd aan uw favorieten."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s is verwijderd uit uw favorieten."
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Zoeken"
|
||||
|
||||
#: ../js/ui/dash.js:510
|
||||
msgid "Searching..."
|
||||
msgstr "Zoeken…"
|
||||
|
||||
#: ../js/ui/dash.js:524
|
||||
msgid "No matching results."
|
||||
msgstr "Geen overeenkomende resultaten."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:654
|
||||
msgid "PLACES"
|
||||
msgstr "LOCATIES"
|
||||
#: ../js/ui/dash.js:874 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "LOCATIES & APPARATEN"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:661 ../js/ui/dash.js:694
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "RECENTE DOCUMENTEN"
|
||||
#: ../js/ui/dash.js:881 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "RECENTE ITEMS"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:680
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "ZOEKRESULTATEN"
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Geen uitbreidingen geïnstalleerd"
|
||||
|
||||
#: ../js/ui/runDialog.js:82
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Ingeschakeld"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Uitgeschakeld"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Fout"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Gedateerd"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Broncode weergeven"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Webpagina"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Ongedaan maken"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:388
|
||||
msgid "Activities"
|
||||
msgstr "Activiteiten"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:622
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %k:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Ontkoppelen van ‘%s’ mislukt"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Opnieuw"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Verbinding maken met…"
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Voer een opdracht in:"
|
||||
|
||||
#: ../src/shell-global.c:840
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Korter dan een minuut geleden"
|
||||
#: ../js/ui/runDialog.js:376
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Uitvoeren van ‘%s’ mislukt:"
|
||||
|
||||
#: ../src/shell-global.c:843
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Beschikbaar"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Bezig"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Onzichtbaar"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Accountinformatie…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Zijbalk"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Systeemvoorkeuren…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Scherm vergrendelen"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Gebruiker wisselen"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Afmelden…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Afsluiten…"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Toepassingen"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Recente documenten"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s is opgestart"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "‘%s’ is klaar"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Minder dan een minuut geleden"
|
||||
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d minuut geleden"
|
||||
msgstr[1] "%d minuten geleden"
|
||||
|
||||
#: ../src/shell-global.c:846
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d uur geleden"
|
||||
msgstr[1] "%d uur geleden"
|
||||
|
||||
#: ../src/shell-global.c:849
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d dag geleden"
|
||||
msgstr[1] "%d dagen geleden"
|
||||
|
||||
#: ../src/shell-global.c:852
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d week geleden"
|
||||
msgstr[1] "%d weken geleden"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Onbekend"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Kan het scherm niet vergrendelen: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "Kan de schermbeveiliging niet tijdelijk als zwart scherm instellen: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Kan niet afmelden: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Account-informatie…"
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Zijbalk"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Systeemvoorkeuren…"
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Scherm vergrendelen"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Gebruiker wisselen"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Afmelden…"
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Afsluiten…"
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Persoonlijke map"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Bestandssysteem"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Zoeken"
|
||||
|
||||
@ -173,7 +267,7 @@ msgstr "Zoeken"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
376
po/pa.po
@ -2,14 +2,14 @@
|
||||
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
#
|
||||
# A S Alam <aalam@users.sf.net>, 2009.
|
||||
# A S Alam <aalam@users.sf.net>, 2009, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
|
||||
"cgi?product=gnome-shell&component=general\n"
|
||||
"POT-Creation-Date: 2009-10-09 22:10+0000\n"
|
||||
"PO-Revision-Date: 2009-10-15 06:18+0530\n"
|
||||
"POT-Creation-Date: 2010-05-19 16:31+0000\n"
|
||||
"PO-Revision-Date: 2010-05-25 19:31+0530\n"
|
||||
"Last-Translator: A S Alam <aalam@users.sf.net>\n"
|
||||
"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -26,190 +26,307 @@ msgstr "ਗਨੋਮ ਸ਼ੈਲ"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "ਵਿੰਡੋ ਪਰਬੰਧ ਅਤੇ ਐਪਲੀਕੇਸ਼ਨ ਚਲਾਓ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:335
|
||||
msgid "Frequent"
|
||||
msgstr "ਅਕਸਰ"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "ਘੜੀ"
|
||||
|
||||
#: ../js/ui/appIcon.js:462
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "ਪੈਨਲ ਘੜੀ ਕਸਟਮਾਈਜ਼ ਕਰੋ"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "ਘੜੀ ਫਾਰਮੈਟ"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
#| msgid "System Preferences..."
|
||||
msgid "Clock Preferences"
|
||||
msgstr "ਘੜੀ ਪਸੰਦ"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "ਪੈਨਲ ਦਿੱਖ"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "ਸਕਿੰਟ ਵੇਖੋ(_n)"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "ਮਿਤੀ ਵੇਖੋ(_d)"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "_੧੨ ਘੰਟੇ ਫਾਰਮੈਟ"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_੨੪ ਘੰਟੇ ਫਾਰਮੈਟ"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ਪਸੰਦ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "ਨਵੀਂ ਵਿੰਡੋ"
|
||||
|
||||
#: ../js/ui/appIcon.js:475
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
|
||||
|
||||
#: ../js/ui/appIcon.js:476
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
msgid "Find..."
|
||||
msgstr "ਖੋਜ..."
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜਨ ਲਈ ਇੱਥੇ ਸੁੱਟੋ"
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "ਹੋਰ"
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।"
|
||||
|
||||
#: ../js/ui/dash.js:543
|
||||
msgid "(see all)"
|
||||
msgstr "(ਸਭ ਵੇਖੋ)"
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਤੋਂ ਹਟਾਇਆ ਜਾ ਚੁੱਕਿਆ ਹੈ।"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:763 ../js/ui/dash.js:825
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "ਖੋਜ"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..."
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਿਆ।"
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:783
|
||||
msgid "PLACES"
|
||||
msgstr "ਥਾਵਾਂ"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "ਥਾਵਾਂ ਤੇ ਜੰਤਰ"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:790 ../js/ui/dash.js:835
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "ਤਾਜ਼ਾ ਡੌਕੂਮੈਂਟ"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ਤਾਜ਼ਾ ਆਈਟਮਾਂ"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:815 ../js/ui/dash.js:955
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "ਖੋਜ ਨਤੀਜੇ"
|
||||
#: ../js/ui/lookingGlass.js:466
|
||||
msgid "No extensions installed"
|
||||
msgstr "ਕੋਈ ਇਕਸਟੈਨਸ਼ਨ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ"
|
||||
|
||||
#: ../js/ui/dash.js:830
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ਪਸੰਦ"
|
||||
#: ../js/ui/lookingGlass.js:503
|
||||
msgid "Enabled"
|
||||
msgstr "ਚਾਲੂ ਹੈ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:505
|
||||
msgid "Disabled"
|
||||
msgstr "ਬੰਦ ਹੈ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:507
|
||||
msgid "Error"
|
||||
msgstr "ਗਲਤੀ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:509
|
||||
msgid "Out of date"
|
||||
msgstr "ਪੁਰਾਣਾ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:534
|
||||
msgid "View Source"
|
||||
msgstr "ਸਰੋਤ ਵੇਖੋ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:540
|
||||
msgid "Web Page"
|
||||
msgstr "ਵੈੱਬ ਪੇਜ਼"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "ਵਾਪਸ"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:272
|
||||
#: ../js/ui/panel.js:774
|
||||
msgid "Activities"
|
||||
msgstr "ਸਰਗਰਮੀਆਂ"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:464
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:989
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a, %e %b %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:990
|
||||
#| msgid "%a %l:%M %p"
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %e %b, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:994
|
||||
#| msgid "%a %R"
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:995
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1002
|
||||
#| msgid "%a %l:%M %p"
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:1003
|
||||
#| msgid "%a %l:%M %p"
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %e %b, %l:%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1007
|
||||
#| msgid "%a %l:%M %p"
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:1008
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/places.js:178
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "'%s' ਅਣ-ਮਾਊਂਟ ਕਰਨ ਲਈ ਫੇਲ੍ਹ"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "...ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ"
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "ਕਮਾਂਡ ਦਿਓ ਜੀ:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "'%s' ਚਲਾਉਣ ਲਈ ਫੇਲ੍ਹ:"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:162
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "ਉਪਲੱਬਧ"
|
||||
|
||||
#: ../js/ui/widget.js:316
|
||||
msgid "Applications"
|
||||
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "ਰੁਝਿਆ"
|
||||
|
||||
#: ../js/ui/widget.js:341
|
||||
msgid "Recent Documents"
|
||||
msgstr "ਤਾਜ਼ਾ ਡੌਕੂਮੈਂਟ"
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "ਅਦਿੱਖ"
|
||||
|
||||
#: ../src/shell-global.c:812
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "ਅਕਾਊਂਟ ਜਾਣਕਾਰੀ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "ਸਿਸਟਮ ਪਸੰਦ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ"
|
||||
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
|
||||
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "ਲਾਗਆਉਟ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "ਬੰਦ ਕਰੋ..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s ਸ਼ੁਰੂ ਹੋਣਾ ਖਤਮ ਹੋਇਆ"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "'%s' ਤਿਆਰ ਹੈ"
|
||||
|
||||
#: ../js/ui/workspacesView.js:239
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"ਨਵਾਂ ਵਰਕਸਪੇਸ ਜੋੜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਵਰਕਸਪੇਸਾਂ ਦੀ ਵੱਧੋ-ਵੱਧ ਗਿਣਤੀ ਪੂਰੀ ਹੋ "
|
||||
"ਚੁੱਕੀ ਹੈ।"
|
||||
|
||||
#: ../js/ui/workspacesView.js:256
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "ਪਹਿਲਾਂ ਵਰਕਸਪੇਸ ਨਹੀਂ ਹਟਾਇਆ ਜਾ ਸਕਦਾ।"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ"
|
||||
|
||||
#: ../src/shell-global.c:815
|
||||
#: ../src/shell-global.c:980
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
|
||||
msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
|
||||
|
||||
#: ../src/shell-global.c:818
|
||||
#: ../src/shell-global.c:985
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ"
|
||||
msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../src/shell-global.c:990
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ"
|
||||
msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:995
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ"
|
||||
msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "ਅਣਜਾਣ"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "ਸਕਰੀਨ ਲਾਕ ਨਹੀਂ ਹੋ ਸਕਦੀ: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "ਸਕਰੀਨ ਬੰਦ ਕਰਨ ਲਈ ਆਰਜ਼ੀ ਰੂਪ ਵਿੱਚ ਸਕਰੀਨ-ਸੇਵਰ ਨਹੀਂ ਸੈੱਟ ਕੀਤਾ ਜਾ ਸਕਦਾ: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "ਲਾਗਆਉਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "ਅਕਾਊਂਟ ਜਾਣਕਾਰੀ..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "ਬਾਹੀ"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "ਸਿਸਟਮ ਪਸੰਦ..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "ਲਾਗਆਉਟ..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "ਬੰਦ ਕਰੋ..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "ਘਰ ਫੋਲਡਰ"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "ਫਾਇਲ ਸਿਸਟਮ"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "ਖੋਜ"
|
||||
|
||||
@ -218,10 +335,49 @@ msgstr "ਖੋਜ"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "ਬਾਹੀ"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "ਐਪਲੀਕੇਸ਼ਨ"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "ਤਾਜ਼ਾ ਡੌਕੂਮੈਂਟ"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "ਅਕਸਰ"
|
||||
|
||||
#~ msgid "More"
|
||||
#~ msgstr "ਹੋਰ"
|
||||
|
||||
#~ msgid "(see all)"
|
||||
#~ msgstr "(ਸਭ ਵੇਖੋ)"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "ਥਾਵਾਂ"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "ਖੋਜ ਨਤੀਜੇ"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "ਅਣਜਾਣ"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "ਸਕਰੀਨ ਲਾਕ ਨਹੀਂ ਹੋ ਸਕਦੀ: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr "ਸਕਰੀਨ ਬੰਦ ਕਰਨ ਲਈ ਆਰਜ਼ੀ ਰੂਪ ਵਿੱਚ ਸਕਰੀਨ-ਸੇਵਰ ਨਹੀਂ ਸੈੱਟ ਕੀਤਾ ਜਾ ਸਕਦਾ: %s"
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "ਲਾਗਆਉਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ: %s"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "ਝਲਕ"
|
||||
|
273
po/pl.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-09-09 03:06+0200\n"
|
||||
"PO-Revision-Date: 2009-09-09 03:02+0100\n"
|
||||
"POT-Creation-Date: 2010-03-19 13:08+0100\n"
|
||||
"PO-Revision-Date: 2010-03-19 13:07+0100\n"
|
||||
"Last-Translator: Tomasz Dominikowski <dominikowski@gmail.com>\n"
|
||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -28,59 +28,193 @@ msgstr "Powłoka środowiska GNOME"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Zarządzanie oknami i uruchamianiem programów"
|
||||
|
||||
#. left side
|
||||
#: ../js/ui/panel.js:269
|
||||
msgid "Activities"
|
||||
msgstr "Czynności"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:452
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %H:%M"
|
||||
|
||||
#: ../js/ui/dash.js:255
|
||||
msgid "Find..."
|
||||
msgstr "Znajdź..."
|
||||
|
||||
#: ../js/ui/dash.js:372
|
||||
msgid "Browse"
|
||||
msgstr "Przeglądaj"
|
||||
|
||||
#: ../js/ui/dash.js:508
|
||||
msgid "(see all)"
|
||||
msgstr "(wyświetl wszystko)"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:700 ../js/ui/dash.js:756 ../js/ui/dash.js:887
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "Programy"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "Preferencje"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
msgid "New Window"
|
||||
msgstr "Nowe okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Usuń z ulubionych"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Dodaj do ulubionych"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Przeciągnięcie tutaj doda do ulubionych"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s zostało dodane do ulubionych."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s zostało usunięte z ulubionych."
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Znajdź"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
msgid "Searching..."
|
||||
msgstr "Wyszukiwanie..."
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
msgid "No matching results."
|
||||
msgstr "Brak wyników."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:720
|
||||
msgid "PLACES"
|
||||
msgstr "Miejsca"
|
||||
#: ../js/ui/dash.js:871 ../js/ui/placeDisplay.js:579
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "Miejsca i urządzenia"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:727 ../js/ui/dash.js:768 ../js/ui/dash.js:861
|
||||
msgid "RECENT DOCUMENTS"
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "Ostatnie dokumenty"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:746 ../js/ui/dash.js:850 ../js/ui/dash.js:876
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "Wyniki wyszukiwania"
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nie zainstalowano rozszerzeń"
|
||||
|
||||
#: ../js/ui/runDialog.js:90
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Włączone"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Wyłączone"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Błąd"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Przestarzałe"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Wyświetl źródło"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Strona WWW"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Cofnij"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Podgląd"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %R"
|
||||
msgstr "%a, %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %H:%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Odmontowanie \"%s\" się nie powiodło"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
msgid "Retry"
|
||||
msgstr "Ponów"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
msgid "Connect to..."
|
||||
msgstr "Połącz z..."
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Proszę wprowadzić polecenie:"
|
||||
|
||||
#: ../src/shell-global.c:799
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Wykonanie \"%s\" się nie powiodło:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Dostępny"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Zajęty"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Niewidoczny"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Informacje o koncie..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Panel boczny"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferencje systemu..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Zablokuj ekran"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Wyloguj się..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Wyłącz komputer..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Programy"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Ostatnie dokumenty"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Mniej niż minutę temu"
|
||||
|
||||
#: ../src/shell-global.c:802
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -88,7 +222,7 @@ msgstr[0] "%d minuta temu"
|
||||
msgstr[1] "%d minuty temu"
|
||||
msgstr[2] "%d minut temu"
|
||||
|
||||
#: ../src/shell-global.c:805
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -96,7 +230,7 @@ msgstr[0] "%d godzina temu"
|
||||
msgstr[1] "%d godziny temu"
|
||||
msgstr[2] "%d godzin temu"
|
||||
|
||||
#: ../src/shell-global.c:808
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -104,7 +238,7 @@ msgstr[0] "%d dzień temu"
|
||||
msgstr[1] "%d dni temu"
|
||||
msgstr[2] "%d dni temu"
|
||||
|
||||
#: ../src/shell-global.c:811
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -112,68 +246,17 @@ msgstr[0] "%d tydzień temu"
|
||||
msgstr[1] "%d tygodnie temu"
|
||||
msgstr[2] "%d tygodni temu"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznane"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Nie można zablokować ekranu: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr ""
|
||||
"Nie można tymczasowo ustawić wygaszacza ekranu na wygaszenie ekranu: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Nie można się wylogować: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Informacje o koncie..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Panel boczny"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferencje systemu..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Zablokuj ekran"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Wyloguj się..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Wyłącz komputer..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Katalog domowy"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:102
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "System plików"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Wyszukaj"
|
||||
|
||||
@ -182,7 +265,7 @@ msgstr "Wyszukaj"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-uri-util.c:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|