Compare commits
377 Commits
Author | SHA1 | Date | |
---|---|---|---|
51caecc1b3 | |||
ef1d3c56d8 | |||
aa8f386b7d | |||
43b751e27a | |||
69fde6822c | |||
b28c4dcd81 | |||
5014d16647 | |||
a5f9039e12 | |||
d9eb4702b2 | |||
a19047fa3a | |||
edba3e843f | |||
e48d119801 | |||
643c7fdb3a | |||
174caf0016 | |||
ab0d57d6ca | |||
a45021bd60 | |||
7b79e2e35c | |||
fdbda8e731 | |||
4c6c6d8658 | |||
c405cce700 | |||
8ade2fc116 | |||
40c7d3763b | |||
71bbd4ed5c | |||
a2617fe06a | |||
d1e1afdaab | |||
a94978db36 | |||
97f883b10e | |||
3af4ca3fe9 | |||
c19c236dbf | |||
6873539846 | |||
d9275d3dda | |||
e8b72a2a59 | |||
a160e31c2a | |||
a84e2e3307 | |||
83689e494c | |||
7c4d4b8695 | |||
771648893f | |||
81aed78a1f | |||
9af979097d | |||
35764fa09e | |||
4b1fea2fa4 | |||
04ecde9f8e | |||
ee79579b2e | |||
0f52c924e2 | |||
9ef2a46e33 | |||
1f550dbc72 | |||
e63a0f3a13 | |||
62b07a5260 | |||
91bcca71c6 | |||
e8fc731fc1 | |||
91e2117708 | |||
4ccff179a5 | |||
bd4aa54e48 | |||
f8b142064b | |||
38f5e30162 | |||
2799327c84 | |||
da4e24555b | |||
7f8f0f2358 | |||
cae61e62fd | |||
ab61017041 | |||
792dc489ee | |||
9baf8e19ea | |||
362fc78dcf | |||
4800a80c3a | |||
d8f7629a4f | |||
7514dfaef9 | |||
c50e324366 | |||
6e09cc5fc8 | |||
eafd3848a9 | |||
942810e88e | |||
df13408973 | |||
bbfc980fe6 | |||
c30b1c9bea | |||
9e554097f3 | |||
302b892dbc | |||
c0134067d7 | |||
a691192ffa | |||
5616a0ae2a | |||
a4befeba53 | |||
e6a70e4676 | |||
016ab1afee | |||
748739ed9c | |||
7fbf8ae4c9 | |||
9914754458 | |||
5a94a1cf3f | |||
afadeef204 | |||
f866707101 | |||
49919acb7c | |||
f76dae5ec8 | |||
bf6d0dc808 | |||
e4a6bf994f | |||
3fe7b13959 | |||
79aeb44bf8 | |||
51478f16ec | |||
528930d0a9 | |||
88be8e87ac | |||
b83d5975b0 | |||
6ca2fd03bd | |||
87e5457095 | |||
cba49959c1 | |||
7c5343a9fb | |||
0e91a213f5 | |||
466f661436 | |||
dad80b3d20 | |||
d96d07af10 | |||
0e40782723 | |||
7cc1cf3b4a | |||
702f596c44 | |||
db45c0920b | |||
d4a8c64d22 | |||
0deffbaaf0 | |||
af3ca027a1 | |||
24a4ca0c6d | |||
e1a109b9be | |||
8aeadcdf9a | |||
68bc5baf12 | |||
8da5c5f50e | |||
084ef99d10 | |||
730681aabc | |||
efd30a0eef | |||
3d60245b18 | |||
ccbf247970 | |||
84efaac52b | |||
8f5aae6df6 | |||
35f27ae150 | |||
d387a2d531 | |||
63d84533c9 | |||
fe91f7fe9e | |||
cc163237cc | |||
4acb082b6e | |||
929bf7f989 | |||
e3eaa69948 | |||
155bee388d | |||
2ca70e9e76 | |||
d31e905978 | |||
a57a34c540 | |||
b3794f1c17 | |||
5b971a66ba | |||
77fcf68ea3 | |||
15dd1164b7 | |||
0eeb62794d | |||
07cfb8d524 | |||
3e2a9a57a1 | |||
a0be7fa455 | |||
a433a1c637 | |||
d05cf2445d | |||
764f5b62f0 | |||
03a0809e39 | |||
f0645d468c | |||
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 |
6
.gitignore
vendored
6
.gitignore
vendored
@ -18,6 +18,11 @@ config
|
||||
configure
|
||||
data/gnome-shell.desktop
|
||||
data/gnome-shell.desktop.in
|
||||
data/gnome-shell-clock-preferences.desktop
|
||||
data/gnome-shell-clock-preferences.desktop.in
|
||||
data/gschemas.compiled
|
||||
data/org.gnome.shell.gschema.xml
|
||||
data/org.gnome.shell.gschema.valid
|
||||
intltool-extract.in
|
||||
intltool-merge.in
|
||||
intltool-update.in
|
||||
@ -38,6 +43,7 @@ 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
|
||||
|
51
configure.ac
51
configure.ac
@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[2.29.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AC_INIT([gnome-shell],[2.31.5],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
@ -33,6 +33,8 @@ PKG_PROG_PKG_CONFIG([0.22])
|
||||
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
|
||||
AM_GCONF_SOURCE_2
|
||||
|
||||
GLIB_GSETTINGS
|
||||
|
||||
# Get a value to substitute into gnome-shell.in
|
||||
AM_PATH_PYTHON([2.5])
|
||||
AC_SUBST(PYTHON)
|
||||
@ -55,26 +57,40 @@ fi
|
||||
|
||||
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||
|
||||
CLUTTER_MIN_VERSION=1.2.0
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.6.9
|
||||
GJS_MIN_VERSION=0.6
|
||||
MUTTER_MIN_VERSION=2.29.1
|
||||
CLUTTER_MIN_VERSION=1.2.8
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.6.11
|
||||
GJS_MIN_VERSION=0.7
|
||||
MUTTER_MIN_VERSION=2.31.4
|
||||
GTK_MIN_VERSION=2.90.4
|
||||
GIO_MIN_VERSION=2.25.9
|
||||
|
||||
# Collect more than 20 libraries for a prize!
|
||||
PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-unix-2.0 gtk+-2.0 dbus-glib-1
|
||||
PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION
|
||||
gio-unix-2.0 dbus-glib-1
|
||||
gtk+-3.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
|
||||
gdk-x11-3.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 gnome-desktop-2.0 >= 2.26)
|
||||
PKG_CHECK_MODULES(BIG, clutter-1.0 gtk+-2.0 librsvg-2.0)
|
||||
PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-2.0)
|
||||
PKG_CHECK_MODULES(TRAY, gtk+-2.0)
|
||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 gnome-desktop-3.0 >= 2.90.0)
|
||||
PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-3.0)
|
||||
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||
|
||||
MUTTER_BIN_DIR=`$PKG_CONFIG --variable=exec_prefix mutter-plugins`/bin
|
||||
# FIXME: metacity-plugins.pc should point directly to its .gir file
|
||||
@ -86,10 +102,13 @@ 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_FUNCS(mallinfo)
|
||||
AC_CHECK_HEADERS([sys/resource.h])
|
||||
|
||||
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
||||
@ -135,12 +154,22 @@ changequote([,])dnl
|
||||
AC_PATH_PROG(mutter, [mutter])
|
||||
AC_SUBST(mutter)
|
||||
|
||||
AC_MSG_CHECKING([if mutter was compiled with GTK+-3.0])
|
||||
if $PKG_CONFIG --libs libmutter-private | grep gtk-x11-3 >/dev/null; then
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_ERROR([GNOME Shell requires Mutter to be compiled against GTK+-3.0])
|
||||
fi
|
||||
|
||||
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
|
||||
|
@ -1,17 +1,19 @@
|
||||
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 = \
|
||||
close-black.svg \
|
||||
@ -28,6 +30,7 @@ dist_theme_DATA = \
|
||||
theme/mosaic-view-active.svg \
|
||||
theme/mosaic-view.svg \
|
||||
theme/move-window-on-new.svg \
|
||||
theme/process-working.png \
|
||||
theme/remove-workspace.svg \
|
||||
theme/scroll-button-down-hover.png \
|
||||
theme/scroll-button-down.png \
|
||||
@ -35,26 +38,51 @@ dist_theme_DATA = \
|
||||
theme/scroll-button-up.png \
|
||||
theme/scroll-hhandle.svg \
|
||||
theme/scroll-vhandle.svg \
|
||||
theme/section-back.svg \
|
||||
theme/section-more.svg \
|
||||
theme/section-more-open.svg \
|
||||
theme/separator-white.png \
|
||||
theme/single-view-active.svg \
|
||||
theme/single-view.svg \
|
||||
theme/ws-switch-arrow-left.svg \
|
||||
theme/ws-switch-arrow-right.svg
|
||||
|
||||
gsettings_SCHEMAS = org.gnome.shell.gschema.xml
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
@GSETTINGS_RULES@
|
||||
|
||||
schemadir = @GCONF_SCHEMA_FILE_DIR@
|
||||
schema_DATA = gnome-shell.schemas
|
||||
# We need to compile schemas at make time
|
||||
# to run from source tree
|
||||
gschemas.compiled: $(gsettings_SCHEMAS:.xml=.valid)
|
||||
$(AM_V_GEN) $(GLIB_COMPILE_SCHEMAS) --targetdir=. .
|
||||
|
||||
all-local: gschemas.compiled
|
||||
|
||||
|
||||
# GConf schemas: provide defaults for keys from Metacity we are overriding
|
||||
gconfschemadir = @GCONF_SCHEMA_FILE_DIR@
|
||||
gconfschema_DATA = gnome-shell.schemas
|
||||
|
||||
menudir = $(sysconfdir)/xdg/menus
|
||||
|
||||
menu_DATA = \
|
||||
gs-applications.menu
|
||||
|
||||
install-data-local:
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA)
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(gconfschema_DATA)
|
||||
|
||||
EXTRA_DIST = \
|
||||
gnome-shell.desktop.in.in \
|
||||
$(schema_DATA)
|
||||
|
||||
CLEANFILES = \
|
||||
gnome-shell.desktop.in \
|
||||
$(desktop_DATA)
|
||||
|
||||
EXTRA_DIST = \
|
||||
gnome-shell.desktop.in.in \
|
||||
gnome-shell-clock-preferences.desktop.in.in \
|
||||
$(menu_DATA) \
|
||||
$(gconfschema_DATA) \
|
||||
org.gnome.shell.gschema.xml.in
|
||||
|
||||
CLEANFILES = \
|
||||
gnome-shell.desktop.in \
|
||||
gnome-shell-clock-preferences.desktop.in \
|
||||
$(desktop_DATA) \
|
||||
$(gsettings_SCHEMAS) \
|
||||
gschemas.compiled
|
||||
|
||||
|
188
data/clock-preferences.ui
Normal file
188
data/clock-preferences.ui
Normal file
@ -0,0 +1,188 @@
|
||||
<?xml version="1.0"?>
|
||||
<interface domain="gnome-shell">
|
||||
<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>
|
15
data/gnome-shell-clock-preferences.desktop.in.in
Normal file
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@
|
@ -1,196 +1,226 @@
|
||||
<gconfschemafile>
|
||||
<schemalist>
|
||||
|
||||
<!-- Metacity overrides -->
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/development_tools</key>
|
||||
<applyto>/desktop/gnome/shell/development_tools</applyto>
|
||||
<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>true</default>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Enable internal tools useful for developers and testers from Alt-F2</short>
|
||||
<short>Show or hide the magnifier</short>
|
||||
<long>
|
||||
Allows access to internal debugging and monitoring tools using
|
||||
the Alt-F2 dialog.
|
||||
Show or hide the magnifier and all of its zoom regions.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/app_monitor/enable_monitoring</key>
|
||||
<applyto>/desktop/gnome/shell/app_monitor/enable_monitoring</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>true</default>
|
||||
<locale name="C">
|
||||
<short>Whether to collect stats about applications usage</short>
|
||||
<long>
|
||||
The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/favorite_apps</key>
|
||||
<applyto>/desktop/gnome/shell/favorite_apps</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>list</type>
|
||||
<list_type>string</list_type>
|
||||
<default>[mozilla-firefox.desktop,evolution.desktop,openoffice.org-writer.desktop]</default>
|
||||
<locale name="C">
|
||||
<short>List of desktop file IDs for favorite applications</short>
|
||||
<long>
|
||||
The applications corresponding to these identifiers will be displayed in the favorites area.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<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/sidebar/visible</key>
|
||||
<applyto>/desktop/gnome/shell/sidebar/visible</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>false</default>
|
||||
<locale name="C">
|
||||
<short>Whether or not to display the sidebar</short>
|
||||
<long>
|
||||
Determines whether or not the sidebar is visible.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/sidebar/expanded</key>
|
||||
<applyto>/desktop/gnome/shell/sidebar/expanded</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>true</default>
|
||||
<locale name="C">
|
||||
<short>Whether the sidebar should be in the expanded (wide) mode</short>
|
||||
<long>
|
||||
Controls the expanded/collapsed state of the sidebar.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/sidebar/autohide</key>
|
||||
<applyto>/desktop/gnome/shell/sidebar/autohide</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>bool</type>
|
||||
<default>true</default>
|
||||
<locale name="C">
|
||||
<short>Whether the sidebar should automatically hide itself in compact mode</short>
|
||||
<long>
|
||||
Controls the autohide 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>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/disabled_extensions</key>
|
||||
<applyto>/desktop/gnome/shell/disabled_extensions</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>list</type>
|
||||
<list_type>string</list_type>
|
||||
<default>[]</default>
|
||||
<locale name="C">
|
||||
<short>Uuids of extensions to disable</short>
|
||||
<long>
|
||||
GNOME Shell extensions have a uuid property; this key lists extensions which should not be loaded.
|
||||
</long>
|
||||
</locale>
|
||||
</schema>
|
||||
|
||||
<schema>
|
||||
<key>/schemas/desktop/gnome/shell/recorder/framerate</key>
|
||||
<applyto>/desktop/gnome/shell/recorder/framerate</applyto>
|
||||
<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>15</default>
|
||||
<default>1</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>
|
||||
<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/shell/recorder/pipeline</key>
|
||||
<applyto>/desktop/gnome/shell/recorder/pipeline</applyto>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/screen_position</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/screen_position</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default></default>
|
||||
<type>int</type>
|
||||
<default>3</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>
|
||||
<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/shell/recorder/file_extension</key>
|
||||
<applyto>/desktop/gnome/shell/recorder/file_extension</applyto>
|
||||
<key>/schemas/desktop/gnome/accessibility/magnifier/mag_factor</key>
|
||||
<applyto>/desktop/gnome/accessibility/magnifier/mag_factor</applyto>
|
||||
<owner>gnome-shell</owner>
|
||||
<type>string</type>
|
||||
<default>ogv</default>
|
||||
<type>float</type>
|
||||
<default>2.0</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>
|
||||
<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/shell/overview/workspaces_view</key>
|
||||
<applyto>/desktop/gnome/shell/overview/workspaces_view</applyto>
|
||||
<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>single</default>
|
||||
<default>#ff0000</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>
|
||||
<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>
|
||||
|
44
data/gs-applications.menu
Normal file
44
data/gs-applications.menu
Normal file
@ -0,0 +1,44 @@
|
||||
<Menu>
|
||||
<DefaultLayout>
|
||||
<Menuname>Apps</Menuname>
|
||||
<Menuname>Games</Menuname>
|
||||
<Menuname>Tools</Menuname>
|
||||
</DefaultLayout>
|
||||
<Name>Applications</Name>
|
||||
<DefaultAppDirs/>
|
||||
<Menu>
|
||||
<Name>Games</Name>
|
||||
<Include>
|
||||
<And>
|
||||
<Category>Game</Category>
|
||||
</And>
|
||||
</Include>
|
||||
</Menu>
|
||||
<Menu>
|
||||
<Name>Tools</Name>
|
||||
<Include>
|
||||
<Category>Development</Category>
|
||||
<And>
|
||||
<Category>System</Category>
|
||||
<Not>
|
||||
<Category>Settings</Category>
|
||||
</Not>
|
||||
</And>
|
||||
<Category>Utility</Category>
|
||||
</Include>
|
||||
</Menu>
|
||||
<Menu>
|
||||
<Name>Apps</Name>
|
||||
<OnlyUnallocated/>
|
||||
<Include>
|
||||
<And>
|
||||
<Or>
|
||||
<Category>Documentation</Category>
|
||||
<Not><Category>Core</Category></Not>
|
||||
</Or>
|
||||
<Not><Category>Settings</Category></Not>
|
||||
<Not><Category>Screensaver</Category></Not>
|
||||
</And>
|
||||
</Include>
|
||||
</Menu>
|
||||
</Menu>
|
158
data/org.gnome.shell.gschema.xml.in
Normal file
158
data/org.gnome.shell.gschema.xml.in
Normal file
@ -0,0 +1,158 @@
|
||||
<schemalist>
|
||||
<schema id="org.gnome.shell" path="/apps/gnome-shell/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="development-tools" type="b">
|
||||
<default>true</default>
|
||||
<_summary>
|
||||
Enable internal tools useful for developers and testers from Alt-F2
|
||||
</_summary>
|
||||
<_description>
|
||||
Allows access to internal debugging and monitoring tools
|
||||
using the Alt-F2 dialog.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="disabled-extensions" type="as">
|
||||
<default>[]</default>
|
||||
<_summary>Uuids of extensions to disable</_summary>
|
||||
<_description>
|
||||
GNOME Shell extensions have a uuid property;
|
||||
this key lists extensions which should not be loaded.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="enable-app-monitoring" type="b">
|
||||
<default>true</default>
|
||||
<_summary>Whether to collect stats about applications usage</_summary>
|
||||
<_description>
|
||||
The shell normally monitors active applications in order to present
|
||||
the most used ones (e.g. in launchers). While this data will be
|
||||
kept private, you may want to disable this for privacy reasons.
|
||||
Please note that doing so won't remove already saved data.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="favorite-apps" type="as">
|
||||
<default>[ 'mozilla-firefox.desktop', 'evolution.desktop', 'openoffice.org-writer.desktop' ]</default>
|
||||
<_summary>List of desktop file IDs for favorite applications</_summary>
|
||||
<_description>
|
||||
The applications corresponding to these identifiers
|
||||
will be displayed in the favorites area.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="command-history" type="as">
|
||||
<default>[]</default>
|
||||
<_summary>History for command (Alt-F2) dialog</_summary>
|
||||
</key>
|
||||
<key name="workspaces-view" type="s">
|
||||
<default>'single'</default>
|
||||
<_summary>Overview workspace view mode</_summary>
|
||||
<_description>
|
||||
The selected workspace view mode in the overview.
|
||||
Supported values are "single" and "grid".
|
||||
</_description>
|
||||
<choices>
|
||||
<choice value="single"/>
|
||||
<choice value="grid"/>
|
||||
</choices>
|
||||
</key>
|
||||
<child name="clock" schema="org.gnome.shell.clock"/>
|
||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
||||
</schema>
|
||||
|
||||
<schema id="org.gnome.shell.calendar" path="/apps/gnome-shell/calendar/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="show-weekdate" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Show the week date in the calendar</_summary>
|
||||
<_description>
|
||||
If true, display the ISO week date in the calendar.
|
||||
</_description>
|
||||
</key>
|
||||
</schema>
|
||||
|
||||
<schema id="org.gnome.shell.clock" path="/apps/gnome-shell/clock/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="format" type="s">
|
||||
<default l10n="messages" context="hour_format">
|
||||
<!-- TRANSLATORS: This is the default hour format, choose ONLY '12-hour' or '24-hour'. -->
|
||||
"12-hour"
|
||||
</default>
|
||||
<_summary>Hour format</_summary>
|
||||
<_description>
|
||||
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.
|
||||
</_description>
|
||||
<choices>
|
||||
<choice value="12-hour"/>
|
||||
<choice value="24-hour"/>
|
||||
<choice value="unix"/>
|
||||
<choice value="custom"/>
|
||||
</choices>
|
||||
</key>
|
||||
<key name="custom-format" type="s">
|
||||
<default>''</default>
|
||||
<_summary>Custom format of the clock</_summary>
|
||||
<_description>
|
||||
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.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="show-seconds" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Show time with seconds</_summary>
|
||||
<_description>
|
||||
If true and format is either "12-hour" or "24-hour", display seconds in time.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="show-date" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Show date in clock</_summary>
|
||||
<_description>
|
||||
If true and format is either "12-hour" or "24-hour",
|
||||
display date in the clock, in addition to time.
|
||||
</_description>
|
||||
</key>
|
||||
</schema>
|
||||
|
||||
<schema id="org.gnome.shell.recorder" path="/apps/gnome-shell/recorder/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="framerate" type="i">
|
||||
<default>15</default>
|
||||
<_summary>Framerate used for recording screencasts.</_summary>
|
||||
<_description>
|
||||
The framerate of the resulting screencast recordered
|
||||
by GNOME Shell's screencast recorder in frames-per-second.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="pipeline" type="s">
|
||||
<default>''</default>
|
||||
<_summary>The gstreamer pipeline used to encode the screencast</_summary>
|
||||
<_description>
|
||||
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.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="file-extension" type="s">
|
||||
<default>'ogv'</default>
|
||||
<_summary>File extension used for storing the screencast</_summary>
|
||||
<_description>
|
||||
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.
|
||||
</_description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
@ -30,6 +30,13 @@
|
||||
color: rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
.label-real-shadow {
|
||||
background-gradient-direction: horizontal;
|
||||
background-gradient-start: rgba(0, 0, 0, 0);
|
||||
background-gradient-end: rgba(0, 0, 0, 255);
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
StScrollBar
|
||||
{
|
||||
padding: 0px;
|
||||
@ -93,13 +100,56 @@ StTooltip {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
/* PopupMenu */
|
||||
|
||||
.popup-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;
|
||||
}
|
||||
|
||||
.popup-menu {
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
/* The remaining popup-menu sizing is all done in ems, so that if you
|
||||
* override .popup-menu.font-size, everything else will scale with it.
|
||||
*/
|
||||
.popup-menu-content {
|
||||
padding: .5em 0px;
|
||||
}
|
||||
|
||||
.popup-menu-item {
|
||||
padding: .4em 1.25em;
|
||||
}
|
||||
|
||||
.popup-menu-item:active {
|
||||
background-color: #4c4c4c;
|
||||
}
|
||||
|
||||
.popup-image-menu-item {
|
||||
spacing: .75em;
|
||||
}
|
||||
|
||||
.popup-separator-menu-item {
|
||||
-gradient-height: 2px;
|
||||
-gradient-start: rgba(8,8,8,0);
|
||||
-gradient-end: #333333;
|
||||
-margin-horizontal: 1.5em;
|
||||
height: 1em;
|
||||
}
|
||||
|
||||
/* Panel */
|
||||
|
||||
#panel {
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
background-color: black;
|
||||
border-bottom: 1px solid #1f1f1f;
|
||||
}
|
||||
|
||||
#panelLeft, #panelCenter, #panelRight {
|
||||
@ -115,16 +165,28 @@ StTooltip {
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.panel-button:pressed {
|
||||
background-color: rgba(50,76,111,0.98);
|
||||
border-radius: 4px 4px 0px 0px;
|
||||
}
|
||||
|
||||
#appMenu {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.app-menu-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.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;
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.panel-button:active, .panel-button:checked, .panel-button:pressed {
|
||||
@ -141,10 +203,18 @@ StTooltip {
|
||||
border-radius-topright: 0px;
|
||||
}
|
||||
|
||||
#statusMenu {
|
||||
#panelStatusMenu {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
#statusTray {
|
||||
spacing: 14px;
|
||||
}
|
||||
|
||||
#statusTray:compact {
|
||||
spacing: 8px;
|
||||
}
|
||||
|
||||
/* Overview */
|
||||
|
||||
.overview {
|
||||
@ -310,6 +380,7 @@ StTooltip {
|
||||
caret-color: #fff;
|
||||
caret-size: 1px;
|
||||
height: 16px;
|
||||
transition-duration: 300;
|
||||
}
|
||||
|
||||
#searchEntry:focus {
|
||||
@ -317,10 +388,16 @@ StTooltip {
|
||||
border: 1px solid #3a3a3a;
|
||||
background-color: #e8e8e8;
|
||||
caret-color: #545454;
|
||||
-st-shadow: 0px 0px 6px 2px rgba(255,255,255,0.9);
|
||||
transition-duration: 0;
|
||||
}
|
||||
|
||||
#searchEntry:hover {
|
||||
border: 1px solid #767676;
|
||||
color: #a8a8a8;
|
||||
border: 1px solid #4d4d4d;
|
||||
background-color: #e8e8e8;
|
||||
caret-color: #545454;
|
||||
transition-duration: 500;
|
||||
}
|
||||
|
||||
.dash-section {
|
||||
@ -338,20 +415,6 @@ StTooltip {
|
||||
padding: 4px 0px;
|
||||
}
|
||||
|
||||
.section-header-back {
|
||||
padding: 0px 4px 0px 0px;
|
||||
border-right: 1px solid #262626;
|
||||
}
|
||||
|
||||
.section-header-back-image {
|
||||
background-image: url("section-back.svg");
|
||||
width: 12px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.section-count {
|
||||
}
|
||||
|
||||
.dash-section-content {
|
||||
color: #ffffff;
|
||||
spacing: 8px;
|
||||
@ -404,6 +467,10 @@ StTooltip {
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
.dash-results-container {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
/* GenericDisplay */
|
||||
|
||||
.generic-display-container {
|
||||
@ -458,6 +525,16 @@ StTooltip {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.app-section-divider-container {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.app-section-divider {
|
||||
height: 2px;
|
||||
background-image: url("separator-white.png");
|
||||
}
|
||||
|
||||
.all-app-controls-panel {
|
||||
height: 30px;
|
||||
}
|
||||
@ -471,10 +548,12 @@ StTooltip {
|
||||
.app-well-app {
|
||||
border: 1px solid #181818;
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
padding: 4px;
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
font-size: 10px;
|
||||
transition-duration: 100;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.app-well-app.running {
|
||||
@ -489,6 +568,10 @@ StTooltip {
|
||||
|
||||
.app-well-app: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);
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.app-well-app:active {
|
||||
@ -497,41 +580,58 @@ StTooltip {
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
.app-well-menu-item:hover {
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
.app-well-menu-separator {
|
||||
padding-top: 1px;
|
||||
border-bottom: 1px solid #5f5f5f;
|
||||
height: 1px;
|
||||
font-size: 12px
|
||||
}
|
||||
|
||||
/* Places */
|
||||
|
||||
.places-section {
|
||||
spacing-columns: 4px;
|
||||
spacing-rows: 4px;
|
||||
}
|
||||
|
||||
.places-item-box {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.places-item {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.places-actions {
|
||||
spacing: 2px;
|
||||
}
|
||||
|
||||
#placesDevices {
|
||||
padding-top: 4px;
|
||||
.places-item {
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
border: 1px solid #181818;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.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);
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.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);
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
/* LookingGlass */
|
||||
@ -541,7 +641,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;
|
||||
@ -561,27 +661,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;
|
||||
}
|
||||
@ -605,6 +747,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 {
|
||||
@ -662,7 +812,7 @@ StTooltip {
|
||||
|
||||
#notification {
|
||||
font-size: 16px;
|
||||
border-radius: 5px;
|
||||
border-radius: 5px 5px 0px 0px;
|
||||
background: rgba(0,0,0,0.9);
|
||||
color: white;
|
||||
padding: 2px 10px 10px 10px;
|
||||
@ -671,6 +821,23 @@ StTooltip {
|
||||
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;
|
||||
}
|
||||
@ -693,12 +860,84 @@ StTooltip {
|
||||
background: #808080;
|
||||
}
|
||||
|
||||
.notification-icon-button {
|
||||
border: 2px rgba(0,0,0,0.0);
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
}
|
||||
.notification-icon-button:hover {
|
||||
background: rgba(192,192,192,0.7);
|
||||
}
|
||||
|
||||
.notification-icon-button:active {
|
||||
background: rgba(128,128,128,0.7);
|
||||
}
|
||||
|
||||
.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: 4px;
|
||||
padding: 2px 0px 0px 4px;
|
||||
}
|
||||
|
||||
.summary-source-button {
|
||||
padding: 0px 2px 0px 2px;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.summary-source-button:hover {
|
||||
border: 1px solid #ffffff;
|
||||
}
|
||||
|
||||
.summary-source {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.source-title {
|
||||
font: 12px sans-serif;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.calendar-calendarweek {
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
@ -709,6 +948,10 @@ 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);
|
||||
@ -762,7 +1005,21 @@ StTooltip {
|
||||
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-group {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.workspace-switcher-container {
|
||||
background: rgba(0,0,0,0.8);
|
||||
border: 1px solid rgba(128,128,128,0.40);
|
||||
@ -779,7 +1036,7 @@ StTooltip {
|
||||
}
|
||||
|
||||
.ws-switcher-active-left {
|
||||
height: 98px;
|
||||
height: 100px;
|
||||
border: 0px;
|
||||
background: rgba(255,255,255,0.5);
|
||||
background-image: url("ws-switch-arrow-left.svg");
|
||||
@ -787,7 +1044,7 @@ StTooltip {
|
||||
}
|
||||
|
||||
.ws-switcher-active-right {
|
||||
height: 98px;
|
||||
height: 100px;
|
||||
border: 0px;
|
||||
background: rgba(255,255,255,0.5);
|
||||
background-image: url("ws-switch-arrow-right.svg");
|
||||
@ -833,5 +1090,15 @@ StTooltip {
|
||||
}
|
||||
|
||||
.lightbox {
|
||||
background-color: rgba(0, 0, 0, 0.27);
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
/* Magnifier */
|
||||
|
||||
.magnifier-zoom-region {
|
||||
border: 2px solid rgba(128, 0, 0, 255);
|
||||
}
|
||||
|
||||
.magnifier-zoom-region.full-screen {
|
||||
border-width: 0px;
|
||||
}
|
||||
|
BIN
data/theme/process-working.png
Normal file
BIN
data/theme/process-working.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.0 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
<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" version="1.0" id="Foreground" x="0px" y="0px" width="12" height="16" viewBox="0 0 12 16" enable-background="new 0 0 29 18" xml:space="preserve" sodipodi:version="0.32" inkscape:version="0.46+devel" sodipodi:docname="back.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata id="metadata16"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs id="defs14"><inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 9 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="29 : 9 : 1" inkscape:persp3d-origin="14.5 : 6 : 1" id="perspective18"/></defs><sodipodi:namedview inkscape:window-height="728" inkscape:window-width="1103" inkscape:pageshadow="2" inkscape:pageopacity="1" guidetolerance="10.0" gridtolerance="10.0" objecttolerance="10.0" borderopacity="1.0" bordercolor="#666666" pagecolor="#000000" id="base" showgrid="true" inkscape:zoom="27.260185" inkscape:cx="12.592456" inkscape:cy="8.2696842" inkscape:window-x="145" inkscape:window-y="38" inkscape:current-layer="Foreground" inkscape:snap-global="true" showguides="false"><inkscape:grid type="xygrid" id="grid2391" empspacing="5" visible="true" enabled="true" snapvisiblegridlinesonly="true"/></sodipodi:namedview>
|
||||
|
||||
|
||||
|
||||
<path style="fill: rgb(255, 255, 255); fill-opacity: 1; stroke: none;" d="M 10,2 10,14 2,8 10,2 z" id="path43"/></svg>
|
Before Width: | Height: | Size: 1.9 KiB |
BIN
data/theme/separator-white.png
Normal file
BIN
data/theme/separator-white.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 531 B |
@ -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
|
||||
|
@ -23,7 +23,7 @@ DocInfo.prototype = {
|
||||
// We actually used get_modified() instead of get_visited()
|
||||
// here, as GtkRecentInfo doesn't updated get_visited()
|
||||
// correctly. See http://bugzilla.gnome.org/show_bug.cgi?id=567094
|
||||
this.timestamp = recentInfo.get_modified().getTime() / 1000;
|
||||
this.timestamp = recentInfo.get_modified();
|
||||
this.name = recentInfo.get_display_name();
|
||||
this._lowerName = this.name.toLowerCase();
|
||||
this.uri = recentInfo.get_uri();
|
||||
@ -148,6 +148,6 @@ DocManager.prototype = {
|
||||
}
|
||||
return multipleMatches.concat(prefixMatches.concat(substringMatches));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(DocManager.prototype);
|
||||
|
@ -6,8 +6,10 @@
|
||||
* It has to be set up using String.prototype.format = Format.format;
|
||||
* Usage:
|
||||
* "somestring %s %d".format('hello', 5);
|
||||
* It supports %s, %d and %f, for %f it also support precisions like
|
||||
* "%.2f".format(1.526)
|
||||
* It supports %s, %d, %x and %f, for %f it also support precisions like
|
||||
* "%.2f".format(1.526). All specifiers can be prefixed with a minimum
|
||||
* field width, e.g. "%5s".format("foo"). Unless the width is prefixed
|
||||
* with '0', the formatted string will be padded with spaces.
|
||||
*/
|
||||
|
||||
function format() {
|
||||
@ -15,30 +17,44 @@ function format() {
|
||||
let i = 0;
|
||||
let args = arguments;
|
||||
|
||||
return str.replace(/%(?:\.([0-9]+))?(.)/g, function (str, precisionGroup, genericGroup) {
|
||||
return str.replace(/%([0-9]+)?(?:\.([0-9]+))?(.)/g, function (str, widthGroup, precisionGroup, genericGroup) {
|
||||
|
||||
if (precisionGroup != '' && genericGroup != 'f')
|
||||
throw new Error("Precision can only be specified for 'f'");
|
||||
|
||||
let fillChar = (widthGroup[0] == '0') ? '0' : ' ';
|
||||
let width = parseInt(widthGroup, 10) || 0;
|
||||
|
||||
function fillWidth(s, c, w) {
|
||||
let fill = '';
|
||||
for (let i = 0; i < w; i++)
|
||||
fill += c;
|
||||
return fill.substr(s.length) + s;
|
||||
}
|
||||
|
||||
let s = '';
|
||||
switch (genericGroup) {
|
||||
case '%':
|
||||
return '%';
|
||||
break;
|
||||
case 's':
|
||||
return args[i++].toString();
|
||||
s = args[i++].toString();
|
||||
break;
|
||||
case 'd':
|
||||
return parseInt(args[i++]);
|
||||
s = parseInt(args[i++]).toString();
|
||||
break;
|
||||
case 'x':
|
||||
s = parseInt(args[i++]).toString(16);
|
||||
break;
|
||||
case 'f':
|
||||
if (precisionGroup == '')
|
||||
return parseFloat(args[i++]);
|
||||
s = parseFloat(args[i++]).toString();
|
||||
else
|
||||
return parseFloat(args[i++]).toFixed(parseInt(precisionGroup));
|
||||
s = parseFloat(args[i++]).toFixed(parseInt(precisionGroup));
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unsupported conversion character %' + genericGroup);
|
||||
}
|
||||
return ""; // Suppress warning
|
||||
return fillWidth(s, fillChar, width);
|
||||
});
|
||||
}
|
||||
|
45
js/misc/gnomeSession.js
Normal file
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) {
|
||||
for (prop in defaults) {
|
||||
if (!(prop in params))
|
||||
params[prop] = defaults[prop];
|
||||
ret[prop] = defaults[prop];
|
||||
}
|
||||
|
||||
return params;
|
||||
return ret;
|
||||
}
|
372
js/misc/telepathy.js
Normal file
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
4
js/perf/Makefile.am
Normal file
@ -0,0 +1,4 @@
|
||||
jsperfdir = $(pkgdatadir)/js/perf
|
||||
|
||||
dist_jsperf_DATA = \
|
||||
core.js
|
140
js/perf/core.js
Normal file
140
js/perf/core.js
Normal file
@ -0,0 +1,140 @@
|
||||
/* -*- 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" },
|
||||
overviewFpsFirst:
|
||||
{ description: "Frame rate when going to the overview, first time",
|
||||
units: "frames / s" },
|
||||
overviewLatencySubsequent:
|
||||
{ description: "Time to first frame after triggering overview, second time",
|
||||
units: "us"},
|
||||
overviewFpsSubsequent:
|
||||
{ description: "Frames rate when going to the overview, second time",
|
||||
units: "frames / s" },
|
||||
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");
|
||||
|
||||
Main.overview.connect('shown', function() {
|
||||
Scripting.scriptEvent('overviewShowDone');
|
||||
});
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
yield Scripting.waitLeisure();
|
||||
for (let i = 0; i < 2; i++) {
|
||||
Scripting.scriptEvent('overviewShowStart');
|
||||
Main.overview.show();
|
||||
|
||||
yield Scripting.waitLeisure();
|
||||
Main.overview.hide();
|
||||
yield Scripting.waitLeisure();
|
||||
|
||||
global.gc();
|
||||
yield Scripting.sleep(1000);
|
||||
Scripting.collectStatistics();
|
||||
Scripting.scriptEvent('afterShowHide');
|
||||
}
|
||||
}
|
||||
|
||||
let showingOverview = false;
|
||||
let finishedShowingOverview = false;
|
||||
let overviewShowStart;
|
||||
let overviewFrames;
|
||||
let overviewLatency;
|
||||
let mallocUsedSize = 0;
|
||||
let overviewShowCount = 0;
|
||||
let firstOverviewUsedSize;
|
||||
let haveSwapComplete = false;
|
||||
|
||||
function script_overviewShowStart(time) {
|
||||
showingOverview = true;
|
||||
finishedShowingOverview = false;
|
||||
overviewShowStart = time;
|
||||
overviewFrames = 0;
|
||||
}
|
||||
|
||||
function script_overviewShowDone(time) {
|
||||
// We've set up the state at the end of the zoom out, but we
|
||||
// need to wait for one more frame to paint before we count
|
||||
// ourselves as done.
|
||||
finishedShowingOverview = true;
|
||||
}
|
||||
|
||||
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 _frameDone(time) {
|
||||
if (showingOverview) {
|
||||
if (overviewFrames == 0)
|
||||
overviewLatency = time - overviewShowStart;
|
||||
|
||||
overviewFrames++;
|
||||
}
|
||||
|
||||
if (finishedShowingOverview) {
|
||||
showingOverview = false;
|
||||
finishedShowingOverview = false;
|
||||
overviewShowCount++;
|
||||
|
||||
let dt = (time - (overviewShowStart + overviewLatency)) / 1000000;
|
||||
|
||||
// If we see a start frame and an end frame, that would
|
||||
// be 1 frame for a FPS computation, hence the '- 1'
|
||||
let fps = (overviewFrames - 1) / dt;
|
||||
|
||||
if (overviewShowCount == 1) {
|
||||
METRICS.overviewLatencyFirst.value = overviewLatency;
|
||||
METRICS.overviewFpsFirst.value = fps;
|
||||
} else {
|
||||
METRICS.overviewLatencySubsequent.value = overviewLatency;
|
||||
METRICS.overviewFpsSubsequent.value = fps;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function glx_swapComplete(time, swapTime) {
|
||||
haveSwapComplete = true;
|
||||
|
||||
_frameDone(swapTime);
|
||||
}
|
||||
|
||||
function clutter_stagePaintDone(time) {
|
||||
// If we aren't receiving GLXBufferSwapComplete events, then we approximate
|
||||
// the time the user sees a frame with the time we finished doing drawing
|
||||
// commands for the frame. This doesn't take into account the time for
|
||||
// the GPU to finish painting, and the time for waiting for the buffer
|
||||
// swap, but if this are uniform - every frame takes the same time to draw -
|
||||
// then it won't upset our FPS calculation, though the latency value
|
||||
// will be slightly too low.
|
||||
|
||||
if (!haveSwapComplete)
|
||||
_frameDone(time);
|
||||
}
|
4
js/prefs/Makefile.am
Normal file
4
js/prefs/Makefile.am
Normal file
@ -0,0 +1,4 @@
|
||||
jsprefsdir = $(pkgdatadir)/js/prefs
|
||||
|
||||
dist_jsprefs_DATA = \
|
||||
clockPreferences.js
|
97
js/prefs/clockPreferences.js
Normal file
97
js/prefs/clockPreferences.js
Normal file
@ -0,0 +1,97 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Gettext = imports.gettext;
|
||||
|
||||
const FORMAT_KEY = 'format';
|
||||
const SHOW_DATE_KEY = 'show-date';
|
||||
const SHOW_SECONDS_KEY = '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._settings = new Gio.Settings({ schema: 'org.gnome.shell.clock' });
|
||||
this._notifyId = this._settings.connect('changed',
|
||||
Lang.bind(this,
|
||||
this._updateDialog));
|
||||
|
||||
this._12hrRadio.connect('toggled', Lang.bind(this,
|
||||
function() {
|
||||
let format = this._12hrRadio.active ? '12-hour' : '24-hour';
|
||||
this._settings.set_string(FORMAT_KEY, format);
|
||||
}));
|
||||
this._dateCheck.connect('toggled', Lang.bind(this,
|
||||
function() {
|
||||
this._settings.set_boolean(SHOW_DATE_KEY,
|
||||
this._dateCheck.active);
|
||||
}));
|
||||
this._secondsCheck.connect('toggled', Lang.bind(this,
|
||||
function() {
|
||||
this._settings.set_boolean(SHOW_SECONDS_KEY,
|
||||
this._secondsCheck.active);
|
||||
}));
|
||||
|
||||
this._updateDialog();
|
||||
},
|
||||
|
||||
show: function() {
|
||||
this._dialog.show_all();
|
||||
},
|
||||
|
||||
_updateDialog: function() {
|
||||
let format = this._settings.get_string(FORMAT_KEY);
|
||||
this._12hrRadio.active = (format == "12-hour");
|
||||
this._24hrRadio.active = (format == "24-hour");
|
||||
|
||||
this._dateCheck.active = this._settings.get_boolean(SHOW_DATE_KEY);
|
||||
this._secondsCheck.active = this._settings.get_boolean(SHOW_SECONDS_KEY);
|
||||
},
|
||||
|
||||
_onResponse: function() {
|
||||
this._dialog.destroy();
|
||||
this._settings.disconnect(this._notifyId);
|
||||
this.emit('destroy');
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(ClockPreferences.prototype);
|
||||
|
||||
function main(params) {
|
||||
if ('progName' in params)
|
||||
GLib.set_prgname(params['progName']);
|
||||
if ('localeDir' in params)
|
||||
Gettext.bindtextdomain('gnome-shell', params['localeDir']);
|
||||
|
||||
Gtk.init(null, null);
|
||||
|
||||
let clockPrefs = new ClockPreferences(params['uiFile']);
|
||||
clockPrefs.connect('destroy',
|
||||
function() {
|
||||
Gtk.main_quit();
|
||||
});
|
||||
clockPrefs.show();
|
||||
|
||||
Gtk.main();
|
||||
}
|
@ -4,33 +4,36 @@ 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 \
|
||||
overview.js \
|
||||
panel.js \
|
||||
placeDisplay.js \
|
||||
popupMenu.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 \
|
||||
windowAttentionHandler.js \
|
||||
windowManager.js \
|
||||
workspacesView.js \
|
||||
workspaceSwitcherPopup.js \
|
||||
workspaceSwitcherPopup.js \
|
||||
workspace.js
|
||||
|
315
js/ui/altTab.js
315
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,15 @@ 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 POPUP_FADE_TIME = 0.1; // seconds
|
||||
|
||||
const DISABLE_HOVER_TIMEOUT = 500; // milliseconds
|
||||
|
||||
const THUMBNAIL_DEFAULT_SIZE = 256;
|
||||
const THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
||||
const THUMBNAIL_FADE_TIME = 0.2; // seconds
|
||||
const THUMBNAIL_FADE_TIME = 0.1; // seconds
|
||||
|
||||
const iconSizes = [96, 64, 48, 32, 22];
|
||||
|
||||
@ -43,7 +35,8 @@ function AltTabPopup() {
|
||||
|
||||
AltTabPopup.prototype = {
|
||||
_init : function() {
|
||||
this.actor = new Shell.GenericContainer({ reactive: true });
|
||||
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));
|
||||
@ -54,7 +47,7 @@ AltTabPopup.prototype = {
|
||||
this._haveModal = false;
|
||||
|
||||
this._currentApp = 0;
|
||||
this._currentWindow = 0;
|
||||
this._currentWindow = -1;
|
||||
this._thumbnailTimeoutId = 0;
|
||||
this._motionTimeoutId = 0;
|
||||
|
||||
@ -62,7 +55,7 @@ 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) {
|
||||
@ -77,15 +70,21 @@ AltTabPopup.prototype = {
|
||||
|
||||
_allocate: function (actor, box, flags) {
|
||||
let childBox = new Clutter.ActorBox();
|
||||
let focus = global.get_focus_monitor();
|
||||
let primary = global.get_primary_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 - POPUP_LIST_SPACING * 2);
|
||||
let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(primary.width - hPadding);
|
||||
let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight);
|
||||
childBox.x1 = Math.max(POPUP_LIST_SPACING, focus.x + Math.floor((focus.width - childNaturalWidth) / 2));
|
||||
childBox.x2 = Math.min(childBox.x1 + focus.width - POPUP_LIST_SPACING * 2, childBox.x1 + childNaturalWidth);
|
||||
childBox.y1 = focus.y + Math.floor((focus.height - childNaturalHeight) / 2);
|
||||
childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2));
|
||||
childBox.x2 = Math.min(childBox.x1 + primary.width - hPadding, childBox.x1 + childNaturalWidth);
|
||||
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
|
||||
childBox.y2 = childBox.y1 + childNaturalHeight;
|
||||
this._appSwitcher.actor.allocate(childBox, flags);
|
||||
|
||||
@ -94,20 +93,26 @@ AltTabPopup.prototype = {
|
||||
// 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(POPUP_LIST_SPACING, Math.floor(thumbnailCenter - childNaturalWidth / 2));
|
||||
if (childBox.x1 + childNaturalWidth > focus.width - POPUP_LIST_SPACING * 2) {
|
||||
let offset = childBox.x1 + childNaturalWidth - focus.width + POPUP_LIST_SPACING * 2;
|
||||
childBox.x1 = Math.max(POPUP_LIST_SPACING, childBox.x1 - offset - POPUP_LIST_SPACING * 2);
|
||||
childBox.x1 = Math.max(primary.x + leftPadding, Math.floor(thumbnailCenter - childNaturalWidth / 2));
|
||||
if (childBox.x1 + childNaturalWidth > primary.x + primary.width - hPadding) {
|
||||
let offset = childBox.x1 + childNaturalWidth - primary.width + hPadding;
|
||||
childBox.x1 = Math.max(primary.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.width - POPUP_LIST_SPACING)
|
||||
childBox.x2 = focus.width - POPUP_LIST_SPACING;
|
||||
childBox.y1 = this._appSwitcher.actor.allocation.y2 + POPUP_LIST_SPACING * 2;
|
||||
this._thumbnails.addClones(focus.height - POPUP_LIST_SPACING - childBox.y1);
|
||||
if (childBox.x2 > primary.x + primary.width - rightPadding)
|
||||
childBox.x2 = primary.x + primary.width - rightPadding;
|
||||
childBox.y1 = this._appSwitcher.actor.allocation.y2 + spacing;
|
||||
this._thumbnails.addClones(primary.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);
|
||||
@ -116,7 +121,7 @@ AltTabPopup.prototype = {
|
||||
|
||||
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;
|
||||
@ -160,8 +165,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
|
||||
@ -169,12 +175,20 @@ 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;
|
||||
}
|
||||
|
||||
this.actor.opacity = 0;
|
||||
this.actor.show();
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: POPUP_FADE_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
@ -186,10 +200,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);
|
||||
},
|
||||
@ -209,7 +229,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());
|
||||
@ -229,7 +249,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;
|
||||
@ -248,7 +268,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());
|
||||
@ -282,10 +302,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();
|
||||
},
|
||||
|
||||
@ -297,7 +324,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();
|
||||
},
|
||||
|
||||
@ -324,13 +352,24 @@ 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();
|
||||
},
|
||||
|
||||
destroy : function() {
|
||||
this.actor.destroy();
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: POPUP_FADE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
function() {
|
||||
this.actor.destroy();
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
_onDestroy : function() {
|
||||
@ -390,7 +429,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) {
|
||||
@ -402,18 +441,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;
|
||||
@ -430,7 +474,7 @@ AltTabPopup.prototype = {
|
||||
Tweener.addTween(this._thumbnails.actor,
|
||||
{ opacity: 255,
|
||||
time: THUMBNAIL_FADE_TIME,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -441,12 +485,19 @@ function SwitcherList(squareItems) {
|
||||
|
||||
SwitcherList.prototype = {
|
||||
_init : function(squareItems) {
|
||||
this.actor = new St.BoxLayout({ 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));
|
||||
@ -462,26 +513,72 @@ SwitcherList.prototype = {
|
||||
this.actor.add_actor(this._rightGradient);
|
||||
|
||||
// Those arrows indicate whether scrolling in one direction is possible
|
||||
this._leftArrow = new St.DrawingArea();
|
||||
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, TRANSPARENT_COLOR, POPUP_ARROW_COLOR);
|
||||
Shell.draw_box_pointer(area, Shell.PointerDirection.LEFT);
|
||||
}));
|
||||
|
||||
this._rightArrow = new St.DrawingArea();
|
||||
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, TRANSPARENT_COLOR, POPUP_ARROW_COLOR);
|
||||
Shell.draw_box_pointer(area, Shell.PointerDirection.RIGHT);
|
||||
}));
|
||||
|
||||
this._leftGradient.add_actor(this._leftArrow);
|
||||
this._rightGradient.add_actor(this._rightArrow);
|
||||
this.actor.add_actor(this._leftArrow);
|
||||
this.actor.add_actor(this._rightArrow);
|
||||
|
||||
this._items = [];
|
||||
this._highlighted = -1;
|
||||
this._separator = null;
|
||||
this._squareItems = squareItems;
|
||||
this._scrollable = false;
|
||||
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) {
|
||||
@ -521,12 +618,11 @@ SwitcherList.prototype = {
|
||||
this._items[this._highlighted].style_class = 'selected-item-box';
|
||||
}
|
||||
|
||||
let monitor = global.get_focus_monitor();
|
||||
let monitor = global.get_primary_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)
|
||||
if (posX + itemSize > monitor.width + monitor.x)
|
||||
this._scrollToRight();
|
||||
else if (posX < 0)
|
||||
this._scrollToLeft();
|
||||
@ -535,28 +631,33 @@ SwitcherList.prototype = {
|
||||
|
||||
_scrollToLeft : function() {
|
||||
let x = this._items[this._highlighted].allocation.x1;
|
||||
this._rightGradient.show();
|
||||
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._leftGradient.hide();
|
||||
if (this._highlighted == 0) {
|
||||
this._scrollableLeft = false;
|
||||
this.actor.queue_relayout();
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
_scrollToRight : function() {
|
||||
let monitor = global.get_focus_monitor();
|
||||
this._scrollableLeft = true;
|
||||
let monitor = global.get_primary_monitor();
|
||||
let padding = this.actor.get_theme_node().get_horizontal_padding();
|
||||
let x = this._items[this._highlighted].allocation.x2 - monitor.width + padding + POPUP_LIST_SPACING * 2;
|
||||
this._leftGradient.show();
|
||||
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._rightGradient.hide();
|
||||
if (this._highlighted == this._items.length - 1) {
|
||||
this._scrollableRight = false;
|
||||
this.actor.queue_relayout();
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
@ -600,6 +701,7 @@ SwitcherList.prototype = {
|
||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||
alloc.min_size = this._items.length * maxChildMin + separatorWidth + totalSpacing;
|
||||
alloc.natural_size = alloc.min_size;
|
||||
this._minSize = alloc.min_size;
|
||||
},
|
||||
|
||||
_getPreferredHeight: function (actor, forWidth, alloc) {
|
||||
@ -641,12 +743,15 @@ SwitcherList.prototype = {
|
||||
let children = this._list.get_children();
|
||||
let childBox = new Clutter.ActorBox();
|
||||
|
||||
let focus = global.get_focus_monitor();
|
||||
if (this.actor.allocation.x2 == focus.width - POPUP_LIST_SPACING) {
|
||||
let primary = global.get_primary_monitor();
|
||||
let parentRightPadding = this.actor.get_parent().get_theme_node().get_padding(St.Side.RIGHT);
|
||||
if (this.actor.allocation.x2 == primary.x + primary.width - parentRightPadding) {
|
||||
if (this._squareItems)
|
||||
childWidth = childHeight;
|
||||
else
|
||||
childWidth = children[0].get_preferred_width(childHeight)[0];
|
||||
else {
|
||||
let [childMin, childNat] = children[0].get_preferred_width(childHeight);
|
||||
childWidth = childMin;
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
@ -679,36 +784,6 @@ SwitcherList.prototype = {
|
||||
let topPadding = this.actor.get_theme_node().get_padding(St.Side.TOP);
|
||||
let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
|
||||
|
||||
// Show the arrows and gradients when scrolling is needed
|
||||
if (children[children.length - 1].allocation.x2 > this.actor.width - leftPadding - rightPadding && !this._scrollable) {
|
||||
this._leftGradient.set_height(this.actor.height);
|
||||
this._leftGradient.x = this.actor.x;
|
||||
this._leftGradient.y = this.actor.y;
|
||||
|
||||
this._rightGradient.set_height(this.actor.height);
|
||||
this._rightGradient.x = this.actor.x + (this.actor.allocation.x2 - this.actor.allocation.x1) - this._rightGradient.width;
|
||||
this._rightGradient.y = this.actor.y;
|
||||
|
||||
let arrowWidth = Math.floor(leftPadding / 3);
|
||||
let arrowHeight = arrowWidth * 2;
|
||||
this._leftArrow.set_size(arrowWidth, arrowHeight);
|
||||
this._leftArrow.set_position(POPUP_LIST_SPACING, this.actor.height / 2 - arrowWidth);
|
||||
|
||||
arrowWidth = Math.floor(rightPadding / 3);
|
||||
arrowHeight = arrowWidth * 2;
|
||||
this._rightArrow.set_size(arrowWidth, arrowHeight);
|
||||
this._rightArrow.set_position(this._rightGradient.width - arrowHeight, this.actor.height / 2 - arrowWidth);
|
||||
|
||||
this._scrollable = true;
|
||||
|
||||
this._leftGradient.hide();
|
||||
this._rightGradient.show();
|
||||
}
|
||||
else if (!this._scrollable){
|
||||
this._leftGradient.hide();
|
||||
this._rightGradient.hide();
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
@ -723,7 +798,7 @@ 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 = null;
|
||||
this._iconBin = new St.Bin();
|
||||
@ -795,7 +870,8 @@ AppSwitcher.prototype = {
|
||||
|
||||
// We just assume the whole screen here due to weirdness happing with the passed width
|
||||
let focus = global.get_focus_monitor();
|
||||
let availWidth = focus.width - POPUP_LIST_SPACING * 2 - this.actor.get_theme_node().get_horizontal_padding();
|
||||
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
|
||||
let availWidth = focus.width - parentPadding - this.actor.get_theme_node().get_horizontal_padding();
|
||||
let height = 0;
|
||||
|
||||
for(let i = 0; i < iconSizes.length; i++) {
|
||||
@ -811,17 +887,17 @@ AppSwitcher.prototype = {
|
||||
height = iconSizes[0] + iconSpacing;
|
||||
}
|
||||
|
||||
alloc.min_size = height;
|
||||
alloc.natural_size = height;
|
||||
},
|
||||
|
||||
_allocate: function (actor, box, flags) {
|
||||
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) {
|
||||
// Allocate the main list items
|
||||
SwitcherList.prototype._allocate.call(this, actor, box, flags);
|
||||
|
||||
@ -846,16 +922,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);
|
||||
@ -865,7 +938,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');
|
||||
}
|
||||
},
|
||||
|
||||
@ -874,12 +947,10 @@ AppSwitcher.prototype = {
|
||||
this.addItem(appIcon.actor);
|
||||
|
||||
let n = this._arrows.length;
|
||||
let arrow = new St.DrawingArea();
|
||||
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,
|
||||
TRANSPARENT_COLOR,
|
||||
this._curApp == n ? POPUP_ARROW_COLOR : POPUP_UNFOCUSED_ARROW_COLOR);
|
||||
Shell.draw_box_pointer(area, Shell.PointerDirection.DOWN);
|
||||
}));
|
||||
this._list.add_actor(arrow);
|
||||
this._arrows.push(arrow);
|
||||
@ -914,7 +985,7 @@ 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;
|
||||
@ -930,10 +1001,10 @@ ThumbnailList.prototype = {
|
||||
separatorAdded = true;
|
||||
}
|
||||
|
||||
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 bin = new St.Bin({ style_class: 'thumbnail' });
|
||||
|
||||
box.add_actor(bin);
|
||||
this._thumbnailBins.push(bin);
|
||||
|
@ -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;
|
||||
@ -18,18 +17,22 @@ const AppFavorites = imports.ui.appFavorites;
|
||||
const DND = imports.ui.dnd;
|
||||
const GenericDisplay = imports.ui.genericDisplay;
|
||||
const Main = imports.ui.main;
|
||||
const Overview = imports.ui.overview;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Search = imports.ui.search;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Workspace = imports.ui.workspace;
|
||||
|
||||
const APPICON_SIZE = 48;
|
||||
const WELL_MAX_COLUMNS = 8;
|
||||
const MENU_POPUP_TIMEOUT = 600;
|
||||
|
||||
function AllAppView() {
|
||||
function AlphabeticalView() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
AllAppView.prototype = {
|
||||
_init: function(apps) {
|
||||
AlphabeticalView.prototype = {
|
||||
_init: function() {
|
||||
this.actor = new St.BoxLayout({ vertical: true });
|
||||
this._grid = new WellGrid(true);
|
||||
this._appSystem = Shell.AppSystem.get_default();
|
||||
@ -42,17 +45,17 @@ AllAppView.prototype = {
|
||||
},
|
||||
|
||||
_addApp: function(app) {
|
||||
let App = new AppWellIcon(this._appSystem.get_app(app.get_id()));
|
||||
App.connect('launching', Lang.bind(this, function() {
|
||||
let appIcon = new AppWellIcon(this._appSystem.get_app(app.get_id()));
|
||||
appIcon.connect('launching', Lang.bind(this, function() {
|
||||
this.emit('launching');
|
||||
}));
|
||||
App._draggable.connect('drag-begin', Lang.bind(this, function() {
|
||||
appIcon._draggable.connect('drag-begin', Lang.bind(this, function() {
|
||||
this.emit('drag-begin');
|
||||
}));
|
||||
|
||||
this._grid.addItem(App.actor);
|
||||
this._grid.addItem(appIcon.actor);
|
||||
|
||||
this._apps.push(App);
|
||||
this._apps.push(appIcon);
|
||||
},
|
||||
|
||||
refresh: function(apps) {
|
||||
@ -71,7 +74,67 @@ AllAppView.prototype = {
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(AllAppView.prototype);
|
||||
Signals.addSignalMethods(AlphabeticalView.prototype);
|
||||
|
||||
function ViewByCategories() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
ViewByCategories.prototype = {
|
||||
_init: function() {
|
||||
this._appSystem = Shell.AppSystem.get_default();
|
||||
this.actor = new St.BoxLayout({ vertical: true });
|
||||
this.actor._delegate = this;
|
||||
this._sections = [];
|
||||
},
|
||||
|
||||
_updateSections: function(apps) {
|
||||
this._removeAll();
|
||||
|
||||
let sections = this._appSystem.get_sections();
|
||||
if (!sections)
|
||||
return;
|
||||
for (let i = 0; i < sections.length; i++) {
|
||||
if (i) {
|
||||
let actor = new St.Bin({ style_class: 'app-section-divider' });
|
||||
let divider = new St.Bin({ style_class: 'app-section-divider-container',
|
||||
child: actor,
|
||||
x_fill: true });
|
||||
|
||||
this.actor.add(divider, { y_fill: false, expand: true });
|
||||
}
|
||||
let _apps = apps.filter(function(app) {
|
||||
return app.get_section() == sections[i];
|
||||
});
|
||||
this._sections[i] = { view: new AlphabeticalView(),
|
||||
apps: _apps,
|
||||
name: sections[i] };
|
||||
this._sections[i].view.connect('launching', Lang.bind(this, function() {
|
||||
this.emit('launching');
|
||||
}));
|
||||
this._sections[i].view.connect('drag-begin', Lang.bind(this, function() {
|
||||
this.emit('drag-begin');
|
||||
}));
|
||||
this.actor.add(this._sections[i].view.actor, { y_align: St.Align.START, expand: true });
|
||||
}
|
||||
},
|
||||
|
||||
_removeAll: function() {
|
||||
this.actor.destroy_children();
|
||||
this._sections.forEach(function (section) { section.view.disconnectAll(); });
|
||||
|
||||
this._sections = [];
|
||||
},
|
||||
|
||||
refresh: function(apps) {
|
||||
this._updateSections(apps);
|
||||
for (let i = 0; i < this._sections.length; i++) {
|
||||
this._sections[i].view.refresh(this._sections[i].apps);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(ViewByCategories.prototype);
|
||||
|
||||
/* This class represents a display containing a collection of application items.
|
||||
* The applications are sorted based on their name.
|
||||
@ -100,7 +163,7 @@ AllAppDisplay.prototype = {
|
||||
this.actor.add(bin);
|
||||
this.actor.add(view, { expand: true, y_fill: false, y_align: St.Align.START });
|
||||
|
||||
this._appView = new AllAppView();
|
||||
this._appView = new ViewByCategories();
|
||||
this._appView.connect('launching', Lang.bind(this, this.close));
|
||||
this._appView.connect('drag-begin', Lang.bind(this, this.close));
|
||||
this._scrollView.add_actor(this._appView.actor);
|
||||
@ -119,9 +182,28 @@ AllAppDisplay.prototype = {
|
||||
},
|
||||
|
||||
toggle: function() {
|
||||
this.emit('open-state-changed', !this.actor.visible);
|
||||
|
||||
this.actor.visible = !this.actor.visible;
|
||||
if (this.actor.visible) {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: Overview.PANE_FADE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
function() {
|
||||
this.actor.hide();
|
||||
this.emit('open-state-changed',
|
||||
this.actor.visible);
|
||||
})
|
||||
});
|
||||
} else {
|
||||
this.actor.show();
|
||||
this.emit('open-state-changed', this.actor.visible);
|
||||
this.actor.opacity = 0;
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: Overview.PANE_FADE_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
close: function() {
|
||||
@ -286,17 +368,12 @@ BaseAppSearchProvider.prototype = {
|
||||
|
||||
activateResult: function(id) {
|
||||
let app = this._appSys.get_app(id);
|
||||
let windows = app.get_windows();
|
||||
|
||||
if (windows.length > 0)
|
||||
Main.activateWindow(windows[0]);
|
||||
else
|
||||
app.launch();
|
||||
app.activate();
|
||||
},
|
||||
|
||||
dragActivateResult: function(id) {
|
||||
let app = this._appSys.get_app(id);
|
||||
app.launch();
|
||||
app.open_new_window();
|
||||
}
|
||||
};
|
||||
|
||||
@ -328,7 +405,7 @@ AppSearchProvider.prototype = {
|
||||
},
|
||||
|
||||
expandSearch: function(terms) {
|
||||
log("TODO expand search");
|
||||
log('TODO expand search');
|
||||
}
|
||||
};
|
||||
|
||||
@ -379,7 +456,6 @@ AppIcon.prototype = {
|
||||
box.add(this.icon, { expand: true, x_fill: false, y_fill: false });
|
||||
|
||||
this._name = new St.Label({ text: this.app.get_name() });
|
||||
this._name.clutter_text.line_alignment = Pango.Alignment.CENTER;
|
||||
box.add_actor(this._name);
|
||||
}
|
||||
};
|
||||
@ -391,7 +467,6 @@ function AppWellIcon(app) {
|
||||
AppWellIcon.prototype = {
|
||||
_init : function(app) {
|
||||
this.app = app;
|
||||
this._running = false;
|
||||
this.actor = new St.Clickable({ style_class: 'app-well-app',
|
||||
reactive: true,
|
||||
x_fill: true,
|
||||
@ -402,74 +477,79 @@ AppWellIcon.prototype = {
|
||||
this.actor.set_child(this._icon.actor);
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this._menu = null;
|
||||
|
||||
this._draggable = DND.makeDraggable(this.actor,
|
||||
{ manualMode: true });
|
||||
this._dragStartX = null;
|
||||
this._dragStartY = null;
|
||||
this._menu = null;
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
|
||||
this._draggable = DND.makeDraggable(this.actor);
|
||||
this._draggable.connect('drag-begin', Lang.bind(this,
|
||||
function () {
|
||||
this._removeMenuTimeout();
|
||||
Main.overview.beginItemDrag(this);
|
||||
}));
|
||||
this._draggable.connect('drag-end', Lang.bind(this,
|
||||
function () {
|
||||
Main.overview.endItemDrag(this);
|
||||
}));
|
||||
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||
this.actor.connect('notify::hover', Lang.bind(this, this._onHoverChange));
|
||||
this.actor.connect('show', Lang.bind(this, this._onShow));
|
||||
this.actor.connect('hide', Lang.bind(this, this._onHideDestroy));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onHideDestroy));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._appWindowChangedId = 0;
|
||||
this._menuTimeoutId = 0;
|
||||
this._stateChangedId = this.app.connect('notify::state',
|
||||
Lang.bind(this,
|
||||
this._onStateChanged));
|
||||
this._onStateChanged();
|
||||
},
|
||||
|
||||
_onShow: function() {
|
||||
this._appWindowChangedId = this.app.connect('windows-changed',
|
||||
Lang.bind(this,
|
||||
this._updateStyleClass));
|
||||
this._updateStyleClass();
|
||||
_onDestroy: function() {
|
||||
if (this._stateChangedId > 0)
|
||||
this.app.disconnect(this._stateChangedId);
|
||||
this._stateChangedId = 0;
|
||||
this._removeMenuTimeout();
|
||||
},
|
||||
|
||||
_onHideDestroy: function() {
|
||||
if (this._appWindowChangedId > 0)
|
||||
this.app.disconnect(this._appWindowChangedId);
|
||||
_removeMenuTimeout: function() {
|
||||
if (this._menuTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._menuTimeoutId);
|
||||
this._menuTimeoutId = 0;
|
||||
}
|
||||
},
|
||||
|
||||
_updateStyleClass: function() {
|
||||
let windows = this.app.get_windows();
|
||||
let running = windows.length > 0;
|
||||
this._running = running;
|
||||
let style = "app-well-app";
|
||||
if (this._running)
|
||||
style += " running";
|
||||
if (this._selected)
|
||||
style += " selected";
|
||||
this.actor.style_class = style;
|
||||
_onStateChanged: function() {
|
||||
if (this.app.state != Shell.AppState.STOPPED)
|
||||
this.actor.add_style_class_name('running');
|
||||
else
|
||||
this.actor.remove_style_class_name('running');
|
||||
},
|
||||
|
||||
_onButtonPress: function(actor, event) {
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
this._dragStartX = stageX;
|
||||
this._dragStartY = stageY;
|
||||
},
|
||||
|
||||
_onHoverChange: function(actor) {
|
||||
let hover = this.actor.hover;
|
||||
if (!hover) {
|
||||
if (this.actor.pressed && this._dragStartX != null) {
|
||||
this.actor.fake_release();
|
||||
this._draggable.startDrag(this._dragStartX, this._dragStartY,
|
||||
global.get_current_time());
|
||||
} else {
|
||||
this._dragStartX = null;
|
||||
this._dragStartY = null;
|
||||
}
|
||||
let button = event.get_button();
|
||||
if (button == 1) {
|
||||
this._removeMenuTimeout();
|
||||
this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT,
|
||||
Lang.bind(this, function() {
|
||||
this.popupMenu();
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
_onClicked: function(actor, event) {
|
||||
this._removeMenuTimeout();
|
||||
|
||||
let button = event.get_button();
|
||||
if (button == 1) {
|
||||
this._onActivate(event);
|
||||
} else if (button == 2) {
|
||||
let newWorkspace = Main.overview.workspaces.addWorkspace();
|
||||
if (newWorkspace != null) {
|
||||
newWorkspace.activate(global.get_current_time());
|
||||
this.emit('launching');
|
||||
this.app.open_new_window();
|
||||
Main.overview.hide();
|
||||
}
|
||||
} else if (button == 3) {
|
||||
// Don't bind to the right click here; we want left click outside the
|
||||
// area to deactivate as well.
|
||||
this.popupMenu(0);
|
||||
this.popupMenu();
|
||||
}
|
||||
return false;
|
||||
},
|
||||
@ -478,7 +558,10 @@ AppWellIcon.prototype = {
|
||||
return this.app.get_id();
|
||||
},
|
||||
|
||||
popupMenu: function(activatingButton) {
|
||||
popupMenu: function() {
|
||||
this._removeMenuTimeout();
|
||||
this.actor.fake_release();
|
||||
|
||||
if (!this._menu) {
|
||||
this._menu = new AppIconMenu(this);
|
||||
this._menu.connect('highlight-window', Lang.bind(this, function (menu, window) {
|
||||
@ -494,18 +577,16 @@ AppWellIcon.prototype = {
|
||||
this._onMenuPoppedDown();
|
||||
}
|
||||
}));
|
||||
|
||||
this._menuManager.addMenu(this._menu, true);
|
||||
}
|
||||
|
||||
this._menu.popup(activatingButton);
|
||||
this._menu.popup();
|
||||
this._menuManager.grab();
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
activateMostRecentWindow: function () {
|
||||
let mostRecentWindow = this.app.get_windows()[0];
|
||||
Main.activateWindow(mostRecentWindow);
|
||||
},
|
||||
|
||||
highlightWindow: function(metaWindow) {
|
||||
if (this._didActivateWindow)
|
||||
return;
|
||||
@ -518,13 +599,17 @@ AppWellIcon.prototype = {
|
||||
if (metaWindow) {
|
||||
this._didActivateWindow = true;
|
||||
Main.activateWindow(metaWindow);
|
||||
} else
|
||||
} else {
|
||||
Main.overview.hide();
|
||||
}
|
||||
},
|
||||
|
||||
setSelected: function (isSelected) {
|
||||
this._selected = isSelected;
|
||||
this._updateStyleClass();
|
||||
if (this._selected)
|
||||
this.actor.add_style_class_name('selected');
|
||||
else
|
||||
this.actor.remove_style_class_name('selected');
|
||||
},
|
||||
|
||||
_onMenuPoppedUp: function() {
|
||||
@ -536,6 +621,8 @@ AppWellIcon.prototype = {
|
||||
},
|
||||
|
||||
_onMenuPoppedDown: function() {
|
||||
this.actor.sync_hover();
|
||||
|
||||
if (this._didActivateWindow)
|
||||
return;
|
||||
if (!this._setWindowSelection)
|
||||
@ -546,38 +633,29 @@ AppWellIcon.prototype = {
|
||||
},
|
||||
|
||||
_getRunning: function() {
|
||||
return this.app.get_windows().length > 0;
|
||||
return this.app.state != Shell.AppState.STOPPED;
|
||||
},
|
||||
|
||||
_onActivate: function (event) {
|
||||
let running = this._getRunning();
|
||||
this.emit('launching');
|
||||
let modifiers = Shell.get_event_state(event);
|
||||
|
||||
if (!running) {
|
||||
this.app.launch();
|
||||
Main.overview.hide();
|
||||
if (modifiers & Clutter.ModifierType.CONTROL_MASK
|
||||
&& this.app.state == Shell.AppState.RUNNING) {
|
||||
this.app.open_new_window();
|
||||
} else {
|
||||
let modifiers = Shell.get_event_state(event);
|
||||
|
||||
if (modifiers & Clutter.ModifierType.CONTROL_MASK) {
|
||||
this.app.launch();
|
||||
Main.overview.hide();
|
||||
} else {
|
||||
this.activateMostRecentWindow();
|
||||
}
|
||||
this.app.activate();
|
||||
}
|
||||
Main.overview.hide();
|
||||
},
|
||||
|
||||
// called by this._menuManager when it has the grab
|
||||
menuEventFilter: function(event) {
|
||||
return this._menu.menuEventFilter(event);
|
||||
},
|
||||
|
||||
shellWorkspaceLaunch : function() {
|
||||
// Here we just always launch the application again, even if we know
|
||||
// it was already running. For most applications this
|
||||
// should have the effect of creating a new window, whether that's
|
||||
// a second process (in the case of Calculator) or IPC to existing
|
||||
// instance (Firefox). There are a few less-sensical cases such
|
||||
// as say Pidgin, but ideally what we do there is have the app
|
||||
// express to us that it doesn't do relaunch=new-window in the
|
||||
// .desktop file.
|
||||
this.app.launch();
|
||||
this.app.open_new_window();
|
||||
},
|
||||
|
||||
getDragActor: function() {
|
||||
@ -597,116 +675,34 @@ function AppIconMenu(source) {
|
||||
}
|
||||
|
||||
AppIconMenu.prototype = {
|
||||
__proto__: PopupMenu.PopupMenu.prototype,
|
||||
|
||||
_init: function(source) {
|
||||
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, St.Align.MIDDLE, St.Side.LEFT, 0);
|
||||
|
||||
this._source = source;
|
||||
|
||||
this._arrowSize = 4; // CSS default
|
||||
this._spacing = 0; // CSS default
|
||||
this.connect('active-changed', Lang.bind(this, this._onActiveChanged));
|
||||
this.connect('activate', Lang.bind(this, this._onActivate));
|
||||
this.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
||||
|
||||
this._dragStartX = 0;
|
||||
this._dragStartY = 0;
|
||||
|
||||
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._windowContainerBox = new St.Bin({ style_class: 'app-well-menu' });
|
||||
this._windowContainer = new Shell.Menu({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
width: Main.overview._dash.actor.width });
|
||||
this._windowContainerBox.set_child(this._windowContainer);
|
||||
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._windowContainerBox);
|
||||
|
||||
// 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._borderColor = new Clutter.Color();
|
||||
this._backgroundColor = new Clutter.Color();
|
||||
this._windowContainerBox.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||
|
||||
this._arrow = new St.DrawingArea();
|
||||
this._arrow.connect('repaint', Lang.bind(this, function (area) {
|
||||
Shell.draw_box_pointer(area,
|
||||
Shell.PointerDirection.LEFT,
|
||||
this._borderColor,
|
||||
this._backgroundColor);
|
||||
}));
|
||||
this.actor.add_actor(this._arrow);
|
||||
this.actor.add_style_class_name('app-well-menu');
|
||||
|
||||
// Chain our visibility and lifecycle to that of the source
|
||||
source.actor.connect('notify::mapped', Lang.bind(this, function () {
|
||||
if (!source.actor.mapped)
|
||||
this._windowContainer.popdown();
|
||||
this.close();
|
||||
}));
|
||||
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._windowContainerBox.get_preferred_width(forHeight);
|
||||
min += this._arrowSize;
|
||||
natural += this._arrowSize;
|
||||
alloc.min_size = min;
|
||||
alloc.natural_size = natural;
|
||||
},
|
||||
|
||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||
let [min, natural] = this._windowContainerBox.get_preferred_height(forWidth);
|
||||
alloc.min_size = min;
|
||||
alloc.natural_size = natural;
|
||||
},
|
||||
|
||||
_allocate: function(actor, box, flags) {
|
||||
let childBox = new Clutter.ActorBox();
|
||||
let themeNode = this._windowContainerBox.get_theme_node();
|
||||
|
||||
let width = box.x2 - box.x1;
|
||||
let height = box.y2 - box.y1;
|
||||
|
||||
childBox.x1 = 0;
|
||||
childBox.x2 = this._arrowSize;
|
||||
childBox.y1 = Math.floor((height / 2) - (this._arrowSize / 2));
|
||||
childBox.y2 = childBox.y1 + this._arrowSize;
|
||||
this._arrow.allocate(childBox, flags);
|
||||
|
||||
// Ensure the arrow is above the border area
|
||||
let border = themeNode.get_border_width(St.Side.LEFT);
|
||||
childBox.x1 = this._arrowSize - border;
|
||||
childBox.x2 = width;
|
||||
childBox.y1 = 0;
|
||||
childBox.y2 = height;
|
||||
this._windowContainerBox.allocate(childBox, flags);
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
},
|
||||
|
||||
_redisplay: function() {
|
||||
this._windowContainer.remove_all();
|
||||
this.removeAll();
|
||||
|
||||
let windows = this._source.app.get_windows();
|
||||
|
||||
this._windowContainer.show();
|
||||
|
||||
let iconsDiffer = false;
|
||||
let texCache = St.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();
|
||||
@ -717,8 +713,8 @@ AppIconMenu.prototype = {
|
||||
this._appendSeparator();
|
||||
separatorShown = true;
|
||||
}
|
||||
let box = this._appendMenuItem(windows[i].title);
|
||||
box._window = windows[i];
|
||||
let item = this._appendMenuItem(windows[i].title);
|
||||
item._window = windows[i];
|
||||
}
|
||||
|
||||
if (windows.length > 0)
|
||||
@ -737,45 +733,53 @@ AppIconMenu.prototype = {
|
||||
},
|
||||
|
||||
_appendSeparator: function () {
|
||||
let bin = new St.Bin({ style_class: "app-well-menu-separator" });
|
||||
this._windowContainer.append_separator(bin, Big.BoxPackFlags.NONE);
|
||||
let separator = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.addMenuItem(separator);
|
||||
},
|
||||
|
||||
_appendMenuItem: function(labelText) {
|
||||
let box = new St.BoxLayout({ style_class: 'app-well-menu-item',
|
||||
reactive: true });
|
||||
let label = new St.Label({ text: labelText });
|
||||
box.add(label);
|
||||
this._windowContainer.append(box, Big.BoxPackFlags.NONE);
|
||||
return box;
|
||||
// FIXME: app-well-menu-item style
|
||||
let item = new PopupMenu.PopupMenuItem(labelText);
|
||||
this.addMenuItem(item);
|
||||
return item;
|
||||
},
|
||||
|
||||
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;
|
||||
x = Math.floor(stageX + stageWidth);
|
||||
y = Math.floor(stageY + (stageHeight / 2) - (this.actor.height / 2));
|
||||
|
||||
this.actor.set_position(x, y);
|
||||
this.actor.show();
|
||||
this.open();
|
||||
},
|
||||
|
||||
popdown: function() {
|
||||
this._windowContainer.popdown();
|
||||
this.emit('popup', false);
|
||||
this.actor.hide();
|
||||
_onOpenStateChanged: function (menu, open) {
|
||||
if (open) {
|
||||
this.emit('popup', true);
|
||||
} else {
|
||||
this._updateHighlight(null);
|
||||
this.emit('popup', false);
|
||||
}
|
||||
},
|
||||
|
||||
selectWindow: function(metaWindow) {
|
||||
this._selectMenuItemForWindow(metaWindow);
|
||||
// called by this._menuManager when it has the grab
|
||||
menuEventFilter: function(event) {
|
||||
let eventType = event.type();
|
||||
|
||||
// Check if the user is interacting with a window representation
|
||||
// rather than interacting with the menu
|
||||
|
||||
if (eventType == Clutter.EventType.BUTTON_RELEASE) {
|
||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
||||
if (metaWindow)
|
||||
this.emit('activate-window', metaWindow);
|
||||
} else if (eventType == Clutter.EventType.ENTER) {
|
||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
||||
if (metaWindow)
|
||||
this._selectMenuItemForWindow(metaWindow, true);
|
||||
} else if (eventType == Clutter.EventType.LEAVE) {
|
||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
||||
if (metaWindow)
|
||||
this._selectMenuItemForWindow(metaWindow, false);
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_findMetaWindowForActor: function (actor) {
|
||||
@ -786,69 +790,37 @@ AppIconMenu.prototype = {
|
||||
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.set_style_pseudo_class(null);
|
||||
if (this._highlightedItem)
|
||||
this.emit('highlight-window', null);
|
||||
}
|
||||
this._highlightedItem = item;
|
||||
if (this._highlightedItem) {
|
||||
item.set_style_pseudo_class('hover');
|
||||
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;
|
||||
_selectMenuItemForWindow: function (metaWindow, selected) {
|
||||
let items = this.getMenuItems();
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
let item = items[i];
|
||||
let menuMetaWindow = item._window;
|
||||
if (menuMetaWindow == metaWindow)
|
||||
this._updateHighlight(child);
|
||||
item.setActive(selected);
|
||||
}
|
||||
},
|
||||
|
||||
// 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) {
|
||||
_onActiveChanged: function (menu, child) {
|
||||
this._updateHighlight(child);
|
||||
},
|
||||
|
||||
_onItemActivate: function (actor, child) {
|
||||
_onActivate: 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._source.app.open_new_window();
|
||||
this.emit('activate-window', null);
|
||||
} else if (child == this._toggleFavoriteMenuItem) {
|
||||
let favs = AppFavorites.getAppFavorites();
|
||||
@ -858,34 +830,7 @@ AppIconMenu.prototype = {
|
||||
else
|
||||
favs.addFavorite(this._source.app.get_id());
|
||||
}
|
||||
this.popdown();
|
||||
},
|
||||
|
||||
_onWindowSelectionCancelled: function () {
|
||||
this.emit('highlight-window', null);
|
||||
this.popdown();
|
||||
},
|
||||
|
||||
_onStyleChanged: function() {
|
||||
let themeNode = this._windowContainerBox.get_theme_node();
|
||||
let [success, len] = themeNode.get_length('-shell-arrow-size', false);
|
||||
if (success) {
|
||||
this._arrowSize = len;
|
||||
this.actor.queue_relayout();
|
||||
}
|
||||
[success, len] = themeNode.get_length('-shell-menu-spacing', false)
|
||||
if (success) {
|
||||
this._windowContainer.spacing = len;
|
||||
}
|
||||
let color = new Clutter.Color();
|
||||
if (themeNode.get_background_color(color)) {
|
||||
this._backgroundColor = color;
|
||||
color = new Clutter.Color();
|
||||
}
|
||||
if (themeNode.get_border_color(St.Side.LEFT, color)) {
|
||||
this._borderColor = color;
|
||||
}
|
||||
this._arrow.queue_repaint();
|
||||
this.close();
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(AppIconMenu.prototype);
|
||||
@ -896,7 +841,7 @@ function WellGrid() {
|
||||
|
||||
WellGrid.prototype = {
|
||||
_init: function() {
|
||||
this.actor = new St.BoxLayout({ name: "dashAppWell", vertical: true });
|
||||
this.actor = new St.BoxLayout({ name: 'dashAppWell', vertical: true });
|
||||
// Pulled from CSS, but hardcode some defaults here
|
||||
this._spacing = 0;
|
||||
this._item_size = 48;
|
||||
@ -957,7 +902,12 @@ WellGrid.prototype = {
|
||||
let childYSpacing = Math.max(0, height - childNaturalHeight) / 2;
|
||||
|
||||
let childBox = new Clutter.ActorBox();
|
||||
childBox.x1 = Math.floor(x + childXSpacing);
|
||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL) {
|
||||
let _x = box.x2 - (x + width);
|
||||
childBox.x1 = Math.floor(_x - childXSpacing);
|
||||
} else {
|
||||
childBox.x1 = Math.floor(x + childXSpacing);
|
||||
}
|
||||
childBox.y1 = Math.floor(y + childYSpacing);
|
||||
childBox.x2 = childBox.x1 + width;
|
||||
childBox.y2 = childBox.y1 + height;
|
||||
@ -982,7 +932,6 @@ WellGrid.prototype = {
|
||||
let nColumns = 0;
|
||||
let usedWidth = 0;
|
||||
while (nColumns < WELL_MAX_COLUMNS &&
|
||||
nColumns < children.length &&
|
||||
(usedWidth + this._item_size <= forWidth)) {
|
||||
usedWidth += this._item_size + this._spacing;
|
||||
nColumns += 1;
|
||||
@ -1022,26 +971,24 @@ function AppWell() {
|
||||
|
||||
AppWell.prototype = {
|
||||
_init : function() {
|
||||
this._placeholderText = null;
|
||||
this._menus = [];
|
||||
this._menuDisplays = [];
|
||||
|
||||
this._favorites = [];
|
||||
|
||||
this.actor = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
|
||||
x_align: Big.BoxAlignment.CENTER });
|
||||
this._grid = new WellGrid();
|
||||
this.actor = this._grid.actor;
|
||||
this.actor._delegate = this;
|
||||
|
||||
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
|
||||
|
||||
this._grid = new WellGrid();
|
||||
this.actor.append(this._grid.actor, Big.BoxPackFlags.EXPAND);
|
||||
|
||||
this._tracker = Shell.WindowTracker.get_default();
|
||||
this._appSystem = Shell.AppSystem.get_default();
|
||||
|
||||
this._appSystem.connect('installed-changed', Lang.bind(this, this._queueRedisplay));
|
||||
AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._queueRedisplay));
|
||||
this._tracker.connect('app-running-changed', Lang.bind(this, this._queueRedisplay));
|
||||
this._tracker.connect('app-state-changed', Lang.bind(this, this._queueRedisplay));
|
||||
},
|
||||
|
||||
_appIdListToHash: function(apps) {
|
||||
@ -1061,7 +1008,7 @@ AppWell.prototype = {
|
||||
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
|
||||
|
||||
/* hardcode here pending some design about how exactly desktop contexts behave */
|
||||
let contextId = "";
|
||||
let contextId = '';
|
||||
|
||||
let running = this._tracker.get_running_apps(contextId);
|
||||
let runningIds = this._appIdListToHash(running);
|
||||
@ -1081,10 +1028,14 @@ AppWell.prototype = {
|
||||
let display = new AppWellIcon(app);
|
||||
this._grid.addItem(display.actor);
|
||||
}
|
||||
if (this._placeholderText) {
|
||||
this._placeholderText.destroy();
|
||||
this._placeholderText = null;
|
||||
}
|
||||
|
||||
if (running.length == 0 && nFavorites == 0) {
|
||||
let text = new St.Label({ text: _("Drag here to add favorites")});
|
||||
this._grid.actor.set_child(text);
|
||||
this._placeholderText = new St.Label({ text: _("Drag here to add favorites") });
|
||||
this.actor.add_actor(this._placeholderText);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -13,12 +13,11 @@ function AppFavorites() {
|
||||
}
|
||||
|
||||
AppFavorites.prototype = {
|
||||
FAVORITE_APPS_KEY: 'favorite_apps',
|
||||
FAVORITE_APPS_KEY: 'favorite-apps',
|
||||
|
||||
_init: function() {
|
||||
this._favorites = {};
|
||||
this._gconf = Shell.GConf.get_default();
|
||||
this._gconf.connect('changed::' + this.FAVORITE_APPS_KEY, Lang.bind(this, this._onFavsChanged));
|
||||
global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, Lang.bind(this, this._onFavsChanged));
|
||||
this._reload();
|
||||
},
|
||||
|
||||
@ -28,7 +27,7 @@ AppFavorites.prototype = {
|
||||
},
|
||||
|
||||
_reload: function() {
|
||||
let ids = Shell.GConf.get_default().get_string_list('favorite_apps');
|
||||
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let apps = ids.map(function (id) {
|
||||
return appSys.get_app(id);
|
||||
@ -75,7 +74,7 @@ AppFavorites.prototype = {
|
||||
|
||||
let ids = this._getIds();
|
||||
ids.push(appId);
|
||||
this._gconf.set_string_list(this.FAVORITE_APPS_KEY, ids);
|
||||
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
||||
this._favorites[appId] = app;
|
||||
return true;
|
||||
},
|
||||
@ -96,7 +95,7 @@ AppFavorites.prototype = {
|
||||
return false;
|
||||
|
||||
let ids = this._getIds().filter(function (id) { return id != appId; });
|
||||
this._gconf.set_string_list(this.FAVORITE_APPS_KEY, ids);
|
||||
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
||||
return true;
|
||||
},
|
||||
|
||||
|
199
js/ui/boxpointer.js
Normal file
199
js/ui/boxpointer.js
Normal file
@ -0,0 +1,199 @@
|
||||
/* -*- 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) {
|
||||
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);
|
||||
|
||||
childBox.x1 = borderWidth;
|
||||
childBox.y1 = borderWidth;
|
||||
childBox.x2 = availWidth - borderWidth;
|
||||
childBox.y2 = availHeight - borderWidth;
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
childBox.y1 += rise;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
childBox.y2 -= rise;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
childBox.x1 += rise;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
childBox.x2 -= rise;
|
||||
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 halfBase = Math.floor(base/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);
|
||||
|
||||
// Translate so that box goes from 0,0 to boxWidth,boxHeight,
|
||||
// with the arrow poking out of that
|
||||
if (this._arrowSide == St.Side.TOP) {
|
||||
cr.translate(0, rise);
|
||||
} else if (this._arrowSide == St.Side.LEFT) {
|
||||
cr.translate(rise, 0);
|
||||
}
|
||||
|
||||
cr.moveTo(borderRadius, halfBorder);
|
||||
|
||||
if (this._arrowSide == St.Side.TOP) {
|
||||
cr.lineTo(this._arrowOrigin - halfBase, halfBorder);
|
||||
cr.lineTo(this._arrowOrigin, halfBorder - rise);
|
||||
cr.lineTo(this._arrowOrigin + halfBase, halfBorder);
|
||||
}
|
||||
cr.lineTo(boxWidth - borderRadius, halfBorder);
|
||||
|
||||
cr.arc(boxWidth - borderRadius - halfBorder, borderRadius + halfBorder, borderRadius,
|
||||
3*Math.PI/2, Math.PI*2);
|
||||
|
||||
if (this._arrowSide == St.Side.RIGHT) {
|
||||
cr.lineTo(boxWidth - halfBorder, this._arrowOrigin - halfBase);
|
||||
cr.lineTo(boxWidth - halfBorder + rise, this._arrowOrigin);
|
||||
cr.lineTo(boxWidth - halfBorder, this._arrowOrigin + halfBase);
|
||||
}
|
||||
cr.lineTo(boxWidth - halfBorder, boxHeight - borderRadius);
|
||||
|
||||
cr.arc(boxWidth - borderRadius - halfBorder, boxHeight - borderRadius - halfBorder, borderRadius,
|
||||
0, Math.PI/2);
|
||||
|
||||
if (this._arrowSide == St.Side.BOTTOM) {
|
||||
cr.lineTo(this._arrowOrigin + halfBase, boxHeight - halfBorder);
|
||||
cr.lineTo(this._arrowOrigin, boxHeight - halfBorder + rise);
|
||||
cr.lineTo(this._arrowOrigin - halfBase, boxHeight - halfBorder);
|
||||
}
|
||||
cr.lineTo(borderRadius, boxHeight - halfBorder);
|
||||
|
||||
cr.arc(borderRadius + halfBorder, boxHeight - borderRadius - halfBorder, borderRadius,
|
||||
Math.PI/2, Math.PI);
|
||||
|
||||
if (this._arrowSide == St.Side.LEFT) {
|
||||
cr.lineTo(halfBorder, this._arrowOrigin + halfBase);
|
||||
cr.lineTo(halfBorder - rise, this._arrowOrigin);
|
||||
cr.lineTo(halfBorder, this._arrowOrigin - halfBase);
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
};
|
@ -1,12 +1,16 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Pango = imports.gi.Pango;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Gettext_gtk20 = imports.gettext.domain('gtk20');
|
||||
|
||||
const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
|
||||
const WEEKDATE_HEADER_WIDTH_DIGITS = 3;
|
||||
const SHOW_WEEKDATE_KEY = 'show-weekdate';
|
||||
|
||||
function _sameDay(dateA, dateB) {
|
||||
return (dateA.getDate() == dateB.getDate() &&
|
||||
@ -14,6 +18,32 @@ function _sameDay(dateA, dateB) {
|
||||
dateA.getYear() == dateB.getYear());
|
||||
}
|
||||
|
||||
function _getCalendarWeekForDate(date) {
|
||||
// Based on the algorithms found here:
|
||||
// http://en.wikipedia.org/wiki/Talk:ISO_week_date
|
||||
let midnightDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
||||
// Need to get Monday to be 1 ... Sunday to be 7
|
||||
let dayOfWeek = 1 + ((midnightDate.getDay() + 6) % 7);
|
||||
let nearestThursday = new Date(midnightDate.getFullYear(), midnightDate.getMonth(),
|
||||
midnightDate.getDate() + (4 - dayOfWeek));
|
||||
|
||||
let jan1st = new Date(nearestThursday.getFullYear(), 0, 1);
|
||||
let diffDate = nearestThursday - jan1st;
|
||||
let dayNumber = Math.floor(Math.abs(diffDate) / MSECS_IN_DAY);
|
||||
let weekNumber = Math.floor(dayNumber / 7) + 1;
|
||||
|
||||
return weekNumber;
|
||||
}
|
||||
|
||||
function _getDigitWidth(actor){
|
||||
let context = actor.get_pango_context();
|
||||
let themeNode = actor.get_theme_node();
|
||||
let font = themeNode.get_font();
|
||||
let metrics = context.get_metrics(font, context.get_language());
|
||||
let width = metrics.get_approximate_digit_width();
|
||||
return width;
|
||||
}
|
||||
|
||||
function Calendar() {
|
||||
this._init();
|
||||
}
|
||||
@ -24,27 +54,34 @@ 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) {
|
||||
this._weekdate = NaN;
|
||||
this._digitWidth = NaN;
|
||||
this._settings = new Gio.Settings({ schema: 'org.gnome.shell.calendar' });
|
||||
|
||||
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
|
||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||
|
||||
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");
|
||||
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,50 +89,13 @@ 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',
|
||||
Lang.bind(this, this._onScroll));
|
||||
|
||||
// Top line of the calendar '<| September 2009 |>'
|
||||
this._topBox = new St.BoxLayout();
|
||||
this.actor.add(this._topBox,
|
||||
{ row: 0, col: 0, col_span: 7 });
|
||||
|
||||
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));
|
||||
|
||||
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: forwardlabel, style_class: 'calendar-change-month' });
|
||||
this._topBox.add(forward);
|
||||
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
|
||||
// them in the right cell in the table. It doesn't matter if we add them in order
|
||||
let iter = new Date(this.date);
|
||||
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") }),
|
||||
{ row: 1,
|
||||
col: (7 + iter.getDay() - this._weekStart) % 7,
|
||||
x_fill: false, x_align: St.Align.END });
|
||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||
}
|
||||
|
||||
// All the children after this are days, and get removed when we update the calendar
|
||||
this._firstDayIndex = this.actor.get_children().length;
|
||||
|
||||
this._buildHeader ();
|
||||
this._update();
|
||||
},
|
||||
|
||||
@ -107,6 +107,74 @@ Calendar.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
_buildHeader: function() {
|
||||
let offsetCols = this._useWeekdate ? 1 : 0;
|
||||
this.actor.destroy_children();
|
||||
|
||||
// Top line of the calendar '<| September 2009 |>'
|
||||
this._topBox = new St.BoxLayout();
|
||||
this.actor.add(this._topBox,
|
||||
{ row: 0, col: 0, col_span: offsetCols + 7 });
|
||||
|
||||
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChange));
|
||||
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));
|
||||
|
||||
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: forwardlabel, style_class: 'calendar-change-month' });
|
||||
this._topBox.add(forward);
|
||||
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
|
||||
// them in the right cell in the table. It doesn't matter if we add them in order
|
||||
let iter = new Date(this.date);
|
||||
iter.setSeconds(0); // Leap second protection. Hah!
|
||||
iter.setHours(12);
|
||||
|
||||
if (this._useWeekdate) {
|
||||
this._weekdateHeader = new St.Label();
|
||||
this.actor.add(this._weekdateHeader,
|
||||
{ row: 1,
|
||||
col: 0,
|
||||
x_fill: false, x_align: St.Align.MIDDLE });
|
||||
this._setWeekdateHeaderWidth();
|
||||
} else {
|
||||
this._weekdateHeader = null;
|
||||
}
|
||||
|
||||
for (let i = 0; i < 7; i++) {
|
||||
this.actor.add(new St.Label({ text: iter.toLocaleFormat('%a') }),
|
||||
{ row: 1,
|
||||
col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7,
|
||||
x_fill: false, x_align: St.Align.END });
|
||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||
}
|
||||
|
||||
// All the children after this are days, and get removed when we update the calendar
|
||||
this._firstDayIndex = this.actor.get_children().length;
|
||||
},
|
||||
|
||||
_onStyleChange: function(actor, event) {
|
||||
// width of a digit in pango units
|
||||
this._digitWidth = _getDigitWidth(this.actor) / Pango.SCALE;
|
||||
this._setWeekdateHeaderWidth();
|
||||
},
|
||||
|
||||
_setWeekdateHeaderWidth: function() {
|
||||
if (this.digitWidth != NaN && this._useWeekdate && this._weekdateHeader) {
|
||||
this._weekdateHeader.set_width (this._digitWidth * WEEKDATE_HEADER_WIDTH_DIGITS);
|
||||
}
|
||||
},
|
||||
|
||||
_onScroll : function(actor, event) {
|
||||
switch (event.get_scroll_direction()) {
|
||||
case Clutter.ScrollDirection.UP:
|
||||
@ -140,6 +208,12 @@ Calendar.prototype = {
|
||||
this._update();
|
||||
},
|
||||
|
||||
_onSettingsChange: function() {
|
||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||
this._buildHeader();
|
||||
this._update();
|
||||
},
|
||||
|
||||
_update: function() {
|
||||
this._dateLabel.text = this.date.toLocaleFormat(this._headerFormat);
|
||||
|
||||
@ -161,15 +235,25 @@ 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';
|
||||
|
||||
let offsetCols = this._useWeekdate ? 1 : 0;
|
||||
this.actor.add(label,
|
||||
{ row: row, col: (7 + iter.getDay() - this._weekStart) % 7,
|
||||
{ row: row, col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7,
|
||||
x_fill: false, x_align: St.Align.END });
|
||||
|
||||
if (this._useWeekdate && iter.getDay() == 4) {
|
||||
let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
|
||||
style_class: 'calendar-day calendar-calendarweek'});
|
||||
this.actor.add(label,
|
||||
{ row: row, col: 0,
|
||||
x_fill: false, x_align: St.Align.MIDDLE });
|
||||
}
|
||||
|
||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||
if (iter.getDay() == this._weekStart) {
|
||||
// We stop on the first "first day of the week" after the month we are displaying
|
||||
|
170
js/ui/chrome.js
170
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,13 +59,10 @@ Chrome.prototype = {
|
||||
this._queueUpdateRegions();
|
||||
},
|
||||
|
||||
_verifyAncestry: function(actor, ancestor) {
|
||||
while (actor) {
|
||||
if (actor == ancestor)
|
||||
return true;
|
||||
actor = actor.get_parent();
|
||||
}
|
||||
return false;
|
||||
_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);
|
||||
},
|
||||
|
||||
// addActor:
|
||||
@ -67,19 +79,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 +97,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 +138,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 +151,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',
|
||||
@ -166,20 +186,44 @@ Chrome.prototype = {
|
||||
},
|
||||
|
||||
_actorReparented: function(actor, oldParent) {
|
||||
if (!this._verifyAncestry(actor, this.actor))
|
||||
if (!this.actor.contains(actor))
|
||||
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._inOverview && 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 +240,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,13 +249,23 @@ 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();
|
||||
|
||||
// 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 (windows[i].x >= primary.x && windows[i].x <= primary.x + primary.width &&
|
||||
windows[i].y >= primary.y && windows[i].y <= primary.y + primary.height) {
|
||||
this._obscuredByFullscreen = true;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -220,16 +274,15 @@ Chrome.prototype = {
|
||||
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();
|
||||
}
|
||||
},
|
||||
@ -241,7 +294,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();
|
||||
@ -252,10 +305,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
|
||||
@ -307,3 +362,4 @@ Chrome.prototype = {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(Chrome.prototype);
|
||||
|
234
js/ui/dash.js
234
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;
|
||||
@ -18,16 +17,13 @@ const DocDisplay = imports.ui.docDisplay;
|
||||
const PlaceDisplay = imports.ui.placeDisplay;
|
||||
const GenericDisplay = imports.ui.genericDisplay;
|
||||
const Main = imports.ui.main;
|
||||
const Overview = imports.ui.overview;
|
||||
const Search = imports.ui.search;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
// 25 search results (per result type) should be enough for everyone
|
||||
const MAX_RENDERED_SEARCH_RESULTS = 25;
|
||||
|
||||
const DEFAULT_PADDING = 4;
|
||||
|
||||
const DOCS = "docs";
|
||||
const PLACES = "places";
|
||||
|
||||
/*
|
||||
* Returns the index in an array of a given length that is obtained
|
||||
* if the provided index is incremented by an increment and the array
|
||||
@ -41,14 +37,6 @@ function _getIndexWrapped(index, increment, length) {
|
||||
return (index + increment + length) % length;
|
||||
}
|
||||
|
||||
function _createDisplay(displayType, flags) {
|
||||
if (displayType == DOCS)
|
||||
return new DocDisplay.DocDisplay(flags);
|
||||
else if (displayType == PLACES)
|
||||
return new PlaceDisplay.PlaceDisplay(flags);
|
||||
return null;
|
||||
}
|
||||
|
||||
function Pane() {
|
||||
this._init();
|
||||
}
|
||||
@ -57,7 +45,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) {
|
||||
@ -65,15 +53,6 @@ Pane.prototype = {
|
||||
return true;
|
||||
}));
|
||||
|
||||
let chromeTop = new St.BoxLayout();
|
||||
|
||||
let dummy = new St.Bin();
|
||||
chromeTop.add(dummy, { expand: true });
|
||||
this.actor.add(chromeTop);
|
||||
|
||||
this.content = new St.BoxLayout({ vertical: true });
|
||||
this.actor.add(this.content, { expand: true });
|
||||
|
||||
// Hidden by default
|
||||
this.actor.hide();
|
||||
},
|
||||
@ -82,20 +61,33 @@ Pane.prototype = {
|
||||
if (this._open)
|
||||
return;
|
||||
this._open = true;
|
||||
this.actor.show();
|
||||
this.emit('open-state-changed', this._open);
|
||||
this.actor.opacity = 0;
|
||||
this.actor.show();
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: Overview.PANE_FADE_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
},
|
||||
|
||||
close: function () {
|
||||
if (!this._open)
|
||||
return;
|
||||
this._open = false;
|
||||
this.actor.hide();
|
||||
this.emit('open-state-changed', this._open);
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: Overview.PANE_FADE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.actor.hide();
|
||||
this.emit('open-state-changed', this._open);
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
destroyContent: function() {
|
||||
let children = this.content.get_children();
|
||||
let children = this.actor.get_children();
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
children[i].destroy();
|
||||
}
|
||||
@ -110,53 +102,22 @@ Pane.prototype = {
|
||||
};
|
||||
Signals.addSignalMethods(Pane.prototype);
|
||||
|
||||
function ResultArea(displayType, flags) {
|
||||
this._init(displayType, flags);
|
||||
function ResultArea() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
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);
|
||||
_init : function() {
|
||||
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.display = new DocDisplay.DocDisplay();
|
||||
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
|
||||
// pane.
|
||||
function createPaneForDetails(dash, display) {
|
||||
let detailPane = null;
|
||||
display.connect('show-details', Lang.bind(this, function(display, index) {
|
||||
if (detailPane == null) {
|
||||
detailPane = new Pane();
|
||||
detailPane.connect('open-state-changed', Lang.bind(this, function (pane, isOpen) {
|
||||
if (!isOpen) {
|
||||
/* Ensure we don't keep around large preview textures */
|
||||
detailPane.destroyContent();
|
||||
}
|
||||
}));
|
||||
dash._addPane(detailPane, St.Align.START);
|
||||
}
|
||||
|
||||
if (index >= 0) {
|
||||
detailPane.destroyContent();
|
||||
let details = display.createDetailsForIndex(index);
|
||||
detailPane.content.add(details, { expand: true });
|
||||
detailPane.open();
|
||||
} else {
|
||||
detailPane.close();
|
||||
}
|
||||
}));
|
||||
return null;
|
||||
}
|
||||
|
||||
function ResultPane(dash) {
|
||||
this._init(dash);
|
||||
}
|
||||
@ -166,21 +127,12 @@ ResultPane.prototype = {
|
||||
|
||||
_init: function(dash) {
|
||||
Pane.prototype._init.call(this);
|
||||
this._dash = dash;
|
||||
},
|
||||
|
||||
// Create a display of displayType and pack it into this pane's
|
||||
// content area. Return the display.
|
||||
packResults: function(displayType) {
|
||||
let resultArea = new ResultArea(displayType);
|
||||
|
||||
createPaneForDetails(this._dash, resultArea.display);
|
||||
|
||||
this.content.add(resultArea.actor, { expand: true });
|
||||
let resultArea = new ResultArea();
|
||||
this.actor.add(resultArea.actor, { expand: true });
|
||||
this.connect('open-state-changed', Lang.bind(this, function(pane, isOpen) {
|
||||
resultArea.display.resetState();
|
||||
}));
|
||||
return resultArea.display;
|
||||
}
|
||||
};
|
||||
|
||||
@ -190,7 +142,7 @@ function SearchEntry() {
|
||||
|
||||
SearchEntry.prototype = {
|
||||
_init : function() {
|
||||
this.actor = new St.Entry({ name: "searchEntry",
|
||||
this.actor = new St.Entry({ name: 'searchEntry',
|
||||
hint_text: _("Find") });
|
||||
this.entry = this.actor.clutter_text;
|
||||
|
||||
@ -198,7 +150,7 @@ SearchEntry.prototype = {
|
||||
function() {
|
||||
if (this.isActive())
|
||||
this.actor.set_secondary_icon_from_file(global.imagedir +
|
||||
"close-black.svg");
|
||||
'close-black.svg');
|
||||
else
|
||||
this.actor.set_secondary_icon_from_file(null);
|
||||
}));
|
||||
@ -208,11 +160,21 @@ SearchEntry.prototype = {
|
||||
}));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
global.stage.connect('notify::key-focus', Lang.bind(this, this._updateCursorVisibility));
|
||||
|
||||
this.pane = null;
|
||||
|
||||
this._capturedEventId = 0;
|
||||
},
|
||||
|
||||
_updateCursorVisibility: function() {
|
||||
let focus = global.stage.get_key_focus();
|
||||
if (focus == global.stage || focus == this.entry)
|
||||
this.entry.set_cursor_visible(true);
|
||||
else
|
||||
this.entry.set_cursor_visible(false);
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if (this._capturedEventId == 0)
|
||||
this._capturedEventId = global.stage.connect('captured-event',
|
||||
@ -230,11 +192,15 @@ SearchEntry.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
setPane: function (pane) {
|
||||
this._pane = pane;
|
||||
},
|
||||
|
||||
reset: function () {
|
||||
let [x, y, mask] = global.get_pointer();
|
||||
let actor = global.stage.get_actor_at_pos (Clutter.PickMode.REACTIVE,
|
||||
x, y);
|
||||
// this.actor is never hovered directly, only its clutter_text and icon
|
||||
let hovered = this.actor == actor.get_parent();
|
||||
|
||||
this.actor.set_hover(hovered);
|
||||
|
||||
this.entry.text = '';
|
||||
global.stage.set_key_focus(null);
|
||||
this.entry.set_cursor_visible(true);
|
||||
@ -257,16 +223,7 @@ SearchEntry.prototype = {
|
||||
|
||||
_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);
|
||||
}
|
||||
let panelEvent = source && Main.panel.actor.contains(source);
|
||||
|
||||
switch (event.type()) {
|
||||
case Clutter.EventType.BUTTON_PRESS:
|
||||
@ -356,10 +313,21 @@ SearchResult.prototype = {
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onResultClicked));
|
||||
|
||||
let draggable = DND.makeDraggable(this.actor);
|
||||
draggable.connect('drag-begin',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.beginItemDrag(this);
|
||||
}));
|
||||
draggable.connect('drag-end',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.endItemDrag(this);
|
||||
}));
|
||||
},
|
||||
|
||||
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() {
|
||||
@ -532,7 +500,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);
|
||||
@ -610,11 +578,11 @@ 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;
|
||||
|
||||
this._expander = new St.Bin({ style_class: "more-link-expander" });
|
||||
this._expander = new St.Bin({ style_class: 'more-link-expander' });
|
||||
this.actor.add(this._expander, { expand: true, y_fill: false });
|
||||
},
|
||||
|
||||
@ -630,58 +598,35 @@ MoreLink.prototype = {
|
||||
setPane: function (pane) {
|
||||
this._pane = pane;
|
||||
this._pane.connect('open-state-changed', Lang.bind(this, function(pane, isOpen) {
|
||||
if (!isOpen)
|
||||
this._expander.style_class = 'more-link-expander';
|
||||
if (isOpen)
|
||||
this._expander.add_style_class_name('open');
|
||||
else
|
||||
this._expander.style_class = 'more-link-expander open';
|
||||
this._expander.remove_style_class_name('open');
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
Signals.addSignalMethods(MoreLink.prototype);
|
||||
|
||||
function BackLink() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
BackLink.prototype = {
|
||||
_init : function () {
|
||||
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" }));
|
||||
}
|
||||
};
|
||||
|
||||
function SectionHeader(title, suppressBrowse) {
|
||||
this._init(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();
|
||||
this._innerBox.add(this.backLink.actor);
|
||||
this.backLink.actor.hide();
|
||||
this.backLink.actor.connect('clicked', Lang.bind(this, function (actor) {
|
||||
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" });
|
||||
textBox.add(this.countText, { expand: true, x_fill: false, x_align: St.Align.END });
|
||||
this.countText.hide();
|
||||
|
||||
this._innerBox.add(textBox, { expand: true });
|
||||
|
||||
if (!suppressBrowse) {
|
||||
@ -695,31 +640,11 @@ SectionHeader.prototype = {
|
||||
this.moreLink.activate();
|
||||
},
|
||||
|
||||
setTitle : function(title) {
|
||||
this.text.text = title;
|
||||
},
|
||||
|
||||
setBackLinkVisible : function(visible) {
|
||||
if (visible)
|
||||
this.backLink.actor.show();
|
||||
else
|
||||
this.backLink.actor.hide();
|
||||
},
|
||||
|
||||
setMoreLinkVisible : function(visible) {
|
||||
if (visible)
|
||||
this.moreLink.actor.show();
|
||||
else
|
||||
this.moreLink.actor.hide();
|
||||
},
|
||||
|
||||
setCountText : function(countText) {
|
||||
if (countText == "") {
|
||||
this.countText.hide();
|
||||
} else {
|
||||
this.countText.show();
|
||||
this.countText.text = countText;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -731,14 +656,14 @@ 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 });
|
||||
@ -778,14 +703,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);
|
||||
@ -884,7 +809,6 @@ Dash.prototype = {
|
||||
this._docsSection.header.moreLink.connect('activated', Lang.bind(this, function (link) {
|
||||
if (this._moreDocsPane == null) {
|
||||
this._moreDocsPane = new ResultPane(this);
|
||||
this._moreDocsPane.packResults(DOCS);
|
||||
this._addPane(this._moreDocsPane, St.Align.END);
|
||||
link.setPane(this._moreDocsPane);
|
||||
}
|
||||
|
190
js/ui/dnd.js
190
js/ui/dnd.js
@ -1,10 +1,12 @@
|
||||
/* -*- 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;
|
||||
|
||||
@ -12,16 +14,32 @@ const Params = imports.misc.params;
|
||||
const SCALE_ANIMATION_TIME = 0.25;
|
||||
// Time to animate to original position on cancel
|
||||
const SNAP_BACK_ANIMATION_TIME = 0.25;
|
||||
// Time to animate to original position on success
|
||||
const REVERT_ANIMATION_TIME = 0.75;
|
||||
|
||||
const DragMotionResult = {
|
||||
NO_DROP: 0,
|
||||
COPY_DROP: 1,
|
||||
MOVE_DROP: 2,
|
||||
CONTINUE: 3
|
||||
};
|
||||
|
||||
const DragDropResult = {
|
||||
FAILURE: 0,
|
||||
SUCCESS: 1,
|
||||
CONTINUE: 2
|
||||
};
|
||||
|
||||
let eventHandlerActor = null;
|
||||
let currentDraggable = null;
|
||||
let dragMonitors = [];
|
||||
|
||||
function _getEventHandlerActor() {
|
||||
if (!eventHandlerActor) {
|
||||
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',
|
||||
@ -32,6 +50,18 @@ function _getEventHandlerActor() {
|
||||
return eventHandlerActor;
|
||||
}
|
||||
|
||||
function addDragMonitor(monitor) {
|
||||
dragMonitors.push(monitor);
|
||||
}
|
||||
|
||||
function removeMonitor(monitor) {
|
||||
for (let i = 0; i < dragMonitors.length; i++)
|
||||
if (dragMonitors[i] == monitor) {
|
||||
dragMonitors.splice(i, 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function _Draggable(actor, params) {
|
||||
this._init(actor, params);
|
||||
}
|
||||
@ -39,6 +69,7 @@ function _Draggable(actor, params) {
|
||||
_Draggable.prototype = {
|
||||
_init : function(actor, params) {
|
||||
params = Params.parse(params, { manualMode: false,
|
||||
restoreOnSuccess: false,
|
||||
dragActorMaxSize: undefined,
|
||||
dragActorOpacity: undefined });
|
||||
|
||||
@ -52,22 +83,30 @@ _Draggable.prototype = {
|
||||
}));
|
||||
this._onEventId = null;
|
||||
|
||||
this._restoreOnSuccess = params.restoreOnSuccess;
|
||||
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.
|
||||
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
||||
},
|
||||
|
||||
_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;
|
||||
@ -76,6 +115,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',
|
||||
@ -107,7 +155,7 @@ _Draggable.prototype = {
|
||||
this._buttonDown = false;
|
||||
if (this._dragInProgress) {
|
||||
return this._dragActorDropped(event);
|
||||
} else if (this._dragActor != null && !this._snapBackInProgress) {
|
||||
} else if (this._dragActor != null && !this._animationInProgress) {
|
||||
// Drag must have been cancelled with Esc.
|
||||
this._dragComplete();
|
||||
return true;
|
||||
@ -236,7 +284,7 @@ _Draggable.prototype = {
|
||||
{ scale_x: scale * origScale,
|
||||
scale_y: scale * origScale,
|
||||
time: SCALE_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onUpdate: function() {
|
||||
let currentScale = this._dragActor.scale_x / origScale;
|
||||
this._dragOffsetX = currentScale * origDragOffsetX;
|
||||
@ -272,21 +320,47 @@ _Draggable.prototype = {
|
||||
if (this._dragActor) {
|
||||
this._dragActor.set_position(stageX + this._dragOffsetX,
|
||||
stageY + this._dragOffsetY);
|
||||
|
||||
// Because we want to find out what other actor is located at the current position of this._dragActor,
|
||||
// we have to temporarily hide this._dragActor.
|
||||
this._dragActor.hide();
|
||||
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
||||
stageX, stageY);
|
||||
this._dragActor.show();
|
||||
|
||||
// We call observers only once per motion with the innermost
|
||||
// target actor. If necessary, the observer can walk the
|
||||
// parent itself.
|
||||
let dragEvent = {
|
||||
x: stageX,
|
||||
y: stageY,
|
||||
dragActor: this._dragActor,
|
||||
targetActor: target
|
||||
};
|
||||
for (let i = 0; i < dragMonitors.length; i++) {
|
||||
let motionFunc = dragMonitors[i].dragMotion;
|
||||
if (motionFunc)
|
||||
switch (motionFunc(dragEvent)) {
|
||||
case DragMotionResult.NO_DROP:
|
||||
case DragMotionResult.COPY_DROP:
|
||||
case DragMotionResult.MOVE_DROP:
|
||||
// TODO: set a special cursor or something ;)
|
||||
return true;
|
||||
case DragMotionResult.CONTINUE:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
while (target) {
|
||||
if (target._delegate && target._delegate.handleDragOver) {
|
||||
let [targX, targY] = target.get_transformed_position();
|
||||
let [r, targX, targY] = target.transform_stage_point(stageX, stageY);
|
||||
// We currently loop through all parents on drag-over even if one of the children has handled it.
|
||||
// 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 - targX) / target.scale_x,
|
||||
(stageY - targY) / target.scale_y,
|
||||
target._delegate.handleDragOver(this.actor._delegate,
|
||||
this._dragActor,
|
||||
targX,
|
||||
targY,
|
||||
event.get_time());
|
||||
}
|
||||
target = target.get_parent();
|
||||
@ -304,17 +378,44 @@ _Draggable.prototype = {
|
||||
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
||||
dropX, dropY);
|
||||
this._dragActor.show();
|
||||
|
||||
// We call observers only once per motion with the innermost
|
||||
// target actor. If necessary, the observer can walk the
|
||||
// parent itself.
|
||||
let dropEvent = {
|
||||
dropActor: this._dragActor,
|
||||
targetActor: target,
|
||||
clutterEvent: event
|
||||
};
|
||||
for (let i = 0; i < dragMonitors.length; i++) {
|
||||
let dropFunc = dragMonitors[i].dragDrop;
|
||||
if (dropFunc)
|
||||
switch (dropFunc(dropEvent)) {
|
||||
case DragDropResult.FAILURE:
|
||||
case DragDropResult.SUCCESS:
|
||||
return true;
|
||||
case DragDropResult.CONTINUE:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
while (target) {
|
||||
if (target._delegate && target._delegate.acceptDrop) {
|
||||
let [targX, targY] = target.get_transformed_position();
|
||||
if (target._delegate.acceptDrop(this.actor._delegate, this._dragActor,
|
||||
(dropX - targX) / target.scale_x,
|
||||
(dropY - targY) / target.scale_y,
|
||||
let [r, targX, targY] = target.transform_stage_point(dropX, dropY);
|
||||
if (target._delegate.acceptDrop(this.actor._delegate,
|
||||
this._dragActor,
|
||||
targX,
|
||||
targY,
|
||||
event.get_time())) {
|
||||
// If it accepted the drop without taking the actor,
|
||||
// destroy it.
|
||||
if (this._dragActor.get_parent() == this._dragActor.get_stage())
|
||||
this._dragActor.destroy();
|
||||
// handle it ourselves.
|
||||
if (this._dragActor.get_parent() == this._dragActor.get_stage()) {
|
||||
if (this._restoreOnSuccess) {
|
||||
this._restoreDragActor(event.get_time());
|
||||
return true;
|
||||
} else
|
||||
this._dragActor.destroy();
|
||||
}
|
||||
|
||||
this._dragInProgress = false;
|
||||
this.emit('drag-end', event.get_time(), true);
|
||||
@ -330,18 +431,23 @@ _Draggable.prototype = {
|
||||
return true;
|
||||
},
|
||||
|
||||
// Get position of the drag actor's source if the source is still around,
|
||||
// or return the original location if the actor itself was being dragged
|
||||
// or the source is no longer around.
|
||||
_getRestoreLocation: function() {
|
||||
let locX = this._snapBackX;
|
||||
let locY = this._snapBackY;
|
||||
|
||||
if (this._dragActorSource && this._dragActorSource.visible)
|
||||
[locX, locY] = this._dragActorSource.get_transformed_position();
|
||||
return [locX, locY];
|
||||
},
|
||||
|
||||
_cancelDrag: function(eventTime) {
|
||||
this._dragInProgress = false;
|
||||
// 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._snapBackX;
|
||||
let snapBackY = this._snapBackY;
|
||||
if (this._dragActorSource && this._dragActorSource.visible) {
|
||||
[snapBackX, snapBackY] = this._dragActorSource.get_transformed_position();
|
||||
}
|
||||
let [snapBackX, snapBackY] = this._getRestoreLocation();
|
||||
|
||||
this._snapBackInProgress = true;
|
||||
this._animationInProgress = true;
|
||||
// No target, so snap back
|
||||
Tweener.addTween(this._dragActor,
|
||||
{ x: snapBackX,
|
||||
@ -350,14 +456,34 @@ _Draggable.prototype = {
|
||||
scale_y: this._snapBackScale,
|
||||
opacity: this._dragOrigOpacity,
|
||||
time: SNAP_BACK_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
onComplete: this._onSnapBackComplete,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._onAnimationComplete,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [this._dragActor, eventTime]
|
||||
});
|
||||
},
|
||||
|
||||
_onSnapBackComplete : function (dragActor, eventTime) {
|
||||
_restoreDragActor: function(eventTime) {
|
||||
this._dragInProgress = false;
|
||||
[restoreX, restoreY] = this._getRestoreLocation();
|
||||
|
||||
// fade the actor back in at its original location
|
||||
this._dragActor.set_position(restoreX, restoreY);
|
||||
this._dragActor.set_scale(this._snapBackScale, this._snapBackScale);
|
||||
this._dragActor.opacity = 0;
|
||||
|
||||
this._animationInProgress = true;
|
||||
Tweener.addTween(this._dragActor,
|
||||
{ opacity: this._dragOrigOpacity,
|
||||
time: REVERT_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._onAnimationComplete,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [this._dragActor, eventTime]
|
||||
});
|
||||
},
|
||||
|
||||
_onAnimationComplete : function (dragActor, eventTime) {
|
||||
if (this._dragOrigParent) {
|
||||
dragActor.reparent(this._dragOrigParent);
|
||||
dragActor.set_scale(this._dragOrigScale, this._dragOrigScale);
|
||||
@ -367,7 +493,7 @@ _Draggable.prototype = {
|
||||
}
|
||||
this.emit('drag-end', eventTime, false);
|
||||
|
||||
this._snapBackInProgress = false;
|
||||
this._animationInProgress = false;
|
||||
if (!this._buttonDown)
|
||||
this._dragComplete();
|
||||
},
|
||||
|
@ -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,7 +80,7 @@ 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 {
|
||||
@ -116,15 +115,15 @@ DocDisplayItem.prototype = {
|
||||
/* This class represents a display containing a collection of document items.
|
||||
* The documents are sorted by how recently they were last visited.
|
||||
*/
|
||||
function DocDisplay(flags) {
|
||||
this._init(flags);
|
||||
function DocDisplay() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
DocDisplay.prototype = {
|
||||
__proto__: GenericDisplay.GenericDisplay.prototype,
|
||||
|
||||
_init : function(flags) {
|
||||
GenericDisplay.GenericDisplay.prototype._init.call(this, flags);
|
||||
_init : function() {
|
||||
GenericDisplay.GenericDisplay.prototype._init.call(this);
|
||||
// We keep a single timeout callback for updating last visited times
|
||||
// for all the items in the display. This avoids creating individual
|
||||
// callbacks for each item in the display. So proper time updates
|
||||
@ -267,25 +266,35 @@ 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);
|
||||
draggable.connect('drag-begin',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.beginItemDrag(this);
|
||||
}));
|
||||
draggable.connect('drag-end',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.endItemDrag(this);
|
||||
}));
|
||||
},
|
||||
|
||||
getUri: function() {
|
||||
@ -512,6 +521,6 @@ DocSearchProvider.prototype = {
|
||||
},
|
||||
|
||||
expandSearch: function(terms) {
|
||||
log("TODO expand docs search");
|
||||
log('TODO expand docs search');
|
||||
}
|
||||
};
|
||||
|
@ -1,5 +1,8 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Gettext_gtk20 = imports.gettext.domain('gtk20');
|
||||
|
||||
@ -28,15 +31,73 @@ 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);
|
||||
}
|
||||
|
||||
let slowdownEnv = GLib.getenv('GNOME_SHELL_SLOWDOWN_FACTOR');
|
||||
if (slowdownEnv) {
|
||||
let factor = parseFloat(slowdownEnv);
|
||||
if (!isNaN(factor) && factor > 0.0)
|
||||
St.set_slow_down_factor(factor);
|
||||
}
|
||||
|
||||
_patchContainerClass(St.BoxLayout);
|
||||
_patchContainerClass(St.Table);
|
||||
|
||||
Clutter.Actor.prototype.toString = function() {
|
||||
return St.describe_actor(this);
|
||||
};
|
||||
Clutter.Actor.prototype.contains = function(child) {
|
||||
while (child != null && child != this)
|
||||
child = child.get_parent();
|
||||
return child != null;
|
||||
};
|
||||
|
||||
_blockMethod('Clutter.Event.get_state', 'Shell.get_event_state',
|
||||
'gjs\'s handling of Clutter.ModifierType is broken. See bug 597292.');
|
||||
_blockMethod('Gdk.Display.get_device_state', 'global.get_pointer',
|
||||
'gjs\'s handling of Gdk.ModifierType is broken. See bug 597292.');
|
||||
_blockMethod('Gdk.Window.get_device_position', '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,16 +119,15 @@ 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');
|
||||
disabledExtensions = global.settings.get_strv('disabled-extensions', -1);
|
||||
}
|
||||
|
||||
function _loadExtensionsIn(dir, type) {
|
||||
|
@ -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;
|
||||
@ -64,6 +47,14 @@ GenericDisplayItem.prototype = {
|
||||
}));
|
||||
|
||||
let draggable = DND.makeDraggable(this.actor);
|
||||
draggable.connect('drag-begin',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.beginItemDrag(this);
|
||||
}));
|
||||
draggable.connect('drag-end',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.endItemDrag(this);
|
||||
}));
|
||||
|
||||
this._iconBin = new St.Bin();
|
||||
this.actor.add(this._iconBin);
|
||||
@ -105,7 +96,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 +108,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 +125,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 +152,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 +184,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 +216,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 ////
|
||||
@ -238,35 +229,25 @@ GenericDisplayItem.prototype = {
|
||||
|
||||
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.
|
||||
*/
|
||||
function GenericDisplay(flags) {
|
||||
this._init(flags);
|
||||
function GenericDisplay() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
GenericDisplay.prototype = {
|
||||
_init : function(flags) {
|
||||
let disableVScrolling = (flags & GenericDisplayFlags.DISABLE_VSCROLLING) != 0;
|
||||
_init : function() {
|
||||
this._search = '';
|
||||
this._expanded = false;
|
||||
|
||||
if (disableVScrolling) {
|
||||
this.actor = this._list = new Shell.OverflowList({ spacing: 6,
|
||||
item_height: 50 });
|
||||
} else {
|
||||
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.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;
|
||||
this.actor.connect('notify::mapped', Lang.bind(this, this._onMappedNotify));
|
||||
@ -373,7 +354,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;
|
||||
},
|
||||
|
||||
@ -390,8 +371,7 @@ GenericDisplay.prototype = {
|
||||
resetState: function() {
|
||||
this._filterReset();
|
||||
this._openDetailIndex = -1;
|
||||
if (!(this.actor instanceof Shell.OverflowList))
|
||||
this.actor.get_vscroll_bar().get_adjustment().value = 0;
|
||||
this.actor.get_vscroll_bar().get_adjustment().value = 0;
|
||||
},
|
||||
|
||||
// Returns an actor which acts as a sidebar; this is used for
|
||||
@ -419,7 +399,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;
|
||||
}
|
||||
|
||||
@ -478,7 +458,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
|
||||
@ -601,13 +581,13 @@ 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
|
||||
@ -615,18 +595,18 @@ GenericDisplay.prototype = {
|
||||
// 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 ////
|
||||
@ -670,11 +650,7 @@ GenericDisplay.prototype = {
|
||||
// Returns a display item based on its index in the ordering of the
|
||||
// display children.
|
||||
_findDisplayedByIndex: function(index) {
|
||||
let actor;
|
||||
if (this.actor instanceof Shell.OverflowList)
|
||||
actor = this.actor.get_displayed_actor(index);
|
||||
else
|
||||
actor = this._list.get_children()[index];
|
||||
let actor = this._list.get_children()[index];
|
||||
return this._findDisplayedByActor(actor);
|
||||
},
|
||||
|
||||
@ -709,8 +685,6 @@ GenericDisplay.prototype = {
|
||||
},
|
||||
|
||||
_getVisibleCount: function() {
|
||||
if (this.actor instanceof Shell.OverflowList)
|
||||
return this._list.displayed_count;
|
||||
return this._list.get_n_children();
|
||||
},
|
||||
|
||||
|
@ -2,14 +2,20 @@
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Params = imports.misc.params;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
/**
|
||||
* Lightbox:
|
||||
* @container: parent Clutter.Container
|
||||
* @inhibitEvents: whether to inhibit events for @container
|
||||
* @width: (optional) shade actor width
|
||||
* @height: (optional) shade actor height
|
||||
* @params: (optional) additional parameters:
|
||||
* - inhibitEvents: whether to inhibit events for @container
|
||||
* - width: shade actor width
|
||||
* - height: shade actor height
|
||||
* - fadeTime: seconds used to fade in/out
|
||||
*
|
||||
* Lightbox creates a dark translucent "shade" actor to hide the
|
||||
* contents of @container, and allows you to specify particular actors
|
||||
@ -23,29 +29,37 @@ const St = imports.gi.St;
|
||||
*
|
||||
* By default, the shade window will have the height and width of
|
||||
* @container and will track any changes in its size. You can override
|
||||
* this by passing an explicit width and height
|
||||
* this by passing an explicit width and height in @params.
|
||||
*/
|
||||
function Lightbox(container, inhibitEvents, width, height) {
|
||||
this._init(container, inhibitEvents, width, height);
|
||||
function Lightbox(container, params) {
|
||||
this._init(container, params);
|
||||
}
|
||||
|
||||
Lightbox.prototype = {
|
||||
_init : function(container, inhibitEvents, width, height) {
|
||||
_init : function(container, params) {
|
||||
params = Params.parse(params, { inhibitEvents: false,
|
||||
width: null,
|
||||
height: null,
|
||||
fadeTime: null
|
||||
});
|
||||
|
||||
this._container = container;
|
||||
this._children = container.get_children();
|
||||
this._fadeTime = params.fadeTime;
|
||||
this.actor = new St.Bin({ x: 0,
|
||||
y: 0,
|
||||
style_class: 'lightbox',
|
||||
reactive: inhibitEvents });
|
||||
reactive: params.inhibitEvents });
|
||||
|
||||
container.add_actor(this.actor);
|
||||
this.actor.raise_top();
|
||||
this.actor.hide();
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
if (width && height) {
|
||||
this.actor.width = width;
|
||||
this.actor.height = height;
|
||||
if (params.width && params.height) {
|
||||
this.actor.width = params.width;
|
||||
this.actor.height = params.height;
|
||||
this._allocationChangedSignalId = 0;
|
||||
} else {
|
||||
this.actor.width = container.width;
|
||||
@ -60,8 +74,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) {
|
||||
@ -86,6 +105,35 @@ Lightbox.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if (this._fadeTime) {
|
||||
this.actor.opacity = 0;
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: this._fadeTime,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
} else {
|
||||
this.actor.opacity = 255;
|
||||
}
|
||||
this.actor.show();
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
if (this._fadeTime) {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: this._fadeTime,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.actor.hide();
|
||||
})
|
||||
});
|
||||
} else {
|
||||
this.actor.hide();
|
||||
}
|
||||
},
|
||||
|
||||
_actorRemoved : function(container, child) {
|
||||
let index = this._children.indexOf(child);
|
||||
if (index != -1) // paranoia
|
||||
|
@ -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,8 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Big = imports.gi.Big;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GConf = imports.gi.GConf;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Pango = imports.gi.Pango;
|
||||
const St = imports.gi.St;
|
||||
@ -18,22 +19,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 +44,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 +87,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 +101,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);
|
||||
@ -139,6 +142,40 @@ Notebook.prototype = {
|
||||
};
|
||||
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,108 +185,179 @@ 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;
|
||||
// Avoid multiple connections
|
||||
if (!metaWindow._lookingGlassManaged) {
|
||||
metaWindow.connect('unmanaged', Lang.bind(this, this._updateWindowList));
|
||||
metaWindow._lookingGlassManaged = true;
|
||||
}
|
||||
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 +367,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,14 +403,9 @@ Inspector.prototype = {
|
||||
let target = global.stage.get_actor_at_pos(Clutter.PickMode.ALL,
|
||||
stageX,
|
||||
stageY);
|
||||
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;
|
||||
let position = '[inspect x: ' + stageX + ' y: ' + stageY + ']';
|
||||
displayText.text = '';
|
||||
displayText.text = position + ' ' + target;
|
||||
if (borderPaintTarget != null)
|
||||
borderPaintTarget.disconnect(borderPaintId);
|
||||
borderPaintTarget = target;
|
||||
@ -324,6 +427,11 @@ ErrorLog.prototype = {
|
||||
this.actor = new St.BoxLayout();
|
||||
this.text = new St.Label();
|
||||
this.actor.add(this.text);
|
||||
// We need to override StLabel's default ellipsization when
|
||||
// using line_wrap; otherwise ClutterText's layout is going
|
||||
// to constrain both the width and height, which prevents
|
||||
// scrolling.
|
||||
this.text.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
this.text.clutter_text.line_wrap = true;
|
||||
this.actor.connect('notify::mapped', Lang.bind(this, this._renderText));
|
||||
},
|
||||
@ -345,7 +453,7 @@ 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;
|
||||
}
|
||||
@ -405,7 +513,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) {
|
||||
@ -451,7 +559,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;
|
||||
@ -470,19 +578,24 @@ 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",
|
||||
Lang.bind(this, this._updateFont));
|
||||
let gconf = GConf.Client.get_default();
|
||||
gconf.add_dir('/desktop/gnome/interface', GConf.ClientPreloadType.PRELOAD_NONE);
|
||||
gconf.notify_add('/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 = St.TextureCache.get_default().load_gicon(new Gio.ThemedIcon({ name: 'gtk-color-picker' }),
|
||||
24);
|
||||
@ -493,7 +606,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();
|
||||
@ -511,18 +623,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 */
|
||||
@ -530,17 +641,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);
|
||||
@ -554,7 +662,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);
|
||||
@ -589,8 +697,8 @@ LookingGlass.prototype = {
|
||||
},
|
||||
|
||||
_updateFont: function() {
|
||||
let gconf = Shell.GConf.get_default();
|
||||
let fontName = gconf.get_string("/desktop/gnome/interface/monospace_font_name");
|
||||
let gconf = GConf.Client.get_default();
|
||||
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);
|
||||
@ -628,8 +736,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;
|
||||
@ -664,11 +771,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 = '';
|
||||
},
|
||||
|
||||
@ -698,6 +804,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) {
|
||||
@ -708,11 +817,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;
|
||||
@ -737,7 +859,7 @@ LookingGlass.prototype = {
|
||||
global.stage.set_key_focus(this._entry);
|
||||
|
||||
Tweener.addTween(this.actor, { time: 0.5,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
y: this._targetY
|
||||
});
|
||||
},
|
||||
@ -749,6 +871,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);
|
||||
@ -762,7 +886,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();
|
||||
|
1480
js/ui/magnifier.js
Normal file
1480
js/ui/magnifier.js
Normal file
File diff suppressed because it is too large
Load Diff
375
js/ui/magnifierDBus.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('#%08x'.format(color));
|
||||
},
|
||||
|
||||
/**
|
||||
* 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);
|
@ -1,10 +1,17 @@
|
||||
/* -*- 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 = '3.0';
|
||||
imports.gi.versions.GdkPixbuf = '2.0';
|
||||
imports.gi.versions.Gtk = '3.0';
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const DBus = imports.dbus;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GConf = imports.gi.GConf;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
@ -23,37 +30,41 @@ 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 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;
|
||||
@ -62,7 +73,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();
|
||||
@ -91,32 +102,40 @@ function start() {
|
||||
global.stage.color = DEFAULT_BACKGROUND_COLOR;
|
||||
|
||||
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);
|
||||
|
||||
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();
|
||||
messageTray = new MessageTray.MessageTray();
|
||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||
messageTray = new MessageTray.MessageTray();
|
||||
telepathyClient = new TelepathyClient.Client();
|
||||
|
||||
_startDate = new Date();
|
||||
|
||||
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
|
||||
|
||||
global.screen.connect('toggle-recording', function() {
|
||||
if (recorder == null) {
|
||||
recorder = new Shell.Recorder({ stage: global.stage });
|
||||
@ -125,11 +144,11 @@ 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");
|
||||
// read the parameters from GSettings always in case they have changed
|
||||
recorder.set_framerate(recorderSettings.get_int('framerate'));
|
||||
recorder.set_filename('shell-%d%u-%c.' + recorderSettings.get_string('file-extension'));
|
||||
let pipeline = recorderSettings.get_string('pipeline');
|
||||
|
||||
if (!pipeline.match(/^\s*$/))
|
||||
recorder.set_pipeline(pipeline);
|
||||
else
|
||||
@ -143,7 +162,7 @@ function start() {
|
||||
global.stage.add_actor(background);
|
||||
background.lower_bottom();
|
||||
|
||||
global.connect('screen-size-changed', _relayout);
|
||||
global.gdk_screen.connect('monitors-changed', _relayout);
|
||||
|
||||
ExtensionSystem.init();
|
||||
ExtensionSystem.loadExtensions();
|
||||
@ -155,10 +174,23 @@ function start() {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -179,7 +211,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(),
|
||||
@ -267,9 +299,9 @@ function _globalKeyPressHandler(actor, event) {
|
||||
let symbol = event.get_key_symbol();
|
||||
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 gconf = GConf.Client.get_default();
|
||||
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();
|
||||
@ -342,7 +374,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;
|
||||
}
|
||||
}
|
||||
@ -485,7 +517,7 @@ function _queueBeforeRedraw(workId) {
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, function () {
|
||||
_runBeforeRedrawQueue();
|
||||
return false;
|
||||
}, null);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -509,7 +541,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 () {
|
||||
@ -539,7 +571,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)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,8 +11,6 @@ const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
const EMPATHY = 'Empathy';
|
||||
|
||||
let nextNotificationId = 1;
|
||||
|
||||
// Should really be defined in dbus.js
|
||||
@ -82,6 +80,15 @@ const rewriteRules = {
|
||||
replacement: '$2 <$1>' }
|
||||
]
|
||||
};
|
||||
|
||||
// The notification spec stipulates using formal names for the appName the applications
|
||||
// pass in. However, not all applications do that. Here is a list of the offenders we
|
||||
// encountered so far.
|
||||
const appNameMap = {
|
||||
'evolution-mail-notification': 'Evolution Mail',
|
||||
'rhythmbox': 'Rhythmbox'
|
||||
};
|
||||
|
||||
function NotificationDaemon() {
|
||||
this._init();
|
||||
}
|
||||
@ -123,10 +130,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();
|
||||
@ -139,46 +146,28 @@ NotificationDaemon.prototype = {
|
||||
|
||||
Notify: function(appName, replacesId, icon, summary, body,
|
||||
actions, hints, timeout) {
|
||||
let notification, id;
|
||||
// We associate each application with a source and set the source id to be based on
|
||||
// the appName. We support application updates by creating a new Notification object
|
||||
// only if replacesId was not specified or if we no longer have the notification with
|
||||
// the specified replacesId.
|
||||
//
|
||||
// We are planning to add Empathy-specific features in the message tray, but in the
|
||||
// meantime we handle Empathy notifications received through the notification daemon
|
||||
// differently from other notifications.
|
||||
// 1) We display different people sending messages as different sources. So we use
|
||||
// notification id instead of the appName when creating id for the source.
|
||||
// 2) We queue notification with different messages to show them one after another,
|
||||
// rather than replace the notification on the spot. So we create a new Notification
|
||||
// object each time, disregarding the fact that we might already have another
|
||||
// notification with the same replacesId.
|
||||
// Empathy uses replacesId for all the notifications from the same window until the
|
||||
// notification with that id is dismissed. Notifications from different people in
|
||||
// different tabs have the same replacesId. So while being closer to the eventual design,
|
||||
// our special-handling of Empathy notifications is somewhat buggy. The user might end up
|
||||
// with multiple icons for the same person if the user dismisses the window for that person
|
||||
// (which doesn't result in removing the icon) or the user might not get the icon for
|
||||
// the person after a new notification in one of the tabs of the chat window for which
|
||||
// another person's icon is already displayed.
|
||||
let source = Main.messageTray.getSource(this._sourceId(appName));
|
||||
let id = null;
|
||||
|
||||
let isEmpathy = appName == EMPATHY;
|
||||
if (replacesId != 0) {
|
||||
id = replacesId;
|
||||
if (!isEmpathy)
|
||||
notification = this._currentNotifications[id];
|
||||
} else {
|
||||
// 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;
|
||||
}
|
||||
|
||||
let sourceId = this._sourceId(isEmpathy ? id : appName);
|
||||
let source = Main.messageTray.getSource(sourceId);
|
||||
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
|
||||
|
||||
// Source may be null if we have never received a notification from
|
||||
// this app or if all notifications from this app have been acknowledged.
|
||||
// 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(sourceId, icon, hints);
|
||||
let title = appNameMap[appName] || appName;
|
||||
source = new Source(this._sourceId(appName), title, icon, hints);
|
||||
Main.messageTray.add(source);
|
||||
|
||||
source.connect('clicked', Lang.bind(this,
|
||||
@ -190,7 +179,8 @@ NotificationDaemon.prototype = {
|
||||
let busProxy = new Bus();
|
||||
busProxy.GetConnectionUnixProcessIDRemote(sender, function (result, excp) {
|
||||
let app = Shell.WindowTracker.get_default().get_app_from_pid(result);
|
||||
source.setApp(app);
|
||||
if (app)
|
||||
source.setApp(app);
|
||||
});
|
||||
} else {
|
||||
source.update(icon, hints);
|
||||
@ -207,14 +197,15 @@ NotificationDaemon.prototype = {
|
||||
}
|
||||
}
|
||||
|
||||
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 will result in us keeping only the latest Empathy notification with the given
|
||||
// id in this._currentNotifications, which will only affect not being able to close all
|
||||
// the Empathy notifications with a given id in CloseNotification(). Since this not a
|
||||
// a likely scenario and this special-casing of Empathy in the notification daemon is
|
||||
// temporary, it doesn't seem worthwhile to change this._currentNotifications to
|
||||
// {id, [array of notifications]} just for that case.
|
||||
this._currentNotifications[id] = notification;
|
||||
notification.connect('dismissed', Lang.bind(this,
|
||||
function(n) {
|
||||
@ -229,10 +220,12 @@ NotificationDaemon.prototype = {
|
||||
|
||||
if (actions.length) {
|
||||
for (let i = 0; i < actions.length - 1; i += 2)
|
||||
notification.addAction(actions[i], actions[i + 1]);
|
||||
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;
|
||||
},
|
||||
@ -252,8 +245,9 @@ NotificationDaemon.prototype = {
|
||||
// 'body-images',
|
||||
'body-markup',
|
||||
// 'icon-multi',
|
||||
'icon-static'
|
||||
'icon-static',
|
||||
// 'sound',
|
||||
'x-gnome-icon-buttons'
|
||||
];
|
||||
},
|
||||
|
||||
@ -268,7 +262,8 @@ NotificationDaemon.prototype = {
|
||||
|
||||
_onFocusAppChanged: function() {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
Main.messageTray.removeSourceByApp(tracker.focus_app);
|
||||
if (tracker.focus_app)
|
||||
Main.messageTray.removeSourceByApp(tracker.focus_app);
|
||||
},
|
||||
|
||||
_actionInvoked: function(notification, action, source, id) {
|
||||
@ -294,15 +289,15 @@ NotificationDaemon.prototype = {
|
||||
|
||||
DBus.conformExport(NotificationDaemon.prototype, NotificationDaemonIface);
|
||||
|
||||
function Source(sourceId, icon, hints) {
|
||||
this._init(sourceId, icon, hints);
|
||||
function Source(sourceId, title, icon, hints) {
|
||||
this._init(sourceId, title, icon, hints);
|
||||
}
|
||||
|
||||
Source.prototype = {
|
||||
__proto__: MessageTray.Source.prototype,
|
||||
|
||||
_init: function(sourceId, icon, hints) {
|
||||
MessageTray.Source.prototype._init.call(this, sourceId);
|
||||
_init: function(sourceId, title, icon, hints) {
|
||||
MessageTray.Source.prototype._init.call(this, sourceId, title);
|
||||
|
||||
this.app = null;
|
||||
this._openAppRequested = false;
|
||||
@ -311,8 +306,6 @@ Source.prototype = {
|
||||
},
|
||||
|
||||
update: function(icon, hints) {
|
||||
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
|
||||
|
||||
this._icon = icon;
|
||||
this._iconData = hints.icon_data;
|
||||
this._urgency = hints.urgency;
|
||||
@ -358,9 +351,6 @@ Source.prototype = {
|
||||
this.app = app;
|
||||
if (this._openAppRequested)
|
||||
this.openApp();
|
||||
|
||||
if (app.get_name() == EMPATHY)
|
||||
this.handleReplacing = false;
|
||||
},
|
||||
|
||||
openApp: function() {
|
||||
|
@ -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;
|
||||
@ -15,6 +14,7 @@ const _ = Gettext.gettext;
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const DocDisplay = imports.ui.docDisplay;
|
||||
const GenericDisplay = imports.ui.genericDisplay;
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
const Panel = imports.ui.panel;
|
||||
const Dash = imports.ui.dash;
|
||||
@ -24,6 +24,9 @@ const WorkspacesView = imports.ui.workspacesView;
|
||||
// Time for initial animation going into Overview mode
|
||||
const ANIMATION_TIME = 0.25;
|
||||
|
||||
// Time for pane menus to fade in/out
|
||||
const PANE_FADE_TIME = 0.1;
|
||||
|
||||
// We divide the screen into a grid of rows and columns, which we use
|
||||
// to help us position the Overview components, such as the side panel
|
||||
// that lists applications and documents, the workspaces display, and
|
||||
@ -73,7 +76,7 @@ const SHADOW_WIDTH = 6;
|
||||
|
||||
const NUMBER_OF_SECTIONS_IN_SEARCH = 2;
|
||||
|
||||
const INFO_BAR_HIDE_TIMEOUT = 30;
|
||||
const INFO_BAR_HIDE_TIMEOUT = 10;
|
||||
|
||||
let wideScreen = false;
|
||||
let displayGridColumnWidth = null;
|
||||
@ -108,9 +111,6 @@ InfoBar.prototype = {
|
||||
|
||||
this._undoCallback = null;
|
||||
this._undo.connect('clicked', Lang.bind(this, this._onUndoClicked));
|
||||
|
||||
this._overviewWasHidden = false;
|
||||
this._hidingOverviewId = 0;
|
||||
},
|
||||
|
||||
_onUndoClicked: function() {
|
||||
@ -128,7 +128,6 @@ InfoBar.prototype = {
|
||||
},
|
||||
|
||||
_hide: function() {
|
||||
this._overviewWasHidden = false;
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
transition: 'easeOutQuad',
|
||||
@ -140,31 +139,15 @@ InfoBar.prototype = {
|
||||
|
||||
_onTimeout: function() {
|
||||
this._timeoutId = 0;
|
||||
if (this._overviewWasHidden)
|
||||
this._hide();
|
||||
this._hide();
|
||||
return false;
|
||||
},
|
||||
|
||||
_onOverviewHiding: function() {
|
||||
if (this._timeoutId == 0)
|
||||
this._hide();
|
||||
else
|
||||
this._overviewWasHidden = true;
|
||||
},
|
||||
|
||||
setMessage: function(text, undoCallback, undoLabel) {
|
||||
if (this._timeoutId)
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
|
||||
if (this._hidingOverviewId == 0) {
|
||||
// Set here, because when constructor is called, overview is null.
|
||||
if (!Main.overview)
|
||||
return;
|
||||
// We don't actually use the ID, it's just a way of tracking whether we've hooked up the signal
|
||||
this._hidingOverviewId = Main.overview.connect('hiding', Lang.bind(this, this._onOverviewHiding));
|
||||
}
|
||||
this._timeout = false;
|
||||
this._overviewWasHidden = false;
|
||||
|
||||
this._label.text = text;
|
||||
|
||||
@ -195,13 +178,21 @@ function Overview() {
|
||||
|
||||
Overview.prototype = {
|
||||
_init : function() {
|
||||
this._group = new St.BoxLayout({ style_class: 'overview' });
|
||||
this._group = new St.Group({ style_class: 'overview' });
|
||||
this._group._delegate = this;
|
||||
this._group.connect('destroy', Lang.bind(this,
|
||||
function() {
|
||||
if (this._lightbox) {
|
||||
this._lightbox.destroy();
|
||||
this._lightbox = null;
|
||||
}
|
||||
}));
|
||||
|
||||
this.infoBar = new InfoBar();
|
||||
this._group.add_actor(this.infoBar.actor);
|
||||
|
||||
this._workspacesManager = null;
|
||||
this._lightbox = null;
|
||||
|
||||
this.visible = false;
|
||||
this.animationInProgress = false;
|
||||
@ -251,19 +242,19 @@ Overview.prototype = {
|
||||
|
||||
this._coverPane.lower_bottom();
|
||||
|
||||
this._workspaces = null;
|
||||
this.workspaces = null;
|
||||
},
|
||||
|
||||
_onViewChanged: function() {
|
||||
if (!this.visible)
|
||||
return;
|
||||
|
||||
this._workspaces = this._workspacesManager.workspacesView;
|
||||
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);
|
||||
this._group.add_actor(this.workspaces.actor);
|
||||
this._workspacesBar.raise(this.workspaces.actor);
|
||||
this._dash.actor.raise(this.workspaces.actor);
|
||||
},
|
||||
|
||||
_recalculateGridSizes: function () {
|
||||
@ -289,6 +280,7 @@ Overview.prototype = {
|
||||
this._recalculateGridSizes();
|
||||
|
||||
this._group.set_position(primary.x, primary.y);
|
||||
this._group.set_size(primary.width, primary.height);
|
||||
|
||||
let contentY = Panel.PANEL_HEIGHT;
|
||||
let contentHeight = primary.height - contentY;
|
||||
@ -382,7 +374,11 @@ Overview.prototype = {
|
||||
this._activeDisplayPane.close();
|
||||
return true;
|
||||
}));
|
||||
this._workspaces.actor.opacity = 64;
|
||||
if (!this._lightbox)
|
||||
this._lightbox = new Lightbox.Lightbox(this._group,
|
||||
{ fadeTime: PANE_FADE_TIME });
|
||||
this._lightbox.show();
|
||||
this._lightbox.highlight(this._paneContainer);
|
||||
} else if (pane == this._activeDisplayPane) {
|
||||
this._activeDisplayPane = null;
|
||||
if (backgroundEventId != null) {
|
||||
@ -391,39 +387,36 @@ Overview.prototype = {
|
||||
}
|
||||
this._transparentBackground.lower_bottom();
|
||||
this._paneContainer.hide();
|
||||
this._workspaces.actor.opacity = 255;
|
||||
this._lightbox.hide();
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
//// Draggable target interface ////
|
||||
//// Public methods ////
|
||||
|
||||
// Closes any active panes if a GenericDisplayItem is being
|
||||
// dragged over the Overview, i.e. as soon as it starts being dragged.
|
||||
// This allows the user to place the item on any workspace.
|
||||
handleDragOver : function(source, actor, x, y, time) {
|
||||
if (source instanceof GenericDisplay.GenericDisplayItem
|
||||
|| source instanceof AppDisplay.AppIcon) {
|
||||
beginItemDrag: function(source) {
|
||||
// Close any active panes if @source is a GenericDisplayItem.
|
||||
// This allows the user to place the item on any workspace.
|
||||
if (source instanceof GenericDisplay.GenericDisplayItem)
|
||||
if (this._activeDisplayPane != null)
|
||||
this._activeDisplayPane.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
this.emit('item-drag-begin');
|
||||
},
|
||||
|
||||
//// Public methods ////
|
||||
endItemDrag: function(source) {
|
||||
this.emit('item-drag-end');
|
||||
},
|
||||
|
||||
// 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];
|
||||
@ -458,13 +451,13 @@ Overview.prototype = {
|
||||
this._workspacesY);
|
||||
this._workspacesManager.connect('view-changed',
|
||||
Lang.bind(this, this._onViewChanged));
|
||||
this._workspaces = this._workspacesManager.workspacesView;
|
||||
this._group.add_actor(this._workspaces.actor);
|
||||
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);
|
||||
|
||||
this._workspacesBar = this._workspacesManager.controlsBar.actor;
|
||||
this._workspacesBar.set_position(this._workspacesBarX,
|
||||
@ -472,7 +465,7 @@ Overview.prototype = {
|
||||
this._workspacesBar.width = this._workspacesBarWidth;
|
||||
|
||||
this._group.add_actor(this._workspacesBar);
|
||||
this._workspacesBar.raise(this._workspaces.actor);
|
||||
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
|
||||
@ -522,7 +515,7 @@ Overview.prototype = {
|
||||
this._hideInProgress = true;
|
||||
if (this._activeDisplayPane != null)
|
||||
this._activeDisplayPane.close();
|
||||
this._workspaces.hide();
|
||||
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
|
||||
@ -567,7 +560,7 @@ Overview.prototype = {
|
||||
* and will return %null.
|
||||
*/
|
||||
getWorkspacesForWindow: function(metaWindow) {
|
||||
return this._workspaces;
|
||||
return this.workspaces;
|
||||
},
|
||||
|
||||
//// Private methods ////
|
||||
@ -585,8 +578,8 @@ 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;
|
||||
|
779
js/ui/panel.js
779
js/ui/panel.js
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
||||
/* -*- 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 GConf = imports.gi.GConf;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Shell = imports.gi.Shell;
|
||||
@ -72,7 +72,7 @@ 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) {
|
||||
@ -93,12 +93,18 @@ PlaceDeviceInfo.prototype = {
|
||||
if (!this.isRemovable())
|
||||
return;
|
||||
|
||||
this._mount.unmount(0, null, Lang.bind(this, this._removeFinish));
|
||||
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) {
|
||||
try {
|
||||
this._mount.unmount_finish(res);
|
||||
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,
|
||||
@ -115,13 +121,13 @@ function PlacesManager() {
|
||||
|
||||
PlacesManager.prototype = {
|
||||
_init: function() {
|
||||
let gconf = Shell.GConf.get_default();
|
||||
gconf.watch_directory(NAUTILUS_PREFS_DIR);
|
||||
let gconf = GConf.Client.get_default();
|
||||
gconf.add_dir(NAUTILUS_PREFS_DIR, GConf.ClientPreloadType.PRELOAD_NONE);
|
||||
|
||||
this._defaultPlaces = [];
|
||||
this._mounts = [];
|
||||
this._bookmarks = [];
|
||||
this._isDesktopHome = gconf.get_boolean(DESKTOP_IS_HOME_KEY);
|
||||
this._isDesktopHome = gconf.get_bool(DESKTOP_IS_HOME_KEY);
|
||||
|
||||
let homeFile = Gio.file_new_for_path (GLib.get_home_dir());
|
||||
let homeUri = homeFile.get_uri();
|
||||
@ -150,7 +156,7 @@ PlacesManager.prototype = {
|
||||
|
||||
this._connect = new PlaceInfo('special:connect', _("Connect to..."),
|
||||
function (size) {
|
||||
return St.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();
|
||||
@ -163,7 +169,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.');
|
||||
}
|
||||
}
|
||||
|
||||
@ -203,7 +209,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;
|
||||
@ -220,7 +226,7 @@ PlacesManager.prototype = {
|
||||
|
||||
this._reloadBookmarks();
|
||||
|
||||
gconf.connect('changed::' + DESKTOP_IS_HOME_KEY, Lang.bind(this, this._updateDesktopMenuVisibility));
|
||||
gconf.notify_add(DESKTOP_IS_HOME_KEY, Lang.bind(this, this._updateDesktopMenuVisibility));
|
||||
|
||||
},
|
||||
|
||||
@ -331,11 +337,11 @@ PlacesManager.prototype = {
|
||||
},
|
||||
|
||||
_updateDesktopMenuVisibility: function() {
|
||||
let gconf = Shell.GConf.get_default();
|
||||
let gconf = GConf.Client.get_default();
|
||||
this._isDesktopHome = gconf.get_boolean(DESKTOP_IS_HOME_KEY);
|
||||
|
||||
if (this._isDesktopHome)
|
||||
this._removeById(this._defaultPlaces, "special:desktop");
|
||||
this._removeById(this._defaultPlaces, 'special:desktop');
|
||||
else
|
||||
this._defaultPlaces.splice(this._desktopMenuIndex, 0,
|
||||
this._desktopMenu);
|
||||
@ -435,18 +441,17 @@ DashPlaceDisplayItem.prototype = {
|
||||
}
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this.actor.connect('notify::hover',
|
||||
Lang.bind(this, this._onHoverChanged));
|
||||
this.actor.connect('button-press-event',
|
||||
Lang.bind(this, this._onButtonPress));
|
||||
this.actor.connect('button-release-event',
|
||||
Lang.bind(this, this._onButtonRelease));
|
||||
|
||||
this.actor._delegate = this;
|
||||
this._dragStartX = null;
|
||||
this._dragStartY = null;
|
||||
this._draggable = DND.makeDraggable(this.actor,
|
||||
{ manualMode: true });
|
||||
this._draggable = DND.makeDraggable(this.actor);
|
||||
this._draggable.connect('drag-begin',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.beginItemDrag(this);
|
||||
}));
|
||||
this._draggable.connect('drag-end',
|
||||
Lang.bind(this, function() {
|
||||
Main.overview.endItemDrag(this);
|
||||
}));
|
||||
},
|
||||
|
||||
_onClicked: function(b) {
|
||||
@ -454,36 +459,6 @@ DashPlaceDisplayItem.prototype = {
|
||||
Main.overview.hide();
|
||||
},
|
||||
|
||||
_onButtonPress: function(actor, event) {
|
||||
if (event.get_button() != 1)
|
||||
return false;
|
||||
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
this._dragStartX = stageX;
|
||||
this._dragStartY = stageY;
|
||||
return false;
|
||||
},
|
||||
|
||||
_onButtonRelease: function(actor, event) {
|
||||
if (event.get_button() != 1)
|
||||
return false;
|
||||
|
||||
this._dragStartX = null;
|
||||
this._dragStartY = null;
|
||||
return false;
|
||||
},
|
||||
|
||||
_onHoverChanged: function(button) {
|
||||
let hover = button.hover;
|
||||
if (!hover) {
|
||||
if (button.pressed && this._dragStartX != null) {
|
||||
button.fake_release();
|
||||
this._draggable.startDrag(this._dragStartX, this._dragStartY,
|
||||
global.get_current_time());
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
getDragActorSource: function() {
|
||||
return this._icon;
|
||||
},
|
||||
@ -510,28 +485,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));
|
||||
@ -543,27 +502,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});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
564
js/ui/popupMenu.js
Normal file
564
js/ui/popupMenu.js
Normal file
@ -0,0 +1,564 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Cairo = imports.cairo;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const BoxPointer = imports.ui.boxpointer;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const POPUP_ANIMATION_TIME = 0.1;
|
||||
|
||||
function PopupBaseMenuItem(reactive) {
|
||||
this._init(reactive);
|
||||
}
|
||||
|
||||
PopupBaseMenuItem.prototype = {
|
||||
_init: function (reactive) {
|
||||
this.actor = new St.Bin({ style_class: 'popup-menu-item',
|
||||
reactive: reactive,
|
||||
track_hover: reactive,
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this.actor._delegate = this;
|
||||
this.active = false;
|
||||
|
||||
if (reactive) {
|
||||
this.actor.connect('button-release-event', Lang.bind(this, function (actor, event) {
|
||||
this.emit('activate', event);
|
||||
}));
|
||||
this.actor.connect('notify::hover', Lang.bind(this, this._hoverChanged));
|
||||
}
|
||||
},
|
||||
|
||||
_hoverChanged: function (actor) {
|
||||
this.setActive(actor.hover);
|
||||
},
|
||||
|
||||
activate: function (event) {
|
||||
this.emit('activate', event);
|
||||
},
|
||||
|
||||
setActive: function (active) {
|
||||
let activeChanged = active != this.active;
|
||||
|
||||
if (activeChanged) {
|
||||
this.active = active;
|
||||
if (active)
|
||||
this.actor.add_style_pseudo_class('active');
|
||||
else
|
||||
this.actor.remove_style_pseudo_class('active');
|
||||
this.emit('active-changed', active);
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
|
||||
|
||||
function PopupMenuItem(text) {
|
||||
this._init(text);
|
||||
}
|
||||
|
||||
PopupMenuItem.prototype = {
|
||||
__proto__: PopupBaseMenuItem.prototype,
|
||||
|
||||
_init: function (text) {
|
||||
PopupBaseMenuItem.prototype._init.call(this, true);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this.actor.set_child(this.label);
|
||||
}
|
||||
};
|
||||
|
||||
function PopupSeparatorMenuItem() {
|
||||
this._init();
|
||||
}
|
||||
|
||||
PopupSeparatorMenuItem.prototype = {
|
||||
__proto__: PopupBaseMenuItem.prototype,
|
||||
|
||||
_init: function () {
|
||||
PopupBaseMenuItem.prototype._init.call(this, false);
|
||||
|
||||
this._drawingArea = new St.DrawingArea({ style_class: 'popup-separator-menu-item' });
|
||||
this.actor.set_child(this._drawingArea);
|
||||
this._drawingArea.connect('repaint', Lang.bind(this, this._onRepaint));
|
||||
},
|
||||
|
||||
_onRepaint: function(area) {
|
||||
let cr = area.get_context();
|
||||
let themeNode = area.get_theme_node();
|
||||
let [width, height] = area.get_surface_size();
|
||||
let found, margin, gradientHeight;
|
||||
[found, margin] = themeNode.get_length('-margin-horizontal', false);
|
||||
[found, gradientHeight] = themeNode.get_length('-gradient-height', false);
|
||||
let startColor = new Clutter.Color();
|
||||
themeNode.get_color('-gradient-start', false, startColor);
|
||||
let endColor = new Clutter.Color();
|
||||
themeNode.get_color('-gradient-end', false, endColor);
|
||||
|
||||
let gradientWidth = (width - margin * 2);
|
||||
let gradientOffset = (height - gradientHeight) / 2;
|
||||
let pattern = new Cairo.LinearGradient(margin, gradientOffset, width - margin, gradientOffset + gradientHeight);
|
||||
pattern.addColorStopRGBA(0, startColor.red / 255, startColor.green / 255, startColor.blue / 255, startColor.alpha / 255);
|
||||
pattern.addColorStopRGBA(0.5, endColor.red / 255, endColor.green / 255, endColor.blue / 255, endColor.alpha / 255);
|
||||
pattern.addColorStopRGBA(1, startColor.red / 255, startColor.green / 255, startColor.blue / 255, startColor.alpha / 255);
|
||||
cr.setSource(pattern);
|
||||
cr.rectangle(margin, gradientOffset, gradientWidth, gradientHeight);
|
||||
cr.fill();
|
||||
}
|
||||
};
|
||||
|
||||
function PopupImageMenuItem(text, iconName, alwaysShowImage) {
|
||||
this._init(text, iconName, alwaysShowImage);
|
||||
}
|
||||
|
||||
// We need to instantiate a GtkImageMenuItem so it
|
||||
// hooks up its properties on the GtkSettings
|
||||
var _gtkImageMenuItemCreated = false;
|
||||
|
||||
PopupImageMenuItem.prototype = {
|
||||
__proto__: PopupBaseMenuItem.prototype,
|
||||
|
||||
_init: function (text, iconName, alwaysShowImage) {
|
||||
PopupBaseMenuItem.prototype._init.call(this, true);
|
||||
|
||||
if (!_gtkImageMenuItemCreated) {
|
||||
let menuItem = new Gtk.ImageMenuItem();
|
||||
menuItem.destroy();
|
||||
_gtkImageMenuItemCreated = true;
|
||||
}
|
||||
|
||||
this._alwaysShowImage = alwaysShowImage;
|
||||
this._iconName = iconName;
|
||||
this._size = 16;
|
||||
|
||||
let box = new St.BoxLayout({ style_class: 'popup-image-menu-item' });
|
||||
this.actor.set_child(box);
|
||||
this._imageBin = new St.Bin({ width: this._size, height: this._size });
|
||||
box.add(this._imageBin, { y_fill: false });
|
||||
box.add(new St.Label({ text: text }), { expand: true });
|
||||
|
||||
if (!alwaysShowImage) {
|
||||
let settings = Gtk.Settings.get_default();
|
||||
settings.connect('notify::gtk-menu-images', Lang.bind(this, this._onMenuImagesChanged));
|
||||
}
|
||||
this._onMenuImagesChanged();
|
||||
},
|
||||
|
||||
_onMenuImagesChanged: function() {
|
||||
let show;
|
||||
if (this._alwaysShowImage) {
|
||||
show = true;
|
||||
} else {
|
||||
let settings = Gtk.Settings.get_default();
|
||||
show = settings.gtk_menu_images;
|
||||
}
|
||||
if (!show) {
|
||||
this._imageBin.hide();
|
||||
} else {
|
||||
let img = St.TextureCache.get_default().load_icon_name(this._iconName, this._size);
|
||||
this._imageBin.set_child(img);
|
||||
this._imageBin.show();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function mod(a, b) {
|
||||
return (a + b) % b;
|
||||
}
|
||||
|
||||
function findNextInCycle(items, current, direction) {
|
||||
let cur;
|
||||
|
||||
if (items.length == 0)
|
||||
return current;
|
||||
else if (items.length == 1)
|
||||
return items[0];
|
||||
|
||||
if (current)
|
||||
cur = items.indexOf(current);
|
||||
else if (direction == 1)
|
||||
cur = items.length - 1;
|
||||
else
|
||||
cur = 0;
|
||||
|
||||
return items[mod(cur + direction, items.length)];
|
||||
}
|
||||
|
||||
function PopupMenu(sourceActor, alignment, arrowSide, gap) {
|
||||
this._init(sourceActor, alignment, arrowSide, gap);
|
||||
}
|
||||
|
||||
PopupMenu.prototype = {
|
||||
_init: function(sourceActor, alignment, arrowSide, gap) {
|
||||
this.sourceActor = sourceActor;
|
||||
this._alignment = alignment;
|
||||
this._arrowSide = arrowSide;
|
||||
this._gap = gap;
|
||||
|
||||
this._boxPointer = new BoxPointer.BoxPointer(arrowSide,
|
||||
{ x_fill: true,
|
||||
y_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this.actor = this._boxPointer.actor;
|
||||
this.actor.style_class = 'popup-menu-boxpointer';
|
||||
this._box = new St.BoxLayout({ style_class: 'popup-menu-content',
|
||||
vertical: true });
|
||||
this._boxPointer.bin.set_child(this._box);
|
||||
this.actor.add_style_class_name('popup-menu');
|
||||
|
||||
this.isOpen = false;
|
||||
this._activeMenuItem = null;
|
||||
},
|
||||
|
||||
addAction: function(title, callback) {
|
||||
var menuItem = new PopupMenuItem(title);
|
||||
this.addMenuItem(menuItem);
|
||||
menuItem.connect('activate', Lang.bind(this, function (menuItem, event) {
|
||||
callback(event);
|
||||
}));
|
||||
},
|
||||
|
||||
addMenuItem: function(menuItem) {
|
||||
this._box.add(menuItem.actor);
|
||||
menuItem._activeChangeId = menuItem.connect('active-changed', Lang.bind(this, function (menuItem, active) {
|
||||
if (active && this._activeMenuItem != menuItem) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem = menuItem;
|
||||
this.emit('active-changed', menuItem);
|
||||
} else if (!active && this._activeMenuItem == menuItem) {
|
||||
this._activeMenuItem = null;
|
||||
this.emit('active-changed', null);
|
||||
}
|
||||
}));
|
||||
menuItem._activateId = menuItem.connect('activate', Lang.bind(this, function (menuItem, event) {
|
||||
this.emit('activate', menuItem);
|
||||
this.close();
|
||||
}));
|
||||
},
|
||||
|
||||
addActor: function(actor) {
|
||||
this._box.add(actor);
|
||||
},
|
||||
|
||||
getMenuItems: function() {
|
||||
return this._box.get_children().map(function (actor) { return actor._delegate; });
|
||||
},
|
||||
|
||||
removeAll: function() {
|
||||
let children = this.getMenuItems();
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let item = children[i];
|
||||
if (item._activeChangeId != 0)
|
||||
item.disconnect(item._activeChangeId);
|
||||
if (item._activateId != 0)
|
||||
item.disconnect(item._activateId);
|
||||
item.actor.destroy();
|
||||
}
|
||||
},
|
||||
|
||||
setArrowOrigin: function(origin) {
|
||||
this._boxPointer.setArrowOrigin(origin);
|
||||
},
|
||||
|
||||
open: function() {
|
||||
if (this.isOpen)
|
||||
return;
|
||||
|
||||
this.emit('opening');
|
||||
|
||||
let primary = global.get_primary_monitor();
|
||||
|
||||
// We need to show it now to force an allocation,
|
||||
// so that we can query the correct size.
|
||||
this.actor.show();
|
||||
|
||||
// Position correctly relative to the sourceActor
|
||||
let [sourceX, sourceY] = this.sourceActor.get_transformed_position();
|
||||
let [sourceWidth, sourceHeight] = this.sourceActor.get_transformed_size();
|
||||
|
||||
let [minWidth, minHeight, natWidth, natHeight] = this.actor.get_preferred_size();
|
||||
|
||||
let menuX, menuY;
|
||||
let menuWidth = natWidth, menuHeight = natHeight;
|
||||
|
||||
// Position the non-pointing axis
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
menuY = sourceY + sourceHeight + this._gap;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
menuY = sourceY - menuHeight - this._gap;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
menuX = sourceX + sourceWidth + this._gap;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
menuX = sourceX - menuWidth - this._gap;
|
||||
break;
|
||||
}
|
||||
|
||||
// Now align and position the pointing axis, making sure
|
||||
// it fits on screen
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
case St.Side.BOTTOM:
|
||||
switch (this._alignment) {
|
||||
case St.Align.START:
|
||||
menuX = sourceX;
|
||||
break;
|
||||
case St.Align.MIDDLE:
|
||||
menuX = sourceX - Math.floor((menuWidth - sourceWidth) / 2);
|
||||
break;
|
||||
case St.Align.END:
|
||||
menuX = sourceX - (menuWidth - sourceWidth);
|
||||
break;
|
||||
}
|
||||
|
||||
menuX = Math.min(menuX, primary.x + primary.width - menuWidth);
|
||||
menuX = Math.max(menuX, primary.x);
|
||||
|
||||
this._boxPointer.setArrowOrigin((sourceX - menuX) + Math.floor(sourceWidth / 2));
|
||||
break;
|
||||
|
||||
case St.Side.LEFT:
|
||||
case St.Side.RIGHT:
|
||||
switch (this._alignment) {
|
||||
case St.Align.START:
|
||||
menuY = sourceY;
|
||||
break;
|
||||
case St.Align.MIDDLE:
|
||||
menuY = sourceY - Math.floor((menuHeight - sourceHeight) / 2);
|
||||
break;
|
||||
case St.Align.END:
|
||||
menuY = sourceY - (menuHeight - sourceHeight);
|
||||
break;
|
||||
}
|
||||
|
||||
menuY = Math.min(menuY, primary.y + primary.height - menuHeight);
|
||||
menuY = Math.max(menuY, primary.y);
|
||||
|
||||
this._boxPointer.setArrowOrigin((sourceY - menuY) + Math.floor(sourceHeight / 2));
|
||||
break;
|
||||
}
|
||||
|
||||
// Actually set the position
|
||||
this.actor.x = Math.floor(menuX);
|
||||
this.actor.y = Math.floor(menuY);
|
||||
|
||||
// Now show it
|
||||
this.actor.opacity = 0;
|
||||
this.actor.reactive = true;
|
||||
Tweener.addTween(this.actor, { opacity: 255,
|
||||
transition: "easeOutQuad",
|
||||
time: POPUP_ANIMATION_TIME });
|
||||
this.isOpen = true;
|
||||
this.emit('open-state-changed', true);
|
||||
},
|
||||
|
||||
close: function() {
|
||||
if (!this.isOpen)
|
||||
return;
|
||||
|
||||
this.actor.reactive = false;
|
||||
Tweener.addTween(this.actor, { opacity: 0,
|
||||
transition: "easeOutQuad",
|
||||
time: POPUP_ANIMATION_TIME,
|
||||
onComplete: Lang.bind(this, function () { this.actor.hide(); })});
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this.isOpen = false;
|
||||
this.emit('open-state-changed', false);
|
||||
},
|
||||
|
||||
|
||||
toggle: function() {
|
||||
if (this.isOpen)
|
||||
this.close();
|
||||
else
|
||||
this.open();
|
||||
},
|
||||
|
||||
handleKeyPress: function(event) {
|
||||
if (event.get_key_symbol() == Clutter.space ||
|
||||
event.get_key_symbol() == Clutter.Return) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.activate(event);
|
||||
return true;
|
||||
} else if (event.get_key_symbol() == Clutter.Down
|
||||
|| event.get_key_symbol() == Clutter.Up) {
|
||||
let items = this._box.get_children().filter(function (child) { return child.visible && child.reactive; });
|
||||
let current = this._activeMenuItem ? this._activeMenuItem.actor : null;
|
||||
let direction = event.get_key_symbol() == Clutter.Down ? 1 : -1;
|
||||
|
||||
let next = findNextInCycle(items, current, direction);
|
||||
if (next) {
|
||||
next._delegate.setActive(true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(PopupMenu.prototype);
|
||||
|
||||
/* Basic implementation of a menu manager.
|
||||
* Call addMenu to add menus
|
||||
*/
|
||||
function PopupMenuManager(owner) {
|
||||
this._init(owner);
|
||||
}
|
||||
|
||||
PopupMenuManager.prototype = {
|
||||
_init: function(owner) {
|
||||
this._owner = owner;
|
||||
this.grabbed = false;
|
||||
|
||||
this._eventCaptureId = 0;
|
||||
this._enterEventId = 0;
|
||||
this._leaveEventId = 0;
|
||||
this._activeMenu = null;
|
||||
this._menus = [];
|
||||
this._delayedMenus = [];
|
||||
},
|
||||
|
||||
addMenu: function(menu, noGrab) {
|
||||
this._menus.push(menu);
|
||||
menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState));
|
||||
menu.connect('activate', Lang.bind(this, this._onMenuActivated));
|
||||
|
||||
let source = menu.sourceActor;
|
||||
if (source) {
|
||||
source.connect('enter-event', Lang.bind(this, this._onMenuSourceEnter, menu));
|
||||
if (!noGrab)
|
||||
source.connect('button-press-event', Lang.bind(this, this._onMenuSourcePress, menu));
|
||||
}
|
||||
},
|
||||
|
||||
grab: function() {
|
||||
Main.pushModal(this._owner.actor);
|
||||
|
||||
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture));
|
||||
// captured-event doesn't see enter/leave events
|
||||
this._enterEventId = global.stage.connect('enter-event', Lang.bind(this, this._onEventCapture));
|
||||
this._leaveEventId = global.stage.connect('leave-event', Lang.bind(this, this._onEventCapture));
|
||||
|
||||
this.grabbed = true;
|
||||
},
|
||||
|
||||
ungrab: function() {
|
||||
global.stage.disconnect(this._eventCaptureId);
|
||||
this._eventCaptureId = 0;
|
||||
global.stage.disconnect(this._enterEventId);
|
||||
this._enterEventId = 0;
|
||||
global.stage.disconnect(this._leaveEventId);
|
||||
this._leaveEventId = 0;
|
||||
|
||||
Main.popModal(this._owner.actor);
|
||||
|
||||
this.grabbed = false;
|
||||
},
|
||||
|
||||
_onMenuOpenState: function(menu, open) {
|
||||
if (!open && menu == this._activeMenu)
|
||||
this._activeMenu = null;
|
||||
else if (open)
|
||||
this._activeMenu = menu;
|
||||
},
|
||||
|
||||
_onMenuSourceEnter: function(actor, event, menu) {
|
||||
if (!this.grabbed || menu == this._activeMenu)
|
||||
return false;
|
||||
|
||||
if (this._activeMenu != null)
|
||||
this._activeMenu.close();
|
||||
menu.open();
|
||||
return false;
|
||||
},
|
||||
|
||||
_onMenuSourcePress: function(actor, event, menu) {
|
||||
if (this.grabbed)
|
||||
return false;
|
||||
this.grab();
|
||||
return false;
|
||||
},
|
||||
|
||||
_onMenuActivated: function(menu, item) {
|
||||
if (this.grabbed)
|
||||
this.ungrab();
|
||||
},
|
||||
|
||||
_eventIsOnActiveMenu: function(event) {
|
||||
let src = event.get_source();
|
||||
return this._activeMenu != null
|
||||
&& (this._activeMenu.actor.contains(src) ||
|
||||
this._activeMenu.sourceActor.contains(src));
|
||||
},
|
||||
|
||||
_eventIsOnAnyMenuSource: function(event) {
|
||||
let src = event.get_source();
|
||||
for (let i = 0; i < this._menus.length; i++) {
|
||||
if (this._menus[i].sourceActor.contains(src))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
_onEventCapture: function(actor, event) {
|
||||
if (!this.grabbed)
|
||||
return false;
|
||||
|
||||
if (this._owner.menuEventFilter &&
|
||||
this._owner.menuEventFilter(event))
|
||||
return true;
|
||||
|
||||
let activeMenuContains = this._eventIsOnActiveMenu(event);
|
||||
let eventType = event.type();
|
||||
if (eventType == Clutter.EventType.BUTTON_RELEASE) {
|
||||
if (activeMenuContains) {
|
||||
return false;
|
||||
} else {
|
||||
this._closeMenu();
|
||||
return true;
|
||||
}
|
||||
} else if ((eventType == Clutter.EventType.BUTTON_PRESS && !activeMenuContains)
|
||||
|| (eventType == Clutter.EventType.KEY_PRESS && event.get_key_symbol() == Clutter.Escape)) {
|
||||
this._closeMenu();
|
||||
return true;
|
||||
} else if (eventType == Clutter.EventType.KEY_PRESS
|
||||
&& this._activeMenu != null
|
||||
&& this._activeMenu.handleKeyPress(event)) {
|
||||
return true;
|
||||
} else if (eventType == Clutter.EventType.KEY_PRESS
|
||||
&& this._activeMenu != null
|
||||
&& (event.get_key_symbol() == Clutter.Left
|
||||
|| event.get_key_symbol() == Clutter.Right)) {
|
||||
let direction = event.get_key_symbol() == Clutter.Right ? 1 : -1;
|
||||
let next = findNextInCycle(this._menus, this._activeMenu, direction);
|
||||
if (next != this._activeMenu) {
|
||||
this._activeMenu.close();
|
||||
next.open();
|
||||
}
|
||||
return true;
|
||||
} else if (activeMenuContains || this._eventIsOnAnyMenuSource(event)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_closeMenu: function() {
|
||||
if (this._activeMenu != null)
|
||||
this._activeMenu.close();
|
||||
this.ungrab();
|
||||
}
|
||||
};
|
@ -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 GLib = imports.gi.GLib;
|
||||
@ -15,12 +14,15 @@ const _ = Gettext.gettext;
|
||||
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const MAX_FILE_DELETED_BEFORE_INVALID = 10;
|
||||
|
||||
const HISTORY_KEY = 'run_dialog/history';
|
||||
const HISTORY_KEY = 'command-history';
|
||||
const HISTORY_LIMIT = 512;
|
||||
|
||||
const DIALOG_FADE_TIME = 0.1;
|
||||
|
||||
function CommandCompleter() {
|
||||
this._init();
|
||||
}
|
||||
@ -52,7 +54,7 @@ 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) {
|
||||
@ -133,7 +135,7 @@ CommandCompleter.prototype = {
|
||||
},
|
||||
|
||||
getCompletion: function(text) {
|
||||
let common = "";
|
||||
let common = '';
|
||||
let notInit = true;
|
||||
if (!this._valid) {
|
||||
this._update(0);
|
||||
@ -146,7 +148,7 @@ CommandCompleter.prototype = {
|
||||
break;
|
||||
}
|
||||
if (k == 0)
|
||||
return "";
|
||||
return '';
|
||||
return s1.substr(0, k);
|
||||
}
|
||||
function _hasPrefix(s1, prefix) {
|
||||
@ -177,17 +179,16 @@ RunDialog.prototype = {
|
||||
_init : function() {
|
||||
this._isOpen = false;
|
||||
|
||||
this._gconf = Shell.GConf.get_default();
|
||||
this._gconf.connect('changed::development_tools', Lang.bind(this, function () {
|
||||
this._enableInternalCommands = this._gconf.get_boolean('development_tools');
|
||||
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
|
||||
this._enableInternalCommands = global.settings.get_boolean('development-tools');
|
||||
}));
|
||||
this._enableInternalCommands = this._gconf.get_boolean('development_tools');
|
||||
this._enableInternalCommands = global.settings.get_boolean('development-tools');
|
||||
|
||||
this._history = this._gconf.get_string_list(HISTORY_KEY);
|
||||
this._history = global.settings.get_strv(HISTORY_KEY);
|
||||
this._historyIndex = -1;
|
||||
|
||||
this._gconf.connect('changed::' + HISTORY_KEY, Lang.bind(this, function() {
|
||||
this._history = this._gconf.get_string_list(HISTORY_KEY);
|
||||
global.settings.connect('changed::' + HISTORY_KEY, Lang.bind(this, function() {
|
||||
this._history = global.settings.get_strv(HISTORY_KEY);
|
||||
this._historyIndex = this._history.length;
|
||||
}));
|
||||
|
||||
@ -214,15 +215,16 @@ RunDialog.prototype = {
|
||||
// hidden then show it in show()
|
||||
this._group = new Clutter.Group({ visible: false,
|
||||
x: 0, y: 0 });
|
||||
global.stage.add_actor(this._group);
|
||||
Main.uiGroup.add_actor(this._group);
|
||||
|
||||
let lightbox = new Lightbox.Lightbox(this._group, true);
|
||||
this._lightbox = new Lightbox.Lightbox(this._group,
|
||||
{ inhibitEvents: true });
|
||||
|
||||
this._box = new St.Bin({ x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.MIDDLE });
|
||||
|
||||
this._group.add_actor(this._box);
|
||||
lightbox.highlight(this._box);
|
||||
this._lightbox.highlight(this._box);
|
||||
|
||||
let dialogBox = new St.BoxLayout({ style_class: 'run-dialog', vertical: true });
|
||||
|
||||
@ -268,8 +270,8 @@ RunDialog.prototype = {
|
||||
this._setCommandFromHistory(this._historyIndex--);
|
||||
return true;
|
||||
}
|
||||
if (symbol == Clutter.Return) {
|
||||
if (e.get_state() & Clutter.ModifierType.CONTROL_MASK)
|
||||
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);
|
||||
@ -324,14 +326,17 @@ RunDialog.prototype = {
|
||||
if (this._history.length > HISTORY_LIMIT) {
|
||||
this._history.splice(0, this._history.length - HISTORY_LIMIT);
|
||||
}
|
||||
this._gconf.set_string_list(HISTORY_KEY, this._history);
|
||||
global.settings.set_strv(HISTORY_KEY, this._history);
|
||||
},
|
||||
|
||||
_run : function(input, inTerminal) {
|
||||
let command = input;
|
||||
|
||||
this._history.push(input);
|
||||
this._saveHistory();
|
||||
if (this._history.length == 0 ||
|
||||
this._history[this._history.length - 1] != input) {
|
||||
this._history.push(input);
|
||||
this._saveHistory();
|
||||
}
|
||||
|
||||
this._commandError = false;
|
||||
let f;
|
||||
@ -371,7 +376,7 @@ RunDialog.prototype = {
|
||||
// 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];
|
||||
let errorStr = _("Execution of '%s' failed:").format(command) + '\n' + m[1];
|
||||
this._errorMessage.set_text(errorStr);
|
||||
|
||||
this._errorBox.show();
|
||||
@ -412,7 +417,14 @@ RunDialog.prototype = {
|
||||
this._box.set_size(monitor.width, monitor.height);
|
||||
|
||||
this._isOpen = true;
|
||||
this._lightbox.show();
|
||||
this._group.opacity = 0;
|
||||
this._group.show();
|
||||
Tweener.addTween(this._group,
|
||||
{ opacity: 255,
|
||||
time: DIALOG_FADE_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
global.stage.set_key_focus(this._entryText);
|
||||
},
|
||||
@ -422,14 +434,20 @@ RunDialog.prototype = {
|
||||
return;
|
||||
|
||||
this._isOpen = false;
|
||||
|
||||
this._errorBox.hide();
|
||||
this._commandError = false;
|
||||
|
||||
this._group.hide();
|
||||
this._entryText.set_text('');
|
||||
|
||||
Main.popModal(this._group);
|
||||
|
||||
Tweener.addTween(this._group,
|
||||
{ opacity: 0,
|
||||
time: DIALOG_FADE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this._errorBox.hide();
|
||||
this._group.hide();
|
||||
this._entryText.set_text('');
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(RunDialog.prototype);
|
||||
|
261
js/ui/scripting.js
Normal file
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,14 +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");
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
};
|
||||
|
||||
@ -127,7 +127,7 @@ SearchProvider.prototype = {
|
||||
* or network queries.
|
||||
*/
|
||||
getInitialResultSet: function(terms) {
|
||||
throw new Error("not implemented");
|
||||
throw new Error('Not implemented');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -144,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');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -155,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');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -194,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');
|
||||
},
|
||||
|
||||
/**
|
||||
@ -205,7 +205,7 @@ 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);
|
||||
@ -238,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;
|
||||
|
||||
|
@ -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);
|
||||
|
264
js/ui/sidebar.js
264
js/ui/sidebar.js
@ -1,264 +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 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._hidden = false;
|
||||
this._hideTimeoutId = 0;
|
||||
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._gconf.connect('changed::sidebar/autohide',
|
||||
Lang.bind(this, this._autohideChanged));
|
||||
|
||||
this.actor.connect('enter-event',Lang.bind(this,this._restoreHidden));
|
||||
this.actor.connect('leave-event',Lang.bind(this,this._startHideTimeout));
|
||||
|
||||
this._adjustPosition();
|
||||
this._autohideChanged();
|
||||
},
|
||||
|
||||
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.floor(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();
|
||||
},
|
||||
|
||||
_autohideChanged: function() {
|
||||
let autohide = this._gconf.get_boolean("sidebar/autohide");
|
||||
if (autohide == this._autohide)
|
||||
return;
|
||||
|
||||
this._autohide = autohide;
|
||||
if (autohide) {
|
||||
this.actor.set_reactive(true);
|
||||
this._hide();
|
||||
} else {
|
||||
this.actor.set_reactive(false);
|
||||
this._restore();
|
||||
}
|
||||
},
|
||||
|
||||
_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();
|
||||
|
||||
// Update the strut/stage area after the animation completes
|
||||
Tweener.addTween(this, { time: WidgetBox.ANIMATION_TIME,
|
||||
onComplete: Lang.bind(this, function () {
|
||||
this.actor.width = SIDEBAR_COLLAPSED_WIDTH;
|
||||
}) });
|
||||
},
|
||||
|
||||
_hide: function() {
|
||||
if (!this._expanded) {
|
||||
this._hidden = true;
|
||||
for (let i = 0; i < this._widgets.length; i++)
|
||||
this._widgets[i].hide();
|
||||
|
||||
// Update the strut/stage area after the animation completes
|
||||
Tweener.addTween(this, { time: WidgetBox.ANIMATION_TIME / 2,
|
||||
onComplete: Lang.bind(this, function () {
|
||||
this.actor.width = Math.floor(WidgetBox.WIDGETBOX_PADDING * 2 + SIDEBAR_PADDING);
|
||||
}) });
|
||||
}
|
||||
},
|
||||
|
||||
_restore: function() {
|
||||
if (!this._expanded) {
|
||||
this._hidden = false;
|
||||
for (let i = 0; i < this._widgets.length; i++)
|
||||
this._widgets[i].restore();
|
||||
|
||||
// Updated the strut/stage area after the animation completes
|
||||
Tweener.addTween(this, { time: WidgetBox.ANIMATION_TIME / 2,
|
||||
onComplete: function () {
|
||||
this.actor.width = SIDEBAR_COLLAPSED_WIDTH;
|
||||
} });
|
||||
}
|
||||
},
|
||||
|
||||
_restoreHidden: function(actor, event) {
|
||||
this._cancelHideTimeout();
|
||||
if (this._hidden)
|
||||
this._restore();
|
||||
return false;
|
||||
},
|
||||
|
||||
_startHideTimeout: function(actor, event) {
|
||||
if (!this._expanded) {
|
||||
this._cancelHideTimeout();
|
||||
this._hideTimeoutId = Mainloop.timeout_add_seconds(2, Lang.bind(this,this._hideTimeoutFunc));
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
_cancelHideTimeout: function() {
|
||||
if (this._hideTimeoutId != 0) {
|
||||
Mainloop.source_remove(this._hideTimeoutId);
|
||||
this._hideTimeoutId = 0;
|
||||
}
|
||||
},
|
||||
|
||||
_hideTimeoutFunc: function() {
|
||||
this._hide();
|
||||
return false;
|
||||
},
|
||||
|
||||
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,53 +1,55 @@
|
||||
/* -*- 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 Main = imports.ui.main;
|
||||
const Panel = imports.ui.panel;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
// Adapted from gdm/gui/user-switch-applet/applet.c
|
||||
//
|
||||
// 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 = 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);
|
||||
this._invisibleIcon = textureCache.load_icon_name('gtk-close', 16);
|
||||
this._idleIcon = textureCache.load_icon_name('gtk-media-pause', 16);
|
||||
this._availableIcon = textureCache.load_icon_name('user-available', 16);
|
||||
this._busyIcon = textureCache.load_icon_name('user-busy', 16);
|
||||
this._invisibleIcon = textureCache.load_icon_name('user-invisible', 16);
|
||||
this._idleIcon = textureCache.load_icon_name('user-idle', 16);
|
||||
|
||||
this._presence.connect('StatusChanged', Lang.bind(this, this._updatePresenceIcon));
|
||||
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,135 +69,101 @@ 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 PopupMenu.PopupImageMenuItem(_("Available"), 'user-available', 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 PopupMenu.PopupImageMenuItem(_("Busy"), 'user-busy', 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 PopupMenu.PopupImageMenuItem(_("Invisible"), 'user-invisible', 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 PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_("Account Information..."), 'user-info');
|
||||
item = new PopupMenu.PopupImageMenuItem(_("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 PopupMenu.PopupImageMenuItem(_("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 PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = this._createImageMenuItem(_("Lock Screen"), 'system-lock-screen');
|
||||
item = new PopupMenu.PopupImageMenuItem(_("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 PopupMenu.PopupImageMenuItem(_("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 PopupMenu.PopupImageMenuItem(_("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 PopupMenu.PopupImageMenuItem(_("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);
|
||||
},
|
||||
|
||||
_onAccountInformationActivate: function() {
|
||||
Main.overview.hide();
|
||||
this._spawn(['gnome-about-me']);
|
||||
},
|
||||
|
||||
_onPreferencesActivate: function() {
|
||||
Main.overview.hide();
|
||||
this._spawn(['gnome-control-center']);
|
||||
},
|
||||
|
||||
_onLockScreenActivate: function() {
|
||||
Main.overview.hide();
|
||||
this._spawn(['gnome-screensaver-command', '--lock']);
|
||||
},
|
||||
|
||||
_onLoginScreenActivate: function() {
|
||||
Main.overview.hide();
|
||||
this._gdm.goto_login_session();
|
||||
this._onLockScreenActivate();
|
||||
},
|
||||
|
||||
_onQuitSessionActivate: function() {
|
||||
Main.overview.hide();
|
||||
this._spawn(['gnome-session-save', '--logout-dialog']);
|
||||
},
|
||||
|
||||
_onShutDownActivate: function() {
|
||||
Main.overview.hide();
|
||||
this._spawn(['gnome-session-save', '--shutdown-dialog']);
|
||||
},
|
||||
|
||||
@ -205,98 +173,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;
|
||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL) {
|
||||
menuX = panelX;
|
||||
} else {
|
||||
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);
|
||||
|
||||
|
682
js/ui/telepathyClient.js
Normal file
682
js/ui/telepathyClient.js
Normal file
@ -0,0 +1,682 @@
|
||||
/* -*- 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, 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;
|
||||
|
||||
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.title = 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.title);
|
||||
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.title);
|
||||
notify = (this._presence != Telepathy.ConnectionPresenceType.OFFLINE);
|
||||
} else if (presence == Telepathy.ConnectionPresenceType.AWAY) {
|
||||
msg = _("%s is away.").format(this.title);
|
||||
notify = false;
|
||||
} else if (presence == Telepathy.ConnectionPresenceType.BUSY) {
|
||||
msg = _("%s is busy.").format(this.title);
|
||||
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.title);
|
||||
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.title, 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 ();
|
||||
if (source && notification.contains(source))
|
||||
return false;
|
||||
|
||||
// @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();
|
||||
}
|
||||
}
|
||||
};
|
@ -1,9 +1,10 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Tweener = imports.tweener.tweener;
|
||||
|
||||
@ -42,17 +43,8 @@ const Tweener = imports.tweener.tweener;
|
||||
// calls any of these is almost certainly wrong anyway, because they
|
||||
// affect the entire application.)
|
||||
|
||||
let slowDownFactor = 1.0;
|
||||
|
||||
// Called from Main.start
|
||||
function init() {
|
||||
let slowdownEnv = GLib.getenv("GNOME_SHELL_SLOWDOWN_FACTOR");
|
||||
if (slowdownEnv) {
|
||||
let factor = parseFloat(slowdownEnv);
|
||||
if (!isNaN(factor) && factor > 0.0)
|
||||
slowDownFactor = factor;
|
||||
}
|
||||
|
||||
Tweener.setFrameTicker(new ClutterFrameTicker());
|
||||
}
|
||||
|
||||
@ -190,7 +182,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.
|
||||
@ -215,12 +207,19 @@ ClutterFrameTicker.prototype = {
|
||||
// when we need to stop, so use 1000 seconds as "infinity"
|
||||
this._timeline = new Clutter.Timeline({ duration: 1000*1000 });
|
||||
this._startTime = -1;
|
||||
this._currentTime = -1;
|
||||
|
||||
this._timeline.connect('new-frame', Lang.bind(this,
|
||||
function(timeline, frame) {
|
||||
this._onNewFrame(frame);
|
||||
}));
|
||||
|
||||
let perf_log = Shell.PerfLog.get_default();
|
||||
perf_log.define_event("tweener.framePrepareStart",
|
||||
"Start of a new animation frame",
|
||||
"");
|
||||
perf_log.define_event("tweener.framePrepareDone",
|
||||
"Finished preparing frame",
|
||||
"");
|
||||
},
|
||||
|
||||
_onNewFrame : function(frame) {
|
||||
@ -233,22 +232,27 @@ ClutterFrameTicker.prototype = {
|
||||
this._startTime = this._timeline.get_elapsed_time();
|
||||
|
||||
// currentTime is in milliseconds
|
||||
this._currentTime = (this._timeline.get_elapsed_time() - this._startTime) / slowDownFactor;
|
||||
let perf_log = Shell.PerfLog.get_default();
|
||||
perf_log.event("tweener.framePrepareStart");
|
||||
this.emit('prepare-frame');
|
||||
perf_log.event("tweener.framePrepareDone");
|
||||
},
|
||||
|
||||
getTime : function() {
|
||||
return this._currentTime;
|
||||
return this._timeline.get_elapsed_time();
|
||||
},
|
||||
|
||||
start : function() {
|
||||
if (St.get_slow_down_factor() > 0)
|
||||
Tweener.setTimeScale(1 / St.get_slow_down_factor());
|
||||
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
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 St = imports.gi.St;
|
||||
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 St.DrawingArea({ width: COLLAPSED_WIDTH,
|
||||
height: COLLAPSED_WIDTH });
|
||||
this.collapsedActor.connect('repaint', Lang.bind(this, this._repaintClock));
|
||||
|
||||
this._update();
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this.timer)
|
||||
Mainloop.source_remove(this.timer);
|
||||
},
|
||||
|
||||
expand: function() {
|
||||
this._update();
|
||||
},
|
||||
|
||||
collapse: function() {
|
||||
this._update();
|
||||
},
|
||||
|
||||
_update: function() {
|
||||
this.currentTime = new Date();
|
||||
let msec_remaining = 60000 - (1000 * this.currentTime.getSeconds() +
|
||||
this.currentTime.getMilliseconds());
|
||||
if (msec_remaining < 500) {
|
||||
this.currentTime.setMinutes(this.currentTime.getMinutes() + 1);
|
||||
msec_remaining += 60000;
|
||||
}
|
||||
|
||||
if (this.state == STATE_COLLAPSED || this.state == STATE_COLLAPSING)
|
||||
this.collapsedActor.queue_repaint();
|
||||
else
|
||||
this._updateText();
|
||||
|
||||
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(this.currentTime.toLocaleFormat(_("%H:%M")));
|
||||
},
|
||||
|
||||
_repaintClock: function(area) {
|
||||
Shell.draw_clock(area,
|
||||
this.currentTime.getHours() % 12,
|
||||
this.currentTime.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,395 +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.get_parent().remove_actor(this._widget.actor);
|
||||
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.get_parent().remove_actor(this._widget.actor);
|
||||
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);
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
if (this.state == Widget.STATE_COLLAPSED)
|
||||
Tweener.addTween(this._cbox, { x: -Widget.COLLAPSED_WIDTH,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad" });
|
||||
},
|
||||
|
||||
restore: function() {
|
||||
if (this.state == Widget.STATE_COLLAPSED)
|
||||
Tweener.addTween(this._cbox, { x: 0,
|
||||
time: ANIMATION_TIME / 2,
|
||||
transition: "easeOutQuad" });
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._widget.destroy)
|
||||
this._widget.destroy();
|
||||
}
|
||||
};
|
||||
|
@ -92,7 +92,7 @@ Source.prototype = {
|
||||
__proto__ : MessageTray.Source.prototype,
|
||||
|
||||
_init: function(sourceId, app, window) {
|
||||
MessageTray.Source.prototype._init.call(this, sourceId);
|
||||
MessageTray.Source.prototype._init.call(this, sourceId, app.get_name());
|
||||
this._window = window;
|
||||
this._app = app;
|
||||
},
|
||||
|
@ -30,18 +30,21 @@ WindowManager.prototype = {
|
||||
this._destroying = [];
|
||||
|
||||
this._switchData = null;
|
||||
this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
|
||||
this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
|
||||
this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) {
|
||||
this._minimizeWindowDone(shellwm, actor);
|
||||
this._maximizeWindowDone(shellwm, actor);
|
||||
this._unmaximizeWindowDone(shellwm, actor);
|
||||
this._mapWindowDone(shellwm, actor);
|
||||
this._destroyWindowDone(shellwm, actor);
|
||||
}));
|
||||
|
||||
this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
|
||||
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));
|
||||
|
||||
this._workspaceSwitcherPopup = null;
|
||||
this.setKeybindingHandler('switch_to_workspace_left', Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
@ -103,7 +106,7 @@ WindowManager.prototype = {
|
||||
x: xDest,
|
||||
y: 0,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._minimizeWindowDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm, actor],
|
||||
@ -152,17 +155,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],
|
||||
@ -175,8 +176,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);
|
||||
}
|
||||
},
|
||||
@ -200,7 +200,7 @@ WindowManager.prototype = {
|
||||
return;
|
||||
}
|
||||
|
||||
let windows = shellwm.get_switch_workspace_actors();
|
||||
let windows = global.get_windows();
|
||||
|
||||
/* @direction is the direction that the "camera" moves, so the
|
||||
* screen contents have to move one screen's worth in the
|
||||
@ -261,7 +261,7 @@ WindowManager.prototype = {
|
||||
{ x: xDest,
|
||||
y: yDest,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._switchWorkspaceDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm]
|
||||
@ -270,7 +270,7 @@ WindowManager.prototype = {
|
||||
{ x: 0,
|
||||
y: 0,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
},
|
||||
|
||||
@ -309,7 +309,7 @@ WindowManager.prototype = {
|
||||
|
||||
_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")
|
||||
if (binding == 'switch_to_workspace_up' || binding == 'switch_to_workspace_down')
|
||||
return;
|
||||
|
||||
if (global.screen.n_workspaces == 1)
|
||||
@ -318,11 +318,11 @@ WindowManager.prototype = {
|
||||
if (this._workspaceSwitcherPopup == null)
|
||||
this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup();
|
||||
|
||||
if (binding == "switch_to_workspace_left") {
|
||||
if (binding == 'switch_to_workspace_left') {
|
||||
this.actionMoveWorkspaceLeft();
|
||||
}
|
||||
|
||||
if (binding == "switch_to_workspace_right") {
|
||||
if (binding == 'switch_to_workspace_right') {
|
||||
this.actionMoveWorkspaceRight();
|
||||
}
|
||||
},
|
||||
|
@ -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 GdkPixbuf = imports.gi.GdkPixbuf;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
@ -29,7 +28,8 @@ FRAME_COLOR.from_pixel(0xffffffff);
|
||||
|
||||
const SCROLL_SCALE_AMOUNT = 100 / 5;
|
||||
|
||||
const ZOOM_OVERLAY_FADE_TIME = 0.15;
|
||||
const LIGHTBOX_FADE_TIME = 0.1;
|
||||
const CLOSE_BUTTON_FADE_TIME = 0.1;
|
||||
|
||||
const DRAGGING_WINDOW_OPACITY = 100;
|
||||
|
||||
@ -122,19 +122,18 @@ WindowClone.prototype = {
|
||||
Lang.bind(this, this._onScroll));
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
this.actor.connect('enter-event',
|
||||
Lang.bind(this, this._onEnter));
|
||||
this.actor.connect('leave-event',
|
||||
Lang.bind(this, this._onLeave));
|
||||
this._havePointer = false;
|
||||
|
||||
this._draggable = DND.makeDraggable(this.actor,
|
||||
{ dragActorMaxSize: WINDOW_DND_SIZE,
|
||||
{ restoreOnSuccess: true,
|
||||
dragActorMaxSize: WINDOW_DND_SIZE,
|
||||
dragActorOpacity: DRAGGING_WINDOW_OPACITY });
|
||||
this._draggable.connect('drag-begin', Lang.bind(this, this._onDragBegin));
|
||||
this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd));
|
||||
this.inDrag = false;
|
||||
|
||||
this._windowIsZooming = false;
|
||||
this._zooming = false;
|
||||
this._selected = false;
|
||||
},
|
||||
@ -179,23 +178,7 @@ WindowClone.prototype = {
|
||||
this.disconnectAll();
|
||||
},
|
||||
|
||||
_onEnter: function (actor, event) {
|
||||
// If the user drags faster than we can follow, he'll end up
|
||||
// leaving the window temporarily and then re-entering it
|
||||
if (this.inDrag)
|
||||
return;
|
||||
|
||||
this._havePointer = true;
|
||||
},
|
||||
|
||||
_onLeave: function (actor, event) {
|
||||
// If the user drags faster than we can follow, he'll end up
|
||||
// leaving the window temporarily and then re-entering it
|
||||
if (this.inDrag)
|
||||
return;
|
||||
|
||||
this._havePointer = false;
|
||||
|
||||
if (this._zoomStep)
|
||||
this._zoomEnd();
|
||||
},
|
||||
@ -235,7 +218,10 @@ WindowClone.prototype = {
|
||||
this._zooming = true;
|
||||
this.emit('zoom-start');
|
||||
|
||||
this._zoomLightbox = new Lightbox.Lightbox(global.stage, false);
|
||||
if (!this._zoomLightbox)
|
||||
this._zoomLightbox = new Lightbox.Lightbox(global.stage,
|
||||
{ fadeTime: LIGHTBOX_FADE_TIME });
|
||||
this._zoomLightbox.show();
|
||||
|
||||
this._zoomLocalOrig = new ScaledPoint(this.actor.x, this.actor.y, this.actor.scale_x, this.actor.scale_y);
|
||||
this._zoomGlobalOrig = new ScaledPoint();
|
||||
@ -274,7 +260,7 @@ WindowClone.prototype = {
|
||||
[this.actor.x, this.actor.y] = this._zoomLocalOrig.getPosition();
|
||||
[this.actor.scale_x, this.actor.scale_y] = this._zoomLocalOrig.getScale();
|
||||
|
||||
this._zoomLightbox.destroy();
|
||||
this._zoomLightbox.hide();
|
||||
|
||||
this._zoomLocalPosition = undefined;
|
||||
this._zoomLocalScale = undefined;
|
||||
@ -282,7 +268,6 @@ WindowClone.prototype = {
|
||||
this._zoomGlobalScale = undefined;
|
||||
this._zoomTargetPosition = undefined;
|
||||
this._zoomStep = undefined;
|
||||
this._zoomLightbox = undefined;
|
||||
},
|
||||
|
||||
_onButtonRelease : function (actor, event) {
|
||||
@ -298,14 +283,6 @@ WindowClone.prototype = {
|
||||
_onDragEnd : function (draggable, time, snapback) {
|
||||
this.inDrag = false;
|
||||
|
||||
// Most likely, the clone is going to move away from the
|
||||
// pointer now. But that won't cause a leave-event, so
|
||||
// do this by hand. Of course, if the window only snaps
|
||||
// back a short distance, this might be wrong, but it's
|
||||
// better to have the label mysteriously missing than
|
||||
// mysteriously present
|
||||
this._havePointer = false;
|
||||
|
||||
// We may not have a parent if DnD completed successfully, in
|
||||
// which case our clone will shortly be destroyed and replaced
|
||||
// with a new one on the target workspace.
|
||||
@ -352,7 +329,7 @@ DesktopClone.prototype = {
|
||||
Tweener.addTween(this._desktop,
|
||||
{ opacity: 255,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad" });
|
||||
transition: 'easeOutQuad' });
|
||||
}
|
||||
},
|
||||
|
||||
@ -366,7 +343,7 @@ DesktopClone.prototype = {
|
||||
Tweener.addTween(this._desktop,
|
||||
{ opacity: 0,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
function() {
|
||||
this._desktop.hide();
|
||||
@ -401,7 +378,7 @@ WindowOverlay.prototype = {
|
||||
this._windowClone = windowClone;
|
||||
this._parentActor = parentActor;
|
||||
|
||||
let title = new St.Label({ style_class: "window-caption",
|
||||
let title = new St.Label({ style_class: 'window-caption',
|
||||
text: metaWindow.title });
|
||||
title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||
title._spacing = 0;
|
||||
@ -411,7 +388,7 @@ WindowOverlay.prototype = {
|
||||
this.title.text = w.title;
|
||||
}));
|
||||
|
||||
let button = new St.Button({ style_class: "window-close" });
|
||||
let button = new St.Button({ style_class: 'window-close' });
|
||||
button._overlap = 0;
|
||||
|
||||
this._idleToggleCloseId = 0;
|
||||
@ -450,7 +427,7 @@ WindowOverlay.prototype = {
|
||||
},
|
||||
|
||||
show: function() {
|
||||
let [child, x, y, mask] = Gdk.Screen.get_default().get_root_window().get_pointer();
|
||||
let [x, y, mask] = global.get_pointer();
|
||||
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
|
||||
x, y);
|
||||
if (actor == this._windowClone.actor) {
|
||||
@ -465,8 +442,8 @@ WindowOverlay.prototype = {
|
||||
this._parentActor.raise_top();
|
||||
Tweener.addTween(this.title,
|
||||
{ opacity: 255,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad" });
|
||||
time: CLOSE_BUTTON_FADE_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
},
|
||||
|
||||
chromeWidth: function () {
|
||||
@ -560,7 +537,7 @@ WindowOverlay.prototype = {
|
||||
|
||||
_idleToggleCloseButton: function() {
|
||||
this._idleToggleCloseId = 0;
|
||||
let [child, x, y, mask] = Gdk.Screen.get_default().get_root_window().get_pointer();
|
||||
let [x, y, mask] = global.get_pointer();
|
||||
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
|
||||
x, y);
|
||||
if (actor != this._windowClone.actor && actor != this.closeButton) {
|
||||
@ -652,10 +629,11 @@ Workspace.prototype = {
|
||||
this._desktop.connect('selected',
|
||||
Lang.bind(this,
|
||||
function(clone, time) {
|
||||
// Only switch to the workspace when one window is open
|
||||
// We check for "2" here because the Desktop does not really count
|
||||
// as a window in this context.
|
||||
if (this._windows.length <= 2) {
|
||||
// Only switch to the workspace when there's no application windows
|
||||
// open (we always have one window for the desktop). The problem
|
||||
// is that it's too easy to miss an app window and get the wrong
|
||||
// one focused.
|
||||
if (this._windows.length == 1) {
|
||||
this.metaWorkspace.activate(time);
|
||||
Main.overview.hide();
|
||||
}
|
||||
@ -739,15 +717,17 @@ Workspace.prototype = {
|
||||
* This function also resets the highlighted window state.
|
||||
*/
|
||||
setLightboxMode: function (showLightbox) {
|
||||
if (showLightbox) {
|
||||
this._lightbox = new Lightbox.Lightbox(this.actor, false);
|
||||
} else {
|
||||
this._lightbox.destroy();
|
||||
this._lightbox = null;
|
||||
}
|
||||
if (this._frame) {
|
||||
if (!this._lightbox)
|
||||
this._lightbox = new Lightbox.Lightbox(this.actor,
|
||||
{ fadeTime: LIGHTBOX_FADE_TIME });
|
||||
|
||||
if (showLightbox)
|
||||
this._lightbox.show();
|
||||
else
|
||||
this._lightbox.hide();
|
||||
|
||||
if (this._frame)
|
||||
this._frame.set_opacity(showLightbox ? 150 : 255);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@ -757,6 +737,9 @@ Workspace.prototype = {
|
||||
* Draw the user's attention to the given window @metaWindow.
|
||||
*/
|
||||
setHighlightWindow: function (metaWindow) {
|
||||
if (!this._lightbox)
|
||||
return;
|
||||
|
||||
let actor;
|
||||
if (metaWindow != null) {
|
||||
let clone = this.lookupCloneForMetaWindow(metaWindow);
|
||||
@ -1049,8 +1032,13 @@ Workspace.prototype = {
|
||||
(desiredHeight - buttonOuterHeight - captionHeight) / rect.height,
|
||||
1.0 / this.scale);
|
||||
|
||||
x = xCenter - 0.5 * scale * rect.width;
|
||||
y = y + height - rect.height * scale - captionHeight;
|
||||
x = Math.floor(xCenter - 0.5 * scale * rect.width);
|
||||
|
||||
// We want to center the window in case we have just one
|
||||
if (metaWindow.get_workspace().n_windows == 1)
|
||||
y = Math.floor(yCenter * global.screen_height - 0.5 * scale * rect.height);
|
||||
else
|
||||
y = Math.floor(y + height - rect.height * scale - captionHeight);
|
||||
|
||||
return [x, y, scale];
|
||||
},
|
||||
@ -1126,7 +1114,7 @@ Workspace.prototype = {
|
||||
Tweener.addTween(clone.actor,
|
||||
{ opacity: 255,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeInQuad"
|
||||
transition: 'easeInQuad'
|
||||
});
|
||||
}
|
||||
|
||||
@ -1137,7 +1125,7 @@ Workspace.prototype = {
|
||||
scale_y: scale,
|
||||
workspace_relative: workspaceZooming ? this : null,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this._fadeInWindowOverlay(clone, overlay);
|
||||
})
|
||||
@ -1169,6 +1157,9 @@ Workspace.prototype = {
|
||||
},
|
||||
|
||||
_fadeInWindowOverlay: function(clone, overlay) {
|
||||
if (clone.inDrag)
|
||||
return;
|
||||
|
||||
// This is a little messy and complicated because when we
|
||||
// start the fade-in we may not have done the final positioning
|
||||
// of the workspaces. (Tweener doesn't necessarily finish
|
||||
@ -1209,8 +1200,10 @@ Workspace.prototype = {
|
||||
},
|
||||
|
||||
_delayedWindowRepositioning: function() {
|
||||
let [child, x, y, mask] =
|
||||
Gdk.Screen.get_default().get_root_window().get_pointer();
|
||||
if (this._windowIsZooming)
|
||||
return true;
|
||||
|
||||
let [x, y, mask] = global.get_pointer();
|
||||
let wsWidth = this.actor.width * this.scale;
|
||||
let wsHeight = this.actor.height * this.scale;
|
||||
|
||||
@ -1282,8 +1275,7 @@ Workspace.prototype = {
|
||||
}
|
||||
|
||||
// setup new handler
|
||||
let [child, x, y, mask] =
|
||||
Gdk.Screen.get_default().get_root_window().get_pointer();
|
||||
let [x, y, mask] = global.get_pointer();
|
||||
this._cursorX = x;
|
||||
this._cursorY = y;
|
||||
|
||||
@ -1387,7 +1379,7 @@ Workspace.prototype = {
|
||||
workspace_relative: this,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
opacity: 255,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
} else {
|
||||
// The window is hidden, make it shrink and fade it out
|
||||
@ -1397,7 +1389,7 @@ Workspace.prototype = {
|
||||
opacity: 0,
|
||||
workspace_relative: this,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1420,7 +1412,7 @@ Workspace.prototype = {
|
||||
scale_x: this.scale,
|
||||
scale_y: this.scale,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, this._fadeInAllOverlays)
|
||||
});
|
||||
},
|
||||
@ -1440,7 +1432,7 @@ Workspace.prototype = {
|
||||
scale_x: this.scale,
|
||||
scale_y: this.scale,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
this._visible = true;
|
||||
@ -1462,7 +1454,7 @@ Workspace.prototype = {
|
||||
scale_x: this.scale,
|
||||
scale_y: this.scale,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: onComplete
|
||||
});
|
||||
|
||||
@ -1533,6 +1525,14 @@ Workspace.prototype = {
|
||||
this.emit('window-drag-end', clone.actor);
|
||||
overlay.show();
|
||||
}));
|
||||
clone.connect('zoom-start',
|
||||
Lang.bind(this, function() {
|
||||
this._windowIsZooming = true;
|
||||
}));
|
||||
clone.connect('zoom-end',
|
||||
Lang.bind(this, function() {
|
||||
this._windowIsZooming = false;
|
||||
}));
|
||||
|
||||
this.actor.add_actor(clone.actor);
|
||||
|
||||
|
@ -5,10 +5,11 @@ 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 ANIMATION_TIME = 0.1;
|
||||
const DISPLAY_TIMEOUT = 600;
|
||||
|
||||
const LEFT = -1;
|
||||
@ -20,18 +21,25 @@ function WorkspaceSwitcherPopup() {
|
||||
|
||||
WorkspaceSwitcherPopup.prototype = {
|
||||
_init : function() {
|
||||
this.actor = new Clutter.Group({ reactive: true,
|
||||
this.actor = new St.Group({ reactive: true,
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: global.screen_width,
|
||||
height: global.screen_height });
|
||||
global.stage.add_actor(this.actor);
|
||||
height: global.screen_height,
|
||||
style_class: 'workspace-switcher-group' });
|
||||
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 = new St.BoxLayout({ style_class: 'workspace-switcher-container' });
|
||||
this._list = new Shell.GenericContainer({ style_class: 'workspace-switcher' });
|
||||
this._itemSpacing = 0;
|
||||
this._list.connect('style-changed', Lang.bind(this, function() {
|
||||
let [found, spacing] = this._list.get_theme_node().get_length('spacing', false);
|
||||
this._itemSpacing = (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._container.add(this._list);
|
||||
|
||||
this.actor.add_actor(this._container);
|
||||
@ -44,6 +52,57 @@ WorkspaceSwitcherPopup.prototype = {
|
||||
this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout));
|
||||
},
|
||||
|
||||
_getPreferredWidth : function (actor, forHeight, alloc) {
|
||||
let children = this._list.get_children();
|
||||
let primary = global.get_primary_monitor();
|
||||
|
||||
let availwidth = primary.width;
|
||||
availwidth -= this.actor.get_theme_node().get_horizontal_padding();
|
||||
availwidth -= this._container.get_theme_node().get_horizontal_padding();
|
||||
availwidth -= this._list.get_theme_node().get_horizontal_padding();
|
||||
|
||||
let width = 0;
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let [childMinWidth, childNaturalWidth] = children[i].get_preferred_width(-1);
|
||||
let [childMinHeight, childNaturalHeight] = children[i].get_preferred_height(childNaturalWidth);
|
||||
width += childNaturalHeight * primary.width / primary.height;
|
||||
}
|
||||
|
||||
let spacing = this._itemSpacing * (global.screen.n_workspaces - 1);
|
||||
width += spacing;
|
||||
width = Math.min(width, availwidth);
|
||||
|
||||
this._childWidth = (width - spacing) / global.screen.n_workspaces;
|
||||
|
||||
alloc.min_size = width;
|
||||
alloc.natural_size = width;
|
||||
},
|
||||
|
||||
_getPreferredHeight : function (actor, forWidth, alloc) {
|
||||
let primary = global.get_primary_monitor();
|
||||
this._childHeight = Math.round(this._childWidth * primary.height / primary.width);
|
||||
|
||||
alloc.min_size = this._childHeight;
|
||||
alloc.natural_size = this._childHeight;
|
||||
},
|
||||
|
||||
_allocate : function (actor, box, flags) {
|
||||
let children = this._list.get_children();
|
||||
let childBox = new Clutter.ActorBox();
|
||||
|
||||
let x = box.x1;
|
||||
let prevChildBoxX2 = box.x1 - this._itemSpacing;
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
childBox.x1 = prevChildBoxX2 + this._itemSpacing;
|
||||
childBox.x2 = Math.round(x + this._childWidth);
|
||||
childBox.y1 = box.y1;
|
||||
childBox.y2 = box.y1 + this._childHeight;
|
||||
x += this._childWidth + this._itemSpacing;
|
||||
prevChildBoxX2 = childBox.x2;
|
||||
children[i].allocate(childBox, flags);
|
||||
}
|
||||
},
|
||||
|
||||
_redraw : function(direction, activeWorkspaceIndex) {
|
||||
this._list.destroy_children();
|
||||
|
||||
@ -57,22 +116,21 @@ WorkspaceSwitcherPopup.prototype = {
|
||||
else
|
||||
indicator = new St.Bin({ style_class: 'ws-switcher-box' });
|
||||
|
||||
this._list.add(indicator);
|
||||
indicator.set_width(Math.round(indicator.get_height() * this._scaleWidth));
|
||||
this._list.add_actor(indicator);
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
_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);
|
||||
let primary = global.get_primary_monitor();
|
||||
this._container.x = primary.x + Math.floor((primary.width - this._container.width) / 2);
|
||||
this._container.y = primary.y + Math.floor((primary.height - this._container.height) / 2);
|
||||
},
|
||||
|
||||
_show : function() {
|
||||
Tweener.addTween(this._container, { opacity: 255,
|
||||
time: ANIMATION_TIME,
|
||||
transition: "easeOutQuad"
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
this._position();
|
||||
this.actor.show();
|
||||
@ -91,7 +149,7 @@ WorkspaceSwitcherPopup.prototype = {
|
||||
this._timeoutId = 0;
|
||||
Tweener.addTween(this._container, { opacity: 0.0,
|
||||
time: ANIMATION_TIME,
|
||||
transition: "easeOutQuad",
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() { this.actor.hide(); },
|
||||
onCompleteScope: this
|
||||
});
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -13,8 +13,10 @@ ga
|
||||
gl
|
||||
he
|
||||
hu
|
||||
id
|
||||
it
|
||||
ko
|
||||
lt
|
||||
nb
|
||||
nl
|
||||
pa
|
||||
@ -26,6 +28,10 @@ sl
|
||||
sr
|
||||
sr@latin
|
||||
sv
|
||||
th
|
||||
tr
|
||||
uk
|
||||
vi
|
||||
zh_CN
|
||||
zh_HK
|
||||
zh_TW
|
||||
|
@ -1,4 +1,7 @@
|
||||
data/gnome-shell.desktop.in.in
|
||||
data/gnome-shell-clock-preferences.desktop.in.in
|
||||
data/org.gnome.shell.gschema.xml.in
|
||||
[type: gettext/glade]data/clock-preferences.ui
|
||||
js/ui/appDisplay.js
|
||||
js/ui/appFavorites.js
|
||||
js/ui/dash.js
|
||||
@ -9,8 +12,8 @@ js/ui/panel.js
|
||||
js/ui/placeDisplay.js
|
||||
js/ui/runDialog.js
|
||||
js/ui/statusMenu.js
|
||||
js/ui/widget.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
|
||||
|
243
po/ar.po
243
po/ar.po
@ -6,8 +6,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: HEAD\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-17 11:29+0200\n"
|
||||
"PO-Revision-Date: 2010-01-17 11:29+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.5.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,97 +26,237 @@ msgstr "صدفة جنوم"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "إدارة النوافذ وإطلاق التطبيقات"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "الساعة"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "طوّع ساعة اللوحة"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:865
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "التطبيقات"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "التفضيلات"
|
||||
|
||||
#: ../js/ui/appDisplay.js:644
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "نافذة جديدة"
|
||||
|
||||
#: ../js/ui/appDisplay.js:648
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "أزِل من المفضّلة"
|
||||
|
||||
#: ../js/ui/appDisplay.js:649
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "أضِف إلى المفضّلة"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1001
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "اسحب إلى هنا ليضاف إلى المفضّلة"
|
||||
|
||||
#: ../js/ui/dash.js:240
|
||||
msgid "Find..."
|
||||
msgstr "ابحث..."
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "أضيف %s إلى مفضلتك."
|
||||
|
||||
#: ../js/ui/dash.js:493
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "أزيل %s من مفضّلتك."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "ابحث"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "يبحث..."
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../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:885 ../js/ui/placeDisplay.js:519
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "الأماكن والأجهزة"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:892
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "العناصر الحديثة"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:354
|
||||
msgid "No extensions installed"
|
||||
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:336
|
||||
#: ../js/ui/panel.js:740
|
||||
msgid "Activities"
|
||||
msgstr "الأنشطة"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:549
|
||||
#. 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/placeDisplay.js:144
|
||||
#: ../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:245
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "من فضلك اكتب أمرا:"
|
||||
|
||||
#: ../js/ui/runDialog.js:361
|
||||
#: ../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:890
|
||||
#: ../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:894
|
||||
#: ../src/shell-global.c:983
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -127,7 +267,7 @@ msgstr[3] "منذ %d دقائق"
|
||||
msgstr[4] "منذ %d دقيقة"
|
||||
msgstr[5] "منذ %d دقيقة"
|
||||
|
||||
#: ../src/shell-global.c:899
|
||||
#: ../src/shell-global.c:988
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -138,7 +278,7 @@ msgstr[3] "منذ %d ساعات"
|
||||
msgstr[4] "منذ %d ساعة"
|
||||
msgstr[5] "منذ %d ساعة"
|
||||
|
||||
#: ../src/shell-global.c:904
|
||||
#: ../src/shell-global.c:993
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -149,7 +289,7 @@ msgstr[3] "منذ %d أيام"
|
||||
msgstr[4] "منذ %d يوما"
|
||||
msgstr[5] "منذ %d يوم"
|
||||
|
||||
#: ../src/shell-global.c:909
|
||||
#: ../src/shell-global.c:998
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -184,6 +324,15 @@ msgstr "ابحث"
|
||||
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 "متكرر"
|
||||
|
||||
@ -211,26 +360,8 @@ msgstr "%1$s: %2$s"
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "تعذّر الخروج: %s"
|
||||
|
||||
#~ msgid "Account Information..."
|
||||
#~ msgstr "معلومات الحساب..."
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "الشريط الجانبي"
|
||||
|
||||
#~ msgid "System Preferences..."
|
||||
#~ msgstr "تفضيلات النظام..."
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "أوصد الشاشة"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "بدّل المستخدم"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "اخرج..."
|
||||
|
||||
#~ msgid "Shut Down..."
|
||||
#~ msgstr "أطفئ..."
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "استعرض"
|
||||
|
432
po/cs.po
432
po/cs.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-03-20 03:11+0100\n"
|
||||
"PO-Revision-Date: 2010-03-20 03:11+0100\n"
|
||||
"POT-Creation-Date: 2010-07-11 21:54+0200\n"
|
||||
"PO-Revision-Date: 2010-07-11 21:51+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,195 +25,461 @@ msgstr "Prostředí GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Správa oken a spouštění aplikací"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Hodiny"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Přizpůsobit hodiny na panelu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
"Poskytuje přístup k vnitřním ladicím a monitorovacím nástrojům pomocí okna "
|
||||
"ovládaného přes Alt-F2."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "Vlastní formát hodin"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr "Povolit přes Alt-F2 vnitřní nástroje určené pro vývojáře a testery"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Přípona souboru s nahrávkou dění na obrazovce"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Frekvence snímků při nahrávání dění na obrazovce."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr ""
|
||||
"Rozšíření GNOME Shell mají vlastnost uuid; tento klíč uvádí rozšíření, která "
|
||||
"by neměla být načítána."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Historie příkazového dialogového okna (Alt-F2)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "Formát hodin"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr ""
|
||||
"Je-li \"true\" a formát je buď \"12-hour\" nebo \"24-hour\", zobrazovat v "
|
||||
"hodinách kromě času i datum."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr ""
|
||||
"Je-li \"true\" a formát je buď \"12-hour\" nebo \"24-hour\", zobrazovat čas "
|
||||
"včetně sekund."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Je-li \"true\", zobrazovat v kalendáři čísla týdnů dle ISO."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "Seznam ID souboru desktop oblíbených aplikací"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "Režim přehledu pracovních ploch"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Nastavuje rouru systému GStreamer určenou ke kódování nahrávek. Respektuje "
|
||||
"syntax gst-launch. Roura by měla mít nepřipojený cíl, ve kterém se video "
|
||||
"nahrává. Obvykle má nepřipojený zdroj; výstup z takového zdroje bude "
|
||||
"zapisován do výstupního souboru. Roura je ale schopna zabezpečit i vlastní "
|
||||
"výstup, což lze využít při odeslání výstupu na server icecast přes "
|
||||
"shout2send apod. Není-li nastaveno nebo je-li nastaveno na prázdnou hodnotu, "
|
||||
"bude použita výchozí roura. Aktuálně to je 'videorate ! theoraenc ! oggmux' "
|
||||
"s nahráváním do Ogg Theora."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "Zobrazovat v hodinách datum"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Zobrazovat v kalendáři čísla týdnů"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "Zobrazovat čas včetně sekund"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr ""
|
||||
"Aplikace odpovídající těmto identifikátorům budou zobrazeny oblasti "
|
||||
"oblíbených."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Název souboru nahraných dění na obrazovce se bude sestávat z jedinečného "
|
||||
"názvu vycházejícího z aktuálního data a bude používat tuto příponu. Při "
|
||||
"nahrávání do jiného formátu kontejneru by měla být provedena úprava pravidel."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
"Frekvence snímků za sekundu výsledné nahrávky dění na obrazovce, která byla "
|
||||
"nahrána záznamovým programem GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Roura systému gstreamer určená ke kódování nahrávky dění na obrazovce"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"Vybraný režim zobrazení pracovních ploch v přehledu. Podporované hodnoty "
|
||||
"jsou \"single\" a \"grid\"."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"Program GNOME Shell obvykle sleduje aktivní aplikace, aby mohl nabídnout ty "
|
||||
"nejpoužívanější (např. ve spouštěčích). Data budou uchovávána v soukromí, "
|
||||
"přesto ale můžete z důvodu ochrany soukromí tuto funkci zakázat. Vezměte "
|
||||
"prosím v potaz skutečnost, že zakázaní funkce neodstraní již uložená data."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Tento klíč určuje formát používaný hodinami na panelu, když je klíč format "
|
||||
"nastaven na \"custom\". K získání konkrétního formátu můžete použít "
|
||||
"specifikátory převodu, kterým rozumí strftime(). Více informací viz manuál k "
|
||||
"strftime()."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Tento klíč určuje formát používaný hodinami na panelu. Možné hodnoty jsou "
|
||||
"\"12-hour\", \"24-hour\", \"unix\" a \"custom\". Je-li nastaven na \"unix\", "
|
||||
"hodiny budou zobrazovat čas v sekundách od počátku epochy, tj. 1970-01-01. "
|
||||
"Je-li nastaven na \"custom\", hodiny budou zobrazovat čas s ohledem na "
|
||||
"formát určený klíčem custom_format key. Je-li klíč nastaven buď na \"unix\" "
|
||||
"nebo \"custom\", budou ignorovány klíče show_date a show_seconds."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "Uuid rozšíření určených k vypnutí"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "Zda sbírat statistická data o používání aplikací"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Formát hodin"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Předvolby hodin"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Zobrazení panelu"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Zobrazit seku_ndy"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Zobrazit _datum"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "_12hodinový formát"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24hodinový formát"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:777
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLIKACE"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PŘEDVOLBY"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
#: ../js/ui/appDisplay.js:725
|
||||
msgid "New Window"
|
||||
msgstr "Nové okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Odstranit z oblíbených"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Přidat mezi oblíbené"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Oblíbené přidáte přetažením sem"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s byl přidán mezi oblíbené."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s byl odstraněn z oblíbených."
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "Najít"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../js/ui/dash.js:475
|
||||
msgid "Searching..."
|
||||
msgstr "Hledá se..."
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
#: ../js/ui/dash.js:489
|
||||
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:871 ../js/ui/placeDisplay.js:579
|
||||
#: ../js/ui/dash.js:796 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "MÍSTA A ZAŘÍZENÍ"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:803 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "NEDÁVNÉ POLOŽKY"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nejsou nainstalována žádná rozšíření"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "Povoleno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "Zakázáno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "Chyba"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "Neaktuální"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "Zobrazit zdroj"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "Webová stránka"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
#: ../js/ui/overview.js:165
|
||||
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:385
|
||||
msgid "Activities"
|
||||
msgstr "Činnosti"
|
||||
#: ../js/ui/panel.js:517
|
||||
msgid "Preferences"
|
||||
msgstr "Předvolby"
|
||||
|
||||
# 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
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:603
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%A, %e. %B, %R:%S"
|
||||
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#: ../js/ui/panel.js:604
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%A, %e. %B, %R"
|
||||
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:608
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%A, %R:%S"
|
||||
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#: ../js/ui/panel.js:609
|
||||
msgid "%a %R"
|
||||
msgstr "%A, %R"
|
||||
|
||||
# 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
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%A, %e. %B, %l:%M:%S %p"
|
||||
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#: ../js/ui/panel.js:617
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%A, %e. %B, %l:%M %p"
|
||||
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:621
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%A, %l:%M:%S %p"
|
||||
|
||||
# Not sure whether we've enough space for it, but anyway, looks more aesthetically with "%A".
|
||||
#: ../js/ui/panel.js:622
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%A, %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#. 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:760
|
||||
msgid "Activities"
|
||||
msgstr "Činnosti"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Nelze odpojit \"%s\""
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "Opakovat"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "Připojit se k..."
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Zadejte prosím příkaz:"
|
||||
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Vykonání \"%s\" selhalo:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "Přítomen"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "Zaneprázdněn"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "Neviditelný"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "Informace o účtu..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Postranní lišta"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "Předvolby systému..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "Uzamknout obrazovku"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "Přepnout uživatele"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "Odhlásit..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
msgid "Shut Down..."
|
||||
msgstr "Vypnout..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "Spouštění %s dokončeno"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Aplikace"
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "Připraveno \"%s\""
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Nedávné dokumenty"
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Novou pracovní plochu nelze přidat, jelikož byl dosažen maximální počet "
|
||||
"pracovních ploch."
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Nelze odstranit první pracovní plochu."
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Před méně než minutou"
|
||||
|
||||
#: ../src/shell-global.c:971
|
||||
#: ../src/shell-global.c:1043
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -221,7 +487,7 @@ msgstr[0] "Před %d minutou"
|
||||
msgstr[1] "Před %d minutami"
|
||||
msgstr[2] "Před %d minutami"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
#: ../src/shell-global.c:1048
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -229,7 +495,7 @@ msgstr[0] "Před %d hodinou"
|
||||
msgstr[1] "Před %d hodinami"
|
||||
msgstr[2] "Před %d hodinami"
|
||||
|
||||
#: ../src/shell-global.c:981
|
||||
#: ../src/shell-global.c:1053
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -237,7 +503,7 @@ msgstr[0] "Před %d dnem"
|
||||
msgstr[1] "Před %d dny"
|
||||
msgstr[2] "Před %d dny"
|
||||
|
||||
#: ../src/shell-global.c:986
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -268,39 +534,3 @@ msgstr "Hledat"
|
||||
#, 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"
|
||||
|
||||
#~ msgid "Manager"
|
||||
#~ msgstr "Správce"
|
||||
|
||||
#~ msgid "The user manager object this user is controlled by."
|
||||
#~ msgstr "Objekt správce uživatele, kterým je tento uživatel ovládán."
|
||||
|
208
po/de.po
208
po/de.po
@ -2,20 +2,22 @@
|
||||
# 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, 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: 2010-03-20 22:48+0000\n"
|
||||
"PO-Revision-Date: 2010-03-21 16:27+0100\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: German <gnome-de@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"
|
||||
@ -31,28 +33,66 @@ msgstr "GNOME-Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Fenster verwalten und Anwendungen starten"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Uhr"
|
||||
|
||||
#: ../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:311 ../js/ui/dash.js:852
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ANWENDUNGEN"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "EINSTELLUNGEN"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "Neues Fenster"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Aus Favoriten entfernen"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Zu Favoriten hinzufügen"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Hier ablegen, um zu Favoriten hinzuzufügen"
|
||||
|
||||
@ -66,153 +106,170 @@ msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s wurde aus Ihren Favoriten entfernt"
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Suchen"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Suche läuft …"
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
#: ../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:871 ../js/ui/placeDisplay.js:579
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "ORTE UND GERÄTE"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ZULETZT GEÖFFNETE DOKUMENTE"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
#: ../js/ui/lookingGlass.js:466
|
||||
msgid "No extensions installed"
|
||||
msgstr "Keine Erweiterungen installiert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
#: ../js/ui/lookingGlass.js:503
|
||||
msgid "Enabled"
|
||||
msgstr "Aktiviert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
#: ../js/ui/lookingGlass.js:505
|
||||
msgid "Disabled"
|
||||
msgstr "Deaktiviert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
#: ../js/ui/lookingGlass.js:507
|
||||
msgid "Error"
|
||||
msgstr "Fehler"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
#: ../js/ui/lookingGlass.js:509
|
||||
msgid "Out of date"
|
||||
msgstr "Veraltet"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
#: ../js/ui/lookingGlass.js:534
|
||||
msgid "View Source"
|
||||
msgstr "Quelle zeigen"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
#: ../js/ui/lookingGlass.js:540
|
||||
msgid "Web Page"
|
||||
msgstr "Webseite"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
#: ../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:385
|
||||
#: ../js/ui/panel.js:740
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitäten"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
#. 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 used for AM/PM.
|
||||
#: ../js/ui/panel.js:619
|
||||
#. 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/placeDisplay.js:103
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "»%s« konnte nicht ausgehängt werden"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Erneut versuchen"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Verbinden mit …"
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Bitte geben Sie einen Befehl ein:"
|
||||
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Ausführung von »%s« ist gescheitert:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Verfügbar"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Beschäftigt"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Unsichtbar"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Benutzerinformationen …"
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Seitenleiste"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Systemeinstellungen …"
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bildschirm sperren"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Benutzer wechseln"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Abmelden …"
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "Ausschalten …"
|
||||
|
||||
#. 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 "Anwendungen"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Zuletzt geöffnete Dokumente"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
@ -223,32 +280,43 @@ msgstr "Start von %s ist abgeschlossen"
|
||||
msgid "'%s' is ready"
|
||||
msgstr "»%s« ist bereit"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
#: ../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:971
|
||||
#: ../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:976
|
||||
#: ../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:981
|
||||
#: ../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:986
|
||||
#: ../src/shell-global.c:995
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -279,6 +347,18 @@ msgstr "Suchen"
|
||||
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"
|
||||
|
||||
|
312
po/el.po
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"
|
||||
|
||||
|
387
po/es.po
387
po/es.po
@ -2,13 +2,14 @@
|
||||
# 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.
|
||||
#
|
||||
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: 2010-03-20 22:48+0000\n"
|
||||
"PO-Revision-Date: 2010-03-21 16:48+0100\n"
|
||||
"POT-Creation-Date: 2010-07-02 06:59+0000\n"
|
||||
"PO-Revision-Date: 2010-07-03 12:50+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"
|
||||
@ -24,188 +25,413 @@ 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/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
"Permitir acceder a las herramientas internas de depuración monitorización "
|
||||
"usando el diálogo Alt+F2"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "Formato personalizado del reloj"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr ""
|
||||
"Activar las herramientas internas, útiles para desarrolladores y probadores, "
|
||||
"desde Alt+F2"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Extensión de archivo que usar para almacenar los «screencast»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Tasa de fotogramas usada para grabar «screencast»."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr ""
|
||||
"Las extensiones de GNOME Shell tienen una propiedad uuid; esta clave lista "
|
||||
"las extensiones que no se deben cargar."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Histórico del diálogo de comandos (Alt+F2)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "Formato de la hora"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr ""
|
||||
"Si es cierta y el formato es «12-horas» o «24-horas», muestra la fecha en el "
|
||||
"reloj, además de la hora."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr ""
|
||||
"Si es cierta y el formato es «12-horas» o «24-horas», muestra los segundos en "
|
||||
"la hora."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Si es cierta muestra la fecha de semana ISO en el calendario."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "Lista de ID de archivos de escritorio para las aplicaciones favoritas"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "Modo de visualización de la vista previa del área de trabajo"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "Mostrar la fecha en el reloj"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Mostrar la fecha de la semana en el calendario"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "Mostrar la hora con segundos"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr ""
|
||||
"Las aplicaciones correspondientes con esos identificadores se mostrarán en "
|
||||
"el área de favoritos."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"El nombre de archivo para los «screencast» será un nombre de archivo único "
|
||||
"basado en la fecha actual y usará esta extensión. Se debería cambiar al "
|
||||
"grabar en otro formato contenedor diferente."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
"La tasa de fotogramas de la grabación resultante grabada por el grabador de "
|
||||
"«screencast» de GNOME Shell, en fotogramas por segundo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "La tubería de gstreamer usada para codificar el «screencast»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"El modo de vista del área de trabajo seleccionada en la vista general. Los "
|
||||
"valores soportados son «single» (sencillo) y «grid» (rejilla)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Esta clave especifica el formato usado por el reloj del panel cuando la "
|
||||
"clave del formato se establece a «custom» (personalizado). Puede usar "
|
||||
"especificadores de conversión que entienda strftime() para obtener un "
|
||||
"formato específico. Consulte el manual de strftime() para obtener más "
|
||||
"información."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "Uuid de las extensiones que desactivar"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr ""
|
||||
"Indica si se deben recolectar estadísticas acerca del uso de las aplicaciones"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
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 "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:311 ../js/ui/dash.js:852
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:777
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLICACIONES"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERENCIAS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
#: ../js/ui/appDisplay.js:725
|
||||
msgid "New Window"
|
||||
msgstr "Ventana nueva"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Quitar de los favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Añadir a los favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Arrastrar aquí para añadir a los favoritos"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "Se ha añadido %s a sus favoritos."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Se ha quitado %s de sus favoritos."
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "Buscar"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../js/ui/dash.js:475
|
||||
msgid "Searching..."
|
||||
msgstr "Buscando…"
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
#: ../js/ui/dash.js:489
|
||||
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:871 ../js/ui/placeDisplay.js:579
|
||||
#: ../js/ui/dash.js:796 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "LUGARES Y DISPOSITIVOS"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:803 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ELEMENTOS RECIENTES"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "No hay extensiones instaladas"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "Activado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "Desactivado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "Caducado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "Ver fuente"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "Página web"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
#: ../js/ui/overview.js:165
|
||||
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:385
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
msgstr "Preferencias"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e de %b, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:606
|
||||
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:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e de %b, %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:619
|
||||
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:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#. 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:762
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Falló al desmontar «%s»"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "Reintentar"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "Conectar a…"
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Introduzca un comando:"
|
||||
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Falló la ejecución de «%s»:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "Disponible"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "Ocupado"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "Invisible"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "Información de la cuenta…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Barra lateral"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferencias del sistema…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bloquear la pantalla"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "Cambiar de usuario"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "Salir…"
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
msgid "Shut Down..."
|
||||
msgstr "Apagar…"
|
||||
|
||||
#. 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 "Aplicaciones"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documentos recientes"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
@ -216,32 +442,43 @@ msgstr "%s finalizó su lanzamiento"
|
||||
msgid "'%s' is ready"
|
||||
msgstr "«%s» está preparado"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
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:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "No se puede quitar el primer área de trabajo."
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Hace menos de un minuto"
|
||||
|
||||
#: ../src/shell-global.c:971
|
||||
#: ../src/shell-global.c:1043
|
||||
#, 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:976
|
||||
#: ../src/shell-global.c:1048
|
||||
#, 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:981
|
||||
#: ../src/shell-global.c:1053
|
||||
#, 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:986
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -272,6 +509,22 @@ msgstr "Buscar"
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~| msgid "Quit"
|
||||
#~ msgid "Quit %s"
|
||||
#~ msgstr "Salir de %s"
|
||||
|
||||
#~ 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"
|
||||
|
||||
|
203
po/fr.po
203
po/fr.po
@ -11,7 +11,7 @@ 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: 2010-03-08 23:07+0000\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"
|
||||
@ -28,28 +28,64 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Gestion des fenêtres et lancement des applications"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Horloge"
|
||||
|
||||
#: ../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:311 ../js/ui/dash.js:886
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APPLICATIONS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PRÉFÉRENCES"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
#: ../js/ui/appDisplay.js:705
|
||||
msgid "New Window"
|
||||
msgstr "Nouvelle fenêtre"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
#: ../js/ui/appDisplay.js:709
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Enlever des favoris"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Ajouter aux favoris"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Glisser ici pour ajouter aux favoris"
|
||||
|
||||
@ -63,170 +99,217 @@ msgstr "%s a été ajouté à vos favoris."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s a été supprimé de vos favoris."
|
||||
|
||||
#: ../js/ui/dash.js:235
|
||||
msgid "Find..."
|
||||
msgstr "Rechercher..."
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Rechercher"
|
||||
|
||||
#: ../js/ui/dash.js:511
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Recherche en cours..."
|
||||
|
||||
#: ../js/ui/dash.js:525
|
||||
#: ../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:905 ../js/ui/placeDisplay.js:529
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "RACCOURCIS et PÉRIPHÉRIQUES"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:912 ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ÉLÉMENTS RÉCENTS"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
#: ../js/ui/lookingGlass.js:354
|
||||
msgid "No extensions installed"
|
||||
msgstr "Aucune extension installée"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
#: ../js/ui/lookingGlass.js:391
|
||||
msgid "Enabled"
|
||||
msgstr "Activé"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
#: ../js/ui/lookingGlass.js:393
|
||||
msgid "Disabled"
|
||||
msgstr "Désactivé"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
#: ../js/ui/lookingGlass.js:395
|
||||
msgid "Error"
|
||||
msgstr "Erreur"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
#: ../js/ui/lookingGlass.js:397
|
||||
msgid "Out of date"
|
||||
msgstr "Périmé"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
#: ../js/ui/lookingGlass.js:422
|
||||
msgid "View Source"
|
||||
msgstr "Afficher la source"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
#: ../js/ui/lookingGlass.js:428
|
||||
msgid "Web Page"
|
||||
msgstr "Page Web"
|
||||
|
||||
#: ../js/ui/overview.js:92
|
||||
#: ../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:399
|
||||
#: ../js/ui/panel.js:740
|
||||
msgid "Activities"
|
||||
msgstr "Activités"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:630
|
||||
#. 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 used for AM/PM.
|
||||
#: ../js/ui/panel.js:633
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %H:%M"
|
||||
#. 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/placeDisplay.js:144
|
||||
#: ../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:221
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Veuillez saisir une commande :"
|
||||
|
||||
#: ../js/ui/runDialog.js:344
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Exécution de « %s » impossible :"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Disponible"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Occupé"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Invisible"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Informations personnelles..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Barre latérale"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Préférences du système..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Verrouiller l'écran"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Changer d'utilisateur"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Fermer la session..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "Éteindre..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "Lancement de %s terminé"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Applications"
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "« %s » est prêt"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documents récents"
|
||||
#: ../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."
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
#: ../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:971
|
||||
#: ../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:976
|
||||
#: ../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:981
|
||||
#: ../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:986
|
||||
#: ../src/shell-global.c:998
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
|
504
po/gl.po
504
po/gl.po
@ -1,22 +1,23 @@
|
||||
# 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-07-08 00:09+0200\n"
|
||||
"PO-Revision-Date: 2010-07-07 23:23+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"
|
||||
"Language: gl\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
"X-Generator: Virtaal 0.4.0\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
@ -25,116 +26,476 @@ 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"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Reloxo"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Personalizar o reloxo do panel"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
"Permite o acceso ás ferramentas de depuración e monitorización internas "
|
||||
"usando o diálogo Alt-F2"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "Formato personalizado o reloxo do panel"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr ""
|
||||
"Activar as ferramentas internas útiles para os desenvolvedores e probadores "
|
||||
"usando Alt-F2"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Extensión de ficheiro usada para o almacenamento da screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Taxa de marcos usada para gravar as capturas de pantalla"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr ""
|
||||
"As extensións do GNOME Shell teñen unha propiedade uuid. Esta chave lista as "
|
||||
"extensións que non deberían cargarse."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Hitorial do diálogo de orde (Alt-F)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "Formato da hora"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr ""
|
||||
"Se é verdadeiro e o formato é \"12-hour\" ou \"24-hour\" móstrase a data no "
|
||||
"reloxo, ademais da hora."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr ""
|
||||
"Se é verdadeiro e o formato é \"12-hour\" ou \"24-hour\" móstranse os "
|
||||
"segundos na hora."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Se é verdadeiro, móstrase a data da semana ISO no calendario."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "Mostra os ID de ficheiros desktop para os aplicativos preferidos"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "Modo de visualización do espazo de traballo de vista previa"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Estabelece a tubería do GStreamer usada para codificar as gravacións. Segue "
|
||||
"a sintaxe usada por gst-launch. A tubería debería ter un desprazamento de "
|
||||
"sumideiro non conectado cando o vídeo gravado estea gravado. Normalmente "
|
||||
"terá un ......."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "Mostrar a data no reloxo"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Mostrar a data da semana no calendario"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "Mostrar a hora con segundos"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr ""
|
||||
"Os aplicativos que corresponden a estes identificadores mostraranse na área "
|
||||
"de preferidos."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"O nome do ficheiro para os screencasts será un nome de ficheiro único "
|
||||
"baseado na data actual e usa esta extensión. Debería cambiar ao grabar nun "
|
||||
"formato de contedor diferente."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
"A taxa de marcos do screencast resultante grabado polo grabador de "
|
||||
"screencasts de GNOME Shell en marcos-por-segundo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "A tubería de gstreamer usada para codificar o screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"O modo de visualización do espazo de traballo seleccionado na vista previa. "
|
||||
"Os valores admitidos son \"single\" e \"grid\"."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"O shell normalmente monitoriza os aplicativos activos para mostrarlle os "
|
||||
"máis usados (p.ex. nos iniciadores). Aínda que estes datos mantéñense "
|
||||
"privados, vostede pode desactivar isto por motivos de privacidade. Teña en "
|
||||
"conta que facendo isto non eliminará os datos gardados."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Esta chave especifica o formato usado polo reloxo do panel cando a chave de "
|
||||
"formato está estabelecida a \"custom\". Vostede pode usar os especificadores "
|
||||
"de conversión que entende strftime() para obter un formato de hora "
|
||||
"especificado. Vexa o manual de strftime() para obter máis información."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Esta chave especifica o formato de hora usado polo reloxo do panel. Os "
|
||||
"posíbeis valores son \"12-hour\", \"24-hour\", \"unix\"e \"custom\". Se está "
|
||||
"estabelecido a \"unix\", o reloxo mostrará a hora en segundos desde Epoch, p."
|
||||
"ex. 01-01-1970. Se está estabelecido a \"custom\", o reloxo mostrará a hora "
|
||||
"segundo o formato especificado na chave custom_format. Teña en conta que se "
|
||||
"está estabelecido a \"unix\" ou \"custom\", as chaves show_date e "
|
||||
"show_seconds ignoraranse."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "Os Uuid das extensións a desactivar"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "Indica se recoller estatísticas sobre o uso dos aplicativos ou non."
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Formato do reloxo"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Preferencias do reloxo"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Panel de visualización"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Mostrar os segu_ndos"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Mostrar a _data"
|
||||
|
||||
#: ../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:858
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:777
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLICATIVOS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERENCIAS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:707 ../js/ui/appIcon.js:425
|
||||
#: ../js/ui/appDisplay.js:725
|
||||
msgid "New Window"
|
||||
msgstr "Xanela nova"
|
||||
|
||||
#: ../js/ui/appDisplay.js:711 ../js/ui/appIcon.js:429
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
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:730
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Engadir a Favoritos"
|
||||
msgstr "Engadir aos favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1064
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
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:88
|
||||
#, 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:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s foi eliminado dos seus favoritos."
|
||||
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "Buscar"
|
||||
|
||||
#: ../js/ui/dash.js:475
|
||||
msgid "Searching..."
|
||||
msgstr "Buscando..."
|
||||
|
||||
#: ../js/ui/dash.js:489
|
||||
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:796 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "LUGARES e DISPOSITIVOS"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:885
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "DOCUMENTOS RECENTES"
|
||||
#: ../js/ui/dash.js:803 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ELEMENTOS RECENTES"
|
||||
|
||||
#. 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
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "Non hai ningunha extensión instalada"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:440
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "Activado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "Desactivado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "Erro"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "Desactualizado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "Ver fonte"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "Páxina web"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "Desfacer"
|
||||
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
msgstr "Preferencias"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e de %b, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:606
|
||||
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:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e de %b, %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:619
|
||||
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:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
#. 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:762
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Produciuse un fallo ao montar '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "Reintentar"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "Conectar con..."
|
||||
|
||||
#: ../js/ui/runDialog.js:235
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Insira unha orde:"
|
||||
|
||||
#: ../js/ui/runDialog.js:351
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, 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:91
|
||||
msgid "Available"
|
||||
msgstr "Dispoñíbel"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Aplicativos"
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "Ocupado"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documentos recentes"
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "Invisíbel"
|
||||
|
||||
#: ../src/shell-global.c:890
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "Información da conta..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferencias do sistema..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "Bloquear pantalla"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "Cambiar de usuario"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "Saír da sesión..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
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"
|
||||
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Non é posíbel engadir unha área de traballo nova porque chegouse ao límite "
|
||||
"de áreas de traballo."
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Non é posíbel quitar a primeira área de traballo."
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Hai menos dun minuto"
|
||||
|
||||
#: ../src/shell-global.c:893
|
||||
#: ../src/shell-global.c:1043
|
||||
#, 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:1048
|
||||
#, 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:1053
|
||||
#, 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:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -165,6 +526,24 @@ msgstr "Buscar"
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Quit %s"
|
||||
#~ msgstr "Saír de %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 +561,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"
|
||||
|
||||
|
557
po/he.po
557
po/he.po
@ -6,11 +6,10 @@
|
||||
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-11-13 17:44+0000\n"
|
||||
"PO-Revision-Date: 2009-11-28 17:33+0200\n"
|
||||
"Last-Translator: Liel Fridman <lielft@gmail.com>\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-06-19 17:59+0300\n"
|
||||
"PO-Revision-Date: 2010-06-19 18:01+0200\n"
|
||||
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
|
||||
"Language-Team: Hebrew <he@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -25,182 +24,489 @@ msgstr "מעטפת GNOME"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "ניהול חלונות והרצת יישומים"
|
||||
|
||||
#: ../js/ui/appDisplay.js:696
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "יש לגרור פריטים לכאן כדי להוסיף מועדפים"
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "שעון"
|
||||
|
||||
#: ../js/ui/appIcon.js:425
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "התאמת פאנל השעון"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "Custom format of the clock"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "File extension used for storing the screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Framerate used for recording screencasts."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "History for command (Alt-F2) dialog"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "Hour format"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "If true, display the ISO week date in the calendar."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "List of desktop file IDs for favorite applications"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "Overview workspace view mode"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "Show date in clock"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Show the week date in the calendar"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "Show time with seconds"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "The gstreamer pipeline used to encode the screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "Uuids of extensions to disable"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "Whether to collect stats about applications usage"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "מבנה השעון"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
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 "הצגת ש_ניות"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "הצגת ה_תאריך"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "מבנה _12 שעות"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "מבנה _24 שעות"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:767
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "יישומים"
|
||||
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "העדפות"
|
||||
|
||||
#: ../js/ui/appDisplay.js:726
|
||||
msgid "New Window"
|
||||
msgstr "חלון חדש"
|
||||
|
||||
#: ../js/ui/appIcon.js:429
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "הסר מהמועדפים"
|
||||
|
||||
#: ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:731
|
||||
msgid "Add to Favorites"
|
||||
msgstr "הוסף למועדפים"
|
||||
|
||||
#: ../js/ui/dash.js:237
|
||||
msgid "Find..."
|
||||
msgstr "חפש..."
|
||||
#: ../js/ui/appDisplay.js:1038
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "יש לגרור פריטים לכאן כדי להוסיף מועדפים"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:656 ../js/ui/dash.js:718
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "יישומים"
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s נוסף למועדפים שלך"
|
||||
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s הוסר מהמועדפים שלך."
|
||||
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "חיפוש"
|
||||
|
||||
#: ../js/ui/dash.js:465
|
||||
msgid "Searching..."
|
||||
msgstr "בחיפוש..."
|
||||
|
||||
#: ../js/ui/dash.js:479
|
||||
msgid "No matching results."
|
||||
msgstr "אין תוצאות תואמות."
|
||||
|
||||
#. **** 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 "מקומות"
|
||||
#: ../js/ui/dash.js:786 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "מקומות והתקנים"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:683 ../js/ui/dash.js:728
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "מסמכים אחרונים"
|
||||
#: ../js/ui/dash.js:793 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "פריטים אחרונים"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:708 ../js/ui/dash.js:898
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "תוצאות חיפוש"
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "לא מותקנות הרחבות"
|
||||
|
||||
#: ../js/ui/dash.js:723
|
||||
msgid "PREFERENCES"
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "פעיל"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "מנוטרל"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "שגיאה"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "לא בתוקף"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "צפייה במקור"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "דף אינטרנט"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "ביטול"
|
||||
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Activities"
|
||||
msgstr "פעילויות"
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %b %e, %R:%S"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:491
|
||||
#: ../js/ui/panel.js:606
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %b %e, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %b %e, %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %b %e, %l:%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:84
|
||||
#. 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:726
|
||||
msgid "Activities"
|
||||
msgstr "פעילויות"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "ארע כשל בניתוק '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "ניסיון חוזר"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "התחבר אל..."
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "נא להזין פקודה:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "ההרצה של '%s' נכשלה:"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "זמין"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "יישומים"
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "עסוק"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "מסמכים אחרונים"
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "בלתי נראה"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "מידע על המשתמש..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "העדפות מערכת..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "נעילת המסך"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "החלף משתמש"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "ניתוק..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
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:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "לא ניתן להוסיף מרחבי עבודה כיוון שהם ממלאים את המכסה המרבית."
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "לא ניתן להסיר את מרחב העבודה הראשון."
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "לפני פחות מדקה"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:1043
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "לפני דקה"
|
||||
msgstr[1] "לפני %d דקות"
|
||||
|
||||
#: ../src/shell-global.c:827
|
||||
#: ../src/shell-global.c:1048
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "לפני שעה"
|
||||
msgstr[1] "לפני %d שעות"
|
||||
|
||||
#: ../src/shell-global.c:830
|
||||
#: ../src/shell-global.c:1053
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "לפני יום"
|
||||
msgstr[1] "לפני %d ימים"
|
||||
|
||||
#: ../src/shell-global.c:833
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "לפני שבוע"
|
||||
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 "חפש"
|
||||
|
||||
@ -209,7 +515,40 @@ 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 "Quit %s"
|
||||
#~ msgstr "יציאה מ־%s"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "מקומות"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "תוצאות חיפוש"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "יישומים"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ 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 "סרגל צד"
|
||||
|
87
po/hu.po
87
po/hu.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-02-16 10:04+0100\n"
|
||||
"PO-Revision-Date: 2010-02-16 10:10+0100\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"
|
||||
@ -26,27 +26,27 @@ msgid "Window management and application launching"
|
||||
msgstr "Ablakkezelés és alkalmazásindítás"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:880
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ALKALMAZÁSOK"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "BEÁLLÍTÁSOK"
|
||||
|
||||
#: ../js/ui/appDisplay.js:649
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
msgid "New Window"
|
||||
msgstr "Új ablak"
|
||||
|
||||
#: ../js/ui/appDisplay.js:653
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Eltávolítás a Kedvencek közül"
|
||||
|
||||
#: ../js/ui/appDisplay.js:654
|
||||
#: ../js/ui/appDisplay.js:734
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Hozzáadás a Kedvencekhez"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1006
|
||||
#: ../js/ui/appDisplay.js:1086
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Ide húzással kedvenceket vehet fel"
|
||||
|
||||
@ -60,87 +60,96 @@ msgstr "%s felvéve a Kedvencek közé."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s eltávolítva a Kedvencek közül"
|
||||
|
||||
#: ../js/ui/dash.js:241
|
||||
msgid "Find..."
|
||||
msgstr "Keresés…"
|
||||
#: ../js/ui/dash.js:194
|
||||
msgid "Find"
|
||||
msgstr "Keresés"
|
||||
|
||||
#: ../js/ui/dash.js:508
|
||||
#: ../js/ui/dash.js:507
|
||||
msgid "Searching..."
|
||||
msgstr "Keresés…"
|
||||
|
||||
#: ../js/ui/dash.js:522
|
||||
#: ../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:900 ../js/ui/placeDisplay.js:529
|
||||
#: ../js/ui/dash.js:871 ../js/ui/placeDisplay.js:580
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "HELYEK ÉS ESZKÖZÖK"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:907 ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "LEGUTÓBBI ELEMEK"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:356
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nincsenek kiterjesztések telepítve"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:393
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Engedélyezve"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:395
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Tiltva"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:397
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Hiba"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:399
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Elavult"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:424
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Forrás megtekintése"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:430
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Weblap"
|
||||
|
||||
#: ../js/ui/overview.js:92
|
||||
#: ../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:336
|
||||
#: ../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:560
|
||||
#: ../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:563
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %p %l.%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
#: ../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:245
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Adjon meg egy parancsot:"
|
||||
|
||||
#: ../js/ui/runDialog.js:361
|
||||
#: ../js/ui/runDialog.js:376
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "„%s” végrehajtása meghiúsult:"
|
||||
@ -198,32 +207,42 @@ msgstr "Alkalmazások"
|
||||
msgid "Recent Documents"
|
||||
msgstr "Legutóbbi dokumentumok"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
#: ../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:980
|
||||
#: ../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:985
|
||||
#: ../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:990
|
||||
#: ../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:995
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
|
333
po/id.po
Normal file
333
po/id.po
Normal file
@ -0,0 +1,333 @@
|
||||
# Indonesian translation of gnome-shell
|
||||
# Copyright (C) 2010 THE gnome-shell'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Andika Triwidada <andika@gmail.com>, 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: 2010-05-30 20:55+0000\n"
|
||||
"PO-Revision-Date: 2010-05-31 19:43+0700\n"
|
||||
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
||||
"Language-Team: GNOME Indonesian Translation Team <gnome@i15n.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Poedit-Language: Indonesian\n"
|
||||
"X-Poedit-Country: Indonesia\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "Shell GNOME"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Manajemen jendela dan peluncuran aplikasi"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Jam"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Gubah panel jam"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Format Jam"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Preferensi Jam"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Tampilan Panel"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Tampilka_n detik"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Tampilkan tan_ggal"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "Format _12 jam"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "Format _24 jam"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:858
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLIKASI"
|
||||
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERENSI"
|
||||
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "New Window"
|
||||
msgstr "Jendela Baru"
|
||||
|
||||
#: ../js/ui/appDisplay.js:714
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Hapus dari Favorit"
|
||||
|
||||
#: ../js/ui/appDisplay.js:715
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Tambah ke Favorit"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1042
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Seret ke sini untuk menambah favorit"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s telah ditambahkan ke favorit Anda."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s telah dihapus dari favorit Anda."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Temukan"
|
||||
|
||||
#: ../js/ui/dash.js:513
|
||||
msgid "Searching..."
|
||||
msgstr "Mencari..."
|
||||
|
||||
#: ../js/ui/dash.js:527
|
||||
msgid "No matching results."
|
||||
msgstr "Tak ada yang cocok."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:877 ../js/ui/placeDisplay.js:551
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "LOKASI & PERANGKAT"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:884 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "DOKUMEN TERKINI"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:470
|
||||
msgid "No extensions installed"
|
||||
msgstr "Tak ada ekstensi terpasang"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:507
|
||||
msgid "Enabled"
|
||||
msgstr "Diaktifkan"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:509
|
||||
msgid "Disabled"
|
||||
msgstr "Dinonaktifkan"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:511
|
||||
msgid "Error"
|
||||
msgstr "Galat"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:513
|
||||
msgid "Out of date"
|
||||
msgstr "Kadaluarsa"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:538
|
||||
msgid "View Source"
|
||||
msgstr "Tilik Sumber"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:544
|
||||
msgid "Web Page"
|
||||
msgstr "Halaman Web"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "Batal"
|
||||
|
||||
#. 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:903
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitas"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:1118
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e %b, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1119
|
||||
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:1123
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1124
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1131
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %k:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1132
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %e %b, %k:%M"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1136
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %k:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1137
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %k:%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Gagal melepas kait '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Coba lagi"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Sambung ke..."
|
||||
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Silakan masukkan suatu perintah:"
|
||||
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Eksekusi '%s' gagal:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Ada"
|
||||
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Sibuk"
|
||||
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Tak nampak"
|
||||
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Informasi Akun..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferensi Sistem..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Kunci Layar"
|
||||
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Ganti Pengguna"
|
||||
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Keluar..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "Shut Down..."
|
||||
msgstr "Matikan..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s telah selesai diawali"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "'%s' telah siap"
|
||||
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Tak bisa menambah ruang kerja baru karena batas ruang kerja maksimum telah "
|
||||
"tercapai."
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Tak bisa menghapus ruang kerja pertama."
|
||||
|
||||
#: ../src/shell-global.c:1027
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Kurang dari semenit yang lalu"
|
||||
|
||||
#: ../src/shell-global.c:1031
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d menit yang lalu"
|
||||
|
||||
#: ../src/shell-global.c:1036
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d jam yang lalu "
|
||||
|
||||
#: ../src/shell-global.c:1041
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d hari yang lalu"
|
||||
|
||||
#: ../src/shell-global.c:1046
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d minggu yang lalu"
|
||||
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Folder Rumah"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Sistem Berkas"
|
||||
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Cari"
|
||||
|
||||
#. 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"
|
300
po/it.po
300
po/it.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-02-10 22:30+0100\n"
|
||||
"PO-Revision-Date: 2010-02-10 22:31+0100\n"
|
||||
"POT-Creation-Date: 2010-06-06 14:37+0200\n"
|
||||
"PO-Revision-Date: 2010-06-06 14:47+0200\n"
|
||||
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
|
||||
"Language-Team: Italian <tp@lists.linux.it>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -24,119 +24,290 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Gestione finestre e avvio applicazioni"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Orologio\t"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Personalizza l'orologio sul pannello"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Formato ora"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Preferenze di Orologio"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Visualizzazione sul pannello"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Mostrare i _secondi"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Mostrare la _data"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "Formato _12 ore"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "Formato _24 ore"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:880
|
||||
#: ../js/ui/appDisplay.js:366 ../js/ui/dash.js:858
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "Applicazioni"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:398
|
||||
msgid "PREFERENCES"
|
||||
msgstr "Preferenze"
|
||||
|
||||
#: ../js/ui/appDisplay.js:649
|
||||
#: ../js/ui/appDisplay.js:770
|
||||
msgid "New Window"
|
||||
msgstr "Nuova finestra"
|
||||
|
||||
#: ../js/ui/appDisplay.js:653
|
||||
#: ../js/ui/appDisplay.js:774
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Rimuovi dai preferiti"
|
||||
|
||||
#: ../js/ui/appDisplay.js:654
|
||||
#: ../js/ui/appDisplay.js:775
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Aggiungi ai preferiti"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1006
|
||||
#: ../js/ui/appDisplay.js:1102
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Trascinare qui per aggiungere ai preferiti"
|
||||
|
||||
#: ../js/ui/dash.js:241
|
||||
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:508
|
||||
#: ../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:513
|
||||
msgid "Searching..."
|
||||
msgstr "Ricerca..."
|
||||
|
||||
#: ../js/ui/dash.js:522
|
||||
#: ../js/ui/dash.js:527
|
||||
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:900 ../js/ui/placeDisplay.js:529
|
||||
#: ../js/ui/dash.js:877 ../js/ui/placeDisplay.js:551
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "Risorse e dispositivi"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:907
|
||||
#: ../js/ui/dash.js:884 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "Elementi recenti"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:475
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nessuna estensione installata"
|
||||
|
||||
# (ndt) o abilitata?
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Enabled"
|
||||
msgstr "Abilitato"
|
||||
|
||||
# (ndt) o disabilitata?
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Disabled"
|
||||
msgstr "Disabilitato"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:516
|
||||
msgid "Error"
|
||||
msgstr "Errore"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:518
|
||||
msgid "Out of date"
|
||||
msgstr "Non aggiornato"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:543
|
||||
msgid "View Source"
|
||||
msgstr "Visualizza sorgente"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:549
|
||||
msgid "Web Page"
|
||||
msgstr "Pagina web"
|
||||
|
||||
#: ../js/ui/overview.js:161
|
||||
msgid "Undo"
|
||||
msgstr "Annulla"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:945
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e %b, %k.%M.%S"
|
||||
|
||||
# (ndt) proviamo col k, se non funge, sappiamo il perché...
|
||||
#: ../js/ui/panel.js:946
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %e %b, %k.%M"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:950
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %k.%M.%S"
|
||||
|
||||
#: ../js/ui/panel.js:951
|
||||
msgid "%a %R"
|
||||
msgstr "%a %k.%M"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:958
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %l.%M.%S %P"
|
||||
|
||||
#: ../js/ui/panel.js:959
|
||||
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:963
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l.%M.%S %P"
|
||||
|
||||
#: ../js/ui/panel.js:964
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l.%M %P"
|
||||
|
||||
#. 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:336
|
||||
#: ../js/ui/panel.js:1065
|
||||
msgid "Activities"
|
||||
msgstr "Attività"
|
||||
|
||||
# (ndt) proviamo col k, se non funge, sappiamo il perché...
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:557
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %k.%M"
|
||||
# (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:144
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Riprova"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Connetti a..."
|
||||
|
||||
#: ../js/ui/runDialog.js:245
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Inserire un comando:"
|
||||
|
||||
#: ../js/ui/runDialog.js:361
|
||||
#: ../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:91
|
||||
msgid "Available"
|
||||
msgstr "Disponibile"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Applicazioni"
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "Non disponibile"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Documenti recenti"
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "Invisibile"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "Informazioni account..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferenze di sistema..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "Blocca schermo"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "Cambia utente"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "Termina sessione..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
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"
|
||||
|
||||
# (ndt) un po' liberetta...
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Impossibile aggiungere un nuovo spazio di lavoro: raggiunto il limite "
|
||||
"massimo consentito."
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Impossibile rimuovere il primo spazio di lavoro."
|
||||
|
||||
#: ../src/shell-global.c:1025
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Meno di un minuto fa"
|
||||
|
||||
#: ../src/shell-global.c:980
|
||||
#: ../src/shell-global.c:1029
|
||||
#, 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:985
|
||||
#: ../src/shell-global.c:1034
|
||||
#, 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:990
|
||||
#: ../src/shell-global.c:1039
|
||||
#, 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:995
|
||||
#: ../src/shell-global.c:1044
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -167,54 +338,3 @@ msgstr "Cerca"
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "Risorse"
|
||||
|
||||
#~ 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..."
|
||||
|
533
po/lt.po
Normal file
533
po/lt.po
Normal file
@ -0,0 +1,533 @@
|
||||
# Lithuanian translation for gnome-shell.
|
||||
# Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Žygimantas Beručka <zygis@gnome.org>, 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: 2010-06-24 17:17+0000\n"
|
||||
"PO-Revision-Date: 2010-06-25 20:27+0300\n"
|
||||
"Last-Translator: Žygimantas Beručka <zygis@gnome.org>\n"
|
||||
"Language-Team: Lithuanian <gnome-lt@lists.akl.lt>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%"
|
||||
"100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Virtaal 0.6.1\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Langų valdymas ir programų paleidimas"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Laikrodis"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Derinti skydelio laikrodį"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
"Suteikia prieigą prie vidinio derinimo ir stebėjimo įrankių, naudojant "
|
||||
"Alt-F2 dialogą."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "Pasirinktinis laikrodžio formatas"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr ""
|
||||
"Įjungti vidinius, Alt-F2 klavišų pagalba pasiekiamus įrankius, naudingus "
|
||||
"programuotojams ir bandytojams "
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Failų plėtinys, naudojamas įrašyti ekrano vaizdo įrašą"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Kadrų dažnis, naudojamas norint įrašyti ekrano vaizdo įrašą."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr ""
|
||||
"GNOME Shell plėtiniai turi uuid savybę. Šiame rakte nurodyti plėtiniai, "
|
||||
"kurie neturėtų būti įkelti."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Komandų (Alt-F2) dialogo retrospektyva"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "Valandų formatas"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr ""
|
||||
"Jei reikšmė teigiama ir formatas yra „12-hour“ ar „24-hour“, laikrodyje "
|
||||
"šalia laiko rodyti ir datą."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr ""
|
||||
"Jei reikšmė teigiama ir formatas yra „12-hour“ ar „24-hour“, laikrodyje "
|
||||
"rodyti ir sekundes."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Jeigu reikšmė teigiama, kalendoriuje rodyti ISO savaičių datą."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "Mėgstamų programų darbastalio failų ID sąrašas"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "Apžvalginės darbo erdvės peržiūros veiksena"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Nurodo GStreamer konvejerį, naudojamą įrašams koduoti. Jame naudojama gst-"
|
||||
"launch naudojama sintaksė. Konvejeryje turėtų būti neprijungtas apjungiantis "
|
||||
"elementas, kuriame įrašomas vaizdo įrašas. Paprastai jame yra neprijungtas "
|
||||
"šaltinio elementas; išvestis iš to elemento bus įrašyta į išvesties failą. "
|
||||
"Tačiau konvejeris taip pat gali pasirūpinti savo paties išvestimi – tai gali "
|
||||
"būti panaudota norint perduoti išvestį icecast serveriui per shout2send ar "
|
||||
"pan. elementą. Kai reikšmė nenustatyta ar nustatyta tuščia reikšmė, "
|
||||
"naudojamas numatytasis konvejeris. Šiuo metu tai yra „videorate ! theoraenc "
|
||||
"! oggmux“, o įrašoma į Ogg Theora."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "Rodyti datą laikrodyje"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Rodyti savaitės dienas kalendoriuje"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "Rodyti laiką su sekundėmis"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr ""
|
||||
"Programos, atitinkančios šiuos identifikatorius, bus rodomos mėgstamų "
|
||||
"srityje."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Įrašytų ekrano vaizdo įrašų failų vardas bus unikalus, sudaromas "
|
||||
"atsižvelgiant į dabartinę datą ir naudojantis šį plėtinį. Rašant į kitą "
|
||||
"konteinerio formatą jį reikėtų pakeisti."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
"GNOME Shell ekranų įrašymo programa sukurto ekrano įrašo kadrų dažnis "
|
||||
"kadrais per sekundę."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Gstreamer konvejeris, naudojamas užkoduojant ekrano vaizdo įrašą."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"Apžvalgoje pasirinkta darbo erdvės peržiūros veiksena. Galimos reikšmės yra "
|
||||
"„single“ ir „grid“."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"Apvalkalas paprastai stebi aktyvias programas siekiant pateikti dažniausiai "
|
||||
"naudojamas (pvz., leistukuose). Nors šie duomenys konfidencialiai saugomi, "
|
||||
"jei norite, saugumo sumetimais galite šią funkciją išjungti. Atminkite, kad "
|
||||
"tai padarius jau įrašyti duomenys jau nebus įrašyti."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Šis raktas nurodo skydelio laikrodžio naudojamą formatą, kuomet formato "
|
||||
"raktas nustatytas į reikšmę „custom“. Norėdami gauti konkretų formatą, "
|
||||
"galite naudoti konvertavimo simbolius, kuriuos priima funkcija strftime(). "
|
||||
"Daugiau informacijos galite rasti strftime() žinyne."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Šis raktas nurodo skydelio laikrodžio naudojamą valandų formatą. Galimos "
|
||||
"reikšmės: „12-hour“, „24-hour“, „unix“ ir „custom“. Jei nustatyta „unix“, "
|
||||
"laikrodis rodys laiką sekundėmis nuo Epochos, tai yra 1970-01-01. Jei "
|
||||
"nustatyta „custom“, laikrodis rodys laiką atsižvelgiant į custom_format "
|
||||
"rakte nurodytą formatą. Atminkite, kad nustačius „unix“ arba „custom“ yra "
|
||||
"nepaisoma show_date ir show_seconds raktų."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "Išjungtinų plėtinių UUID."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "Ar rinkti statistinę informaciją apie programų naudojimą"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Laikrodžio formatas"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Laikrodžio nustatymai"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Skydelio ekranas"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Rodyti seku_ndes"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Rodyti _datą"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "_12 valandų formatas"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24 valandų formatas"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:767
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "PROGRAMOS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "NUSTATYMAI"
|
||||
|
||||
#: ../js/ui/appDisplay.js:726
|
||||
msgid "New Window"
|
||||
msgstr "Naujas langas"
|
||||
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Pašalinti iš mėgstamų"
|
||||
|
||||
#: ../js/ui/appDisplay.js:731
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Pridėti prie mėgstamų"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1038
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Vilkite čia norėdami pridėti prie mėgstamų"
|
||||
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s buvo pridėta prie jūsų mėgstamų."
|
||||
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s buvo pašalinta iš jūsų mėgstamų."
|
||||
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "Ieškoti"
|
||||
|
||||
#: ../js/ui/dash.js:465
|
||||
msgid "Searching..."
|
||||
msgstr "Ieškoma..."
|
||||
|
||||
#: ../js/ui/dash.js:479
|
||||
msgid "No matching results."
|
||||
msgstr "Nerasta atitikmenų."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:786 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "VIETOS ir ĮRENGINIAI"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:793 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "PASKUTINIEJI ELEMENTAI"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nėra įdiegtų plėtinių"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "Įjungta"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "Išjungta"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "Klaida"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "Pasenęs"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "Žiūrėti šaltinį"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "Tinklalapis"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "Atšaukti"
|
||||
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
msgstr "Nustatymai"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %b %e, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:606
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %b %e, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %b %e, %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %b %e, %l:%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#. 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:762
|
||||
msgid "Activities"
|
||||
msgstr "Apžvalga"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Nepavyko atjungti „%s“"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "Bandyti dar kartą"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "Prisijungti prie..."
|
||||
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Įveskite komandą:"
|
||||
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Nepavyko paleisti „%s“:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "Esu"
|
||||
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "Užsiėmęs (-usi)"
|
||||
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "Nematomas (-a)"
|
||||
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "Paskyros informacija..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "Sistemos nustatymai..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "Užrakinti ekraną"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "Keisti naudotoją"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "Atsijungti ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
msgid "Shut Down..."
|
||||
msgstr "Išjungti..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s buvo paleista"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "„%s“ yra pasirengusi"
|
||||
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Negalima pridėti naujos darbo erdvės, kadangi buvo pasiektas didžiausias "
|
||||
"galimas darbo erdvių skaičius."
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Nepavyko pašalinti pirmosios darbo erdvės."
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Mažiau nei prieš minutę"
|
||||
|
||||
#: ../src/shell-global.c:1043
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "prieš %d minutę"
|
||||
msgstr[1] "prieš %d minutes"
|
||||
msgstr[2] "prieš %d minučių"
|
||||
|
||||
#: ../src/shell-global.c:1048
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "prieš %d valandą"
|
||||
msgstr[1] "prieš %d valandas"
|
||||
msgstr[2] "prieš %d valandų"
|
||||
|
||||
#: ../src/shell-global.c:1053
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "prieš %d dieną"
|
||||
msgstr[1] "prieš %d dienas"
|
||||
msgstr[2] "prieš %d dienų"
|
||||
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "prieš %d savaitę"
|
||||
msgstr[1] "prieš %d savaites"
|
||||
msgstr[2] "prieš %d savaičių"
|
||||
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Namų aplankas"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-uri-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "Failų sistema"
|
||||
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Ieškoti"
|
||||
|
||||
#. 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"
|
368
po/nb.po
368
po/nb.po
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 2.28.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-03-09 17:45+0100\n"
|
||||
"PO-Revision-Date: 2010-03-09 17:47+0100\n"
|
||||
"POT-Creation-Date: 2010-06-19 16:41+0200\n"
|
||||
"PO-Revision-Date: 2010-06-19 16:43+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,205 +24,436 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Vindushåndtering og oppstart av programmer"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Klokke"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Tilpass klokken på panelet"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "Egendefinert format for klokken"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "Timeformat"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "Vis dato i klokken"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Vis dato for uken i kalender"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "Vis tid med sekunder"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
#, fuzzy
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "Ingen utvidelser installert"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Klokkeformat"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Brukervalg for klokke"
|
||||
|
||||
#: ../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/appDisplay.js:311 ../js/ui/dash.js:886
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:767
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "PROGRAMMER"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "BRUKERVALG"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
#: ../js/ui/appDisplay.js:726
|
||||
msgid "New Window"
|
||||
msgstr "Nytt vindu"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Fjern fra favoritter"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
#: ../js/ui/appDisplay.js:731
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Legg til i favoritter"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
#: ../js/ui/appDisplay.js:1038
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Dra hit for å legge til favoritter"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s ble lagt til i dine favoritter."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s ble fjernet fra dine favoritter."
|
||||
|
||||
#: ../js/ui/dash.js:235
|
||||
msgid "Find..."
|
||||
msgstr "Finn..."
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "Finn"
|
||||
|
||||
#: ../js/ui/dash.js:511
|
||||
#: ../js/ui/dash.js:465
|
||||
msgid "Searching..."
|
||||
msgstr "Søker..."
|
||||
|
||||
#: ../js/ui/dash.js:525
|
||||
#: ../js/ui/dash.js:479
|
||||
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:905 ../js/ui/placeDisplay.js:529
|
||||
#: ../js/ui/dash.js:786 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "STEDER & ENHETER"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:912 ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:793 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "SISTE OPPFØRINGER"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "Ingen utvidelser installert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "Aktivert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "Deaktivert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "Feil"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "Utdatert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "Vis kildekode"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "Nettside"
|
||||
|
||||
#: ../js/ui/overview.js:92
|
||||
#: ../js/ui/overview.js:165
|
||||
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:399
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
msgstr "Brukervalg"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:630
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e %b, %R.%S"
|
||||
|
||||
#: ../js/ui/panel.js:606
|
||||
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:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R.%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:633
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %H:%M"
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %l.%M.%S %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
#: ../js/ui/panel.js:619
|
||||
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:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l.%M.%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l.%M %p"
|
||||
|
||||
#. 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:726
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Klarte ikke å avmontere «%s»"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "Prøv igjen"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "Koble til..."
|
||||
|
||||
#: ../js/ui/runDialog.js:221
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Oppgi en kommando:"
|
||||
|
||||
#: ../js/ui/runDialog.js:344
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Kjøring av «%s» feilet:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "Tilgjengelig"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "Opptatt"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "Usynlig"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "Kontoinformasjon..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Sidelinje"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "Brukervalg for systemet..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lås skjerm"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "Bytt bruker"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "Logg ut..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
msgid "Shut Down..."
|
||||
msgstr "Avslutt..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s er ferdig startet"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Programmer"
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "«%s» er klar"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Siste dokumenter"
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
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."
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Kan ikke fjerne første arbeidsområde"
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Mindre enn ett minutt siden"
|
||||
|
||||
#: ../src/shell-global.c:971
|
||||
#: ../src/shell-global.c:1043
|
||||
#, 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:976
|
||||
#: ../src/shell-global.c:1048
|
||||
#, 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:981
|
||||
#: ../src/shell-global.c:1053
|
||||
#, 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:986
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -252,3 +483,6 @@ msgstr "Søk"
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Quit %s"
|
||||
#~ msgstr "Avslutt %s"
|
||||
|
292
po/nl.po
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"
|
||||
|
536
po/pa.po
536
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-06-18 18:29+0000\n"
|
||||
"PO-Revision-Date: 2010-07-03 06:43+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,456 @@ 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/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr "Alt-F2 ਡਾਈਲਾਗ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅੰਦਰੂਨੀ ਡੀਬੱਗਿਗ ਤੇ ਮਾਨੀਟਰਿੰਗ ਟੂਲ ਵਰਤੋਂ ਕਰਨ ਲਈ ਸਹਾਇਕ ਹੈ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
#| msgid "Customize the panel clock"
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "ਘੜੀ ਲਈ ਪਸੰਦੀਦਾ ਫਾਰਮੈਟ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr "Alt-F2 ਤੋਂ ਡਿਵੈਲਪਰਾਂ ਤੇ ਟੈਸਟਰਾਂ ਲਈ ਫਾਇਦੇਮੰਦ ਅੰਦਰੂਨੀ ਟੂਲ ਚਾਲੂ ਕਰਦਾ ਹੈ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "ਸਕਰੀਨਕਾਸਟ ਸੰਭਾਲਣ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਫਾਇਲ ਇਕਟੈਨਸ਼ਨ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "ਸਕਰੀਨਕਾਸਟ ਰਿਕਾਰਡ ਕਰਨ ਲਈ ਫਰੇਮਰੇਟ ਹੈ।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr ""
|
||||
"ਗਨੋਮ ਸ਼ੈਲ ਇਕਸਟੈਨਸ਼ਨ ਲਈ ਇੱਕ uuid ਵਿਸ਼ੇਸ਼ਤਾ ਹੈ; ਇਹ ਕੁੰਜੀ ਇਕਸਟੈਨਸ਼ਨ ਦਰਸਾਉਂਦੀ ਹੈ, ਜੋ ਲੋਡ ਨਹੀਂ "
|
||||
"ਹਨ।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "ਕਮਾਂਡ (Alt-F2) ਡਾਈਲਾਗ ਲਈ ਅਤੀਤ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
#| msgid "_12 hour format"
|
||||
msgid "Hour format"
|
||||
msgstr "ਘੰਟਾ ਫਾਰਮੈਟ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr "ਜੇ ਚੋਣ ਕੀਤੀ ਤਾਂ ਘੜੀ ਵਿੱਚ \"12-hour\" ਜਾਂ \" 24-hour\" ਸਮੇਂ ਦੇ ਨਾਲ ਵੇਖਾਏ ਜਾਣਗੇ।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr "ਜੇ ਚੋਣ ਕੀਤੀ ਤਾਂ ਸਮੇਂ ਵਿੱਚ \"12-hour\" ਜਾਂ \" 24-hour\" ਸਕਿੰਟ ਵੇਖਾਏ ਜਾਣਗੇ।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "ਜੇ ਚੋਣ ਕੀਤੀ ਤਾਂ ਕੈਲੰਡਰ ਵਿੱਚ ISO ਹਫਤਾ ਮਿਤੀ ਵੇਖਾਈ ਜਾਵੇਗੀ।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "ਪਸੰਦੀਦਾ ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਡੈਸਕਟਾਪ ਫਾਇਲ ID ਦੀ ਲਿਸਟ ਹੈ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਦੀ ਝਲਕ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "ਘੜੀ ਵਿੱਚ ਮਿਤੀ ਵੇਖੋ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "ਕੈਲੰਡਰ ਵਿੱਚ ਹਫ਼ਤਾ ਮਿਤੀ ਵੇਖੋ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
#| msgid "Show seco_nds"
|
||||
msgid "Show time with seconds"
|
||||
msgstr "ਸਮਾਂ ਵਿੱਚ ਸਕਿੰਟ ਵੇਖੋ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr "ਇਹਨਾਂ ਐਂਡਟਟੀਫਾਇਰ ਨਾਲ ਸਬੰਧਿਤ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਪਸੰਦੀਦਾ ਖੇਤਰ 'ਚ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "ਸਕਰੀਨਕਾਸਟ ਇੰਕੋਡ ਕਰਨ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਜੀਸਟਰੀਮਰ ਪਾਇਪਲਾਇਨ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"ਸੰਖੇਪ ਵਿੱਚ ਚੁਣੇ ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਹੈ। ਸਹਾਇਕ ਮੁੱਲ ਹਨ \"single\"(ਇੱਕਲਾ) ਜਾਂ \"grid\" (ਗਰਿੱਡ)।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
#| msgid "No extensions installed"
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "ਇਕਟੈਨਸ਼ਨ ਦੀ Uuids ਬੰਦ ਹੈ"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "ਐਪਲੀਕੇਸ਼ਨ ਵਰਤੋਂ ਬਾਰੇ ਅੰਕੜੇ ਇੱਕਠੇ ਕਰਨੇ ਹਨ"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "ਘੜੀ ਫਾਰਮੈਟ"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
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:388 ../js/ui/dash.js:767
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ਪਸੰਦ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:726
|
||||
msgid "New Window"
|
||||
msgstr "ਨਵੀਂ ਵਿੰਡੋ"
|
||||
|
||||
#: ../js/ui/appIcon.js:475
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
|
||||
|
||||
#: ../js/ui/appIcon.js:476
|
||||
#: ../js/ui/appDisplay.js:731
|
||||
msgid "Add to Favorites"
|
||||
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
|
||||
|
||||
#: ../js/ui/dash.js:283
|
||||
msgid "Find..."
|
||||
msgstr "ਖੋਜ..."
|
||||
#: ../js/ui/appDisplay.js:1038
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜਨ ਲਈ ਇੱਥੇ ਸੁੱਟੋ"
|
||||
|
||||
#: ../js/ui/dash.js:400
|
||||
msgid "More"
|
||||
msgstr "ਹੋਰ"
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, 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:106
|
||||
#, 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:146
|
||||
msgid "Find"
|
||||
msgstr "ਖੋਜ"
|
||||
|
||||
#: ../js/ui/dash.js:465
|
||||
msgid "Searching..."
|
||||
msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..."
|
||||
|
||||
#: ../js/ui/dash.js:479
|
||||
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:786 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "ਥਾਵਾਂ ਤੇ ਜੰਤਰ"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:790 ../js/ui/dash.js:835
|
||||
msgid "RECENT DOCUMENTS"
|
||||
msgstr "ਤਾਜ਼ਾ ਡੌਕੂਮੈਂਟ"
|
||||
#: ../js/ui/dash.js:793 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "ਤਾਜ਼ਾ ਆਈਟਮਾਂ"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:815 ../js/ui/dash.js:955
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "ਖੋਜ ਨਤੀਜੇ"
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "ਕੋਈ ਇਕਸਟੈਨਸ਼ਨ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ"
|
||||
|
||||
#: ../js/ui/dash.js:830
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ਪਸੰਦ"
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
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
|
||||
msgid "Activities"
|
||||
msgstr "ਸਰਗਰਮੀਆਂ"
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "ਬੰਦ ਹੈ"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:464
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "ਗਲਤੀ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "ਪੁਰਾਣਾ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "ਸਰੋਤ ਵੇਖੋ"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "ਵੈੱਬ ਪੇਜ਼"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "ਵਾਪਸ"
|
||||
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
msgstr "ਮੇਰੀ ਪਸੰਦ"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a, %e %b %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:606
|
||||
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:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:619
|
||||
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:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/places.js:178
|
||||
#. 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:726
|
||||
msgid "Activities"
|
||||
msgstr "ਸਰਗਰਮੀਆਂ"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "'%s' ਅਣ-ਮਾਊਂਟ ਕਰਨ ਲਈ ਫੇਲ੍ਹ"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "...ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ"
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "ਕਮਾਂਡ ਦਿਓ ਜੀ:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, 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:91
|
||||
msgid "Available"
|
||||
msgstr "ਉਪਲੱਬਧ"
|
||||
|
||||
#: ../js/ui/widget.js:316
|
||||
msgid "Applications"
|
||||
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "ਰੁਝਿਆ"
|
||||
|
||||
#: ../js/ui/widget.js:341
|
||||
msgid "Recent Documents"
|
||||
msgstr "ਤਾਜ਼ਾ ਡੌਕੂਮੈਂਟ"
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "ਅਦਿੱਖ"
|
||||
|
||||
#: ../src/shell-global.c:812
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "ਅਕਾਊਂਟ ਜਾਣਕਾਰੀ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "ਸਿਸਟਮ ਪਸੰਦ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "ਲਾਗਆਉਟ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
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:237
|
||||
msgid "Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "ਨਵਾਂ ਵਰਕਸਪੇਸ ਜੋੜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਵਰਕਸਪੇਸਾਂ ਦੀ ਵੱਧੋ-ਵੱਧ ਗਿਣਤੀ ਪੂਰੀ ਹੋ ਚੁੱਕੀ ਹੈ।"
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "ਪਹਿਲਾਂ ਵਰਕਸਪੇਸ ਨਹੀਂ ਹਟਾਇਆ ਜਾ ਸਕਦਾ।"
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ"
|
||||
|
||||
#: ../src/shell-global.c:815
|
||||
#: ../src/shell-global.c:1043
|
||||
#, 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:1048
|
||||
#, 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:1053
|
||||
#, 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:1058
|
||||
#, 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 +484,52 @@ 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 "Quit %s"
|
||||
#~ msgstr "%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 "ਝਲਕ"
|
||||
|
200
po/pl.po
200
po/pl.po
@ -8,9 +8,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \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"
|
||||
"POT-Creation-Date: 2010-05-27 23:18+0200\n"
|
||||
"PO-Revision-Date: 2010-05-25 21:36+0200\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -28,193 +28,263 @@ msgstr "Powłoka środowiska GNOME"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Zarządzanie oknami i uruchamianiem programów"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Zegar"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Dostosowanie panelu zegara"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Format zegara"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Preferencje zegara"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Wyświetlanie na panelu"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Seku_ndy"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "_Data"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "_12 godzinny"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24 godzinny"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:858
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "Programy"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "Preferencje"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
#: ../js/ui/appDisplay.js:710
|
||||
msgid "New Window"
|
||||
msgstr "Nowe okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
#: ../js/ui/appDisplay.js:714
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Usuń z ulubionych"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
#: ../js/ui/appDisplay.js:715
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Dodaj do ulubionych"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
#: ../js/ui/appDisplay.js:1042
|
||||
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."
|
||||
msgstr "Program %s został dodany 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."
|
||||
msgstr "Program %s został usunięty z ulubionych."
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Znajdź"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../js/ui/dash.js:513
|
||||
msgid "Searching..."
|
||||
msgstr "Wyszukiwanie..."
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
#: ../js/ui/dash.js:527
|
||||
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:871 ../js/ui/placeDisplay.js:579
|
||||
#: ../js/ui/dash.js:877 ../js/ui/placeDisplay.js:551
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "Miejsca i urządzenia"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:884 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "Ostatnie dokumenty"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
#: ../js/ui/lookingGlass.js:466
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nie zainstalowano rozszerzeń"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
#: ../js/ui/lookingGlass.js:503
|
||||
msgid "Enabled"
|
||||
msgstr "Włączone"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
#: ../js/ui/lookingGlass.js:505
|
||||
msgid "Disabled"
|
||||
msgstr "Wyłączone"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
#: ../js/ui/lookingGlass.js:507
|
||||
msgid "Error"
|
||||
msgstr "Błąd"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
#: ../js/ui/lookingGlass.js:509
|
||||
msgid "Out of date"
|
||||
msgstr "Przestarzałe"
|
||||
msgstr "Nieaktualne"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
#: ../js/ui/lookingGlass.js:534
|
||||
msgid "View Source"
|
||||
msgstr "Wyświetl źródło"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
#: ../js/ui/lookingGlass.js:540
|
||||
msgid "Web Page"
|
||||
msgstr "Strona WWW"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
#: ../js/ui/overview.js:161
|
||||
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
|
||||
#: ../js/ui/panel.js:903
|
||||
msgid "Activities"
|
||||
msgstr "Podgląd"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:1118
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e %b, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1119
|
||||
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:1123
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:1124
|
||||
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"
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:1131
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %H:%M:%S %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#: ../js/ui/panel.js:1132
|
||||
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:1136
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a, %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/panel.js:1137
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Odmontowanie \"%s\" się nie powiodło"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Ponów"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Połącz z..."
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Proszę wprowadzić polecenie:"
|
||||
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Wykonanie \"%s\" się nie powiodło:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
#: ../js/ui/statusMenu.js:90
|
||||
msgid "Available"
|
||||
msgstr "Dostępny"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
#: ../js/ui/statusMenu.js:94
|
||||
msgid "Busy"
|
||||
msgstr "Zajęty"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
#: ../js/ui/statusMenu.js:98
|
||||
msgid "Invisible"
|
||||
msgstr "Niewidoczny"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
#: ../js/ui/statusMenu.js:105
|
||||
msgid "Account Information..."
|
||||
msgstr "Informacje o koncie..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Panel boczny"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
#: ../js/ui/statusMenu.js:109
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferencje systemu..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
#: ../js/ui/statusMenu.js:116
|
||||
msgid "Lock Screen"
|
||||
msgstr "Zablokuj ekran"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
#: ../js/ui/statusMenu.js:120
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
#: ../js/ui/statusMenu.js:125
|
||||
msgid "Log Out..."
|
||||
msgstr "Wyloguj się..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
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/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "Ukończono uruchamianie programu %s"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Programy"
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "Program \"%s\" jest gotowy"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Ostatnie dokumenty"
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
"Nie można dodać nowego obszaru roboczego, ponieważ osiągnięto ograniczenie "
|
||||
"maksymalnej liczby obszarów."
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Nie można usunąć pierwszego obszaru roboczego."
|
||||
|
||||
#: ../src/shell-global.c:1027
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Mniej niż minutę temu"
|
||||
|
||||
#: ../src/shell-global.c:971
|
||||
#: ../src/shell-global.c:1031
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -222,7 +292,7 @@ msgstr[0] "%d minuta temu"
|
||||
msgstr[1] "%d minuty temu"
|
||||
msgstr[2] "%d minut temu"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
#: ../src/shell-global.c:1036
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -230,7 +300,7 @@ msgstr[0] "%d godzina temu"
|
||||
msgstr[1] "%d godziny temu"
|
||||
msgstr[2] "%d godzin temu"
|
||||
|
||||
#: ../src/shell-global.c:981
|
||||
#: ../src/shell-global.c:1041
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -238,7 +308,7 @@ msgstr[0] "%d dzień temu"
|
||||
msgstr[1] "%d dni temu"
|
||||
msgstr[2] "%d dni temu"
|
||||
|
||||
#: ../src/shell-global.c:986
|
||||
#: ../src/shell-global.c:1046
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
|
288
po/pt_BR.po
288
po/pt_BR.po
@ -3,15 +3,15 @@
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Og Maciel <ogmaciel@gnome.org>, 2009.
|
||||
# Rodrigo Flores <mail@rodrigoflores.org>, 2009.
|
||||
# Felipe Borges <felipe10borges@gmail.com>, 2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&component=general\n"
|
||||
"POT-Creation-Date: 2009-11-12 21:33+0000\n"
|
||||
"PO-Revision-Date: 2009-11-14 11:53-0200\n"
|
||||
"Last-Translator: Amanda Magalhães <amandinhakee@gmail.com>\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-04-17 14:02-0300\n"
|
||||
"PO-Revision-Date: 2010-03-02 20:59-0300\n"
|
||||
"Last-Translator: Rodrigo Flores <rlmflores@gnome.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -24,197 +24,269 @@ msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Gerenciamento de janelas e lançador de aplicações"
|
||||
msgstr "Gerenciamento de janelas e lançador de aplicativos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:696
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Arraste até aqui para adicionar aos favoritos"
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:306 ../js/ui/dash.js:850
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLICATIVOS"
|
||||
|
||||
#: ../js/ui/appIcon.js:425
|
||||
#: ../js/ui/appDisplay.js:338
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERÊNCIAS"
|
||||
|
||||
#: ../js/ui/appDisplay.js:697
|
||||
msgid "New Window"
|
||||
msgstr "Nova janela"
|
||||
|
||||
#: ../js/ui/appIcon.js:429
|
||||
#: ../js/ui/appDisplay.js:701
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Remover dos Favoritos"
|
||||
|
||||
#: ../js/ui/appIcon.js:430
|
||||
#: ../js/ui/appDisplay.js:702
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Adicionar aos Favoritos"
|
||||
|
||||
#: ../js/ui/dash.js:237
|
||||
msgid "Find..."
|
||||
msgstr "Procurar..."
|
||||
#: ../js/ui/appDisplay.js:1029
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Arraste até aqui para adicionar aos favoritos"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/dash.js:656 ../js/ui/dash.js:718
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "APLICATIVOS"
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s foi adicionado aos seus favoritos."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s foi removido dos seus favoritos."
|
||||
|
||||
#: ../js/ui/dash.js:189
|
||||
msgid "Find"
|
||||
msgstr "Localizar"
|
||||
|
||||
#: ../js/ui/dash.js:505
|
||||
msgid "Searching..."
|
||||
msgstr "Pesquisando..."
|
||||
|
||||
#: ../js/ui/dash.js:519
|
||||
msgid "No matching results."
|
||||
msgstr "Nenhum resultado encontrado."
|
||||
|
||||
#. **** 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 "LOCAIS"
|
||||
#: ../js/ui/dash.js:869 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "LOCAIS & DISPOSITIVOS"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:683 ../js/ui/dash.js:728
|
||||
msgid "RECENT DOCUMENTS"
|
||||
#: ../js/ui/dash.js:876 ../js/ui/docDisplay.js:489
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "DOCUMENTOS RECENTES"
|
||||
|
||||
#. **** Search Results ****
|
||||
#: ../js/ui/dash.js:708 ../js/ui/dash.js:898
|
||||
msgid "SEARCH RESULTS"
|
||||
msgstr "RESULTADOS DA BUSCA"
|
||||
#: ../js/ui/lookingGlass.js:362
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nenhuma extensão instalada"
|
||||
|
||||
#: ../js/ui/dash.js:723
|
||||
msgid "PREFERENCES"
|
||||
msgstr "PREFERÊNCIAS"
|
||||
#: ../js/ui/lookingGlass.js:399
|
||||
msgid "Enabled"
|
||||
msgstr "Habilitado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:401
|
||||
msgid "Disabled"
|
||||
msgstr "Desabilitado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:403
|
||||
msgid "Error"
|
||||
msgstr "Erro"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:405
|
||||
msgid "Out of date"
|
||||
msgstr "Expirado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:430
|
||||
msgid "View Source"
|
||||
msgstr "Ver fonte"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:436
|
||||
msgid "Web Page"
|
||||
msgstr "Página Web"
|
||||
|
||||
#: ../js/ui/overview.js:181
|
||||
msgid "Undo"
|
||||
msgstr "Desfazer"
|
||||
|
||||
#. 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:346
|
||||
msgid "Activities"
|
||||
msgstr "Atividades"
|
||||
|
||||
#. 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:566
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#: ../js/ui/panel.js:569
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:84
|
||||
#: ../js/ui/placeDisplay.js:108
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Erro ao desmontar \"%s\""
|
||||
|
||||
#: ../js/ui/placeDisplay.js:111
|
||||
msgid "Retry"
|
||||
msgstr "Tentar novamente"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:156
|
||||
msgid "Connect to..."
|
||||
msgstr "Conectar ao..."
|
||||
|
||||
#: ../js/ui/runDialog.js:96
|
||||
#: ../js/ui/runDialog.js:231
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Por favor digite um comando:"
|
||||
|
||||
#: ../js/ui/runDialog.js:173
|
||||
#: ../js/ui/runDialog.js:375
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "A execução de \"%s\" falhou:"
|
||||
|
||||
#. 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 "Disponível"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "Aplicações"
|
||||
#: ../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ível"
|
||||
|
||||
#: ../src/shell-global.c:821
|
||||
#: ../js/ui/statusMenu.js:124
|
||||
msgid "Account Information..."
|
||||
msgstr "Informação da conta..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:129
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferências do sistema..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:138
|
||||
msgid "Lock Screen"
|
||||
msgstr "Travar a tela"
|
||||
|
||||
#: ../js/ui/statusMenu.js:143
|
||||
msgid "Switch User"
|
||||
msgstr "Alternar usuário"
|
||||
|
||||
#: ../js/ui/statusMenu.js:149
|
||||
msgid "Log Out..."
|
||||
msgstr "Encerrar sessão..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:154
|
||||
msgid "Shut Down..."
|
||||
msgstr "Desligar..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s terminou sua inicialização"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "\"%s\" está pronto"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Menos de um minuto atrás"
|
||||
|
||||
#: ../src/shell-global.c:824
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d minuto atrás"
|
||||
msgstr[1] "%d minutos atrás"
|
||||
|
||||
#: ../src/shell-global.c:827
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d hora atrás"
|
||||
msgstr[1] "%d horas atrás"
|
||||
|
||||
#: ../src/shell-global.c:830
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d dia atrás"
|
||||
msgstr[1] "%d dias atrás"
|
||||
|
||||
#: ../src/shell-global.c:833
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d semana atrás"
|
||||
msgstr[1] "%d semanas atrás"
|
||||
|
||||
#: ../src/shell-status-menu.c:156
|
||||
msgid "Unknown"
|
||||
msgstr "Desconhecido"
|
||||
|
||||
#: ../src/shell-status-menu.c:212
|
||||
#, c-format
|
||||
msgid "Can't lock screen: %s"
|
||||
msgstr "Não foi possível travar a tela: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:227
|
||||
#, c-format
|
||||
msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
msgstr "Não foi possível definir a proteção de tela para uma tela vazia: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:351
|
||||
#, c-format
|
||||
msgid "Can't logout: %s"
|
||||
msgstr "Não foi possível encerrar a sessão: %s"
|
||||
|
||||
#: ../src/shell-status-menu.c:492
|
||||
msgid "Account Information..."
|
||||
msgstr "Informação da conta..."
|
||||
|
||||
#: ../src/shell-status-menu.c:502
|
||||
msgid "Sidebar"
|
||||
msgstr "Barra lateral"
|
||||
|
||||
#: ../src/shell-status-menu.c:510
|
||||
msgid "System Preferences..."
|
||||
msgstr "Preferências do sistema..."
|
||||
|
||||
#: ../src/shell-status-menu.c:525
|
||||
msgid "Lock Screen"
|
||||
msgstr "Travar a tela"
|
||||
|
||||
#: ../src/shell-status-menu.c:535
|
||||
msgid "Switch User"
|
||||
msgstr "Alternar usuário"
|
||||
|
||||
#. Only show switch user if there are other users
|
||||
#. Log Out
|
||||
#: ../src/shell-status-menu.c:546
|
||||
msgid "Log Out..."
|
||||
msgstr "Encerrar sessão..."
|
||||
|
||||
#. Shut down
|
||||
#: ../src/shell-status-menu.c:557
|
||||
msgid "Shut Down..."
|
||||
msgstr "Desligar..."
|
||||
|
||||
#: ../src/shell-uri-util.c:87
|
||||
#: ../src/shell-uri-util.c:89
|
||||
msgid "Home Folder"
|
||||
msgstr "Pasta home"
|
||||
msgstr "Pasta pessoal"
|
||||
|
||||
#. 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 "Sistema de arquivos"
|
||||
|
||||
#: ../src/shell-uri-util.c:248
|
||||
#: ../src/shell-uri-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "Procurar"
|
||||
msgstr "Pesquisar"
|
||||
|
||||
#. 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:298
|
||||
#: ../src/shell-uri-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Barra lateral"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Aplicativos"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "Documentos recentes"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "LOCAIS"
|
||||
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
#~ msgstr "RESULTADOS DA BUSCA"
|
||||
|
||||
#~ msgid "Unknown"
|
||||
#~ msgstr "Desconhecido"
|
||||
|
||||
#~ msgid "Can't lock screen: %s"
|
||||
#~ msgstr "Não foi possível travar a tela: %s"
|
||||
|
||||
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
|
||||
#~ msgstr "Não foi possível definir a proteção de tela para uma tela vazia: %s"
|
||||
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "Não foi possível encerrar a sessão: %s"
|
||||
|
||||
#~ msgid "Browse"
|
||||
#~ msgstr "Navegar"
|
||||
|
||||
|
331
po/sl.po
331
po/sl.po
@ -1,4 +1,4 @@
|
||||
# Slovenian translation of gnome-shell package.
|
||||
# Slovenian translations for gnome-shell.
|
||||
# Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
#
|
||||
@ -8,8 +8,8 @@ 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: 2010-03-21 15:49+0000\n"
|
||||
"PO-Revision-Date: 2010-03-21 21:59+0100\n"
|
||||
"POT-Creation-Date: 2010-06-19 19:36+0000\n"
|
||||
"PO-Revision-Date: 2010-06-20 20:54+0100\n"
|
||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -23,197 +23,358 @@ msgstr ""
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "Gnome Lupina"
|
||||
msgstr "Gnome lupina"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Upravljanje oken in zaganjanje programov"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "Ura"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "Prilagodi uro pladnja"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog."
|
||||
msgstr "Dovoli dostop do razhroščevanja in drugih orodij nadzora preko Alt-F2 vnosnega polja."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "Zapis ure po meri"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr "Omogoči dostop do orodij razvijalcev in preizkuševalcev programske opreme preko Alt-F2 vnosnega polja."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Pripona datoteke uporabljene za shranjevanje zaslonskih posnetkov"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Hitrost sličic uporabljena za snemanje zaslonskega posnetka."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid "GNOME Shell extensions have a uuid property; this key lists extensions which should not be loaded."
|
||||
msgstr "Razširitve lupine GNOME imajo določila UUID; ključ omogoča izpis seznama razširitev, ki ne bodo naložene."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Zgodovina pogovornega okna ukazov (Alt-F2)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "Urni zapis"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid "If true and format is either \"12-hour\" or \"24-hour\", display date in the clock, in addition to time."
|
||||
msgstr "Izbrana možnost določa ali \"12-urni\" ali pa \"24-urni\" zapis časa in prikaz datuma v uri."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid "If true and format is either \"12-hour\" or \"24-hour\", display seconds in time."
|
||||
msgstr "Izbrana možnost določa ali \"12-urni\" ali pa \"24-urni\" zapis časa s prikazanimi sekundami."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Izbrana možnost določa prikaz ISO tedenski datum v koledarju."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "Seznam določil ID namiznih datotek priljubljenih programov"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "Način pregleda predogleda delovnih površin"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid "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."
|
||||
msgstr "Določa cevovod programa GStreamer, ki se uporablja za kodiranje posnetkov. Ta sledi skladnji, ki je uporabljena za gst-launch. Cevovod mora imeti nepovezano korito, kamor se posnetek snema. Običajno je za to namenjen nepovezan izvorni pomnilnik, katerega odvod se zapiše v odvodno datoteko. Vendar pa lahko cevovod ta korak naredi v lastni odvod - možnost se lahko uporabi pri pošiljanju odvoda na strežnik icecast preko shout2send ali podobno. Nedoločena ali prazna možnost se odrazi kot privzeti cevovod. Trenutno je to 'videorate ! theoraenc ! oggmux' in omogoča snemanje v zapis Ogg Theora."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "Pokaži datum v uri"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Pokaži tedenski datum v koledarju"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "Pokaži čas s sekundami"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid "The applications corresponding to these identifiers will be displayed in the favorites area."
|
||||
msgstr "Programi določeni s temi določili bodo prikazani v območju priljubljenih programov"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid "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."
|
||||
msgstr "Ime datoteke zaslonskega posnetka bo enoznačno ime, kateremu bo dodan datum in določena pripona. Pripona mora ustrezati zapisu zabojnika."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
|
||||
msgstr "Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na sekundo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid "The selected workspace view mode in the overview. Supported values are \"single\" and \"grid\"."
|
||||
msgstr "Izbrani pogled delovnih površin v predogledu. Podprte vrednosti sta \"enojno\" in \"mrežno\"."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid "The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data."
|
||||
msgstr "Lupina običajno nadzira dejavne programe zaradi možnosti prikazovanja najpogosteje uporabljenih v zaganjalniku. Čeprav so podatki krajevni, jih je dobro onemogočiti zaradi varovanja zasebnosti. Z onemogočenje ne bodo odstranjeni že shranjeni podatki."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid "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."
|
||||
msgstr "Ključ določa zapis, ki naj ga uporablja vstavek ure, kadar je ključ zapisa nastavljen kot \"prikrojen\". Za določitev zapisa lahko uporabite tudi oznake funkcije strftime(), ki so podrobneje zapisane v priročniku funkcije."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid "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."
|
||||
msgstr "Ključ določa zapis ure. Mogoče vrednosti so \"12-urni\", \"24-urni\", \"unix\" in \"po meri\". Možnost \"unix\" prikazuje čas v sekundah od začetka ere, torej od 01.01.1970, možnost \"po meri\" pa omogoča prikrojen zapis. Pri izbiri zapisa \"unix\" ali \"po meri\" sta izbiri pokaži datum in pokaži sekunde, prezrti."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "Določila UUID razširitev za onemogočenje"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "Ali naj se beleži statistika uporabe programov"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "Zapis ure"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
msgid "Clock Preferences"
|
||||
msgstr "Možnosti ure"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "Prikazovanje pladnja"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "Pokaži _sekunde"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "Pokaži _datum"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "_12-urni zapis časa"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24-urni zapis časa"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:311
|
||||
#: ../js/ui/dash.js:852
|
||||
#: ../js/ui/appDisplay.js:388
|
||||
#: ../js/ui/dash.js:767
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "Programi"
|
||||
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "Možnosti"
|
||||
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
#: ../js/ui/appDisplay.js:726
|
||||
msgid "New Window"
|
||||
msgstr "Novo okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Odstrani iz priljubljenih"
|
||||
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
#: ../js/ui/appDisplay.js:731
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Dodaj med priljubljene"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
#: ../js/ui/appDisplay.js:1038
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "S potegom na to mesto se izbor doda med priljubljene"
|
||||
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "Program \"%s\" je dodan med priljubljeno."
|
||||
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Program \"%s\" je odstranjen iz priljubljenih."
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "Najdi"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../js/ui/dash.js:465
|
||||
msgid "Searching..."
|
||||
msgstr "Iskanje ..."
|
||||
|
||||
#: ../js/ui/dash.js:521
|
||||
#: ../js/ui/dash.js:479
|
||||
msgid "No matching results."
|
||||
msgstr "Ni zadetkov iskanja"
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:871
|
||||
#: ../js/ui/placeDisplay.js:579
|
||||
#: ../js/ui/dash.js:786
|
||||
#: ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "Mesta in naprave"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:878
|
||||
#: ../js/ui/docDisplay.js:488
|
||||
#: ../js/ui/dash.js:793
|
||||
#: ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "Nedavni predmeti"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "Ni nameščenih razširitev"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "Omogočeno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "Onemogočeno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "Napaka"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "Zastarelo"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "Poglej vir"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "Spletna stran"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "Razveljavi"
|
||||
|
||||
#. 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 "Dejavnosti"
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
msgstr "Možnosti"
|
||||
|
||||
#. Translators: This is the time format used in 24-hour mode.
|
||||
#: ../js/ui/panel.js:616
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a. %e. %b., %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:606
|
||||
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:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a. %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%a. %R"
|
||||
|
||||
#. Translators: This is a time format used for AM/PM.
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a. %e. %b., %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:619
|
||||
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:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a, %H:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a, %H:%M"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#. 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:726
|
||||
msgid "Activities"
|
||||
msgstr "Dejavnosti"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Ni mogoče odklopiti '%s'"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "Poskusi znova"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "Povezava z ..."
|
||||
|
||||
#: ../js/ui/runDialog.js:232
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Vnos ukaza:"
|
||||
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Izvajanje '%s' je spodletelo:"
|
||||
msgstr "Izvedba '%s' je spodletela:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "Razpoložljivo"
|
||||
msgstr "Na voljo"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "Zasedeno"
|
||||
msgstr "Zaposleno"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "Nevidno"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "Podrobnosti računa ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
msgid "Sidebar"
|
||||
msgstr "Stranska vrstica"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "Sistemske možnosti ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "Zakleni zaslon"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "Preklop uporabnika"
|
||||
msgstr "Preklopi uporabnika"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "Odjava ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
msgid "Shut Down..."
|
||||
msgstr "Izklopi ..."
|
||||
|
||||
#. 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 "Programi"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "Nedavni dokumenti"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
@ -224,11 +385,19 @@ msgstr "%s je končal začenjanje"
|
||||
msgid "'%s' is ready"
|
||||
msgstr "'%s' storitev je pripravljena"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid "Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "Ni mogoče dodati nove delovne površine, ker je doseženo njihovo največje dovoljeno število."
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "Ni mogoče odstraniti prve delovne površine."
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Pred manj kot eno minuto"
|
||||
|
||||
#: ../src/shell-global.c:971
|
||||
#: ../src/shell-global.c:1043
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -237,7 +406,7 @@ msgstr[1] "Pred %d minuto"
|
||||
msgstr[2] "Pred %d minutama"
|
||||
msgstr[3] "Pred %d minutami"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
#: ../src/shell-global.c:1048
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -246,7 +415,7 @@ msgstr[1] "Pred %d uro"
|
||||
msgstr[2] "Pred %d urama"
|
||||
msgstr[3] "Pred %d urami"
|
||||
|
||||
#: ../src/shell-global.c:981
|
||||
#: ../src/shell-global.c:1053
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -255,7 +424,7 @@ msgstr[1] "Pred %d dnevom"
|
||||
msgstr[2] "Pred %d dnevoma"
|
||||
msgstr[3] "Pred %d dnevi"
|
||||
|
||||
#: ../src/shell-global.c:986
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -288,6 +457,16 @@ msgstr "Poišči"
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "Quit %s"
|
||||
#~ msgstr "Končaj %s"
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "Stranska vrstica"
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Programi"
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "Nedavni dokumenti"
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "Mesta"
|
||||
#~ msgid "SEARCH RESULTS"
|
||||
|
161
po/sr.po
161
po/sr.po
@ -8,8 +8,8 @@ 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: 2010-01-18 20:13+0000\n"
|
||||
"PO-Revision-Date: 2010-01-19 00:14+0000\n"
|
||||
"POT-Creation-Date: 2010-03-20 22:48+0000\n"
|
||||
"PO-Revision-Date: 2010-03-24 01:45+0100\n"
|
||||
"Last-Translator: Милош Поповић <gpopac@gmail.com>\n"
|
||||
"Language-Team: Serbian <gnom@prevod.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -27,78 +27,177 @@ msgid "Window management and application launching"
|
||||
msgstr "Управник прозорима и покретач програма"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:865
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "ПРОГРАМИ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ПОСТАВКЕ"
|
||||
|
||||
#: ../js/ui/appDisplay.js:647
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
msgid "New Window"
|
||||
msgstr "Нови прозор"
|
||||
|
||||
#: ../js/ui/appDisplay.js:651
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Уклони из омиљених"
|
||||
|
||||
#: ../js/ui/appDisplay.js:652
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Додај у омиљене"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1004
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Превуците овде како би додали у омиљене"
|
||||
|
||||
#: ../js/ui/dash.js:240
|
||||
msgid "Find..."
|
||||
msgstr "Нађи..."
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s је додат међу омиљене"
|
||||
|
||||
#: ../js/ui/dash.js:493
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
#| msgid "Remove from Favorites"
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s је уклоњен из омиљених"
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
#| msgid "Find..."
|
||||
msgid "Find"
|
||||
msgstr "Нађи"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
msgid "Searching..."
|
||||
msgstr "Тражим..."
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../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:885 ../js/ui/placeDisplay.js:519
|
||||
#: ../js/ui/dash.js:871 ../js/ui/placeDisplay.js:579
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "МЕСТА И УРЕЂАЈИ"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:892
|
||||
#: ../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:336
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Активности"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:549
|
||||
#. 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:144
|
||||
#: ../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:245
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Унесите наредбу:"
|
||||
|
||||
#: ../js/ui/runDialog.js:361
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#, 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 "Search"
|
||||
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"
|
||||
@ -112,11 +211,21 @@ msgstr "Програми"
|
||||
msgid "Recent Documents"
|
||||
msgstr "Скорашњи документи"
|
||||
|
||||
#: ../src/shell-global.c:890
|
||||
#: ../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“ је спреман"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Пре мање од једног минута"
|
||||
|
||||
#: ../src/shell-global.c:894
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -125,7 +234,7 @@ msgstr[1] "Пре %d минута"
|
||||
msgstr[2] "Пре %d минута"
|
||||
msgstr[3] "Пре %d минута"
|
||||
|
||||
#: ../src/shell-global.c:899
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -134,7 +243,7 @@ msgstr[1] "Пре %d сата"
|
||||
msgstr[2] "Пре %d сата"
|
||||
msgstr[3] "Пре %d сата"
|
||||
|
||||
#: ../src/shell-global.c:904
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -143,7 +252,7 @@ msgstr[1] "Пре %d дана"
|
||||
msgstr[2] "Пре %d дана"
|
||||
msgstr[3] "Пре %d дана"
|
||||
|
||||
#: ../src/shell-global.c:909
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
|
161
po/sr@latin.po
161
po/sr@latin.po
@ -8,8 +8,8 @@ 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: 2010-01-18 20:13+0000\n"
|
||||
"PO-Revision-Date: 2010-01-19 00:14+0000\n"
|
||||
"POT-Creation-Date: 2010-03-20 22:48+0000\n"
|
||||
"PO-Revision-Date: 2010-03-24 01:45+0100\n"
|
||||
"Last-Translator: Miloš Popović <gpopac@gmail.com>\n"
|
||||
"Language-Team: Serbian <gnom@prevod.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -27,78 +27,177 @@ msgid "Window management and application launching"
|
||||
msgstr "Upravnik prozorima i pokretač programa"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:865
|
||||
#: ../js/ui/appDisplay.js:311 ../js/ui/dash.js:852
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "PROGRAMI"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:343
|
||||
msgid "PREFERENCES"
|
||||
msgstr "POSTAVKE"
|
||||
|
||||
#: ../js/ui/appDisplay.js:647
|
||||
#: ../js/ui/appDisplay.js:728
|
||||
msgid "New Window"
|
||||
msgstr "Novi prozor"
|
||||
|
||||
#: ../js/ui/appDisplay.js:651
|
||||
#: ../js/ui/appDisplay.js:732
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Ukloni iz omiljenih"
|
||||
|
||||
#: ../js/ui/appDisplay.js:652
|
||||
#: ../js/ui/appDisplay.js:733
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Dodaj u omiljene"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1004
|
||||
#: ../js/ui/appDisplay.js:1085
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "Prevucite ovde kako bi dodali u omiljene"
|
||||
|
||||
#: ../js/ui/dash.js:240
|
||||
msgid "Find..."
|
||||
msgstr "Nađi..."
|
||||
#: ../js/ui/appFavorites.js:89
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s je dodat među omiljene"
|
||||
|
||||
#: ../js/ui/dash.js:493
|
||||
#: ../js/ui/appFavorites.js:107
|
||||
#, c-format
|
||||
#| msgid "Remove from Favorites"
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s je uklonjen iz omiljenih"
|
||||
|
||||
#: ../js/ui/dash.js:194
|
||||
#| msgid "Find..."
|
||||
msgid "Find"
|
||||
msgstr "Nađi"
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
msgid "Searching..."
|
||||
msgstr "Tražim..."
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../js/ui/dash.js:521
|
||||
msgid "No matching results."
|
||||
msgstr "Ništa nije pronađeno."
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:885 ../js/ui/placeDisplay.js:519
|
||||
#: ../js/ui/dash.js:871 ../js/ui/placeDisplay.js:579
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "MESTA I UREĐAJI"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:892
|
||||
#: ../js/ui/dash.js:878 ../js/ui/docDisplay.js:488
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "SKORAŠNJE STAVKE"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:363
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nisu instalirana proširenja"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:400
|
||||
msgid "Enabled"
|
||||
msgstr "Omogućeno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:402
|
||||
msgid "Disabled"
|
||||
msgstr "Onemogućeno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:404
|
||||
msgid "Error"
|
||||
msgstr "Greška"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:406
|
||||
msgid "Out of date"
|
||||
msgstr "Istekao je datum"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:431
|
||||
msgid "View Source"
|
||||
msgstr "Pogledaj izvor"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:437
|
||||
msgid "Web Page"
|
||||
msgstr "Internet stranica"
|
||||
|
||||
#: ../js/ui/overview.js:182
|
||||
msgid "Undo"
|
||||
msgstr "Opozovi"
|
||||
|
||||
#. 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:336
|
||||
#: ../js/ui/panel.js:385
|
||||
msgid "Activities"
|
||||
msgstr "Aktivnosti"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:549
|
||||
#. 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:144
|
||||
#: ../js/ui/placeDisplay.js:103
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "Ne mogu da demontiram „%s“"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:106
|
||||
msgid "Retry"
|
||||
msgstr "Ponovi"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:151
|
||||
msgid "Connect to..."
|
||||
msgstr "Poveži se na..."
|
||||
|
||||
#: ../js/ui/runDialog.js:245
|
||||
#: ../js/ui/runDialog.js:232
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Unesite naredbu:"
|
||||
|
||||
#: ../js/ui/runDialog.js:361
|
||||
#: ../js/ui/runDialog.js:374
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Nije uspelo pokretanje „%s“:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:107
|
||||
msgid "Available"
|
||||
msgstr "Dostupan"
|
||||
|
||||
#: ../js/ui/statusMenu.js:112
|
||||
msgid "Busy"
|
||||
msgstr "Zauzet"
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Invisible"
|
||||
msgstr "Nevidljiv"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Account Information..."
|
||||
msgstr "Podaci o nalogu..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:132
|
||||
#| msgid "Search"
|
||||
msgid "Sidebar"
|
||||
msgstr "Bočna traka"
|
||||
|
||||
#: ../js/ui/statusMenu.js:142
|
||||
msgid "System Preferences..."
|
||||
msgstr "Postavke sistema..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:151
|
||||
msgid "Lock Screen"
|
||||
msgstr "Zaključaj ekran"
|
||||
|
||||
#: ../js/ui/statusMenu.js:156
|
||||
msgid "Switch User"
|
||||
msgstr "Promeni korisnika"
|
||||
|
||||
#: ../js/ui/statusMenu.js:162
|
||||
msgid "Log Out..."
|
||||
msgstr "Odjavi me..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:167
|
||||
msgid "Shut Down..."
|
||||
msgstr "Isključi..."
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
@ -112,11 +211,21 @@ msgstr "Programi"
|
||||
msgid "Recent Documents"
|
||||
msgstr "Skorašnji dokumenti"
|
||||
|
||||
#: ../src/shell-global.c:890
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s je pokrenut"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "„%s“ je spreman"
|
||||
|
||||
#: ../src/shell-global.c:967
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "Pre manje od jednog minuta"
|
||||
|
||||
#: ../src/shell-global.c:894
|
||||
#: ../src/shell-global.c:971
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
@ -125,7 +234,7 @@ msgstr[1] "Pre %d minuta"
|
||||
msgstr[2] "Pre %d minuta"
|
||||
msgstr[3] "Pre %d minuta"
|
||||
|
||||
#: ../src/shell-global.c:899
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
@ -134,7 +243,7 @@ msgstr[1] "Pre %d sata"
|
||||
msgstr[2] "Pre %d sata"
|
||||
msgstr[3] "Pre %d sata"
|
||||
|
||||
#: ../src/shell-global.c:904
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
@ -143,7 +252,7 @@ msgstr[1] "Pre %d dana"
|
||||
msgstr[2] "Pre %d dana"
|
||||
msgstr[3] "Pre %d dana"
|
||||
|
||||
#: ../src/shell-global.c:909
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
|
337
po/th.po
Normal file
337
po/th.po
Normal file
@ -0,0 +1,337 @@
|
||||
# Thai translation for gnome-shell.
|
||||
# Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Sira Nokyoongtong <gumaraa@gmail.com>, 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: 2010-06-13 23:04+0000\n"
|
||||
"PO-Revision-Date: 2010-06-14 20:22+0700\n"
|
||||
"Last-Translator: Sira Nokyoongtong <gumaraa@gmail.com>\n"
|
||||
"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "นาฬิกา"
|
||||
|
||||
#: ../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 "Clock Preferences"
|
||||
msgstr "ปรับแต่งค่านาฬิกา"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:3
|
||||
msgid "Panel Display"
|
||||
msgstr "การแสดงบนพาเนล"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:4
|
||||
msgid "Show seco_nds"
|
||||
msgstr "แสดง_วินาที"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:5
|
||||
msgid "Show the _date"
|
||||
msgstr "แสดงวัน_ที่"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:6
|
||||
msgid "_12 hour format"
|
||||
msgstr "แ_บบ AM/PM"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "แบบ _24 ขั่วโมง"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:872
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "โปรแกรม"
|
||||
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "ปรับแต่ง"
|
||||
|
||||
#: ../js/ui/appDisplay.js:726
|
||||
msgid "New Window"
|
||||
msgstr "หน้าต่างใหม่"
|
||||
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "ลบออกจากรายการโปรด"
|
||||
|
||||
#: ../js/ui/appDisplay.js:731
|
||||
msgid "Add to Favorites"
|
||||
msgstr "เพิ่มเข้าในรายการโปรด"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1038
|
||||
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:204
|
||||
msgid "Find"
|
||||
msgstr "หา"
|
||||
|
||||
#: ../js/ui/dash.js:527
|
||||
msgid "Searching..."
|
||||
msgstr "กำลังค้นหา..."
|
||||
|
||||
#: ../js/ui/dash.js:541
|
||||
msgid "No matching results."
|
||||
msgstr "ไม่มีผลลัพธ์ที่ตรงกัน"
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:891 ../js/ui/placeDisplay.js:551
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr ""
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:898 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:475
|
||||
msgid "No extensions installed"
|
||||
msgstr "ไม่มีส่วนขยายติดตั้งอยู่"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:516
|
||||
msgid "Error"
|
||||
msgstr "ผิดพลาด"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:518
|
||||
msgid "Out of date"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:543
|
||||
msgid "View Source"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/lookingGlass.js:549
|
||||
msgid "Web Page"
|
||||
msgstr "หน้าเว็บ"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "เรียกคืน"
|
||||
|
||||
#: ../js/ui/panel.js:334
|
||||
#, c-format
|
||||
msgid "Quit %s"
|
||||
msgstr "ออกจาก %s"
|
||||
|
||||
#: ../js/ui/panel.js:354
|
||||
msgid "Preferences"
|
||||
msgstr "ปรับแต่ง"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:441
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/panel.js:442
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:446
|
||||
msgid "%a %R:%S"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/panel.js:447
|
||||
msgid "%a %R"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:454
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/panel.js:455
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:459
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/panel.js:460
|
||||
msgid "%a %l:%M %p"
|
||||
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:562
|
||||
msgid "Activities"
|
||||
msgstr "กิจกรรม"
|
||||
|
||||
#: ../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:235
|
||||
msgid "Please enter a command:"
|
||||
msgstr "โปรดป้อนคำสั่ง:"
|
||||
|
||||
#: ../js/ui/runDialog.js:380
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "ข้อมูลบัญชี..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "ปรับแต่งระบบ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "ล็อคหน้าจอ"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "สลับผู้ใช้"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "ออกจากระบบ..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
msgid "Shut Down..."
|
||||
msgstr "ปิดเครื่อง..."
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:47
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:49
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "'%s' พร้อมแล้ว"
|
||||
|
||||
#: ../js/ui/workspacesView.js:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "ไม่สามารถลบพื้นที่ทำงานแรกได้"
|
||||
|
||||
#: ../src/shell-global.c:1025
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "ไม่ถึงหนึ่งนาทีก่อน"
|
||||
|
||||
#: ../src/shell-global.c:1029
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d นาทีก่อน"
|
||||
|
||||
#: ../src/shell-global.c:1034
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d ชั่วโมงก่อน"
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d วันก่อน"
|
||||
|
||||
#: ../src/shell-global.c:1044
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%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 ""
|
280
po/uk.po
Normal file
280
po/uk.po
Normal file
@ -0,0 +1,280 @@
|
||||
# Ukrainian translation for gnome-shell.
|
||||
# Copyright (C) 2010 Free Software Foundation
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Maxim V. Dziumanenko <dziumanenko@gmail.com>, 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: 2010-03-31 13:32+0000\n"
|
||||
"PO-Revision-Date: 2010-03-31 13:32+0000\n"
|
||||
"Last-Translator: Maxim V. Dziumanenko <dziumanenko@gmail.com>\n"
|
||||
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Керування вікнами та запуск програм"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../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:734
|
||||
msgid "New Window"
|
||||
msgstr "Нове вікно"
|
||||
|
||||
#: ../js/ui/appDisplay.js:738
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Видалити з улюбленого"
|
||||
|
||||
#: ../js/ui/appDisplay.js:739
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Додати до улюбленого"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1091
|
||||
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:874 ../js/ui/placeDisplay.js:543
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "МІСЦЯ ТА ПРИСТРОЇ"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:881 ../js/ui/docDisplay.js:489
|
||||
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:388
|
||||
msgid "Activities"
|
||||
msgstr "Дії"
|
||||
|
||||
#. 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, %H:%M"
|
||||
|
||||
#: ../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 "Введіть команду:"
|
||||
|
||||
#: ../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 "%H:%M"
|
||||
|
||||
#: ../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 "'%s' готовий"
|
||||
|
||||
#: ../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 хвилини тому"
|
||||
msgstr[2] "%d хвилин тому"
|
||||
|
||||
#: ../src/shell-global.c:976
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d година тому"
|
||||
msgstr[1] "%d години тому"
|
||||
msgstr[2] "%d годин тому"
|
||||
|
||||
#: ../src/shell-global.c:981
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d день тому"
|
||||
msgstr[1] "%d дні тому"
|
||||
msgstr[2] "%d днів тому"
|
||||
|
||||
#: ../src/shell-global.c:986
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%d тиждень тому"
|
||||
msgstr[1] "%d тижні тому"
|
||||
msgstr[2] "%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"
|
||||
|
||||
|
453
po/zh_CN.po
453
po/zh_CN.po
@ -3,15 +3,17 @@
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Ray Wang <raywang@gnome.org>, 2009.
|
||||
# jiero <lililjlj@gmail.com>, 2010.
|
||||
# YunQiang Su <wzssyqa@gmail.com>, 2010.
|
||||
# Aron Xu <aronxu@gnome.org>, 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: 2010-01-15 17:17+0000\n"
|
||||
"PO-Revision-Date: 2010-01-17 15:30+0800\n"
|
||||
"Last-Translator: jiero <lililjlj@gmail.com>\n"
|
||||
"Language-Team: Simplified Chinese <i10n>\n"
|
||||
"POT-Creation-Date: 2010-06-25 20:49+0000\n"
|
||||
"PO-Revision-Date: 2010-06-27 11:06+0800\n"
|
||||
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
|
||||
"Language-Team: Simplified Chinese <i18n-zh@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: UTF-8\n"
|
||||
@ -25,117 +27,445 @@ msgstr "GNOME Shell"
|
||||
msgid "Window management and application launching"
|
||||
msgstr "窗口管理和应用程序启动"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "时钟"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "自定义面板时钟"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr "允许使用 Alt-F2 对话框访问内部调试和监视工具。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "自定义面板时钟格式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr "启用从 Alt-F2 调用对开发者和测试者有用的内部工具"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "存储屏幕录像的文件扩展名"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "屏幕录像的帧率。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr "GNOME Shell 扩展有一个 uuid 属性,此键列出了不应该加载的扩展。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "命令对话框(Alt-F2)的历史记录"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "小时格式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr "如果为真并且格式为 12 时制或 24 时制,在时钟中显示日期以及时间。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr "如果为真并且格式为 12 时制或 24 时制,在时钟中显示秒。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "如果为真,在日历中显示 ISO 周日期。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "收藏夹中的应用程序的 desktop 文件 ID 的列表"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "工作区视图模式的总览"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "显示日期"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "在日历中显示星期"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "显示秒"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr "符合这些标示的应用程序将显示在收藏区中。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"录制的屏幕录像的文件名将是根据当前时间得到的独特值,并使用这个扩展名。录制另"
|
||||
"外一个不同容器格式的录像时,它应该被更改。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr "GNOME Shell 的屏幕录像程序录制的屏幕录像的帧率,以 帧/秒 为格式。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "用于编码屏幕录像的 GStreamer 管线"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"总览中,选中的工作区的试图模式。支持的值有 \"single\"(单独) 和 \"grid\"(网"
|
||||
"格)。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"Gnome shell 一般将监视活动应用程序,以便呈现最常用的(例如,在启动器中)。同"
|
||||
"时,此数据将保持私密,您可能因为隐私原因想要禁用此项。请注意,这么做,并不会"
|
||||
"移除已经保存的数据。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"格式(format)键设置“custom”(自定义)时,这个键指定面板时钟的格式。您可以使用可"
|
||||
"以被 strftime() 理解的转义符获取特定的格式。请查看 strftime() 的文档获取更多"
|
||||
"信息。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"此键指定面板时钟使用的时间格式。可能的值为 \"12-hour\"、\"24-hour\"、\"unix"
|
||||
"\" 和 \"custom\"。如果设为 unix,时钟将显示从 Epoch(也就是 1970-1-1 UTC)开始"
|
||||
"的秒数。如果设为 \"custom\",时钟将根据在 custom_format 键中设定的格式规则显"
|
||||
"示时间。注意,如果设置为 \"unix\" 或 \"custom\",show_date 和 show_seconds 键"
|
||||
"将被忽略。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "要禁用的扩展的 uuid"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "是否收集应用程序的使用情况"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "时钟格式"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
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 "_12 时格式"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24 小时格式"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:252 ../js/ui/dash.js:865
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:767
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "应用程序"
|
||||
|
||||
#: ../js/ui/appDisplay.js:276
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "首选项"
|
||||
|
||||
#: ../js/ui/appDisplay.js:644
|
||||
#: ../js/ui/appDisplay.js:725
|
||||
msgid "New Window"
|
||||
msgstr "新窗口"
|
||||
|
||||
#: ../js/ui/appDisplay.js:648
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "从收藏夹中移除"
|
||||
|
||||
#: ../js/ui/appDisplay.js:649
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Add to Favorites"
|
||||
msgstr "添加到收藏夹"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1001
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "拖到这里加入收藏"
|
||||
msgstr "拖到这里加入收藏夹"
|
||||
|
||||
#: ../js/ui/dash.js:240
|
||||
msgid "Find..."
|
||||
msgstr "查找..."
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s 已经添加到了您的收藏夹。"
|
||||
|
||||
#: ../js/ui/dash.js:493
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s 已经从您的收藏夹移除。"
|
||||
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "查找"
|
||||
|
||||
#: ../js/ui/dash.js:465
|
||||
msgid "Searching..."
|
||||
msgstr "搜索..."
|
||||
msgstr "正在搜索..."
|
||||
|
||||
#: ../js/ui/dash.js:507
|
||||
#: ../js/ui/dash.js:479
|
||||
msgid "No matching results."
|
||||
msgstr ""
|
||||
msgstr "无匹配结果。"
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:885 ../js/ui/placeDisplay.js:519
|
||||
#: ../js/ui/dash.js:786 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr ""
|
||||
msgstr "位置和设备"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:892
|
||||
#, fuzzy
|
||||
#| msgid "RECENT DOCUMENTS"
|
||||
#: ../js/ui/dash.js:793 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "最近的文档"
|
||||
msgstr "最近的项目"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "未安装扩展"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "启用"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "禁用"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "错误"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "过时"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "查看源"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "网页"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "撤销"
|
||||
|
||||
#: ../js/ui/panel.js:519
|
||||
msgid "Preferences"
|
||||
msgstr "首选项"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:605
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%A %b %e, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:606
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%A %m月%d日 %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:610
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%A %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:611
|
||||
msgid "%a %R"
|
||||
msgstr "%A %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%A %m月%d日 %p%I:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:619
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%A %m月%d日 %p%I:%M"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:623
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%A %p%I:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:624
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#. 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:336
|
||||
#: ../js/ui/panel.js:762
|
||||
msgid "Activities"
|
||||
msgstr "活动"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/panel.js:549
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%A %H:%M"
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "卸载 %s 失败"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:144
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "重试"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "连接到..."
|
||||
|
||||
#: ../js/ui/runDialog.js:245
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "请输入一个命令:"
|
||||
|
||||
#: ../js/ui/runDialog.js:361
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "运行“%s”失败"
|
||||
msgstr "运行“%s”失败:"
|
||||
|
||||
#. Translators: This is a time format.
|
||||
#: ../js/ui/widget.js:163
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "可用"
|
||||
|
||||
#: ../js/ui/widget.js:317
|
||||
msgid "Applications"
|
||||
msgstr "应用程序"
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "忙碌"
|
||||
|
||||
#: ../js/ui/widget.js:339
|
||||
msgid "Recent Documents"
|
||||
msgstr "最近文档"
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "隐身"
|
||||
|
||||
#: ../src/shell-global.c:890
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "帐户信息..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "系统首选项..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "锁住屏幕"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "切换用户"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "退出..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
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:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "无法添加新工作区,因为已经达到了工作区数量限制。"
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "不能移除第一个工作区。"
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "少于一分钟前"
|
||||
|
||||
#: ../src/shell-global.c:894
|
||||
#: ../src/shell-global.c:1043
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d 分钟前"
|
||||
|
||||
#: ../src/shell-global.c:899
|
||||
#: ../src/shell-global.c:1048
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d 小时前"
|
||||
|
||||
#: ../src/shell-global.c:904
|
||||
#: ../src/shell-global.c:1053
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d 天前"
|
||||
|
||||
#: ../src/shell-global.c:909
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
@ -165,6 +495,15 @@ msgstr "搜索"
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "应用程序"
|
||||
|
||||
#~ msgid "Recent Documents"
|
||||
#~ msgstr "最近文档"
|
||||
|
||||
#~ msgid "PLACES"
|
||||
#~ msgstr "位置"
|
||||
|
||||
@ -189,23 +528,5 @@ msgstr "%1$s: %2$s"
|
||||
#~ msgid "Can't logout: %s"
|
||||
#~ msgstr "不能退出:%s"
|
||||
|
||||
#~ msgid "Account Information..."
|
||||
#~ msgstr "帐户信息..."
|
||||
|
||||
#~ msgid "Sidebar"
|
||||
#~ msgstr "侧边栏"
|
||||
|
||||
#~ msgid "System Preferences..."
|
||||
#~ msgstr "系统首选项..."
|
||||
|
||||
#~ msgid "Lock Screen"
|
||||
#~ msgstr "锁住屏幕"
|
||||
|
||||
#~ msgid "Switch User"
|
||||
#~ msgstr "切换用户"
|
||||
|
||||
#~ msgid "Log Out..."
|
||||
#~ msgstr "退出..."
|
||||
|
||||
#~ msgid "Shut Down..."
|
||||
#~ msgstr "关机..."
|
||||
|
478
po/zh_HK.po
Normal file
478
po/zh_HK.po
Normal file
@ -0,0 +1,478 @@
|
||||
# Chinese (Hong Kong) translation for gnome-shell.
|
||||
# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 2.31.4\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-07-12 19:23+0800\n"
|
||||
"PO-Revision-Date: 2010-07-12 19:24+0800\n"
|
||||
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
|
||||
"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "視窗管理與應用程式的執行"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "時鐘"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "自選面板時鐘"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr "允許使用 Alt-F2 對話盒存取內部除錯和監控工具。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "自選時鐘的格式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr "啟用讓開發者與測試者能以 Alt-F2 使用好用的內部工具"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "用來儲存畫面廣播的延伸檔名"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr "GNOME Shell 擴充功能有 uuid 屬性;這個設定鍵列出了不應載入的擴充功能。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "指令 (Alt-F2) 對話盒歷史紀錄"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "小時格式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr "如果設為 true 且格式為「12-小時」或「24-小時」,在時鐘裏顯示日期,加在時刻後面。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr "如果設為 true 且格式為「12-小時」或「24-小時」,在時刻裏顯示秒鐘。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "如果設為 true,在日曆中顯示 ISO 週數。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "喜好的應用程式桌面檔案 ID 清單"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "概覽工作區檢視模式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "在時鐘內顯示日期"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "在日曆中顯示週數"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "在時刻中顯示秒數"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr "對應這些辨別碼的應用程式會顯示在喜好區域。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr "錄製好的畫面廣播檔案名稱會以目前的時刻作為獨特的檔名,並使用這個延伸檔名。當錄製為不同的容器格式時應該做適當更改。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "用來編碼畫面廣播的 gstreamer 管線"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr "在概覽中選取的工作區檢視模式。支援的數值有「single」(單一)和「grid」(格線)。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr "這個 shell 通常會監控使用中的應用程式以便能顯示出最常使用的(例如,在程式執行器中)。雖然這個資料會保持隱密,但是你可能會基於私隱的理由想要停用這個功能。請注意這麼做並不會移除已儲存的資料。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr "這個設定鍵是在面板時鐘的「format」設定鍵被設為「custom」時使用的自選格式。你可以用可被 strftime() 理解的轉換規範來取得所指定的格式。請查閱 strftime() 手冊以獲取更多資訊。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "要停用的延伸檔名 Uuid"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "是否收集關於應用程式使用率的狀態"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "時鐘格式"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
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 "_12 小時制"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24 小時制"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:777
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "程式集"
|
||||
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "偏好設定"
|
||||
|
||||
#: ../js/ui/appDisplay.js:725
|
||||
msgid "New Window"
|
||||
msgstr "新視窗"
|
||||
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "自喜好中移除"
|
||||
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Add to Favorites"
|
||||
msgstr "加入喜好"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "拖放到這裏加入喜好"
|
||||
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s 已加入你的喜好中。"
|
||||
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s 已經從你的喜好中移除。"
|
||||
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "尋找"
|
||||
|
||||
#: ../js/ui/dash.js:475
|
||||
msgid "Searching..."
|
||||
msgstr "搜尋中..."
|
||||
|
||||
#: ../js/ui/dash.js:489
|
||||
msgid "No matching results."
|
||||
msgstr "沒有相符的結果。"
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:796 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "位置 & 裝置"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:803 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "最近使用項目"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "沒有安裝擴充功能"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "已啟用"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "已停用"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "錯誤"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "過期"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "檢示來源"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "網頁"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "復原"
|
||||
|
||||
#: ../js/ui/panel.js:517
|
||||
msgid "Preferences"
|
||||
msgstr "偏好設定"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:603
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%b %e %a, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:604
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%b %e %a, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:608
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:609
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%b %e %a, %p %l:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:617
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%b %e %a, %p %l:%M"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:621
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %p %l:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:622
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %p %l:%M"
|
||||
|
||||
#. 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:760
|
||||
msgid "Activities"
|
||||
msgstr "概覽 "
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "無法卸載「%s」"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "重試"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "連接到..."
|
||||
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "請輸入指令:"
|
||||
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "執行「%s」失敗:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "可用"
|
||||
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "忙碌"
|
||||
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "隱形"
|
||||
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "帳號資訊..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "系統偏好設定..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "鎖定畫面"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "切換使用者"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "登出..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
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:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "不能加入新的工作區,因為已達到最大工作區上限。"
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "不能移除第一個工作區。"
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "少於一分鐘之前"
|
||||
|
||||
#: ../src/shell-global.c:1043
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d 分鐘前"
|
||||
|
||||
#: ../src/shell-global.c:1048
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d 小時前"
|
||||
|
||||
#: ../src/shell-global.c:1053
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d 天前"
|
||||
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%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"
|
489
po/zh_TW.po
Normal file
489
po/zh_TW.po
Normal file
@ -0,0 +1,489 @@
|
||||
# Chinese (Taiwan) translation for gnome-shell.
|
||||
# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 2.31.4\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-07-12 19:23+0800\n"
|
||||
"PO-Revision-Date: 2010-07-12 07:31+0800\n"
|
||||
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
|
||||
"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "視窗管理與應用程式的執行"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||
msgid "Clock"
|
||||
msgstr "時鐘"
|
||||
|
||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||
msgid "Customize the panel clock"
|
||||
msgstr "自訂面板時鐘"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||
msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr "允許使用 Alt-F2 對話盒存取內部除錯和監控工具。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||
msgid "Custom format of the clock"
|
||||
msgstr "自訂時鐘的格式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
msgstr "啟用讓開發者與測試者能以 Alt-F2 使用好用的內部工具"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "用來儲存畫面廣播的延伸檔名"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should not be loaded."
|
||||
msgstr "GNOME Shell 擴充功能有 uuid 屬性;這個設定鍵列出了不應載入的擴充功能。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "指令 (Alt-F2) 對話盒歷史紀錄"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||
msgid "Hour format"
|
||||
msgstr "小時格式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||
"clock, in addition to time."
|
||||
msgstr ""
|
||||
"如果設為 true 且格式為「12-小時」或「24-小時」,在時鐘裡顯示日期,加在時刻後"
|
||||
"面。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||
"time."
|
||||
msgstr "如果設為 true 且格式為「12-小時」或「24-小時」,在時刻裡顯示秒鐘。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "如果設為 true,在日曆中顯示 ISO 週數。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "喜好的應用程式桌面檔案 ID 清單"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||
msgid "Overview workspace view mode"
|
||||
msgstr "概覽工作區檢視模式"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||
msgid "Show date in clock"
|
||||
msgstr "在時鐘內顯示日期"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "在日曆中顯示週數"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||
msgid "Show time with seconds"
|
||||
msgstr "在時刻中顯示秒數"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr "對應這些辨別碼的應用程式會顯示在喜好區域。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"錄製好的畫面廣播檔案名稱會以目前的時刻作為獨特的檔名,並使用這個延伸檔名。當"
|
||||
"錄製為不同的容器格式時應該做適當變更。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "用來編碼畫面廣播的 gstreamer 管線"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||
msgid ""
|
||||
"The selected workspace view mode in the overview. Supported values are "
|
||||
"\"single\" and \"grid\"."
|
||||
msgstr ""
|
||||
"在概覽中選取的工作區檢視模式。支援的數值有「single」(單一)和「grid」(格線)。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||
msgid ""
|
||||
"The shell normally monitors active applications in order to present the most "
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"這個 shell 通常會監控使用中的應用程式以便能顯示出最常使用的(例如,在程式執行"
|
||||
"器中)。雖然這個資料會保持隱密,但是您可能會基於隱私的理由想要停用這個功能。"
|
||||
"請注意這麼做並不會移除已儲存的資料。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"這個設定鍵是在面板時鐘的「format」設定鍵被設為「custom」時使用的自訂格式。您"
|
||||
"可以用可被 strftime() 理解的轉換規範來取得所指定的格式。請查閱 strftime() 手"
|
||||
"冊以獲取更多資訊。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||
msgid "Uuids of extensions to disable"
|
||||
msgstr "要停用的延伸檔名 Uuid"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "是否收集關於應用程式使用率的狀態"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:1
|
||||
msgid "Clock Format"
|
||||
msgstr "時鐘格式"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:2
|
||||
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 "_12 小時制"
|
||||
|
||||
#: ../data/clock-preferences.ui.h:7
|
||||
msgid "_24 hour format"
|
||||
msgstr "_24 小時制"
|
||||
|
||||
#. **** Applications ****
|
||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:777
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "程式集"
|
||||
|
||||
#: ../js/ui/appDisplay.js:420
|
||||
msgid "PREFERENCES"
|
||||
msgstr "偏好設定"
|
||||
|
||||
#: ../js/ui/appDisplay.js:725
|
||||
msgid "New Window"
|
||||
msgstr "新視窗"
|
||||
|
||||
#: ../js/ui/appDisplay.js:729
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "自喜好中移除"
|
||||
|
||||
#: ../js/ui/appDisplay.js:730
|
||||
msgid "Add to Favorites"
|
||||
msgstr "加入喜好"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1037
|
||||
msgid "Drag here to add favorites"
|
||||
msgstr "拖放到這裡加入喜好"
|
||||
|
||||
#: ../js/ui/appFavorites.js:88
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s 已加入您的喜好中。"
|
||||
|
||||
#: ../js/ui/appFavorites.js:106
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s 已經從您的喜好中移除。"
|
||||
|
||||
#: ../js/ui/dash.js:146
|
||||
msgid "Find"
|
||||
msgstr "尋找"
|
||||
|
||||
#: ../js/ui/dash.js:475
|
||||
msgid "Searching..."
|
||||
msgstr "搜尋中..."
|
||||
|
||||
#: ../js/ui/dash.js:489
|
||||
msgid "No matching results."
|
||||
msgstr "沒有相符的結果。"
|
||||
|
||||
#. **** Places ****
|
||||
#. Translators: This is in the sense of locations for documents,
|
||||
#. network locations, etc.
|
||||
#: ../js/ui/dash.js:796 ../js/ui/placeDisplay.js:552
|
||||
msgid "PLACES & DEVICES"
|
||||
msgstr "位置 & 裝置"
|
||||
|
||||
#. **** Documents ****
|
||||
#: ../js/ui/dash.js:803 ../js/ui/docDisplay.js:497
|
||||
msgid "RECENT ITEMS"
|
||||
msgstr "最近使用項目"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:471
|
||||
msgid "No extensions installed"
|
||||
msgstr "沒有安裝擴充功能"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:508
|
||||
msgid "Enabled"
|
||||
msgstr "已啟用"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:510
|
||||
msgid "Disabled"
|
||||
msgstr "已停用"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:512
|
||||
msgid "Error"
|
||||
msgstr "錯誤"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:514
|
||||
msgid "Out of date"
|
||||
msgstr "過期"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:539
|
||||
msgid "View Source"
|
||||
msgstr "檢示來源"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:545
|
||||
msgid "Web Page"
|
||||
msgstr "網頁"
|
||||
|
||||
#: ../js/ui/overview.js:165
|
||||
msgid "Undo"
|
||||
msgstr "復原"
|
||||
|
||||
#: ../js/ui/panel.js:517
|
||||
msgid "Preferences"
|
||||
msgstr "偏好設定"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:603
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%b %e %a, %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:604
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%b %e %a, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/panel.js:608
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/panel.js:609
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:616
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%b %e %a, %p %l:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:617
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%b %e %a, %p %l:%M"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/panel.js:621
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %p %l:%M:%S"
|
||||
|
||||
#: ../js/ui/panel.js:622
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %p %l:%M"
|
||||
|
||||
#. 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:760
|
||||
msgid "Activities"
|
||||
msgstr "概覽 "
|
||||
|
||||
#: ../js/ui/placeDisplay.js:109
|
||||
#, c-format
|
||||
msgid "Failed to unmount '%s'"
|
||||
msgstr "無法卸載「%s」"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:112
|
||||
msgid "Retry"
|
||||
msgstr "重試"
|
||||
|
||||
#: ../js/ui/placeDisplay.js:157
|
||||
msgid "Connect to..."
|
||||
msgstr "連接到..."
|
||||
|
||||
#: ../js/ui/runDialog.js:234
|
||||
msgid "Please enter a command:"
|
||||
msgstr "請輸入指令:"
|
||||
|
||||
#: ../js/ui/runDialog.js:379
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "執行「%s」失敗:"
|
||||
|
||||
#: ../js/ui/statusMenu.js:91
|
||||
msgid "Available"
|
||||
msgstr "可用"
|
||||
|
||||
#: ../js/ui/statusMenu.js:95
|
||||
msgid "Busy"
|
||||
msgstr "忙碌"
|
||||
|
||||
#: ../js/ui/statusMenu.js:99
|
||||
msgid "Invisible"
|
||||
msgstr "隱形"
|
||||
|
||||
#: ../js/ui/statusMenu.js:106
|
||||
msgid "Account Information..."
|
||||
msgstr "帳號資訊..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:110
|
||||
msgid "System Preferences..."
|
||||
msgstr "系統偏好設定..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:117
|
||||
msgid "Lock Screen"
|
||||
msgstr "鎖定畫面"
|
||||
|
||||
#: ../js/ui/statusMenu.js:121
|
||||
msgid "Switch User"
|
||||
msgstr "切換使用者"
|
||||
|
||||
#: ../js/ui/statusMenu.js:126
|
||||
msgid "Log Out..."
|
||||
msgstr "登出..."
|
||||
|
||||
#: ../js/ui/statusMenu.js:130
|
||||
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:237
|
||||
msgid ""
|
||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||
msgstr "不能加入新的工作區,因為已達到最大工作區上限。"
|
||||
|
||||
#: ../js/ui/workspacesView.js:254
|
||||
msgid "Can't remove the first workspace."
|
||||
msgstr "不能移除第一個工作區。"
|
||||
|
||||
#: ../src/shell-global.c:1039
|
||||
msgid "Less than a minute ago"
|
||||
msgstr "少於一分鐘之前"
|
||||
|
||||
#: ../src/shell-global.c:1043
|
||||
#, c-format
|
||||
msgid "%d minute ago"
|
||||
msgid_plural "%d minutes ago"
|
||||
msgstr[0] "%d 分鐘前"
|
||||
|
||||
#: ../src/shell-global.c:1048
|
||||
#, c-format
|
||||
msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d 小時前"
|
||||
|
||||
#: ../src/shell-global.c:1053
|
||||
#, c-format
|
||||
msgid "%d day ago"
|
||||
msgid_plural "%d days ago"
|
||||
msgstr[0] "%d 天前"
|
||||
|
||||
#: ../src/shell-global.c:1058
|
||||
#, c-format
|
||||
msgid "%d week ago"
|
||||
msgid_plural "%d weeks ago"
|
||||
msgstr[0] "%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"
|
@ -1,68 +0,0 @@
|
||||
big_cflags = \
|
||||
-I$(top_srcdir)/src \
|
||||
-DPREFIX=\""$(prefix)"\" \
|
||||
-DLIBDIR=\""$(libdir)"\" \
|
||||
-DG_DISABLE_DEPRECATED \
|
||||
-DG_LOG_DOMAIN=\"Big\" \
|
||||
$(BIG_CFLAGS) \
|
||||
$(NULL)
|
||||
|
||||
big_built_sources = \
|
||||
big-enum-types.h \
|
||||
big-enum-types.c \
|
||||
$(NULL)
|
||||
|
||||
BUILT_SOURCES += $(big_built_sources)
|
||||
|
||||
BIG_STAMP_FILES = stamp-big-marshal.h stamp-big-enum-types.h
|
||||
|
||||
# please, keep this sorted alphabetically
|
||||
big_source_h = \
|
||||
big/box.h \
|
||||
big/rectangle.h \
|
||||
big/theme-image.h \
|
||||
$(NULL)
|
||||
|
||||
# please, keep this sorted alphabetically
|
||||
big_source_c = \
|
||||
big/box.c \
|
||||
big/rectangle.c \
|
||||
big/theme-image.c \
|
||||
$(NULL)
|
||||
|
||||
big-enum-types.h: stamp-big-enum-types.h Makefile
|
||||
@true
|
||||
stamp-big-enum-types.h: $(big_source_h) big/big-enum-types.h.in
|
||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||
$(GLIB_MKENUMS) \
|
||||
--template $(srcdir)/big/big-enum-types.h.in \
|
||||
$(big_source_h) ) >> xgen-beth && \
|
||||
(cmp -s xgen-beth big-enum-types.h || cp xgen-beth big-enum-types.h) && \
|
||||
rm -f xgen-beth && \
|
||||
echo timestamp > $(@F)
|
||||
|
||||
big-enum-types.c: stamp-big-enum-types.h big/big-enum-types.c.in
|
||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||
$(GLIB_MKENUMS) \
|
||||
--template $(srcdir)/big/big-enum-types.c.in \
|
||||
$(big_source_h) ) >> xgen-betc && \
|
||||
cp xgen-betc big-enum-types.c && \
|
||||
rm -f xgen-betc
|
||||
|
||||
noinst_LTLIBRARIES += libbig-1.0.la
|
||||
|
||||
libbig_1_0_la_LIBADD = $(BIG_LIBS)
|
||||
libbig_1_0_la_SOURCES = \
|
||||
$(big_source_c) \
|
||||
$(big_source_h) \
|
||||
$(big_built_sources) \
|
||||
$(NULL)
|
||||
libbig_1_0_la_CPPFLAGS = $(big_cflags)
|
||||
libbig_1_0_la_LDFLAGS = $(LDADD)
|
||||
|
||||
CLEANFILES += $(BIG_STAMP_FILES) $(BUILT_SOURCES)
|
||||
|
||||
EXTRA_DIST += \
|
||||
big/README \
|
||||
big/big-enum-types.h.in \
|
||||
big/big-enum-types.c.in
|
@ -74,8 +74,10 @@ st_source_h = \
|
||||
st/st-button.h \
|
||||
st/st-clickable.h \
|
||||
st/st-clipboard.h \
|
||||
st/st-container.h \
|
||||
st/st-drawing-area.h \
|
||||
st/st-entry.h \
|
||||
st/st-group.h \
|
||||
st/st-im-text.h \
|
||||
st/st-label.h \
|
||||
st/st-overflow-box.h \
|
||||
@ -83,13 +85,11 @@ st_source_h = \
|
||||
st/st-scrollable.h \
|
||||
st/st-scroll-bar.h \
|
||||
st/st-scroll-view.h \
|
||||
st/st-shadow-texture.h \
|
||||
st/st-shadow.h \
|
||||
st/st-subtexture.h \
|
||||
st/st-table.h \
|
||||
st/st-table-child.h \
|
||||
st/st-texture-cache.h \
|
||||
st/st-texture-frame.h \
|
||||
st/st-theme.h \
|
||||
st/st-theme-context.h \
|
||||
st/st-theme-node.h \
|
||||
@ -109,7 +109,9 @@ BUILT_SOURCES += st.h
|
||||
st_source_private_h = \
|
||||
st/st-private.h \
|
||||
st/st-table-private.h \
|
||||
st/st-theme-private.h
|
||||
st/st-theme-private.h \
|
||||
st/st-theme-node-private.h \
|
||||
st/st-theme-node-transition.h
|
||||
|
||||
# please, keep this sorted alphabetically
|
||||
st_source_c = \
|
||||
@ -121,8 +123,10 @@ st_source_c = \
|
||||
st/st-button.c \
|
||||
st/st-clickable.c \
|
||||
st/st-clipboard.c \
|
||||
st/st-container.c \
|
||||
st/st-drawing-area.c \
|
||||
st/st-entry.c \
|
||||
st/st-group.c \
|
||||
st/st-im-text.c \
|
||||
st/st-label.c \
|
||||
st/st-overflow-box.c \
|
||||
@ -130,23 +134,23 @@ st_source_c = \
|
||||
st/st-scrollable.c \
|
||||
st/st-scroll-bar.c \
|
||||
st/st-scroll-view.c \
|
||||
st/st-shadow-texture.c \
|
||||
st/st-shadow.c \
|
||||
st/st-subtexture.c \
|
||||
st/st-table.c \
|
||||
st/st-table-child.c \
|
||||
st/st-texture-cache.c \
|
||||
st/st-texture-frame.c \
|
||||
st/st-theme.c \
|
||||
st/st-theme-context.c \
|
||||
st/st-theme-node.c \
|
||||
st/st-theme-node-drawing.c \
|
||||
st/st-theme-node-transition.c \
|
||||
st/st-tooltip.c \
|
||||
st/st-widget.c \
|
||||
$(NULL)
|
||||
|
||||
noinst_LTLIBRARIES += libst-1.0.la
|
||||
|
||||
libst_1_0_la_LIBADD = $(ST_LIBS)
|
||||
libst_1_0_la_LIBADD = -lm $(ST_LIBS)
|
||||
libst_1_0_la_SOURCES = \
|
||||
$(st_source_c) \
|
||||
$(st_source_private_h) \
|
||||
|
@ -15,6 +15,7 @@ TRAY_STAMP_FILES = stamp-na-marshal.h
|
||||
|
||||
# please, keep this sorted alphabetically
|
||||
tray_source = \
|
||||
gtk-compat.h \
|
||||
tray/na-tray-child.c \
|
||||
tray/na-tray-child.h \
|
||||
tray/na-tray-manager.c \
|
||||
|
187
src/Makefile.am
187
src/Makefile.am
@ -8,10 +8,11 @@ noinst_PROGRAMS =
|
||||
|
||||
.AUTOPARALLEL:
|
||||
|
||||
bin_SCRIPTS = gnome-shell
|
||||
bin_SCRIPTS = gnome-shell gnome-shell-clock-preferences
|
||||
|
||||
gnome-shell: gnome-shell.in
|
||||
$(AM_V_GEN) sed -e "s|@MUTTER_BIN_DIR[@]|$(MUTTER_BIN_DIR)|" \
|
||||
-e "s|@datadir[@]|$(datadir)|" \
|
||||
-e "s|@GJS_JS_DIR[@]|$(GJS_JS_DIR)|" \
|
||||
-e "s|@GJS_JS_NATIVE_DIR[@]|$(GJS_JS_NATIVE_DIR)|" \
|
||||
-e "s|@libexecdir[@]|$(libexecdir)|" \
|
||||
@ -24,7 +25,15 @@ gnome-shell: gnome-shell.in
|
||||
CLEANFILES += gnome-shell
|
||||
EXTRA_DIST += gnome-shell.in
|
||||
|
||||
include Makefile-big.am
|
||||
gnome-shell-clock-preferences: gnome-shell-clock-preferences.in
|
||||
$(AM_V_GEN) sed -e "s|@datadir[@]|$(datadir)|" \
|
||||
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \
|
||||
-e "s|@localedir[@]|$(datadir)/locale|" \
|
||||
-e "s|@GJS_CONSOLE[@]|$(GJS_CONSOLE)|" \
|
||||
$< > $@ && chmod a+x $@
|
||||
CLEANFILES += gnome-shell-clock-preferences
|
||||
EXTRA_DIST += gnome-shell-clock-preferences.in
|
||||
|
||||
include Makefile-gdmuser.am
|
||||
include Makefile-st.am
|
||||
include Makefile-tray.am
|
||||
@ -43,70 +52,70 @@ plugin_LTLIBRARIES = libgnome-shell.la
|
||||
|
||||
shell_built_sources = \
|
||||
shell-marshal.h \
|
||||
shell-marshal.c
|
||||
shell-marshal.c \
|
||||
shell-enum-types.h \
|
||||
shell-enum-types.c
|
||||
|
||||
BUILT_SOURCES += $(shell_built_sources)
|
||||
EXTRA_DIST += shell-marshal.list
|
||||
|
||||
SHELL_STAMP_FILES = stamp-shell-marshal.h
|
||||
CLEANFILES += $(SHELL_STAMP_FILES)
|
||||
|
||||
libgnome_shell_la_SOURCES = \
|
||||
$(shell_built_sources) \
|
||||
gnome-shell-plugin.c \
|
||||
shell-app.c \
|
||||
shell-app.h \
|
||||
shell-app-private.h \
|
||||
shell-app-system.c \
|
||||
shell-app-system.h \
|
||||
shell-app-usage.c \
|
||||
shell-app-usage.h \
|
||||
shell-arrow.c \
|
||||
shell_public_headers_h = \
|
||||
shell-app.h \
|
||||
shell-app-system.h \
|
||||
shell-app-usage.h \
|
||||
shell-arrow.h \
|
||||
shell-doc-system.c \
|
||||
shell-doc-system.h \
|
||||
shell-drawing.c \
|
||||
shell-drawing.h \
|
||||
shell-embedded-window.c \
|
||||
shell-embedded-window.h \
|
||||
shell-embedded-window-private.h \
|
||||
shell-gconf.c \
|
||||
shell-gconf.h \
|
||||
shell-generic-container.c \
|
||||
shell-generic-container.h \
|
||||
shell-gtk-embed.c \
|
||||
shell-gtk-embed.h \
|
||||
shell-menu.c \
|
||||
shell-menu.h \
|
||||
shell-overflow-list.c \
|
||||
shell-overflow-list.h \
|
||||
shell-process.c \
|
||||
shell-process.h \
|
||||
shell-global.c \
|
||||
shell-global.h \
|
||||
shell-global-private.h \
|
||||
shell-slicer.c \
|
||||
shell-slicer.h \
|
||||
shell-stack.c \
|
||||
shell-stack.h \
|
||||
shell-tray-manager.c \
|
||||
shell-tray-manager.h \
|
||||
shell-uri-util.c \
|
||||
shell-uri-util.h \
|
||||
shell-window-tracker.c \
|
||||
shell-window-tracker.h \
|
||||
shell-wm.c \
|
||||
shell-wm.h
|
||||
shell-doc-system.h \
|
||||
shell-drawing.h \
|
||||
shell-embedded-window.h \
|
||||
shell-generic-container.h \
|
||||
shell-gtk-embed.h \
|
||||
shell-process.h \
|
||||
shell-global.h \
|
||||
shell-perf-log.h \
|
||||
shell-slicer.h \
|
||||
shell-stack.h \
|
||||
shell-tray-manager.h \
|
||||
shell-uri-util.h \
|
||||
shell-window-tracker.h \
|
||||
shell-wm.h \
|
||||
shell-xfixes-cursor.h
|
||||
|
||||
# Files we don't want to be scanned by introspection
|
||||
non_gir_sources = \
|
||||
shell-embedded-window-private.h \
|
||||
shell-global-private.h
|
||||
shell-global-private.h \
|
||||
shell-window-tracker-private.h
|
||||
|
||||
libgnome_shell_la_SOURCES = \
|
||||
$(shell_built_sources) \
|
||||
$(shell_public_headers_h) \
|
||||
$(non_gir_sources) \
|
||||
gnome-shell-plugin.c \
|
||||
gtk-compat.h \
|
||||
shell-app.c \
|
||||
shell-app-private.h \
|
||||
shell-app-system.c \
|
||||
shell-app-usage.c \
|
||||
shell-arrow.c \
|
||||
shell-doc-system.c \
|
||||
shell-drawing.c \
|
||||
shell-embedded-window.c \
|
||||
shell-generic-container.c \
|
||||
shell-gtk-embed.c \
|
||||
shell-process.c \
|
||||
shell-global.c \
|
||||
shell-perf-log.c \
|
||||
shell-slicer.c \
|
||||
shell-stack.c \
|
||||
shell-tray-manager.c \
|
||||
shell-uri-util.c \
|
||||
shell-window-tracker.c \
|
||||
shell-wm.c \
|
||||
shell-xfixes-cursor.c
|
||||
|
||||
shell_recorder_sources = \
|
||||
shell-recorder.c \
|
||||
shell-recorder.h \
|
||||
shell-recorder-src.c \
|
||||
shell-recorder-src.h
|
||||
shell-recorder.h
|
||||
|
||||
# Custom element is an internal detail
|
||||
shell_recorder_non_gir_sources = \
|
||||
@ -123,7 +132,7 @@ test_recorder_CPPFLAGS = $(TEST_SHELL_RECORDER_CFLAGS)
|
||||
test_recorder_LDADD = $(TEST_SHELL_RECORDER_LIBS)
|
||||
|
||||
test_recorder_SOURCES = \
|
||||
$(shell_recorder_sources) \
|
||||
$(shell_recorder_sources) $(shell_recorder_non_gir_sources) \
|
||||
test-recorder.c
|
||||
endif BUILD_RECORDER
|
||||
|
||||
@ -140,6 +149,7 @@ stamp-shell-marshal.h: Makefile shell-marshal.list
|
||||
(cmp -s xgen-smh shell-marshal.h || cp -f xgen-smh shell-marshal.h) && \
|
||||
rm -f xgen-smh && \
|
||||
echo timestamp > $(@F)
|
||||
CLEANFILES += stamp-shell-marshal.h
|
||||
|
||||
shell-marshal.c: Makefile shell-marshal.list
|
||||
$(AM_V_GEN) (echo "#include \"shell-marshal.h\"" ; \
|
||||
@ -150,41 +160,66 @@ shell-marshal.c: Makefile shell-marshal.list
|
||||
cp -f xgen-smc shell-marshal.c && \
|
||||
rm -f xgen-smc
|
||||
|
||||
|
||||
shell-enum-types.h: stamp-shell-enum-types.h Makefile
|
||||
@true
|
||||
stamp-shell-enum-types.h: $(srcdir)/shell-enum-types.h.in $(shell_public_headers_h)
|
||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||
$(GLIB_MKENUMS) \
|
||||
--template $< \
|
||||
$(shell_public_headers_h) ) > $@.tmp && \
|
||||
(cmp -s $@.tmp shell-enum-types.h || mv $@.tmp shell-enum-types.h) && \
|
||||
rm -f $@.tmp && \
|
||||
echo timestamp > $(@F)
|
||||
EXTRA_DIST += shell-enum-types.h.in
|
||||
CLEANFILES += stamp-shell-enum-types.h
|
||||
|
||||
shell-enum-types.c: shell-enum-types.c.in stamp-shell-enum-types.h
|
||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||
$(GLIB_MKENUMS) \
|
||||
--template $< \
|
||||
$(shell_public_headers_h) ) > $@.tmp && \
|
||||
mv $@.tmp $@ && \
|
||||
rm -f $@.tmp
|
||||
EXTRA_DIST += shell-enum-types.c.in
|
||||
|
||||
libgnome_shell_la_LDFLAGS = -avoid-version -module
|
||||
libgnome_shell_la_LIBADD = \
|
||||
libgnome_shell_la_LIBADD =-lm \
|
||||
$(MUTTER_PLUGIN_LIBS) \
|
||||
$(LIBGNOMEUI_LIBS) \
|
||||
libbig-1.0.la \
|
||||
libst-1.0.la \
|
||||
libgdmuser-1.0.la \
|
||||
libtray.la
|
||||
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
|
||||
|
||||
typelibdir = $(pkglibdir)
|
||||
typelib_DATA = Shell-0.1.typelib Big-1.0.typelib St-1.0.typelib Gdm-1.0.typelib
|
||||
typelib_DATA = Shell-0.1.typelib St-1.0.typelib Gdm-1.0.typelib
|
||||
|
||||
Shell-0.1.gir: $(mutter) $(G_IR_SCANNER) Big-1.0.gir St-1.0.gir libgnome-shell.la Makefile
|
||||
Shell-0.1.gir: $(mutter) $(G_IR_SCANNER) St-1.0.gir libgnome-shell.la Makefile
|
||||
$(AM_V_GEN) $(G_IR_SCANNER) \
|
||||
--namespace=Shell \
|
||||
--nsversion=0.1 \
|
||||
--add-include-path=$(MUTTER_LIB_DIR)/mutter/ \
|
||||
--include=Clutter-1.0 \
|
||||
--include=Meta-2.29 \
|
||||
--include=Meta-2.31 \
|
||||
--libtool="$(LIBTOOL)" \
|
||||
--add-include-path=$(builddir) \
|
||||
--include=Big-1.0 \
|
||||
--include=St-1.0 \
|
||||
--program=mutter \
|
||||
--program-arg=--mutter-plugins=$$(pwd)/libgnome-shell.la \
|
||||
$(addprefix $(srcdir)/,$(libgnome_shell_la_gir_sources)) \
|
||||
$(libgnome_shell_la_CPPFLAGS) \
|
||||
-I $(srcdir) \
|
||||
-o $@
|
||||
-o $@.tmp && \
|
||||
$(PYTHON) $(srcdir)/fix-meta-rectangle.py $@.tmp $@.tmp2 && \
|
||||
rm $@.tmp && \
|
||||
mv $@.tmp2 $@
|
||||
CLEANFILES += Shell-0.1.gir
|
||||
EXTRA_DIST += fix-meta-rectangle.py
|
||||
|
||||
# The dependency on libgnome-shell.la here is because g-ir-compiler opens it
|
||||
# (not the fake library, since we've already done the rewriting)
|
||||
Shell-0.1.typelib: libgnome-shell.la Shell-0.1.gir Big-1.0.gir
|
||||
Shell-0.1.typelib: libgnome-shell.la Shell-0.1.gir
|
||||
$(AM_V_GEN) \
|
||||
$(G_IR_COMPILER) \
|
||||
--includedir=. \
|
||||
@ -192,35 +227,15 @@ Shell-0.1.typelib: libgnome-shell.la Shell-0.1.gir Big-1.0.gir
|
||||
Shell-0.1.gir -o $@
|
||||
CLEANFILES += Shell-0.1.typelib
|
||||
|
||||
Big-1.0.gir: $(mutter) $(G_IR_SCANNER) libbig-1.0.la Makefile
|
||||
$(AM_V_GEN) $(G_IR_SCANNER) \
|
||||
--namespace=Big \
|
||||
--nsversion=1.0 \
|
||||
--include=Clutter-1.0 \
|
||||
--include=GdkPixbuf-2.0 \
|
||||
--libtool="$(LIBTOOL)" \
|
||||
--library=libbig-1.0.la \
|
||||
$(addprefix $(srcdir)/,$(big_source_h)) \
|
||||
$(addprefix $(srcdir)/,$(big_source_c)) \
|
||||
$(srcdir)/big-enum-types.h \
|
||||
$(big_cflags) \
|
||||
-o $@
|
||||
CLEANFILES += Big-1.0.gir
|
||||
|
||||
Big-1.0.typelib: libbig-1.0.la Big-1.0.gir
|
||||
$(AM_V_GEN) $(G_IR_COMPILER) Big-1.0.gir -o $@
|
||||
CLEANFILES += Big-1.0.typelib
|
||||
|
||||
St-1.0.gir: $(mutter) $(G_IR_SCANNER) libst-1.0.la Makefile
|
||||
$(AM_V_GEN) $(G_IR_SCANNER) \
|
||||
--namespace=St \
|
||||
--nsversion=1.0 \
|
||||
--include=Clutter-1.0 \
|
||||
--include=Gtk-2.0 \
|
||||
--include=Gtk-3.0 \
|
||||
--add-include-path=$(builddir) \
|
||||
--libtool="$(LIBTOOL)" \
|
||||
--library=libst-1.0.la \
|
||||
--library=libbig-1.0.la \
|
||||
-DST_COMPILATION \
|
||||
$(addprefix $(srcdir)/,$(st_source_h)) \
|
||||
$(addprefix $(srcdir)/,$(st_source_c)) \
|
||||
@ -249,7 +264,7 @@ Gdm-1.0.gir: $(mutter) $(G_IR_SCANNER) libgdmuser-1.0.la Makefile
|
||||
-o $@
|
||||
CLEANFILES += Gdm-1.0.gir
|
||||
|
||||
Gdm-1.0.typelib: libbig-1.0.la Gdm-1.0.gir
|
||||
Gdm-1.0.typelib: Gdm-1.0.gir
|
||||
$(AM_V_GEN) $(G_IR_COMPILER) Gdm-1.0.gir -o $@
|
||||
CLEANFILES += Gdm-1.0.typelib
|
||||
|
||||
|
@ -1,25 +0,0 @@
|
||||
The Clutter actors and other files in this directory were created by
|
||||
litl, LLC. They are released under the terms of the Library General
|
||||
Public license.
|
||||
|
||||
The idea is that these actors may eventually make their way into Clutter
|
||||
or into other libraries.
|
||||
|
||||
litl has requested that these actors should not be publically
|
||||
installed under the 'big_*' names to avoid conflicts with their
|
||||
development. So if you use them in your applications, do *NOT*
|
||||
install:
|
||||
|
||||
- A 'libbig' library
|
||||
- The header files
|
||||
- gobject-introspection data for these actors
|
||||
|
||||
Into public locations. You can of course, take the code and rename it,
|
||||
as long as you respect the provisions of the LGPL, or install into
|
||||
private locations as we do for gnome-shell. (We install the typelib
|
||||
into a private location, link the source files directly into the
|
||||
gnome-shell plugin so no external library is needed, and we don't
|
||||
install the header files at all.)
|
||||
|
||||
Patches applied:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=562929
|
3060
src/big/box.c
3060
src/big/box.c
File diff suppressed because it is too large
Load Diff
129
src/big/box.h
129
src/big/box.h
@ -1,129 +0,0 @@
|
||||
/* -*- mode: C; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
|
||||
/* big-box.h: Box container.
|
||||
|
||||
Copyright (C) 2006-2008 Red Hat, Inc.
|
||||
Copyright (C) 2008 litl, LLC.
|
||||
|
||||
The libbigwidgets-lgpl is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The libbigwidgets-lgpl 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the libbigwidgets-lgpl; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation, Inc., 59 Temple Place -
|
||||
Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __BIG_BOX_H__
|
||||
#define __BIG_BOX_H__
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define BIG_TYPE_BOX (big_box_get_type ())
|
||||
#define BIG_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BIG_TYPE_BOX, BigBox))
|
||||
#define BIG_IS_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BIG_TYPE_BOX))
|
||||
#define BIG_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BIG_TYPE_BOX, BigBoxClass))
|
||||
#define BIG_IS_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BIG_TYPE_BOX))
|
||||
#define BIG_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BIG_TYPE_BOX, BigBoxClass))
|
||||
|
||||
typedef struct _BigBox BigBox;
|
||||
typedef struct _BigBoxPrivate BigBoxPrivate;
|
||||
typedef struct _BigBoxClass BigBoxClass;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BIG_BOX_PACK_NONE = 0,
|
||||
BIG_BOX_PACK_EXPAND = 1 << 0,
|
||||
BIG_BOX_PACK_END = 1 << 1,
|
||||
BIG_BOX_PACK_IF_FITS = 1 << 2,
|
||||
BIG_BOX_PACK_FIXED = 1 << 3,
|
||||
BIG_BOX_PACK_ALLOCATE_WHEN_HIDDEN = 1 << 4
|
||||
} BigBoxPackFlags;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BIG_BOX_ALIGNMENT_FIXED = 0,
|
||||
BIG_BOX_ALIGNMENT_FILL = 1,
|
||||
BIG_BOX_ALIGNMENT_START = 2,
|
||||
BIG_BOX_ALIGNMENT_END = 3,
|
||||
BIG_BOX_ALIGNMENT_CENTER = 4
|
||||
} BigBoxAlignment;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BIG_BOX_ORIENTATION_VERTICAL = 1,
|
||||
BIG_BOX_ORIENTATION_HORIZONTAL = 2
|
||||
} BigBoxOrientation;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BIG_BOX_BACKGROUND_REPEAT_NONE = 0,
|
||||
BIG_BOX_BACKGROUND_REPEAT_X = 1,
|
||||
BIG_BOX_BACKGROUND_REPEAT_Y = 2,
|
||||
BIG_BOX_BACKGROUND_REPEAT_BOTH = 3,
|
||||
} BigBoxBackgroundRepeat;
|
||||
|
||||
struct _BigBox
|
||||
{
|
||||
ClutterActor parent_instance;
|
||||
|
||||
BigBoxPrivate *priv;
|
||||
};
|
||||
|
||||
struct _BigBoxClass
|
||||
{
|
||||
ClutterActorClass parent_class;
|
||||
};
|
||||
|
||||
GType big_box_get_type (void) G_GNUC_CONST;
|
||||
|
||||
ClutterActor *big_box_new (BigBoxOrientation orientation);
|
||||
|
||||
void big_box_prepend (BigBox *box,
|
||||
ClutterActor *child,
|
||||
BigBoxPackFlags flags);
|
||||
|
||||
void big_box_append (BigBox *box,
|
||||
ClutterActor *child,
|
||||
BigBoxPackFlags flags);
|
||||
|
||||
gboolean big_box_is_empty (BigBox *box);
|
||||
|
||||
void big_box_remove_all (BigBox *box);
|
||||
|
||||
void big_box_insert_after (BigBox *box,
|
||||
ClutterActor *child,
|
||||
ClutterActor *ref_child,
|
||||
BigBoxPackFlags flags);
|
||||
|
||||
void big_box_insert_before (BigBox *box,
|
||||
ClutterActor *child,
|
||||
ClutterActor *ref_child,
|
||||
BigBoxPackFlags flags);
|
||||
|
||||
void big_box_set_child_packing (BigBox *box,
|
||||
ClutterActor *child,
|
||||
BigBoxPackFlags flags);
|
||||
|
||||
void big_box_set_child_align (BigBox *box,
|
||||
ClutterActor *child,
|
||||
BigBoxAlignment fixed_x_align,
|
||||
BigBoxAlignment fixed_y_align);
|
||||
|
||||
void big_box_set_padding (BigBox *box,
|
||||
int padding);
|
||||
|
||||
void big_box_set_border_width (BigBox *box,
|
||||
int border_width);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __BIG_BOX_H__ */
|
@ -1,658 +0,0 @@
|
||||
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
|
||||
/* rectangle.c: Rounded rectangle.
|
||||
|
||||
Copyright (C) 2008 litl, LLC.
|
||||
|
||||
The libbigwidgets-lgpl is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The libbigwidgets-lgpl 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the libbigwidgets-lgpl; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation, Inc., 59 Temple Place -
|
||||
Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <clutter/clutter.h>
|
||||
#include <cogl/cogl.h>
|
||||
#include <cairo/cairo.h>
|
||||
|
||||
#include "rectangle.h"
|
||||
|
||||
typedef struct {
|
||||
gint ref_count;
|
||||
|
||||
ClutterColor color;
|
||||
ClutterColor border_color;
|
||||
int radius;
|
||||
int border_width;
|
||||
|
||||
CoglHandle texture;
|
||||
guint8 *data;
|
||||
} Corner;
|
||||
|
||||
struct BigRectangle {
|
||||
ClutterRectangle parent_instance;
|
||||
float radius;
|
||||
Corner *corner;
|
||||
CoglHandle corner_material;
|
||||
CoglHandle border_material;
|
||||
CoglHandle background_material;
|
||||
gboolean corners_dirty;
|
||||
};
|
||||
|
||||
/* map of { radius, border_width, border_color, color } to Corner textures */
|
||||
static GHashTable *all_corners = NULL;
|
||||
|
||||
struct BigRectangleClass {
|
||||
ClutterRectangleClass parent_class;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE(BigRectangle, big_rectangle, CLUTTER_TYPE_RECTANGLE)
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_CORNER_RADIUS
|
||||
};
|
||||
|
||||
static gboolean
|
||||
corner_equal(gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
const Corner *corner_a;
|
||||
const Corner *corner_b;
|
||||
|
||||
corner_a = a;
|
||||
corner_b = b;
|
||||
|
||||
return *((guint32 *)&corner_a->color) == *((guint32 *)&corner_b->color) &&
|
||||
*((guint32 *)&corner_a->border_color) == *((guint32 *)&corner_b->border_color) &&
|
||||
corner_a->border_width == corner_b->border_width &&
|
||||
corner_a->radius == corner_b->radius;
|
||||
}
|
||||
|
||||
static guint
|
||||
corner_hash(gconstpointer key)
|
||||
{
|
||||
const Corner *corner;
|
||||
guint hashed[4];
|
||||
|
||||
corner = key;
|
||||
|
||||
hashed[0] = *((guint *)&(corner->color));
|
||||
hashed[1] = *((guint *)&(corner->border_color));
|
||||
hashed[2] = *((guint *)&(corner->border_width));
|
||||
hashed[3] = *((guint *)&(corner->radius));
|
||||
|
||||
return hashed[0] ^ hashed[1] ^ hashed[2] ^ hashed[3];
|
||||
}
|
||||
|
||||
static Corner *
|
||||
create_corner_texture(Corner *src)
|
||||
{
|
||||
Corner *corner;
|
||||
CoglHandle texture;
|
||||
cairo_t *cr;
|
||||
cairo_surface_t *surface;
|
||||
guint x, y;
|
||||
guint rowstride;
|
||||
guint8 *data;
|
||||
guint32 *src_p;
|
||||
guint8 *dst_p;
|
||||
guint size;
|
||||
|
||||
corner = g_memdup(src, sizeof(Corner));
|
||||
|
||||
size = 2 * MAX(corner->border_width, corner->radius);
|
||||
rowstride = size * 4;
|
||||
data = g_new0(guint8, size * rowstride);
|
||||
|
||||
surface = cairo_image_surface_create_for_data(data,
|
||||
CAIRO_FORMAT_ARGB32,
|
||||
size, size,
|
||||
rowstride);
|
||||
cr = cairo_create(surface);
|
||||
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
||||
cairo_scale(cr, size, size);
|
||||
|
||||
if (corner->border_width < corner->radius) {
|
||||
double internal_radius = 0.5 * (1.0 - (double) corner->border_width / corner->radius);
|
||||
|
||||
if (corner->border_width != 0) {
|
||||
cairo_set_source_rgba(cr,
|
||||
(double)corner->border_color.red / G_MAXUINT8,
|
||||
(double)corner->border_color.green / G_MAXUINT8,
|
||||
(double)corner->border_color.blue / G_MAXUINT8,
|
||||
(double)corner->border_color.alpha / G_MAXUINT8);
|
||||
|
||||
cairo_arc(cr, 0.5, 0.5, 0.5, 0, 2 * M_PI);
|
||||
cairo_fill(cr);
|
||||
}
|
||||
|
||||
cairo_set_source_rgba(cr,
|
||||
(double)corner->color.red / G_MAXUINT8,
|
||||
(double)corner->color.green / G_MAXUINT8,
|
||||
(double)corner->color.blue / G_MAXUINT8,
|
||||
(double)corner->color.alpha / G_MAXUINT8);
|
||||
cairo_arc(cr, 0.5, 0.5, internal_radius, 0, 2 * M_PI);
|
||||
cairo_fill(cr);
|
||||
|
||||
} else {
|
||||
double radius;
|
||||
|
||||
radius = (gdouble)corner->radius / corner->border_width;
|
||||
|
||||
cairo_set_source_rgba(cr,
|
||||
(double)corner->border_color.red / G_MAXUINT8,
|
||||
(double)corner->border_color.green / G_MAXUINT8,
|
||||
(double)corner->border_color.blue / G_MAXUINT8,
|
||||
(double)corner->border_color.alpha / G_MAXUINT8);
|
||||
|
||||
cairo_arc(cr, radius, radius, radius, M_PI, 3 * M_PI / 2);
|
||||
cairo_line_to(cr, 1.0 - radius, 0.0);
|
||||
cairo_arc(cr, 1.0 - radius, radius, radius, 3 * M_PI / 2, 2*M_PI);
|
||||
cairo_line_to(cr, 1.0, 1.0 - radius);
|
||||
cairo_arc(cr, 1.0 - radius, 1.0 - radius, radius, 0, M_PI / 2);
|
||||
cairo_line_to(cr, radius, 1.0);
|
||||
cairo_arc(cr, radius, 1.0 - radius, radius, M_PI / 2, M_PI);
|
||||
cairo_fill(cr);
|
||||
}
|
||||
cairo_destroy(cr);
|
||||
|
||||
cairo_surface_destroy(surface);
|
||||
|
||||
corner->data = g_new0(guint8, size * rowstride);
|
||||
|
||||
/* cogl doesn't seem to support the conversion, do it manually */
|
||||
/* borrowed from clutter-cairo, conversion from ARGB pre-multiplied
|
||||
* to RGBA */
|
||||
for (y = 0; y < size; y++) {
|
||||
src_p = (guint32 *) (data + y * rowstride);
|
||||
dst_p = corner->data + y * rowstride;
|
||||
|
||||
for (x = 0; x < size; x++) {
|
||||
guint8 alpha = (*src_p >> 24) & 0xff;
|
||||
|
||||
if (alpha == 0) {
|
||||
dst_p[0] = dst_p[1] = dst_p[2] = dst_p[3] = alpha;
|
||||
} else {
|
||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
||||
dst_p[0] = (((*src_p >> 16) & 0xff) * 255 ) / alpha;
|
||||
dst_p[1] = (((*src_p >> 8) & 0xff) * 255 ) / alpha;
|
||||
dst_p[2] = (((*src_p >> 0) & 0xff) * 255 ) / alpha;
|
||||
dst_p[3] = alpha;
|
||||
#elif G_BYTE_ORDER == G_BIG_ENDIAN
|
||||
dst_p[0] = alpha;
|
||||
dst_p[1] = (((*src_p >> 0) & 0xff) * 255 ) / alpha;
|
||||
dst_p[2] = (((*src_p >> 8) & 0xff) * 255 ) / alpha;
|
||||
dst_p[3] = (((*src_p >> 16) & 0xff) * 255 ) / alpha;
|
||||
#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
|
||||
#error unknown ENDIAN type
|
||||
#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
|
||||
}
|
||||
dst_p += 4;
|
||||
src_p++;
|
||||
}
|
||||
}
|
||||
|
||||
g_free(data);
|
||||
|
||||
texture = cogl_texture_new_from_data(size, size,
|
||||
COGL_TEXTURE_NONE,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
rowstride,
|
||||
corner->data);
|
||||
g_assert(texture != COGL_INVALID_HANDLE);
|
||||
|
||||
corner->ref_count = 1;
|
||||
corner->texture = texture;
|
||||
|
||||
g_hash_table_insert(all_corners, corner, corner);
|
||||
|
||||
return corner;
|
||||
}
|
||||
|
||||
static void
|
||||
corner_unref(Corner *corner)
|
||||
{
|
||||
corner->ref_count --;
|
||||
|
||||
if (corner->ref_count == 0) {
|
||||
g_hash_table_remove(all_corners, corner);
|
||||
|
||||
cogl_handle_unref(corner->texture);
|
||||
g_free(corner->data);
|
||||
g_free(corner);
|
||||
}
|
||||
}
|
||||
|
||||
static Corner *
|
||||
corner_get(guint radius,
|
||||
ClutterColor *color,
|
||||
guint border_width,
|
||||
ClutterColor *border_color)
|
||||
{
|
||||
Corner key;
|
||||
Corner *corner;
|
||||
|
||||
if (all_corners == NULL) {
|
||||
all_corners = g_hash_table_new(corner_hash, corner_equal);
|
||||
}
|
||||
|
||||
key.radius = radius;
|
||||
key.color = *color;
|
||||
key.border_color = *border_color;
|
||||
key.border_width = border_width;
|
||||
|
||||
corner = g_hash_table_lookup(all_corners, &key);
|
||||
|
||||
if (!corner) {
|
||||
corner = create_corner_texture(&key);
|
||||
} else {
|
||||
corner->ref_count ++;
|
||||
}
|
||||
|
||||
return corner;
|
||||
}
|
||||
|
||||
/* To match the CSS specification, we want the border to look like it was
|
||||
* drawn over the background. But actually drawing the border over the
|
||||
* background will produce slightly bad antialiasing at the edges, so
|
||||
* compute the effective border color instead.
|
||||
*/
|
||||
#define NORM(x) (t = (x) + 127, (t + (t >> 8)) >> 8)
|
||||
#define MULT(c,a) NORM(c*a)
|
||||
|
||||
static void
|
||||
premultiply (ClutterColor *color)
|
||||
{
|
||||
guint t;
|
||||
color->red = MULT (color->red, color->alpha);
|
||||
color->green = MULT (color->green, color->alpha);
|
||||
color->blue = MULT (color->blue, color->alpha);
|
||||
}
|
||||
|
||||
static void
|
||||
unpremultiply (ClutterColor *color)
|
||||
{
|
||||
if (color->alpha != 0) {
|
||||
color->red = (color->red * 255 + 127) / color->alpha;
|
||||
color->green = (color->green * 255 + 127) / color->alpha;
|
||||
color->blue = (color->blue * 255 + 127) / color->alpha;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
over (const ClutterColor *source,
|
||||
const ClutterColor *destination,
|
||||
ClutterColor *result)
|
||||
{
|
||||
guint t;
|
||||
ClutterColor src = *source;
|
||||
ClutterColor dst = *destination;
|
||||
premultiply (&src);
|
||||
premultiply (&dst);
|
||||
|
||||
result->alpha = src.alpha + NORM ((255 - src.alpha) * dst.alpha);
|
||||
result->red = src.red + NORM ((255 - src.alpha) * dst.red);
|
||||
result->green = src.green + NORM ((255 - src.alpha) * dst.green);
|
||||
result->blue = src.blue + NORM ((255 - src.alpha) * dst.blue);
|
||||
|
||||
unpremultiply (result);
|
||||
}
|
||||
|
||||
static void
|
||||
big_rectangle_update_corners(BigRectangle *rectangle)
|
||||
{
|
||||
Corner *corner;
|
||||
|
||||
corner = NULL;
|
||||
|
||||
if (rectangle->radius != 0) {
|
||||
ClutterColor *color;
|
||||
ClutterColor *border_color;
|
||||
ClutterColor effective_border;
|
||||
guint border_width;
|
||||
|
||||
g_object_get(rectangle,
|
||||
"border-color", &border_color,
|
||||
"border-width", &border_width,
|
||||
"color", &color,
|
||||
NULL);
|
||||
|
||||
over (border_color, color, &effective_border);
|
||||
|
||||
corner = corner_get(rectangle->radius,
|
||||
color,
|
||||
border_width,
|
||||
&effective_border);
|
||||
|
||||
clutter_color_free(border_color);
|
||||
clutter_color_free(color);
|
||||
}
|
||||
|
||||
if (rectangle->corner) {
|
||||
corner_unref(rectangle->corner);
|
||||
}
|
||||
|
||||
rectangle->corner = corner;
|
||||
|
||||
if (corner) {
|
||||
if (!rectangle->corner_material)
|
||||
rectangle->corner_material = cogl_material_new();
|
||||
|
||||
cogl_material_set_layer (rectangle->corner_material, 0,
|
||||
rectangle->corner->texture);
|
||||
}
|
||||
|
||||
rectangle->corners_dirty = FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
big_rectangle_paint(ClutterActor *actor)
|
||||
{
|
||||
BigRectangle *rectangle;
|
||||
ClutterColor *color;
|
||||
ClutterColor *border_color;
|
||||
guint8 actor_opacity;
|
||||
CoglColor tmp_color;
|
||||
guint border_width;
|
||||
ClutterActorBox box;
|
||||
float radius;
|
||||
float width;
|
||||
float height;
|
||||
float max;
|
||||
|
||||
rectangle = BIG_RECTANGLE(actor);
|
||||
|
||||
/* We can't chain up, even when we the radius is 0, because of the different
|
||||
* interpretation of the border/background relationship here than for
|
||||
* ClutterRectangle.
|
||||
*/
|
||||
|
||||
if (rectangle->corners_dirty)
|
||||
big_rectangle_update_corners(rectangle);
|
||||
|
||||
g_object_get(rectangle,
|
||||
"border-color", &border_color,
|
||||
"border-width", &border_width,
|
||||
"color", &color,
|
||||
NULL);
|
||||
|
||||
if (border_color->alpha == 0 && color->alpha == 0)
|
||||
goto out;
|
||||
|
||||
actor_opacity = clutter_actor_get_paint_opacity (actor);
|
||||
|
||||
clutter_actor_get_allocation_box(actor, &box);
|
||||
|
||||
/* translation was already done */
|
||||
box.x2 -= box.x1;
|
||||
box.y2 -= box.y1;
|
||||
|
||||
width = box.x2;
|
||||
height = box.y2;
|
||||
|
||||
radius = rectangle->radius;
|
||||
|
||||
/* Optimization; if the border is transparent, it just looks like part of
|
||||
* the background */
|
||||
if (radius == 0 && border_color->alpha == 0)
|
||||
border_width = 0;
|
||||
|
||||
max = MAX(border_width, radius);
|
||||
|
||||
if (radius != 0) {
|
||||
cogl_color_set_from_4ub(&tmp_color,
|
||||
actor_opacity, actor_opacity, actor_opacity, actor_opacity);
|
||||
cogl_material_set_color(rectangle->corner_material, &tmp_color);
|
||||
cogl_set_source(rectangle->corner_material);
|
||||
|
||||
/* NW */
|
||||
cogl_rectangle_with_texture_coords(0, 0,
|
||||
max, max,
|
||||
0, 0,
|
||||
0.5, 0.5);
|
||||
|
||||
/* NE */
|
||||
cogl_rectangle_with_texture_coords(width - max, 0,
|
||||
width, max,
|
||||
0.5, 0,
|
||||
1.0, 0.5);
|
||||
|
||||
/* SW */
|
||||
cogl_rectangle_with_texture_coords(0, height - max,
|
||||
max, height,
|
||||
0, 0.5,
|
||||
0.5, 1.0);
|
||||
|
||||
/* SE */
|
||||
cogl_rectangle_with_texture_coords(width - max, height - max,
|
||||
width, height,
|
||||
0.5, 0.5,
|
||||
1.0, 1.0);
|
||||
|
||||
}
|
||||
|
||||
if (border_width != 0) {
|
||||
ClutterColor effective_border;
|
||||
over (border_color, color, &effective_border);
|
||||
|
||||
if (!rectangle->border_material)
|
||||
rectangle->border_material = cogl_material_new ();
|
||||
|
||||
cogl_color_set_from_4ub(&tmp_color,
|
||||
effective_border.red,
|
||||
effective_border.green,
|
||||
effective_border.blue,
|
||||
actor_opacity * effective_border.alpha / 255);
|
||||
cogl_color_premultiply (&tmp_color);
|
||||
cogl_material_set_color(rectangle->border_material, &tmp_color);
|
||||
cogl_set_source(rectangle->border_material);
|
||||
|
||||
if (radius > 0) { /* skip corners */
|
||||
/* NORTH */
|
||||
cogl_rectangle(max, 0,
|
||||
width - max, border_width);
|
||||
|
||||
/* EAST */
|
||||
cogl_rectangle(width - border_width, max,
|
||||
width, height - max);
|
||||
|
||||
/* SOUTH */
|
||||
cogl_rectangle(max, height - border_width,
|
||||
width - max, height);
|
||||
|
||||
/* WEST */
|
||||
cogl_rectangle(0, max,
|
||||
border_width, height - max);
|
||||
} else { /* include corners */
|
||||
/* NORTH */
|
||||
cogl_rectangle(0, 0,
|
||||
width, border_width);
|
||||
|
||||
/* EAST */
|
||||
cogl_rectangle(width - border_width, border_width,
|
||||
width, height - border_width);
|
||||
|
||||
/* SOUTH */
|
||||
cogl_rectangle(0, height - border_width,
|
||||
width, height);
|
||||
|
||||
/* WEST */
|
||||
cogl_rectangle(0, border_width,
|
||||
border_width, height - border_width);
|
||||
}
|
||||
}
|
||||
|
||||
if (!rectangle->background_material)
|
||||
rectangle->background_material = cogl_material_new ();
|
||||
|
||||
cogl_color_set_from_4ub(&tmp_color,
|
||||
color->red,
|
||||
color->green,
|
||||
color->blue,
|
||||
actor_opacity * color->alpha / 255);
|
||||
cogl_color_premultiply (&tmp_color);
|
||||
cogl_material_set_color(rectangle->background_material, &tmp_color);
|
||||
cogl_set_source(rectangle->background_material);
|
||||
|
||||
if (radius > border_width) {
|
||||
/* Once we've drawn the borders and corners, if the corners are bigger
|
||||
* the the border width, the remaining area is shaped like
|
||||
*
|
||||
* ########
|
||||
* ##########
|
||||
* ##########
|
||||
* ########
|
||||
*
|
||||
* We draw it in 3 pieces - first the top and bottom, then the main
|
||||
* rectangle
|
||||
*/
|
||||
cogl_rectangle(radius, border_width,
|
||||
width - radius, radius);
|
||||
cogl_rectangle(radius, height - radius,
|
||||
width - radius, height - border_width);
|
||||
}
|
||||
|
||||
cogl_rectangle(border_width, max,
|
||||
width - border_width, height - max);
|
||||
|
||||
out:
|
||||
clutter_color_free(border_color);
|
||||
clutter_color_free(color);
|
||||
}
|
||||
|
||||
static void
|
||||
big_rectangle_notify(GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
BigRectangle *rectangle;
|
||||
|
||||
rectangle = BIG_RECTANGLE(object);
|
||||
|
||||
if (g_str_equal(pspec->name, "border-width") ||
|
||||
g_str_equal(pspec->name, "color") ||
|
||||
g_str_equal(pspec->name, "border-color")) {
|
||||
rectangle->corners_dirty = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
big_rectangle_set_property(GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
BigRectangle *rectangle;
|
||||
|
||||
rectangle = BIG_RECTANGLE(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_CORNER_RADIUS:
|
||||
rectangle->radius = g_value_get_uint(value);
|
||||
rectangle->corners_dirty = TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
big_rectangle_get_property(GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
BigRectangle *rectangle;
|
||||
|
||||
rectangle = BIG_RECTANGLE(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_CORNER_RADIUS:
|
||||
g_value_set_uint(value, rectangle->radius);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
big_rectangle_dispose(GObject *object)
|
||||
{
|
||||
BigRectangle *rectangle;
|
||||
|
||||
rectangle = BIG_RECTANGLE(object);
|
||||
|
||||
if (rectangle->corner) {
|
||||
corner_unref(rectangle->corner);
|
||||
rectangle->corner = NULL;
|
||||
}
|
||||
|
||||
if (rectangle->corner_material) {
|
||||
cogl_handle_unref (rectangle->corner_material);
|
||||
rectangle->corner_material = NULL;
|
||||
}
|
||||
|
||||
if (rectangle->background_material) {
|
||||
cogl_handle_unref (rectangle->background_material);
|
||||
rectangle->background_material = NULL;
|
||||
}
|
||||
|
||||
if (rectangle->border_material) {
|
||||
cogl_handle_unref (rectangle->border_material);
|
||||
rectangle->border_material = NULL;
|
||||
}
|
||||
|
||||
if (G_OBJECT_CLASS(big_rectangle_parent_class)->dispose)
|
||||
G_OBJECT_CLASS(big_rectangle_parent_class)->dispose(object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
big_rectangle_class_init(BigRectangleClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
|
||||
gobject_class->dispose = big_rectangle_dispose;
|
||||
gobject_class->set_property = big_rectangle_set_property;
|
||||
gobject_class->get_property = big_rectangle_get_property;
|
||||
gobject_class->notify = big_rectangle_notify;
|
||||
|
||||
actor_class->paint = big_rectangle_paint;
|
||||
|
||||
g_object_class_install_property
|
||||
(gobject_class,
|
||||
PROP_CORNER_RADIUS,
|
||||
g_param_spec_uint("corner-radius",
|
||||
"Corner radius",
|
||||
"Radius of the rectangle rounded corner",
|
||||
0, G_MAXUINT,
|
||||
0,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
big_rectangle_init(BigRectangle *rectangle)
|
||||
{
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
|
||||
/*
|
||||
Copyright (C) 2008 litl, LLC.
|
||||
|
||||
The libbigwidgets-lgpl is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The libbigwidgets-lgpl 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the libbigwidgets-lgpl; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation, Inc., 59 Temple Place -
|
||||
Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#ifndef __BIG_RECTANGLE_H__
|
||||
#define __BIG_RECTANGLE_H__
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define BIG_TYPE_RECTANGLE (big_rectangle_get_type ())
|
||||
#define BIG_RECTANGLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BIG_TYPE_RECTANGLE, BigRectangle))
|
||||
#define BIG_RECTANGLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BIG_TYPE_RECTANGLE, BigRectangleClass))
|
||||
#define BIG_IS_RECTANGLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BIG_TYPE_RECTANGLE))
|
||||
#define BIG_IS_RECTANGLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BIG_TYPE_RECTANGLE))
|
||||
#define BIG_RECTANGLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BIG_TYPE_RECTANGLE, BigRectangleClass))
|
||||
|
||||
typedef struct BigRectangle BigRectangle;
|
||||
typedef struct BigRectangleClass BigRectangleClass;
|
||||
|
||||
GType big_rectangle_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __BIG_RECTANGLE_H__ */
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user