Compare commits
200 Commits
Author | SHA1 | Date | |
---|---|---|---|
3581c1d5b4 | |||
64e7459d1c | |||
f71afa9248 | |||
1ebca2e6d5 | |||
6222796b6a | |||
dcecf41d18 | |||
9d1fbffe75 | |||
6a6ba94bb9 | |||
ef5de3a5c0 | |||
f042e43990 | |||
620330db8f | |||
3765acc0a5 | |||
2e8654b96c | |||
cc5c5e7e8a | |||
9c849b0290 | |||
ad314b362e | |||
737a4f2816 | |||
96e4128e3e | |||
6f515f2327 | |||
cbb9a7ab96 | |||
e2e3b29ed1 | |||
82a8ac1976 | |||
bfec396ec2 | |||
d0e7f880d7 | |||
ff81659b9e | |||
6b2b3475c8 | |||
ed8acefc00 | |||
737f395d6c | |||
ab0a5d4a53 | |||
9412ac2027 | |||
c8670819dc | |||
4132ccae33 | |||
c450120409 | |||
6ce07abf50 | |||
e39e539ee9 | |||
9563a8f8a0 | |||
d5f37fa280 | |||
5c6e5ef6d0 | |||
42adc38609 | |||
e5fadb3b42 | |||
4c5f3aa971 | |||
6fc49b79a4 | |||
9e804b082f | |||
1fb220beb7 | |||
1fc1282fad | |||
8834a7df10 | |||
a34071e1c3 | |||
52a342300a | |||
b9456caeb0 | |||
26aa4333a5 | |||
04d2b0d282 | |||
7def1a4aa5 | |||
001b9868fb | |||
59a3e393f9 | |||
b846354787 | |||
2674d96e54 | |||
0c98fe8546 | |||
f18ed3c6ae | |||
644acf7018 | |||
96dca48b3b | |||
1309b64c33 | |||
1301dee744 | |||
efc194e36c | |||
60f41a109f | |||
890efa787a | |||
60c88612f7 | |||
82648bc86c | |||
ea1e5a5210 | |||
aa03734d39 | |||
bb0f76f562 | |||
8c2a290d09 | |||
8e661c3780 | |||
a03b6c419a | |||
fb55dd677f | |||
408790a630 | |||
08371f073d | |||
e7289378b7 | |||
31bde574de | |||
5aacfe4e6e | |||
5cf7bdabfd | |||
2021edd1fb | |||
45c1a9eafb | |||
0ae1556b94 | |||
c0739bd1e3 | |||
af51e8df7b | |||
22ef63cc44 | |||
03a5133e8c | |||
7f2456c00d | |||
aa4dbee362 | |||
7b65735cc9 | |||
7ef35fbec7 | |||
8b10d85fee | |||
d99b1e6c09 | |||
57ab7aec5b | |||
29a221bf62 | |||
671c569a9e | |||
492c033760 | |||
33a3b8046d | |||
88df183450 | |||
6a9080c3d6 | |||
019670b5ab | |||
4cab0c95d3 | |||
d51e79d483 | |||
69a27911a7 | |||
dd48514b24 | |||
eb54662098 | |||
545f0432c8 | |||
fdefb317cb | |||
4e0c8bfe67 | |||
dbd629d5d2 | |||
619a44a499 | |||
c5ca4e3ff0 | |||
55771b437b | |||
8727680983 | |||
ab9f21351f | |||
0055cabc62 | |||
fc70c2246b | |||
f7b6acaff8 | |||
91caa8e59f | |||
4c44bb7f52 | |||
df8a735aa9 | |||
82aea3e8d6 | |||
a8baf4a2a2 | |||
bfd344cdec | |||
a0fd4e195d | |||
4b3fbc4c9b | |||
63b1699a35 | |||
48acc41698 | |||
17672accfe | |||
986d72d9de | |||
ffd461cdb4 | |||
71dfab9711 | |||
c4f5274d74 | |||
4bfc3bafcb | |||
898b2b903d | |||
7921954a31 | |||
0e42de9149 | |||
8e4a5f1ac5 | |||
61577e176e | |||
4b008b1ada | |||
bee37b5bc4 | |||
b5ab8b6ed5 | |||
4d6bd91d16 | |||
5428db5385 | |||
6e6b1e6052 | |||
bc2b47974d | |||
2244b6ff1b | |||
fb384fc291 | |||
73cae8ce9a | |||
dcd07eb23f | |||
fa24448489 | |||
c975740f92 | |||
1e0187fa57 | |||
cbdf060bca | |||
19a8dff975 | |||
72f9f482d6 | |||
88de26138a | |||
57bd964cb3 | |||
74a39ae57c | |||
5090a4ccce | |||
ae0652d13f | |||
101a07a3d7 | |||
b012e93121 | |||
c31109800b | |||
c0dc363a3d | |||
739bb28220 | |||
aab2794e05 | |||
75c8c1bfb6 | |||
6f8bd96195 | |||
25f0d098bd | |||
56d584b7c6 | |||
20bf53add1 | |||
0d440bb0a2 | |||
8ec62ce46b | |||
79927faaec | |||
e4c7f1f3c4 | |||
68710c4647 | |||
7d7cbde1f3 | |||
bafd9c777a | |||
42a5531f15 | |||
227da25776 | |||
2028f33e38 | |||
145bf19636 | |||
d1675c44e2 | |||
6934e4db26 | |||
cae3414854 | |||
90d061edaf | |||
2e02918323 | |||
e77a1fd33b | |||
dd01c24c34 | |||
f88fbee80d | |||
fe08edbe2b | |||
d2a16bca10 | |||
a87f51487e | |||
76fce94b66 | |||
d104f9210a | |||
d0780d1622 | |||
9d5906dae3 | |||
07a0960265 | |||
72bee6d7ca |
6
.gitignore
vendored
@ -3,6 +3,7 @@
|
|||||||
*.o
|
*.o
|
||||||
.deps
|
.deps
|
||||||
.libs
|
.libs
|
||||||
|
ABOUT-NLS
|
||||||
ChangeLog
|
ChangeLog
|
||||||
INSTALL
|
INSTALL
|
||||||
Makefile
|
Makefile
|
||||||
@ -29,8 +30,13 @@ m4/
|
|||||||
omf.make
|
omf.make
|
||||||
po/*.gmo
|
po/*.gmo
|
||||||
po/gnome-shell.pot
|
po/gnome-shell.pot
|
||||||
|
po/*.header
|
||||||
|
po/*.sed
|
||||||
|
po/*.sin
|
||||||
po/Makefile.in.in
|
po/Makefile.in.in
|
||||||
|
po/Makevars.template
|
||||||
po/POTFILES
|
po/POTFILES
|
||||||
|
po/Rules-quot
|
||||||
po/stamp-it
|
po/stamp-it
|
||||||
scripts/launcher.pyc
|
scripts/launcher.pyc
|
||||||
src/*.gir
|
src/*.gir
|
||||||
|
@ -3,5 +3,5 @@ E-mail: otaylor@redhat.com
|
|||||||
Userid: otaylor
|
Userid: otaylor
|
||||||
|
|
||||||
Colin Walters
|
Colin Walters
|
||||||
E-mail: walters@redhat.com
|
E-mail: walters@verbum.org
|
||||||
Userid: walters
|
Userid: walters
|
||||||
|
117
NEWS
@ -1,3 +1,120 @@
|
|||||||
|
3.1.2
|
||||||
|
=====
|
||||||
|
* Fix problem with "user theme extension" breaking the CSS for other
|
||||||
|
extensions [Giovanni; #650971]
|
||||||
|
* Telepathy IM framework integration
|
||||||
|
- Switch to using telepathy-glib rather than talking to
|
||||||
|
Telepathy via D-Bus [Guillaume, Jasper; #645585, #649633, #651138, #651227]
|
||||||
|
- Acknowledge messages when the user clicks on them [Guillaume, #647893]
|
||||||
|
- Fix problem with telepathy icon blinking for incoming messages
|
||||||
|
even though the user has been notified of them [Guillaume; #643594]
|
||||||
|
* Networking
|
||||||
|
- keep wirelesss networks in predictable order [Giovanni; #646580, #652313]
|
||||||
|
- Show unmanaged devices in the menu [Giovanni; #646946]
|
||||||
|
- Fix overflow when too many VPN connections [Giovanni; #651602]
|
||||||
|
* Bluetooth
|
||||||
|
- Show "hardware disabled" when disabled by rfkill [Giovanni; #648048]
|
||||||
|
- Fix bug updating status of devices [Giovanni; #647565]
|
||||||
|
* LookingGlass console:
|
||||||
|
- Add a "Memory" tab [Colin; #650692]
|
||||||
|
- Make escape work from any page [Dan Winship; #647303]
|
||||||
|
- Provide a way to refer to panel items as, e.g.,
|
||||||
|
Main.panel._activities [Dan Winship; #646915]
|
||||||
|
* User menu
|
||||||
|
- Fix problem with suspend menu option locking the screen even when the user
|
||||||
|
disabled that. [Florian; #652327]
|
||||||
|
- Hide "power off..." option if shutdown is disabled via PolicyKit
|
||||||
|
[Florian; #652038]
|
||||||
|
* Track changes to WM_CLASS (fixes problems with LibreOffice tracking)
|
||||||
|
[Colin; #649315]
|
||||||
|
* Remove app tracking workarounds for Firefox and LibreOffice [Colin; #651015]
|
||||||
|
* Use upstream gettext autoconfigury rather than glib version [Javier; #631576]
|
||||||
|
* Show messages in the message tray when an application is fullscreen
|
||||||
|
[Dan Winship; #608667]
|
||||||
|
* Don't autohide the workspace pager if there is more than one workspace
|
||||||
|
[Florian; #652714, #653078, #653142]
|
||||||
|
* Don't always slide out the workspace pager at drag begin [Florian; #652730]
|
||||||
|
* Only offer to remove a favorite app when dragging it's icon [Owen; #642895]
|
||||||
|
* Allow dropping an icon anywhere on a workspace [Adel; #652079]
|
||||||
|
* st-scroll-view: Make the fade effect and offset themable [Jasper; #651813]
|
||||||
|
* Obey the user's preference when running an application in a terminal
|
||||||
|
from the run dialog [Florian; #648422]
|
||||||
|
* Consistently exit overview when launching external applications
|
||||||
|
[Colin; #653095]
|
||||||
|
* Adapt to changes in GJS for how GObject APIs are bound
|
||||||
|
[Alex, Colin, Florian, Jasper, Marc-Antoine; #649981, #652597]
|
||||||
|
* Fix problems with scrolling in overflow for alt-Tab switcher
|
||||||
|
[Dan Winship, Adel; #647807]
|
||||||
|
* Mark relationships between labels and actors for accessibility [Alejandro]
|
||||||
|
* Add org.gnome.shell.enabled-extensions complementing disabled-extensions
|
||||||
|
GSetting [Tassilo; #651088]
|
||||||
|
* Visual tweaks [Jakub, Jasper; #646261, #652715]
|
||||||
|
* Switch to building against clutter-1.7 with independent Cogl [Adel; #653397]
|
||||||
|
* Code cleanups [Colin, Dan Winship, Florian; #633620, #645031, #648755, #648758,
|
||||||
|
#648760, #649203, #649517, #650317, #652730]
|
||||||
|
* Memory leak fixes [Colin, Maxim; #649508, #650934]
|
||||||
|
* Build Fixes [Colin, Dan Winship, Florian, Ionut, Morten, Owen, Sean; #647395,
|
||||||
|
#648006, #650869, #653199, #653275
|
||||||
|
* Miscellaneous bug fixes [Adam, Adel, Dan Williams, Dan Winship, Florian,
|
||||||
|
Ionut, Jasper, Maxim, Ray; #620105, #639459, #641570, #642793, #643513,
|
||||||
|
#645848, #646919, #647186, #648305, #648410, #648562, #648894, #649001,
|
||||||
|
#645990, #647893, #647907, #651012, #651086, #651606, #651569, #651866,
|
||||||
|
#652388, #653511]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Ionut Biru, Giovanni Campagna, Guillaume Desmottes, Adam Dingle,
|
||||||
|
Maxim Ermilov, Adel Gadllah, Tassilo Horn, Javier Jardón, Jonny Lamb,
|
||||||
|
Alexander Larsson, Rui Matos, Morten Mjelva, Florian Müllner,
|
||||||
|
Marc-Antoine Perennou, Alejandro Piñeiro, Jasper St. Pierre, Jakub Steiner,
|
||||||
|
Ray Strode, Owen Taylor, Colin Walters, Dan Williams, Sean Wilson, Dan Winship
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Daniel Martinez Cucalon [ar], Ihar Hrachyshka [be], Carles Ferrando,
|
||||||
|
Gil Forcada, Sílvia Miranda [ca], Kristjan Schmidt [eo], Jorge González,
|
||||||
|
Daniel Mustieles [es], Seán de Búrca [ga], Fran Diéguez [gl],
|
||||||
|
Yaron Shahrabani [he], Kjartan Maraas [nb], Misha Shnurapet,
|
||||||
|
Yuri Myasoedov [ru], Daniel Nylander [se], Peter Mráz [sk],
|
||||||
|
Matej Urbančič [sl], Krishnababu Krothapalli [te], Daniel Korostil [uk],
|
||||||
|
Aron Xu [zh_CN]
|
||||||
|
|
||||||
|
|
||||||
|
3.0.2
|
||||||
|
=====
|
||||||
|
* Network Menu [Dan Williams]
|
||||||
|
- Fix connecting to WPA2 Enterprise access points
|
||||||
|
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=648171
|
||||||
|
- Show the mobile broadband wizard when selecting 3G network
|
||||||
|
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=649318
|
||||||
|
- Miscellaneous bug fixes
|
||||||
|
648648, 650124
|
||||||
|
* Fix duplicate icons in the application browser [Owen]
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=648739
|
||||||
|
* Make clicking anywhere on the volume icon slider work [Giovanni]
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=646660
|
||||||
|
* Fix a case where activating and clicking the hot corner
|
||||||
|
at the same time could result in immediately leaving the
|
||||||
|
overview [Rui]
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=649427
|
||||||
|
* Fix a case where applications became misordered in Alt-Tab [Jasper]
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=643302
|
||||||
|
* Fix a bug where messages you send could show up in
|
||||||
|
notifications as if someone else sent them [Jonny]
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=650219
|
||||||
|
* Memory leak fixes [Colin, Maxim]
|
||||||
|
642652, 649508, 649497
|
||||||
|
* Miscellaneous minor bug fixes [Adel, Christopher, Jasper]
|
||||||
|
649596, 648765, 648983, 649632
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Christopher Aillon, Giovanni Campagna, Maxim Ermilov,
|
||||||
|
Adel Gadllah, Jonny Lamb, Rui Matos, Jasper St. Pierre,
|
||||||
|
Owen Taylor, Colin Walters, Dan Williams
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Arash Mousavi [fa], Seán de Búrca [ga], Timo Jyrinki [fi],
|
||||||
|
Sigurd Gartmann [nb], Daniel Nylander [se], Peter Mráz [sl],
|
||||||
|
Abduxukur Abdurixit [ug], Nguyễn Thái Ngọc Duy [vi]
|
||||||
|
|
||||||
3.0.1
|
3.0.1
|
||||||
=====
|
=====
|
||||||
|
|
||||||
|
40
configure.ac
@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[3.0.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[3.1.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
@ -23,12 +23,16 @@ AM_PROG_CC_C_O
|
|||||||
LT_PREREQ([2.2.6])
|
LT_PREREQ([2.2.6])
|
||||||
LT_INIT([disable-static])
|
LT_INIT([disable-static])
|
||||||
|
|
||||||
|
# i18n
|
||||||
|
IT_PROG_INTLTOOL([0.40])
|
||||||
|
|
||||||
|
AM_GNU_GETTEXT([external])
|
||||||
|
AM_GNU_GETTEXT_VERSION([0.17])
|
||||||
|
|
||||||
GETTEXT_PACKAGE=gnome-shell
|
GETTEXT_PACKAGE=gnome-shell
|
||||||
AC_SUBST(GETTEXT_PACKAGE)
|
AC_SUBST(GETTEXT_PACKAGE)
|
||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
||||||
[The prefix for our gettext translation domains.])
|
[The prefix for our gettext translation domains.])
|
||||||
IT_PROG_INTLTOOL(0.26)
|
|
||||||
AM_GLIB_GNU_GETTEXT
|
|
||||||
|
|
||||||
PKG_PROG_PKG_CONFIG([0.22])
|
PKG_PROG_PKG_CONFIG([0.22])
|
||||||
|
|
||||||
@ -68,11 +72,11 @@ GTK_MIN_VERSION=3.0.0
|
|||||||
GIO_MIN_VERSION=2.25.9
|
GIO_MIN_VERSION=2.25.9
|
||||||
LIBECAL_MIN_VERSION=2.32.0
|
LIBECAL_MIN_VERSION=2.32.0
|
||||||
LIBEDATASERVER_MIN_VERSION=1.2.0
|
LIBEDATASERVER_MIN_VERSION=1.2.0
|
||||||
LIBEDATASERVERUI2_MIN_VERSION=1.2.0
|
LIBEDATASERVERUI_MIN_VERSION=2.91.6
|
||||||
LIBEDATASERVERUI3_MIN_VERSION=2.91.6
|
TELEPATHY_GLIB_MIN_VERSION=0.15.0
|
||||||
TELEPATHY_GLIB_MIN_VERSION=0.13.12
|
|
||||||
TELEPATHY_LOGGER_MIN_VERSION=0.2.4
|
TELEPATHY_LOGGER_MIN_VERSION=0.2.4
|
||||||
POLKIT_MIN_VERSION=0.100
|
POLKIT_MIN_VERSION=0.100
|
||||||
|
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||||
|
|
||||||
# Collect more than 20 libraries for a prize!
|
# Collect more than 20 libraries for a prize!
|
||||||
PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
|
PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
|
||||||
@ -84,7 +88,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
|
|||||||
gdk-x11-3.0
|
gdk-x11-3.0
|
||||||
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
|
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
|
||||||
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
||||||
libstartup-notification-1.0
|
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
|
||||||
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
||||||
libcanberra
|
libcanberra
|
||||||
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
||||||
@ -100,7 +104,7 @@ AC_SUBST([GJS_VERSION], ["$GJS_VERSION"])
|
|||||||
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
||||||
JHBUILD_TYPELIBDIR="$INTROSPECTION_TYPELIBDIR"
|
JHBUILD_TYPELIBDIR="$INTROSPECTION_TYPELIBDIR"
|
||||||
# NM is the only typelib we use that we don't jhbuild
|
# NM is the only typelib we use that we don't jhbuild
|
||||||
PKG_CHECK_EXISTS([libnm-glib >= 0.8.995],
|
PKG_CHECK_EXISTS([libnm-glib >= 0.8.999],
|
||||||
[NM_TYPELIBDIR=`$PKG_CONFIG --variable=libdir libnm-glib`/girepository-1.0
|
[NM_TYPELIBDIR=`$PKG_CONFIG --variable=libdir libnm-glib`/girepository-1.0
|
||||||
if test "$INTROSPECTION_TYPELIBDIR" != "$NM_TYPELIBDIR"; then
|
if test "$INTROSPECTION_TYPELIBDIR" != "$NM_TYPELIBDIR"; then
|
||||||
JHBUILD_TYPELIBDIR="$JHBUILD_TYPELIBDIR:$NM_TYPELIBDIR"
|
JHBUILD_TYPELIBDIR="$JHBUILD_TYPELIBDIR:$NM_TYPELIBDIR"
|
||||||
@ -111,22 +115,20 @@ saved_CFLAGS=$CFLAGS
|
|||||||
saved_LIBS=$LIBS
|
saved_LIBS=$LIBS
|
||||||
CFLAGS=$GNOME_SHELL_CFLAGS
|
CFLAGS=$GNOME_SHELL_CFLAGS
|
||||||
LIBS=$GNOME_SHELL_LIBS
|
LIBS=$GNOME_SHELL_LIBS
|
||||||
# sn_startup_sequence_get_application_id, we can replace with a version check later
|
AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
|
||||||
AC_CHECK_FUNCS(JS_NewGlobalObject sn_startup_sequence_get_application_id XFixesCreatePointerBarrier)
|
|
||||||
CFLAGS=$saved_CFLAGS
|
CFLAGS=$saved_CFLAGS
|
||||||
LIBS=$saved_LIBS
|
LIBS=$saved_LIBS
|
||||||
|
|
||||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 gnome-desktop-3.0 >= 2.90.0 x11)
|
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 gnome-desktop-3.0 >= 2.90.0 x11)
|
||||||
PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-3.0)
|
PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-3.0)
|
||||||
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||||
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
|
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
|
||||||
PKG_CHECK_MODULES(JS_TEST, clutter-x11-1.0 gjs-1.0 gobject-introspection-1.0 gtk+-3.0)
|
|
||||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 0.1.7)
|
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 0.1.7)
|
||||||
|
|
||||||
AC_MSG_CHECKING([for bluetooth support])
|
AC_MSG_CHECKING([for bluetooth support])
|
||||||
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 2.90.0],
|
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
||||||
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=libdir gnome-bluetooth-1.0`/gnome-bluetooth
|
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=applet_libdir gnome-bluetooth-1.0`
|
||||||
BLUETOOTH_LIBS="-L'$BLUETOOTH_DIR' -lgnome-bluetooth-applet"
|
BLUETOOTH_LIBS=`$PKG_CONFIG --variable=applet_libs gnome-bluetooth-1.0`
|
||||||
AC_SUBST([BLUETOOTH_LIBS],["$BLUETOOTH_LIBS"])
|
AC_SUBST([BLUETOOTH_LIBS],["$BLUETOOTH_LIBS"])
|
||||||
AC_DEFINE_UNQUOTED([BLUETOOTH_DIR],["$BLUETOOTH_DIR"],[Path to installed GnomeBluetooth typelib and library])
|
AC_DEFINE_UNQUOTED([BLUETOOTH_DIR],["$BLUETOOTH_DIR"],[Path to installed GnomeBluetooth typelib and library])
|
||||||
AC_DEFINE([HAVE_BLUETOOTH],[1],[Define if you have libgnome-bluetooth-applet])
|
AC_DEFINE([HAVE_BLUETOOTH],[1],[Define if you have libgnome-bluetooth-applet])
|
||||||
@ -136,13 +138,7 @@ PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 2.90.0],
|
|||||||
AC_SUBST([HAVE_BLUETOOTH],[0])
|
AC_SUBST([HAVE_BLUETOOTH],[0])
|
||||||
AC_MSG_RESULT([no])])
|
AC_MSG_RESULT([no])])
|
||||||
|
|
||||||
# Default to libedataserverui-3.0, but allow falling back to 1.2
|
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-3.0 >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0)
|
||||||
PKG_CHECK_EXISTS(libedataserverui-3.0,
|
|
||||||
[EDS_API=3.0
|
|
||||||
LIBEDATASERVERUI_MIN_VERSION=$LIBEDATASERVERUI3_MIN_VERSION],
|
|
||||||
[EDS_API=1.2
|
|
||||||
LIBEDATASERVERUI_MIN_VERSION=$LIBEDATASERVERUI2_MIN_VERSION])
|
|
||||||
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-$EDS_API >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0)
|
|
||||||
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
||||||
AC_SUBST(CALENDAR_SERVER_LIBS)
|
AC_SUBST(CALENDAR_SERVER_LIBS)
|
||||||
|
|
||||||
|
@ -30,26 +30,14 @@ dist_theme_DATA = \
|
|||||||
theme/filter-selected-ltr.svg \
|
theme/filter-selected-ltr.svg \
|
||||||
theme/filter-selected-rtl.svg \
|
theme/filter-selected-rtl.svg \
|
||||||
theme/gnome-shell.css \
|
theme/gnome-shell.css \
|
||||||
theme/mosaic-view-active.svg \
|
|
||||||
theme/mosaic-view.svg \
|
|
||||||
theme/move-window-on-new.svg \
|
|
||||||
theme/panel-border.svg \
|
theme/panel-border.svg \
|
||||||
theme/panel-button-border.svg \
|
theme/panel-button-border.svg \
|
||||||
theme/panel-button-highlight-narrow.svg \
|
theme/panel-button-highlight-narrow.svg \
|
||||||
theme/panel-button-highlight-wide.svg \
|
theme/panel-button-highlight-wide.svg \
|
||||||
theme/process-working.svg \
|
theme/process-working.svg \
|
||||||
theme/running-indicator.svg \
|
theme/running-indicator.svg \
|
||||||
theme/scroll-button-down-hover.png \
|
|
||||||
theme/scroll-button-down.png \
|
|
||||||
theme/scroll-button-up-hover.png \
|
|
||||||
theme/scroll-button-up.png \
|
|
||||||
theme/scroll-hhandle.svg \
|
theme/scroll-hhandle.svg \
|
||||||
theme/scroll-vhandle.svg \
|
theme/scroll-vhandle.svg \
|
||||||
theme/section-more.svg \
|
|
||||||
theme/section-more-open.svg \
|
|
||||||
theme/separator-white.png \
|
|
||||||
theme/single-view-active.svg \
|
|
||||||
theme/single-view.svg \
|
|
||||||
theme/source-button-border.svg \
|
theme/source-button-border.svg \
|
||||||
theme/toggle-off-us.svg \
|
theme/toggle-off-us.svg \
|
||||||
theme/toggle-off-intl.svg \
|
theme/toggle-off-intl.svg \
|
||||||
|
@ -15,8 +15,18 @@
|
|||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<_summary>Uuids of extensions to disable</_summary>
|
<_summary>Uuids of extensions to disable</_summary>
|
||||||
<_description>
|
<_description>
|
||||||
GNOME Shell extensions have a uuid property;
|
GNOME Shell extensions have a uuid property; this key lists extensions
|
||||||
this key lists extensions which should not be loaded.
|
which should not be loaded. This setting overrides enabled-extensions
|
||||||
|
for extensions that appear in both lists.
|
||||||
|
</_description>
|
||||||
|
</key>
|
||||||
|
<key name="enabled-extensions" type="as">
|
||||||
|
<default>[]</default>
|
||||||
|
<_summary>Uuids of extensions to enable</_summary>
|
||||||
|
<_description>
|
||||||
|
GNOME Shell extensions have a uuid property; this key lists extensions
|
||||||
|
which should be loaded. disabled-extensions overrides this setting for
|
||||||
|
extensions that appear in both lists.
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="enable-app-monitoring" type="b">
|
<key name="enable-app-monitoring" type="b">
|
||||||
|
@ -39,6 +39,11 @@ StScrollBar
|
|||||||
padding: 0px;
|
padding: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StScrollView.vfade
|
||||||
|
{
|
||||||
|
-st-vfade-offset: 68px;
|
||||||
|
}
|
||||||
|
|
||||||
StScrollView StScrollBar
|
StScrollView StScrollBar
|
||||||
{
|
{
|
||||||
min-width: 16px;
|
min-width: 16px;
|
||||||
@ -182,6 +187,7 @@ StTooltip StLabel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.popup-inactive-menu-item {
|
.popup-inactive-menu-item {
|
||||||
|
font-weight: normal;
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,113 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="24"
|
|
||||||
height="16"
|
|
||||||
id="svg6503"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.47pre4 r22446"
|
|
||||||
sodipodi:docname="mosaic-view-active.svg">
|
|
||||||
<defs
|
|
||||||
id="defs6505">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 16 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="32 : 16 : 1"
|
|
||||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
|
||||||
id="perspective6511" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective6494"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="11.197802"
|
|
||||||
inkscape:cx="-15.97056"
|
|
||||||
inkscape:cy="16"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="1680"
|
|
||||||
inkscape:window-height="997"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="26"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata6508">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,-16)">
|
|
||||||
<g
|
|
||||||
style="display:inline;fill:#cbcbcb;fill-opacity:1"
|
|
||||||
transform="translate(-449.85476,-685.85869)"
|
|
||||||
id="g5306">
|
|
||||||
<rect
|
|
||||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none"
|
|
||||||
id="rect5308"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="450.5"
|
|
||||||
y="710.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
<rect
|
|
||||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
|
|
||||||
id="rect5310"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="462.5"
|
|
||||||
y="702.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
<rect
|
|
||||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999976000000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
|
|
||||||
id="rect5312"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="450.5"
|
|
||||||
y="702.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
<rect
|
|
||||||
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
|
|
||||||
id="rect5314"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="462.5"
|
|
||||||
y="710.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.7 KiB |
@ -1,113 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="24"
|
|
||||||
height="16"
|
|
||||||
id="svg6503"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.47pre4 r22446"
|
|
||||||
sodipodi:docname="New document 19">
|
|
||||||
<defs
|
|
||||||
id="defs6505">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 16 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="32 : 16 : 1"
|
|
||||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
|
||||||
id="perspective6511" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective6494"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="11.197802"
|
|
||||||
inkscape:cx="16"
|
|
||||||
inkscape:cy="16"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="1680"
|
|
||||||
inkscape:window-height="997"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="26"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata6508">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,-16)">
|
|
||||||
<g
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(-449.85476,-685.85869)"
|
|
||||||
id="g5306">
|
|
||||||
<rect
|
|
||||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none"
|
|
||||||
id="rect5308"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="450.5"
|
|
||||||
y="710.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
<rect
|
|
||||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
|
|
||||||
id="rect5310"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="462.5"
|
|
||||||
y="702.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
<rect
|
|
||||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
|
|
||||||
id="rect5312"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="450.5"
|
|
||||||
y="702.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
<rect
|
|
||||||
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
|
|
||||||
id="rect5314"
|
|
||||||
width="11"
|
|
||||||
height="7"
|
|
||||||
x="462.5"
|
|
||||||
y="710.5"
|
|
||||||
rx="0.99999958"
|
|
||||||
ry="1" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.6 KiB |
@ -1,89 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="98"
|
|
||||||
height="98"
|
|
||||||
id="svg6375"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.47 r22583"
|
|
||||||
sodipodi:docname="add-workspace.svg">
|
|
||||||
<defs
|
|
||||||
id="defs6377">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 16 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="32 : 16 : 1"
|
|
||||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
|
||||||
id="perspective6383" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective6366"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="3.9590209"
|
|
||||||
inkscape:cx="56.650687"
|
|
||||||
inkscape:cy="20.635343"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="1680"
|
|
||||||
inkscape:window-height="997"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="26"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata6380">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,66)">
|
|
||||||
<g
|
|
||||||
id="g2824"
|
|
||||||
transform="matrix(11.568551,0,0,11.698271,-78.828159,-304.81518)">
|
|
||||||
<path
|
|
||||||
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
|
||||||
d="m 11.07363,21.36834 0,6.43903"
|
|
||||||
id="path5322" />
|
|
||||||
<path
|
|
||||||
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
|
||||||
d="m 14.29314,24.58786 -6.43902,0"
|
|
||||||
id="path5324" />
|
|
||||||
</g>
|
|
||||||
<path
|
|
||||||
style="fill:#000000;fill-opacity:0.98823529"
|
|
||||||
d="m 48.239516,97.908047 c -0.41677,-0.05102 -1.269253,-0.222408 -1.894408,-0.380859 -4.088493,-1.036262 -7.520781,-4.753234 -8.330163,-9.021094 -0.154947,-0.817026 -0.257819,-6.68112 -0.257819,-14.696556 l 0,-13.337088 -13.829177,-0.08909 C 10.802042,60.298796 10.026884,60.268266 8.6851548,59.783022 3.6288503,57.954375 0.62673331,53.828648 0.62673331,48.708554 c 0,-5.625522 4.25936019,-10.425065 9.97721469,-11.242548 0.987903,-0.141242 7.368912,-0.254994 14.460646,-0.257791 l 12.692532,-0.005 0,-13.586668 c 0,-14.6441583 0.03287,-15.0698926 1.364686,-17.6753047 2.185477,-4.2754229 6.938193,-6.75739913 11.687647,-6.10355607 3.382776,0.46569661 6.737962,2.72496967 8.414081,5.66577137 1.480816,2.5981315 1.519067,3.0522448 1.519067,18.0333334 l 0,13.666424 12.692533,0.005 c 7.091733,0.0028 13.472742,0.116549 14.460646,0.257791 6.395303,0.914337 10.804785,6.623716 9.941157,12.871766 -0.698243,5.051565 -4.792685,9.104635 -9.941157,9.840713 -0.987904,0.141242 -7.368913,0.254995 -14.460646,0.257791 l -12.692533,0.005 0,13.801945 c 0,13.031417 -0.02798,13.895893 -0.501177,15.484801 -1.526902,5.127058 -6.919246,8.802262 -12.001914,8.18002 z"
|
|
||||||
id="path2828"
|
|
||||||
transform="translate(0,-66)" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.0 KiB |
@ -2,24 +2,62 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<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:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="119.97824"
|
width="119.97824"
|
||||||
height="119.97824"
|
height="119.97824"
|
||||||
id="svg7355"
|
id="svg7355"
|
||||||
version="1.1">
|
version="1.1"
|
||||||
|
inkscape:version="0.48.1 r9760"
|
||||||
|
sodipodi:docname="running-indicator.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata4175">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#2c1cff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="1"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1141"
|
||||||
|
id="namedview4173"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="8.1348081"
|
||||||
|
inkscape:cx="81.120662"
|
||||||
|
inkscape:cy="58.117986"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="26"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="g30864" />
|
||||||
<defs
|
<defs
|
||||||
id="defs7357">
|
id="defs7357">
|
||||||
<radialGradient
|
<radialGradient
|
||||||
xlink:href="#linearGradient36429"
|
xlink:href="#linearGradient36429"
|
||||||
id="radialGradient7461"
|
id="radialGradient7461"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(1.0525552,0,0,1.0525552,-2.5162753,-9.0000838)"
|
gradientTransform="matrix(1.011539,0,0,0.57582113,-0.39262194,71.83807)"
|
||||||
cx="47.878681"
|
cx="47.428951"
|
||||||
cy="171.25"
|
cy="167.16817"
|
||||||
fx="47.878681"
|
fx="47.428951"
|
||||||
fy="171.25"
|
fy="167.16817"
|
||||||
r="37" />
|
r="37" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient36429">
|
id="linearGradient36429">
|
||||||
@ -59,7 +97,7 @@
|
|||||||
fx="49.067139"
|
fx="49.067139"
|
||||||
cy="242.50381"
|
cy="242.50381"
|
||||||
cx="49.067139"
|
cx="49.067139"
|
||||||
gradientTransform="matrix(1.1891549,0,0,0.55513246,-9.281289,36.12653)"
|
gradientTransform="matrix(1.1891549,0,0,0.15252127,-9.281289,132.52772)"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
id="radialGradient7488"
|
id="radialGradient7488"
|
||||||
xlink:href="#linearGradient36471" />
|
xlink:href="#linearGradient36471" />
|
||||||
@ -72,19 +110,21 @@
|
|||||||
id="g30864"
|
id="g30864"
|
||||||
transform="translate(255.223,70.118091)">
|
transform="translate(255.223,70.118091)">
|
||||||
<rect
|
<rect
|
||||||
ry="3.5996203"
|
ry="3.4593496"
|
||||||
rx="3.5996203"
|
rx="3.4593496"
|
||||||
y="98"
|
y="99.596962"
|
||||||
x="11"
|
x="12.596948"
|
||||||
height="74"
|
height="71.116341"
|
||||||
width="74"
|
width="71.116341"
|
||||||
id="rect14000"
|
id="rect14000"
|
||||||
style="opacity:0.371875;fill:url(#radialGradient7461);fill-opacity:1;stroke:none" />
|
style="opacity:0.37187500000000001;fill:url(#radialGradient7461);fill-opacity:1;stroke:none" />
|
||||||
<path
|
<path
|
||||||
id="rect34520"
|
id="rect34520"
|
||||||
d="m 84.506708,167.95508 c 6e-6,1.96759 -1.584022,3.55162 -3.551629,3.55163 l -65.910146,0 c -1.967608,-1e-5 -3.551648,-1.58402 -3.551643,-3.55164"
|
d="m 83.273151,166.72152 c 0,1.96759 -1.584022,3.55163 -3.551629,3.55163 l -63.443032,0 c -1.967608,0 -3.551648,-1.58402 -3.551643,-3.55164 0,-5.85318 0,-5.85318 0,0"
|
||||||
style="opacity:0.2;fill:none;stroke:url(#radialGradient7488);stroke-width:1;stroke-opacity:1"
|
style="opacity:0.35;fill:none;stroke:url(#radialGradient7488);stroke-width:1;stroke-opacity:1"
|
||||||
inkscape:connector-curvature="0" />
|
connector-curvature="0"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccscc" />
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 211 B |
Before Width: | Height: | Size: 211 B |
@ -1,87 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="5.8600588"
|
|
||||||
height="9"
|
|
||||||
id="svg3647"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.47 r22583"
|
|
||||||
sodipodi:docname="section-more.svg">
|
|
||||||
<defs
|
|
||||||
id="defs3649">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
|
||||||
id="perspective3655" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective3603"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="82.777778"
|
|
||||||
inkscape:cx="2.9300294"
|
|
||||||
inkscape:cy="5.466443"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="1680"
|
|
||||||
inkscape:window-height="997"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="26"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata3652">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-262.78425,-490.71933)">
|
|
||||||
<path
|
|
||||||
transform="matrix(0,-0.98149546,0.71467449,0,25.404986,578.15569)"
|
|
||||||
d="M 88.830127,340 80.169873,340 84.5,332.5 88.830127,340 z"
|
|
||||||
inkscape:randomized="0"
|
|
||||||
inkscape:rounded="0"
|
|
||||||
inkscape:flatsided="true"
|
|
||||||
sodipodi:arg2="1.5707963"
|
|
||||||
sodipodi:arg1="0.52359878"
|
|
||||||
sodipodi:r2="2.5"
|
|
||||||
sodipodi:r1="5"
|
|
||||||
sodipodi:cy="337.5"
|
|
||||||
sodipodi:cx="84.5"
|
|
||||||
sodipodi:sides="3"
|
|
||||||
id="path5497-5"
|
|
||||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.59699643;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
|
||||||
sodipodi:type="star" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.8 KiB |
@ -1,87 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="5.8600588"
|
|
||||||
height="9"
|
|
||||||
id="svg3647"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.46+devel"
|
|
||||||
sodipodi:docname="New document 6">
|
|
||||||
<defs
|
|
||||||
id="defs3649">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 526.18109 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
|
||||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
|
||||||
id="perspective3655" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective3603"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="0.35"
|
|
||||||
inkscape:cx="112.21575"
|
|
||||||
inkscape:cy="-32.642856"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="609"
|
|
||||||
inkscape:window-height="501"
|
|
||||||
inkscape:window-x="164"
|
|
||||||
inkscape:window-y="26"
|
|
||||||
inkscape:window-maximized="0" />
|
|
||||||
<metadata
|
|
||||||
id="metadata3652">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-262.78425,-490.71933)">
|
|
||||||
<path
|
|
||||||
transform="matrix(0,0.98149546,-0.71467449,0,506.02358,412.28296)"
|
|
||||||
d="M 88.830127,340 80.169873,340 84.5,332.5 88.830127,340 z"
|
|
||||||
inkscape:randomized="0"
|
|
||||||
inkscape:rounded="0"
|
|
||||||
inkscape:flatsided="true"
|
|
||||||
sodipodi:arg2="1.5707963"
|
|
||||||
sodipodi:arg1="0.52359878"
|
|
||||||
sodipodi:r2="2.5"
|
|
||||||
sodipodi:r1="5"
|
|
||||||
sodipodi:cy="337.5"
|
|
||||||
sodipodi:cx="84.5"
|
|
||||||
sodipodi:sides="3"
|
|
||||||
id="path5497-5"
|
|
||||||
style="fill:#5f5f5f;fill-opacity:1;stroke:#5f5f5f;stroke-width:0.59699643;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
|
||||||
sodipodi:type="star" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 531 B |
@ -1,81 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="24"
|
|
||||||
height="16"
|
|
||||||
id="svg6446"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.47pre4 r22446"
|
|
||||||
sodipodi:docname="single-view-active.svg">
|
|
||||||
<defs
|
|
||||||
id="defs6448">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 16 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="32 : 16 : 1"
|
|
||||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
|
||||||
id="perspective6454" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective6441"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="11.197802"
|
|
||||||
inkscape:cx="0.014720032"
|
|
||||||
inkscape:cy="16"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="1680"
|
|
||||||
inkscape:window-height="997"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="26"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata6451">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,-17)">
|
|
||||||
<rect
|
|
||||||
ry="0.5"
|
|
||||||
rx="0.49999979"
|
|
||||||
y="17.483809"
|
|
||||||
x="0.53483802"
|
|
||||||
height="15"
|
|
||||||
width="23"
|
|
||||||
id="rect5304"
|
|
||||||
style="fill:#cccccc;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,81 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="24"
|
|
||||||
height="16"
|
|
||||||
id="svg6446"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.47pre4 r22446"
|
|
||||||
sodipodi:docname="single-view.svg">
|
|
||||||
<defs
|
|
||||||
id="defs6448">
|
|
||||||
<inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 16 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_z="32 : 16 : 1"
|
|
||||||
inkscape:persp3d-origin="16 : 10.666667 : 1"
|
|
||||||
id="perspective6454" />
|
|
||||||
<inkscape:perspective
|
|
||||||
id="perspective6441"
|
|
||||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
|
||||||
inkscape:vp_z="1 : 0.5 : 1"
|
|
||||||
inkscape:vp_y="0 : 1000 : 0"
|
|
||||||
inkscape:vp_x="0 : 0.5 : 1"
|
|
||||||
sodipodi:type="inkscape:persp3d" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="11.197802"
|
|
||||||
inkscape:cx="0.014720032"
|
|
||||||
inkscape:cy="16"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:window-width="1680"
|
|
||||||
inkscape:window-height="997"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="26"
|
|
||||||
inkscape:window-maximized="1" />
|
|
||||||
<metadata
|
|
||||||
id="metadata6451">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
transform="translate(0,-17)">
|
|
||||||
<rect
|
|
||||||
ry="0.5"
|
|
||||||
rx="0.49999979"
|
|
||||||
y="17.483809"
|
|
||||||
x="0.53483802"
|
|
||||||
height="15"
|
|
||||||
width="23"
|
|
||||||
id="rect5304"
|
|
||||||
style="fill:#626262;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -13,8 +13,8 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg3199"
|
id="svg3199"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.47 r22583"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="New document 11">
|
sodipodi:docname="toggle-on-intl.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs3201">
|
id="defs3201">
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
@ -39,14 +39,14 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="0.35"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="32.500004"
|
inkscape:cx="49.147112"
|
||||||
inkscape:cy="10.999997"
|
inkscape:cy="17.532036"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="609"
|
inkscape:window-width="1412"
|
||||||
inkscape:window-height="501"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="26"
|
inkscape:window-y="26"
|
||||||
inkscape:window-maximized="0" />
|
inkscape:window-maximized="0" />
|
||||||
@ -58,7 +58,7 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
<dc:title />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@ -72,7 +72,7 @@
|
|||||||
transform="translate(-453.5,448.36218)"
|
transform="translate(-453.5,448.36218)"
|
||||||
id="g16453">
|
id="g16453">
|
||||||
<rect
|
<rect
|
||||||
style="color:#000000;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
style="color:#000000;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:0.99999994000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
id="rect16256-9-4"
|
id="rect16256-9-4"
|
||||||
width="63.000004"
|
width="63.000004"
|
||||||
height="19"
|
height="19"
|
||||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
@ -13,8 +13,8 @@
|
|||||||
height="22"
|
height="22"
|
||||||
id="svg2857"
|
id="svg2857"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.47 r22583"
|
inkscape:version="0.48.1 r9760"
|
||||||
sodipodi:docname="New document 2">
|
sodipodi:docname="toggle-on-us.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2859">
|
id="defs2859">
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
@ -40,16 +40,18 @@
|
|||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="-69.642856"
|
inkscape:cx="19.689855"
|
||||||
inkscape:cy="42.428569"
|
inkscape:cy="2.0517979"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="609"
|
inkscape:window-width="941"
|
||||||
inkscape:window-height="501"
|
inkscape:window-height="751"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="2577"
|
||||||
inkscape:window-y="26"
|
inkscape:window-y="206"
|
||||||
inkscape:window-maximized="0" />
|
inkscape:window-maximized="0"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false" />
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata2862">
|
id="metadata2862">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
@ -58,7 +60,7 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
<dc:title />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@ -72,7 +74,7 @@
|
|||||||
transform="translate(-351.35714,708.36218)"
|
transform="translate(-351.35714,708.36218)"
|
||||||
id="g16453">
|
id="g16453">
|
||||||
<rect
|
<rect
|
||||||
style="color:#000000;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
style="color:#000000;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:0.99999994000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
id="rect16256-9-4"
|
id="rect16256-9-4"
|
||||||
width="63.000004"
|
width="63.000004"
|
||||||
height="19"
|
height="19"
|
||||||
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.8 KiB |
@ -109,7 +109,8 @@ const SessionManagerIface = {
|
|||||||
name: 'org.gnome.SessionManager',
|
name: 'org.gnome.SessionManager',
|
||||||
methods: [
|
methods: [
|
||||||
{ name: 'Logout', inSignature: 'u', outSignature: '' },
|
{ name: 'Logout', inSignature: 'u', outSignature: '' },
|
||||||
{ name: 'Shutdown', inSignature: '', outSignature: '' }
|
{ name: 'Shutdown', inSignature: '', outSignature: '' },
|
||||||
|
{ name: 'CanShutdown', inSignature: '', outSignature: 'b' }
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -77,9 +77,9 @@ HistoryManager.prototype = {
|
|||||||
this._history[this._history.length - 1] != input) {
|
this._history[this._history.length - 1] != input) {
|
||||||
|
|
||||||
this._history.push(input);
|
this._history.push(input);
|
||||||
this._historyIndex = this._history.length;
|
|
||||||
this._save();
|
this._save();
|
||||||
}
|
}
|
||||||
|
this._historyIndex = this._history.length;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onEntryKeyPress: function(entry, event) {
|
_onEntryKeyPress: function(entry, event) {
|
||||||
|
@ -7,9 +7,6 @@ const Shell = imports.gi.Shell;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
/* http://daringfireball.net/2010/07/improved_regex_for_matching_urls */
|
/* http://daringfireball.net/2010/07/improved_regex_for_matching_urls */
|
||||||
const _urlRegexp = new RegExp('\\b(([a-z][\\w-]+:(/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)([^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\\".,<>?«»“”‘’]))', 'gi');
|
const _urlRegexp = new RegExp('\\b(([a-z][\\w-]+:(/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)([^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\\".,<>?«»“”‘’]))', 'gi');
|
||||||
|
|
||||||
@ -48,7 +45,7 @@ function spawn(argv) {
|
|||||||
// occur when trying to parse or start the program.
|
// occur when trying to parse or start the program.
|
||||||
function spawnCommandLine(command_line) {
|
function spawnCommandLine(command_line) {
|
||||||
try {
|
try {
|
||||||
let [success, argc, argv] = GLib.shell_parse_argv(command_line);
|
let [success, argv] = GLib.shell_parse_argv(command_line);
|
||||||
trySpawn(argv);
|
trySpawn(argv);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
_handleSpawnError(command_line, err);
|
_handleSpawnError(command_line, err);
|
||||||
@ -88,10 +85,10 @@ function trySpawn(argv)
|
|||||||
// Runs @command_line in the background. If launching @command_line
|
// Runs @command_line in the background. If launching @command_line
|
||||||
// fails, this will throw an error.
|
// fails, this will throw an error.
|
||||||
function trySpawnCommandLine(command_line) {
|
function trySpawnCommandLine(command_line) {
|
||||||
let success, argc, argv;
|
let success, argv;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
[success, argc, argv] = GLib.shell_parse_argv(command_line);
|
[success, argv] = GLib.shell_parse_argv(command_line);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Replace "Error invoking GLib.shell_parse_argv: " with
|
// Replace "Error invoking GLib.shell_parse_argv: " with
|
||||||
// something nicer
|
// something nicer
|
||||||
|
@ -87,7 +87,7 @@ AltTabPopup.prototype = {
|
|||||||
let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(primary.width - hPadding);
|
let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(primary.width - hPadding);
|
||||||
let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight);
|
let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight);
|
||||||
childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2));
|
childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2));
|
||||||
childBox.x2 = Math.min(primary.x + primary.width - hPadding, childBox.x1 + childNaturalWidth);
|
childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth);
|
||||||
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
|
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
|
||||||
childBox.y2 = childBox.y1 + childNaturalHeight;
|
childBox.y2 = childBox.y1 + childNaturalHeight;
|
||||||
this._appSwitcher.actor.allocate(childBox, flags);
|
this._appSwitcher.actor.allocate(childBox, flags);
|
||||||
@ -97,8 +97,6 @@ AltTabPopup.prototype = {
|
|||||||
// those calculations
|
// those calculations
|
||||||
if (this._thumbnails) {
|
if (this._thumbnails) {
|
||||||
let icon = this._appIcons[this._currentApp].actor;
|
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 [posX, posY] = icon.get_transformed_position();
|
||||||
let thumbnailCenter = posX + icon.width / 2;
|
let thumbnailCenter = posX + icon.width / 2;
|
||||||
let [childMinWidth, childNaturalWidth] = this._thumbnails.actor.get_preferred_width(-1);
|
let [childMinWidth, childNaturalWidth] = this._thumbnails.actor.get_preferred_width(-1);
|
||||||
@ -145,6 +143,12 @@ AltTabPopup.prototype = {
|
|||||||
|
|
||||||
this._appIcons = this._appSwitcher.icons;
|
this._appIcons = this._appSwitcher.icons;
|
||||||
|
|
||||||
|
// Need to force an allocation so we can figure out whether we
|
||||||
|
// need to scroll when selecting
|
||||||
|
this.actor.opacity = 0;
|
||||||
|
this.actor.show();
|
||||||
|
this.actor.get_allocation_box();
|
||||||
|
|
||||||
// Make the initial selection
|
// Make the initial selection
|
||||||
if (switch_group) {
|
if (switch_group) {
|
||||||
if (backward) {
|
if (backward) {
|
||||||
@ -174,8 +178,6 @@ AltTabPopup.prototype = {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.actor.opacity = 0;
|
|
||||||
this.actor.show();
|
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this.actor,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: POPUP_FADE_TIME,
|
time: POPUP_FADE_TIME,
|
||||||
@ -215,33 +217,21 @@ AltTabPopup.prototype = {
|
|||||||
|
|
||||||
this._disableHover();
|
this._disableHover();
|
||||||
|
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_GROUP)
|
if (keysym == Clutter.Escape) {
|
||||||
this._select(this._currentApp, backwards ? this._previousWindow() : this._nextWindow());
|
|
||||||
else if (keysym == Clutter.Escape)
|
|
||||||
this.destroy();
|
this.destroy();
|
||||||
else if (this._thumbnailsFocused) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS)
|
this._select(this._currentApp, backwards ? this._previousWindow() : this._nextWindow());
|
||||||
if (backwards) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
|
||||||
if (this._currentWindow == 0 || this._currentWindow == -1)
|
this._select(backwards ? this._previousApp() : this._nextApp());
|
||||||
this._select(this._previousApp());
|
} else if (this._thumbnailsFocused) {
|
||||||
else
|
if (keysym == Clutter.Left)
|
||||||
this._select(this._currentApp, this._previousWindow());
|
|
||||||
} else {
|
|
||||||
if (this._currentWindow == this._appIcons[this._currentApp].cachedWindows.length - 1)
|
|
||||||
this._select(this._nextApp());
|
|
||||||
else
|
|
||||||
this._select(this._currentApp, this._nextWindow());
|
|
||||||
}
|
|
||||||
else if (keysym == Clutter.Left)
|
|
||||||
this._select(this._currentApp, this._previousWindow());
|
this._select(this._currentApp, this._previousWindow());
|
||||||
else if (keysym == Clutter.Right)
|
else if (keysym == Clutter.Right)
|
||||||
this._select(this._currentApp, this._nextWindow());
|
this._select(this._currentApp, this._nextWindow());
|
||||||
else if (keysym == Clutter.Up)
|
else if (keysym == Clutter.Up)
|
||||||
this._select(this._currentApp, null, true);
|
this._select(this._currentApp, null, true);
|
||||||
} else {
|
} else {
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS)
|
if (keysym == Clutter.Left)
|
||||||
this._select(backwards ? this._previousApp() : this._nextApp());
|
|
||||||
else if (keysym == Clutter.Left)
|
|
||||||
this._select(this._previousApp());
|
this._select(this._previousApp());
|
||||||
else if (keysym == Clutter.Right)
|
else if (keysym == Clutter.Right)
|
||||||
this._select(this._nextApp());
|
this._select(this._nextApp());
|
||||||
@ -583,7 +573,7 @@ SwitcherList.prototype = {
|
|||||||
this._rightArrow.opacity = this._rightGradient.opacity;
|
this._rightArrow.opacity = this._rightGradient.opacity;
|
||||||
},
|
},
|
||||||
|
|
||||||
addItem : function(item) {
|
addItem : function(item, label) {
|
||||||
let bbox = new St.Button({ style_class: 'item-box',
|
let bbox = new St.Button({ style_class: 'item-box',
|
||||||
reactive: true });
|
reactive: true });
|
||||||
|
|
||||||
@ -594,6 +584,8 @@ SwitcherList.prototype = {
|
|||||||
bbox.connect('clicked', Lang.bind(this, function() { this._onItemClicked(n); }));
|
bbox.connect('clicked', Lang.bind(this, function() { this._onItemClicked(n); }));
|
||||||
bbox.connect('enter-event', Lang.bind(this, function() { this._onItemEnter(n); }));
|
bbox.connect('enter-event', Lang.bind(this, function() { this._onItemEnter(n); }));
|
||||||
|
|
||||||
|
bbox.label_actor = label;
|
||||||
|
|
||||||
this._items.push(bbox);
|
this._items.push(bbox);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -979,7 +971,7 @@ AppSwitcher.prototype = {
|
|||||||
|
|
||||||
_addIcon : function(appIcon) {
|
_addIcon : function(appIcon) {
|
||||||
this.icons.push(appIcon);
|
this.icons.push(appIcon);
|
||||||
this.addItem(appIcon.actor);
|
this.addItem(appIcon.actor, appIcon.label);
|
||||||
|
|
||||||
let n = this._arrows.length;
|
let n = this._arrows.length;
|
||||||
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
||||||
@ -1049,9 +1041,12 @@ ThumbnailList.prototype = {
|
|||||||
this._labels.push(bin);
|
this._labels.push(bin);
|
||||||
bin.add_actor(name);
|
bin.add_actor(name);
|
||||||
box.add_actor(bin);
|
box.add_actor(bin);
|
||||||
|
|
||||||
|
this.addItem(box, name);
|
||||||
|
} else {
|
||||||
|
this.addItem(box, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addItem(box);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -9,8 +9,6 @@ const Signals = imports.signals;
|
|||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const AppFavorites = imports.ui.appFavorites;
|
const AppFavorites = imports.ui.appFavorites;
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
@ -46,7 +44,7 @@ AlphabeticalView.prototype = {
|
|||||||
this.actor = new St.ScrollView({ x_fill: true,
|
this.actor = new St.ScrollView({ x_fill: true,
|
||||||
y_fill: false,
|
y_fill: false,
|
||||||
y_align: St.Align.START,
|
y_align: St.Align.START,
|
||||||
vfade: true });
|
style_class: 'vfade' });
|
||||||
this.actor.add_actor(box);
|
this.actor.add_actor(box);
|
||||||
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
this.actor.connect('notify::mapped', Lang.bind(this,
|
this.actor.connect('notify::mapped', Lang.bind(this,
|
||||||
@ -126,7 +124,7 @@ AlphabeticalView.prototype = {
|
|||||||
if (currentTimeMillis - startTimeMillis > MAX_APPLICATION_WORK_MILLIS)
|
if (currentTimeMillis - startTimeMillis > MAX_APPLICATION_WORK_MILLIS)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
this._pendingAppIds.splice(0, i);
|
this._pendingAppIds.splice(0, i + 1);
|
||||||
if (this._pendingAppIds.length > 0) {
|
if (this._pendingAppIds.length > 0) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@ -434,6 +432,8 @@ AppWellIcon.prototype = {
|
|||||||
this.icon = new AppIcon(app, iconParams);
|
this.icon = new AppIcon(app, iconParams);
|
||||||
this.actor.set_child(this.icon.actor);
|
this.actor.set_child(this.icon.actor);
|
||||||
|
|
||||||
|
this.actor.label_actor = this.icon.label;
|
||||||
|
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||||
this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu));
|
this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu));
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
@ -8,9 +8,6 @@ const St = imports.gi.St;
|
|||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
const Gettext_gtk30 = imports.gettext.domain('gtk30');
|
const Gettext_gtk30 = imports.gettext.domain('gtk30');
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
const C_ = Gettext.pgettext;
|
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@ const Params = imports.misc.params;
|
|||||||
// workspace content.
|
// workspace content.
|
||||||
|
|
||||||
const defaultParams = {
|
const defaultParams = {
|
||||||
visibleInOverview: false,
|
|
||||||
visibleInFullscreen: false,
|
visibleInFullscreen: false,
|
||||||
affectsStruts: true,
|
affectsStruts: true,
|
||||||
affectsInputRegion: true
|
affectsInputRegion: true
|
||||||
@ -73,11 +72,8 @@ Chrome.prototype = {
|
|||||||
// in its visibility will affect the input region, but NOT the
|
// in its visibility will affect the input region, but NOT the
|
||||||
// struts.
|
// struts.
|
||||||
//
|
//
|
||||||
// If %visibleInOverview is %true in @params, @actor will remain
|
// If %visibleInFullscreen is %true, the actor will be visible
|
||||||
// visible when the overview is brought up. Otherwise it will
|
// even when a fullscreen window should be covering it.
|
||||||
// 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
|
// If %affectsStruts or %affectsInputRegion is %false, the actor
|
||||||
// will not have the indicated effect.
|
// will not have the indicated effect.
|
||||||
@ -96,7 +92,7 @@ Chrome.prototype = {
|
|||||||
//
|
//
|
||||||
// @params can have any of the same values as in addActor(), though
|
// @params can have any of the same values as in addActor(), though
|
||||||
// some possibilities don't make sense (eg, trying to have a
|
// some possibilities don't make sense (eg, trying to have a
|
||||||
// %visibleInOverview child of a non-%visibleInOverview parent).
|
// %visibleInFullscreen child of a non-%visibleInFullscreen parent).
|
||||||
// By default, @actor has the same params as its chrome ancestor.
|
// By default, @actor has the same params as its chrome ancestor.
|
||||||
trackActor: function(actor, params) {
|
trackActor: function(actor, params) {
|
||||||
let ancestor = actor.get_parent();
|
let ancestor = actor.get_parent();
|
||||||
@ -189,10 +185,8 @@ Chrome.prototype = {
|
|||||||
_updateVisibility: function() {
|
_updateVisibility: function() {
|
||||||
for (let i = 0; i < this._trackedActors.length; i++) {
|
for (let i = 0; i < this._trackedActors.length; i++) {
|
||||||
let actorData = this._trackedActors[i];
|
let actorData = this._trackedActors[i];
|
||||||
if (this._inOverview && !actorData.visibleInOverview)
|
if (!this._inOverview && !actorData.visibleInFullscreen &&
|
||||||
this.actor.set_skip_paint(actorData.actor, true);
|
this._findMonitorForActor(actorData.actor).inFullscreen)
|
||||||
else if (!this._inOverview && !actorData.visibleInFullscreen &&
|
|
||||||
this._findMonitorForActor(actorData.actor).inFullscreen)
|
|
||||||
this.actor.set_skip_paint(actorData.actor, true);
|
this.actor.set_skip_paint(actorData.actor, true);
|
||||||
else
|
else
|
||||||
this.actor.set_skip_paint(actorData.actor, false);
|
this.actor.set_skip_paint(actorData.actor, false);
|
||||||
@ -335,11 +329,6 @@ Chrome.prototype = {
|
|||||||
this._updateVisibility();
|
this._updateVisibility();
|
||||||
this._queueUpdateRegions();
|
this._queueUpdateRegions();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Figure out where the pointer is in case we lost track of
|
|
||||||
// it during a grab. (In particular, if a trayicon popup menu
|
|
||||||
// is dismissed, see if we need to close the message tray.)
|
|
||||||
global.sync_pointer();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateRegions: function() {
|
_updateRegions: function() {
|
||||||
|
@ -323,6 +323,6 @@ CtrlAltTabSwitcher.prototype = {
|
|||||||
let text = new St.Label({ text: item.name });
|
let text = new St.Label({ text: item.name });
|
||||||
box.add(text, { x_fill: false });
|
box.add(text, { x_fill: false });
|
||||||
|
|
||||||
this.addItem(box);
|
this.addItem(box, text);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -6,8 +6,6 @@ const Lang = imports.lang;
|
|||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const AppDisplay = imports.ui.appDisplay;
|
const AppDisplay = imports.ui.appDisplay;
|
||||||
const AppFavorites = imports.ui.appFavorites;
|
const AppFavorites = imports.ui.appFavorites;
|
||||||
@ -326,7 +324,7 @@ Dash.prototype = {
|
|||||||
this._favRemoveTarget = null;
|
this._favRemoveTarget = null;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
DND.removeMonitor(this._dragMonitor);
|
DND.removeDragMonitor(this._dragMonitor);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDragMotion: function(dragEvent) {
|
_onDragMotion: function(dragEvent) {
|
||||||
@ -344,7 +342,10 @@ Dash.prototype = {
|
|||||||
|
|
||||||
let srcIsFavorite = (id in favorites);
|
let srcIsFavorite = (id in favorites);
|
||||||
|
|
||||||
if (srcIsFavorite && this._favRemoveTarget == null) {
|
if (srcIsFavorite &&
|
||||||
|
dragEvent.source.actor &&
|
||||||
|
this.actor.contains (dragEvent.source.actor) &&
|
||||||
|
this._favRemoveTarget == null) {
|
||||||
this._favRemoveTarget = new RemoveFavoriteIcon();
|
this._favRemoveTarget = new RemoveFavoriteIcon();
|
||||||
this._favRemoveTarget.icon.setIconSize(this.iconSize);
|
this._favRemoveTarget.icon.setIconSize(this.iconSize);
|
||||||
this._box.add(this._favRemoveTarget.actor);
|
this._box.add(this._favRemoveTarget.actor);
|
||||||
|
@ -8,8 +8,6 @@ const Cairo = imports.cairo;
|
|||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -200,6 +198,7 @@ DateMenuButton.prototype = {
|
|||||||
|
|
||||||
_onPreferencesActivate: function() {
|
_onPreferencesActivate: function() {
|
||||||
this.menu.close();
|
this.menu.close();
|
||||||
|
Main.overview.hide();
|
||||||
let app = Shell.AppSystem.get_default().get_app('gnome-datetime-panel.desktop');
|
let app = Shell.AppSystem.get_default().get_app('gnome-datetime-panel.desktop');
|
||||||
app.activate(-1);
|
app.activate(-1);
|
||||||
},
|
},
|
||||||
|
@ -61,7 +61,7 @@ function addDragMonitor(monitor) {
|
|||||||
dragMonitors.push(monitor);
|
dragMonitors.push(monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeMonitor(monitor) {
|
function removeDragMonitor(monitor) {
|
||||||
for (let i = 0; i < dragMonitors.length; i++)
|
for (let i = 0; i < dragMonitors.length; i++)
|
||||||
if (dragMonitors[i] == monitor) {
|
if (dragMonitors[i] == monitor) {
|
||||||
dragMonitors.splice(i, 1);
|
dragMonitors.splice(i, 1);
|
||||||
@ -284,13 +284,13 @@ _Draggable.prototype = {
|
|||||||
this._dragOffsetY = actorStageY - this._dragStartY;
|
this._dragOffsetY = actorStageY - this._dragStartY;
|
||||||
|
|
||||||
// Set the actor's scale such that it will keep the same
|
// Set the actor's scale such that it will keep the same
|
||||||
// transformed size when it's reparented to the stage
|
// transformed size when it's reparented to the uiGroup
|
||||||
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
|
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
|
||||||
this.actor.set_scale(scaledWidth / this.actor.width,
|
this.actor.set_scale(scaledWidth / this.actor.width,
|
||||||
scaledHeight / this.actor.height);
|
scaledHeight / this.actor.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._dragActor.reparent(this.actor.get_stage());
|
this._dragActor.reparent(Main.uiGroup);
|
||||||
this._dragActor.raise_top();
|
this._dragActor.raise_top();
|
||||||
Shell.util_set_hidden_from_pick(this._dragActor, true);
|
Shell.util_set_hidden_from_pick(this._dragActor, true);
|
||||||
|
|
||||||
@ -442,7 +442,7 @@ _Draggable.prototype = {
|
|||||||
return true;
|
return true;
|
||||||
// If it accepted the drop without taking the actor,
|
// If it accepted the drop without taking the actor,
|
||||||
// handle it ourselves.
|
// handle it ourselves.
|
||||||
if (this._dragActor.get_parent() == this._dragActor.get_stage()) {
|
if (this._dragActor.get_parent() == Main.uiGroup) {
|
||||||
if (this._restoreOnSuccess) {
|
if (this._restoreOnSuccess) {
|
||||||
this._restoreDragActor(event.get_time());
|
this._restoreDragActor(event.get_time());
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const DocInfo = imports.misc.docInfo;
|
const DocInfo = imports.misc.docInfo;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Search = imports.ui.search;
|
const Search = imports.ui.search;
|
||||||
|
@ -22,9 +22,6 @@ const DBus = imports.dbus;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Gdm = imports.gi.Gdm;
|
const Gdm = imports.gi.Gdm;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
|
@ -1,14 +1,22 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- 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 Clutter = imports.gi.Clutter;;
|
||||||
|
const Gettext = imports.gettext;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
|
const Gtk = imports.gi.Gtk;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext_gtk30 = imports.gettext.domain('gtk30');
|
|
||||||
|
|
||||||
const Tweener = imports.ui.tweener;
|
// We can't import shell JS modules yet, because they may have
|
||||||
|
// variable initializations, etc, that depend on init() already having
|
||||||
|
// been run.
|
||||||
|
|
||||||
const Format = imports.misc.format;
|
|
||||||
|
|
||||||
// "monkey patch" in some varargs ClutterContainer methods; we need
|
// "monkey patch" in some varargs ClutterContainer methods; we need
|
||||||
// to do this per-container class since there is no representation
|
// to do this per-container class since there is no representation
|
||||||
@ -31,49 +39,42 @@ function _patchContainerClass(containerClass) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace @method with something that throws an error instead
|
function init() {
|
||||||
function _blockMethod(method, replacement, reason) {
|
// Add some bindings to the global JS namespace; (gjs keeps the web
|
||||||
let match = method.match(/^(.+)\.([^.]+)$/);
|
// browser convention of having that namespace be called 'window'.)
|
||||||
if (!match)
|
window.global = Shell.Global.get();
|
||||||
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))
|
window._ = Gettext.gettext;
|
||||||
throw new Error('Bad method name "' + method + '"');
|
window.C_ = Gettext.pgettext;
|
||||||
|
window.ngettext = Gettext.ngettext;
|
||||||
|
|
||||||
// eval() is evil in general, but we know it's safe here since
|
// Set the default direction for St widgets (this needs to be done before any use of St)
|
||||||
// set_property_mutable() would have failed if proto was
|
if (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL) {
|
||||||
// malformed.
|
St.Widget.set_default_direction(St.TextDirection.RTL);
|
||||||
let node = eval(proto);
|
}
|
||||||
|
|
||||||
let msg = 'Do not use "' + method + '".';
|
// Miscellaneous monkeypatching
|
||||||
if (replacement)
|
_patchContainerClass(St.BoxLayout);
|
||||||
msg += ' Use "' + replacement + '" instead.';
|
_patchContainerClass(St.Table);
|
||||||
if (reason)
|
|
||||||
msg += ' (' + reason + ')';
|
|
||||||
|
|
||||||
node[property] = function() {
|
Clutter.Actor.prototype.toString = function() {
|
||||||
throw new Error(msg);
|
return St.describe_actor(this);
|
||||||
};
|
};
|
||||||
|
|
||||||
global.set_property_mutable(proto, property, false);
|
let origToString = Object.prototype.toString;
|
||||||
}
|
Object.prototype.toString = function() {
|
||||||
|
let base = origToString.call(this);
|
||||||
function init() {
|
if ('actor' in this && this.actor instanceof Clutter.Actor)
|
||||||
Tweener.init();
|
return base.replace(/\]$/, ' delegate for ' + this.actor.toString().substring(1));
|
||||||
String.prototype.format = Format.format;
|
else
|
||||||
|
return base;
|
||||||
|
};
|
||||||
|
|
||||||
// Work around https://bugzilla.mozilla.org/show_bug.cgi?id=508783
|
// Work around https://bugzilla.mozilla.org/show_bug.cgi?id=508783
|
||||||
Date.prototype.toLocaleFormat = function(format) {
|
Date.prototype.toLocaleFormat = function(format) {
|
||||||
return Shell.util_format_date(format, this.getTime());
|
return Shell.util_format_date(format, this.getTime());
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set the default direction for St widgets (this needs to be done before any use of St)
|
|
||||||
if (Gettext_gtk30.gettext('default:LTR') == 'default:RTL') {
|
|
||||||
St.Widget.set_default_direction(St.TextDirection.RTL);
|
|
||||||
}
|
|
||||||
|
|
||||||
let slowdownEnv = GLib.getenv('GNOME_SHELL_SLOWDOWN_FACTOR');
|
let slowdownEnv = GLib.getenv('GNOME_SHELL_SLOWDOWN_FACTOR');
|
||||||
if (slowdownEnv) {
|
if (slowdownEnv) {
|
||||||
let factor = parseFloat(slowdownEnv);
|
let factor = parseFloat(slowdownEnv);
|
||||||
@ -81,24 +82,10 @@ function init() {
|
|||||||
St.set_slow_down_factor(factor);
|
St.set_slow_down_factor(factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
_patchContainerClass(St.BoxLayout);
|
// OK, now things are initialized enough that we can import shell JS
|
||||||
_patchContainerClass(St.Table);
|
const Format = imports.misc.format;
|
||||||
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
Clutter.Actor.prototype.toString = function() {
|
Tweener.init();
|
||||||
return St.describe_actor(this);
|
String.prototype.format = Format.format;
|
||||||
};
|
|
||||||
|
|
||||||
if (window.global === undefined) // test environment
|
|
||||||
return;
|
|
||||||
|
|
||||||
_blockMethod('Clutter.Event.get_state', 'Shell.get_event_state',
|
|
||||||
'gjs\'s handling of Clutter.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;
|
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,9 @@ const ExtensionType = {
|
|||||||
const extensionMeta = {};
|
const extensionMeta = {};
|
||||||
// Maps uuid -> importer object (extension directory tree)
|
// Maps uuid -> importer object (extension directory tree)
|
||||||
const extensions = {};
|
const extensions = {};
|
||||||
// Array of uuids
|
// Arrays of uuids
|
||||||
var disabledExtensions;
|
var disabledExtensions;
|
||||||
|
var enabledExtensions;
|
||||||
// GFile for user extensions
|
// GFile for user extensions
|
||||||
var userExtensionsDir = null;
|
var userExtensionsDir = null;
|
||||||
|
|
||||||
@ -178,6 +179,7 @@ function init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
disabledExtensions = global.settings.get_strv('disabled-extensions', -1);
|
disabledExtensions = global.settings.get_strv('disabled-extensions', -1);
|
||||||
|
enabledExtensions = global.settings.get_strv('enabled-extensions', -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _loadExtensionsIn(dir, type) {
|
function _loadExtensionsIn(dir, type) {
|
||||||
@ -195,7 +197,10 @@ function _loadExtensionsIn(dir, type) {
|
|||||||
if (fileType != Gio.FileType.DIRECTORY)
|
if (fileType != Gio.FileType.DIRECTORY)
|
||||||
continue;
|
continue;
|
||||||
let name = info.get_name();
|
let name = info.get_name();
|
||||||
let enabled = disabledExtensions.indexOf(name) < 0;
|
// Enable all but disabled extensions if enabledExtensions is not set.
|
||||||
|
// If it is set, enable one those, except they are disabled as well.
|
||||||
|
let enabled = (enabledExtensions.length == 0 || enabledExtensions.indexOf(name) >= 0)
|
||||||
|
&& disabledExtensions.indexOf(name) < 0;
|
||||||
let child = dir.get_child(name);
|
let child = dir.get_child(name);
|
||||||
loadExtension(child, enabled, type);
|
loadExtension(child, enabled, type);
|
||||||
}
|
}
|
||||||
|
@ -42,10 +42,10 @@ BaseIcon.prototype = {
|
|||||||
box.add_actor(this._iconBin);
|
box.add_actor(this._iconBin);
|
||||||
|
|
||||||
if (params.showLabel) {
|
if (params.showLabel) {
|
||||||
this._name = new St.Label({ text: label });
|
this.label = new St.Label({ text: label });
|
||||||
box.add_actor(this._name);
|
box.add_actor(this.label);
|
||||||
} else {
|
} else {
|
||||||
this._name = null;
|
this.label = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.createIcon)
|
if (params.createIcon)
|
||||||
@ -67,8 +67,8 @@ BaseIcon.prototype = {
|
|||||||
|
|
||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
|
|
||||||
if (this._name) {
|
if (this.label) {
|
||||||
let [labelMinHeight, labelNatHeight] = this._name.get_preferred_height(-1);
|
let [labelMinHeight, labelNatHeight] = this.label.get_preferred_height(-1);
|
||||||
preferredHeight += this._spacing + labelNatHeight;
|
preferredHeight += this._spacing + labelNatHeight;
|
||||||
|
|
||||||
let labelHeight = availHeight >= preferredHeight ? labelNatHeight
|
let labelHeight = availHeight >= preferredHeight ? labelNatHeight
|
||||||
@ -79,7 +79,7 @@ BaseIcon.prototype = {
|
|||||||
childBox.x2 = availWidth;
|
childBox.x2 = availWidth;
|
||||||
childBox.y1 = iconSize + this._spacing;
|
childBox.y1 = iconSize + this._spacing;
|
||||||
childBox.y2 = childBox.y1 + labelHeight;
|
childBox.y2 = childBox.y1 + labelHeight;
|
||||||
this._name.allocate(childBox, flags);
|
this.label.allocate(childBox, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
childBox.x1 = Math.floor((availWidth - iconNatWidth) / 2);
|
childBox.x1 = Math.floor((availWidth - iconNatWidth) / 2);
|
||||||
@ -98,8 +98,8 @@ BaseIcon.prototype = {
|
|||||||
alloc.min_size = iconMinHeight;
|
alloc.min_size = iconMinHeight;
|
||||||
alloc.natural_size = iconNatHeight;
|
alloc.natural_size = iconNatHeight;
|
||||||
|
|
||||||
if (this._name) {
|
if (this.label) {
|
||||||
let [labelMinHeight, labelNatHeight] = this._name.get_preferred_height(forWidth);
|
let [labelMinHeight, labelNatHeight] = this.label.get_preferred_height(forWidth);
|
||||||
alloc.min_size += this._spacing + labelMinHeight;
|
alloc.min_size += this._spacing + labelMinHeight;
|
||||||
alloc.natural_size += this._spacing + labelNatHeight;
|
alloc.natural_size += this._spacing + labelNatHeight;
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,13 @@ const Cogl = imports.gi.Cogl;
|
|||||||
const GConf = imports.gi.GConf;
|
const GConf = imports.gi.GConf;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
|
const Gtk = imports.gi.Gtk;
|
||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const History = imports.misc.history;
|
const History = imports.misc.history;
|
||||||
const ExtensionSystem = imports.ui.extensionSystem;
|
const ExtensionSystem = imports.ui.extensionSystem;
|
||||||
@ -100,12 +99,19 @@ Notebook.prototype = {
|
|||||||
selectIndex: function(index) {
|
selectIndex: function(index) {
|
||||||
if (index == this._selectedIndex)
|
if (index == this._selectedIndex)
|
||||||
return;
|
return;
|
||||||
this._unselect();
|
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
|
this._unselect();
|
||||||
this.emit('selection', null);
|
this.emit('selection', null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Focus the new tab before unmapping the old one
|
||||||
let tabData = this._tabs[index];
|
let tabData = this._tabs[index];
|
||||||
|
if (!tabData.scrollView.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false))
|
||||||
|
this.actor.grab_key_focus();
|
||||||
|
|
||||||
|
this._unselect();
|
||||||
|
|
||||||
tabData.labelBox.add_style_pseudo_class('selected');
|
tabData.labelBox.add_style_pseudo_class('selected');
|
||||||
tabData.scrollView.show();
|
tabData.scrollView.show();
|
||||||
this._selectedIndex = index;
|
this._selectedIndex = index;
|
||||||
@ -576,6 +582,53 @@ ErrorLog.prototype = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function Memory() {
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
Memory.prototype = {
|
||||||
|
_init: function() {
|
||||||
|
this.actor = new St.BoxLayout({ vertical: true });
|
||||||
|
this._glibc_uordblks = new St.Label();
|
||||||
|
this.actor.add(this._glibc_uordblks);
|
||||||
|
|
||||||
|
this._js_bytes = new St.Label();
|
||||||
|
this.actor.add(this._js_bytes);
|
||||||
|
|
||||||
|
this._gjs_boxed = new St.Label();
|
||||||
|
this.actor.add(this._gjs_boxed);
|
||||||
|
|
||||||
|
this._gjs_gobject = new St.Label();
|
||||||
|
this.actor.add(this._gjs_gobject);
|
||||||
|
|
||||||
|
this._gjs_function = new St.Label();
|
||||||
|
this.actor.add(this._gjs_function);
|
||||||
|
|
||||||
|
this._gjs_closure = new St.Label();
|
||||||
|
this.actor.add(this._gjs_closure);
|
||||||
|
|
||||||
|
this._gcbutton = new St.Button({ label: 'Full GC',
|
||||||
|
style_class: 'lg-obj-inspector-button' });
|
||||||
|
this._gcbutton.connect('clicked', Lang.bind(this, function () { global.gc(); this._renderText(); }));
|
||||||
|
this.actor.add(this._gcbutton, { x_align: St.Align.START,
|
||||||
|
x_fill: false });
|
||||||
|
|
||||||
|
this.actor.connect('notify::mapped', Lang.bind(this, this._renderText));
|
||||||
|
},
|
||||||
|
|
||||||
|
_renderText: function() {
|
||||||
|
if (!this.actor.mapped)
|
||||||
|
return;
|
||||||
|
let memInfo = global.get_memory_info();
|
||||||
|
this._glibc_uordblks.text = 'glibc_uordblks: ' + memInfo.glibc_uordblks;
|
||||||
|
this._js_bytes.text = 'js bytes: ' + memInfo.js_bytes;
|
||||||
|
this._gjs_boxed.text = 'gjs_boxed: ' + memInfo.gjs_boxed;
|
||||||
|
this._gjs_gobject.text = 'gjs_gobject: ' + memInfo.gjs_gobject;
|
||||||
|
this._gjs_function.text = 'gjs_function: ' + memInfo.gjs_function;
|
||||||
|
this._gjs_closure.text = 'gjs_closure: ' + memInfo.gjs_closure;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
function Extensions() {
|
function Extensions() {
|
||||||
this._init();
|
this._init();
|
||||||
}
|
}
|
||||||
@ -745,12 +798,7 @@ LookingGlass.prototype = {
|
|||||||
let label = new St.Label({ text: 'js>>> ' });
|
let label = new St.Label({ text: 'js>>> ' });
|
||||||
entryArea.add(label);
|
entryArea.add(label);
|
||||||
|
|
||||||
this._entry = new St.Entry();
|
this._entry = new St.Entry({ can_focus: true });
|
||||||
/* unmapping the edit box will un-focus it, undo that */
|
|
||||||
notebook.connect('selection', Lang.bind(this, function (nb, child) {
|
|
||||||
if (child == this._evalBox)
|
|
||||||
global.stage.set_key_focus(this._entry);
|
|
||||||
}));
|
|
||||||
entryArea.add(this._entry, { expand: true });
|
entryArea.add(this._entry, { expand: true });
|
||||||
|
|
||||||
this._windowList = new WindowList();
|
this._windowList = new WindowList();
|
||||||
@ -763,6 +811,9 @@ LookingGlass.prototype = {
|
|||||||
this._errorLog = new ErrorLog();
|
this._errorLog = new ErrorLog();
|
||||||
notebook.appendPage('Errors', this._errorLog.actor);
|
notebook.appendPage('Errors', this._errorLog.actor);
|
||||||
|
|
||||||
|
this._memory = new Memory();
|
||||||
|
notebook.appendPage('Memory', this._memory.actor);
|
||||||
|
|
||||||
this._extensions = new Extensions();
|
this._extensions = new Extensions();
|
||||||
notebook.appendPage('Extensions', this._extensions.actor);
|
notebook.appendPage('Extensions', this._extensions.actor);
|
||||||
|
|
||||||
@ -909,6 +960,7 @@ LookingGlass.prototype = {
|
|||||||
if (!Main.pushModal(this._entry))
|
if (!Main.pushModal(this._entry))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this._notebook.selectIndex(0);
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
this.actor.lower(Main.chrome.actor);
|
this.actor.lower(Main.chrome.actor);
|
||||||
this._open = true;
|
this._open = true;
|
||||||
|
@ -1,11 +1,5 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- 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 Clutter = imports.gi.Clutter;
|
||||||
const DBus = imports.dbus;
|
const DBus = imports.dbus;
|
||||||
const Gdk = imports.gi.Gdk;
|
const Gdk = imports.gi.Gdk;
|
||||||
@ -17,8 +11,6 @@ const Mainloop = imports.mainloop;
|
|||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Chrome = imports.ui.chrome;
|
const Chrome = imports.ui.chrome;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
@ -75,12 +67,7 @@ let _cssStylesheet = null;
|
|||||||
let background = null;
|
let background = null;
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
// Add a binding for 'global' in the global JS namespace; (gjs
|
// Monkey patch utility functions into the global proxy;
|
||||||
// keeps the web browser convention of having that namespace be
|
|
||||||
// called 'window'.)
|
|
||||||
window.global = Shell.Global.get();
|
|
||||||
|
|
||||||
// Now monkey patch utility functions into the global proxy;
|
|
||||||
// This is easier and faster than indirecting down into global
|
// This is easier and faster than indirecting down into global
|
||||||
// if we want to call back up into JS.
|
// if we want to call back up into JS.
|
||||||
global.logError = _logError;
|
global.logError = _logError;
|
||||||
@ -102,8 +89,6 @@ function start() {
|
|||||||
// not loading any events until the user presses the clock
|
// not loading any events until the user presses the clock
|
||||||
global.launch_calendar_server();
|
global.launch_calendar_server();
|
||||||
|
|
||||||
Environment.init();
|
|
||||||
|
|
||||||
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
|
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
|
||||||
// also initialize ShellAppSystem first. ShellAppSystem
|
// also initialize ShellAppSystem first. ShellAppSystem
|
||||||
// needs to load all the .desktop files, and ShellWindowTracker
|
// needs to load all the .desktop files, and ShellWindowTracker
|
||||||
@ -223,6 +208,7 @@ function start() {
|
|||||||
|
|
||||||
global.screen.connect('window-entered-monitor', _windowEnteredMonitor);
|
global.screen.connect('window-entered-monitor', _windowEnteredMonitor);
|
||||||
global.screen.connect('window-left-monitor', _windowLeftMonitor);
|
global.screen.connect('window-left-monitor', _windowLeftMonitor);
|
||||||
|
global.screen.connect('restacked', _windowsRestacked);
|
||||||
|
|
||||||
_nWorkspacesChanged();
|
_nWorkspacesChanged();
|
||||||
}
|
}
|
||||||
@ -325,6 +311,13 @@ function _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
|
|||||||
_queueCheckWorkspaces();
|
_queueCheckWorkspaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _windowsRestacked() {
|
||||||
|
// Figure out where the pointer is in case we lost track of
|
||||||
|
// it during a grab. (In particular, if a trayicon popup menu
|
||||||
|
// is dismissed, see if we need to close the message tray.)
|
||||||
|
global.sync_pointer();
|
||||||
|
}
|
||||||
|
|
||||||
function _queueCheckWorkspaces() {
|
function _queueCheckWorkspaces() {
|
||||||
if (_checkWorkspacesId == 0)
|
if (_checkWorkspacesId == 0)
|
||||||
_checkWorkspacesId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, _checkWorkspaces);
|
_checkWorkspacesId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, _checkWorkspaces);
|
||||||
@ -408,12 +401,21 @@ function setThemeStylesheet(cssStylesheet)
|
|||||||
*/
|
*/
|
||||||
function loadTheme() {
|
function loadTheme() {
|
||||||
let themeContext = St.ThemeContext.get_for_stage (global.stage);
|
let themeContext = St.ThemeContext.get_for_stage (global.stage);
|
||||||
|
let previousTheme = themeContext.get_theme();
|
||||||
|
|
||||||
let cssStylesheet = _defaultCssStylesheet;
|
let cssStylesheet = _defaultCssStylesheet;
|
||||||
if (_cssStylesheet != null)
|
if (_cssStylesheet != null)
|
||||||
cssStylesheet = _cssStylesheet;
|
cssStylesheet = _cssStylesheet;
|
||||||
|
|
||||||
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
|
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
|
||||||
|
|
||||||
|
if (previousTheme) {
|
||||||
|
let customStylesheets = previousTheme.get_custom_stylesheets();
|
||||||
|
|
||||||
|
for (let i = 0; i < customStylesheets.length; i++)
|
||||||
|
theme.load_stylesheet(customStylesheets[i]);
|
||||||
|
}
|
||||||
|
|
||||||
themeContext.set_theme (theme);
|
themeContext.set_theme (theme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,9 +20,6 @@ const Params = imports.misc.params;
|
|||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const ANIMATION_TIME = 0.2;
|
const ANIMATION_TIME = 0.2;
|
||||||
const NOTIFICATION_TIMEOUT = 4;
|
const NOTIFICATION_TIMEOUT = 4;
|
||||||
const SUMMARY_TIMEOUT = 1;
|
const SUMMARY_TIMEOUT = 1;
|
||||||
@ -560,7 +557,7 @@ Notification.prototype = {
|
|||||||
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
|
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
|
||||||
vscrollbar_policy: this._scrollPolicy,
|
vscrollbar_policy: this._scrollPolicy,
|
||||||
hscrollbar_policy: Gtk.PolicyType.NEVER,
|
hscrollbar_policy: Gtk.PolicyType.NEVER,
|
||||||
vfade: true });
|
style_class: 'vfade' });
|
||||||
this._table.add(this._scrollArea, { row: 1, col: 1 });
|
this._table.add(this._scrollArea, { row: 1, col: 1 });
|
||||||
this._contentArea = new St.BoxLayout({ name: 'notification-body',
|
this._contentArea = new St.BoxLayout({ name: 'notification-body',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
@ -832,6 +829,7 @@ Notification.prototype = {
|
|||||||
// Restore banner opacity in case the notification is shown in the
|
// Restore banner opacity in case the notification is shown in the
|
||||||
// banner mode again on update.
|
// banner mode again on update.
|
||||||
this._bannerLabel.opacity = 255;
|
this._bannerLabel.opacity = 255;
|
||||||
|
this.emit('collapsed');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onActionInvoked: function(actor, mouseButtonClicked, id) {
|
_onActionInvoked: function(actor, mouseButtonClicked, id) {
|
||||||
@ -896,6 +894,11 @@ Source.prototype = {
|
|||||||
this.isTransient = isTransient;
|
this.isTransient = isTransient;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setTitle: function(newTitle) {
|
||||||
|
this.title = newTitle;
|
||||||
|
this.emit('title-changed');
|
||||||
|
},
|
||||||
|
|
||||||
// Called to create a new icon actor (of size this.ICON_SIZE).
|
// Called to create a new icon actor (of size this.ICON_SIZE).
|
||||||
// Must be overridden by the subclass if you do not pass icons
|
// Must be overridden by the subclass if you do not pass icons
|
||||||
// explicitly to the Notification() constructor.
|
// explicitly to the Notification() constructor.
|
||||||
@ -998,6 +1001,11 @@ SummaryItem.prototype = {
|
|||||||
this._sourceTitleBin.child = this._sourceTitle;
|
this._sourceTitleBin.child = this._sourceTitle;
|
||||||
this._sourceTitleBin.width = 0;
|
this._sourceTitleBin.width = 0;
|
||||||
|
|
||||||
|
this.source.connect('title-changed',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._sourceTitle.text = source.title;
|
||||||
|
}));
|
||||||
|
|
||||||
this._sourceBox.add(this._sourceIcon, { y_fill: false });
|
this._sourceBox.add(this._sourceIcon, { y_fill: false });
|
||||||
this._sourceBox.add(this._sourceTitleBin, { expand: true, y_fill: false });
|
this._sourceBox.add(this._sourceTitleBin, { expand: true, y_fill: false });
|
||||||
this.actor.child = this._sourceBox;
|
this.actor.child = this._sourceBox;
|
||||||
@ -1005,7 +1013,7 @@ SummaryItem.prototype = {
|
|||||||
this.notificationStackView = new St.ScrollView({ name: source.isChat ? '' : 'summary-notification-stack-scrollview',
|
this.notificationStackView = new St.ScrollView({ name: source.isChat ? '' : 'summary-notification-stack-scrollview',
|
||||||
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
|
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
|
||||||
hscrollbar_policy: Gtk.PolicyType.NEVER,
|
hscrollbar_policy: Gtk.PolicyType.NEVER,
|
||||||
vfade: true });
|
style_class: 'vfade' });
|
||||||
this.notificationStack = new St.BoxLayout({ name: 'summary-notification-stack',
|
this.notificationStack = new St.BoxLayout({ name: 'summary-notification-stack',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
this.notificationStackView.add_actor(this.notificationStack);
|
this.notificationStackView.add_actor(this.notificationStack);
|
||||||
@ -1245,7 +1253,7 @@ MessageTray.prototype = {
|
|||||||
this._reNotifyAfterHideNotification = null;
|
this._reNotifyAfterHideNotification = null;
|
||||||
|
|
||||||
Main.chrome.addActor(this.actor, { affectsStruts: false,
|
Main.chrome.addActor(this.actor, { affectsStruts: false,
|
||||||
visibleInOverview: true });
|
visibleInFullscreen: true });
|
||||||
Main.chrome.trackActor(this._notificationBin);
|
Main.chrome.trackActor(this._notificationBin);
|
||||||
Main.chrome.trackActor(this._summaryBoxPointer.actor);
|
Main.chrome.trackActor(this._summaryBoxPointer.actor);
|
||||||
|
|
||||||
@ -1608,6 +1616,8 @@ MessageTray.prototype = {
|
|||||||
this._clickedSummaryItemMouseButton != button) {
|
this._clickedSummaryItemMouseButton != button) {
|
||||||
this._clickedSummaryItem = summaryItem;
|
this._clickedSummaryItem = summaryItem;
|
||||||
this._clickedSummaryItemMouseButton = button;
|
this._clickedSummaryItemMouseButton = button;
|
||||||
|
|
||||||
|
summaryItem.source.emit('summary-item-clicked', button);
|
||||||
} else {
|
} else {
|
||||||
this._unsetClickedSummaryItem();
|
this._unsetClickedSummaryItem();
|
||||||
}
|
}
|
||||||
@ -2014,9 +2024,15 @@ MessageTray.prototype = {
|
|||||||
this._notification.expand(!autoExpanding);
|
this._notification.expand(!autoExpanding);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onNotificationExpanded: function() {
|
_onNotificationExpanded: function() {
|
||||||
let expandedY = this.actor.height - this._notificationBin.height;
|
let expandedY = this.actor.height - this._notificationBin.height;
|
||||||
if (this._notificationBin.y != expandedY)
|
|
||||||
|
// Don't animate the notification to its new position if it has shrunk:
|
||||||
|
// there will be a very visible "gap" that breaks the illusion.
|
||||||
|
|
||||||
|
if (this._notificationBin.y < expandedY)
|
||||||
|
this._notificationBin.y = expandedY;
|
||||||
|
else if (this._notification.y != expandedY)
|
||||||
this._tween(this._notificationBin, '_notificationState', State.SHOWN,
|
this._tween(this._notificationBin, '_notificationState', State.SHOWN,
|
||||||
{ y: expandedY,
|
{ y: expandedY,
|
||||||
time: ANIMATION_TIME,
|
time: ANIMATION_TIME,
|
||||||
|
@ -10,8 +10,6 @@ const Pango = imports.gi.Pango;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
|
@ -7,8 +7,6 @@ const Lang = imports.lang;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -167,8 +165,11 @@ NotificationDaemon.prototype = {
|
|||||||
// with a transient one from the same sender, so we
|
// with a transient one from the same sender, so we
|
||||||
// always create a new source object for new transient notifications
|
// always create a new source object for new transient notifications
|
||||||
// and never add it to this._sources .
|
// and never add it to this._sources .
|
||||||
if (!isForTransientNotification && this._sources[pid])
|
if (!isForTransientNotification && this._sources[pid]) {
|
||||||
return this._sources[pid];
|
let source = this._sources[pid];
|
||||||
|
source.setTitle(title);
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
let source = new Source(title, pid);
|
let source = new Source(title, pid);
|
||||||
source.setTransient(isForTransientNotification);
|
source.setTransient(isForTransientNotification);
|
||||||
|
@ -8,8 +8,6 @@ const Signals = imports.signals;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
const Gdk = imports.gi.Gdk;
|
const Gdk = imports.gi.Gdk;
|
||||||
|
|
||||||
const AppDisplay = imports.ui.appDisplay;
|
const AppDisplay = imports.ui.appDisplay;
|
||||||
@ -222,7 +220,7 @@ Overview.prototype = {
|
|||||||
}
|
}
|
||||||
this._resetWindowSwitchTimeout();
|
this._resetWindowSwitchTimeout();
|
||||||
this._lastHoveredWindow = null;
|
this._lastHoveredWindow = null;
|
||||||
DND.removeMonitor(this._dragMonitor);
|
DND.removeDragMonitor(this._dragMonitor);
|
||||||
this.endItemDrag();
|
this.endItemDrag();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -283,7 +281,8 @@ Overview.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onButtonPress: function(actor, event) {
|
_onButtonPress: function(actor, event) {
|
||||||
if (this._scrollDirection == SwipeScrollDirection.NONE)
|
if (this._scrollDirection == SwipeScrollDirection.NONE
|
||||||
|
|| event.get_button() != 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let [stageX, stageY] = event.get_coords();
|
let [stageX, stageY] = event.get_coords();
|
||||||
|
@ -9,8 +9,6 @@ const Pango = imports.gi.Pango;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
@ -304,6 +302,7 @@ AppMenuButton.prototype = {
|
|||||||
|
|
||||||
this._visible = true;
|
this._visible = true;
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
|
this.actor.reactive = true;
|
||||||
|
|
||||||
if (!this._targetIsCurrent)
|
if (!this._targetIsCurrent)
|
||||||
return;
|
return;
|
||||||
@ -320,6 +319,7 @@ AppMenuButton.prototype = {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._visible = false;
|
this._visible = false;
|
||||||
|
this.actor.reactive = false;
|
||||||
if (!this._targetIsCurrent) {
|
if (!this._targetIsCurrent) {
|
||||||
this.actor.hide();
|
this.actor.hide();
|
||||||
return;
|
return;
|
||||||
@ -708,7 +708,7 @@ HotCorner.prototype = {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Main.chrome.addActor(this.actor, { visibleInOverview: true, affectsStruts: false });
|
Main.chrome.addActor(this.actor, { affectsStruts: false });
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
@ -776,7 +776,7 @@ HotCorner.prototype = {
|
|||||||
_onCornerClicked : function() {
|
_onCornerClicked : function() {
|
||||||
if (!Main.overview.animationInProgress)
|
if (!Main.overview.animationInProgress)
|
||||||
this.maybeToggleOverviewOnClick();
|
this.maybeToggleOverviewOnClick();
|
||||||
return false;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onCornerLeft : function(actor, event) {
|
_onCornerLeft : function(actor, event) {
|
||||||
@ -817,6 +817,8 @@ Panel.prototype = {
|
|||||||
reactive: true });
|
reactive: true });
|
||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
|
|
||||||
|
this._statusArea = {};
|
||||||
|
|
||||||
Main.overview.connect('shown', Lang.bind(this, function () {
|
Main.overview.connect('shown', Lang.bind(this, function () {
|
||||||
this.actor.add_style_class_name('in-overview');
|
this.actor.add_style_class_name('in-overview');
|
||||||
}));
|
}));
|
||||||
@ -913,6 +915,7 @@ Panel.prototype = {
|
|||||||
style_class: 'panel-button',
|
style_class: 'panel-button',
|
||||||
reactive: true,
|
reactive: true,
|
||||||
can_focus: true });
|
can_focus: true });
|
||||||
|
this._activities = this.button;
|
||||||
this.button.set_child(label);
|
this.button.set_child(label);
|
||||||
this.button._delegate = this.button;
|
this.button._delegate = this.button;
|
||||||
this.button._xdndTimeOut = 0;
|
this.button._xdndTimeOut = 0;
|
||||||
@ -941,10 +944,10 @@ Panel.prototype = {
|
|||||||
|
|
||||||
this._hotCorner = null;
|
this._hotCorner = null;
|
||||||
|
|
||||||
let appMenuButton = new AppMenuButton();
|
this._appMenu = new AppMenuButton();
|
||||||
this._leftBox.add(appMenuButton.actor);
|
this._leftBox.add(this._appMenu.actor);
|
||||||
|
|
||||||
this._menus.addMenu(appMenuButton.menu);
|
this._menus.addMenu(this._appMenu.menu);
|
||||||
|
|
||||||
/* center */
|
/* center */
|
||||||
this._dateMenu = new DateMenu.DateMenuButton();
|
this._dateMenu = new DateMenu.DateMenuButton();
|
||||||
@ -963,12 +966,12 @@ Panel.prototype = {
|
|||||||
this._rightBox.add(this._trayBox);
|
this._rightBox.add(this._trayBox);
|
||||||
this._rightBox.add(this._statusBox);
|
this._rightBox.add(this._statusBox);
|
||||||
|
|
||||||
this._statusmenu = new StatusMenu.StatusMenuButton();
|
this._userMenu = new StatusMenu.StatusMenuButton();
|
||||||
this._statusmenu.actor.name = 'panelStatus';
|
this._userMenu.actor.name = 'panelStatus';
|
||||||
this._rightBox.add(this._statusmenu.actor);
|
this._rightBox.add(this._userMenu.actor);
|
||||||
|
|
||||||
// Synchronize the buttons pseudo classes with its corner
|
// Synchronize the buttons pseudo classes with its corner
|
||||||
this._statusmenu.actor.connect('style-changed', Lang.bind(this,
|
this._userMenu.actor.connect('style-changed', Lang.bind(this,
|
||||||
function(actor) {
|
function(actor) {
|
||||||
let rtl = actor.get_direction() == St.TextDirection.RTL;
|
let rtl = actor.get_direction() == St.TextDirection.RTL;
|
||||||
let corner = rtl ? this._leftCorner : this._rightCorner;
|
let corner = rtl ? this._leftCorner : this._rightCorner;
|
||||||
@ -1001,13 +1004,11 @@ Panel.prototype = {
|
|||||||
this.button.checked = false;
|
this.button.checked = false;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
Main.chrome.addActor(this.actor, { visibleInOverview: true });
|
Main.chrome.addActor(this.actor);
|
||||||
Main.chrome.addActor(this._leftCorner.actor, { visibleInOverview: true,
|
Main.chrome.addActor(this._leftCorner.actor, { affectsStruts: false,
|
||||||
affectsStruts: false,
|
affectsInputRegion: false });
|
||||||
affectsInputRegion: false });
|
Main.chrome.addActor(this._rightCorner.actor, { affectsStruts: false,
|
||||||
Main.chrome.addActor(this._rightCorner.actor, { visibleInOverview: true,
|
affectsInputRegion: false });
|
||||||
affectsStruts: false,
|
|
||||||
affectsInputRegion: false });
|
|
||||||
|
|
||||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here',
|
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here',
|
||||||
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
||||||
@ -1051,11 +1052,13 @@ Panel.prototype = {
|
|||||||
let indicator = new constructor();
|
let indicator = new constructor();
|
||||||
this._statusBox.add(indicator.actor);
|
this._statusBox.add(indicator.actor);
|
||||||
this._menus.addMenu(indicator.menu);
|
this._menus.addMenu(indicator.menu);
|
||||||
|
|
||||||
|
this._statusArea[role] = indicator;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PopupMenuManager depends on menus being added in order for
|
// PopupMenuManager depends on menus being added in order for
|
||||||
// keyboard navigation
|
// keyboard navigation
|
||||||
this._menus.addMenu(this._statusmenu.menu);
|
this._menus.addMenu(this._userMenu.menu);
|
||||||
},
|
},
|
||||||
|
|
||||||
startupAnimation: function() {
|
startupAnimation: function() {
|
||||||
|
@ -26,8 +26,7 @@ Button.prototype = {
|
|||||||
this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0);
|
this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0);
|
||||||
this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
||||||
this.menu.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
|
this.menu.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
|
||||||
Main.chrome.addActor(this.menu.actor, { visibleInOverview: true,
|
Main.chrome.addActor(this.menu.actor, { affectsStruts: false });
|
||||||
affectsStruts: false });
|
|
||||||
this.menu.actor.hide();
|
this.menu.actor.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -7,8 +7,6 @@ const Lang = imports.lang;
|
|||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -270,10 +268,7 @@ PlacesManager.prototype = {
|
|||||||
if (!GLib.file_test(this._bookmarksPath, GLib.FileTest.EXISTS))
|
if (!GLib.file_test(this._bookmarksPath, GLib.FileTest.EXISTS))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let [success, bookmarksContent, len] = GLib.file_get_contents(this._bookmarksPath);
|
let bookmarksContent = Shell.get_file_contents_utf8_sync(this._bookmarksPath);
|
||||||
|
|
||||||
if (!success)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let bookmarks = bookmarksContent.split('\n');
|
let bookmarks = bookmarksContent.split('\n');
|
||||||
|
|
||||||
|
@ -22,8 +22,6 @@
|
|||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
@ -13,9 +13,6 @@ const Main = imports.ui.main;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const SLIDER_SCROLL_STEP = 0.05; /* Slider scrolling step in % */
|
const SLIDER_SCROLL_STEP = 0.05; /* Slider scrolling step in % */
|
||||||
|
|
||||||
function PopupBaseMenuItem(params) {
|
function PopupBaseMenuItem(params) {
|
||||||
@ -498,7 +495,7 @@ PopupSliderMenuItem.prototype = {
|
|||||||
this._slider = new St.DrawingArea({ style_class: 'popup-slider-menu-item', reactive: true });
|
this._slider = new St.DrawingArea({ style_class: 'popup-slider-menu-item', reactive: true });
|
||||||
this.addActor(this._slider, { span: -1, expand: true });
|
this.addActor(this._slider, { span: -1, expand: true });
|
||||||
this._slider.connect('repaint', Lang.bind(this, this._sliderRepaint));
|
this._slider.connect('repaint', Lang.bind(this, this._sliderRepaint));
|
||||||
this._slider.connect('button-press-event', Lang.bind(this, this._startDragging));
|
this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
|
||||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||||
|
|
||||||
this._releaseId = this._motionId = 0;
|
this._releaseId = this._motionId = 0;
|
||||||
@ -707,11 +704,36 @@ PopupSwitchMenuItem.prototype = {
|
|||||||
this._switch = new Switch(active);
|
this._switch = new Switch(active);
|
||||||
|
|
||||||
this.addActor(this.label);
|
this.addActor(this.label);
|
||||||
this.addActor(this._switch.actor, { align: St.Align.END });
|
|
||||||
|
|
||||||
this.connect('activate', Lang.bind(this,function(from) {
|
this._statusBin = new St.Bin({ x_align: St.Align.END });
|
||||||
|
this.addActor(this._statusBin, { align: St.Align.END });
|
||||||
|
|
||||||
|
this._statusLabel = new St.Label({ text: '',
|
||||||
|
style_class: 'popup-inactive-menu-item'
|
||||||
|
});
|
||||||
|
this._switch = new Switch(false);
|
||||||
|
this._statusBin.child = this._switch.actor;
|
||||||
|
},
|
||||||
|
|
||||||
|
setStatus: function(text) {
|
||||||
|
if (text != null) {
|
||||||
|
this._statusLabel.text = text;
|
||||||
|
this._statusBin.child = this._statusLabel;
|
||||||
|
this.actor.reactive = false;
|
||||||
|
this.actor.can_focus = false;
|
||||||
|
} else {
|
||||||
|
this._statusBin.child = this._switch.actor;
|
||||||
|
this.actor.reactive = true;
|
||||||
|
this.actor.can_focus = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
activate: function(event) {
|
||||||
|
if (this._switch.actor.mapped) {
|
||||||
this.toggle();
|
this.toggle();
|
||||||
}));
|
}
|
||||||
|
|
||||||
|
PopupBaseMenuItem.prototype.activate.call(this, event);
|
||||||
},
|
},
|
||||||
|
|
||||||
toggle: function() {
|
toggle: function() {
|
||||||
|
@ -8,8 +8,6 @@ const Meta = imports.gi.Meta;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const FileUtils = imports.misc.fileUtils;
|
const FileUtils = imports.misc.fileUtils;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -25,6 +23,10 @@ const HISTORY_KEY = 'command-history';
|
|||||||
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
||||||
const DISABLE_COMMAND_LINE_KEY = 'disable-command-line';
|
const DISABLE_COMMAND_LINE_KEY = 'disable-command-line';
|
||||||
|
|
||||||
|
const TERMINAL_SCHEMA = 'org.gnome.desktop.default-applications.terminal';
|
||||||
|
const EXEC_KEY = 'exec';
|
||||||
|
const EXEC_ARG_KEY = 'exec-arg';
|
||||||
|
|
||||||
const DIALOG_GROW_TIME = 0.1;
|
const DIALOG_GROW_TIME = 0.1;
|
||||||
|
|
||||||
function CommandCompleter() {
|
function CommandCompleter() {
|
||||||
@ -171,6 +173,7 @@ __proto__: ModalDialog.ModalDialog.prototype,
|
|||||||
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: 'run-dialog' });
|
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: 'run-dialog' });
|
||||||
|
|
||||||
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
||||||
|
this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });
|
||||||
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
|
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
|
||||||
this._enableInternalCommands = global.settings.get_boolean('development-tools');
|
this._enableInternalCommands = global.settings.get_boolean('development-tools');
|
||||||
}));
|
}));
|
||||||
@ -191,7 +194,7 @@ __proto__: ModalDialog.ModalDialog.prototype,
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
'debugexit': Lang.bind(this, function() {
|
'debugexit': Lang.bind(this, function() {
|
||||||
Meta.exit(Meta.ExitCode.ERROR);
|
Meta.quit(Meta.ExitCode.ERROR);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// rt is short for "reload theme"
|
// rt is short for "reload theme"
|
||||||
@ -311,8 +314,11 @@ __proto__: ModalDialog.ModalDialog.prototype,
|
|||||||
f();
|
f();
|
||||||
} else if (input) {
|
} else if (input) {
|
||||||
try {
|
try {
|
||||||
if (inTerminal)
|
if (inTerminal) {
|
||||||
command = 'gnome-terminal -x ' + input;
|
let exec = this._terminalSettings.get_string(EXEC_KEY);
|
||||||
|
let exec_arg = this._terminalSettings.get_string(EXEC_ARG_KEY);
|
||||||
|
command = exec + ' ' + exec_arg + ' ' + input;
|
||||||
|
}
|
||||||
Util.trySpawnCommandLine(command);
|
Util.trySpawnCommandLine(command);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Mmmh, that failed - see if @input matches an existing file
|
// Mmmh, that failed - see if @input matches an existing file
|
||||||
|
@ -7,9 +7,6 @@ const Signals = imports.signals;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const FileUtils = imports.misc.fileUtils;
|
const FileUtils = imports.misc.fileUtils;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
@ -160,7 +157,7 @@ SearchProvider.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getResultInfo:
|
* getResultMeta:
|
||||||
* @id: Result identifier string
|
* @id: Result identifier string
|
||||||
*
|
*
|
||||||
* Return an object with 'id', 'name', (both strings) and 'createIcon'
|
* Return an object with 'id', 'name', (both strings) and 'createIcon'
|
||||||
@ -276,7 +273,7 @@ OpenSearchSystem.prototype = {
|
|||||||
_addProvider: function(fileName) {
|
_addProvider: function(fileName) {
|
||||||
let path = global.datadir + '/search_providers/' + fileName;
|
let path = global.datadir + '/search_providers/' + fileName;
|
||||||
let source = Shell.get_file_contents_utf8_sync(path);
|
let source = Shell.get_file_contents_utf8_sync(path);
|
||||||
let [success, name, url, langs, icon_uri] = global.parse_search_provider(source);
|
let [success, name, url, langs, icon_uri] = Shell.parse_search_provider(source);
|
||||||
let provider ={ name: name,
|
let provider ={ name: name,
|
||||||
url: url,
|
url: url,
|
||||||
id: this._providers.length,
|
id: this._providers.length,
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
@ -30,6 +28,7 @@ SearchResult.prototype = {
|
|||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
y_fill: true });
|
y_fill: true });
|
||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
|
this._dragActorSource = null;
|
||||||
|
|
||||||
let content = provider.createResultActor(metaInfo, terms);
|
let content = provider.createResultActor(metaInfo, terms);
|
||||||
if (content == null) {
|
if (content == null) {
|
||||||
@ -39,6 +38,11 @@ SearchResult.prototype = {
|
|||||||
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
|
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
|
||||||
{ createIcon: this.metaInfo['createIcon'] });
|
{ createIcon: this.metaInfo['createIcon'] });
|
||||||
content.set_child(icon.actor);
|
content.set_child(icon.actor);
|
||||||
|
this._dragActorSource = icon.icon;
|
||||||
|
this.actor.label_actor = icon.label;
|
||||||
|
} else {
|
||||||
|
if (content._delegate && content._delegate.getDragActorSource)
|
||||||
|
this._dragActorSource = content._delegate.getDragActorSource();
|
||||||
}
|
}
|
||||||
this._content = content;
|
this._content = content;
|
||||||
this.actor.set_child(content);
|
this.actor.set_child(content);
|
||||||
@ -77,6 +81,8 @@ SearchResult.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
getDragActorSource: function() {
|
getDragActorSource: function() {
|
||||||
|
if (this._dragActorSource)
|
||||||
|
return this._dragActorSource;
|
||||||
// not exactly right, but alignment problems are hard to notice
|
// not exactly right, but alignment problems are hard to notice
|
||||||
return this._content;
|
return this._content;
|
||||||
},
|
},
|
||||||
@ -193,7 +199,7 @@ SearchResults.prototype = {
|
|||||||
|
|
||||||
let scrollView = new St.ScrollView({ x_fill: true,
|
let scrollView = new St.ScrollView({ x_fill: true,
|
||||||
y_fill: false,
|
y_fill: false,
|
||||||
vfade: true });
|
style_class: 'vfade' });
|
||||||
scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
scrollView.add_actor(this._content);
|
scrollView.add_actor(this._content);
|
||||||
|
|
||||||
@ -259,6 +265,7 @@ SearchResults.prototype = {
|
|||||||
let title = new St.Label({ text: provider.name,
|
let title = new St.Label({ text: provider.name,
|
||||||
style_class: 'dash-search-button-label' });
|
style_class: 'dash-search-button-label' });
|
||||||
|
|
||||||
|
button.label_actor = title;
|
||||||
bin.set_child(title);
|
bin.set_child(title);
|
||||||
button.set_child(bin);
|
button.set_child(bin);
|
||||||
provider.actor = button;
|
provider.actor = button;
|
||||||
|
@ -10,13 +10,11 @@ const Shell = imports.gi.Shell;
|
|||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
|
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
|
||||||
const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable';
|
const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable';
|
||||||
const KEY_BOUNCE_KEYS_ENABLED = 'bouncekeys-enable';
|
const KEY_BOUNCE_KEYS_ENABLED = 'bouncekeys-enable';
|
||||||
@ -91,6 +89,7 @@ ATIndicator.prototype = {
|
|||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
this.menu.addAction(_("Universal Access Settings"), function() {
|
this.menu.addAction(_("Universal Access Settings"), function() {
|
||||||
|
Main.overview.hide();
|
||||||
let app = Shell.AppSystem.get_default().get_app('gnome-universal-access-panel.desktop');
|
let app = Shell.AppSystem.get_default().get_app('gnome-universal-access-panel.desktop');
|
||||||
app.activate(-1);
|
app.activate(-1);
|
||||||
});
|
});
|
||||||
|
@ -16,9 +16,6 @@ const MessageTray = imports.ui.messageTray;
|
|||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const ConnectionState = {
|
const ConnectionState = {
|
||||||
DISCONNECTED: 0,
|
DISCONNECTED: 0,
|
||||||
CONNECTED: 1,
|
CONNECTED: 1,
|
||||||
@ -67,7 +64,7 @@ Indicator.prototype = {
|
|||||||
|
|
||||||
this._fullMenuItems = [new PopupMenu.PopupSeparatorMenuItem(),
|
this._fullMenuItems = [new PopupMenu.PopupSeparatorMenuItem(),
|
||||||
new PopupMenu.PopupMenuItem(_("Send Files to Device...")),
|
new PopupMenu.PopupMenuItem(_("Send Files to Device...")),
|
||||||
new PopupMenu.PopupMenuItem(_("Setup a New Device...")),
|
new PopupMenu.PopupMenuItem(_("Set up a New Device...")),
|
||||||
new PopupMenu.PopupSeparatorMenuItem()];
|
new PopupMenu.PopupSeparatorMenuItem()];
|
||||||
this._hasDevices = false;
|
this._hasDevices = false;
|
||||||
this._deviceSep = this._fullMenuItems[0]; // hidden if no device exists
|
this._deviceSep = this._fullMenuItems[0]; // hidden if no device exists
|
||||||
@ -93,6 +90,7 @@ Indicator.prototype = {
|
|||||||
this._updateFullMenu();
|
this._updateFullMenu();
|
||||||
|
|
||||||
this.menu.addAction(_("Bluetooth Settings"), function() {
|
this.menu.addAction(_("Bluetooth Settings"), function() {
|
||||||
|
Main.overview.hide()
|
||||||
let app = Shell.AppSystem.get_default().get_app('bluetooth-properties.desktop');
|
let app = Shell.AppSystem.get_default().get_app('bluetooth-properties.desktop');
|
||||||
app.activate(-1);
|
app.activate(-1);
|
||||||
});
|
});
|
||||||
@ -111,7 +109,11 @@ Indicator.prototype = {
|
|||||||
current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED;
|
current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED;
|
||||||
|
|
||||||
this._killswitch.setToggleState(on);
|
this._killswitch.setToggleState(on);
|
||||||
this._killswitch.actor.reactive = can_toggle;
|
if (can_toggle)
|
||||||
|
this._killswitch.setStatus(null);
|
||||||
|
else
|
||||||
|
/* TRANSLATORS: this means that bluetooth was disabled by hardware rfkill */
|
||||||
|
this._killswitch.setStatus(_("hardware disabled"));
|
||||||
|
|
||||||
if (has_adapter)
|
if (has_adapter)
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
@ -127,13 +129,6 @@ Indicator.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_deviceCompare: function(d1, d2) {
|
|
||||||
return d1.device_path == d2.device_path &&
|
|
||||||
d1.bdaddr == d2.bdaddr &&
|
|
||||||
d1.can_connect == d2.can_connect &&
|
|
||||||
d1.capabilities == d2.capabilities;
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateDevices: function() {
|
_updateDevices: function() {
|
||||||
let devices = this._applet.get_devices();
|
let devices = this._applet.get_devices();
|
||||||
|
|
||||||
@ -142,12 +137,8 @@ Indicator.prototype = {
|
|||||||
let item = this._deviceItems[i];
|
let item = this._deviceItems[i];
|
||||||
let destroy = true;
|
let destroy = true;
|
||||||
for (let j = 0; j < devices.length; j++) {
|
for (let j = 0; j < devices.length; j++) {
|
||||||
// we need to deep compare because BluetoothSimpleDevice is a boxed type
|
if (item._device.device_path == devices[j].device_path) {
|
||||||
// (but we take advantage of that, because _skip will disappear the next
|
this._updateDeviceItem(item, devices[j]);
|
||||||
// time get_devices() is called)
|
|
||||||
if (this._deviceCompare(item._device, devices[j])) {
|
|
||||||
item.label.text = devices[j].alias;
|
|
||||||
devices[j]._skip = true;
|
|
||||||
destroy = false;
|
destroy = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -162,7 +153,7 @@ Indicator.prototype = {
|
|||||||
this._hasDevices = newlist.length > 0;
|
this._hasDevices = newlist.length > 0;
|
||||||
for (let i = 0; i < devices.length; i++) {
|
for (let i = 0; i < devices.length; i++) {
|
||||||
let d = devices[i];
|
let d = devices[i];
|
||||||
if (d._skip)
|
if (d._item)
|
||||||
continue;
|
continue;
|
||||||
let item = this._createDeviceItem(d);
|
let item = this._createDeviceItem(d);
|
||||||
if (item) {
|
if (item) {
|
||||||
@ -177,23 +168,62 @@ Indicator.prototype = {
|
|||||||
this._deviceSep.actor.hide();
|
this._deviceSep.actor.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_updateDeviceItem: function(item, device) {
|
||||||
|
if (!device.can_connect && device.capabilities == GnomeBluetoothApplet.Capabilities.NONE) {
|
||||||
|
item.destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let prevDevice = item._device;
|
||||||
|
let prevCapabilities = prevDevice.capabilities;
|
||||||
|
let prevCanConnect = prevDevice.can_connect;
|
||||||
|
|
||||||
|
// adopt the new device object
|
||||||
|
item._device = device;
|
||||||
|
device._item = item;
|
||||||
|
|
||||||
|
// update properties
|
||||||
|
item.label.text = device.alias;
|
||||||
|
|
||||||
|
if (prevCapabilities != device.capabilities ||
|
||||||
|
prevCanConnect != device.can_connect) {
|
||||||
|
// need to rebuild the submenu
|
||||||
|
item.menu.removeAll();
|
||||||
|
this._buildDeviceSubMenu(item, device);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update connected property
|
||||||
|
if (device.can_connect)
|
||||||
|
item._connectedMenuitem.setToggleState(device.connected);
|
||||||
|
},
|
||||||
|
|
||||||
_createDeviceItem: function(device) {
|
_createDeviceItem: function(device) {
|
||||||
if (!device.can_connect && device.capabilities == GnomeBluetoothApplet.Capabilities.NONE)
|
if (!device.can_connect && device.capabilities == GnomeBluetoothApplet.Capabilities.NONE)
|
||||||
return null;
|
return null;
|
||||||
let item = new PopupMenu.PopupSubMenuMenuItem(device.alias);
|
let item = new PopupMenu.PopupSubMenuMenuItem(device.alias);
|
||||||
item._device = device;
|
|
||||||
|
|
||||||
|
// adopt the device object, and add a back link
|
||||||
|
item._device = device;
|
||||||
|
device._item = item;
|
||||||
|
|
||||||
|
this._buildDeviceSubMenu(item, device);
|
||||||
|
|
||||||
|
return item;
|
||||||
|
},
|
||||||
|
|
||||||
|
_buildDeviceSubMenu: function(item, device) {
|
||||||
if (device.can_connect) {
|
if (device.can_connect) {
|
||||||
item._connected = device.connected;
|
item._connected = device.connected;
|
||||||
let menuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
|
item._connectedMenuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
|
||||||
|
item._connectedMenuitem.connect('toggled', Lang.bind(this, function() {
|
||||||
menuitem.connect('toggled', Lang.bind(this, function() {
|
|
||||||
if (item._connected > ConnectionState.CONNECTED) {
|
if (item._connected > ConnectionState.CONNECTED) {
|
||||||
// operation already in progress, revert
|
// operation already in progress, revert
|
||||||
|
// (should not happen anyway)
|
||||||
menuitem.setToggleState(menuitem.state);
|
menuitem.setToggleState(menuitem.state);
|
||||||
}
|
}
|
||||||
if (item._connected) {
|
if (item._connected) {
|
||||||
item._connected = ConnectionState.DISCONNECTING;
|
item._connected = ConnectionState.DISCONNECTING;
|
||||||
|
menuitem.setStatus(_("disconnecting..."));
|
||||||
this._applet.disconnect_device(item._device.device_path, function(applet, success) {
|
this._applet.disconnect_device(item._device.device_path, function(applet, success) {
|
||||||
if (success) { // apply
|
if (success) { // apply
|
||||||
item._connected = ConnectionState.DISCONNECTED;
|
item._connected = ConnectionState.DISCONNECTED;
|
||||||
@ -202,9 +232,11 @@ Indicator.prototype = {
|
|||||||
item._connected = ConnectionState.CONNECTED;
|
item._connected = ConnectionState.CONNECTED;
|
||||||
menuitem.setToggleState(true);
|
menuitem.setToggleState(true);
|
||||||
}
|
}
|
||||||
|
menuitem.setStatus(null);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
item._connected = ConnectionState.CONNECTING;
|
item._connected = ConnectionState.CONNECTING;
|
||||||
|
menuitem.setStatus(_("connecting..."));
|
||||||
this._applet.connect_device(item._device.device_path, function(applet, success) {
|
this._applet.connect_device(item._device.device_path, function(applet, success) {
|
||||||
if (success) { // apply
|
if (success) { // apply
|
||||||
item._connected = ConnectionState.CONNECTED;
|
item._connected = ConnectionState.CONNECTED;
|
||||||
@ -213,11 +245,12 @@ Indicator.prototype = {
|
|||||||
item._connected = ConnectionState.DISCONNECTED;
|
item._connected = ConnectionState.DISCONNECTED;
|
||||||
menuitem.setToggleState(false);
|
menuitem.setToggleState(false);
|
||||||
}
|
}
|
||||||
|
menuitem.setStatus(null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
item.menu.addMenuItem(menuitem);
|
item.menu.addMenuItem(item._connectedMenuitem);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_PUSH) {
|
if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_PUSH) {
|
||||||
@ -263,8 +296,6 @@ Indicator.prototype = {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return item;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateFullMenu: function() {
|
_updateFullMenu: function() {
|
||||||
|
@ -9,13 +9,11 @@ const Lang = imports.lang;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
function LayoutMenuItem() {
|
function LayoutMenuItem() {
|
||||||
this._init.apply(this, arguments);
|
this._init.apply(this, arguments);
|
||||||
}
|
}
|
||||||
@ -71,9 +69,11 @@ XKBIndicator.prototype = {
|
|||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
this.menu.addAction(_("Show Keyboard Layout..."), Lang.bind(this, function() {
|
this.menu.addAction(_("Show Keyboard Layout..."), Lang.bind(this, function() {
|
||||||
|
Main.overview.hide();
|
||||||
Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]);
|
Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]);
|
||||||
}));
|
}));
|
||||||
this.menu.addAction(_("Localization Settings"), function() {
|
this.menu.addAction(_("Localization Settings"), function() {
|
||||||
|
Main.overview.hide();
|
||||||
let app = Shell.AppSystem.get_default().get_app('gnome-region-panel.desktop');
|
let app = Shell.AppSystem.get_default().get_app('gnome-region-panel.desktop');
|
||||||
app.activate(-1);
|
app.activate(-1);
|
||||||
});
|
});
|
||||||
|
@ -18,9 +18,6 @@ const MessageTray = imports.ui.messageTray;
|
|||||||
const ModemManager = imports.misc.modemManager;
|
const ModemManager = imports.misc.modemManager;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const NMConnectionCategory = {
|
const NMConnectionCategory = {
|
||||||
INVALID: 'invalid',
|
INVALID: 'invalid',
|
||||||
WIRED: 'wired',
|
WIRED: 'wired',
|
||||||
@ -33,8 +30,10 @@ const NMAccessPointSecurity = {
|
|||||||
UNKNOWN: 0,
|
UNKNOWN: 0,
|
||||||
NONE: 1,
|
NONE: 1,
|
||||||
WEP: 2,
|
WEP: 2,
|
||||||
WPA: 3,
|
WPA_PSK: 3,
|
||||||
WPA2: 4
|
WPA2_PSK: 4,
|
||||||
|
WPA_ENT: 5,
|
||||||
|
WPA2_ENT: 6
|
||||||
};
|
};
|
||||||
|
|
||||||
// small optimization, to avoid using [] all the time
|
// small optimization, to avoid using [] all the time
|
||||||
@ -42,6 +41,21 @@ const NM80211Mode = NetworkManager['80211Mode'];
|
|||||||
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
||||||
const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
|
const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
|
||||||
|
|
||||||
|
// number of wireless networks that should be visible
|
||||||
|
// (the remaining are placed into More...)
|
||||||
|
const NUM_VISIBLE_NETWORKS = 5;
|
||||||
|
|
||||||
|
const NMAppletHelperInterface = {
|
||||||
|
name: 'org.gnome.network_manager_applet',
|
||||||
|
methods: [
|
||||||
|
{ name: 'ConnectToHiddenNetwork', inSignature: '', outSignature: '' },
|
||||||
|
{ name: 'CreateWifiNetwork', inSignature: '', outSignature: '' },
|
||||||
|
{ name: 'ConnectTo8021xNetwork', inSignature: 'oo', outSignature: '' },
|
||||||
|
{ name: 'ConnectTo3gNetwork', inSignature: 'o', outSignature: '' }
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const NMAppletProxy = DBus.makeProxyClass(NMAppletHelperInterface);
|
||||||
|
|
||||||
function macToArray(string) {
|
function macToArray(string) {
|
||||||
return string.split(':').map(function(el) {
|
return string.split(':').map(function(el) {
|
||||||
return parseInt(el, 16);
|
return parseInt(el, 16);
|
||||||
@ -178,63 +192,7 @@ NMNetworkMenuItem.prototype = {
|
|||||||
apObj.updateId = 0;
|
apObj.updateId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
PopupMenu.PopupImageMenuItem.prototype.destroy.call(this);
|
PopupMenu.PopupBaseMenuItem.prototype.destroy.call(this);
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function NMDeviceTitleMenuItem() {
|
|
||||||
this._init.apply(this, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
NMDeviceTitleMenuItem.prototype = {
|
|
||||||
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
|
|
||||||
|
|
||||||
_init: function(description, params) {
|
|
||||||
PopupMenu.PopupBaseMenuItem.prototype._init.call(this, params);
|
|
||||||
|
|
||||||
this._descriptionLabel = new St.Label({ text: description,
|
|
||||||
style_class: 'popup-subtitle-menu-item'
|
|
||||||
});
|
|
||||||
this.addActor(this._descriptionLabel);
|
|
||||||
|
|
||||||
this._statusBin = new St.Bin({ x_align: St.Align.END });
|
|
||||||
this.addActor(this._statusBin, { align: St.Align.END });
|
|
||||||
|
|
||||||
this._statusLabel = new St.Label({ text: '',
|
|
||||||
style_class: 'popup-inactive-menu-item'
|
|
||||||
});
|
|
||||||
this._switch = new PopupMenu.Switch(false);
|
|
||||||
this._statusBin.child = this._switch.actor;
|
|
||||||
},
|
|
||||||
|
|
||||||
setStatus: function(text) {
|
|
||||||
if (text != null) {
|
|
||||||
this._statusLabel.text = text;
|
|
||||||
this._statusBin.child = this._statusLabel;
|
|
||||||
this.actor.reactive = false;
|
|
||||||
this.actor.can_focus = false;
|
|
||||||
} else {
|
|
||||||
this._statusBin.child = this._switch.actor;
|
|
||||||
this.actor.reactive = true;
|
|
||||||
this.actor.can_focus = true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
activate: function(event) {
|
|
||||||
if (this._switch.actor.mapped) {
|
|
||||||
this._switch.toggle();
|
|
||||||
this.emit('toggled', this._switch.state);
|
|
||||||
}
|
|
||||||
|
|
||||||
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event);
|
|
||||||
},
|
|
||||||
|
|
||||||
get state() {
|
|
||||||
return this._switch.state;
|
|
||||||
},
|
|
||||||
|
|
||||||
setToggleState: function(newval) {
|
|
||||||
this._switch.setToggleState(newval);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -243,7 +201,13 @@ function NMWiredSectionTitleMenuItem() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NMWiredSectionTitleMenuItem.prototype = {
|
NMWiredSectionTitleMenuItem.prototype = {
|
||||||
__proto__: NMDeviceTitleMenuItem.prototype,
|
__proto__: PopupMenu.PopupSwitchMenuItem.prototype,
|
||||||
|
|
||||||
|
_init: function(label, params) {
|
||||||
|
params = params || { };
|
||||||
|
params.style_class = 'popup-subtitle-menu-item';
|
||||||
|
PopupMenu.PopupSwitchMenuItem.prototype._init.call(this, label, false, params);
|
||||||
|
},
|
||||||
|
|
||||||
updateForDevice: function(device) {
|
updateForDevice: function(device) {
|
||||||
if (device) {
|
if (device) {
|
||||||
@ -255,7 +219,7 @@ NMWiredSectionTitleMenuItem.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
activate: function(event) {
|
activate: function(event) {
|
||||||
NMDeviceTitleMenuItem.prototype.activate.call(this, event);
|
PopupMenu.PopupSwitchMenuItem.prototype.activate.call(this, event);
|
||||||
|
|
||||||
if (!this._device) {
|
if (!this._device) {
|
||||||
log('Section title activated when there is more than one device, should be non reactive');
|
log('Section title activated when there is more than one device, should be non reactive');
|
||||||
@ -281,10 +245,12 @@ function NMWirelessSectionTitleMenuItem() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NMWirelessSectionTitleMenuItem.prototype = {
|
NMWirelessSectionTitleMenuItem.prototype = {
|
||||||
__proto__: NMDeviceTitleMenuItem.prototype,
|
__proto__: PopupMenu.PopupSwitchMenuItem.prototype,
|
||||||
|
|
||||||
_init: function(client, property, title, params) {
|
_init: function(client, property, title, params) {
|
||||||
NMDeviceTitleMenuItem.prototype._init.call(this, title, params);
|
params = params || { };
|
||||||
|
params.style_class = 'popup-subtitle-menu-item';
|
||||||
|
PopupMenu.PopupSwitchMenuItem.prototype._init.call(this, title, false, params);
|
||||||
|
|
||||||
this._client = client;
|
this._client = client;
|
||||||
this._property = property + '_enabled';
|
this._property = property + '_enabled';
|
||||||
@ -310,7 +276,7 @@ NMWirelessSectionTitleMenuItem.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
activate: function(event) {
|
activate: function(event) {
|
||||||
NMDeviceTitleMenuItem.prototype.activate.call(this, event);
|
PopupMenu.PopupSwitchMenuItem.prototype.activate.call(this, event);
|
||||||
|
|
||||||
this._client[this._setEnabledFunc](this._switch.state);
|
this._client[this._setEnabledFunc](this._switch.state);
|
||||||
},
|
},
|
||||||
@ -359,15 +325,14 @@ NMDevice.prototype = {
|
|||||||
};
|
};
|
||||||
this._connections.push(obj);
|
this._connections.push(obj);
|
||||||
}
|
}
|
||||||
this._connections.sort(function(one, two) {
|
this._connections.sort(this._connectionSortFunction);
|
||||||
return two.timestamp - one.timestamp;
|
|
||||||
});
|
|
||||||
this._activeConnection = null;
|
this._activeConnection = null;
|
||||||
this._activeConnectionItem = null;
|
this._activeConnectionItem = null;
|
||||||
this._autoConnectionItem = null;
|
this._autoConnectionItem = null;
|
||||||
|
this._overflowItem = null;
|
||||||
|
|
||||||
if (this.device) {
|
if (this.device) {
|
||||||
this.statusItem = new NMDeviceTitleMenuItem(this._getDescription());
|
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
|
||||||
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
|
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
|
||||||
if (state)
|
if (state)
|
||||||
this.activate();
|
this.activate();
|
||||||
@ -424,7 +389,8 @@ NMDevice.prototype = {
|
|||||||
this._client.activate_connection(this._connections[0].connection, this.device, null, null);
|
this._client.activate_connection(this._connections[0].connection, this.device, null, null);
|
||||||
} else if (this._autoConnectionName) {
|
} else if (this._autoConnectionName) {
|
||||||
let connection = this._createAutomaticConnection();
|
let connection = this._createAutomaticConnection();
|
||||||
this._client.add_and_activate_connection(connection, this.device, null, null);
|
if (connection)
|
||||||
|
this._client.add_and_activate_connection(connection, this.device, null, null);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -467,9 +433,7 @@ NMDevice.prototype = {
|
|||||||
timestamp: connection._timestamp,
|
timestamp: connection._timestamp,
|
||||||
};
|
};
|
||||||
this._connections.push(obj);
|
this._connections.push(obj);
|
||||||
this._connections.sort(function(one, two) {
|
this._connections.sort(this._connectionSortFunction);
|
||||||
return two.timestamp - one.timestamp;
|
|
||||||
});
|
|
||||||
|
|
||||||
this._clearSection();
|
this._clearSection();
|
||||||
this._createSection();
|
this._createSection();
|
||||||
@ -501,7 +465,14 @@ NMDevice.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
connectionValid: function(connection) {
|
connectionValid: function(connection) {
|
||||||
throw new TypeError('Invoking pure virtual function NMDevice.connectionValid');
|
return this.device.connection_valid(connection);
|
||||||
|
},
|
||||||
|
|
||||||
|
_connectionSortFunction: function(one, two) {
|
||||||
|
if (one.timestamp == two.timestamp)
|
||||||
|
return GLib.utf8_collate(one.name, two.name);
|
||||||
|
|
||||||
|
return two.timestamp - one.timestamp;
|
||||||
},
|
},
|
||||||
|
|
||||||
setEnabled: function(enabled) {
|
setEnabled: function(enabled) {
|
||||||
@ -511,11 +482,15 @@ NMDevice.prototype = {
|
|||||||
|
|
||||||
getStatusLabel: function() {
|
getStatusLabel: function() {
|
||||||
switch(this.device.state) {
|
switch(this.device.state) {
|
||||||
case NetworkManager.DeviceState.UNMANAGED:
|
|
||||||
case NetworkManager.DeviceState.DISCONNECTED:
|
case NetworkManager.DeviceState.DISCONNECTED:
|
||||||
case NetworkManager.DeviceState.DEACTIVATING:
|
|
||||||
case NetworkManager.DeviceState.ACTIVATED:
|
case NetworkManager.DeviceState.ACTIVATED:
|
||||||
return null;
|
return null;
|
||||||
|
case NetworkManager.DeviceState.UNMANAGED:
|
||||||
|
/* Translators: this is for network devices that are physically present but are not
|
||||||
|
under NetworkManager's control (and thus cannot be used in the menu) */
|
||||||
|
return _("unmanaged");
|
||||||
|
case NetworkManager.DeviceState.DEACTIVATING:
|
||||||
|
return _("disconnecting...");
|
||||||
case NetworkManager.DeviceState.PREPARE:
|
case NetworkManager.DeviceState.PREPARE:
|
||||||
case NetworkManager.DeviceState.CONFIG:
|
case NetworkManager.DeviceState.CONFIG:
|
||||||
case NetworkManager.DeviceState.IP_CONFIG:
|
case NetworkManager.DeviceState.IP_CONFIG:
|
||||||
@ -574,6 +549,7 @@ NMDevice.prototype = {
|
|||||||
this.section.removeAll();
|
this.section.removeAll();
|
||||||
this._autoConnectionItem = null;
|
this._autoConnectionItem = null;
|
||||||
this._activeConnectionItem = null;
|
this._activeConnectionItem = null;
|
||||||
|
this._overflowItem = null;
|
||||||
for (let i = 0; i < this._connections.length; i++) {
|
for (let i = 0; i < this._connections.length; i++) {
|
||||||
this._connections[i].item = null;
|
this._connections[i].item = null;
|
||||||
}
|
}
|
||||||
@ -592,19 +568,30 @@ NMDevice.prototype = {
|
|||||||
this.section.addMenuItem(this._activeConnectionItem);
|
this.section.addMenuItem(this._activeConnectionItem);
|
||||||
}
|
}
|
||||||
if (this._connections.length > 0) {
|
if (this._connections.length > 0) {
|
||||||
|
let activeOffset = this._activeConnectionItem ? 1 : 0;
|
||||||
|
|
||||||
for(let j = 0; j < this._connections.length; ++j) {
|
for(let j = 0; j < this._connections.length; ++j) {
|
||||||
let obj = this._connections[j];
|
let obj = this._connections[j];
|
||||||
if (this._activeConnection &&
|
if (this._activeConnection &&
|
||||||
obj.connection == this._activeConnection._connection)
|
obj.connection == this._activeConnection._connection)
|
||||||
continue;
|
continue;
|
||||||
obj.item = this._createConnectionItem(obj);
|
obj.item = this._createConnectionItem(obj);
|
||||||
this.section.addMenuItem(obj.item);
|
|
||||||
|
if (j + activeOffset >= NUM_VISIBLE_NETWORKS) {
|
||||||
|
if (!this._overflowItem) {
|
||||||
|
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
|
||||||
|
this.section.addMenuItem(this._overflowItem);
|
||||||
|
}
|
||||||
|
this._overflowItem.menu.addMenuItem(obj.item);
|
||||||
|
} else
|
||||||
|
this.section.addMenuItem(obj.item);
|
||||||
}
|
}
|
||||||
} else if (this._autoConnectionName) {
|
} else if (this._autoConnectionName) {
|
||||||
this._autoConnectionItem = new PopupMenu.PopupMenuItem(this._autoConnectionName);
|
this._autoConnectionItem = new PopupMenu.PopupMenuItem(this._autoConnectionName);
|
||||||
this._autoConnectionItem.connect('activate', Lang.bind(this, function() {
|
this._autoConnectionItem.connect('activate', Lang.bind(this, function() {
|
||||||
let connection = this._createAutomaticConnection();
|
let connection = this._createAutomaticConnection();
|
||||||
this._client.add_and_activate_connection(connection, this.device, null, null);
|
if (connection)
|
||||||
|
this._client.add_and_activate_connection(connection, this.device, null, null);
|
||||||
}));
|
}));
|
||||||
this.section.addMenuItem(this._autoConnectionItem);
|
this.section.addMenuItem(this._autoConnectionItem);
|
||||||
}
|
}
|
||||||
@ -719,17 +706,6 @@ NMDeviceWired.prototype = {
|
|||||||
NMDevice.prototype._init.call(this, client, device, connections);
|
NMDevice.prototype._init.call(this, client, device, connections);
|
||||||
},
|
},
|
||||||
|
|
||||||
connectionValid: function(connection) {
|
|
||||||
if (connection._type != NetworkManager.SETTING_WIRED_SETTING_NAME)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let ethernetSettings = connection.get_setting_by_name(NetworkManager.SETTING_WIRED_SETTING_NAME);
|
|
||||||
let fixedMac = ethernetSettings.get_mac_address();
|
|
||||||
if (fixedMac)
|
|
||||||
return macCompare(fixedMac, macToArray(this.device.perm_hw_address));
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_createSection: function() {
|
_createSection: function() {
|
||||||
NMDevice.prototype._createSection.call(this);
|
NMDevice.prototype._createSection.call(this);
|
||||||
|
|
||||||
@ -772,6 +748,10 @@ NMDeviceModem.prototype = {
|
|||||||
this.mobileDevice = null;
|
this.mobileDevice = null;
|
||||||
this._connectionType = 'ppp';
|
this._connectionType = 'ppp';
|
||||||
|
|
||||||
|
this._applet_proxy = new NMAppletProxy(DBus.session,
|
||||||
|
'org.gnome.network_manager_applet',
|
||||||
|
'/org/gnome/network_manager_applet');
|
||||||
|
|
||||||
this._capabilities = device.current_capabilities;
|
this._capabilities = device.current_capabilities;
|
||||||
if (this._capabilities & NetworkManager.DeviceModemCapabilities.GSM_UMTS) {
|
if (this._capabilities & NetworkManager.DeviceModemCapabilities.GSM_UMTS) {
|
||||||
is_wwan = true;
|
is_wwan = true;
|
||||||
@ -812,7 +792,7 @@ NMDeviceModem.prototype = {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
NMDevice.prototype._init.call(this, client, device, connections, 1);
|
NMDevice.prototype._init.call(this, client, device, connections);
|
||||||
},
|
},
|
||||||
|
|
||||||
setEnabled: function(enabled) {
|
setEnabled: function(enabled) {
|
||||||
@ -829,7 +809,7 @@ NMDeviceModem.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
get connected() {
|
get connected() {
|
||||||
return this._enabled && this.device.state == NetworkManager.DeviceState.CONNECTED;
|
return this._enabled && this.device.state == NetworkManager.DeviceState.ACTIVATED;
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
@ -872,24 +852,14 @@ NMDeviceModem.prototype = {
|
|||||||
NMDevice.prototype._clearSection.call(this);
|
NMDevice.prototype._clearSection.call(this);
|
||||||
},
|
},
|
||||||
|
|
||||||
connectionValid: function(connection) {
|
|
||||||
return connection._type == this._connectionType;
|
|
||||||
},
|
|
||||||
|
|
||||||
_createAutomaticConnection: function() {
|
_createAutomaticConnection: function() {
|
||||||
// FIXME: we need to summon the mobile wizard here
|
// Mobile wizard is handled by nm-applet for now...
|
||||||
// or NM will not have the necessary parameters to complete the connection
|
this._applet_proxy.ConnectTo3gNetworkRemote(this.device.get_path(),
|
||||||
// pending a DBus method on nm-applet
|
Lang.bind(this, function(results, err) {
|
||||||
|
if (err)
|
||||||
let connection = new NetworkManager.Connection;
|
log(err);
|
||||||
connection._uuid = NetworkManager.utils_uuid_generate();
|
}));
|
||||||
connection.add_setting(new NetworkManager.SettingConnection({
|
return null;
|
||||||
uuid: connection._uuid,
|
|
||||||
id: this._autoConnectionName,
|
|
||||||
type: this._connectionType,
|
|
||||||
autoconnect: false
|
|
||||||
}));
|
|
||||||
return connection;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -909,18 +879,6 @@ NMDeviceBluetooth.prototype = {
|
|||||||
NMDevice.prototype._init.call(this, client, device, connections);
|
NMDevice.prototype._init.call(this, client, device, connections);
|
||||||
},
|
},
|
||||||
|
|
||||||
connectionValid: function(connection) {
|
|
||||||
if (connection._type != NetworkManager.SETTING_BLUETOOTH_SETTING_NAME)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let bluetoothSettings = connection.get_setting_by_name(NetworkManager.SETTING_BLUETOOTH_SETTING_NAME);
|
|
||||||
let fixedBdaddr = bluetoothSettings.get_bdaddr();
|
|
||||||
if (fixedBdaddr)
|
|
||||||
return macCompare(fixedBdaddr, macToArray(this.device.hw_address));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_createAutomaticConnection: function() {
|
_createAutomaticConnection: function() {
|
||||||
let connection = new NetworkManager.Connection;
|
let connection = new NetworkManager.Connection;
|
||||||
connection._uuid = NetworkManager.utils_uuid_generate();
|
connection._uuid = NetworkManager.utils_uuid_generate();
|
||||||
@ -1012,6 +970,10 @@ NMDeviceWireless.prototype = {
|
|||||||
this._overflowItem = null;
|
this._overflowItem = null;
|
||||||
this._networks = [ ];
|
this._networks = [ ];
|
||||||
|
|
||||||
|
this._applet_proxy = new NMAppletProxy(DBus.session,
|
||||||
|
'org.gnome.network_manager_applet',
|
||||||
|
'/org/gnome/network_manager_applet');
|
||||||
|
|
||||||
// breaking the layers with this, but cannot call
|
// breaking the layers with this, but cannot call
|
||||||
// this.connectionValid until I have a device
|
// this.connectionValid until I have a device
|
||||||
this.device = device;
|
this.device = device;
|
||||||
@ -1036,18 +998,27 @@ NMDeviceWireless.prototype = {
|
|||||||
item: null,
|
item: null,
|
||||||
accessPoints: [ ap ]
|
accessPoints: [ ap ]
|
||||||
};
|
};
|
||||||
|
obj.ssidText = NetworkManager.utils_ssid_to_utf8(obj.ssid);
|
||||||
this._networks.push(obj);
|
this._networks.push(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if some connection is valid for this AP
|
// Check if some connection is valid for this AP
|
||||||
for (let j = 0; j < validConnections.length; j++) {
|
for (let j = 0; j < validConnections.length; j++) {
|
||||||
let connection = validConnections[j];
|
let connection = validConnections[j];
|
||||||
if (this._connectionValidForAP(connection, ap) &&
|
if (ap.connection_valid(connection) &&
|
||||||
obj.connections.indexOf(connection) == -1) {
|
obj.connections.indexOf(connection) == -1) {
|
||||||
obj.connections.push(connection);
|
obj.connections.push(connection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this.device.active_access_point) {
|
||||||
|
this._activeNetwork = this._networks[this._findNetwork(this.device.active_access_point)];
|
||||||
|
} else {
|
||||||
|
this._activeNetwork = null;
|
||||||
|
}
|
||||||
|
this._networks.sort(this._networkSortFunction);
|
||||||
|
|
||||||
|
this._apChangedId = device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
|
||||||
this._apAddedId = device.connect('access-point-added', Lang.bind(this, this._accessPointAdded));
|
this._apAddedId = device.connect('access-point-added', Lang.bind(this, this._accessPointAdded));
|
||||||
this._apRemovedId = device.connect('access-point-removed', Lang.bind(this, this._accessPointRemoved));
|
this._apRemovedId = device.connect('access-point-removed', Lang.bind(this, this._accessPointRemoved));
|
||||||
|
|
||||||
@ -1055,8 +1026,13 @@ NMDeviceWireless.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
if (this._apAddedId) {
|
if (this._apChangedId) {
|
||||||
// see above for this HACK
|
// see above for this HACK
|
||||||
|
GObject.Object.prototype.disconnect.call(this.device, this._apChangedId);
|
||||||
|
this._apChangedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._apAddedId) {
|
||||||
GObject.Object.prototype.disconnect.call(this.device, this._apAddedId);
|
GObject.Object.prototype.disconnect.call(this.device, this._apAddedId);
|
||||||
this._apAddedId = 0;
|
this._apAddedId = 0;
|
||||||
}
|
}
|
||||||
@ -1103,7 +1079,7 @@ NMDeviceWireless.prototype = {
|
|||||||
if (best) {
|
if (best) {
|
||||||
for (let i = 0; i < bestApObj.accessPoints.length; i++) {
|
for (let i = 0; i < bestApObj.accessPoints.length; i++) {
|
||||||
let ap = bestApObj.accessPoints[i];
|
let ap = bestApObj.accessPoints[i];
|
||||||
if (this._connectionValidForAP(best, ap)) {
|
if (ap.connection_valid(best)) {
|
||||||
this._client.activate_connection(best, this.device, ap.dbus_path, null);
|
this._client.activate_connection(best, this.device, ap.dbus_path, null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1122,35 +1098,76 @@ NMDeviceWireless.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_activeApChanged: function() {
|
||||||
|
this._activeNetwork = null;
|
||||||
|
|
||||||
|
let activeAp = this.device.active_access_point;
|
||||||
|
|
||||||
|
if (activeAp) {
|
||||||
|
let pos = this._findNetwork(activeAp);
|
||||||
|
this._activeNetwork = this._networks[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
// we don't refresh the view here, setActiveConnection will
|
||||||
|
},
|
||||||
|
|
||||||
_getApSecurityType: function(accessPoint) {
|
_getApSecurityType: function(accessPoint) {
|
||||||
if (accessPoint._secType)
|
if (accessPoint._secType)
|
||||||
return accessPoint._secType;
|
return accessPoint._secType;
|
||||||
// XXX: have this checked by someone familiar with IEEE 802.1x
|
|
||||||
|
|
||||||
let flags = accessPoint.flags;
|
let flags = accessPoint.flags;
|
||||||
let wpa_flags = accessPoint.wpa_flags;
|
let wpa_flags = accessPoint.wpa_flags;
|
||||||
let rsn_flags = accessPoint.rsn_flags;
|
let rsn_flags = accessPoint.rsn_flags;
|
||||||
let type;
|
let type;
|
||||||
if ( !(flags & NM80211ApFlags.PRIVACY)
|
if (rsn_flags != NM80211ApSecurityFlags.NONE) {
|
||||||
&& (wpa_flags == NM80211ApSecurityFlags.NONE)
|
/* RSN check first so that WPA+WPA2 APs are treated as RSN/WPA2 */
|
||||||
&& (rsn_flags == NM80211ApSecurityFlags.NONE))
|
if (rsn_flags & NM80211ApSecurityFlags.KEY_MGMT_802_1X)
|
||||||
type = NMAccessPointSecurity.NONE;
|
type = NMAccessPointSecurity.WPA2_ENT;
|
||||||
else if ( (flags & NM80211ApFlags.PRIVACY)
|
else if (rsn_flags & NM80211ApSecurityFlags.KEY_MGMT_PSK)
|
||||||
&& (wpa_flags == NM80211ApSecurityFlags.NONE)
|
type = NMAccessPointSecurity.WPA2_PSK;
|
||||||
&& (rsn_flags == NM80211ApSecurityFlags.NONE))
|
} else if (wpa_flags != NM80211ApSecurityFlags.NONE) {
|
||||||
type = NMAccessPointSecurity.WEP;
|
if (wpa_flags & NM80211ApSecurityFlags.KEY_MGMT_802_1X)
|
||||||
else if ( !(flags & NM80211ApFlags.PRIVACY)
|
type = NMAccessPointSecurity.WPA_ENT;
|
||||||
&& (wpa_flags != NM80211ApSecurity.NONE)
|
else if (wpa_flags & NM80211ApSecurityFlags.KEY_MGMT_PSK)
|
||||||
&& (rsn_flags != NM80211ApSecurity.NONE))
|
type = NMAccessPointSecurity.WPA_PSK;
|
||||||
type = NMAccessPointSecurity.WPA;
|
} else {
|
||||||
else
|
if (flags & NM80211ApFlags.PRIVACY)
|
||||||
type = NMAccessPointSecurity.WPA2;
|
type = NMAccessPointSecurity.WEP;
|
||||||
|
else
|
||||||
|
type = NMAccessPointSecurity.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
// cache the found value to avoid checking flags all the time
|
// cache the found value to avoid checking flags all the time
|
||||||
accessPoint._secType = type;
|
accessPoint._secType = type;
|
||||||
return type;
|
return type;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_networkSortFunction: function(one, two) {
|
||||||
|
let oneHasConnection = one.connections.length != 0;
|
||||||
|
let twoHasConnection = two.connections.length != 0;
|
||||||
|
|
||||||
|
// place known connections first
|
||||||
|
// (-1 = good order, 1 = wrong order)
|
||||||
|
if (oneHasConnection && !twoHasConnection)
|
||||||
|
return -1;
|
||||||
|
else if (!oneHasConnection && twoHasConnection)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
let oneHasSecurity = one.security != NMAccessPointSecurity.NONE;
|
||||||
|
let twoHasSecurity = two.security != NMAccessPointSecurity.NONE;
|
||||||
|
|
||||||
|
// place secure connections first
|
||||||
|
// (we treat WEP/WPA/WPA2 the same as there is no way to
|
||||||
|
// take them apart from the UI)
|
||||||
|
if (oneHasSecurity && !twoHasSecurity)
|
||||||
|
return -1;
|
||||||
|
else if (!oneHasSecurity && twoHasSecurity)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// sort alphabetically
|
||||||
|
return GLib.utf8_collate(one.ssidText, two.ssidText);
|
||||||
|
},
|
||||||
|
|
||||||
_networkCompare: function(network, accessPoint) {
|
_networkCompare: function(network, accessPoint) {
|
||||||
if (!ssidCompare(network.ssid, accessPoint.get_ssid()))
|
if (!ssidCompare(network.ssid, accessPoint.get_ssid()))
|
||||||
return false;
|
return false;
|
||||||
@ -1173,6 +1190,8 @@ NMDeviceWireless.prototype = {
|
|||||||
_accessPointAdded: function(device, accessPoint) {
|
_accessPointAdded: function(device, accessPoint) {
|
||||||
let pos = this._findNetwork(accessPoint);
|
let pos = this._findNetwork(accessPoint);
|
||||||
let apObj;
|
let apObj;
|
||||||
|
let needsupdate = false;
|
||||||
|
|
||||||
if (pos != -1) {
|
if (pos != -1) {
|
||||||
apObj = this._networks[pos];
|
apObj = this._networks[pos];
|
||||||
if (apObj.accessPoints.indexOf(accessPoint) != -1) {
|
if (apObj.accessPoints.indexOf(accessPoint) != -1) {
|
||||||
@ -1181,6 +1200,8 @@ NMDeviceWireless.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
apObj.accessPoints.push(accessPoint);
|
apObj.accessPoints.push(accessPoint);
|
||||||
|
if (apObj.item)
|
||||||
|
apObj.item.updateAccessPoints(apObj.accessPoints);
|
||||||
} else {
|
} else {
|
||||||
apObj = { ssid: accessPoint.get_ssid(),
|
apObj = { ssid: accessPoint.get_ssid(),
|
||||||
mode: accessPoint.mode,
|
mode: accessPoint.mode,
|
||||||
@ -1189,21 +1210,54 @@ NMDeviceWireless.prototype = {
|
|||||||
item: null,
|
item: null,
|
||||||
accessPoints: [ accessPoint ]
|
accessPoints: [ accessPoint ]
|
||||||
};
|
};
|
||||||
this._networks.push(apObj);
|
apObj.ssidText = NetworkManager.utils_ssid_to_utf8(apObj.ssid);
|
||||||
|
needsupdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if this enables new connections for this group
|
// check if this enables new connections for this group
|
||||||
for (let i = 0; i < this._connections.length; i++) {
|
for (let i = 0; i < this._connections.length; i++) {
|
||||||
let connection = this._connections[i].connection;
|
let connection = this._connections[i].connection;
|
||||||
if (this._connectionValidForAP(connection, accessPoint) &&
|
if (accessPoint.connection_valid(connection) &&
|
||||||
apObj.connections.indexOf(connection) == -1) {
|
apObj.connections.indexOf(connection) == -1) {
|
||||||
apObj.connections.push(connection);
|
apObj.connections.push(connection);
|
||||||
|
|
||||||
|
// this potentially changes the order
|
||||||
|
needsupdate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// update everything
|
if (needsupdate) {
|
||||||
this._clearSection();
|
if (apObj.item)
|
||||||
this._createSection();
|
apObj.item.destroy();
|
||||||
|
|
||||||
|
if (pos != -1)
|
||||||
|
this._networks.splice(pos, 1);
|
||||||
|
|
||||||
|
if (this._networks.length == 0) {
|
||||||
|
// only network in the list
|
||||||
|
this._networks.push(apObj);
|
||||||
|
this._clearSection();
|
||||||
|
this._createSection();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip networks that should appear earlier
|
||||||
|
let menuPos = 0;
|
||||||
|
for (pos = 0;
|
||||||
|
pos < this._networks.length &&
|
||||||
|
this._networkSortFunction(this._networks[pos], apObj) < 0; ++pos) {
|
||||||
|
if (this._networks[pos] != this._activeNetwork)
|
||||||
|
menuPos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// (re-)add the network
|
||||||
|
this._networks.splice(pos, 0, apObj);
|
||||||
|
|
||||||
|
if (this._shouldShowConnectionList()) {
|
||||||
|
menuPos += (this._activeConnectionItem ? 1 : 0);
|
||||||
|
this._createNetworkItem(apObj, menuPos);
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_accessPointRemoved: function(device, accessPoint) {
|
_accessPointRemoved: function(device, accessPoint) {
|
||||||
@ -1243,7 +1297,7 @@ NMDeviceWireless.prototype = {
|
|||||||
item.connect('activate', Lang.bind(this, function() {
|
item.connect('activate', Lang.bind(this, function() {
|
||||||
let accessPoints = sortAccessPoints(accessPointObj.accessPoints);
|
let accessPoints = sortAccessPoints(accessPointObj.accessPoints);
|
||||||
for (let i = 0; i < accessPoints.length; i++) {
|
for (let i = 0; i < accessPoints.length; i++) {
|
||||||
if (this._connectionValidForAP(connection, accessPoints[i])) {
|
if (accessPoints[i].connection_valid(connection)) {
|
||||||
this._client.activate_connection(connection, this.device, accessPoints[i].dbus_path, null);
|
this._client.activate_connection(connection, this.device, accessPoints[i].dbus_path, null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1252,40 +1306,6 @@ NMDeviceWireless.prototype = {
|
|||||||
return item;
|
return item;
|
||||||
},
|
},
|
||||||
|
|
||||||
connectionValid: function(connection) {
|
|
||||||
if (connection._type != NetworkManager.SETTING_WIRELESS_SETTING_NAME)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let wirelessSettings = connection.get_setting_by_name(NetworkManager.SETTING_WIRELESS_SETTING_NAME);
|
|
||||||
let wirelessSecuritySettings = connection.get_setting_by_name(NetworkManager.SETTING_WIRELESS_SECURITY_SETTING_NAME);
|
|
||||||
|
|
||||||
let fixedMac = wirelessSettings.get_mac_address();
|
|
||||||
if (fixedMac && !macCompare(fixedMac, macToArray(this.device.perm_hw_address)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (wirelessSecuritySettings &&
|
|
||||||
wirelessSecuritySettings.key_mgmt != 'none' &&
|
|
||||||
wirelessSecuritySettings.key_mgmt != 'ieee8021x') {
|
|
||||||
let capabilities = this.device.wireless_capabilities;
|
|
||||||
if (!(capabilities & NetworkManager.DeviceWifiCapabilities.WPA) ||
|
|
||||||
!(capabilities & NetworkManager.DeviceWifiCapabilities.CIPHER_TKIP))
|
|
||||||
return false;
|
|
||||||
if (wirelessSecuritySettings.get_num_protos() == 1 &&
|
|
||||||
wirelessSecuritySettings.get_proto(0) == 'rsn' &&
|
|
||||||
!(capabilities & NetworkManager.DeviceWifiCapabilities.RSN))
|
|
||||||
return false;
|
|
||||||
if (wirelessSecuritySettings.get_num_pairwise() == 1 &&
|
|
||||||
wirelessSecuritySettings.get_pairwise(0) == 'ccmp' &&
|
|
||||||
!(capabilities & NetworkManager.DeviceWifiCapabilities.CIPHER_CCMP))
|
|
||||||
return false;
|
|
||||||
if (wirelessSecuritySettings.get_num_groups() == 1 &&
|
|
||||||
wirelessSecuritySettings.get_group(0) == 'ccmp' &&
|
|
||||||
!(capabilities & NetworkManager.DeviceWifiCapabilities.CIPHER_CCMP))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_clearSection: function() {
|
_clearSection: function() {
|
||||||
NMDevice.prototype._clearSection.call(this);
|
NMDevice.prototype._clearSection.call(this);
|
||||||
|
|
||||||
@ -1315,6 +1335,12 @@ NMDeviceWireless.prototype = {
|
|||||||
// remove the connection from the access point group
|
// remove the connection from the access point group
|
||||||
connections.splice(k);
|
connections.splice(k);
|
||||||
anyauto = connections.length == 0;
|
anyauto = connections.length == 0;
|
||||||
|
|
||||||
|
if (anyauto) {
|
||||||
|
// this potentially changes the sorting order
|
||||||
|
forceupdate = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (apObj.item) {
|
if (apObj.item) {
|
||||||
if (apObj.item instanceof PopupMenu.PopupSubMenuMenuItem) {
|
if (apObj.item instanceof PopupMenu.PopupSubMenuMenuItem) {
|
||||||
let items = apObj.item.menu.getMenuItems();
|
let items = apObj.item.menu.getMenuItems();
|
||||||
@ -1340,6 +1366,7 @@ NMDeviceWireless.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (forceupdate || anyauto) {
|
if (forceupdate || anyauto) {
|
||||||
|
this._networks.sort(this._networkSortFunction);
|
||||||
this._clearSection();
|
this._clearSection();
|
||||||
this._createSection();
|
this._createSection();
|
||||||
}
|
}
|
||||||
@ -1355,78 +1382,29 @@ NMDeviceWireless.prototype = {
|
|||||||
this._connections.push(obj);
|
this._connections.push(obj);
|
||||||
|
|
||||||
// find an appropriate access point
|
// find an appropriate access point
|
||||||
let any = false, forceupdate = false;
|
let forceupdate = false;
|
||||||
for (let i = 0; i < this._networks.length; i++) {
|
for (let i = 0; i < this._networks.length; i++) {
|
||||||
let apObj = this._networks[i];
|
let apObj = this._networks[i];
|
||||||
|
|
||||||
// Check if connection is valid for any of these access points
|
// Check if connection is valid for any of these access points
|
||||||
let any = false;
|
|
||||||
for (let k = 0; k < apObj.accessPoints.length; k++) {
|
for (let k = 0; k < apObj.accessPoints.length; k++) {
|
||||||
let ap = apObj.accessPoints[k];
|
let ap = apObj.accessPoints[k];
|
||||||
if (this._connectionValidForAP(connection, ap)) {
|
if (ap.connection_valid(connection)) {
|
||||||
apObj.connections.push(connection);
|
apObj.connections.push(connection);
|
||||||
any = true;
|
// this potentially changes the sorting order
|
||||||
|
forceupdate = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (any && this._shouldShowConnectionList()) {
|
|
||||||
// we need to show this connection
|
|
||||||
if (apObj.item && apObj.item.menu) {
|
|
||||||
// We're already showing the submenu for this access point
|
|
||||||
apObj.item.menu.addMenuItem(this._createAPItem(connection, apObj, true));
|
|
||||||
} else {
|
|
||||||
if (apObj.item)
|
|
||||||
apObj.item.destroy();
|
|
||||||
if (apObj.connections.length == 1) {
|
|
||||||
apObj.item = this._createAPItem(connection, apObj, false);
|
|
||||||
this.section.addMenuItem(apObj.item);
|
|
||||||
} else {
|
|
||||||
apObj.item = null;
|
|
||||||
// we need to force an update to create the submenu
|
|
||||||
forceupdate = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (forceupdate) {
|
if (forceupdate) {
|
||||||
|
this._networks.sort(this._networkSortFunction);
|
||||||
this._clearSection();
|
this._clearSection();
|
||||||
this._createSection();
|
this._createSection();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_connectionValidForAP: function(connection, ap) {
|
|
||||||
// copied and adapted from nm-applet
|
|
||||||
let wirelessSettings = connection.get_setting_by_name(NetworkManager.SETTING_WIRELESS_SETTING_NAME);
|
|
||||||
if (!ssidCompare(wirelessSettings.get_ssid(), ap.get_ssid()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let wirelessSecuritySettings = connection.get_setting_by_name(NetworkManager.SETTING_WIRELESS_SECURITY_SETTING_NAME);
|
|
||||||
|
|
||||||
let fixedBssid = wirelessSettings.get_bssid();
|
|
||||||
if (fixedBssid && !macCompare(fixedBssid, macToArray(ap.hw_address)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let fixedBand = wirelessSettings.band;
|
|
||||||
if (fixedBand) {
|
|
||||||
let freq = ap.frequency;
|
|
||||||
if (fixedBand == 'a' && (freq < 4915 || freq > 5825))
|
|
||||||
return false;
|
|
||||||
if (fixedBand == 'bg' && (freq < 2412 || freq > 2484))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let fixedChannel = wirelessSettings.channel;
|
|
||||||
if (fixedChannel && fixedChannel != NetworkManager.utils_wifi_freq_to_channel(ap.frequency))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!wirelessSecuritySettings)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return wirelessSettings.ap_security_compatible(wirelessSecuritySettings, ap.flags, ap.wpa_flags, ap.rsn_flags, ap.mode);
|
|
||||||
},
|
|
||||||
|
|
||||||
_createActiveConnectionItem: function() {
|
_createActiveConnectionItem: function() {
|
||||||
let activeAp = this.device.active_access_point;
|
let activeAp = this.device.active_access_point;
|
||||||
let icon, title;
|
let icon, title;
|
||||||
@ -1473,6 +1451,48 @@ NMDeviceWireless.prototype = {
|
|||||||
return connection;
|
return connection;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_createNetworkItem: function(apObj, position) {
|
||||||
|
if(apObj.connections.length > 0) {
|
||||||
|
if (apObj.connections.length == 1)
|
||||||
|
apObj.item = this._createAPItem(apObj.connections[0], apObj, false);
|
||||||
|
else {
|
||||||
|
let title = apObj.ssidText;
|
||||||
|
apObj.item = new PopupMenu.PopupSubMenuMenuItem(title);
|
||||||
|
apObj.item._apObj = apObj;
|
||||||
|
for (let i = 0; i < apObj.connections.length; i++)
|
||||||
|
apObj.item.menu.addMenuItem(this._createAPItem(apObj.connections[i], apObj, true));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
apObj.item = new NMNetworkMenuItem(apObj.accessPoints);
|
||||||
|
apObj.item._apObj = apObj;
|
||||||
|
apObj.item.connect('activate', Lang.bind(this, function() {
|
||||||
|
let accessPoints = sortAccessPoints(apObj.accessPoints);
|
||||||
|
if ( (accessPoints[0]._secType == NMAccessPointSecurity.WPA2_ENT)
|
||||||
|
|| (accessPoints[0]._secType == NMAccessPointSecurity.WPA_ENT)) {
|
||||||
|
// 802.1x-enabled APs get handled by nm-applet for now...
|
||||||
|
this._applet_proxy.ConnectTo8021xNetworkRemote(this.device.get_path(),
|
||||||
|
accessPoints[0].dbus_path,
|
||||||
|
Lang.bind(this, function(results, err) {
|
||||||
|
if (err)
|
||||||
|
log(err);
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
let connection = this._createAutomaticConnection(apObj);
|
||||||
|
this._client.add_and_activate_connection(connection, this.device, accessPoints[0].dbus_path, null)
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
if (position < NUM_VISIBLE_NETWORKS)
|
||||||
|
this.section.addMenuItem(apObj.item, position);
|
||||||
|
else {
|
||||||
|
if (!this._overflowItem) {
|
||||||
|
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
|
||||||
|
this.section.addMenuItem(this._overflowItem);
|
||||||
|
}
|
||||||
|
this._overflowItem.menu.addMenuItem(apObj.item, position - NUM_VISIBLE_NETWORKS);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_createSection: function() {
|
_createSection: function() {
|
||||||
if (!this._shouldShowConnectionList())
|
if (!this._shouldShowConnectionList())
|
||||||
return;
|
return;
|
||||||
@ -1482,47 +1502,14 @@ NMDeviceWireless.prototype = {
|
|||||||
this.section.addMenuItem(this._activeConnectionItem);
|
this.section.addMenuItem(this._activeConnectionItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
let activeAp = this.device.active_access_point;
|
let activeOffset = this._activeConnectionItem ? 1 : 0;
|
||||||
let activeApSsid = activeAp ? activeAp.get_ssid() : null;
|
|
||||||
|
|
||||||
// we want five access points in the menu, including the active one
|
|
||||||
let numItems = this._activeConnection ? 4 : 5;
|
|
||||||
|
|
||||||
for(let j = 0; j < this._networks.length; j++) {
|
for(let j = 0; j < this._networks.length; j++) {
|
||||||
let apObj = this._networks[j];
|
let apObj = this._networks[j];
|
||||||
if(activeAp && ssidCompare(apObj.ssid, activeApSsid))
|
if (apObj == this._activeNetwork)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let menuItem;
|
this._createNetworkItem(apObj, j + activeOffset);
|
||||||
if(apObj.connections.length > 0) {
|
|
||||||
if (apObj.connections.length == 1)
|
|
||||||
apObj.item = this._createAPItem(apObj.connections[0], apObj, false);
|
|
||||||
else {
|
|
||||||
let title = NetworkManager.utils_ssid_to_utf8(apObj.ssid) || _("<unknown>");
|
|
||||||
apObj.item = new PopupMenu.PopupSubMenuMenuItem(title);
|
|
||||||
apObj.item._apObj = apObj;
|
|
||||||
for (let i = 0; i < apObj.connections.length; i++)
|
|
||||||
apObj.item.menu.addMenuItem(this._createAPItem(apObj.connections[i], apObj, true));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
apObj.item = new NMNetworkMenuItem(apObj.accessPoints);
|
|
||||||
apObj.item._apObj = apObj;
|
|
||||||
apObj.item.connect('activate', Lang.bind(this, function() {
|
|
||||||
let connection = this._createAutomaticConnection(apObj);
|
|
||||||
let accessPoints = sortAccessPoints(apObj.accessPoints);
|
|
||||||
this._client.add_and_activate_connection(connection, this.device, accessPoints[0].dbus_path, null)
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j < numItems)
|
|
||||||
this.section.addMenuItem(apObj.item);
|
|
||||||
else {
|
|
||||||
if (!this._overflowItem) {
|
|
||||||
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
|
|
||||||
this.section.addMenuItem(this._overflowItem);
|
|
||||||
}
|
|
||||||
this._overflowItem.menu.addMenuItem(apObj.item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -1597,6 +1584,7 @@ NMApplet.prototype = {
|
|||||||
this.menu.addMenuItem(this._devices.vpn.section);
|
this.menu.addMenuItem(this._devices.vpn.section);
|
||||||
|
|
||||||
this.menu.addAction(_("Network Settings"), function() {
|
this.menu.addAction(_("Network Settings"), function() {
|
||||||
|
Main.overview.hide();
|
||||||
let app = Shell.AppSystem.get_default().get_app('gnome-network-panel.desktop');
|
let app = Shell.AppSystem.get_default().get_app('gnome-network-panel.desktop');
|
||||||
app.activate(-1);
|
app.activate(-1);
|
||||||
});
|
});
|
||||||
@ -1675,21 +1663,18 @@ NMApplet.prototype = {
|
|||||||
|
|
||||||
_syncSectionTitle: function(category) {
|
_syncSectionTitle: function(category) {
|
||||||
let devices = this._devices[category].devices;
|
let devices = this._devices[category].devices;
|
||||||
let managedDevices = devices.filter(function(dev) {
|
|
||||||
return dev.device.state != NetworkManager.DeviceState.UNMANAGED;
|
|
||||||
});
|
|
||||||
let item = this._devices[category].item;
|
let item = this._devices[category].item;
|
||||||
let section = this._devices[category].section;
|
let section = this._devices[category].section;
|
||||||
if (managedDevices.length == 0)
|
if (devices.length == 0)
|
||||||
section.actor.hide();
|
section.actor.hide();
|
||||||
else {
|
else {
|
||||||
section.actor.show();
|
section.actor.show();
|
||||||
if (managedDevices.length == 1) {
|
if (devices.length == 1) {
|
||||||
let dev = managedDevices[0];
|
let dev = devices[0];
|
||||||
dev.statusItem.actor.hide();
|
dev.statusItem.actor.hide();
|
||||||
item.updateForDevice(dev);
|
item.updateForDevice(dev);
|
||||||
} else {
|
} else {
|
||||||
managedDevices.forEach(function(dev) {
|
devices.forEach(function(dev) {
|
||||||
dev.statusItem.actor.show();
|
dev.statusItem.actor.show();
|
||||||
});
|
});
|
||||||
// remove status text from the section title item
|
// remove status text from the section title item
|
||||||
|
@ -7,13 +7,11 @@ const Mainloop = imports.mainloop;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const BUS_NAME = 'org.gnome.PowerManager';
|
const BUS_NAME = 'org.gnome.PowerManager';
|
||||||
const OBJECT_PATH = '/org/gnome/PowerManager';
|
const OBJECT_PATH = '/org/gnome/PowerManager';
|
||||||
|
|
||||||
@ -83,6 +81,7 @@ Indicator.prototype = {
|
|||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
|
|
||||||
this.menu.addAction(_("Power Settings"),function() {
|
this.menu.addAction(_("Power Settings"),function() {
|
||||||
|
Main.overview.hide();
|
||||||
let app = Shell.AppSystem.get_default().get_app('gnome-power-panel.desktop');
|
let app = Shell.AppSystem.get_default().get_app('gnome-power-panel.desktop');
|
||||||
app.activate(-1);
|
app.activate(-1);
|
||||||
});
|
});
|
||||||
@ -115,15 +114,15 @@ Indicator.prototype = {
|
|||||||
let timestring;
|
let timestring;
|
||||||
if (time > 60) {
|
if (time > 60) {
|
||||||
if (minutes == 0) {
|
if (minutes == 0) {
|
||||||
timestring = Gettext.ngettext("%d hour remaining", "%d hours remaining", hours).format(hours);
|
timestring = ngettext("%d hour remaining", "%d hours remaining", hours).format(hours);
|
||||||
} else {
|
} else {
|
||||||
/* TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" */
|
/* TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" */
|
||||||
let template = _("%d %s %d %s remaining");
|
let template = _("%d %s %d %s remaining");
|
||||||
|
|
||||||
timestring = template.format (hours, Gettext.ngettext("hour", "hours", hours), minutes, Gettext.ngettext("minute", "minutes", minutes));
|
timestring = template.format (hours, ngettext("hour", "hours", hours), minutes, ngettext("minute", "minutes", minutes));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
timestring = Gettext.ngettext("%d minute remaining", "%d minutes remaining", minutes).format(minutes);
|
timestring = ngettext("%d minute remaining", "%d minutes remaining", minutes).format(minutes);
|
||||||
this._batteryItem.label.text = timestring;
|
this._batteryItem.label.text = timestring;
|
||||||
}
|
}
|
||||||
this._primaryPercentage.text = Math.round(percentage) + '%';
|
this._primaryPercentage.text = Math.round(percentage) + '%';
|
||||||
|
@ -9,13 +9,11 @@ const Gvc = imports.gi.Gvc;
|
|||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const VOLUME_ADJUSTMENT_STEP = 0.05; /* Volume adjustment step in % */
|
const VOLUME_ADJUSTMENT_STEP = 0.05; /* Volume adjustment step in % */
|
||||||
|
|
||||||
const VOLUME_NOTIFY_ID = 1;
|
const VOLUME_NOTIFY_ID = 1;
|
||||||
@ -64,6 +62,7 @@ Indicator.prototype = {
|
|||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
this.menu.addAction(_("Sound Settings"), function() {
|
this.menu.addAction(_("Sound Settings"), function() {
|
||||||
|
Main.overview.hide();
|
||||||
let app = Shell.AppSystem.get_default().get_app('gnome-sound-panel.desktop');
|
let app = Shell.AppSystem.get_default().get_app('gnome-sound-panel.desktop');
|
||||||
app.activate(-1);
|
app.activate(-1);
|
||||||
});
|
});
|
||||||
|
@ -9,8 +9,6 @@ const Shell = imports.gi.Shell;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Tp = imports.gi.TelepathyGLib;
|
const Tp = imports.gi.TelepathyGLib;
|
||||||
const UPowerGlib = imports.gi.UPowerGlib;
|
const UPowerGlib = imports.gi.UPowerGlib;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -28,7 +26,8 @@ const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
|||||||
|
|
||||||
const ScreenSaverInterface = {
|
const ScreenSaverInterface = {
|
||||||
name: BUS_NAME,
|
name: BUS_NAME,
|
||||||
methods: [ { name: 'Lock', inSignature: '' } ]
|
methods: [ { name: 'Lock', inSignature: '' },
|
||||||
|
{ name: 'SetActive', inSignature: 'b' }]
|
||||||
};
|
};
|
||||||
|
|
||||||
let ScreenSaverProxy = DBus.makeProxyClass(ScreenSaverInterface);
|
let ScreenSaverProxy = DBus.makeProxyClass(ScreenSaverInterface);
|
||||||
@ -59,6 +58,7 @@ StatusMenuButton.prototype = {
|
|||||||
this._presence = new GnomeSession.Presence();
|
this._presence = new GnomeSession.Presence();
|
||||||
this._presenceItems = {};
|
this._presenceItems = {};
|
||||||
this._session = new GnomeSession.SessionManager();
|
this._session = new GnomeSession.SessionManager();
|
||||||
|
this._haveShutdown = true;
|
||||||
|
|
||||||
this._account_mgr = Tp.AccountManager.dup()
|
this._account_mgr = Tp.AccountManager.dup()
|
||||||
|
|
||||||
@ -91,12 +91,25 @@ StatusMenuButton.prototype = {
|
|||||||
Lang.bind(this, this._updateSwitchUser));
|
Lang.bind(this, this._updateSwitchUser));
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
||||||
Lang.bind(this, this._updateLogout));
|
Lang.bind(this, this._updateLogout));
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
||||||
Lang.bind(this, this._updateLockScreen));
|
Lang.bind(this, this._updateLockScreen));
|
||||||
this._updateSwitchUser();
|
this._updateSwitchUser();
|
||||||
this._updateLogout();
|
this._updateLogout();
|
||||||
this._updateLockScreen();
|
this._updateLockScreen();
|
||||||
|
|
||||||
|
// Whether shutdown is available or not depends on both lockdown
|
||||||
|
// settings (disable-log-out) and Polkit policy - the latter doesn't
|
||||||
|
// notify, so we update the menu item each time the menu opens or
|
||||||
|
// the lockdown setting changes, which should be close enough.
|
||||||
|
this.menu.connect('open-state-changed', Lang.bind(this,
|
||||||
|
function(menu, open) {
|
||||||
|
if (open)
|
||||||
|
this._updateHaveShutdown();
|
||||||
|
}));
|
||||||
|
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
||||||
|
Lang.bind(this, this._updateHaveShutdown));
|
||||||
|
|
||||||
this._upClient.connect('notify::can-suspend', Lang.bind(this, this._updateSuspendOrPowerOff));
|
this._upClient.connect('notify::can-suspend', Lang.bind(this, this._updateSuspendOrPowerOff));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -113,13 +126,25 @@ StatusMenuButton.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_updateSessionSeparator: function() {
|
_updateSessionSeparator: function() {
|
||||||
let showSeparator = this._loginScreenItem.actor.visible ||
|
let sessionItemsVisible = this._loginScreenItem.actor.visible ||
|
||||||
this._logoutItem.actor.visible ||
|
this._logoutItem.actor.visible ||
|
||||||
this._lockScreenItem.actor.visible;
|
this._lockScreenItem.actor.visible;
|
||||||
if (showSeparator)
|
|
||||||
|
let showSessionSeparator = sessionItemsVisible &&
|
||||||
|
this._suspendOrPowerOffItem.actor.visible;
|
||||||
|
|
||||||
|
let showSettingsSeparator = sessionItemsVisible ||
|
||||||
|
this._suspendOrPowerOffItem.actor.visible;
|
||||||
|
|
||||||
|
if (showSessionSeparator)
|
||||||
this._sessionSeparator.actor.show();
|
this._sessionSeparator.actor.show();
|
||||||
else
|
else
|
||||||
this._sessionSeparator.actor.hide();
|
this._sessionSeparator.actor.hide();
|
||||||
|
|
||||||
|
if (showSettingsSeparator)
|
||||||
|
this._settingsSeparator.actor.show();
|
||||||
|
else
|
||||||
|
this._settingsSeparator.actor.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateSwitchUser: function() {
|
_updateSwitchUser: function() {
|
||||||
@ -149,16 +174,34 @@ StatusMenuButton.prototype = {
|
|||||||
this._updateSessionSeparator();
|
this._updateSessionSeparator();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_updateHaveShutdown: function() {
|
||||||
|
this._session.CanShutdownRemote(Lang.bind(this,
|
||||||
|
function(result, error) {
|
||||||
|
if (!error) {
|
||||||
|
this._haveShutdown = result;
|
||||||
|
this._updateSuspendOrPowerOff();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
_updateSuspendOrPowerOff: function() {
|
_updateSuspendOrPowerOff: function() {
|
||||||
this._haveSuspend = this._upClient.get_can_suspend();
|
this._haveSuspend = this._upClient.get_can_suspend();
|
||||||
|
|
||||||
if (!this._suspendOrPowerOffItem)
|
if (!this._suspendOrPowerOffItem)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!this._haveShutdown && !this._haveSuspend)
|
||||||
|
this._suspendOrPowerOffItem.actor.hide();
|
||||||
|
else
|
||||||
|
this._suspendOrPowerOffItem.actor.show();
|
||||||
|
this._updateSessionSeparator();
|
||||||
|
|
||||||
// If we can't suspend show Power Off... instead
|
// If we can't suspend show Power Off... instead
|
||||||
// and disable the alt key
|
// and disable the alt key
|
||||||
if (!this._haveSuspend) {
|
if (!this._haveSuspend) {
|
||||||
this._suspendOrPowerOffItem.updateText(_("Power Off..."), null);
|
this._suspendOrPowerOffItem.updateText(_("Power Off..."), null);
|
||||||
|
} else if (!this._haveShutdown) {
|
||||||
|
this._suspendOrPowerOffItem.updateText(_("Suspend"), null);
|
||||||
} else {
|
} else {
|
||||||
this._suspendOrPowerOffItem.updateText(_("Suspend"), _("Power Off..."));
|
this._suspendOrPowerOffItem.updateText(_("Suspend"), _("Power Off..."));
|
||||||
}
|
}
|
||||||
@ -204,6 +247,7 @@ StatusMenuButton.prototype = {
|
|||||||
|
|
||||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
|
this._settingsSeparator = item;
|
||||||
|
|
||||||
item = new PopupMenu.PopupMenuItem(_("Lock Screen"));
|
item = new PopupMenu.PopupMenuItem(_("Lock Screen"));
|
||||||
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
|
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
|
||||||
@ -271,7 +315,7 @@ StatusMenuButton.prototype = {
|
|||||||
|
|
||||||
if (this._haveSuspend &&
|
if (this._haveSuspend &&
|
||||||
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
|
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
|
||||||
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
|
this._screenSaverProxy.SetActiveRemote(true, Lang.bind(this, function() {
|
||||||
this._upClient.suspend_sync(null);
|
this._upClient.suspend_sync(null);
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
|
@ -9,9 +9,6 @@ const Signals = imports.signals;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Tpl = imports.gi.TelepathyLogger;
|
const Tpl = imports.gi.TelepathyLogger;
|
||||||
const Tp = imports.gi.TelepathyGLib;
|
const Tp = imports.gi.TelepathyGLib;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
const C_ = Gettext.pgettext;
|
|
||||||
|
|
||||||
const History = imports.misc.history;
|
const History = imports.misc.history;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -80,19 +77,20 @@ Client.prototype = {
|
|||||||
// The second argument, recover, means _observeChannels will be run
|
// The second argument, recover, means _observeChannels will be run
|
||||||
// for any existing channel as well.
|
// for any existing channel as well.
|
||||||
let dbus = Tp.DBusDaemon.dup();
|
let dbus = Tp.DBusDaemon.dup();
|
||||||
this._observer = Tp.SimpleObserver.new(dbus, true, 'GnomeShell', true,
|
this._tpClient = new Shell.TpClient({ 'dbus_daemon': dbus,
|
||||||
Lang.bind(this, this._observeChannels));
|
'name': 'GnomeShell',
|
||||||
|
'uniquify-name': true })
|
||||||
// We only care about single-user text-based chats
|
this._tpClient.set_observe_channels_func(
|
||||||
let props = {};
|
Lang.bind(this, this._observeChannels));
|
||||||
props[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT;
|
this._tpClient.set_approve_channels_func(
|
||||||
props[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE] = Tp.HandleType.CONTACT;
|
Lang.bind(this, this._approveChannels));
|
||||||
this._observer.add_observer_filter(props);
|
this._tpClient.set_handle_channels_func(
|
||||||
|
Lang.bind(this, this._handleChannels));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this._observer.register();
|
this._tpClient.register();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error('Couldn\'t register SimpleObserver. Error: \n' + e);
|
throw new Error('Couldn\'t register Telepathy client. Error: \n' + e);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -105,7 +103,7 @@ Client.prototype = {
|
|||||||
this._finishObserveChannels(account, conn, channels, context);
|
this._finishObserveChannels(account, conn, channels, context);
|
||||||
} else {
|
} else {
|
||||||
Shell.get_self_contact_features(conn,
|
Shell.get_self_contact_features(conn,
|
||||||
contactFeatures.length, contactFeatures,
|
contactFeatures,
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._finishObserveChannels(account, conn, channels, context);
|
this._finishObserveChannels(account, conn, channels, context);
|
||||||
}));
|
}));
|
||||||
@ -125,8 +123,8 @@ Client.prototype = {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Request a TpContact */
|
/* Request a TpContact */
|
||||||
Shell.get_tp_contacts(conn, 1, [targetHandle],
|
Shell.get_tp_contacts(conn, [targetHandle],
|
||||||
contactFeatures.length, contactFeatures,
|
contactFeatures,
|
||||||
Lang.bind(this, function (connection, contacts, failed) {
|
Lang.bind(this, function (connection, contacts, failed) {
|
||||||
if (contacts.length < 1)
|
if (contacts.length < 1)
|
||||||
return;
|
return;
|
||||||
@ -143,30 +141,82 @@ Client.prototype = {
|
|||||||
if (this._sources[channel.get_object_path()])
|
if (this._sources[channel.get_object_path()])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let source = new Source(account, conn, channel, contact);
|
let source = new Source(account, conn, channel, contact, this._tpClient);
|
||||||
|
|
||||||
this._sources[channel.get_object_path()] = source;
|
this._sources[channel.get_object_path()] = source;
|
||||||
source.connect('destroy', Lang.bind(this,
|
source.connect('destroy', Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
|
if (this._tpClient.is_handling_channel(channel)) {
|
||||||
|
// The chat box has been destroyed so it can't
|
||||||
|
// handle the channel any more.
|
||||||
|
channel.close_async(function(src, result) {
|
||||||
|
channel.close_finish(result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
delete this._sources[channel.get_object_path()];
|
delete this._sources[channel.get_object_path()];
|
||||||
}));
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_handlingChannels: function(account, conn, channels) {
|
||||||
|
let len = channels.length;
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
let channel = channels[i];
|
||||||
|
|
||||||
|
// We can only handle text channel, so close any other channel
|
||||||
|
if (!(channel instanceof Tp.TextChannel)) {
|
||||||
|
channel.close_async(null);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._tpClient.is_handling_channel(channel)) {
|
||||||
|
// We are already handling the channel, display the source
|
||||||
|
let source = this._sources[channel.get_object_path()];
|
||||||
|
if (source)
|
||||||
|
source.notify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_approveChannels: function(approver, account, conn, channels,
|
||||||
|
dispatchOp, context) {
|
||||||
|
// Approve the channels right away as we are going to handle it
|
||||||
|
dispatchOp.claim_with_async(this._tpClient,
|
||||||
|
Lang.bind (this, function(dispatchOp, result) {
|
||||||
|
try {
|
||||||
|
dispatchOp.claim_with_finish(result);
|
||||||
|
this._handlingChannels(account, conn, channels);
|
||||||
|
} catch (err) {
|
||||||
|
global.logError('Failed to Claim channel: ' + err);
|
||||||
|
}}));
|
||||||
|
|
||||||
|
context.accept();
|
||||||
|
},
|
||||||
|
|
||||||
|
_handleChannels: function(handler, account, conn, channels,
|
||||||
|
requests, user_action_time, context) {
|
||||||
|
this._handlingChannels(account, conn, channels);
|
||||||
|
context.accept();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function Source(account, conn, channel, contact) {
|
function Source(account, conn, channel, contact, client) {
|
||||||
this._init(account, conn, channel, contact);
|
this._init(account, conn, channel, contact, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
Source.prototype = {
|
Source.prototype = {
|
||||||
__proto__: MessageTray.Source.prototype,
|
__proto__: MessageTray.Source.prototype,
|
||||||
|
|
||||||
_init: function(account, conn, channel, contact) {
|
_init: function(account, conn, channel, contact, client) {
|
||||||
MessageTray.Source.prototype._init.call(this, contact.get_alias());
|
MessageTray.Source.prototype._init.call(this, contact.get_alias());
|
||||||
|
|
||||||
this.isChat = true;
|
this.isChat = true;
|
||||||
|
|
||||||
this._account = account;
|
this._account = account;
|
||||||
this._contact = contact;
|
this._contact = contact;
|
||||||
|
this._client = client;
|
||||||
|
|
||||||
|
this._pendingMessages = [];
|
||||||
|
|
||||||
this._conn = conn;
|
this._conn = conn;
|
||||||
this._channel = channel;
|
this._channel = channel;
|
||||||
@ -175,10 +225,21 @@ Source.prototype = {
|
|||||||
this._notification = new Notification(this);
|
this._notification = new Notification(this);
|
||||||
this._notification.setUrgency(MessageTray.Urgency.HIGH);
|
this._notification.setUrgency(MessageTray.Urgency.HIGH);
|
||||||
|
|
||||||
|
// We ack messages when the message box is collapsed if user has
|
||||||
|
// interacted with it before and so read the messages:
|
||||||
|
// - user clicked on it the tray
|
||||||
|
// - user expanded the notification by hovering over the toaster notification
|
||||||
|
this._shouldAck = false;
|
||||||
|
|
||||||
|
this.connect('summary-item-clicked', Lang.bind(this, this._summaryItemClicked));
|
||||||
|
this._notification.connect('expanded', Lang.bind(this, this._notificationExpanded));
|
||||||
|
this._notification.connect('collapsed', Lang.bind(this, this._notificationCollapsed));
|
||||||
|
|
||||||
this._presence = contact.get_presence_type();
|
this._presence = contact.get_presence_type();
|
||||||
|
|
||||||
this._sentId = this._channel.connect('message-sent', Lang.bind(this, this._messageSent));
|
this._sentId = this._channel.connect('message-sent', Lang.bind(this, this._messageSent));
|
||||||
this._receivedId = this._channel.connect('message-received', Lang.bind(this, this._messageReceived));
|
this._receivedId = this._channel.connect('message-received', Lang.bind(this, this._messageReceived));
|
||||||
|
this._pendingId = this._channel.connect('pending-message-removed', Lang.bind(this, this._pendingRemoved));
|
||||||
|
|
||||||
this._setSummaryIcon(this.createNotificationIcon());
|
this._setSummaryIcon(this.createNotificationIcon());
|
||||||
|
|
||||||
@ -195,7 +256,7 @@ Source.prototype = {
|
|||||||
|
|
||||||
_updateAlias: function() {
|
_updateAlias: function() {
|
||||||
let oldAlias = this.title;
|
let oldAlias = this.title;
|
||||||
this.title = this._contact.get_alias();
|
this.setTitle(this._contact.get_alias());
|
||||||
this._notification.appendAliasChange(oldAlias, this.title);
|
this._notification.appendAliasChange(oldAlias, this.title);
|
||||||
this.pushNotification(this._notification);
|
this.pushNotification(this._notification);
|
||||||
},
|
},
|
||||||
@ -224,13 +285,17 @@ Source.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
open: function(notification) {
|
open: function(notification) {
|
||||||
let props = {};
|
if (this._client.is_handling_channel(this._channel)) {
|
||||||
props[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT;
|
// We are handling the channel, try to pass it to Empathy
|
||||||
[props[Tp.PROP_CHANNEL_TARGET_HANDLE], props[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE]] = this._channel.get_handle();
|
this._client.delegate_channels_async([this._channel], global.get_current_time(), "", null);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// We are not the handler, just ask to present the channel
|
||||||
|
let dbus = Tp.DBusDaemon.dup();
|
||||||
|
let cd = Tp.ChannelDispatcher.new(dbus);
|
||||||
|
|
||||||
let req = Tp.AccountChannelRequest.new(this._account, props, global.get_current_time());
|
cd.present_channel_async(this._channel, global.get_current_time(), null);
|
||||||
|
}
|
||||||
req.ensure_channel_async('', null, null);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_getLogMessages: function() {
|
_getLogMessages: function() {
|
||||||
@ -248,7 +313,18 @@ Source.prototype = {
|
|||||||
let logMessages = events.map(makeMessageFromTplEvent);
|
let logMessages = events.map(makeMessageFromTplEvent);
|
||||||
|
|
||||||
let pendingTpMessages = this._channel.get_pending_messages();
|
let pendingTpMessages = this._channel.get_pending_messages();
|
||||||
let pendingMessages = pendingTpMessages.map(function (tpMessage) { return makeMessageFromTpMessage(tpMessage, NotificationDirection.RECEIVED); });
|
let pendingMessages = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < pendingTpMessages.length; i++) {
|
||||||
|
let message = pendingTpMessages[i];
|
||||||
|
|
||||||
|
if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pendingMessages.push(makeMessageFromTpMessage(message, NotificationDirection.RECEIVED));
|
||||||
|
|
||||||
|
this._pendingMessages.push(message);
|
||||||
|
}
|
||||||
|
|
||||||
let showTimestamp = false;
|
let showTimestamp = false;
|
||||||
|
|
||||||
@ -284,6 +360,7 @@ Source.prototype = {
|
|||||||
_channelClosed: function() {
|
_channelClosed: function() {
|
||||||
this._channel.disconnect(this._closedId);
|
this._channel.disconnect(this._closedId);
|
||||||
this._channel.disconnect(this._receivedId);
|
this._channel.disconnect(this._receivedId);
|
||||||
|
this._channel.disconnect(this._pendingId);
|
||||||
this._channel.disconnect(this._sentId);
|
this._channel.disconnect(this._sentId);
|
||||||
|
|
||||||
this._contact.disconnect(this._notifyAliasId);
|
this._contact.disconnect(this._notifyAliasId);
|
||||||
@ -294,6 +371,11 @@ Source.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_messageReceived: function(channel, message) {
|
_messageReceived: function(channel, message) {
|
||||||
|
if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._pendingMessages.push(message);
|
||||||
|
|
||||||
message = makeMessageFromTpMessage(message, NotificationDirection.RECEIVED);
|
message = makeMessageFromTpMessage(message, NotificationDirection.RECEIVED);
|
||||||
this._notification.appendMessage(message);
|
this._notification.appendMessage(message);
|
||||||
this.notify();
|
this.notify();
|
||||||
@ -320,10 +402,12 @@ Source.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let msg = Tp.ClientMessage.new_text(type, text);
|
let msg = Tp.ClientMessage.new_text(type, text);
|
||||||
this._channel.send_message_async(msg, 0, null);
|
this._channel.send_message_async(msg, 0, Lang.bind(this, function (src, result) {
|
||||||
|
this._channel.send_message_finish(result);
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_presenceChanged: function (contact, presence, type, status, message) {
|
_presenceChanged: function (contact, presence, status, message) {
|
||||||
let msg, shouldNotify, title;
|
let msg, shouldNotify, title;
|
||||||
|
|
||||||
if (this._presence == presence)
|
if (this._presence == presence)
|
||||||
@ -356,6 +440,43 @@ Source.prototype = {
|
|||||||
this._notification.appendPresence(msg, shouldNotify);
|
this._notification.appendPresence(msg, shouldNotify);
|
||||||
if (shouldNotify)
|
if (shouldNotify)
|
||||||
this.notify();
|
this.notify();
|
||||||
|
},
|
||||||
|
|
||||||
|
_pendingRemoved: function(channel, message) {
|
||||||
|
let idx = this._pendingMessages.indexOf(message);
|
||||||
|
|
||||||
|
if (idx >= 0)
|
||||||
|
this._pendingMessages.splice(idx, 1);
|
||||||
|
else
|
||||||
|
throw new Error('Message not in our pending list: ' + message);
|
||||||
|
},
|
||||||
|
|
||||||
|
_ackMessages: function() {
|
||||||
|
if (this._pendingMessages.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Don't clear our messages here, tp-glib will send a
|
||||||
|
// 'pending-message-removed' for each one.
|
||||||
|
this._channel.ack_messages_async(this._pendingMessages, Lang.bind(this, function(src, result) {
|
||||||
|
this._channel.ack_messages_finish(result);}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_summaryItemClicked: function(source, button) {
|
||||||
|
if (button != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._shouldAck = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_notificationExpanded: function() {
|
||||||
|
this._shouldAck = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_notificationCollapsed: function() {
|
||||||
|
if (this._shouldAck)
|
||||||
|
this._ackMessages();
|
||||||
|
|
||||||
|
this._shouldAck = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -416,17 +537,43 @@ Notification.prototype = {
|
|||||||
styles.push('chat-action');
|
styles.push('chat-action');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.update(this.source.title, messageBody, { customContent: true, bannerMarkup: true });
|
if (message.direction == NotificationDirection.RECEIVED) {
|
||||||
|
this.update(this.source.title, messageBody, { customContent: true,
|
||||||
|
bannerMarkup: true });
|
||||||
|
}
|
||||||
|
|
||||||
this._append(messageBody, styles, message.timestamp, noTimestamp);
|
this._append(messageBody, styles, message.timestamp, noTimestamp);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_filterMessages: function() {
|
||||||
|
if (this._history.length < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let lastMessageTime = this._history[0].time;
|
||||||
|
let currentTime = (Date.now() / 1000);
|
||||||
|
|
||||||
|
// 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 maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ?
|
||||||
|
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
|
||||||
|
|
||||||
|
let filteredHistory = this._history.filter(function(item) { return item.realMessage });
|
||||||
|
if (filteredHistory.length > maxLength) {
|
||||||
|
let lastMessageToKeep = filteredHistory[maxLength];
|
||||||
|
let expired = this._history.splice(this._history.indexOf(lastMessageToKeep));
|
||||||
|
for (let i = 0; i < expired.length; i++)
|
||||||
|
expired[i].actor.destroy();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_append: function(text, styles, timestamp, noTimestamp) {
|
_append: function(text, styles, timestamp, noTimestamp) {
|
||||||
let currentTime = (Date.now() / 1000);
|
let currentTime = (Date.now() / 1000);
|
||||||
if (!timestamp)
|
if (!timestamp)
|
||||||
timestamp = currentTime;
|
timestamp = currentTime;
|
||||||
let lastMessageTime = -1;
|
|
||||||
if (this._history.length > 0)
|
|
||||||
lastMessageTime = this._history[0].time;
|
|
||||||
|
|
||||||
// Reset the old message timeout
|
// Reset the old message timeout
|
||||||
if (this._timestampTimeoutId)
|
if (this._timestampTimeoutId)
|
||||||
@ -449,23 +596,7 @@ Notification.prototype = {
|
|||||||
Lang.bind(this, this.appendTimestamp));
|
Lang.bind(this, this.appendTimestamp));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._history.length > 1) {
|
this._filterMessages();
|
||||||
// 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 maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ?
|
|
||||||
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
|
|
||||||
let filteredHistory = this._history.filter(function(item) { return item.realMessage });
|
|
||||||
if (filteredHistory.length > maxLength) {
|
|
||||||
let lastMessageToKeep = filteredHistory[maxLength];
|
|
||||||
let expired = this._history.splice(this._history.indexOf(lastMessageToKeep));
|
|
||||||
for (let i = 0; i < expired.length; i++)
|
|
||||||
expired[i].actor.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_formatTimestamp: function(date) {
|
_formatTimestamp: function(date) {
|
||||||
@ -507,6 +638,9 @@ Notification.prototype = {
|
|||||||
this._history.unshift({ actor: timeLabel, time: lastMessageTime, realMessage: false });
|
this._history.unshift({ actor: timeLabel, time: lastMessageTime, realMessage: false });
|
||||||
|
|
||||||
this._timestampTimeoutId = 0;
|
this._timestampTimeoutId = 0;
|
||||||
|
|
||||||
|
this._filterMessages();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -518,21 +652,23 @@ Notification.prototype = {
|
|||||||
let label = this.addBody(text, true);
|
let label = this.addBody(text, true);
|
||||||
label.add_style_class_name('chat-meta-message');
|
label.add_style_class_name('chat-meta-message');
|
||||||
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false});
|
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false});
|
||||||
|
|
||||||
|
this._filterMessages();
|
||||||
},
|
},
|
||||||
|
|
||||||
appendAliasChange: function(oldAlias, newAlias) {
|
appendAliasChange: function(oldAlias, newAlias) {
|
||||||
// FIXME: uncomment this after 3.0 string freeze ends
|
oldAlias = GLib.markup_escape_text(oldAlias, -1);
|
||||||
|
newAlias = GLib.markup_escape_text(newAlias, -1);
|
||||||
|
|
||||||
// oldAlias = GLib.markup_escape_text(oldAlias, -1);
|
/* Translators: this is the other person changing their old IM name to their new
|
||||||
// newAlias = GLib.markup_escape_text(newAlias, -1);
|
IM name. */
|
||||||
|
let message = '<i>' + _("%s is now known as %s").format(oldAlias, newAlias) + '</i>';
|
||||||
|
let label = this.addBody(message, true);
|
||||||
|
label.add_style_class_name('chat-meta-message');
|
||||||
|
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false });
|
||||||
|
this.update(newAlias, null, { customContent: true });
|
||||||
|
|
||||||
// /* Translators: this is the other person changing their old IM name to their new
|
this._filterMessages();
|
||||||
// IM name. */
|
|
||||||
// let message = '<i>' + _("%s is now known as %s").format(oldAlias, newAlias) + '</i>';
|
|
||||||
// let label = this.addBody(message, true);
|
|
||||||
// label.add_style_class_name('chat-meta-message');
|
|
||||||
// this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false });
|
|
||||||
// this.update(newAlias, null, { customContent: true });
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onEntryActivated: function() {
|
_onEntryActivated: function() {
|
||||||
|
@ -8,8 +8,6 @@ const Signals = imports.signals;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Search = imports.ui.search;
|
const Search = imports.ui.search;
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
|
@ -6,6 +6,7 @@ const Gio = imports.gi.Gio;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
const AltTab = imports.ui.altTab;
|
const AltTab = imports.ui.altTab;
|
||||||
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
||||||
@ -22,8 +23,7 @@ function getDimShader() {
|
|||||||
if (dimShader === null)
|
if (dimShader === null)
|
||||||
return null;
|
return null;
|
||||||
if (!dimShader) {
|
if (!dimShader) {
|
||||||
let [success, source, length] = GLib.file_get_contents(global.datadir +
|
let source = Shell.get_file_contents_utf8_sync(global.datadir + '/shaders/dim-window.glsl');
|
||||||
'/shaders/dim-window.glsl');
|
|
||||||
try {
|
try {
|
||||||
let shader = new Clutter.Shader();
|
let shader = new Clutter.Shader();
|
||||||
shader.set_fragment_source(source, -1);
|
shader.set_fragment_source(source, -1);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const GConf = imports.gi.GConf;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
@ -27,6 +28,8 @@ const CLOSE_BUTTON_FADE_TIME = 0.1;
|
|||||||
|
|
||||||
const DRAGGING_WINDOW_OPACITY = 100;
|
const DRAGGING_WINDOW_OPACITY = 100;
|
||||||
|
|
||||||
|
const BUTTON_LAYOUT_KEY = '/desktop/gnome/shell/windows/button_layout';
|
||||||
|
|
||||||
// Define a layout scheme for small window counts. For larger
|
// Define a layout scheme for small window counts. For larger
|
||||||
// counts we fall back to an algorithm. We need more schemes here
|
// counts we fall back to an algorithm. We need more schemes here
|
||||||
// unless we have a really good algorithm.
|
// unless we have a really good algorithm.
|
||||||
@ -237,7 +240,7 @@ WindowClone.prototype = {
|
|||||||
this.emit('zoom-start');
|
this.emit('zoom-start');
|
||||||
|
|
||||||
if (!this._zoomLightbox)
|
if (!this._zoomLightbox)
|
||||||
this._zoomLightbox = new Lightbox.Lightbox(global.stage,
|
this._zoomLightbox = new Lightbox.Lightbox(Main.uiGroup,
|
||||||
{ fadeTime: LIGHTBOX_FADE_TIME });
|
{ fadeTime: LIGHTBOX_FADE_TIME });
|
||||||
this._zoomLightbox.show();
|
this._zoomLightbox.show();
|
||||||
|
|
||||||
@ -248,7 +251,7 @@ WindowClone.prototype = {
|
|||||||
this._zoomGlobalOrig.setPosition.apply(this._zoomGlobalOrig, this.actor.get_transformed_position());
|
this._zoomGlobalOrig.setPosition.apply(this._zoomGlobalOrig, this.actor.get_transformed_position());
|
||||||
this._zoomGlobalOrig.setScale(width / this.actor.width, height / this.actor.height);
|
this._zoomGlobalOrig.setScale(width / this.actor.width, height / this.actor.height);
|
||||||
|
|
||||||
this.actor.reparent(global.stage);
|
this.actor.reparent(Main.uiGroup);
|
||||||
this._zoomLightbox.highlight(this.actor);
|
this._zoomLightbox.highlight(this.actor);
|
||||||
|
|
||||||
[this.actor.x, this.actor.y] = this._zoomGlobalOrig.getPosition();
|
[this.actor.x, this.actor.y] = this._zoomGlobalOrig.getPosition();
|
||||||
@ -296,12 +299,30 @@ WindowClone.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDragBegin : function (draggable, time) {
|
_onDragBegin : function (draggable, time) {
|
||||||
|
if (this._zooming)
|
||||||
|
this._zoomEnd();
|
||||||
|
|
||||||
[this.dragOrigX, this.dragOrigY] = this.actor.get_position();
|
[this.dragOrigX, this.dragOrigY] = this.actor.get_position();
|
||||||
this.dragOrigScale = this.actor.scale_x;
|
this.dragOrigScale = this.actor.scale_x;
|
||||||
this.inDrag = true;
|
this.inDrag = true;
|
||||||
this.emit('drag-begin');
|
this.emit('drag-begin');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getWorkspaceActor : function() {
|
||||||
|
let index = this.metaWindow.get_workspace().index();
|
||||||
|
return Main.overview.workspaces.getWorkspaceByIndex(index);
|
||||||
|
},
|
||||||
|
|
||||||
|
handleDragOver : function(source, actor, x, y, time) {
|
||||||
|
let workspace = this._getWorkspaceActor();
|
||||||
|
return workspace.handleDragOver(source, actor, x, y, time);
|
||||||
|
},
|
||||||
|
|
||||||
|
acceptDrop : function(source, actor, x, y, time) {
|
||||||
|
let workspace = this._getWorkspaceActor();
|
||||||
|
workspace.acceptDrop(source, actor, x, y, time);
|
||||||
|
},
|
||||||
|
|
||||||
_onDragCancelled : function (draggable, time) {
|
_onDragCancelled : function (draggable, time) {
|
||||||
this.emit('drag-cancelled');
|
this.emit('drag-cancelled');
|
||||||
},
|
},
|
||||||
@ -394,6 +415,8 @@ WindowOverlay.prototype = {
|
|||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
this._hidden = false;
|
this._hidden = false;
|
||||||
|
if (this._windowClone.actor.has_pointer)
|
||||||
|
this.closeButton.show();
|
||||||
this.title.show();
|
this.title.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -430,9 +453,20 @@ WindowOverlay.prototype = {
|
|||||||
let button = this.closeButton;
|
let button = this.closeButton;
|
||||||
let title = this.title;
|
let title = this.title;
|
||||||
|
|
||||||
|
let gconf = GConf.Client.get_default();
|
||||||
|
let layout = gconf.get_string(BUTTON_LAYOUT_KEY);
|
||||||
|
let rtl = St.Widget.get_default_direction() == St.TextDirection.RTL;
|
||||||
|
|
||||||
|
let split = layout.split(":");
|
||||||
|
let side;
|
||||||
|
if (split[0].indexOf("close") > -1)
|
||||||
|
side = rtl ? St.Side.RIGHT : St.Side.LEFT;
|
||||||
|
else
|
||||||
|
side = rtl ? St.Side.LEFT : St.Side.RIGHT;
|
||||||
|
|
||||||
let buttonX;
|
let buttonX;
|
||||||
let buttonY = cloneY - (button.height - button._overlap);
|
let buttonY = cloneY - (button.height - button._overlap);
|
||||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
|
if (side == St.Side.LEFT)
|
||||||
buttonX = cloneX - (button.width - button._overlap);
|
buttonX = cloneX - (button.width - button._overlap);
|
||||||
else
|
else
|
||||||
buttonX = cloneX + (cloneWidth - button._overlap);
|
buttonX = cloneX + (cloneWidth - button._overlap);
|
||||||
@ -614,6 +648,7 @@ Workspace.prototype = {
|
|||||||
function () {
|
function () {
|
||||||
this._dropRect.set_position(x, y);
|
this._dropRect.set_position(x, y);
|
||||||
this._dropRect.set_size(width, height);
|
this._dropRect.set_size(width, height);
|
||||||
|
this.positionWindows(WindowPositionFlags.ANIMATE);
|
||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -636,16 +671,6 @@ Workspace.prototype = {
|
|||||||
return this._windows.length == 0;
|
return this._windows.length == 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* setReactive:
|
|
||||||
* @reactive: %true iff the workspace should be reactive
|
|
||||||
*
|
|
||||||
* Set the workspace (desktop) reactive
|
|
||||||
**/
|
|
||||||
setReactive: function(reactive) {
|
|
||||||
this.actor.reactive = reactive;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Only use this for n <= 20 say
|
// Only use this for n <= 20 say
|
||||||
_factorial: function(n) {
|
_factorial: function(n) {
|
||||||
let result = 1;
|
let result = 1;
|
||||||
|
@ -178,6 +178,11 @@ WorkspaceThumbnail.prototype = {
|
|||||||
// Create clones for windows that should be visible in the Overview
|
// Create clones for windows that should be visible in the Overview
|
||||||
this._windows = [];
|
this._windows = [];
|
||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
|
windows[i].meta_window._minimizedChangedId =
|
||||||
|
windows[i].meta_window.connect('notify::minimized',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._updateMinimized));
|
||||||
|
|
||||||
if (this._isOverviewWindow(windows[i])) {
|
if (this._isOverviewWindow(windows[i])) {
|
||||||
this._addWindowClone(windows[i]);
|
this._addWindowClone(windows[i]);
|
||||||
}
|
}
|
||||||
@ -257,11 +262,18 @@ WorkspaceThumbnail.prototype = {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if window still should be here
|
// Check if window still should be here
|
||||||
if (win && this._isMyWindow(win))
|
if (win && this._isMyWindow(win) && this._isOverviewWindow(win))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let clone = this._windows[index];
|
let clone = this._windows[index];
|
||||||
this._windows.splice(index, 1);
|
this._windows.splice(index, 1);
|
||||||
|
|
||||||
|
if (win && this._isOverviewWindow(win)) {
|
||||||
|
if (metaWin._minimizedChangedId) {
|
||||||
|
metaWin.disconnect(metaWin._minimizedChangedId);
|
||||||
|
delete metaWin._minimizedChangedId;
|
||||||
|
}
|
||||||
|
}
|
||||||
clone.destroy();
|
clone.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -290,6 +302,11 @@ WorkspaceThumbnail.prototype = {
|
|||||||
if (this._lookupIndex (metaWin) != -1)
|
if (this._lookupIndex (metaWin) != -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!metaWin._minimizedChangedId)
|
||||||
|
metaWin._minimizedChangedId = metaWin.connect('notify::minimized',
|
||||||
|
Lang.bind(this,
|
||||||
|
this._updateMinimized));
|
||||||
|
|
||||||
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -316,6 +333,13 @@ WorkspaceThumbnail.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_updateMinimized: function(metaWin) {
|
||||||
|
if (metaWin.minimized)
|
||||||
|
this._doRemoveWindow(metaWin);
|
||||||
|
else
|
||||||
|
this._doAddWindow(metaWin);
|
||||||
|
},
|
||||||
|
|
||||||
destroy : function() {
|
destroy : function() {
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
},
|
},
|
||||||
@ -326,6 +350,14 @@ WorkspaceThumbnail.prototype = {
|
|||||||
global.screen.disconnect(this._windowEnteredMonitorId);
|
global.screen.disconnect(this._windowEnteredMonitorId);
|
||||||
global.screen.disconnect(this._windowLeftMonitorId);
|
global.screen.disconnect(this._windowLeftMonitorId);
|
||||||
|
|
||||||
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
|
let metaWin = this._windows[i].metaWindow;
|
||||||
|
if (metaWin._minimizedChangedId) {
|
||||||
|
metaWin.disconnect(metaWin._minimizedChangedId);
|
||||||
|
delete metaWin._minimizedChangedId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._windows = [];
|
this._windows = [];
|
||||||
this.actor = null;
|
this.actor = null;
|
||||||
},
|
},
|
||||||
@ -339,7 +371,8 @@ WorkspaceThumbnail.prototype = {
|
|||||||
// Tests if @win should be shown in the Overview
|
// Tests if @win should be shown in the Overview
|
||||||
_isOverviewWindow : function (win) {
|
_isOverviewWindow : function (win) {
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
let tracker = Shell.WindowTracker.get_default();
|
||||||
return tracker.is_window_interesting(win.get_meta_window());
|
return tracker.is_window_interesting(win.get_meta_window()) &&
|
||||||
|
win.get_meta_window().showing_on_its_workspace();
|
||||||
},
|
},
|
||||||
|
|
||||||
// Create a clone of a (non-desktop) window and add it to the window list
|
// Create a clone of a (non-desktop) window and add it to the window list
|
||||||
|
@ -7,8 +7,6 @@ const Meta = imports.gi.Meta;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
|
||||||
const _ = Gettext.gettext;
|
|
||||||
|
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -51,9 +49,12 @@ WorkspacesView.prototype = {
|
|||||||
this._height = 0;
|
this._height = 0;
|
||||||
this._x = 0;
|
this._x = 0;
|
||||||
this._y = 0;
|
this._y = 0;
|
||||||
|
this._clipX = 0;
|
||||||
|
this._clipY = 0;
|
||||||
|
this._clipWidth = 0;
|
||||||
|
this._clipHeight = 0;
|
||||||
this._workspaceRatioSpacing = 0;
|
this._workspaceRatioSpacing = 0;
|
||||||
this._spacing = 0;
|
this._spacing = 0;
|
||||||
this._lostWorkspaces = [];
|
|
||||||
this._animating = false; // tweening
|
this._animating = false; // tweening
|
||||||
this._scrolling = false; // swipe-scrolling
|
this._scrolling = false; // swipe-scrolling
|
||||||
this._animatingScroll = false; // programatically updating the adjustment
|
this._animatingScroll = false; // programatically updating the adjustment
|
||||||
@ -95,7 +96,8 @@ WorkspacesView.prototype = {
|
|||||||
this._overviewShownId =
|
this._overviewShownId =
|
||||||
Main.overview.connect('shown',
|
Main.overview.connect('shown',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this.actor.set_clip(this._x, this._y, this._width, this._height);
|
this.actor.set_clip(this._clipX, this._clipY,
|
||||||
|
this._clipWidth, this._clipHeight);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
||||||
@ -139,6 +141,13 @@ WorkspacesView.prototype = {
|
|||||||
this._workspaces[i].setGeometry(x, y, width, height);
|
this._workspaces[i].setGeometry(x, y, width, height);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setClipRect: function(x, y, width, height) {
|
||||||
|
this._clipX = x;
|
||||||
|
this._clipY = y;
|
||||||
|
this._clipWidth = width;
|
||||||
|
this._clipHeight = height;
|
||||||
|
},
|
||||||
|
|
||||||
_lookupWorkspaceForMetaWindow: function (metaWindow) {
|
_lookupWorkspaceForMetaWindow: function (metaWindow) {
|
||||||
for (let i = 0; i < this._workspaces.length; i++) {
|
for (let i = 0; i < this._workspaces.length; i++) {
|
||||||
if (this._workspaces[i].containsMetaWindow(metaWindow))
|
if (this._workspaces[i].containsMetaWindow(metaWindow))
|
||||||
@ -152,6 +161,10 @@ WorkspacesView.prototype = {
|
|||||||
return this._workspaces[active];
|
return this._workspaces[active];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getWorkspaceByIndex: function(index) {
|
||||||
|
return this._workspaces[index];
|
||||||
|
},
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||||
let activeWorkspace = this._workspaces[activeWorkspaceIndex];
|
let activeWorkspace = this._workspaces[activeWorkspaceIndex];
|
||||||
@ -201,12 +214,10 @@ WorkspacesView.prototype = {
|
|||||||
|
|
||||||
Tweener.removeTweens(workspace.actor);
|
Tweener.removeTweens(workspace.actor);
|
||||||
|
|
||||||
let opacity = (this._inDrag && w != active) ? 200 : 255;
|
|
||||||
let y = (w - active) * (this._height + this._spacing + this._workspaceRatioSpacing);
|
let y = (w - active) * (this._height + this._spacing + this._workspaceRatioSpacing);
|
||||||
|
|
||||||
if (showAnimation) {
|
if (showAnimation) {
|
||||||
let params = { y: y,
|
let params = { y: y,
|
||||||
opacity: opacity,
|
|
||||||
time: WORKSPACE_SWITCH_TIME,
|
time: WORKSPACE_SWITCH_TIME,
|
||||||
transition: 'easeOutQuad'
|
transition: 'easeOutQuad'
|
||||||
};
|
};
|
||||||
@ -224,32 +235,10 @@ WorkspacesView.prototype = {
|
|||||||
Tweener.addTween(workspace.actor, params);
|
Tweener.addTween(workspace.actor, params);
|
||||||
} else {
|
} else {
|
||||||
workspace.actor.set_position(0, y);
|
workspace.actor.set_position(0, y);
|
||||||
workspace.actor.opacity = opacity;
|
|
||||||
if (w == 0)
|
if (w == 0)
|
||||||
this._updateVisibility();
|
this._updateVisibility();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let l = 0; l < this._lostWorkspaces.length; l++) {
|
|
||||||
let workspace = this._lostWorkspaces[l];
|
|
||||||
|
|
||||||
Tweener.removeTweens(workspace.actor);
|
|
||||||
|
|
||||||
workspace.actor.show();
|
|
||||||
workspace.hideWindowsOverlays();
|
|
||||||
|
|
||||||
if (showAnimation) {
|
|
||||||
Tweener.addTween(workspace.actor,
|
|
||||||
{ y: workspace.x,
|
|
||||||
time: WORKSPACE_SWITCH_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: Lang.bind(this,
|
|
||||||
this._cleanWorkspaces)
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._cleanWorkspaces();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateVisibility: function() {
|
_updateVisibility: function() {
|
||||||
@ -270,17 +259,6 @@ WorkspacesView.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_cleanWorkspaces: function() {
|
|
||||||
if (this._lostWorkspaces.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (let l = 0; l < this._lostWorkspaces.length; l++)
|
|
||||||
this._lostWorkspaces[l].destroy();
|
|
||||||
this._lostWorkspaces = [];
|
|
||||||
|
|
||||||
this._updateWorkspaceActors(false);
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateScrollAdjustment: function(index, showAnimation) {
|
_updateScrollAdjustment: function(index, showAnimation) {
|
||||||
if (this._scrolling)
|
if (this._scrolling)
|
||||||
return;
|
return;
|
||||||
@ -303,12 +281,9 @@ WorkspacesView.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces, lostWorkspaces) {
|
updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces) {
|
||||||
let active = global.screen.get_active_workspace_index();
|
let active = global.screen.get_active_workspace_index();
|
||||||
|
|
||||||
for (let l = 0; l < lostWorkspaces.length; l++)
|
|
||||||
lostWorkspaces[l].disconnectAll();
|
|
||||||
|
|
||||||
Tweener.addTween(this._scrollAdjustment,
|
Tweener.addTween(this._scrollAdjustment,
|
||||||
{ upper: newNumWorkspaces,
|
{ upper: newNumWorkspaces,
|
||||||
time: WORKSPACE_SWITCH_TIME,
|
time: WORKSPACE_SWITCH_TIME,
|
||||||
@ -316,12 +291,13 @@ WorkspacesView.prototype = {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (newNumWorkspaces > oldNumWorkspaces) {
|
if (newNumWorkspaces > oldNumWorkspaces) {
|
||||||
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++)
|
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
|
||||||
|
this._workspaces[w].setGeometry(this._x, this._y,
|
||||||
|
this._width, this._height);
|
||||||
this.actor.add_actor(this._workspaces[w].actor);
|
this.actor.add_actor(this._workspaces[w].actor);
|
||||||
|
}
|
||||||
|
|
||||||
this._updateWorkspaceActors(false);
|
this._updateWorkspaceActors(false);
|
||||||
} else {
|
|
||||||
this._lostWorkspaces = lostWorkspaces;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._scrollToActive(true);
|
this._scrollToActive(true);
|
||||||
@ -439,20 +415,14 @@ WorkspacesView.prototype = {
|
|||||||
if (topWorkspace) {
|
if (topWorkspace) {
|
||||||
if (topWorkspace.actor.contains(dragEvent.targetActor)) {
|
if (topWorkspace.actor.contains(dragEvent.targetActor)) {
|
||||||
hoverWorkspace = topWorkspace;
|
hoverWorkspace = topWorkspace;
|
||||||
topWorkspace.opacity = topWorkspace.actor.opacity = 255;
|
|
||||||
result = topWorkspace.handleDragOver(dragEvent.source, dragEvent.dragActor);
|
result = topWorkspace.handleDragOver(dragEvent.source, dragEvent.dragActor);
|
||||||
} else {
|
|
||||||
topWorkspace.opacity = topWorkspace.actor.opacity = 200;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bottomWorkspace) {
|
if (bottomWorkspace) {
|
||||||
if (bottomWorkspace.actor.contains(dragEvent.targetActor)) {
|
if (bottomWorkspace.actor.contains(dragEvent.targetActor)) {
|
||||||
hoverWorkspace = bottomWorkspace;
|
hoverWorkspace = bottomWorkspace;
|
||||||
bottomWorkspace.opacity = bottomWorkspace.actor.opacity = 255;
|
|
||||||
result = bottomWorkspace.handleDragOver(dragEvent.source, dragEvent.dragActor);
|
result = bottomWorkspace.handleDragOver(dragEvent.source, dragEvent.dragActor);
|
||||||
} else {
|
|
||||||
bottomWorkspace.opacity = bottomWorkspace.actor.opacity = 200;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -479,7 +449,7 @@ WorkspacesView.prototype = {
|
|||||||
Mainloop.source_remove(this._timeoutId);
|
Mainloop.source_remove(this._timeoutId);
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
}
|
}
|
||||||
DND.removeMonitor(this._dragMonitor);
|
DND.removeDragMonitor(this._dragMonitor);
|
||||||
this._inDrag = false;
|
this._inDrag = false;
|
||||||
|
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
@ -598,6 +568,9 @@ WorkspacesDisplay.prototype = {
|
|||||||
this._updateAlwaysZoom();
|
this._updateAlwaysZoom();
|
||||||
|
|
||||||
global.screen.connect('monitors-changed', Lang.bind(this, this._updateAlwaysZoom));
|
global.screen.connect('monitors-changed', Lang.bind(this, this._updateAlwaysZoom));
|
||||||
|
global.screen.connect('notify::n-workspaces',
|
||||||
|
Lang.bind(this, this._workspacesChanged));
|
||||||
|
|
||||||
Main.xdndHandler.connect('drag-begin', Lang.bind(this, function(){
|
Main.xdndHandler.connect('drag-begin', Lang.bind(this, function(){
|
||||||
this._alwaysZoomOut = true;
|
this._alwaysZoomOut = true;
|
||||||
}));
|
}));
|
||||||
@ -607,7 +580,6 @@ WorkspacesDisplay.prototype = {
|
|||||||
this._updateAlwaysZoom();
|
this._updateAlwaysZoom();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._nWorkspacesNotifyId = 0;
|
|
||||||
this._switchWorkspaceNotifyId = 0;
|
this._switchWorkspaceNotifyId = 0;
|
||||||
|
|
||||||
this._itemDragBeginId = 0;
|
this._itemDragBeginId = 0;
|
||||||
@ -637,10 +609,6 @@ WorkspacesDisplay.prototype = {
|
|||||||
this.workspacesView = new WorkspacesView(this._workspaces);
|
this.workspacesView = new WorkspacesView(this._workspaces);
|
||||||
this._updateWorkspacesGeometry();
|
this._updateWorkspacesGeometry();
|
||||||
|
|
||||||
this._nWorkspacesNotifyId =
|
|
||||||
global.screen.connect('notify::n-workspaces',
|
|
||||||
Lang.bind(this, this._workspacesChanged));
|
|
||||||
|
|
||||||
this._restackedNotifyId =
|
this._restackedNotifyId =
|
||||||
global.screen.connect('restacked',
|
global.screen.connect('restacked',
|
||||||
Lang.bind(this, this._onRestacked));
|
Lang.bind(this, this._onRestacked));
|
||||||
@ -671,10 +639,6 @@ WorkspacesDisplay.prototype = {
|
|||||||
this._controls.hide();
|
this._controls.hide();
|
||||||
this._thumbnailsBox.hide();
|
this._thumbnailsBox.hide();
|
||||||
|
|
||||||
if (this._nWorkspacesNotifyId > 0) {
|
|
||||||
global.screen.disconnect(this._nWorkspacesNotifyId);
|
|
||||||
this._nWorkspacesNotifyId = 0;
|
|
||||||
}
|
|
||||||
if (this._restackedNotifyId > 0){
|
if (this._restackedNotifyId > 0){
|
||||||
global.screen.disconnect(this._restackedNotifyId);
|
global.screen.disconnect(this._restackedNotifyId);
|
||||||
this._restackedNotifyId = 0;
|
this._restackedNotifyId = 0;
|
||||||
@ -723,7 +687,12 @@ WorkspacesDisplay.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_updateAlwaysZoom: function() {
|
_updateAlwaysZoom: function() {
|
||||||
this._alwaysZoomOut = false;
|
// Always show the pager if workspaces are actually used,
|
||||||
|
// e.g. there are windows on more than one
|
||||||
|
this._alwaysZoomOut = global.screen.n_workspaces > 2;
|
||||||
|
|
||||||
|
if (this._alwaysZoomOut)
|
||||||
|
return;
|
||||||
|
|
||||||
let monitors = global.get_monitors();
|
let monitors = global.get_monitors();
|
||||||
let primary = global.get_primary_monitor();
|
let primary = global.get_primary_monitor();
|
||||||
@ -794,6 +763,13 @@ WorkspacesDisplay.prototype = {
|
|||||||
|
|
||||||
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
|
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
|
||||||
|
|
||||||
|
let clipWidth = width - controlsVisible;
|
||||||
|
let clipHeight = (fullHeight / fullWidth) * clipWidth;
|
||||||
|
let clipX = rtl ? x + controlsVisible : x;
|
||||||
|
let clipY = y + (fullHeight - clipHeight) / 2;
|
||||||
|
|
||||||
|
this.workspacesView.setClipRect(clipX, clipY, clipWidth, clipHeight);
|
||||||
|
|
||||||
if (this._zoomOut) {
|
if (this._zoomOut) {
|
||||||
width -= controlsNatural;
|
width -= controlsNatural;
|
||||||
if (rtl)
|
if (rtl)
|
||||||
@ -832,6 +808,12 @@ WorkspacesDisplay.prototype = {
|
|||||||
if (oldNumWorkspaces == newNumWorkspaces)
|
if (oldNumWorkspaces == newNumWorkspaces)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this._updateAlwaysZoom();
|
||||||
|
this._updateZoom();
|
||||||
|
|
||||||
|
if (this.workspacesView == null)
|
||||||
|
return;
|
||||||
|
|
||||||
let lostWorkspaces = [];
|
let lostWorkspaces = [];
|
||||||
if (newNumWorkspaces > oldNumWorkspaces) {
|
if (newNumWorkspaces > oldNumWorkspaces) {
|
||||||
// Assume workspaces are only added at the end
|
// Assume workspaces are only added at the end
|
||||||
@ -857,24 +839,23 @@ WorkspacesDisplay.prototype = {
|
|||||||
lostWorkspaces = this._workspaces.splice(removedIndex,
|
lostWorkspaces = this._workspaces.splice(removedIndex,
|
||||||
removedNum);
|
removedNum);
|
||||||
|
|
||||||
// Don't let the user try to select this workspace as it's
|
for (let l = 0; l < lostWorkspaces.length; l++) {
|
||||||
// making its exit.
|
lostWorkspaces[l].disconnectAll();
|
||||||
for (let l = 0; l < lostWorkspaces.length; l++)
|
lostWorkspaces[l].destroy();
|
||||||
lostWorkspaces[l].setReactive(false);
|
}
|
||||||
|
|
||||||
this._thumbnailsBox.removeThumbmails(removedIndex, removedNum);
|
this._thumbnailsBox.removeThumbmails(removedIndex, removedNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.workspacesView.updateWorkspaces(oldNumWorkspaces,
|
this.workspacesView.updateWorkspaces(oldNumWorkspaces,
|
||||||
newNumWorkspaces,
|
newNumWorkspaces);
|
||||||
lostWorkspaces);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateZoom : function() {
|
_updateZoom : function() {
|
||||||
if (Main.overview.animationInProgress)
|
if (Main.overview.animationInProgress)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let shouldZoom = this._alwaysZoomOut || this._controls.hover || (this._inDrag && !this._cancelledDrag);
|
let shouldZoom = this._alwaysZoomOut || this._controls.hover;
|
||||||
if (shouldZoom != this._zoomOut) {
|
if (shouldZoom != this._zoomOut) {
|
||||||
this._zoomOut = shouldZoom;
|
this._zoomOut = shouldZoom;
|
||||||
this._updateWorkspacesGeometry();
|
this._updateWorkspacesGeometry();
|
||||||
@ -898,12 +879,22 @@ WorkspacesDisplay.prototype = {
|
|||||||
_dragBegin: function() {
|
_dragBegin: function() {
|
||||||
this._inDrag = true;
|
this._inDrag = true;
|
||||||
this._cancelledDrag = false;
|
this._cancelledDrag = false;
|
||||||
this._updateZoom();
|
this._dragMonitor = {
|
||||||
|
dragMotion: Lang.bind(this, this._onDragMotion)
|
||||||
|
};
|
||||||
|
DND.addDragMonitor(this._dragMonitor);
|
||||||
},
|
},
|
||||||
|
|
||||||
_dragCancelled: function() {
|
_dragCancelled: function() {
|
||||||
this._cancelledDrag = true;
|
this._cancelledDrag = true;
|
||||||
this._updateZoom();
|
DND.removeDragMonitor(this._dragMonitor);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDragMotion: function(dragEvent) {
|
||||||
|
let controlsHovered = this._controls.contains(dragEvent.targetActor);
|
||||||
|
this._controls.set_hover(controlsHovered);
|
||||||
|
|
||||||
|
return DND.DragMotionResult.CONTINUE;
|
||||||
},
|
},
|
||||||
|
|
||||||
_dragEnd: function() {
|
_dragEnd: function() {
|
||||||
|
@ -36,53 +36,48 @@ visually attractive and easy to use experience.
|
|||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-r, \-\-replace
|
.B \-\-replace
|
||||||
Replace the running metacity/gnome-panel
|
Replace the running window manager
|
||||||
.br
|
.br
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-v, \-\-verbose
|
.B \-\-sm-disable
|
||||||
Shows details about the results of running `gnome-shell'.
|
Disable connection to the session manager
|
||||||
.br
|
.br
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-g, \-\-debug
|
.B \-\-sm-client-id=ID
|
||||||
Run under a debugger
|
Specify session management ID
|
||||||
.br
|
.br
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-\-debug\-command
|
.B \-\-sm-save-file=FILE
|
||||||
Command to use for debugging (defaults to 'gdb \-\-args')
|
Initialize session from savefile
|
||||||
|
.br
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-\-screen=SCREEN
|
||||||
|
X screen to use
|
||||||
|
.br
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B \-d, \-\-display=DISPLAY
|
||||||
|
X display to use
|
||||||
.br
|
.br
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-\-sync
|
.B \-\-sync
|
||||||
.br
|
Make X calls synchronous
|
||||||
Make X calls synchronously, useful when debugging down X errors
|
|
||||||
.br
|
.br
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-\-xephyr
|
.B \-\-version
|
||||||
Run a debugging instance inside Xephyr
|
Print version and exit
|
||||||
.br
|
.br
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-\-geometry
|
.B \-\-help
|
||||||
Specify Xephyr screen geometry
|
Display help and exit
|
||||||
.br
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-w, \-\-wide
|
|
||||||
Use widescreen (1280x800) with Xephyr
|
|
||||||
.br
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-\-create\-extension
|
|
||||||
Create a new GNOME Shell extension
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B \-\-eval\-file
|
|
||||||
Evaluate the contents of the given JavaScript file
|
|
||||||
.br
|
.br
|
||||||
|
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
|
@ -1,14 +1,18 @@
|
|||||||
af
|
af
|
||||||
|
an
|
||||||
ar
|
ar
|
||||||
|
be
|
||||||
bg
|
bg
|
||||||
bn
|
bn
|
||||||
bn_IN
|
bn_IN
|
||||||
ca
|
ca
|
||||||
|
ca@valencia
|
||||||
cs
|
cs
|
||||||
da
|
da
|
||||||
de
|
de
|
||||||
el
|
el
|
||||||
en_GB
|
en_GB
|
||||||
|
eo
|
||||||
es
|
es
|
||||||
et
|
et
|
||||||
eu
|
eu
|
||||||
@ -38,11 +42,13 @@ pt
|
|||||||
pt_BR
|
pt_BR
|
||||||
ro
|
ro
|
||||||
ru
|
ru
|
||||||
|
sk
|
||||||
sl
|
sl
|
||||||
sr
|
sr
|
||||||
sr@latin
|
sr@latin
|
||||||
sv
|
sv
|
||||||
ta
|
ta
|
||||||
|
te
|
||||||
th
|
th
|
||||||
tr
|
tr
|
||||||
ug
|
ug
|
||||||
|
1426
po/ca@valencia.po
Normal file
56
po/fi.po
@ -2,13 +2,26 @@
|
|||||||
# Copyright (C) 2009-2011 Timo Jyrinki
|
# Copyright (C) 2009-2011 Timo Jyrinki
|
||||||
# This file is distributed under the same license as the gnome-shell package.
|
# This file is distributed under the same license as the gnome-shell package.
|
||||||
# Timo Jyrinki <timo.jyrinki@iki.fi>, 2009-2011.
|
# Timo Jyrinki <timo.jyrinki@iki.fi>, 2009-2011.
|
||||||
|
# Marko Myllynen <myllynen@redhat.com>, 2011.
|
||||||
|
#
|
||||||
|
# IMPORTANT NOTICE!
|
||||||
|
#
|
||||||
|
# Some date / time strings are currently non-optimal. The optimal CLDR
|
||||||
|
# compliant versions are included as comments in the respective strings.
|
||||||
|
#
|
||||||
|
# CLDR: http://kotoistus.fi/suositukset/vahv_kalenterit_cldr1_4.htm
|
||||||
|
#
|
||||||
|
# They should be taken into use as soon as the related bugs are fixed:
|
||||||
|
#
|
||||||
|
# https://bugzilla.gnome.org/show_bug.cgi?id=647320
|
||||||
|
# https://bugzilla.gnome.org/show_bug.cgi?id=648678
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2011-04-06 12:55+0300\n"
|
"POT-Creation-Date: 2011-04-06 12:55+0300\n"
|
||||||
"PO-Revision-Date: 2011-04-06 12:55+0300\n"
|
"PO-Revision-Date: 2011-05-05 18:01+0300\n"
|
||||||
"Last-Translator: Timo Jyrinki <timo.jyrinki@iki.fi>\n"
|
"Last-Translator: Timo Jyrinki <timo.jyrinki@iki.fi>\n"
|
||||||
"Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\n"
|
"Language-Team: Finnish <gnome-fi-laatu@lists.sourceforge.net>\n"
|
||||||
"Language: fi\n"
|
"Language: fi\n"
|
||||||
@ -199,7 +212,7 @@ msgstr "%s on poistettu suosikeista."
|
|||||||
#: ../js/ui/calendar.js:66
|
#: ../js/ui/calendar.js:66
|
||||||
msgctxt "event list time"
|
msgctxt "event list time"
|
||||||
msgid "All Day"
|
msgid "All Day"
|
||||||
msgstr ""
|
msgstr "Koko päivä"
|
||||||
|
|
||||||
#. Translators: Shown in calendar event list, if 24h format
|
#. Translators: Shown in calendar event list, if 24h format
|
||||||
#: ../js/ui/calendar.js:71
|
#: ../js/ui/calendar.js:71
|
||||||
@ -309,19 +322,21 @@ msgstr "la"
|
|||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:704
|
#: ../js/ui/calendar.js:704
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr ""
|
msgstr "Ei merkintöjä"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:720 ../js/ui/telepathyClient.js:490
|
#: ../js/ui/calendar.js:720 ../js/ui/telepathyClient.js:490
|
||||||
|
#msgstr "%A, %-d. %Bta"
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr ""
|
msgstr "%A, %d. %Bta"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:723 ../js/ui/telepathyClient.js:493
|
#: ../js/ui/calendar.js:723 ../js/ui/telepathyClient.js:493
|
||||||
|
#msgstr "%A, %-d. %Bta %Y"
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr ""
|
msgstr "%A, %d. %Bta %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:733
|
#: ../js/ui/calendar.js:733
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
@ -329,15 +344,15 @@ msgstr "Tänään"
|
|||||||
|
|
||||||
#: ../js/ui/calendar.js:737
|
#: ../js/ui/calendar.js:737
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr ""
|
msgstr "Huomenna"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:746
|
#: ../js/ui/calendar.js:746
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr ""
|
msgstr "Tällä viikolla"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:754
|
#: ../js/ui/calendar.js:754
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr ""
|
msgstr "Ensi viikolla"
|
||||||
|
|
||||||
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1007
|
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1007
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
@ -354,49 +369,58 @@ msgstr "Avaa kalenteri"
|
|||||||
#. Translators: This is the time format with date used
|
#. Translators: This is the time format with date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/dateMenu.js:164
|
#: ../js/ui/dateMenu.js:164
|
||||||
|
#msgstr "%a %-d.%-m., %-H.%M.%S"
|
||||||
msgid "%a %b %e, %R:%S"
|
msgid "%a %b %e, %R:%S"
|
||||||
msgstr "%a %b %e., %h.%M.%S"
|
msgstr "%a %d.%m., %H.%M.%S"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:165
|
#: ../js/ui/dateMenu.js:165
|
||||||
|
#msgstr "%a %-d.%-m., %-H.%M"
|
||||||
msgid "%a %b %e, %R"
|
msgid "%a %b %e, %R"
|
||||||
msgstr "%a %b %e., %H.%M"
|
msgstr "%a %d.%m., %H.%M"
|
||||||
|
|
||||||
#. Translators: This is the time format without date used
|
#. Translators: This is the time format without date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/dateMenu.js:169
|
#: ../js/ui/dateMenu.js:169
|
||||||
|
#msgstr "%a %-H.%M.%S"
|
||||||
msgid "%a %R:%S"
|
msgid "%a %R:%S"
|
||||||
msgstr "%a %H.%M"
|
msgstr "%a %H.%M.%S"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:170
|
#: ../js/ui/dateMenu.js:170
|
||||||
|
#msgstr "%a %-H.%M"
|
||||||
msgid "%a %R"
|
msgid "%a %R"
|
||||||
msgstr "%a %H.%M"
|
msgstr "%a %H.%M"
|
||||||
|
|
||||||
#. Translators: This is a time format with date used
|
#. Translators: This is a time format with date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/dateMenu.js:177
|
#: ../js/ui/dateMenu.js:177
|
||||||
|
#msgstr "%a %-d.%-m., %-I.%M.%S %p"
|
||||||
msgid "%a %b %e, %l:%M:%S %p"
|
msgid "%a %b %e, %l:%M:%S %p"
|
||||||
msgstr "%a %b %e., %l.%M.%S %p"
|
msgstr "%a %d.%m., %I.%M.%S %p"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:178
|
#: ../js/ui/dateMenu.js:178
|
||||||
|
#msgstr "%a %-d.%-m., %-I.%M %p"
|
||||||
msgid "%a %b %e, %l:%M %p"
|
msgid "%a %b %e, %l:%M %p"
|
||||||
msgstr "%a %b %e.,.%l:%M %p"
|
msgstr "%a %d.%m., %I.%M %p"
|
||||||
|
|
||||||
#. Translators: This is a time format without date used
|
#. Translators: This is a time format without date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/dateMenu.js:182
|
#: ../js/ui/dateMenu.js:182
|
||||||
|
#msgstr "%a %-I.%M.%S %p"
|
||||||
msgid "%a %l:%M:%S %p"
|
msgid "%a %l:%M:%S %p"
|
||||||
msgstr "%a %l.%M.%S %p"
|
msgstr "%a %I.%M.%S %p"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:183
|
#: ../js/ui/dateMenu.js:183
|
||||||
|
#msgstr "%a %-I.%M %p"
|
||||||
msgid "%a %l:%M %p"
|
msgid "%a %l:%M %p"
|
||||||
msgstr "%a %l.%M %p"
|
msgstr "%a %I.%M %p"
|
||||||
|
|
||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/dateMenu.js:194
|
#: ../js/ui/dateMenu.js:194
|
||||||
|
#msgstr "%A, %-d. %Bta %Y"
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "+%Ana %d. %Bta, %Y"
|
msgstr "%A, %d. %Bta %Y"
|
||||||
|
|
||||||
#: ../js/ui/docDisplay.js:19
|
#: ../js/ui/docDisplay.js:19
|
||||||
msgid "RECENT ITEMS"
|
msgid "RECENT ITEMS"
|
||||||
|
309
po/ug.po
@ -1,19 +1,20 @@
|
|||||||
# Uyghur translation for gnome-shell.
|
# Uyghur translation for gnome-shell.
|
||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
# This file is distributed under the same license as the PACKAGE package.
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
# Gheyret Kenji<gheyret@yahoo.com>,2010.
|
# Gheyret Kenji<gheyret@yahoo.com>,2010.
|
||||||
# Sahran <sahran.ug@gmail.com>, 2010.
|
# Sahran <sahran.ug@gmail.com>, 2010.
|
||||||
# Zeper <zeper@msn.com>, 2010.
|
# Zeper <zeper@msn.com>, 2010.
|
||||||
# Bakhtiyar<bakhtiyar108@gmail.com>, 2011
|
# Bakhtiyar<bakhtiyar108@gmail.com>, 2011
|
||||||
# Oghlan Temkin <temkin119@gmail.com>,2011
|
# Oghlan Temkin <temkin119@gmail.com>,2011
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"POT-Creation-Date: 2011-03-24 08:03+0000\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"PO-Revision-Date: 2010-11-25 14:28+0600\n"
|
"POT-Creation-Date: 2011-05-02 05:27+0000\n"
|
||||||
"Last-Translator: Oghlan Temkin <temkin119@gmail.com>\n"
|
"PO-Revision-Date: 2011-04-27 11:38+0600\n"
|
||||||
|
"Last-Translator: Sahran <sahran.ug@gmail.com>\n"
|
||||||
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
|
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
@ -32,34 +33,41 @@ msgstr "كۆزنەك باشقۇرۇش ۋە پروگرامما ئىجرا قىل
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||||
"dialog."
|
"dialog."
|
||||||
msgstr "ئىچكى سازلاش ۋە كۆزىتىش قورالىنى زىيارەت قىلىشتا Alt-F2 ئىشلىتىشكە ئىجازەت."
|
msgstr ""
|
||||||
|
"ئىچكى سازلاش ۋە كۆزىتىش قورالىنى زىيارەت قىلىشتا Alt-F2 ئىشلىتىشكە ئىجازەت."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||||
msgstr "ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق كىرىشىگە قۇلايلىق"
|
msgstr ""
|
||||||
|
"ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق "
|
||||||
|
"كىرىشىگە قۇلايلىق"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||||
msgid "File extension used for storing the screencast"
|
msgid "File extension used for storing the screencast"
|
||||||
msgstr "ئېكران كەسمىسى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن ئاتى"
|
msgstr ""
|
||||||
|
"ئېكران كەسمىسى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن "
|
||||||
|
"ئاتى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||||
msgid "Framerate used for recording screencasts."
|
msgid "Framerate used for recording screencasts."
|
||||||
msgstr "ئېكران كەسمىسى (screencasts) خاتىرىلەشتە ئىشلىتىلىدىغان كاندۇك تېزلىكى."
|
msgstr ""
|
||||||
|
"ئېكران كەسمىسى (screencasts) خاتىرىلەشتە ئىشلىتىلىدىغان كاندۇك تېزلىكى."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||||
msgid ""
|
msgid ""
|
||||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||||
"should not be loaded."
|
"should not be loaded."
|
||||||
msgstr "GNOME Shell كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
|
msgstr ""
|
||||||
|
"GNOME Shell كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا يۈكلەنمەيدىغان "
|
||||||
|
"كېڭەيتىلمىلەر تىزىمىنى كۆرسىتىدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
msgstr "بۇيرۇق (Alt-F2) سۆزلەشكۈنىڭ تارىخى"
|
msgstr "بۇيرۇق (Alt-F2) سۆزلەشكۈنىڭ تارىخى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||||
#| msgid "History for command (Alt-F2) dialog"
|
|
||||||
msgid "History for the looking glass dialog"
|
msgid "History for the looking glass dialog"
|
||||||
msgstr ""
|
msgstr "looking glass سۆزلەشكۈنىڭ تارىخى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||||
msgid "If true, display date in the clock, in addition to time."
|
msgid "If true, display date in the clock, in addition to time."
|
||||||
@ -75,7 +83,7 @@ msgstr "ئەگەر راست(true) بولسا يىلنامىدىكى ISO ھەپت
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||||
msgid "List of desktop file IDs for favorite applications"
|
msgid "List of desktop file IDs for favorite applications"
|
||||||
msgstr "ئامراق پروگراممىلارنىڭ ئۈستەلئۈستى ھۆججەت ID تىزىملىكى"
|
msgstr "ئامراق پروگراممىلارنىڭ ئۈستەلئۈستى ھۆججەت ID تىزىمى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
@ -90,7 +98,18 @@ msgid ""
|
|||||||
"'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and "
|
"'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and "
|
||||||
"records to WEBM using the VP8 codec. %T is used as a placeholder for a guess "
|
"records to WEBM using the VP8 codec. %T is used as a placeholder for a guess "
|
||||||
"at the optimal thread count on the system."
|
"at the optimal thread count on the system."
|
||||||
msgstr "ئۈن ئېلىشنى كودلاشتا ئىشلىتىلىدىغان GStreamer ئاقما لىنىيىنى تەڭشەيدۇ. ئۇ gst-launch گرامماتىكىسىغا بوي سۇنىدۇ. بۇ ئاقما لىنىيىدە ئۇلانمىغان sink pad بولۇشى لازىم، خاتىرىلىنىدىغان سىن مۇشۇ جايدا خاتىرىلىنىدۇ. بۇ لىنىيىدە ئادەتتە يەنە بىر ئۇلانمىغان مەنبە pad بولىدۇ؛ بۇ pad چىقارغان ئۇچۇرلار ھۆججەتكە يېزىلىدۇ. ئەمما ئاقما لىنىيە ئۆزىنىڭ چىقىرىشىنى بىر تەرەپ قىلالايدۇ، بۇنداق بولغاندا shout2send ئارقىلىق ياكى شۇنىڭغا ئوخشاش ئۇسۇلدا چىقىرىشنى icecast مۇلازىمېتىرىغا يوللايدۇ. ئاقما لىنىيە تەڭشەلمىگەن ياكى بوش قىممەتكە تەڭشەلگەندە كۆڭۈلدىكى ئاقما لىنىيە قوزغىتىلىدۇ. ئۇنىڭ نۆۋەتتىكى قىممىتى 'videorate ! vp8enc سۈپەت=10 سۈرەت=2 سىزىقلار=%T ! قاتار! webmmux' ۋە WEBM گە خاتىرىلەنگەنلەر VP8 كودىنى ئىشلىتىدۇ. T% بولسا سىستېمىنىڭ ئەڭ ياخشى سىزىق ئېلىپبەسىنى ھېسابلايدىغان ئورۇن بەلگىسى"
|
msgstr ""
|
||||||
|
"ئۈن ئېلىشنى كودلاشتا ئىشلىتىلىدىغان GStreamer ئاقما لىنىيىنى تەڭشەيدۇ. ئۇ "
|
||||||
|
"gst-launch گرامماتىكىسىغا بوي سۇنىدۇ. بۇ ئاقما لىنىيىدە ئۇلانمىغان sink pad "
|
||||||
|
"بولۇشى لازىم، خاتىرىلىنىدىغان سىن مۇشۇ جايدا خاتىرىلىنىدۇ. بۇ لىنىيىدە "
|
||||||
|
"ئادەتتە يەنە بىر ئۇلانمىغان مەنبە pad بولىدۇ؛ بۇ pad چىقارغان ئۇچۇرلار "
|
||||||
|
"ھۆججەتكە يېزىلىدۇ. ئەمما ئاقما لىنىيە ئۆزىنىڭ چىقىرىشىنى بىر تەرەپ "
|
||||||
|
"قىلالايدۇ، بۇنداق بولغاندا shout2send ئارقىلىق ياكى شۇنىڭغا ئوخشاش ئۇسۇلدا "
|
||||||
|
"چىقىرىشنى icecast مۇلازىمېتىرىغا يوللايدۇ. ئاقما لىنىيە تەڭشەلمىگەن ياكى بوش "
|
||||||
|
"قىممەتكە تەڭشەلگەندە كۆڭۈلدىكى ئاقما لىنىيە قوزغىتىلىدۇ. ئۇنىڭ نۆۋەتتىكى "
|
||||||
|
"قىممىتى 'videorate ! vp8enc سۈپەت=10 سۈرەت=2 سىزىقلار=%T ! قاتار! webmmux' "
|
||||||
|
"ۋە WEBM گە خاتىرىلەنگەنلەر VP8 كودىنى ئىشلىتىدۇ. T% بولسا سىستېمىنىڭ ئەڭ "
|
||||||
|
"ياخشى سىزىق ئېلىپبەسىنى ھېسابلايدىغان ئورۇن بەلگىسى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||||
msgid "Show date in clock"
|
msgid "Show date in clock"
|
||||||
@ -115,13 +134,18 @@ msgid ""
|
|||||||
"The filename for recorded screencasts will be a unique filename based on the "
|
"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 "
|
"current date, and use this extension. It should be changed when recording to "
|
||||||
"a different container format."
|
"a different container format."
|
||||||
msgstr "خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا خاتىرىلەيدۇ."
|
msgstr ""
|
||||||
|
"خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ "
|
||||||
|
"بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا "
|
||||||
|
"خاتىرىلەيدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||||
msgid ""
|
msgid ""
|
||||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||||
"screencast recorder in frames-per-second."
|
"screencast recorder in frames-per-second."
|
||||||
msgstr "GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)."
|
msgstr ""
|
||||||
|
"GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى "
|
||||||
|
"كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||||
msgid "The gstreamer pipeline used to encode the screencast"
|
msgid "The gstreamer pipeline used to encode the screencast"
|
||||||
@ -133,7 +157,11 @@ msgid ""
|
|||||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
"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 "
|
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||||
"remove already saved data."
|
"remove already saved data."
|
||||||
msgstr "چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
|
msgstr ""
|
||||||
|
"چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار"
|
||||||
|
"(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي "
|
||||||
|
"ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق "
|
||||||
|
"قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||||
msgid "Uuids of extensions to disable"
|
msgid "Uuids of extensions to disable"
|
||||||
@ -163,27 +191,27 @@ msgid "Execution of '%s' failed:"
|
|||||||
msgstr "«%s» ئىجرا قىلىش مەغلۇپ بولدى:"
|
msgstr "«%s» ئىجرا قىلىش مەغلۇپ بولدى:"
|
||||||
|
|
||||||
#. Translators: Filter to display all applications
|
#. Translators: Filter to display all applications
|
||||||
#: ../js/ui/appDisplay.js:230
|
#: ../js/ui/appDisplay.js:260
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "ھەممىسى"
|
msgstr "ھەممىسى"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:328
|
#: ../js/ui/appDisplay.js:359
|
||||||
msgid "APPLICATIONS"
|
msgid "APPLICATIONS"
|
||||||
msgstr "پروگراممىلار"
|
msgstr "پروگراممىلار"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:354
|
#: ../js/ui/appDisplay.js:385
|
||||||
msgid "SETTINGS"
|
msgid "SETTINGS"
|
||||||
msgstr ""
|
msgstr "تەڭشەكلەر"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:625
|
#: ../js/ui/appDisplay.js:656
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "يېڭى كۆزنەك"
|
msgstr "يېڭى كۆزنەك"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:628
|
#: ../js/ui/appDisplay.js:659
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "يىغقۇچتىن چىقىرىۋەت"
|
msgstr "يىغقۇچتىن چىقىرىۋەت"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:629
|
#: ../js/ui/appDisplay.js:660
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "يىغقۇچقا قوش"
|
msgstr "يىغقۇچقا قوش"
|
||||||
|
|
||||||
@ -316,13 +344,13 @@ msgid "Nothing Scheduled"
|
|||||||
msgstr "ھېچنېمە پىلانلانمىدى"
|
msgstr "ھېچنېمە پىلانلانمىدى"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:720
|
#: ../js/ui/calendar.js:720 ../js/ui/telepathyClient.js:492
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A، %B %d"
|
msgstr "%A، %B %d"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:723
|
#: ../js/ui/calendar.js:723 ../js/ui/telepathyClient.js:495
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A، %B %d، %Y"
|
msgstr "%A، %B %d، %Y"
|
||||||
@ -343,7 +371,7 @@ msgstr "بۇ ھەپتە"
|
|||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "كېيىنكى ھەپتە"
|
msgstr "كېيىنكى ھەپتە"
|
||||||
|
|
||||||
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:994
|
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1037
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "چىقىرىۋەت"
|
msgstr "چىقىرىۋەت"
|
||||||
|
|
||||||
@ -393,7 +421,7 @@ msgstr "%a %l:%M:%S %p"
|
|||||||
|
|
||||||
#: ../js/ui/dateMenu.js:183
|
#: ../js/ui/dateMenu.js:183
|
||||||
msgid "%a %l:%M %p"
|
msgid "%a %l:%M %p"
|
||||||
msgstr "%p%l:%M (%a)"
|
msgstr "%a %l:%M"
|
||||||
|
|
||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
@ -417,7 +445,9 @@ msgstr "تىزىمدىن چىق"
|
|||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:65
|
#: ../js/ui/endSessionDialog.js:65
|
||||||
msgid "Click Log Out to quit these applications and log out of the system."
|
msgid "Click Log Out to quit these applications and log out of the system."
|
||||||
msgstr "تىزىمدىن چىقىش (Log Out) نى بېسىپ پروگراممىدىن چېكىنىش ۋە سىستېما تىزىمىدىن چىقىش."
|
msgstr ""
|
||||||
|
"تىزىمدىن چىقىش (Log Out) نى بېسىپ پروگراممىدىن چېكىنىش ۋە سىستېما تىزىمىدىن "
|
||||||
|
"چىقىش."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:66
|
#: ../js/ui/endSessionDialog.js:66
|
||||||
#, c-format
|
#, c-format
|
||||||
@ -435,23 +465,21 @@ msgstr "سىستېما تىزىمدىن چىقىۋاتىدۇ"
|
|||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
|
#: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr ""
|
msgstr "توكنى ئۈز"
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:76
|
#: ../js/ui/endSessionDialog.js:76
|
||||||
#| msgid "Click Log Out to quit these applications and log out of the system."
|
|
||||||
msgid "Click Power Off to quit these applications and power off the system."
|
msgid "Click Power Off to quit these applications and power off the system."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"تۈكنى ئۈز چېكىلسە قوللىنىشچان پروگراممىلاردىن چېكىنىپ سىستېمىنى تاقايدۇ."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:77
|
#: ../js/ui/endSessionDialog.js:77
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid "The system will restart automatically in %d seconds."
|
|
||||||
msgid "The system will power off automatically in %d seconds."
|
msgid "The system will power off automatically in %d seconds."
|
||||||
msgstr ""
|
msgstr "بۇ سىستېما %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن تاقىلىدۇ."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:78
|
#: ../js/ui/endSessionDialog.js:78
|
||||||
#| msgid "Logging out of the system."
|
|
||||||
msgid "Powering off the system."
|
msgid "Powering off the system."
|
||||||
msgstr ""
|
msgstr "سىستېمىنى تاقاۋاتىدۇ."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
|
#: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
|
||||||
#: ../js/ui/endSessionDialog.js:93
|
#: ../js/ui/endSessionDialog.js:93
|
||||||
@ -460,7 +488,9 @@ msgstr "قايتا قوزغات"
|
|||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:89
|
#: ../js/ui/endSessionDialog.js:89
|
||||||
msgid "Click Restart to quit these applications and restart the system."
|
msgid "Click Restart to quit these applications and restart the system."
|
||||||
msgstr "قايتا قوزغىتىش (restart) نى بېسىپ پروگراممىدىن چېكىنىش ۋە سىستېمىنى قايتا قوزغىتىش."
|
msgstr ""
|
||||||
|
"قايتا قوزغات (restart) چېكىلسە پروگراممىدىن چېكىنىپ ۋە سىستېمىنى قايتا "
|
||||||
|
"قوزغىتىدۇ."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:90
|
#: ../js/ui/endSessionDialog.js:90
|
||||||
#, c-format
|
#, c-format
|
||||||
@ -471,7 +501,7 @@ msgstr "بۇ سىستېما %d سېكۇنتتىن كېيىن ئۆزلۈكىدى
|
|||||||
msgid "Restarting the system."
|
msgid "Restarting the system."
|
||||||
msgstr "سىستېما قايتا قوزغىلىۋاتىدۇ."
|
msgstr "سىستېما قايتا قوزغىلىۋاتىدۇ."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
|
#: ../js/ui/endSessionDialog.js:413 ../js/ui/polkitAuthenticationAgent.js:172
|
||||||
#: ../js/ui/status/bluetooth.js:466
|
#: ../js/ui/status/bluetooth.js:466
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "ۋاز كەچ"
|
msgstr "ۋاز كەچ"
|
||||||
@ -506,11 +536,11 @@ msgstr "مەنبەنى كۆرسەت"
|
|||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "توربەت"
|
msgstr "توربەت"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:987
|
#: ../js/ui/messageTray.js:1030
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr "ئاچ"
|
msgstr "ئاچ"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2145
|
#: ../js/ui/messageTray.js:2194
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "سىستېما ئۇچۇرى"
|
msgstr "سىستېما ئۇچۇرى"
|
||||||
|
|
||||||
@ -530,23 +560,23 @@ msgstr "پروگراممىلار"
|
|||||||
#. the left of the overview
|
#. the left of the overview
|
||||||
#: ../js/ui/overview.js:205
|
#: ../js/ui/overview.js:205
|
||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr ""
|
msgstr "سىزىقچە"
|
||||||
|
|
||||||
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
||||||
#: ../js/ui/panel.js:515
|
#: ../js/ui/panel.js:533
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Quit %s"
|
msgid "Quit %s"
|
||||||
msgstr "%s چېكىن"
|
msgstr "%s چېكىن"
|
||||||
|
|
||||||
#. Button on the left side of the panel.
|
#. 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".
|
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:878
|
#: ../js/ui/panel.js:911
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "پائالىيەتلەر"
|
msgstr "پائالىيەتلەر"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:979
|
#: ../js/ui/panel.js:1012
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr ""
|
msgstr "ئۈستى بالداق"
|
||||||
|
|
||||||
#: ../js/ui/placeDisplay.js:122
|
#: ../js/ui/placeDisplay.js:122
|
||||||
#, c-format
|
#, c-format
|
||||||
@ -575,13 +605,17 @@ msgstr "باشقۇرغۇچى"
|
|||||||
|
|
||||||
#: ../js/ui/polkitAuthenticationAgent.js:176
|
#: ../js/ui/polkitAuthenticationAgent.js:176
|
||||||
msgid "Authenticate"
|
msgid "Authenticate"
|
||||||
msgstr ""
|
msgstr "سالاھىيەت دەلىللەش"
|
||||||
|
|
||||||
#: ../js/ui/polkitAuthenticationAgent.js:260
|
#. Translators: "that didn't work" refers to the fact that the
|
||||||
|
#. * requested authentication was not gained; this can happen
|
||||||
|
#. * because of an authentication error (like invalid password),
|
||||||
|
#. * for instance.
|
||||||
|
#: ../js/ui/polkitAuthenticationAgent.js:264
|
||||||
msgid "Sorry, that didn't work. Please try again."
|
msgid "Sorry, that didn't work. Please try again."
|
||||||
msgstr ""
|
msgstr "كەچۈرۈڭ، خىزمەت قىلالمايدۇ. قايتا سىناڭ."
|
||||||
|
|
||||||
#: ../js/ui/polkitAuthenticationAgent.js:272
|
#: ../js/ui/polkitAuthenticationAgent.js:276
|
||||||
msgid "Password:"
|
msgid "Password:"
|
||||||
msgstr "ئىم:"
|
msgstr "ئىم:"
|
||||||
|
|
||||||
@ -598,17 +632,18 @@ msgstr "toggle-switch-us"
|
|||||||
msgid "Please enter a command:"
|
msgid "Please enter a command:"
|
||||||
msgstr "بۇيرۇق كىرگۈزۈڭ:"
|
msgstr "بۇيرۇق كىرگۈزۈڭ:"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:310
|
#: ../js/ui/searchDisplay.js:311
|
||||||
msgid "Searching..."
|
msgid "Searching..."
|
||||||
msgstr "ئىزدەۋاتىدۇ..."
|
msgstr "ئىزدەۋاتىدۇ…"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:324
|
#: ../js/ui/searchDisplay.js:325
|
||||||
msgid "No matching results."
|
msgid "No matching results."
|
||||||
msgstr "ماس كېلىدىغان نەتىجە يوق."
|
msgstr "ماس كېلىدىغان نەتىجە يوق."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:228
|
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:163
|
||||||
|
#: ../js/ui/statusMenu.js:228
|
||||||
msgid "Power Off..."
|
msgid "Power Off..."
|
||||||
msgstr ""
|
msgstr "توكنى ئۈز…"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
|
#: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
@ -658,7 +693,7 @@ msgstr "كۆرۈنمە ئاگاھلاندۇرۇش"
|
|||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:80
|
#: ../js/ui/status/accessibility.js:80
|
||||||
msgid "Sticky Keys"
|
msgid "Sticky Keys"
|
||||||
msgstr "Sticky Keys"
|
msgstr "چاپلاش كۇنۇپكىسى"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:83
|
#: ../js/ui/status/accessibility.js:83
|
||||||
msgid "Slow Keys"
|
msgid "Slow Keys"
|
||||||
@ -666,11 +701,11 @@ msgstr "Slow Keys"
|
|||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:86
|
#: ../js/ui/status/accessibility.js:86
|
||||||
msgid "Bounce Keys"
|
msgid "Bounce Keys"
|
||||||
msgstr "Bounce Keys"
|
msgstr "قاڭقىش كۇنۇپكىسى"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:89
|
#: ../js/ui/status/accessibility.js:89
|
||||||
msgid "Mouse Keys"
|
msgid "Mouse Keys"
|
||||||
msgstr "Mouse Keys"
|
msgstr "چاشقىنەك كۇنۇپكا"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:93
|
#: ../js/ui/status/accessibility.js:93
|
||||||
msgid "Universal Access Settings"
|
msgid "Universal Access Settings"
|
||||||
@ -774,7 +809,8 @@ msgstr "ئۈسكۈنە'%s' كومپيۇتېر بىلەن جۈپلەنمەكچى"
|
|||||||
#: ../js/ui/status/bluetooth.js:415
|
#: ../js/ui/status/bluetooth.js:415
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Please confirm whether the PIN '%s' matches the one on the device."
|
msgid "Please confirm whether the PIN '%s' matches the one on the device."
|
||||||
msgstr "سىز كىرگۈزگەن PIN '%s' نومۇرى ئۈسكىنىدىكىگە ئوخشايدىغانلىقىنى جەزملەڭ."
|
msgstr ""
|
||||||
|
"سىز كىرگۈزگەن PIN '%s' نومۇرى ئۈسكىنىدىكىگە ئوخشايدىغانلىقىنى جەزملەڭ."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:417
|
#: ../js/ui/status/bluetooth.js:417
|
||||||
msgid "Matches"
|
msgid "Matches"
|
||||||
@ -799,149 +835,145 @@ msgstr "جەزملە"
|
|||||||
|
|
||||||
#: ../js/ui/status/keyboard.js:73
|
#: ../js/ui/status/keyboard.js:73
|
||||||
msgid "Show Keyboard Layout..."
|
msgid "Show Keyboard Layout..."
|
||||||
msgstr ""
|
msgstr "كۇنۇپكا تاختا ئورۇنلاشتۇرۇلۇشىنى كۆرسەت…"
|
||||||
|
|
||||||
#: ../js/ui/status/keyboard.js:76
|
#: ../js/ui/status/keyboard.js:76
|
||||||
msgid "Localization Settings"
|
msgid "Localization Settings"
|
||||||
msgstr "يەرلىكلەشتۈرۈش تەڭشىكى"
|
msgstr "يەرلىكلەشتۈرۈش تەڭشىكى"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:102 ../js/ui/status/network.js:1393
|
#: ../js/ui/status/network.js:109 ../js/ui/status/network.js:1501
|
||||||
#| msgid "Unknown"
|
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr ""
|
msgstr "<يوچۇن>"
|
||||||
|
|
||||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||||
#: ../js/ui/status/network.js:295
|
#: ../js/ui/status/network.js:326
|
||||||
#| msgid "Disabled"
|
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr ""
|
msgstr "چەكلەنگەن"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:476
|
#: ../js/ui/status/network.js:524
|
||||||
#| msgid "Connection"
|
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr ""
|
msgstr "باغلىنىۋاتىدۇ…"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:479
|
#: ../js/ui/status/network.js:527
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr ""
|
msgstr "سالاھىيەت دەلىللەش زۆرۈر"
|
||||||
|
|
||||||
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
|
#. module, which is missing
|
||||||
|
#: ../js/ui/status/network.js:537
|
||||||
|
msgid "firmware missing"
|
||||||
|
msgstr "مۇقىم دېتال كەم"
|
||||||
|
|
||||||
#. Translators: this is for wired network devices that are physically disconnected
|
#. Translators: this is for wired network devices that are physically disconnected
|
||||||
#: ../js/ui/status/network.js:485
|
#: ../js/ui/status/network.js:544
|
||||||
msgid "cable unplugged"
|
msgid "cable unplugged"
|
||||||
msgstr ""
|
msgstr "كابېل چېتىلمىدى"
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage
|
#. is disabled by rfkill, or it has no coverage
|
||||||
#: ../js/ui/status/network.js:489
|
#: ../js/ui/status/network.js:549
|
||||||
#| msgid "Available"
|
|
||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr ""
|
msgstr "ئىشلەتكىلى بولمايدۇ"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:491
|
#: ../js/ui/status/network.js:551
|
||||||
#| msgid "Connection"
|
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr ""
|
msgstr "باغلىنىش مەغلۇپ بولدى"
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:571 ../js/ui/status/network.js:1341
|
#: ../js/ui/status/network.js:631 ../js/ui/status/network.js:1449
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr ""
|
msgstr "باغلاندى (شەخسىي)"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:636
|
#: ../js/ui/status/network.js:716
|
||||||
msgid "Auto Ethernet"
|
msgid "Auto Ethernet"
|
||||||
msgstr "ئاپتوماتىك Ethernet"
|
msgstr "ئاپتوماتىك Ethernet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:697
|
#: ../js/ui/status/network.js:791
|
||||||
msgid "Auto broadband"
|
msgid "Auto broadband"
|
||||||
msgstr ""
|
msgstr "ئاپتوماتىك كۆچمە كەڭ بەلۋاغ"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:700
|
#: ../js/ui/status/network.js:794
|
||||||
msgid "Auto dial-up"
|
msgid "Auto dial-up"
|
||||||
msgstr ""
|
msgstr "ئاپتوماتىك نومۇر بۇرا"
|
||||||
|
|
||||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||||
#: ../js/ui/status/network.js:843 ../js/ui/status/network.js:1353
|
#: ../js/ui/status/network.js:940 ../js/ui/status/network.js:1461
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid "Quit %s"
|
|
||||||
msgid "Auto %s"
|
msgid "Auto %s"
|
||||||
msgstr ""
|
msgstr "ئاپتوماتىك %s"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:845
|
#: ../js/ui/status/network.js:942
|
||||||
#| msgid "Bluetooth"
|
|
||||||
msgid "Auto bluetooth"
|
msgid "Auto bluetooth"
|
||||||
msgstr ""
|
msgstr "ئاپتوماتىك كۆكچىش"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1355
|
#: ../js/ui/status/network.js:1463
|
||||||
msgid "Auto wireless"
|
msgid "Auto wireless"
|
||||||
msgstr ""
|
msgstr "ئاپتوماتىك سىمسىز تور"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1413
|
#: ../js/ui/status/network.js:1521
|
||||||
msgid "More..."
|
msgid "More..."
|
||||||
msgstr "تېخىمۇ كۆپ..."
|
msgstr "تېخىمۇ كۆپ…"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1436
|
#: ../js/ui/status/network.js:1544
|
||||||
msgid "Enable networking"
|
msgid "Enable networking"
|
||||||
msgstr ""
|
msgstr "تور ئۇلاشنى قوزغات"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1448
|
#: ../js/ui/status/network.js:1556
|
||||||
msgid "Wired"
|
msgid "Wired"
|
||||||
msgstr "سىملىق"
|
msgstr "سىملىق"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1459
|
#: ../js/ui/status/network.js:1567
|
||||||
msgid "Wireless"
|
msgid "Wireless"
|
||||||
msgstr "سىمسىز"
|
msgstr "سىمسىز"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1469
|
#: ../js/ui/status/network.js:1577
|
||||||
msgid "Mobile broadband"
|
msgid "Mobile broadband"
|
||||||
msgstr "كۆچمە كەڭ بەلۋاغ"
|
msgstr "كۆچمە كەڭ بەلۋاغ"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1479
|
#: ../js/ui/status/network.js:1587
|
||||||
#| msgid "Connection"
|
|
||||||
msgid "VPN Connections"
|
msgid "VPN Connections"
|
||||||
msgstr ""
|
msgstr "VPN باغلىنىشلىرى"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1488
|
#: ../js/ui/status/network.js:1599
|
||||||
#| msgid "Power Settings"
|
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "تور تەڭشەكلىرى"
|
msgstr "تور تەڭشەكلىرى"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1783
|
#: ../js/ui/status/network.js:1893
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to mobile broadband connection '%s'"
|
msgid "You're now connected to mobile broadband connection '%s'"
|
||||||
msgstr ""
|
msgstr "ھازىر كۆچمە كەڭ بەلۋاغ '%s' غا باغلاندىڭىز"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1787
|
#: ../js/ui/status/network.js:1897
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to wireless network '%s'"
|
msgid "You're now connected to wireless network '%s'"
|
||||||
msgstr ""
|
msgstr "ھازىر سىمسىز تور '%s' غا باغلاندىڭىز"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1791
|
#: ../js/ui/status/network.js:1901
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to wired network '%s'"
|
msgid "You're now connected to wired network '%s'"
|
||||||
msgstr ""
|
msgstr "ھازىر سىملىق تور '%s' غا باغلاندىڭىز"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1795
|
#: ../js/ui/status/network.js:1905
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to VPN network '%s'"
|
msgid "You're now connected to VPN network '%s'"
|
||||||
msgstr ""
|
msgstr "ھازىر VPN تور '%s' غا باغلاندىڭىز"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1800
|
#: ../js/ui/status/network.js:1910
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to '%s'"
|
msgid "You're now connected to '%s'"
|
||||||
msgstr ""
|
msgstr "ھازىر '%s' غا باغلاندىڭىز"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1808
|
#: ../js/ui/status/network.js:1918
|
||||||
#| msgid "Connection"
|
|
||||||
msgid "Connection established"
|
msgid "Connection established"
|
||||||
msgstr ""
|
msgstr "باغلىنىش تۇرغۇزۇلدى"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1930
|
#: ../js/ui/status/network.js:2044
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr ""
|
msgstr "تورغا باغلىنىش چەكلەنگەن"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2055
|
#: ../js/ui/status/network.js:2169
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "تور باشقۇرغۇچ"
|
msgstr "تور باشقۇرغۇچ"
|
||||||
|
|
||||||
@ -953,7 +985,7 @@ msgstr "توك مەنبە تەڭشىكى"
|
|||||||
#. to estimate battery life
|
#. to estimate battery life
|
||||||
#: ../js/ui/status/power.js:111
|
#: ../js/ui/status/power.js:111
|
||||||
msgid "Estimating..."
|
msgid "Estimating..."
|
||||||
msgstr ""
|
msgstr "مۆلچەرلەۋاتىدۇ…"
|
||||||
|
|
||||||
#: ../js/ui/status/power.js:118
|
#: ../js/ui/status/power.js:118
|
||||||
#, c-format
|
#, c-format
|
||||||
@ -1039,22 +1071,22 @@ msgstr "دىسكا"
|
|||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "مىكروفون"
|
msgstr "مىكروفون"
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:332
|
#: ../js/ui/telepathyClient.js:335
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is online."
|
msgid "%s is online."
|
||||||
msgstr "%s توردا."
|
msgstr "%s توردا."
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:337
|
#: ../js/ui/telepathyClient.js:340
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is offline."
|
msgid "%s is offline."
|
||||||
msgstr "%s توردا يوق."
|
msgstr "%s توردا يوق."
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:340
|
#: ../js/ui/telepathyClient.js:343
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is away."
|
msgid "%s is away."
|
||||||
msgstr "%s يوق."
|
msgstr "%s يوق."
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:343
|
#: ../js/ui/telepathyClient.js:346
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is busy."
|
msgid "%s is busy."
|
||||||
msgstr "%s ئالدىراش."
|
msgstr "%s ئالدىراش."
|
||||||
@ -1062,7 +1094,7 @@ msgstr "%s ئالدىراش."
|
|||||||
#. Translators: this is a time format string followed by a date.
|
#. Translators: this is a time format string followed by a date.
|
||||||
#. If applicable, replace %X with a strftime format valid for your
|
#. If applicable, replace %X with a strftime format valid for your
|
||||||
#. locale, without seconds.
|
#. locale, without seconds.
|
||||||
#: ../js/ui/telepathyClient.js:474
|
#: ../js/ui/telepathyClient.js:484
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "Sent at %X on %A"
|
msgid "Sent at %X on %A"
|
||||||
msgstr "سائەت %X %A غا ئەۋەتتى"
|
msgstr "سائەت %X %A غا ئەۋەتتى"
|
||||||
@ -1073,7 +1105,7 @@ msgstr "سائەت %X %A غا ئەۋەتتى"
|
|||||||
#. characters.
|
#. characters.
|
||||||
#: ../js/ui/viewSelector.js:122
|
#: ../js/ui/viewSelector.js:122
|
||||||
msgid "Type to search..."
|
msgid "Type to search..."
|
||||||
msgstr ""
|
msgstr "كىرگۈزسە ئىزدە…"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
|
#: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
@ -1109,15 +1141,14 @@ msgstr[0] "%u كىرگۈزۈلمە"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "سىستېما ئاۋازى"
|
msgstr "سىستېما ئاۋازى"
|
||||||
|
|
||||||
#: ../src/main.c:446
|
#: ../src/main.c:445
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "نەشرىنى باس"
|
msgstr "نەشرىنى باس"
|
||||||
|
|
||||||
#: ../src/shell-app.c:454
|
#: ../src/shell-app.c:454
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid "Failed to unmount '%s'"
|
|
||||||
msgid "Failed to launch '%s'"
|
msgid "Failed to launch '%s'"
|
||||||
msgstr ""
|
msgstr "'%s' نى قوزغىتالمىدى"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1395
|
#: ../src/shell-global.c:1395
|
||||||
msgid "Less than a minute ago"
|
msgid "Less than a minute ago"
|
||||||
@ -1157,7 +1188,7 @@ msgstr "كۆڭۈلدىكى"
|
|||||||
|
|
||||||
#: ../src/shell-polkit-authentication-agent.c:334
|
#: ../src/shell-polkit-authentication-agent.c:334
|
||||||
msgid "Authentication dialog was dismissed by the user"
|
msgid "Authentication dialog was dismissed by the user"
|
||||||
msgstr ""
|
msgstr "سالاھىيەت دەلىللەش سۆزلەشكۈنى ئىشلەتكۈچى رەت قىلدى"
|
||||||
|
|
||||||
#: ../src/shell-util.c:89
|
#: ../src/shell-util.c:89
|
||||||
msgid "Home Folder"
|
msgid "Home Folder"
|
||||||
|
234
po/uk.po
@ -7,8 +7,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell master\n"
|
"Project-Id-Version: gnome-shell master\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2011-03-27 18:25+0300\n"
|
"POT-Creation-Date: 2011-05-02 02:44+0300\n"
|
||||||
"PO-Revision-Date: 2011-03-27 18:27+0300\n"
|
"PO-Revision-Date: 2011-05-02 02:46+0300\n"
|
||||||
"Last-Translator: Korostil Daniel <ted.korostiled@gmail.com>\n"
|
"Last-Translator: Korostil Daniel <ted.korostiled@gmail.com>\n"
|
||||||
"Language-Team: translation@linux.org.ua\n"
|
"Language-Team: translation@linux.org.ua\n"
|
||||||
"Language: uk\n"
|
"Language: uk\n"
|
||||||
@ -98,7 +98,7 @@ msgstr ""
|
|||||||
"Вказує канал даних GStreamer для кодування запису. Звідси відповідний "
|
"Вказує канал даних GStreamer для кодування запису. Звідси відповідний "
|
||||||
"синтаксис для gst-launch. Канал даних повинен мати нез'єднаний приймальний "
|
"синтаксис для gst-launch. Канал даних повинен мати нез'єднаний приймальний "
|
||||||
"буфер, де відео записано. Зазвичай воно має нез'єднане джерело буфера; вивід "
|
"буфер, де відео записано. Зазвичай воно має нез'єднане джерело буфера; вивід "
|
||||||
"з цього буфера буде записано в вихідний файл. Однак канал даних також "
|
"з цього буфера буде записано в вихідний файл. Однак канал даних також "
|
||||||
"відповідати за власний вивід — це може бути використано для відправлення "
|
"відповідати за власний вивід — це може бути використано для відправлення "
|
||||||
"виводу до сервера через протокол shout2send чи будь-який інший. Коли не "
|
"виводу до сервера через протокол shout2send чи будь-який інший. Коли не "
|
||||||
"вказано або вказано порожнє значення, буде використано типовий канал даних. "
|
"вказано або вказано порожнє значення, буде використано типовий канал даних. "
|
||||||
@ -189,27 +189,27 @@ msgid "Execution of '%s' failed:"
|
|||||||
msgstr "Не вдалось виконати «%s»:"
|
msgstr "Не вдалось виконати «%s»:"
|
||||||
|
|
||||||
#. Translators: Filter to display all applications
|
#. Translators: Filter to display all applications
|
||||||
#: ../js/ui/appDisplay.js:230
|
#: ../js/ui/appDisplay.js:260
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Всі"
|
msgstr "Всі"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:328
|
#: ../js/ui/appDisplay.js:359
|
||||||
msgid "APPLICATIONS"
|
msgid "APPLICATIONS"
|
||||||
msgstr "ПРОГРАМИ"
|
msgstr "ПРОГРАМИ"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:354
|
#: ../js/ui/appDisplay.js:385
|
||||||
msgid "SETTINGS"
|
msgid "SETTINGS"
|
||||||
msgstr "ПАРАМЕТРИ"
|
msgstr "ПАРАМЕТРИ"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:625
|
#: ../js/ui/appDisplay.js:658
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Нове вікно"
|
msgstr "Нове вікно"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:628
|
#: ../js/ui/appDisplay.js:661
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Вилучити з улюбленого"
|
msgstr "Вилучити з улюбленого"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:629
|
#: ../js/ui/appDisplay.js:662
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Додати до улюбленого"
|
msgstr "Додати до улюбленого"
|
||||||
|
|
||||||
@ -342,13 +342,13 @@ msgid "Nothing Scheduled"
|
|||||||
msgstr "Нічого не заплановано"
|
msgstr "Нічого не заплановано"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:720
|
#: ../js/ui/calendar.js:720 ../js/ui/telepathyClient.js:487
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %B %d"
|
msgstr "%A, %B %d"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:723
|
#: ../js/ui/calendar.js:723 ../js/ui/telepathyClient.js:490
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %B %d, %Y"
|
msgstr "%A, %B %d, %Y"
|
||||||
@ -369,7 +369,7 @@ msgstr "Цей тиждень"
|
|||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Наступний тиждень"
|
msgstr "Наступний тиждень"
|
||||||
|
|
||||||
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1000
|
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1037
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Вилучити"
|
msgstr "Вилучити"
|
||||||
|
|
||||||
@ -495,8 +495,8 @@ msgstr "Система автоматично перезапуститься ч
|
|||||||
msgid "Restarting the system."
|
msgid "Restarting the system."
|
||||||
msgstr "Перезапуск системи."
|
msgstr "Перезапуск системи."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:415 ../js/ui/polkitAuthenticationAgent.js:172
|
#: ../js/ui/endSessionDialog.js:413 ../js/ui/polkitAuthenticationAgent.js:172
|
||||||
#: ../js/ui/status/bluetooth.js:466
|
#: ../js/ui/status/bluetooth.js:491
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Скасувати"
|
msgstr "Скасувати"
|
||||||
|
|
||||||
@ -530,11 +530,11 @@ msgstr "Переглянути джерело"
|
|||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "Веб-сторінка"
|
msgstr "Веб-сторінка"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:993
|
#: ../js/ui/messageTray.js:1030
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr "Відкрити"
|
msgstr "Відкрити"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2151
|
#: ../js/ui/messageTray.js:2194
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Інформація про систему"
|
msgstr "Інформація про систему"
|
||||||
|
|
||||||
@ -557,18 +557,18 @@ msgid "Dash"
|
|||||||
msgstr "Риска"
|
msgstr "Риска"
|
||||||
|
|
||||||
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
||||||
#: ../js/ui/panel.js:515
|
#: ../js/ui/panel.js:533
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Quit %s"
|
msgid "Quit %s"
|
||||||
msgstr "Вийти з %s"
|
msgstr "Вийти з %s"
|
||||||
|
|
||||||
#. Button on the left side of the panel.
|
#. 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".
|
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:878
|
#: ../js/ui/panel.js:913
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Діяльність"
|
msgstr "Діяльність"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:979
|
#: ../js/ui/panel.js:1015
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Верхня панель"
|
msgstr "Верхня панель"
|
||||||
|
|
||||||
@ -626,11 +626,11 @@ msgstr "toggle-switch-intl"
|
|||||||
msgid "Please enter a command:"
|
msgid "Please enter a command:"
|
||||||
msgstr "Будь ласка, введіть команду:"
|
msgstr "Будь ласка, введіть команду:"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:310
|
#: ../js/ui/searchDisplay.js:313
|
||||||
msgid "Searching..."
|
msgid "Searching..."
|
||||||
msgstr "Пошук…"
|
msgstr "Пошук…"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:324
|
#: ../js/ui/searchDisplay.js:327
|
||||||
msgid "No matching results."
|
msgid "No matching results."
|
||||||
msgstr "Нема збігів."
|
msgstr "Нема збігів."
|
||||||
|
|
||||||
@ -713,9 +713,9 @@ msgstr "Висока контрастність"
|
|||||||
msgid "Large Text"
|
msgid "Large Text"
|
||||||
msgstr "Більший текст"
|
msgstr "Більший текст"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
|
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:264
|
||||||
#: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
|
#: ../js/ui/status/bluetooth.js:358 ../js/ui/status/bluetooth.js:392
|
||||||
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
|
#: ../js/ui/status/bluetooth.js:432 ../js/ui/status/bluetooth.js:465
|
||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
@ -728,101 +728,101 @@ msgid "Send Files to Device..."
|
|||||||
msgstr "Відправити файли до пристрою…"
|
msgstr "Відправити файли до пристрою…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:70
|
#: ../js/ui/status/bluetooth.js:70
|
||||||
msgid "Setup a New Device..."
|
msgid "Set up a New Device..."
|
||||||
msgstr "Встановити новий пристрій…"
|
msgstr "Встановити новий пристрій…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:95
|
#: ../js/ui/status/bluetooth.js:95
|
||||||
msgid "Bluetooth Settings"
|
msgid "Bluetooth Settings"
|
||||||
msgstr "Параметри Bluetooth"
|
msgstr "Параметри Bluetooth"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:188
|
#: ../js/ui/status/bluetooth.js:215
|
||||||
msgid "Connection"
|
msgid "Connection"
|
||||||
msgstr "З'єднання"
|
msgstr "З'єднання"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:224
|
#: ../js/ui/status/bluetooth.js:251
|
||||||
msgid "Send Files..."
|
msgid "Send Files..."
|
||||||
msgstr "Відправити файли…"
|
msgstr "Відправити файли…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:229
|
#: ../js/ui/status/bluetooth.js:256
|
||||||
msgid "Browse Files..."
|
msgid "Browse Files..."
|
||||||
msgstr "Огляд файлів…"
|
msgstr "Огляд файлів…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:238
|
#: ../js/ui/status/bluetooth.js:265
|
||||||
msgid "Error browsing device"
|
msgid "Error browsing device"
|
||||||
msgstr "Помилка перегляду пристрою…"
|
msgstr "Помилка перегляду пристрою…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:239
|
#: ../js/ui/status/bluetooth.js:266
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "The requested device cannot be browsed, error is '%s'"
|
msgid "The requested device cannot be browsed, error is '%s'"
|
||||||
msgstr "Потрібний пристрій неможливо переглянути, помилка — «%s»"
|
msgstr "Потрібний пристрій неможливо переглянути, помилка — «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:247
|
#: ../js/ui/status/bluetooth.js:274
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "Параметри клавіатури"
|
msgstr "Параметри клавіатури"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:252
|
#: ../js/ui/status/bluetooth.js:279
|
||||||
msgid "Mouse Settings"
|
msgid "Mouse Settings"
|
||||||
msgstr "Параметри миші"
|
msgstr "Параметри миші"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
|
#: ../js/ui/status/bluetooth.js:286 ../js/ui/status/volume.js:66
|
||||||
msgid "Sound Settings"
|
msgid "Sound Settings"
|
||||||
msgstr "Параметри звуку"
|
msgstr "Параметри звуку"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:368
|
#: ../js/ui/status/bluetooth.js:393
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Authorization request from %s"
|
msgid "Authorization request from %s"
|
||||||
msgstr "Запит про авторизацію від %s"
|
msgstr "Запит про авторизацію від %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:374
|
#: ../js/ui/status/bluetooth.js:399
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants access to the service '%s'"
|
msgid "Device %s wants access to the service '%s'"
|
||||||
msgstr "Пристрій %s потребує доступ до служби «%s»"
|
msgstr "Пристрій %s потребує доступ до служби «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:376
|
#: ../js/ui/status/bluetooth.js:401
|
||||||
msgid "Always grant access"
|
msgid "Always grant access"
|
||||||
msgstr "Завжди надавати доступ"
|
msgstr "Завжди надавати доступ"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:377
|
#: ../js/ui/status/bluetooth.js:402
|
||||||
msgid "Grant this time only"
|
msgid "Grant this time only"
|
||||||
msgstr "Надати лише цього разу"
|
msgstr "Надати лише цього разу"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:378
|
#: ../js/ui/status/bluetooth.js:403
|
||||||
msgid "Reject"
|
msgid "Reject"
|
||||||
msgstr "Відмовити"
|
msgstr "Відмовити"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:408
|
#: ../js/ui/status/bluetooth.js:433
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing confirmation for %s"
|
msgid "Pairing confirmation for %s"
|
||||||
msgstr "Сполучення підтвердження для %s"
|
msgstr "Сполучення підтвердження для %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
|
#: ../js/ui/status/bluetooth.js:439 ../js/ui/status/bluetooth.js:473
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants to pair with this computer"
|
msgid "Device %s wants to pair with this computer"
|
||||||
msgstr "Пристрій %s потребує прив'язання до цього комп'ютера"
|
msgstr "Пристрій %s потребує прив'язання до цього комп'ютера"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:415
|
#: ../js/ui/status/bluetooth.js:440
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Please confirm whether the PIN '%s' matches the one on the device."
|
msgid "Please confirm whether the PIN '%s' matches the one on the device."
|
||||||
msgstr "Будь ласка, підвердьте, чи «%s» збігається з PIN на пристрої."
|
msgstr "Будь ласка, підвердьте, чи «%s» збігається з PIN на пристрої."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:417
|
#: ../js/ui/status/bluetooth.js:442
|
||||||
msgid "Matches"
|
msgid "Matches"
|
||||||
msgstr "Збігається"
|
msgstr "Збігається"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:418
|
#: ../js/ui/status/bluetooth.js:443
|
||||||
msgid "Does not match"
|
msgid "Does not match"
|
||||||
msgstr "Не збігається"
|
msgstr "Не збігається"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:441
|
#: ../js/ui/status/bluetooth.js:466
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing request for %s"
|
msgid "Pairing request for %s"
|
||||||
msgstr "Запит на сполучення для %s"
|
msgstr "Запит на сполучення для %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:449
|
#: ../js/ui/status/bluetooth.js:474
|
||||||
msgid "Please enter the PIN mentioned on the device."
|
msgid "Please enter the PIN mentioned on the device."
|
||||||
msgstr "Будь ласка, введіть PIN, згаданий на пристрої."
|
msgstr "Будь ласка, введіть PIN, згаданий на пристрої."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:465
|
#: ../js/ui/status/bluetooth.js:490
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "Гаразд"
|
msgstr "Гаразд"
|
||||||
|
|
||||||
@ -834,139 +834,139 @@ msgstr "Показувати розкладку клавіатури…"
|
|||||||
msgid "Localization Settings"
|
msgid "Localization Settings"
|
||||||
msgstr "Параметри локалізації"
|
msgstr "Параметри локалізації"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:104 ../js/ui/status/network.js:1454
|
#: ../js/ui/status/network.js:113
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<невідомо>"
|
msgstr "<невідомо>"
|
||||||
|
|
||||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||||
#: ../js/ui/status/network.js:311
|
#: ../js/ui/status/network.js:330
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "вимкнено"
|
msgstr "вимкнено"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:494
|
#: ../js/ui/status/network.js:528
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "з'єднання…"
|
msgstr "з'єднання…"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:497
|
#: ../js/ui/status/network.js:531
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "Потрібна аутентифікація"
|
msgstr "Потрібна аутентифікація"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing
|
#. module, which is missing
|
||||||
#: ../js/ui/status/network.js:507
|
#: ../js/ui/status/network.js:541
|
||||||
msgid "firmware missing"
|
msgid "firmware missing"
|
||||||
msgstr "Бракує мікропрограми"
|
msgstr "Бракує мікропрограми"
|
||||||
|
|
||||||
#. Translators: this is for wired network devices that are physically disconnected
|
#. Translators: this is for wired network devices that are physically disconnected
|
||||||
#: ../js/ui/status/network.js:514
|
#: ../js/ui/status/network.js:548
|
||||||
msgid "cable unplugged"
|
msgid "cable unplugged"
|
||||||
msgstr "кабель від'єднано"
|
msgstr "кабель від'єднано"
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage
|
#. is disabled by rfkill, or it has no coverage
|
||||||
#: ../js/ui/status/network.js:519
|
#: ../js/ui/status/network.js:553
|
||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr "недоступний"
|
msgstr "недоступний"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:521
|
#: ../js/ui/status/network.js:555
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "не вдалось з'єднатись"
|
msgstr "не вдалось з'єднатись"
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:602 ../js/ui/status/network.js:1402
|
#: ../js/ui/status/network.js:635 ../js/ui/status/network.js:1532
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "З'єднано (приватно)"
|
msgstr "З'єднано (приватно)"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:683
|
#: ../js/ui/status/network.js:720
|
||||||
msgid "Auto Ethernet"
|
msgid "Auto Ethernet"
|
||||||
msgstr "Автоматично Ethernet"
|
msgstr "Автоматично Ethernet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:758
|
#: ../js/ui/status/network.js:795
|
||||||
msgid "Auto broadband"
|
msgid "Auto broadband"
|
||||||
msgstr "Автоматично радіомережа"
|
msgstr "Автоматично радіомережа"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:761
|
#: ../js/ui/status/network.js:798
|
||||||
msgid "Auto dial-up"
|
msgid "Auto dial-up"
|
||||||
msgstr "Автоматично додзвін"
|
msgstr "Автоматично додзвін"
|
||||||
|
|
||||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||||
#: ../js/ui/status/network.js:904 ../js/ui/status/network.js:1414
|
#: ../js/ui/status/network.js:944 ../js/ui/status/network.js:1544
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Auto %s"
|
msgid "Auto %s"
|
||||||
msgstr "Автоматично %s"
|
msgstr "Автоматично %s"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:906
|
#: ../js/ui/status/network.js:946
|
||||||
msgid "Auto bluetooth"
|
msgid "Auto bluetooth"
|
||||||
msgstr "Автоматично Bluetooth"
|
msgstr "Автоматично Bluetooth"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1416
|
#: ../js/ui/status/network.js:1546
|
||||||
msgid "Auto wireless"
|
msgid "Auto wireless"
|
||||||
msgstr "Автоматично бездротова мережа"
|
msgstr "Автоматично бездротова мережа"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1474
|
#: ../js/ui/status/network.js:1583
|
||||||
msgid "More..."
|
msgid "More..."
|
||||||
msgstr "Більше…"
|
msgstr "Більше…"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1497
|
#: ../js/ui/status/network.js:1625
|
||||||
msgid "Enable networking"
|
msgid "Enable networking"
|
||||||
msgstr "Увімкнути мережу"
|
msgstr "Увімкнути мережу"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1509
|
#: ../js/ui/status/network.js:1637
|
||||||
msgid "Wired"
|
msgid "Wired"
|
||||||
msgstr "Дротова"
|
msgstr "Дротова"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1520
|
#: ../js/ui/status/network.js:1648
|
||||||
msgid "Wireless"
|
msgid "Wireless"
|
||||||
msgstr "Бездротова"
|
msgstr "Бездротова"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1530
|
#: ../js/ui/status/network.js:1658
|
||||||
msgid "Mobile broadband"
|
msgid "Mobile broadband"
|
||||||
msgstr "Мобільна радіомережа"
|
msgstr "Мобільна радіомережа"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1540
|
#: ../js/ui/status/network.js:1668
|
||||||
msgid "VPN Connections"
|
msgid "VPN Connections"
|
||||||
msgstr "З'єднання VPN"
|
msgstr "З'єднання VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1549
|
#: ../js/ui/status/network.js:1680
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Налаштування мережі"
|
msgstr "Налаштування мережі"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1844
|
#: ../js/ui/status/network.js:1974
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to mobile broadband connection '%s'"
|
msgid "You're now connected to mobile broadband connection '%s'"
|
||||||
msgstr "Зараз ви з'єднані через мобільну радіомережу «%s»"
|
msgstr "Зараз ви з'єднані через мобільну радіомережу «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1848
|
#: ../js/ui/status/network.js:1978
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to wireless network '%s'"
|
msgid "You're now connected to wireless network '%s'"
|
||||||
msgstr "Зараз ви з'єднані через бездротову мережу «%s»"
|
msgstr "Зараз ви з'єднані через бездротову мережу «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1852
|
#: ../js/ui/status/network.js:1982
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to wired network '%s'"
|
msgid "You're now connected to wired network '%s'"
|
||||||
msgstr "Зараз ви з'єднані через дротову мережу «%s»"
|
msgstr "Зараз ви з'єднані через дротову мережу «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1856
|
#: ../js/ui/status/network.js:1986
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to VPN network '%s'"
|
msgid "You're now connected to VPN network '%s'"
|
||||||
msgstr "Зараз ви з'єднані через мережу VPN «%s»"
|
msgstr "Зараз ви з'єднані через мережу VPN «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1861
|
#: ../js/ui/status/network.js:1991
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "You're now connected to '%s'"
|
msgid "You're now connected to '%s'"
|
||||||
msgstr "Зараз ви з'єднані через «%s»"
|
msgstr "Зараз ви з'єднані через «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1869
|
#: ../js/ui/status/network.js:1999
|
||||||
msgid "Connection established"
|
msgid "Connection established"
|
||||||
msgstr "З'єднання встановлено"
|
msgstr "З'єднання встановлено"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1991
|
#: ../js/ui/status/network.js:2125
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr "Мережу вимкнено"
|
msgstr "Мережу вимкнено"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2116
|
#: ../js/ui/status/network.js:2250
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Керування мережею"
|
msgstr "Керування мережею"
|
||||||
|
|
||||||
@ -1072,22 +1072,22 @@ msgstr "Гучність"
|
|||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Мікрофон"
|
msgstr "Мікрофон"
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:331
|
#: ../js/ui/telepathyClient.js:330
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is online."
|
msgid "%s is online."
|
||||||
msgstr "%s в мережі."
|
msgstr "%s в мережі."
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:336
|
#: ../js/ui/telepathyClient.js:335
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is offline."
|
msgid "%s is offline."
|
||||||
msgstr "%s поза мережею."
|
msgstr "%s поза мережею."
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:339
|
#: ../js/ui/telepathyClient.js:338
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is away."
|
msgid "%s is away."
|
||||||
msgstr "%s відійшов."
|
msgstr "%s відійшов."
|
||||||
|
|
||||||
#: ../js/ui/telepathyClient.js:342
|
#: ../js/ui/telepathyClient.js:341
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is busy."
|
msgid "%s is busy."
|
||||||
msgstr "%s зайнятий."
|
msgstr "%s зайнятий."
|
||||||
@ -1095,11 +1095,18 @@ msgstr "%s зайнятий."
|
|||||||
#. Translators: this is a time format string followed by a date.
|
#. Translators: this is a time format string followed by a date.
|
||||||
#. If applicable, replace %X with a strftime format valid for your
|
#. If applicable, replace %X with a strftime format valid for your
|
||||||
#. locale, without seconds.
|
#. locale, without seconds.
|
||||||
#: ../js/ui/telepathyClient.js:473
|
#: ../js/ui/telepathyClient.js:479
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "Sent at %X on %A"
|
msgid "Sent at %X on %A"
|
||||||
msgstr "Відправити на %X в %A"
|
msgstr "Відправити на %X в %A"
|
||||||
|
|
||||||
|
#. Translators: this is the other person changing their old IM name to their new
|
||||||
|
#. IM name.
|
||||||
|
#: ../js/ui/telepathyClient.js:524
|
||||||
|
#, c-format
|
||||||
|
msgid "%s is now known as %s"
|
||||||
|
msgstr "%s тепер відомий як %s"
|
||||||
|
|
||||||
#. Translators: this is the text displayed
|
#. Translators: this is the text displayed
|
||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
@ -1146,7 +1153,7 @@ msgstr[2] "%u входів"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Системні звуки"
|
msgstr "Системні звуки"
|
||||||
|
|
||||||
#: ../src/main.c:446
|
#: ../src/main.c:445
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Показати версію"
|
msgstr "Показати версію"
|
||||||
|
|
||||||
@ -1155,42 +1162,6 @@ msgstr "Показати версію"
|
|||||||
msgid "Failed to launch '%s'"
|
msgid "Failed to launch '%s'"
|
||||||
msgstr "Не вдалось запустити «%s»"
|
msgstr "Не вдалось запустити «%s»"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1395
|
|
||||||
msgid "Less than a minute ago"
|
|
||||||
msgstr "Менше хвилини тому"
|
|
||||||
|
|
||||||
#: ../src/shell-global.c:1399
|
|
||||||
#, c-format
|
|
||||||
msgid "%d minute ago"
|
|
||||||
msgid_plural "%d minutes ago"
|
|
||||||
msgstr[0] "%d хвилина тому"
|
|
||||||
msgstr[1] "%d хвилини тому"
|
|
||||||
msgstr[2] "%d хвилин тому"
|
|
||||||
|
|
||||||
#: ../src/shell-global.c:1404
|
|
||||||
#, c-format
|
|
||||||
msgid "%d hour ago"
|
|
||||||
msgid_plural "%d hours ago"
|
|
||||||
msgstr[0] "%d година тому"
|
|
||||||
msgstr[1] "%d години тому"
|
|
||||||
msgstr[2] "%d годин тому"
|
|
||||||
|
|
||||||
#: ../src/shell-global.c:1409
|
|
||||||
#, c-format
|
|
||||||
msgid "%d day ago"
|
|
||||||
msgid_plural "%d days ago"
|
|
||||||
msgstr[0] "%d день тому"
|
|
||||||
msgstr[1] "%d дні тому"
|
|
||||||
msgstr[2] "%d днів тому"
|
|
||||||
|
|
||||||
#: ../src/shell-global.c:1414
|
|
||||||
#, c-format
|
|
||||||
msgid "%d week ago"
|
|
||||||
msgid_plural "%d weeks ago"
|
|
||||||
msgstr[0] "%d тиждень тому"
|
|
||||||
msgstr[1] "%d тижні тому"
|
|
||||||
msgstr[2] "%d тижнів тому"
|
|
||||||
|
|
||||||
#: ../src/shell-mobile-providers.c:80
|
#: ../src/shell-mobile-providers.c:80
|
||||||
msgid "United Kingdom"
|
msgid "United Kingdom"
|
||||||
msgstr "Великобританія"
|
msgstr "Великобританія"
|
||||||
@ -1223,6 +1194,33 @@ msgstr "Файлова система"
|
|||||||
msgid "%1$s: %2$s"
|
msgid "%1$s: %2$s"
|
||||||
msgstr "%1$s: %2$s"
|
msgstr "%1$s: %2$s"
|
||||||
|
|
||||||
|
#~ msgid "Less than a minute ago"
|
||||||
|
#~ msgstr "Менше хвилини тому"
|
||||||
|
|
||||||
|
#~ msgid "%d minute ago"
|
||||||
|
#~ msgid_plural "%d minutes ago"
|
||||||
|
#~ msgstr[0] "%d хвилина тому"
|
||||||
|
#~ msgstr[1] "%d хвилини тому"
|
||||||
|
#~ msgstr[2] "%d хвилин тому"
|
||||||
|
|
||||||
|
#~ msgid "%d hour ago"
|
||||||
|
#~ msgid_plural "%d hours ago"
|
||||||
|
#~ msgstr[0] "%d година тому"
|
||||||
|
#~ msgstr[1] "%d години тому"
|
||||||
|
#~ msgstr[2] "%d годин тому"
|
||||||
|
|
||||||
|
#~ msgid "%d day ago"
|
||||||
|
#~ msgid_plural "%d days ago"
|
||||||
|
#~ msgstr[0] "%d день тому"
|
||||||
|
#~ msgstr[1] "%d дні тому"
|
||||||
|
#~ msgstr[2] "%d днів тому"
|
||||||
|
|
||||||
|
#~ msgid "%d week ago"
|
||||||
|
#~ msgid_plural "%d weeks ago"
|
||||||
|
#~ msgstr[0] "%d тиждень тому"
|
||||||
|
#~ msgstr[1] "%d тижні тому"
|
||||||
|
#~ msgstr[2] "%d тижнів тому"
|
||||||
|
|
||||||
#~ msgid "Shut Down"
|
#~ msgid "Shut Down"
|
||||||
#~ msgstr "Вимкнути"
|
#~ msgstr "Вимкнути"
|
||||||
|
|
||||||
|
4
po/vi.po
@ -9,7 +9,7 @@ msgstr ""
|
|||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2011-03-25 20:20+0000\n"
|
"POT-Creation-Date: 2011-03-25 20:20+0000\n"
|
||||||
"PO-Revision-Date: 2011-04-12 18:34+0700\n"
|
"PO-Revision-Date: 2011-05-22 21:50+0700\n"
|
||||||
"Last-Translator: Duy <pclouds@gmail.com>\n"
|
"Last-Translator: Duy <pclouds@gmail.com>\n"
|
||||||
"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
|
"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -551,7 +551,7 @@ msgstr "Ứng dụng"
|
|||||||
#. the left of the overview
|
#. the left of the overview
|
||||||
#: ../js/ui/overview.js:205
|
#: ../js/ui/overview.js:205
|
||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Khung ứng dụng"
|
msgstr "Neo ứng dụng"
|
||||||
|
|
||||||
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
||||||
#: ../js/ui/panel.js:515
|
#: ../js/ui/panel.js:515
|
||||||
|
542
po/zh_CN.po
@ -47,20 +47,20 @@ st-marshal.c: Makefile st/st-marshal.list
|
|||||||
|
|
||||||
st-enum-types.h: stamp-st-enum-types.h Makefile
|
st-enum-types.h: stamp-st-enum-types.h Makefile
|
||||||
@true
|
@true
|
||||||
stamp-st-enum-types.h: $(source_h) st/st-enum-types.h.in $(st_source_h)
|
stamp-st-enum-types.h: $(source_h) $(srcdir)/st/st-enum-types.h.in $(st_source_h)
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template st/st-enum-types.h.in \
|
--template $(srcdir)/st/st-enum-types.h.in \
|
||||||
$(st_source_h) ) >> $@.tmp && \
|
$(addprefix $(srcdir)/, $(st_source_h)) ) >> $@.tmp && \
|
||||||
(cmp -s $@.tmp st-enum-types.h || cp $@.tmp st-enum-types.h) && \
|
(cmp -s $@.tmp st-enum-types.h || cp $@.tmp st-enum-types.h) && \
|
||||||
rm -f $@.tmp && \
|
rm -f $@.tmp && \
|
||||||
echo timestamp > $(@F)
|
echo timestamp > $(@F)
|
||||||
|
|
||||||
st-enum-types.c: stamp-st-enum-types.h st/st-enum-types.c.in
|
st-enum-types.c: stamp-st-enum-types.h $(srcdir)/st/st-enum-types.c.in
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template st/st-enum-types.c.in \
|
--template $(srcdir)/st/st-enum-types.c.in \
|
||||||
$(st_source_h) ) >> $@.tmp && \
|
$(addprefix $(srcdir)/,$(st_source_h)) ) >> $@.tmp && \
|
||||||
cp $@.tmp $@ && \
|
cp $@.tmp $@ && \
|
||||||
rm -f $@.tmp
|
rm -f $@.tmp
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ shell_public_headers_h = \
|
|||||||
shell-perf-log.h \
|
shell-perf-log.h \
|
||||||
shell-slicer.h \
|
shell-slicer.h \
|
||||||
shell-stack.h \
|
shell-stack.h \
|
||||||
|
shell-tp-client.h \
|
||||||
shell-tray-icon.h \
|
shell-tray-icon.h \
|
||||||
shell-tray-manager.h \
|
shell-tray-manager.h \
|
||||||
shell-util.h \
|
shell-util.h \
|
||||||
@ -134,6 +135,7 @@ libgnome_shell_la_SOURCES = \
|
|||||||
shell-polkit-authentication-agent.c \
|
shell-polkit-authentication-agent.c \
|
||||||
shell-slicer.c \
|
shell-slicer.c \
|
||||||
shell-stack.c \
|
shell-stack.c \
|
||||||
|
shell-tp-client.c \
|
||||||
shell-tray-icon.c \
|
shell-tray-icon.c \
|
||||||
shell-tray-manager.c \
|
shell-tray-manager.c \
|
||||||
shell-util.c \
|
shell-util.c \
|
||||||
@ -184,27 +186,10 @@ gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS)
|
|||||||
|
|
||||||
########################################
|
########################################
|
||||||
|
|
||||||
# In order to run the interactive tests for GUI components, we need to have
|
|
||||||
# an executable that exports the St components. Libtool doesn't have a way
|
|
||||||
# to include all the symbols from a convenience library into a executable
|
|
||||||
# so what we do is build a small uninstalled library that pulls in the
|
|
||||||
# St convenience library and link the test running program to that.
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES += libjs-test.la
|
|
||||||
|
|
||||||
libjs_test_la_LDFLAGS = -rpath $(libdir)
|
|
||||||
libjs_test_la_CPPFLAGS = $(JS_TEST_CFLAGS)
|
|
||||||
libjs_test_la_LIBADD = $(JS_TEST_LIBS) libst-1.0.la
|
|
||||||
|
|
||||||
# The tests use or reference a couple of Shell classes
|
|
||||||
libjs_test_la_SOURCES = \
|
|
||||||
shell-generic-container.c \
|
|
||||||
shell-perf-log.c
|
|
||||||
|
|
||||||
noinst_PROGRAMS += run-js-test
|
noinst_PROGRAMS += run-js-test
|
||||||
|
|
||||||
run_js_test_CPPFLAGS = $(JS_TEST_CFLAGS)
|
run_js_test_CPPFLAGS = $(gnome_shell_cflags)
|
||||||
run_js_test_LDADD = $(JS_TEST_LIBS) libjs-test.la
|
run_js_test_LDADD = libgnome-shell.la $(libgnome_shell_la_LIBADD)
|
||||||
run_js_test_LDFLAGS = -export-dynamic
|
run_js_test_LDFLAGS = -export-dynamic
|
||||||
|
|
||||||
run_js_test_SOURCES = \
|
run_js_test_SOURCES = \
|
||||||
@ -237,21 +222,21 @@ shell-marshal.c: Makefile shell-marshal.list
|
|||||||
shell-enum-types.h: stamp-shell-enum-types.h Makefile
|
shell-enum-types.h: stamp-shell-enum-types.h Makefile
|
||||||
@true
|
@true
|
||||||
stamp-shell-enum-types.h: $(srcdir)/shell-enum-types.h.in $(shell_public_headers_h)
|
stamp-shell-enum-types.h: $(srcdir)/shell-enum-types.h.in $(shell_public_headers_h)
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template $< \
|
--template $< \
|
||||||
$(shell_public_headers_h) ) > $(@F).tmp && \
|
$(addprefix $(srcdir)/,$(shell_public_headers_h)) ) > $(@F).tmp && \
|
||||||
(cmp -s $(@F).tmp shell-enum-types.h || mv $(@F).tmp shell-enum-types.h) && \
|
(cmp -s $(@F).tmp shell-enum-types.h || mv $(@F).tmp shell-enum-types.h) && \
|
||||||
rm -f $(@F).tmp && \
|
rm -f $(@F).tmp && \
|
||||||
echo timestamp > $(@F)
|
echo timestamp > $(@F)
|
||||||
EXTRA_DIST += shell-enum-types.h.in
|
EXTRA_DIST += shell-enum-types.h.in
|
||||||
CLEANFILES += stamp-shell-enum-types.h
|
CLEANFILES += stamp-shell-enum-types.h
|
||||||
|
|
||||||
shell-enum-types.c: shell-enum-types.c.in stamp-shell-enum-types.h
|
shell-enum-types.c: $(srcdir)/shell-enum-types.c.in stamp-shell-enum-types.h
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template $< \
|
--template $< \
|
||||||
$(shell_public_headers_h) ) > $(@F).tmp && \
|
$(addprefix $(srcdir)/,$(shell_public_headers_h)) ) > $(@F).tmp && \
|
||||||
mv $(@F).tmp $(@F) && \
|
mv $(@F).tmp $(@F) && \
|
||||||
rm -f $(@F).tmp
|
rm -f $(@F).tmp
|
||||||
EXTRA_DIST += shell-enum-types.c.in
|
EXTRA_DIST += shell-enum-types.c.in
|
||||||
@ -273,7 +258,7 @@ Shell-0.1.gir: libgnome-shell.la St-1.0.gir
|
|||||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 TelepathyLogger-0.2
|
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 TelepathyLogger-0.2
|
||||||
Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
|
Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
|
||||||
Shell_0_1_gir_LIBS = libgnome-shell.la
|
Shell_0_1_gir_LIBS = libgnome-shell.la
|
||||||
Shell_0_1_gir_FILES = $(addprefix $(srcdir)/,$(libgnome_shell_la_gir_sources))
|
Shell_0_1_gir_FILES = $(libgnome_shell_la_gir_sources)
|
||||||
Shell_0_1_gir_SCANNERFLAGS = --include-uninstalled=$(builddir)/St-1.0.gir \
|
Shell_0_1_gir_SCANNERFLAGS = --include-uninstalled=$(builddir)/St-1.0.gir \
|
||||||
--add-include-path=$(MUTTER_GIR_DIR)
|
--add-include-path=$(MUTTER_GIR_DIR)
|
||||||
INTROSPECTION_GIRS += Shell-0.1.gir
|
INTROSPECTION_GIRS += Shell-0.1.gir
|
||||||
|
@ -777,7 +777,10 @@ remove_user (GdmUserManager *manager,
|
|||||||
if (gdm_user_get_object_path (user) != NULL) {
|
if (gdm_user_get_object_path (user) != NULL) {
|
||||||
g_hash_table_remove (manager->priv->users_by_object_path, gdm_user_get_object_path (user));
|
g_hash_table_remove (manager->priv->users_by_object_path, gdm_user_get_object_path (user));
|
||||||
}
|
}
|
||||||
g_hash_table_remove (manager->priv->users_by_name, gdm_user_get_user_name (user));
|
|
||||||
|
if (gdm_user_get_user_name (user) != NULL) {
|
||||||
|
g_hash_table_remove (manager->priv->users_by_name, gdm_user_get_user_name (user));
|
||||||
|
}
|
||||||
|
|
||||||
if (manager->priv->is_loaded) {
|
if (manager->priv->is_loaded) {
|
||||||
g_signal_emit (manager, signals[USER_REMOVED], 0, user);
|
g_signal_emit (manager, signals[USER_REMOVED], 0, user);
|
||||||
@ -884,6 +887,13 @@ on_user_removed_in_accounts_service (DBusGProxy *proxy,
|
|||||||
|
|
||||||
user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path);
|
user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path);
|
||||||
|
|
||||||
|
if (user == NULL) {
|
||||||
|
g_debug ("GdmUserManager: ignoring untracked user %s", object_path);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
g_debug ("GdmUserManager: tracked user %s removed from accounts service", object_path);
|
||||||
|
}
|
||||||
|
|
||||||
manager->priv->new_users = g_slist_remove (manager->priv->new_users, user);
|
manager->priv->new_users = g_slist_remove (manager->priv->new_users, user);
|
||||||
|
|
||||||
remove_user (manager, user);
|
remove_user (manager, user);
|
||||||
|
@ -178,7 +178,8 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
|
|||||||
gjs_context = _shell_global_get_gjs_context (shell_plugin->global);
|
gjs_context = _shell_global_get_gjs_context (shell_plugin->global);
|
||||||
|
|
||||||
if (!gjs_context_eval (gjs_context,
|
if (!gjs_context_eval (gjs_context,
|
||||||
"const Main = imports.ui.main; Main.start();",
|
"imports.ui.environment.init();"
|
||||||
|
"imports.ui.main.start();",
|
||||||
-1,
|
-1,
|
||||||
"<main>",
|
"<main>",
|
||||||
&status,
|
&status,
|
||||||
|
12
src/main.c
@ -453,11 +453,13 @@ main (int argc, char **argv)
|
|||||||
{
|
{
|
||||||
GOptionContext *ctx;
|
GOptionContext *ctx;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
int ecode;
|
||||||
|
|
||||||
g_type_init ();
|
g_type_init ();
|
||||||
|
|
||||||
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
||||||
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||||
|
textdomain (GETTEXT_PACKAGE);
|
||||||
|
|
||||||
ctx = meta_get_option_context ();
|
ctx = meta_get_option_context ();
|
||||||
g_option_context_add_main_entries (ctx, gnome_shell_options, GETTEXT_PACKAGE);
|
g_option_context_add_main_entries (ctx, gnome_shell_options, GETTEXT_PACKAGE);
|
||||||
@ -506,5 +508,13 @@ main (int argc, char **argv)
|
|||||||
/* Initialize the global object */
|
/* Initialize the global object */
|
||||||
shell_global_get ();
|
shell_global_get ();
|
||||||
|
|
||||||
return meta_run ();
|
ecode = meta_run ();
|
||||||
|
|
||||||
|
if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP"))
|
||||||
|
{
|
||||||
|
g_printerr ("Doing final cleanup...\n");
|
||||||
|
g_object_unref (shell_global_get ());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ecode;
|
||||||
}
|
}
|
||||||
|
@ -24,15 +24,19 @@
|
|||||||
* IN THE SOFTWARE.
|
* IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include "config.h"
|
||||||
#include <gtk/gtk.h>
|
|
||||||
#include <gdk/gdkx.h>
|
|
||||||
#include <clutter/x11/clutter-x11.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <locale.h>
|
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <clutter/x11/clutter-x11.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
#include <gjs/gjs.h>
|
#include <gjs/gjs.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include "shell-global.h"
|
||||||
|
#include "shell-global-private.h"
|
||||||
|
|
||||||
static char **include_path = NULL;
|
static char **include_path = NULL;
|
||||||
static char *command = NULL;
|
static char *command = NULL;
|
||||||
@ -59,10 +63,10 @@ event_filter (GdkXEvent *xevent,
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *command_line;
|
|
||||||
GOptionContext *context;
|
GOptionContext *context;
|
||||||
ClutterActor *stage;
|
ClutterActor *stage;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
ShellGlobal *global;
|
||||||
GjsContext *js_context;
|
GjsContext *js_context;
|
||||||
char *script;
|
char *script;
|
||||||
const char *filename;
|
const char *filename;
|
||||||
@ -94,12 +98,8 @@ main(int argc, char **argv)
|
|||||||
setlocale (LC_ALL, "");
|
setlocale (LC_ALL, "");
|
||||||
g_type_init ();
|
g_type_init ();
|
||||||
|
|
||||||
command_line = g_strjoinv (" ", argv);
|
global = shell_global_get ();
|
||||||
g_debug ("Command line: %s", command_line);
|
js_context = _shell_global_get_gjs_context (global);
|
||||||
g_free (command_line);
|
|
||||||
|
|
||||||
g_debug ("Creating new context to eval console script");
|
|
||||||
js_context = gjs_context_new_with_search_path (include_path);
|
|
||||||
|
|
||||||
/* prepare command line arguments */
|
/* prepare command line arguments */
|
||||||
if (!gjs_context_define_string_array (js_context, "ARGV",
|
if (!gjs_context_define_string_array (js_context, "ARGV",
|
||||||
|
@ -415,6 +415,16 @@ shell_app_activate_window (ShellApp *app,
|
|||||||
meta_window_get_user_time (most_recent_transient)))
|
meta_window_get_user_time (most_recent_transient)))
|
||||||
window = most_recent_transient;
|
window = most_recent_transient;
|
||||||
|
|
||||||
|
|
||||||
|
if (!shell_window_tracker_is_window_interesting (window))
|
||||||
|
{
|
||||||
|
/* We won't get notify::user-time signals for uninteresting windows,
|
||||||
|
* which means that an app's last_user_time won't get updated.
|
||||||
|
* Update it here instead.
|
||||||
|
*/
|
||||||
|
app->running_state->last_user_time = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
if (active != workspace)
|
if (active != workspace)
|
||||||
meta_workspace_activate_with_focus (workspace, window, timestamp);
|
meta_workspace_activate_with_focus (workspace, window, timestamp);
|
||||||
else
|
else
|
||||||
|
@ -22,12 +22,14 @@
|
|||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <gjs/gjs-module.h>
|
#include <gjs/gjs-module.h>
|
||||||
#include <girepository.h>
|
#include <girepository.h>
|
||||||
#include <libxml/parser.h>
|
|
||||||
#include <libxml/tree.h>
|
|
||||||
#include <libxml/xmlmemory.h>
|
|
||||||
#include <meta/display.h>
|
#include <meta/display.h>
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
|
|
||||||
|
/* Memory report bits */
|
||||||
|
#ifdef HAVE_MALLINFO
|
||||||
|
#include <malloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "shell-enum-types.h"
|
#include "shell-enum-types.h"
|
||||||
#include "shell-global-private.h"
|
#include "shell-global-private.h"
|
||||||
#include "shell-jsapi-compat-private.h"
|
#include "shell-jsapi-compat-private.h"
|
||||||
@ -37,6 +39,8 @@
|
|||||||
#include "shell-wm.h"
|
#include "shell-wm.h"
|
||||||
#include "st.h"
|
#include "st.h"
|
||||||
|
|
||||||
|
static ShellGlobal *the_object = NULL;
|
||||||
|
|
||||||
static void grab_notify (GtkWidget *widget, gboolean is_grab, gpointer user_data);
|
static void grab_notify (GtkWidget *widget, gboolean is_grab, gpointer user_data);
|
||||||
|
|
||||||
struct _ShellGlobal {
|
struct _ShellGlobal {
|
||||||
@ -65,8 +69,6 @@ struct _ShellGlobal {
|
|||||||
|
|
||||||
GdkWindow *stage_window;
|
GdkWindow *stage_window;
|
||||||
|
|
||||||
gint last_change_screen_width, last_change_screen_height;
|
|
||||||
|
|
||||||
guint work_count;
|
guint work_count;
|
||||||
GSList *leisure_closures;
|
GSList *leisure_closures;
|
||||||
guint leisure_function_id;
|
guint leisure_function_id;
|
||||||
@ -240,9 +242,6 @@ shell_global_init (ShellGlobal *global)
|
|||||||
|
|
||||||
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
|
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
|
||||||
|
|
||||||
global->last_change_screen_width = 0;
|
|
||||||
global->last_change_screen_height = 0;
|
|
||||||
|
|
||||||
ca_context_create (&global->sound_context);
|
ca_context_create (&global->sound_context);
|
||||||
ca_context_change_props (global->sound_context, CA_PROP_APPLICATION_NAME, PACKAGE_NAME, CA_PROP_APPLICATION_ID, "org.gnome.Shell", NULL);
|
ca_context_change_props (global->sound_context, CA_PROP_APPLICATION_NAME, PACKAGE_NAME, CA_PROP_APPLICATION_ID, "org.gnome.Shell", NULL);
|
||||||
ca_context_open (global->sound_context);
|
ca_context_open (global->sound_context);
|
||||||
@ -257,6 +256,20 @@ shell_global_init (ShellGlobal *global)
|
|||||||
g_strfreev (search_path);
|
g_strfreev (search_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shell_global_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
ShellGlobal *global = SHELL_GLOBAL (object);
|
||||||
|
|
||||||
|
g_object_unref (global->js_context);
|
||||||
|
gtk_widget_destroy (GTK_WIDGET (global->grab_notifier));
|
||||||
|
g_object_unref (global->settings);
|
||||||
|
|
||||||
|
the_object = NULL;
|
||||||
|
|
||||||
|
G_OBJECT_CLASS(shell_global_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shell_global_class_init (ShellGlobalClass *klass)
|
shell_global_class_init (ShellGlobalClass *klass)
|
||||||
{
|
{
|
||||||
@ -264,6 +277,7 @@ shell_global_class_init (ShellGlobalClass *klass)
|
|||||||
|
|
||||||
gobject_class->get_property = shell_global_get_property;
|
gobject_class->get_property = shell_global_get_property;
|
||||||
gobject_class->set_property = shell_global_set_property;
|
gobject_class->set_property = shell_global_set_property;
|
||||||
|
gobject_class->finalize = shell_global_finalize;
|
||||||
|
|
||||||
/* Emitted from gnome-shell-plugin.c during event handling */
|
/* Emitted from gnome-shell-plugin.c during event handling */
|
||||||
shell_global_signals[XDND_POSITION_CHANGED] =
|
shell_global_signals[XDND_POSITION_CHANGED] =
|
||||||
@ -417,31 +431,6 @@ shell_global_class_init (ShellGlobalClass *klass)
|
|||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_clutter_texture_set_from_pixbuf:
|
|
||||||
* texture: #ClutterTexture to be modified
|
|
||||||
* pixbuf: #GdkPixbuf to set as an image for #ClutterTexture
|
|
||||||
*
|
|
||||||
* Convenience function for setting an image for #ClutterTexture based on #GdkPixbuf.
|
|
||||||
* Copied from an example posted by hp in this thread http://mail.gnome.org/archives/gtk-devel-list/2008-September/msg00218.html
|
|
||||||
*
|
|
||||||
* Return value: %TRUE on success, %FALSE on failure
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
shell_clutter_texture_set_from_pixbuf (ClutterTexture *texture,
|
|
||||||
GdkPixbuf *pixbuf)
|
|
||||||
{
|
|
||||||
return clutter_texture_set_from_rgb_data (texture,
|
|
||||||
gdk_pixbuf_get_pixels (pixbuf),
|
|
||||||
gdk_pixbuf_get_has_alpha (pixbuf),
|
|
||||||
gdk_pixbuf_get_width (pixbuf),
|
|
||||||
gdk_pixbuf_get_height (pixbuf),
|
|
||||||
gdk_pixbuf_get_rowstride (pixbuf),
|
|
||||||
gdk_pixbuf_get_has_alpha (pixbuf)
|
|
||||||
? 4 : 3,
|
|
||||||
0, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_get:
|
* shell_global_get:
|
||||||
*
|
*
|
||||||
@ -452,8 +441,6 @@ shell_clutter_texture_set_from_pixbuf (ClutterTexture *texture,
|
|||||||
ShellGlobal *
|
ShellGlobal *
|
||||||
shell_global_get (void)
|
shell_global_get (void)
|
||||||
{
|
{
|
||||||
static ShellGlobal *the_object = NULL;
|
|
||||||
|
|
||||||
if (!the_object)
|
if (!the_object)
|
||||||
the_object = g_object_new (SHELL_TYPE_GLOBAL, 0);
|
the_object = g_object_new (SHELL_TYPE_GLOBAL, 0);
|
||||||
|
|
||||||
@ -708,23 +695,6 @@ shell_global_get_window_actors (ShellGlobal *global)
|
|||||||
return meta_plugin_get_window_actors (global->plugin);
|
return meta_plugin_get_window_actors (global->plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
update_screen_size (gpointer data)
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
ShellGlobal *global = SHELL_GLOBAL (data);
|
|
||||||
|
|
||||||
meta_plugin_query_screen_size (global->plugin, &width, &height);
|
|
||||||
|
|
||||||
if (global->last_change_screen_width == width && global->last_change_screen_height == height)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
global->last_change_screen_width = width;
|
|
||||||
global->last_change_screen_height = height;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
global_stage_notify_width (GObject *gobject,
|
global_stage_notify_width (GObject *gobject,
|
||||||
GParamSpec *pspec,
|
GParamSpec *pspec,
|
||||||
@ -733,11 +703,6 @@ global_stage_notify_width (GObject *gobject,
|
|||||||
ShellGlobal *global = SHELL_GLOBAL (data);
|
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (global), "screen-width");
|
g_object_notify (G_OBJECT (global), "screen-width");
|
||||||
|
|
||||||
meta_later_add (META_LATER_BEFORE_REDRAW,
|
|
||||||
update_screen_size,
|
|
||||||
global,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -748,11 +713,6 @@ global_stage_notify_height (GObject *gobject,
|
|||||||
ShellGlobal *global = SHELL_GLOBAL (data);
|
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (global), "screen-height");
|
g_object_notify (G_OBJECT (global), "screen-height");
|
||||||
|
|
||||||
meta_later_add (META_LATER_BEFORE_REDRAW,
|
|
||||||
update_screen_size,
|
|
||||||
global,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -791,7 +751,6 @@ _shell_global_set_plugin (ShellGlobal *global,
|
|||||||
G_CALLBACK (global_stage_notify_width), global);
|
G_CALLBACK (global_stage_notify_width), global);
|
||||||
g_signal_connect (stage, "notify::height",
|
g_signal_connect (stage, "notify::height",
|
||||||
G_CALLBACK (global_stage_notify_height), global);
|
G_CALLBACK (global_stage_notify_height), global);
|
||||||
update_screen_size (global);
|
|
||||||
|
|
||||||
g_signal_connect (stage, "paint",
|
g_signal_connect (stage, "paint",
|
||||||
G_CALLBACK (global_stage_before_paint), global);
|
G_CALLBACK (global_stage_before_paint), global);
|
||||||
@ -860,30 +819,6 @@ shell_global_end_modal (ShellGlobal *global,
|
|||||||
meta_plugin_end_modal (global->plugin, timestamp);
|
meta_plugin_end_modal (global->plugin, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_display_is_grabbed
|
|
||||||
* @global: a #ShellGlobal
|
|
||||||
*
|
|
||||||
* Determines whether Mutter currently has a grab (keyboard or mouse or
|
|
||||||
* both) on the display. This could be the result of a current window
|
|
||||||
* management operation like a window move, or could be from
|
|
||||||
* shell_global_begin_modal().
|
|
||||||
*
|
|
||||||
* This function is useful to for ad-hoc checks to avoid over-grabbing
|
|
||||||
* the Mutter grab a grab from GTK+. Longer-term we might instead want a
|
|
||||||
* mechanism to make Mutter use GDK grabs instead of raw XGrabPointer().
|
|
||||||
*
|
|
||||||
* Return value: %TRUE if Mutter has a grab on the display
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
shell_global_display_is_grabbed (ShellGlobal *global)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = meta_plugin_get_screen (global->plugin);
|
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
|
||||||
|
|
||||||
return meta_display_get_grab_op (display) != META_GRAB_OP_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_create_pointer_barrier
|
* shell_global_create_pointer_barrier
|
||||||
* @global: a #ShellGlobal
|
* @global: a #ShellGlobal
|
||||||
@ -1134,149 +1069,6 @@ shell_global_reexec_self (ShellGlobal *global)
|
|||||||
g_ptr_array_free (arr, TRUE);
|
g_ptr_array_free (arr, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_breakpoint:
|
|
||||||
* @global: A #ShellGlobal
|
|
||||||
*
|
|
||||||
* Using G_BREAKPOINT(), interrupt the current process. This is useful
|
|
||||||
* in conjunction with a debugger such as gdb.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
shell_global_breakpoint (ShellGlobal *global)
|
|
||||||
{
|
|
||||||
G_BREAKPOINT ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_parse_search_provider:
|
|
||||||
* @global: A #ShellGlobal
|
|
||||||
* @data: description of provider
|
|
||||||
* @name: (out): location to store a display name
|
|
||||||
* @url: (out): location to store template of url
|
|
||||||
* @langs: (out) (transfer full) (element-type utf8): list of supported languages
|
|
||||||
* @icon_data_uri: (out): location to store uri
|
|
||||||
* @error: location to store GError
|
|
||||||
*
|
|
||||||
* Returns: %TRUE on success
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
shell_global_parse_search_provider (ShellGlobal *global,
|
|
||||||
const char *data,
|
|
||||||
char **name,
|
|
||||||
char **url,
|
|
||||||
GList **langs,
|
|
||||||
char **icon_data_uri,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
xmlDocPtr doc = xmlParseMemory (data, strlen(data));
|
|
||||||
xmlNode *root;
|
|
||||||
|
|
||||||
*name = NULL;
|
|
||||||
*url = NULL;
|
|
||||||
*icon_data_uri = NULL;
|
|
||||||
*langs = NULL;
|
|
||||||
|
|
||||||
if (!doc)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Malformed xml");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
root = xmlDocGetRootElement (doc);
|
|
||||||
if (root && root->name && xmlStrcmp (root->name, (const xmlChar *)"OpenSearchDescription") == 0)
|
|
||||||
{
|
|
||||||
xmlNode *child;
|
|
||||||
for (child = root->children; child; child = child->next)
|
|
||||||
{
|
|
||||||
if (!child->name)
|
|
||||||
continue;
|
|
||||||
if (xmlStrcmp (child->name, (const xmlChar *)"Language") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
|
||||||
if (!val)
|
|
||||||
continue;
|
|
||||||
*langs = g_list_append (*langs, g_strdup ((char *)val));
|
|
||||||
xmlFree (val);
|
|
||||||
}
|
|
||||||
if (!*name && xmlStrcmp (child->name, (const xmlChar *)"ShortName") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
|
||||||
*name = g_strdup ((char *)val);
|
|
||||||
xmlFree (val);
|
|
||||||
}
|
|
||||||
if (!*icon_data_uri && xmlStrcmp (child->name, (const xmlChar *)"Image") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
|
||||||
if (val)
|
|
||||||
*icon_data_uri = g_strdup ((char *)val);
|
|
||||||
xmlFree (val);
|
|
||||||
}
|
|
||||||
if (!*url && xmlStrcmp (child->name, (const xmlChar *)"Url") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *template;
|
|
||||||
xmlChar *type;
|
|
||||||
|
|
||||||
type = xmlGetProp(child, (const xmlChar *)"type");
|
|
||||||
if (!type)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (xmlStrcmp (type, (const xmlChar *)"text/html") != 0)
|
|
||||||
{
|
|
||||||
xmlFree (type);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
xmlFree (type);
|
|
||||||
|
|
||||||
template = xmlGetProp(child, (const xmlChar *)"template");
|
|
||||||
if (!template)
|
|
||||||
continue;
|
|
||||||
*url = g_strdup ((char *)template);
|
|
||||||
xmlFree (template);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Invalid OpenSearch document");
|
|
||||||
xmlFreeDoc (doc);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
xmlFreeDoc (doc);
|
|
||||||
if (*icon_data_uri && *name && *url)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
if (*icon_data_uri)
|
|
||||||
g_free (*icon_data_uri);
|
|
||||||
else
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"search provider doesn't have icon");
|
|
||||||
|
|
||||||
if (*name)
|
|
||||||
g_free (*name);
|
|
||||||
else if (error && !*error)
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"search provider doesn't have ShortName");
|
|
||||||
|
|
||||||
if (*url)
|
|
||||||
g_free (*url);
|
|
||||||
else if (error && !*error)
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"search provider doesn't have template for url");
|
|
||||||
|
|
||||||
if (*langs)
|
|
||||||
{
|
|
||||||
g_list_foreach (*langs, (GFunc)g_free, NULL);
|
|
||||||
g_list_free (*langs);
|
|
||||||
}
|
|
||||||
|
|
||||||
*url = NULL;
|
|
||||||
*name = NULL;
|
|
||||||
*icon_data_uri = NULL;
|
|
||||||
*langs = NULL;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_gc:
|
* shell_global_gc:
|
||||||
* @global: A #ShellGlobal
|
* @global: A #ShellGlobal
|
||||||
@ -1306,6 +1098,38 @@ shell_global_maybe_gc (ShellGlobal *global)
|
|||||||
gjs_context_maybe_gc (global->js_context);
|
gjs_context_maybe_gc (global->js_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shell_global_get_memory_info:
|
||||||
|
* @global:
|
||||||
|
* @meminfo: (out caller-allocates): Output location for memory information
|
||||||
|
*
|
||||||
|
* Load process-global data about memory usage.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shell_global_get_memory_info (ShellGlobal *global,
|
||||||
|
ShellMemoryInfo *meminfo)
|
||||||
|
{
|
||||||
|
JSContext *context;
|
||||||
|
|
||||||
|
memset (meminfo, 0, sizeof (meminfo));
|
||||||
|
#ifdef HAVE_MALLINFO
|
||||||
|
{
|
||||||
|
struct mallinfo info = mallinfo ();
|
||||||
|
meminfo->glibc_uordblks = info.uordblks;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
context = gjs_context_get_native_context (global->js_context);
|
||||||
|
|
||||||
|
meminfo->js_bytes = JS_GetGCParameter (JS_GetRuntime (context), JSGC_BYTES);
|
||||||
|
|
||||||
|
meminfo->gjs_boxed = (unsigned int) gjs_counter_boxed.value;
|
||||||
|
meminfo->gjs_gobject = (unsigned int) gjs_counter_object.value;
|
||||||
|
meminfo->gjs_function = (unsigned int) gjs_counter_function.value;
|
||||||
|
meminfo->gjs_closure = (unsigned int) gjs_counter_closure.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_notify_error:
|
* shell_global_notify_error:
|
||||||
* @global: a #ShellGlobal
|
* @global: a #ShellGlobal
|
||||||
@ -1369,54 +1193,6 @@ void shell_global_init_xdnd (ShellGlobal *global)
|
|||||||
32, PropModeReplace, (const unsigned char *)&stage_win, 1);
|
32, PropModeReplace, (const unsigned char *)&stage_win, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_format_time_relative_pretty:
|
|
||||||
* @global:
|
|
||||||
* @delta: Time in seconds since the current time
|
|
||||||
* @text: (out): Relative human-consumption-only time string
|
|
||||||
* @next_update: (out): Time in seconds until we should redisplay the time
|
|
||||||
*
|
|
||||||
* Format a time value for human consumption only. The passed time
|
|
||||||
* value is a delta in terms of seconds from the current time.
|
|
||||||
* This function needs to be in C because of its use of ngettext() which
|
|
||||||
* is not accessible from JavaScript.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
shell_global_format_time_relative_pretty (ShellGlobal *global,
|
|
||||||
guint delta,
|
|
||||||
char **text,
|
|
||||||
guint *next_update)
|
|
||||||
{
|
|
||||||
#define MINUTE (60)
|
|
||||||
#define HOUR (MINUTE*60)
|
|
||||||
#define DAY (HOUR*24)
|
|
||||||
#define WEEK (DAY*7)
|
|
||||||
if (delta < MINUTE) {
|
|
||||||
*text = g_strdup (_("Less than a minute ago"));
|
|
||||||
*next_update = MINUTE - delta;
|
|
||||||
} else if (delta < HOUR) {
|
|
||||||
*text = g_strdup_printf (dngettext (GETTEXT_PACKAGE,
|
|
||||||
"%d minute ago", "%d minutes ago",
|
|
||||||
delta / MINUTE), delta / MINUTE);
|
|
||||||
*next_update = MINUTE - (delta % MINUTE);
|
|
||||||
} else if (delta < DAY) {
|
|
||||||
*text = g_strdup_printf (dngettext (GETTEXT_PACKAGE,
|
|
||||||
"%d hour ago", "%d hours ago",
|
|
||||||
delta / HOUR), delta / HOUR);
|
|
||||||
*next_update = HOUR - (delta % HOUR);
|
|
||||||
} else if (delta < WEEK) {
|
|
||||||
*text = g_strdup_printf (dngettext (GETTEXT_PACKAGE,
|
|
||||||
"%d day ago", "%d days ago",
|
|
||||||
delta / DAY), delta / DAY);
|
|
||||||
*next_update = DAY - (delta % DAY);
|
|
||||||
} else {
|
|
||||||
*text = g_strdup_printf (dngettext (GETTEXT_PACKAGE,
|
|
||||||
"%d week ago", "%d weeks ago",
|
|
||||||
delta / WEEK), delta / WEEK);
|
|
||||||
*next_update = WEEK - (delta % WEEK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_get_monitors:
|
* shell_global_get_monitors:
|
||||||
* @global: the #ShellGlobal
|
* @global: the #ShellGlobal
|
||||||
@ -1517,8 +1293,7 @@ shell_global_get_focus_monitor (ShellGlobal *global)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_screen_get_monitor_geometry (screen, 0, &rect);
|
return shell_global_get_primary_monitor (global);
|
||||||
return meta_rectangle_copy (&rect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1587,25 +1362,6 @@ shell_global_sync_pointer (ShellGlobal *global)
|
|||||||
clutter_event_put ((ClutterEvent *)&event);
|
clutter_event_put ((ClutterEvent *)&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_get_event_state:
|
|
||||||
* @event: a #ClutterEvent
|
|
||||||
*
|
|
||||||
* Gets the current state of the event (the set of modifier keys that
|
|
||||||
* are pressed down). Thhis is a wrapper around
|
|
||||||
* clutter_event_get_state() that strips out any un-declared modifier
|
|
||||||
* flags, to make gjs happy; see
|
|
||||||
* https://bugzilla.gnome.org/show_bug.cgi?id=597292.
|
|
||||||
*
|
|
||||||
* Return value: the state from the event
|
|
||||||
*/
|
|
||||||
ClutterModifierType
|
|
||||||
shell_get_event_state (ClutterEvent *event)
|
|
||||||
{
|
|
||||||
ClutterModifierType state = clutter_event_get_state (event);
|
|
||||||
return state & CLUTTER_MODIFIER_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_get_settings:
|
* shell_global_get_settings:
|
||||||
* @global: A #ShellGlobal
|
* @global: A #ShellGlobal
|
||||||
@ -1620,59 +1376,6 @@ shell_global_get_settings (ShellGlobal *global)
|
|||||||
return global->settings;
|
return global->settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
shell_popup_menu_position_func (GtkMenu *menu,
|
|
||||||
int *x,
|
|
||||||
int *y,
|
|
||||||
gboolean *push_in,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
*x = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu), "shell-menu-x"));
|
|
||||||
*y = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu), "shell-menu-y"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_popup_menu:
|
|
||||||
* @menu: a #GtkMenu
|
|
||||||
* @button: mouse button that triggered the menu
|
|
||||||
* @time: timestamp of event that triggered the menu
|
|
||||||
* @menu_x: x coordinate to display the menu at
|
|
||||||
* @menu_y: y coordinate to display the menu at
|
|
||||||
*
|
|
||||||
* Wraps gtk_menu_popup(), but using @menu_x, @menu_y for the location
|
|
||||||
* rather than needing a callback.
|
|
||||||
**/
|
|
||||||
void
|
|
||||||
shell_popup_menu (GtkMenu *menu, int button, guint32 time,
|
|
||||||
int menu_x, int menu_y)
|
|
||||||
{
|
|
||||||
g_object_set_data (G_OBJECT (menu), "shell-menu-x", GINT_TO_POINTER (menu_x));
|
|
||||||
g_object_set_data (G_OBJECT (menu), "shell-menu-y", GINT_TO_POINTER (menu_y));
|
|
||||||
|
|
||||||
gtk_menu_popup (menu, NULL, NULL, shell_popup_menu_position_func, NULL,
|
|
||||||
button, time);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_write_string_to_stream:
|
|
||||||
* @stream: a #GOutputStream
|
|
||||||
* @str: a UTF-8 string to write to @stream
|
|
||||||
* @error: location to store GError
|
|
||||||
*
|
|
||||||
* Write a string to a GOutputStream as UTF-8. This is a workaround
|
|
||||||
* for not having binary buffers in GJS.
|
|
||||||
*
|
|
||||||
* Return value: %TRUE if write succeeded
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
shell_write_string_to_stream (GOutputStream *stream,
|
|
||||||
const char *str,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
return g_output_stream_write_all (stream, str, strlen (str),
|
|
||||||
NULL, NULL, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_get_current_time:
|
* shell_global_get_current_time:
|
||||||
* @global: A #ShellGlobal
|
* @global: A #ShellGlobal
|
||||||
@ -1746,73 +1449,6 @@ shell_global_create_app_launch_context (ShellGlobal *global)
|
|||||||
return (GAppLaunchContext *)context;
|
return (GAppLaunchContext *)context;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_set_property_mutable:
|
|
||||||
* @global: the #ShellGlobal
|
|
||||||
* @object: the "path" to a JS object, starting from the root object.
|
|
||||||
* (Eg, "global.stage" or "imports.gi.Gtk.Window.prototype")
|
|
||||||
* @property: a property on @object
|
|
||||||
* @mutable: %TRUE or %FALSE
|
|
||||||
*
|
|
||||||
* If @mutable is %TRUE, this clears the "permanent" and "readonly" flags
|
|
||||||
* on @property of @object. If @mutable is %FALSE, it sets them.
|
|
||||||
*
|
|
||||||
* You can use this to make it possible to modify properties that
|
|
||||||
* would otherwise be read-only from JavaScript.
|
|
||||||
*
|
|
||||||
* Return value: success or failure.
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
shell_global_set_property_mutable (ShellGlobal *global,
|
|
||||||
const char *object,
|
|
||||||
const char *property,
|
|
||||||
gboolean mutable)
|
|
||||||
{
|
|
||||||
JSContext *context = gjs_context_get_native_context (global->js_context);
|
|
||||||
char **parts;
|
|
||||||
JSObject *obj;
|
|
||||||
jsval val = JSVAL_VOID;
|
|
||||||
int i;
|
|
||||||
jsuint attrs;
|
|
||||||
JSBool found;
|
|
||||||
|
|
||||||
JS_BeginRequest (context);
|
|
||||||
JS_AddValueRoot (context, &val);
|
|
||||||
|
|
||||||
parts = g_strsplit (object, ".", -1);
|
|
||||||
obj = JS_GetGlobalObject (context);
|
|
||||||
for (i = 0; parts[i]; i++)
|
|
||||||
{
|
|
||||||
if (!JS_GetProperty (context, obj, parts[i], &val))
|
|
||||||
{
|
|
||||||
g_strfreev (parts);
|
|
||||||
goto out_error;
|
|
||||||
}
|
|
||||||
obj = JSVAL_TO_OBJECT (val);
|
|
||||||
}
|
|
||||||
g_strfreev (parts);
|
|
||||||
|
|
||||||
if (!JS_GetPropertyAttributes (context, obj, property, &attrs, &found) || !found)
|
|
||||||
goto out_error;
|
|
||||||
|
|
||||||
if (mutable)
|
|
||||||
attrs &= ~(JSPROP_PERMANENT | JSPROP_READONLY);
|
|
||||||
else
|
|
||||||
attrs |= (JSPROP_PERMANENT | JSPROP_READONLY);
|
|
||||||
|
|
||||||
if (!JS_SetPropertyAttributes (context, obj, property, attrs, &found))
|
|
||||||
goto out_error;
|
|
||||||
|
|
||||||
JS_RemoveValueRoot (context, &val);
|
|
||||||
JS_EndRequest (context);
|
|
||||||
return TRUE;
|
|
||||||
out_error:
|
|
||||||
gjs_log_exception (context, NULL);
|
|
||||||
JS_RemoveValueRoot (context, &val);
|
|
||||||
JS_EndRequest (context);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ShellLeisureFunction func;
|
ShellLeisureFunction func;
|
||||||
@ -2049,66 +1685,6 @@ gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* ShellGetTpContactCb:
|
|
||||||
* @connection: The connection
|
|
||||||
* @contacts: (element-type TelepathyGLib.Contact): List of contacts
|
|
||||||
* @failed: Array of failed contacts
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
shell_global_get_tp_contacts_cb (TpConnection *self,
|
|
||||||
guint n_contacts,
|
|
||||||
TpContact * const *contacts,
|
|
||||||
guint n_failed,
|
|
||||||
const TpHandle *failed,
|
|
||||||
const GError *error,
|
|
||||||
gpointer user_data,
|
|
||||||
GObject *weak_object)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
GList *contact_list = NULL;
|
|
||||||
for (i = 0; i < n_contacts; i++) {
|
|
||||||
contact_list = g_list_append(contact_list, contacts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
TpHandle *failed_list = g_new0 (TpHandle, n_failed + 1);
|
|
||||||
memcpy(failed_list, failed, n_failed);
|
|
||||||
|
|
||||||
((ShellGetTpContactCb)user_data)(self, contact_list, failed_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_get_tp_contacts:
|
|
||||||
* @self: A connection, which must be ready
|
|
||||||
* @n_handles: Number of handles in handles
|
|
||||||
* @handles: (array length=n_handles) (element-type uint): Array of handles
|
|
||||||
* @n_features: Number of features in features
|
|
||||||
* @features: (array length=n_features) (allow-none) (element-type uint):
|
|
||||||
* Array of features
|
|
||||||
* @callback: (scope async): User callback to run when the contacts are ready
|
|
||||||
*
|
|
||||||
* Wrap tp_connection_get_contacts_by_handle so we can transform the array
|
|
||||||
* into a null-terminated one, which gjs can handle.
|
|
||||||
* We send the original callback to tp_connection_get_contacts_by_handle as
|
|
||||||
* user_data, and we have our own function as callback, which does the
|
|
||||||
* transforming.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
shell_get_tp_contacts (TpConnection *self,
|
|
||||||
guint n_handles,
|
|
||||||
const TpHandle *handles,
|
|
||||||
guint n_features,
|
|
||||||
const TpContactFeature *features,
|
|
||||||
ShellGetTpContactCb callback)
|
|
||||||
{
|
|
||||||
tp_connection_get_contacts_by_handle(self, n_handles, handles,
|
|
||||||
n_features, features,
|
|
||||||
shell_global_get_tp_contacts_cb,
|
|
||||||
callback, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_launch_calendar_server:
|
* shell_global_launch_calendar_server:
|
||||||
* @global: The #ShellGlobal.
|
* @global: The #ShellGlobal.
|
||||||
@ -2162,103 +1738,3 @@ shell_global_launch_calendar_server (ShellGlobal *global)
|
|||||||
|
|
||||||
g_free (calendar_server_exe);
|
g_free (calendar_server_exe);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
shell_global_get_self_contact_features_cb (TpConnection *connection,
|
|
||||||
guint n_contacts,
|
|
||||||
TpContact * const *contacts,
|
|
||||||
const GError *error,
|
|
||||||
gpointer user_data,
|
|
||||||
GObject *weak_object)
|
|
||||||
{
|
|
||||||
if (error != NULL) {
|
|
||||||
g_print ("Failed to upgrade self contact: %s", error->message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
((ShellGetSelfContactFeaturesCb)user_data)(connection, *contacts);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_get_self_contact_features:
|
|
||||||
* @self: A connection, which must be ready
|
|
||||||
* @n_features: Number of features in features
|
|
||||||
* @features: (array length=n_features) (allow-none) (element-type uint):
|
|
||||||
* Array of features
|
|
||||||
* @callback: (scope async): User callback to run when the contact is ready
|
|
||||||
*
|
|
||||||
* Wrap tp_connection_upgrade_contacts due to the lack of support for
|
|
||||||
* proper arrays arguments in GJS.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
shell_get_self_contact_features (TpConnection *self,
|
|
||||||
guint n_features,
|
|
||||||
const TpContactFeature *features,
|
|
||||||
ShellGetSelfContactFeaturesCb callback)
|
|
||||||
{
|
|
||||||
TpContact *self_contact = tp_connection_get_self_contact (self);
|
|
||||||
|
|
||||||
tp_connection_upgrade_contacts (self, 1, &self_contact,
|
|
||||||
n_features, features,
|
|
||||||
shell_global_get_self_contact_features_cb,
|
|
||||||
callback, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_get_contact_events:
|
|
||||||
* @log_manager: A #TplLogManager
|
|
||||||
* @account: A #TpAccount
|
|
||||||
* @entity: A #TplEntity
|
|
||||||
* @num_events: The number of events to retrieve
|
|
||||||
* @callback: (scope async): User callback to run when the contact is ready
|
|
||||||
*
|
|
||||||
* Wrap tpl_log_manager_get_filtered_events_async because gjs cannot support
|
|
||||||
* multiple callbacks in the same function call.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
shell_get_contact_events (TplLogManager *log_manager,
|
|
||||||
TpAccount *account,
|
|
||||||
TplEntity *entity,
|
|
||||||
guint num_events,
|
|
||||||
GAsyncReadyCallback callback)
|
|
||||||
{
|
|
||||||
tpl_log_manager_get_filtered_events_async (log_manager,
|
|
||||||
account,
|
|
||||||
entity,
|
|
||||||
TPL_EVENT_MASK_TEXT,
|
|
||||||
num_events,
|
|
||||||
NULL, NULL,
|
|
||||||
callback, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_get_file_contents_utf8_sync:
|
|
||||||
* @path: UTF-8 encoded filename path
|
|
||||||
* @error: a #GError
|
|
||||||
*
|
|
||||||
* Synchronously load the contents of a file as a NUL terminated
|
|
||||||
* string, validating it as UTF-8. Embedded NUL characters count as
|
|
||||||
* invalid content.
|
|
||||||
*
|
|
||||||
* Returns: (transfer full): File contents
|
|
||||||
*/
|
|
||||||
char *
|
|
||||||
shell_get_file_contents_utf8_sync (const char *path,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
char *contents;
|
|
||||||
gsize len;
|
|
||||||
if (!g_file_get_contents (path, &contents, &len, error))
|
|
||||||
return NULL;
|
|
||||||
if (!g_utf8_validate (contents, len, NULL))
|
|
||||||
{
|
|
||||||
g_free (contents);
|
|
||||||
g_set_error (error,
|
|
||||||
G_IO_ERROR,
|
|
||||||
G_IO_ERROR_FAILED,
|
|
||||||
"File %s contains invalid UTF-8",
|
|
||||||
path);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
@ -7,8 +7,6 @@
|
|||||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <meta/meta-plugin.h>
|
#include <meta/meta-plugin.h>
|
||||||
#include <telepathy-glib/telepathy-glib.h>
|
|
||||||
#include <telepathy-logger/telepathy-logger.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
@ -22,42 +20,31 @@ typedef struct _ShellGlobalClass ShellGlobalClass;
|
|||||||
#define SHELL_IS_GLOBAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_GLOBAL))
|
#define SHELL_IS_GLOBAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_GLOBAL))
|
||||||
#define SHELL_GLOBAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_GLOBAL, ShellGlobalClass))
|
#define SHELL_GLOBAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_GLOBAL, ShellGlobalClass))
|
||||||
|
|
||||||
#define SHELL_GCONF_DIR "/desktop/gnome/shell"
|
|
||||||
|
|
||||||
struct _ShellGlobalClass
|
struct _ShellGlobalClass
|
||||||
{
|
{
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType shell_global_get_type (void) G_GNUC_CONST;
|
GType shell_global_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
gboolean shell_clutter_texture_set_from_pixbuf (ClutterTexture *texture,
|
ShellGlobal *shell_global_get (void);
|
||||||
GdkPixbuf *pixbuf);
|
|
||||||
|
|
||||||
ShellGlobal *shell_global_get (void);
|
MetaScreen *shell_global_get_screen (ShellGlobal *global);
|
||||||
|
GdkScreen *shell_global_get_gdk_screen (ShellGlobal *global);
|
||||||
|
GList *shell_global_get_window_actors (ShellGlobal *global);
|
||||||
|
GSList *shell_global_get_monitors (ShellGlobal *global);
|
||||||
|
MetaRectangle *shell_global_get_primary_monitor (ShellGlobal *global);
|
||||||
|
int shell_global_get_primary_monitor_index (ShellGlobal *global);
|
||||||
|
MetaRectangle *shell_global_get_focus_monitor (ShellGlobal *global);
|
||||||
|
GSettings *shell_global_get_settings (ShellGlobal *global);
|
||||||
|
guint32 shell_global_get_current_time (ShellGlobal *global);
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SHELL_CURSOR_DND_IN_DRAG,
|
|
||||||
SHELL_CURSOR_DND_UNSUPPORTED_TARGET,
|
|
||||||
SHELL_CURSOR_DND_MOVE,
|
|
||||||
SHELL_CURSOR_DND_COPY,
|
|
||||||
SHELL_CURSOR_POINTING_HAND
|
|
||||||
} ShellCursor;
|
|
||||||
|
|
||||||
void shell_global_set_cursor (ShellGlobal *global,
|
/* Input/event handling */
|
||||||
ShellCursor type);
|
gboolean shell_global_begin_modal (ShellGlobal *global,
|
||||||
|
guint32 timestamp);
|
||||||
void shell_global_unset_cursor (ShellGlobal *global);
|
void shell_global_end_modal (ShellGlobal *global,
|
||||||
|
guint32 timestamp);
|
||||||
MetaScreen *shell_global_get_screen (ShellGlobal *global);
|
|
||||||
|
|
||||||
GdkScreen *shell_global_get_gdk_screen (ShellGlobal *global);
|
|
||||||
|
|
||||||
gboolean shell_global_add_extension_importer (ShellGlobal *global,
|
|
||||||
const char *target_object_script,
|
|
||||||
const char *target_property,
|
|
||||||
const char *directory,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SHELL_STAGE_INPUT_MODE_NONREACTIVE,
|
SHELL_STAGE_INPUT_MODE_NONREACTIVE,
|
||||||
@ -66,127 +53,97 @@ typedef enum {
|
|||||||
SHELL_STAGE_INPUT_MODE_FULLSCREEN
|
SHELL_STAGE_INPUT_MODE_FULLSCREEN
|
||||||
} ShellStageInputMode;
|
} ShellStageInputMode;
|
||||||
|
|
||||||
void shell_global_set_stage_input_mode (ShellGlobal *global,
|
void shell_global_set_stage_input_mode (ShellGlobal *global,
|
||||||
ShellStageInputMode mode);
|
ShellStageInputMode mode);
|
||||||
void shell_global_set_stage_input_region (ShellGlobal *global,
|
void shell_global_set_stage_input_region (ShellGlobal *global,
|
||||||
GSList *rectangles);
|
GSList *rectangles);
|
||||||
|
|
||||||
GList *shell_global_get_window_actors (ShellGlobal *global);
|
/* X utilities */
|
||||||
|
typedef enum {
|
||||||
|
SHELL_CURSOR_DND_IN_DRAG,
|
||||||
|
SHELL_CURSOR_DND_UNSUPPORTED_TARGET,
|
||||||
|
SHELL_CURSOR_DND_MOVE,
|
||||||
|
SHELL_CURSOR_DND_COPY,
|
||||||
|
SHELL_CURSOR_POINTING_HAND
|
||||||
|
} ShellCursor;
|
||||||
|
|
||||||
gboolean shell_global_begin_modal (ShellGlobal *global,
|
void shell_global_set_cursor (ShellGlobal *global,
|
||||||
guint32 timestamp);
|
ShellCursor type);
|
||||||
void shell_global_end_modal (ShellGlobal *global,
|
void shell_global_unset_cursor (ShellGlobal *global);
|
||||||
guint32 timestamp);
|
|
||||||
|
|
||||||
gboolean shell_global_display_is_grabbed (ShellGlobal *global);
|
guint32 shell_global_create_pointer_barrier (ShellGlobal *global,
|
||||||
|
int x1,
|
||||||
|
int y1,
|
||||||
|
int x2,
|
||||||
|
int y2,
|
||||||
|
int directions);
|
||||||
|
void shell_global_destroy_pointer_barrier (ShellGlobal *global,
|
||||||
|
guint32 barrier);
|
||||||
|
|
||||||
void shell_global_reexec_self (ShellGlobal *global);
|
void shell_global_get_pointer (ShellGlobal *global,
|
||||||
|
int *x,
|
||||||
|
int *y,
|
||||||
|
ClutterModifierType *mods);
|
||||||
|
|
||||||
void shell_global_breakpoint (ShellGlobal *global);
|
|
||||||
|
|
||||||
gboolean shell_global_parse_search_provider (ShellGlobal *global,
|
/* JavaScript utilities */
|
||||||
const char *data,
|
void shell_global_gc (ShellGlobal *global);
|
||||||
char **name,
|
void shell_global_maybe_gc (ShellGlobal *global);
|
||||||
char **url,
|
|
||||||
GList **langs,
|
|
||||||
char **icon_data_uri,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
void shell_global_gc (ShellGlobal *global);
|
typedef struct {
|
||||||
|
guint glibc_uordblks;
|
||||||
|
|
||||||
void shell_global_maybe_gc (ShellGlobal *global);
|
guint js_bytes;
|
||||||
|
|
||||||
void shell_global_format_time_relative_pretty (ShellGlobal *global, guint delta, char **text, guint *next_update);
|
guint gjs_boxed;
|
||||||
|
guint gjs_gobject;
|
||||||
|
guint gjs_function;
|
||||||
|
guint gjs_closure;
|
||||||
|
} ShellMemoryInfo;
|
||||||
|
|
||||||
GSList *shell_global_get_monitors (ShellGlobal *global);
|
void shell_global_get_memory_info (ShellGlobal *global,
|
||||||
MetaRectangle *shell_global_get_primary_monitor (ShellGlobal *global);
|
ShellMemoryInfo *meminfo);
|
||||||
int shell_global_get_primary_monitor_index (ShellGlobal *global);
|
|
||||||
MetaRectangle *shell_global_get_focus_monitor (ShellGlobal *global);
|
|
||||||
|
|
||||||
guint32 shell_global_create_pointer_barrier (ShellGlobal *global,
|
|
||||||
int x1, int y1, int x2, int y2,
|
|
||||||
int directions);
|
|
||||||
void shell_global_destroy_pointer_barrier (ShellGlobal *global,
|
|
||||||
guint32 barrier);
|
|
||||||
|
|
||||||
void shell_global_get_pointer (ShellGlobal *global,
|
/* Run-at-leisure API */
|
||||||
int *x,
|
void shell_global_begin_work (ShellGlobal *global);
|
||||||
int *y,
|
void shell_global_end_work (ShellGlobal *global);
|
||||||
ClutterModifierType *mods);
|
|
||||||
void shell_global_sync_pointer (ShellGlobal *global);
|
|
||||||
|
|
||||||
GSettings *shell_global_get_settings (ShellGlobal *global);
|
|
||||||
|
|
||||||
ClutterModifierType shell_get_event_state (ClutterEvent *event);
|
|
||||||
|
|
||||||
void shell_popup_menu (GtkMenu *menu, int button, guint32 time,
|
|
||||||
int menu_x, int menu_y);
|
|
||||||
|
|
||||||
gboolean shell_write_string_to_stream (GOutputStream *stream,
|
|
||||||
const char *str,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
guint32 shell_global_get_current_time (ShellGlobal *global);
|
|
||||||
|
|
||||||
GAppLaunchContext *shell_global_create_app_launch_context (ShellGlobal *global);
|
|
||||||
|
|
||||||
gboolean shell_global_set_property_mutable (ShellGlobal *global,
|
|
||||||
const char *object,
|
|
||||||
const char *property,
|
|
||||||
gboolean mutable);
|
|
||||||
|
|
||||||
void shell_global_begin_work (ShellGlobal *global);
|
|
||||||
void shell_global_end_work (ShellGlobal *global);
|
|
||||||
|
|
||||||
typedef void (*ShellLeisureFunction) (gpointer data);
|
typedef void (*ShellLeisureFunction) (gpointer data);
|
||||||
|
|
||||||
void shell_global_run_at_leisure (ShellGlobal *global,
|
void shell_global_run_at_leisure (ShellGlobal *global,
|
||||||
ShellLeisureFunction func,
|
ShellLeisureFunction func,
|
||||||
gpointer user_data,
|
gpointer user_data,
|
||||||
GDestroyNotify notify);
|
GDestroyNotify notify);
|
||||||
|
|
||||||
void shell_global_play_theme_sound (ShellGlobal *global,
|
|
||||||
guint id,
|
|
||||||
const char *name);
|
|
||||||
void shell_global_cancel_theme_sound (ShellGlobal *global,
|
|
||||||
guint id);
|
|
||||||
|
|
||||||
|
|
||||||
void shell_global_notify_error (ShellGlobal *global,
|
/* Misc utilities / Shell API */
|
||||||
const char *msg,
|
gboolean shell_global_add_extension_importer (ShellGlobal *global,
|
||||||
const char *details);
|
const char *target_object_script,
|
||||||
|
const char *target_property,
|
||||||
|
const char *directory,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
void shell_global_init_xdnd (ShellGlobal *global);
|
void shell_global_sync_pointer (ShellGlobal *global);
|
||||||
|
|
||||||
typedef void (*ShellGetTpContactCb) (TpConnection *connection,
|
GAppLaunchContext *
|
||||||
GList *contacts,
|
shell_global_create_app_launch_context (ShellGlobal *global);
|
||||||
TpHandle *failed);
|
|
||||||
|
|
||||||
void shell_get_tp_contacts (TpConnection *self,
|
void shell_global_play_theme_sound (ShellGlobal *global,
|
||||||
guint n_handles,
|
guint id,
|
||||||
const TpHandle *handles,
|
const char *name);
|
||||||
guint n_features,
|
void shell_global_cancel_theme_sound (ShellGlobal *global,
|
||||||
const TpContactFeature *features,
|
guint id);
|
||||||
ShellGetTpContactCb callback);
|
|
||||||
|
|
||||||
void shell_global_launch_calendar_server (ShellGlobal *global);
|
void shell_global_notify_error (ShellGlobal *global,
|
||||||
|
const char *msg,
|
||||||
|
const char *details);
|
||||||
|
|
||||||
typedef void (*ShellGetSelfContactFeaturesCb) (TpConnection *connection,
|
void shell_global_init_xdnd (ShellGlobal *global);
|
||||||
TpContact *contact);
|
|
||||||
|
|
||||||
void shell_get_self_contact_features (TpConnection *self,
|
void shell_global_reexec_self (ShellGlobal *global);
|
||||||
guint n_features,
|
|
||||||
const TpContactFeature *features,
|
|
||||||
ShellGetSelfContactFeaturesCb callback);
|
|
||||||
|
|
||||||
void shell_get_contact_events (TplLogManager *log_manager,
|
void shell_global_launch_calendar_server (ShellGlobal *global);
|
||||||
TpAccount *account,
|
|
||||||
TplEntity *entity,
|
|
||||||
guint num_events,
|
|
||||||
GAsyncReadyCallback callback);
|
|
||||||
|
|
||||||
char *shell_get_file_contents_utf8_sync (const char *path,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -62,8 +62,6 @@ struct _ShellRecorder {
|
|||||||
|
|
||||||
gboolean only_paint; /* Used to temporarily suppress recording */
|
gboolean only_paint; /* Used to temporarily suppress recording */
|
||||||
|
|
||||||
gboolean have_pack_invert; /* True when GL_MESA_pack_invert is available */
|
|
||||||
|
|
||||||
int framerate;
|
int framerate;
|
||||||
char *pipeline_description;
|
char *pipeline_description;
|
||||||
char *filename;
|
char *filename;
|
||||||
@ -414,6 +412,8 @@ recorder_fetch_cursor_image (ShellRecorder *recorder)
|
|||||||
*(guint32 *)(data + i * stride + 4 * j) = cursor_image->pixels[i * cursor_image->width + j];
|
*(guint32 *)(data + i * stride + 4 * j) = cursor_image->pixels[i * cursor_image->width + j];
|
||||||
|
|
||||||
cairo_surface_mark_dirty (recorder->cursor_image);
|
cairo_surface_mark_dirty (recorder->cursor_image);
|
||||||
|
|
||||||
|
XFree (cursor_image);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Overlay the cursor image on the frame. We draw the cursor image
|
/* Overlay the cursor image on the frame. We draw the cursor image
|
||||||
@ -450,15 +450,7 @@ recorder_draw_cursor (ShellRecorder *recorder,
|
|||||||
recorder->stage_height,
|
recorder->stage_height,
|
||||||
recorder->stage_width * 4);
|
recorder->stage_width * 4);
|
||||||
|
|
||||||
/* When not using GL_MESA_pack_invert the data we get from glReadPixels is "upside down",
|
|
||||||
* so transform our cairo drawing to match */
|
|
||||||
cr = cairo_create (surface);
|
cr = cairo_create (surface);
|
||||||
if (!recorder->have_pack_invert)
|
|
||||||
{
|
|
||||||
cairo_translate(cr, 0, recorder->stage_height);
|
|
||||||
cairo_scale(cr, 1, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_set_source_surface (cr,
|
cairo_set_source_surface (cr,
|
||||||
recorder->cursor_image,
|
recorder->cursor_image,
|
||||||
recorder->pointer_x - recorder->cursor_hot_x,
|
recorder->pointer_x - recorder->cursor_hot_x,
|
||||||
@ -534,36 +526,11 @@ recorder_record_frame (ShellRecorder *recorder)
|
|||||||
|
|
||||||
GST_BUFFER_TIMESTAMP(buffer) = get_wall_time() - recorder->start_time;
|
GST_BUFFER_TIMESTAMP(buffer) = get_wall_time() - recorder->start_time;
|
||||||
|
|
||||||
/* We could use cogl_read_pixels, but it only currently supports
|
cogl_read_pixels (0, 0,
|
||||||
* COGL_PIXEL_FORMAT_RGBA_8888, while we prefer the native framebuffer
|
recorder->stage_width, recorder->stage_height,
|
||||||
* format. (COGL_PIXEL_FORMAT_ARGB_8888_PRE,
|
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||||
* COGL_PIXEL_FORMAT_BGRA_PRE, depending on endianess)
|
COGL_PIXEL_FORMAT_BGRA_8888_PRE,
|
||||||
*
|
data);
|
||||||
* http://bugzilla.openedhand.com/show_bug.cgi?id=1959
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Flush any primitives that Cogl has batched up */
|
|
||||||
cogl_flush ();
|
|
||||||
|
|
||||||
/* Set the parameters for how data is stored; these are the initial
|
|
||||||
* values but Cogl will have modified them for its own purposes */
|
|
||||||
glPixelStorei (GL_PACK_ALIGNMENT, 4);
|
|
||||||
glPixelStorei (GL_PACK_ROW_LENGTH, 0);
|
|
||||||
glPixelStorei (GL_PACK_SKIP_PIXELS, 0);
|
|
||||||
glPixelStorei (GL_PACK_SKIP_ROWS, 0);
|
|
||||||
|
|
||||||
if (recorder->have_pack_invert)
|
|
||||||
glPixelStorei (GL_PACK_INVERT_MESA, TRUE);
|
|
||||||
|
|
||||||
glReadBuffer (GL_BACK_LEFT);
|
|
||||||
glReadPixels (0, 0,
|
|
||||||
recorder->stage_width, recorder->stage_height,
|
|
||||||
GL_BGRA,
|
|
||||||
GL_UNSIGNED_INT_8_8_8_8_REV,
|
|
||||||
data);
|
|
||||||
|
|
||||||
if (recorder->have_pack_invert)
|
|
||||||
glPixelStorei (GL_PACK_INVERT_MESA, FALSE);
|
|
||||||
|
|
||||||
recorder_draw_cursor (recorder, buffer);
|
recorder_draw_cursor (recorder, buffer);
|
||||||
|
|
||||||
@ -866,7 +833,6 @@ recorder_set_stage (ShellRecorder *recorder,
|
|||||||
if (recorder->stage)
|
if (recorder->stage)
|
||||||
{
|
{
|
||||||
int error_base;
|
int error_base;
|
||||||
const char *gl_extensions;
|
|
||||||
|
|
||||||
recorder->stage = stage;
|
recorder->stage = stage;
|
||||||
g_signal_connect (recorder->stage, "destroy",
|
g_signal_connect (recorder->stage, "destroy",
|
||||||
@ -891,8 +857,6 @@ recorder_set_stage (ShellRecorder *recorder,
|
|||||||
XFixesDisplayCursorNotifyMask);
|
XFixesDisplayCursorNotifyMask);
|
||||||
|
|
||||||
clutter_stage_ensure_current (stage);
|
clutter_stage_ensure_current (stage);
|
||||||
gl_extensions = (const char *)glGetString (GL_EXTENSIONS);
|
|
||||||
recorder->have_pack_invert = strstr (gl_extensions, "GL_MESA_pack_invert") != NULL;
|
|
||||||
|
|
||||||
recorder_get_initial_cursor_position (recorder);
|
recorder_get_initial_cursor_position (recorder);
|
||||||
}
|
}
|
||||||
@ -1093,8 +1057,6 @@ recorder_pipeline_add_source (RecorderPipeline *pipeline)
|
|||||||
GstPad *sink_pad = NULL, *src_pad = NULL;
|
GstPad *sink_pad = NULL, *src_pad = NULL;
|
||||||
gboolean result = FALSE;
|
gboolean result = FALSE;
|
||||||
GstElement *ffmpegcolorspace;
|
GstElement *ffmpegcolorspace;
|
||||||
GstElement *videoflip;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
sink_pad = gst_bin_find_unlinked_pad (GST_BIN (pipeline->pipeline), GST_PAD_SINK);
|
sink_pad = gst_bin_find_unlinked_pad (GST_BIN (pipeline->pipeline), GST_PAD_SINK);
|
||||||
if (sink_pad == NULL)
|
if (sink_pad == NULL)
|
||||||
@ -1124,38 +1086,8 @@ recorder_pipeline_add_source (RecorderPipeline *pipeline)
|
|||||||
}
|
}
|
||||||
gst_bin_add (GST_BIN (pipeline->pipeline), ffmpegcolorspace);
|
gst_bin_add (GST_BIN (pipeline->pipeline), ffmpegcolorspace);
|
||||||
|
|
||||||
/* glReadPixels gives us an upside-down buffer, so we have to flip it back
|
gst_element_link_many (pipeline->src, ffmpegcolorspace, NULL);
|
||||||
* right-side up.
|
src_pad = gst_element_get_static_pad (ffmpegcolorspace, "src");
|
||||||
*
|
|
||||||
* When available MESA_pack_invert extension is used to avoid the
|
|
||||||
* flip entirely, since the data is actually stored in the frame buffer
|
|
||||||
* in the order that we expect.
|
|
||||||
*
|
|
||||||
* We use gst_parse_launch to avoid having to know the enum value for flip-vertical
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!pipeline->recorder->have_pack_invert)
|
|
||||||
{
|
|
||||||
videoflip = gst_parse_launch_full ("videoflip method=vertical-flip", NULL,
|
|
||||||
GST_PARSE_FLAG_FATAL_ERRORS,
|
|
||||||
&error);
|
|
||||||
if (videoflip == NULL)
|
|
||||||
{
|
|
||||||
g_warning("Can't create videoflip element: %s", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_bin_add (GST_BIN (pipeline->pipeline), videoflip);
|
|
||||||
gst_element_link_many (pipeline->src, ffmpegcolorspace, videoflip, NULL);
|
|
||||||
|
|
||||||
src_pad = gst_element_get_static_pad (videoflip, "src");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gst_element_link_many (pipeline->src, ffmpegcolorspace, NULL);
|
|
||||||
src_pad = gst_element_get_static_pad (ffmpegcolorspace, "src");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!src_pad)
|
if (!src_pad)
|
||||||
{
|
{
|
||||||
|
373
src/shell-tp-client.c
Normal file
@ -0,0 +1,373 @@
|
|||||||
|
#include "shell-tp-client.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <telepathy-glib/telepathy-glib.h>
|
||||||
|
|
||||||
|
G_DEFINE_TYPE(ShellTpClient, shell_tp_client, TP_TYPE_BASE_CLIENT)
|
||||||
|
|
||||||
|
struct _ShellTpClientPrivate
|
||||||
|
{
|
||||||
|
ShellTpClientObserveChannelsImpl observe_impl;
|
||||||
|
gpointer user_data_obs;
|
||||||
|
GDestroyNotify destroy_obs;
|
||||||
|
|
||||||
|
ShellTpClientApproveChannelsImpl approve_channels_impl;
|
||||||
|
gpointer user_data_approve_channels;
|
||||||
|
GDestroyNotify destroy_approve_channels;
|
||||||
|
|
||||||
|
ShellTpClientHandleChannelsImpl handle_channels_impl;
|
||||||
|
gpointer user_data_handle_channels;
|
||||||
|
GDestroyNotify destroy_handle_channels;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ShellTpClientObserveChannelsImpl:
|
||||||
|
* @client: a #ShellTpClient instance
|
||||||
|
* @account: a #TpAccount having %TP_ACCOUNT_FEATURE_CORE prepared if possible
|
||||||
|
* @connection: a #TpConnection having %TP_CONNECTION_FEATURE_CORE prepared
|
||||||
|
* if possible
|
||||||
|
* @channels: (element-type TelepathyGLib.Channel): a #GList of #TpChannel,
|
||||||
|
* all having %TP_CHANNEL_FEATURE_CORE prepared if possible
|
||||||
|
* @dispatch_operation: (allow-none): a #TpChannelDispatchOperation or %NULL;
|
||||||
|
* the dispatch_operation is not guaranteed to be prepared
|
||||||
|
* @requests: (element-type TelepathyGLib.ChannelRequest): a #GList of
|
||||||
|
* #TpChannelRequest, all having their object-path defined but are not
|
||||||
|
* guaranteed to be prepared.
|
||||||
|
* @context: a #TpObserveChannelsContext representing the context of this
|
||||||
|
* D-Bus call
|
||||||
|
*
|
||||||
|
* Signature of the implementation of the ObserveChannels method.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ShellTpClientApproveChannelsImpl:
|
||||||
|
* @client: a #ShellTpClient instance
|
||||||
|
* @account: a #TpAccount having %TP_ACCOUNT_FEATURE_CORE prepared if possible
|
||||||
|
* @connection: a #TpConnection having %TP_CONNECTION_FEATURE_CORE prepared
|
||||||
|
* if possible
|
||||||
|
* @channels: (element-type TelepathyGLib.Channel): a #GList of #TpChannel,
|
||||||
|
* all having %TP_CHANNEL_FEATURE_CORE prepared if possible
|
||||||
|
* @dispatch_operation: (allow-none): a #TpChannelDispatchOperation or %NULL;
|
||||||
|
* the dispatch_operation is not guaranteed to be prepared
|
||||||
|
* @context: a #TpAddDispatchOperationContext representing the context of this
|
||||||
|
* D-Bus call
|
||||||
|
*
|
||||||
|
* Signature of the implementation of the AddDispatchOperation method.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ShellTpClientHandleChannelsImpl:
|
||||||
|
* @client: a #ShellTpClient instance
|
||||||
|
* @account: a #TpAccount having %TP_ACCOUNT_FEATURE_CORE prepared if possible
|
||||||
|
* @connection: a #TpConnection having %TP_CONNECTION_FEATURE_CORE prepared
|
||||||
|
* if possible
|
||||||
|
* @channels: (element-type TelepathyGLib.Channel): a #GList of #TpChannel,
|
||||||
|
* all having %TP_CHANNEL_FEATURE_CORE prepared if possible
|
||||||
|
* @requests_satisfied: (element-type TelepathyGLib.ChannelRequest): a #GList of
|
||||||
|
* #TpChannelRequest having their object-path defined but are not guaranteed
|
||||||
|
* to be prepared.
|
||||||
|
* @user_action_time: the time at which user action occurred, or one of the
|
||||||
|
* special values %TP_USER_ACTION_TIME_NOT_USER_ACTION or
|
||||||
|
* %TP_USER_ACTION_TIME_CURRENT_TIME
|
||||||
|
* (see #TpAccountChannelRequest:user-action-time for details)
|
||||||
|
* @context: a #TpHandleChannelsContext representing the context of this
|
||||||
|
* D-Bus call
|
||||||
|
*
|
||||||
|
* Signature of the implementation of the HandleChannels method.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
shell_tp_client_init (ShellTpClient *self)
|
||||||
|
{
|
||||||
|
GHashTable *filter;
|
||||||
|
|
||||||
|
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, SHELL_TYPE_TP_CLIENT,
|
||||||
|
ShellTpClientPrivate);
|
||||||
|
|
||||||
|
/* We only care about single-user text-based chats */
|
||||||
|
filter = tp_asv_new (
|
||||||
|
TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
|
||||||
|
TP_IFACE_CHANNEL_TYPE_TEXT,
|
||||||
|
TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT,
|
||||||
|
TP_HANDLE_TYPE_CONTACT,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
/* Observer */
|
||||||
|
tp_base_client_set_observer_recover (TP_BASE_CLIENT (self), TRUE);
|
||||||
|
|
||||||
|
tp_base_client_add_observer_filter (TP_BASE_CLIENT (self), filter);
|
||||||
|
|
||||||
|
/* Approver */
|
||||||
|
tp_base_client_add_approver_filter (TP_BASE_CLIENT (self), filter);
|
||||||
|
|
||||||
|
/* Handler */
|
||||||
|
tp_base_client_add_handler_filter (TP_BASE_CLIENT (self), filter);
|
||||||
|
|
||||||
|
g_hash_table_unref (filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
observe_channels (TpBaseClient *client,
|
||||||
|
TpAccount *account,
|
||||||
|
TpConnection *connection,
|
||||||
|
GList *channels,
|
||||||
|
TpChannelDispatchOperation *dispatch_operation,
|
||||||
|
GList *requests,
|
||||||
|
TpObserveChannelsContext *context)
|
||||||
|
{
|
||||||
|
ShellTpClient *self = (ShellTpClient *) client;
|
||||||
|
|
||||||
|
g_assert (self->priv->observe_impl != NULL);
|
||||||
|
|
||||||
|
self->priv->observe_impl (self, account, connection, channels,
|
||||||
|
dispatch_operation, requests, context, self->priv->user_data_obs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_dispatch_operation (TpBaseClient *client,
|
||||||
|
TpAccount *account,
|
||||||
|
TpConnection *connection,
|
||||||
|
GList *channels,
|
||||||
|
TpChannelDispatchOperation *dispatch_operation,
|
||||||
|
TpAddDispatchOperationContext *context)
|
||||||
|
{
|
||||||
|
ShellTpClient *self = (ShellTpClient *) client;
|
||||||
|
|
||||||
|
g_assert (self->priv->approve_channels_impl != NULL);
|
||||||
|
|
||||||
|
self->priv->approve_channels_impl (self, account, connection, channels,
|
||||||
|
dispatch_operation, context, self->priv->user_data_approve_channels);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_channels (TpBaseClient *client,
|
||||||
|
TpAccount *account,
|
||||||
|
TpConnection *connection,
|
||||||
|
GList *channels,
|
||||||
|
GList *requests_satisfied,
|
||||||
|
gint64 user_action_time,
|
||||||
|
TpHandleChannelsContext *context)
|
||||||
|
{
|
||||||
|
ShellTpClient *self = (ShellTpClient *) client;
|
||||||
|
|
||||||
|
g_assert (self->priv->handle_channels_impl != NULL);
|
||||||
|
|
||||||
|
self->priv->handle_channels_impl (self, account, connection, channels,
|
||||||
|
requests_satisfied, user_action_time, context,
|
||||||
|
self->priv->user_data_handle_channels);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shell_tp_client_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
ShellTpClient *self = SHELL_TP_CLIENT (object);
|
||||||
|
void (*dispose) (GObject *) =
|
||||||
|
G_OBJECT_CLASS (shell_tp_client_parent_class)->dispose;
|
||||||
|
|
||||||
|
if (self->priv->destroy_obs != NULL)
|
||||||
|
{
|
||||||
|
self->priv->destroy_obs (self->priv->user_data_obs);
|
||||||
|
self->priv->destroy_obs = NULL;
|
||||||
|
self->priv->user_data_obs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->priv->destroy_approve_channels != NULL)
|
||||||
|
{
|
||||||
|
self->priv->destroy_approve_channels (self->priv->user_data_approve_channels);
|
||||||
|
self->priv->destroy_approve_channels = NULL;
|
||||||
|
self->priv->user_data_approve_channels = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->priv->destroy_handle_channels != NULL)
|
||||||
|
{
|
||||||
|
self->priv->destroy_handle_channels (self->priv->user_data_handle_channels);
|
||||||
|
self->priv->destroy_handle_channels = NULL;
|
||||||
|
self->priv->user_data_handle_channels = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dispose != NULL)
|
||||||
|
dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shell_tp_client_class_init (ShellTpClientClass *cls)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (cls);
|
||||||
|
TpBaseClientClass *base_clt_cls = TP_BASE_CLIENT_CLASS (cls);
|
||||||
|
|
||||||
|
g_type_class_add_private (cls, sizeof (ShellTpClientPrivate));
|
||||||
|
|
||||||
|
object_class->dispose = shell_tp_client_dispose;
|
||||||
|
|
||||||
|
base_clt_cls->observe_channels = observe_channels;
|
||||||
|
base_clt_cls->add_dispatch_operation = add_dispatch_operation;
|
||||||
|
base_clt_cls->handle_channels = handle_channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
shell_tp_client_set_observe_channels_func (ShellTpClient *self,
|
||||||
|
ShellTpClientObserveChannelsImpl observe_impl,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify destroy)
|
||||||
|
{
|
||||||
|
g_assert (self->priv->observe_impl == NULL);
|
||||||
|
|
||||||
|
self->priv->observe_impl = observe_impl;
|
||||||
|
self->priv->user_data_obs = user_data;
|
||||||
|
self->priv->destroy_obs = destroy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
shell_tp_client_set_approve_channels_func (ShellTpClient *self,
|
||||||
|
ShellTpClientApproveChannelsImpl approve_channels_impl,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify destroy)
|
||||||
|
{
|
||||||
|
g_assert (self->priv->approve_channels_impl == NULL);
|
||||||
|
|
||||||
|
self->priv->approve_channels_impl = approve_channels_impl;
|
||||||
|
self->priv->user_data_approve_channels = user_data;
|
||||||
|
self->priv->destroy_approve_channels = destroy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
shell_tp_client_set_handle_channels_func (ShellTpClient *self,
|
||||||
|
ShellTpClientHandleChannelsImpl handle_channels_impl,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify destroy)
|
||||||
|
{
|
||||||
|
g_assert (self->priv->handle_channels_impl == NULL);
|
||||||
|
|
||||||
|
self->priv->handle_channels_impl = handle_channels_impl;
|
||||||
|
self->priv->user_data_handle_channels = user_data;
|
||||||
|
self->priv->destroy_handle_channels = destroy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Telepathy utility functions */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ShellGetTpContactCb:
|
||||||
|
* @connection: The connection
|
||||||
|
* @contacts: (element-type TelepathyGLib.Contact): List of contacts
|
||||||
|
* @failed: Array of failed contacts
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
shell_global_get_tp_contacts_cb (TpConnection *self,
|
||||||
|
guint n_contacts,
|
||||||
|
TpContact * const *contacts,
|
||||||
|
guint n_failed,
|
||||||
|
const TpHandle *failed,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data,
|
||||||
|
GObject *weak_object)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
GList *contact_list = NULL;
|
||||||
|
for (i = 0; i < n_contacts; i++) {
|
||||||
|
contact_list = g_list_append(contact_list, contacts[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
TpHandle *failed_list = g_new0 (TpHandle, n_failed + 1);
|
||||||
|
memcpy(failed_list, failed, n_failed);
|
||||||
|
|
||||||
|
((ShellGetTpContactCb)user_data)(self, contact_list, failed_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shell_get_tp_contacts:
|
||||||
|
* @self: A connection, which must be ready
|
||||||
|
* @n_handles: Number of handles in handles
|
||||||
|
* @handles: (array length=n_handles) (element-type uint): Array of handles
|
||||||
|
* @n_features: Number of features in features
|
||||||
|
* @features: (array length=n_features) (allow-none) (element-type uint):
|
||||||
|
* Array of features
|
||||||
|
* @callback: (scope async): User callback to run when the contacts are ready
|
||||||
|
*
|
||||||
|
* Wrap tp_connection_get_contacts_by_handle so we can transform the array
|
||||||
|
* into a null-terminated one, which gjs can handle.
|
||||||
|
* We send the original callback to tp_connection_get_contacts_by_handle as
|
||||||
|
* user_data, and we have our own function as callback, which does the
|
||||||
|
* transforming.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shell_get_tp_contacts (TpConnection *self,
|
||||||
|
guint n_handles,
|
||||||
|
const TpHandle *handles,
|
||||||
|
guint n_features,
|
||||||
|
const TpContactFeature *features,
|
||||||
|
ShellGetTpContactCb callback)
|
||||||
|
{
|
||||||
|
tp_connection_get_contacts_by_handle(self, n_handles, handles,
|
||||||
|
n_features, features,
|
||||||
|
shell_global_get_tp_contacts_cb,
|
||||||
|
callback, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shell_global_get_self_contact_features_cb (TpConnection *connection,
|
||||||
|
guint n_contacts,
|
||||||
|
TpContact * const *contacts,
|
||||||
|
const GError *error,
|
||||||
|
gpointer user_data,
|
||||||
|
GObject *weak_object)
|
||||||
|
{
|
||||||
|
if (error != NULL) {
|
||||||
|
g_print ("Failed to upgrade self contact: %s", error->message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
((ShellGetSelfContactFeaturesCb)user_data)(connection, *contacts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shell_get_self_contact_features:
|
||||||
|
* @self: A connection, which must be ready
|
||||||
|
* @n_features: Number of features in features
|
||||||
|
* @features: (array length=n_features) (allow-none) (element-type uint):
|
||||||
|
* Array of features
|
||||||
|
* @callback: (scope async): User callback to run when the contact is ready
|
||||||
|
*
|
||||||
|
* Wrap tp_connection_upgrade_contacts due to the lack of support for
|
||||||
|
* proper arrays arguments in GJS.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shell_get_self_contact_features (TpConnection *self,
|
||||||
|
guint n_features,
|
||||||
|
const TpContactFeature *features,
|
||||||
|
ShellGetSelfContactFeaturesCb callback)
|
||||||
|
{
|
||||||
|
TpContact *self_contact = tp_connection_get_self_contact (self);
|
||||||
|
|
||||||
|
tp_connection_upgrade_contacts (self, 1, &self_contact,
|
||||||
|
n_features, features,
|
||||||
|
shell_global_get_self_contact_features_cb,
|
||||||
|
callback, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shell_get_contact_events:
|
||||||
|
* @log_manager: A #TplLogManager
|
||||||
|
* @account: A #TpAccount
|
||||||
|
* @entity: A #TplEntity
|
||||||
|
* @num_events: The number of events to retrieve
|
||||||
|
* @callback: (scope async): User callback to run when the contact is ready
|
||||||
|
*
|
||||||
|
* Wrap tpl_log_manager_get_filtered_events_async because gjs cannot support
|
||||||
|
* multiple callbacks in the same function call.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shell_get_contact_events (TplLogManager *log_manager,
|
||||||
|
TpAccount *account,
|
||||||
|
TplEntity *entity,
|
||||||
|
guint num_events,
|
||||||
|
GAsyncReadyCallback callback)
|
||||||
|
{
|
||||||
|
tpl_log_manager_get_filtered_events_async (log_manager,
|
||||||
|
account,
|
||||||
|
entity,
|
||||||
|
TPL_EVENT_MASK_TEXT,
|
||||||
|
num_events,
|
||||||
|
NULL, NULL,
|
||||||
|
callback, NULL);
|
||||||
|
}
|