Compare commits

..

50 Commits

Author SHA1 Message Date
Cédric Valmary
eb695d6c3d Added Occitan translation 2016-03-21 18:53:10 +00:00
Gil Forcada
810f35c498 Oops 2014-02-21 23:08:11 +01:00
Gil Forcada
78dae21171 [l10n] Update Catalan translation 2014-02-21 22:55:10 +01:00
Balázs Úr
257c852908 Updated Hungarian translation 2013-10-13 13:38:10 +02:00
Kenneth Nielsen
e6b218ed0f Updated Danish translation 2013-10-07 18:42:57 +02:00
Fran Diéguez
6c1793b247 Updated Galician translations 2013-09-28 16:30:33 +02:00
Andreas N
26df2dfc14 Updated Norwegian Nynorsk translation 2011-12-26 14:33:23 +01:00
Xandru Armesto
38829f7405 Added asturian language 2011-09-30 21:05:25 +02:00
Xandru Armesto
485d773fdf Updated asturian translation 2011-09-30 21:05:14 +02:00
Arash Mousavi
1826108cb5 Updated Persian translation 2011-08-23 00:19:27 +04:30
Ray Strode
71801841e9 gdm: ignore user-removed signals for untracked users
If we don't know about a user, we don't care if it goes away,
and we shouldn't try to remove it from the book keeping.

https://bugzilla.gnome.org/show_bug.cgi?id=647893
(cherry picked from commit ff81659b9e)
2011-06-29 10:06:14 -04:00
krishnababu k
9e8dbe76a9 Corrections in Telugu file 2011-06-15 20:11:00 +05:30
krishnababu k
2420fd343b Added entry in LINGUAS for telugu locale 2011-06-15 17:20:14 +05:30
krishnababu k
bbd049b073 Newly added Telugu Translations done by Praveen Illa 2011-06-15 17:19:40 +05:30
Seán de Búrca
6bdd3f6cf6 Updated Irish translation. 2011-05-30 11:26:24 -06:00
Gil Forcada
e9d518fc3b [l10n]Added Catalan (Valencian) translation 2011-05-29 18:36:57 +02:00
Owen W. Taylor
73f7991264 Bump version to 3.0.2
Update NEWS
2011-05-25 15:26:34 -04:00
Colin Walters
976f26cb26 StTextureCache: Fix leak of key string
Also micro-optimize by avoiding another strdup(), instead pass
ownership of the string when we can.

https://bugzilla.gnome.org/show_bug.cgi?id=649508
2011-05-25 14:17:07 -04:00
Colin Walters
1278e31b65 StTextureCache: plug leak in not-found icon case
Need to free the key too.

https://bugzilla.gnome.org/show_bug.cgi?id=649508
2011-05-25 14:16:29 -04:00
Christopher Aillon
92f27a3c00 st-scroll-view: remove spurious assignment of uninitialized data
https://bugzilla.gnome.org/show_bug.cgi?id=649596
2011-05-25 14:12:25 -04:00
Jasper St. Pierre
28667a686d workspace: Use Main.uiGroup instead of global.stage
The mouse-wheel zoom "easter egg" broke when using the magnifier
because it was using global.stage. Fix it to use Main.uiGroup instead.

https://bugzilla.gnome.org/show_bug.cgi?id=649632
2011-05-25 14:12:19 -04:00
Adel Gadllah
783683a12c workspacesView: Don't change opacity during dnd
We used used to indicate to the user the ability to move to another workspace
during dnd by highligthing the adjacent workspaces on hover.

This was done by changing the workspace's opacity to 200 and set it to
255 for the highlighted adjacent ones.

This is now no longer needed as the design was completely changed since
then (overview relayout; we no longer represent workspaces in the way
we did before) and introduces a bug where we don't properly reset the
opacity after the drag action, so just remove that code.

https://bugzilla.gnome.org/show_bug.cgi?id=648983
2011-05-25 14:12:11 -04:00
Jasper St. Pierre
fc70446050 history: Fix navigation when entering a repeat
If the user typed "a", hit up, and pressed enter again, we wouldn't re-set the
history pointer to the end, so the broken navigation would instead go to the
entry before that.

https://bugzilla.gnome.org/show_bug.cgi?id=648765
2011-05-25 14:12:01 -04:00
Jasper St. Pierre
70ab08aefd workspace: End zooming when starting a window drag
The mouse-wheel zooming "easter egg" breaks horribly when you
drag a window, due to ugly lightbox reparenting tricks it uses.

For now, just end any zoom before we drag the window around.

https://bugzilla.gnome.org/show_bug.cgi?id=649632
2011-05-25 14:11:52 -04:00
Jasper St. Pierre
ca6308ae64 shell-app: Fix a case where last_user_time isn't updated.
When activating an uninteresting window, the last_user_time isn't updated,
because we aren't tracking the window that the user_time gets updated on.
Hack around this by setting the last_user_time in shell_app_activate when
activating an uninteresting window.

https://bugzilla.gnome.org/show_bug.cgi?id=643302
2011-05-25 14:11:46 -04:00
Dan Williams
4dcbb84f06 network: fix modem connected state check
There is no CONNECTED state for devices, it's ACTIVATED.

https://bugzilla.gnome.org/show_bug.cgi?id=650124
2011-05-25 14:11:40 -04:00
Rui Matos
f4e6f7074e panel: Don't propagate button-release-event in _onCornerClicked()
Since both the hot corner's ClutterGroup and the hot corner's
ClutterRectangle button-release-event is connected to
_onCornerClicked() we must handle it there by returning 'true' to
Clutter or else _onCornerClicked() is called twice which defeats the
HOT_CORNER_ACTIVATION_TIMEOUT logic.

https://bugzilla.gnome.org/show_bug.cgi?id=649427
2011-05-25 14:11:17 -04:00
Jonny Lamb
0d92f2b0c5 telepathyClient: don't update notifications for outgoing messages
If you receive a message, a notification will appear. If you reply in
Empathy's chat window before the notification disappears, the
notification is updated with the contents of the message you *just*
sent! We should only update notifications if they're incoming.

https://bugzilla.gnome.org/show_bug.cgi?id=650219

Signed-off-by: Jonny Lamb <jonnylamb@gnome.org>
2011-05-25 14:11:13 -04:00
Giovanni Campagna
2afb4cc124 PopupSliderMenuItem: intercept clicks outside the slider
Connect to button-press-event on the menu item actor, not on the
slider, so any part that is highlighted is also clicked. This means
that click on the left of the volume slider is a rapid way to mute.

https://bugzilla.gnome.org/show_bug.cgi?id=646660
2011-05-25 14:11:09 -04:00
Dan Williams
762b0e45e0 network: request that nm-applet show the mobile broadband wizard
Use nm-applet 0.8.999 API to call the mobile broadband wizard and
activate the new connection.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=649318
2011-05-25 14:10:45 -04:00
Dan Williams
a7acd3b535 network: fix initial connections to WPA[2] Enterprise APs
Call out to nm-applet to do the dirty work since the dialog of
doom is pretty complicated and we don't have a JS equivalent
of it for now.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=648171
2011-05-25 14:10:24 -04:00
Dan Williams
ccc4b20e83 network: fix handling of AP flags and enhance for 802.1x
All WPA APs were getting set as WPA2 due to the check for privacy;
WPA/WPA2 APs *must* set the Privacy bit according to the standard,
so we'd never end up in the case for NMAccessPointSecurity.WPA.

Fix that, and also add flags for WPA[2] Enterprise which we'll
use a bit later for the first-time connect case for 802.1x enabled
access points.
2011-05-25 14:08:22 -04:00
Dan Williams
8dd45bea1c network: simplify connection sorting by using libnm-glib functions
Instead of rolling our own code, use new libnm-glib functions to do
the same thing.  Requires libnm-glib as of
779215c742bbe29a2c66202ec7e2e6d43edeb8ff (which will be part of 0.9).

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=648648
2011-05-25 14:08:19 -04:00
Seán de Búrca
0c80f8cec4 Updated Irish translation. 2011-05-23 02:09:38 -06:00
Nguyễn Thái Ngọc Duy
27508864bf vi.po: new translation for "dash" 2011-05-22 21:50:39 +07:00
Seán de Búrca
117be3b14d Updated Irish translation. 2011-05-22 04:35:00 -06:00
Arash Mousavi
4bc2f9b5e6 Updated Persian translation 2011-05-17 00:54:40 +04:30
Colin Walters
ba5c45deaf st-private: Correct fix for memory leak
The previous fix in 72f9f482d was wrong; we need to keep around
the buffer until cairo is done with the pattern.

https://bugzilla.gnome.org/show_bug.cgi?id=649497
2011-05-12 14:44:10 -04:00
Colin Walters
941246a4f0 st-private: Fix memory leak
==13810== 11,360 bytes in 1 blocks are definitely lost in loss record 18,574 of 18,765
==13810==    at 0x4005447: calloc (vg_replace_malloc.c:467)
==13810==    by 0x5191882: standard_calloc (gmem.c:107)
==13810==    by 0x51920A7: g_malloc0 (gmem.c:196)
==13810==    by 0x4056201: blur_pixels (st-private.c:466)
==13810==    by 0x40573B4: _st_create_shadow_cairo_pattern (st-private.c:710)
==13810==    by 0x4070746: st_theme_node_paint (st-theme-node-drawing.c:856)
==13810==    by 0x3FEFFFFF: ???

https://bugzilla.gnome.org/show_bug.cgi?id=649497
2011-05-12 14:44:07 -04:00
Maxim Ermilov
7feef56656 shell-xfixes-cursor: missing XFree
memory returned by XFixesGetCursorImage should be freed after usage.
https://bugzilla.gnome.org/show_bug.cgi?id=642652
2011-05-12 14:24:34 -04:00
Kjartan Maraas
9a2a07f32a Updated Norwegian bokmål translation from Sigurd Gartmann 2011-05-11 22:49:11 +02:00
Timo Jyrinki
af9594c902 Finnish date/time fixes from Marko Myllynen. Full usage however depends on getting bugs #647320 / #648678 in g_date_time_format fixed. 2011-05-05 18:04:51 +03:00
Owen W. Taylor
569008b084 appDisplay: Fix off-by-one when incrementally adding application icons
A "cosmetic" code arrangement I requested in code review resulted
in one too few items being removed from the queue for each incremental
chunk of icons added. Fix.

https://bugzilla.gnome.org/show_bug.cgi?id=648739
2011-05-03 08:53:08 -04:00
Abduxukur Abdurixit
0e086563bc Added UG translation 2011-05-02 18:45:55 +02:00
Abduxukur Abdurixit
91d4a832ad Added UG translation 2011-05-02 18:44:55 +02:00
Abduxukur Abdurixit
832ce362f0 Added UG translation 2011-05-02 18:40:46 +02:00
Abduxukur Abdurixit
aa04e453b8 Added UG translation 2011-05-02 18:40:09 +02:00
Abduxukur Abdurixit
b0a75aed95 Added UG translation 2011-05-02 07:27:26 +02:00
Peter Mráz
dba97f36c0 Added Slovak translation 2011-04-27 09:01:55 +02:00
Daniel Nylander
2560b37819 Updated Swedish translation 2011-04-26 23:10:51 +02:00
152 changed files with 14036 additions and 17506 deletions

8
.gitignore vendored
View File

@@ -3,7 +3,6 @@
*.o *.o
.deps .deps
.libs .libs
ABOUT-NLS
ChangeLog ChangeLog
INSTALL INSTALL
Makefile Makefile
@@ -30,13 +29,8 @@ 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
@@ -49,11 +43,9 @@ src/calendar-server/org.gnome.Shell.CalendarServer.service
src/gnome-shell src/gnome-shell
src/gnome-shell-calendar-server src/gnome-shell-calendar-server
src/gnome-shell-extension-tool src/gnome-shell-extension-tool
src/gnome-shell-hotplug-sniffer
src/gnome-shell-jhbuild src/gnome-shell-jhbuild
src/gnome-shell-perf-helper src/gnome-shell-perf-helper
src/gnome-shell-real src/gnome-shell-real
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
src/run-js-test src/run-js-test
src/test-recorder src/test-recorder
src/test-recorder.ogg src/test-recorder.ogg

View File

@@ -3,5 +3,5 @@ E-mail: otaylor@redhat.com
Userid: otaylor Userid: otaylor
Colin Walters Colin Walters
E-mail: walters@verbum.org E-mail: walters@redhat.com
Userid: walters Userid: walters

83
NEWS
View File

@@ -1,85 +1,6 @@
3.1.3
=====
* 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 3.0.2
===== =====
* Network Menu [Dan Williams] * Network Menu [Dan Williams
- Fix connecting to WPA2 Enterprise access points - Fix connecting to WPA2 Enterprise access points
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=648171 Fixes https://bugzilla.gnome.org/show_bug.cgi?id=648171
- Show the mobile broadband wizard when selecting 3G network - Show the mobile broadband wizard when selecting 3G network
@@ -102,7 +23,7 @@ Translations:
* Memory leak fixes [Colin, Maxim] * Memory leak fixes [Colin, Maxim]
642652, 649508, 649497 642652, 649508, 649497
* Miscellaneous minor bug fixes [Adel, Christopher, Jasper] * Miscellaneous minor bug fixes [Adel, Christopher, Jasper]
649596, 648765, 648983, 649632 649596,648765, 648983, 649632
Contributors: Contributors:
Christopher Aillon, Giovanni Campagna, Maxim Ermilov, Christopher Aillon, Giovanni Campagna, Maxim Ermilov,

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.1.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.0.2],[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,16 +23,12 @@ 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])
@@ -64,7 +60,7 @@ fi
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder) AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.7.5 CLUTTER_MIN_VERSION=1.5.15
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=0.7.11 GJS_MIN_VERSION=0.7.11
MUTTER_MIN_VERSION=3.0.0 MUTTER_MIN_VERSION=3.0.0
@@ -72,11 +68,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
LIBEDATASERVERUI_MIN_VERSION=2.91.6 LIBEDATASERVERUI2_MIN_VERSION=1.2.0
TELEPATHY_GLIB_MIN_VERSION=0.15.3 LIBEDATASERVERUI3_MIN_VERSION=2.91.6
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
@@ -85,10 +81,10 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
libmutter >= $MUTTER_MIN_VERSION libmutter >= $MUTTER_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION gjs-internals-1.0 >= $GJS_MIN_VERSION
libgnome-menu $recorder_modules gconf-2.0 libgnome-menu $recorder_modules gconf-2.0
gdk-x11-3.0 libsoup-2.4 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 >= $STARTUP_NOTIFICATION_MIN_VERSION libstartup-notification-1.0
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
@@ -97,8 +93,6 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
GJS_VERSION=`$PKG_CONFIG --modversion gjs-internals-1.0` GJS_VERSION=`$PKG_CONFIG --modversion gjs-internals-1.0`
AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're linking to]) AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're linking to])
AC_SUBST([GJS_VERSION], ["$GJS_VERSION"]) AC_SUBST([GJS_VERSION], ["$GJS_VERSION"])
@@ -117,20 +111,22 @@ 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
AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier) # sn_startup_sequence_get_application_id, we can replace with a version check later
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 >= 0.6.2 gnome-desktop-3.0 >= 2.90.0 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 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 >= 3.1.0], PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 2.90.0],
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=applet_libdir gnome-bluetooth-1.0` [BLUETOOTH_DIR=`$PKG_CONFIG --variable=libdir gnome-bluetooth-1.0`/gnome-bluetooth
BLUETOOTH_LIBS=`$PKG_CONFIG --variable=applet_libs gnome-bluetooth-1.0` BLUETOOTH_LIBS="-L'$BLUETOOTH_DIR' -lgnome-bluetooth-applet"
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])
@@ -140,7 +136,13 @@ PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
AC_SUBST([HAVE_BLUETOOTH],[0]) AC_SUBST([HAVE_BLUETOOTH],[0])
AC_MSG_RESULT([no])]) AC_MSG_RESULT([no])])
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) # Default to libedataserverui-3.0, but allow falling back to 1.2
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)

View File

@@ -30,14 +30,26 @@ 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 \

View File

@@ -15,18 +15,8 @@
<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; this key lists extensions GNOME Shell extensions have a uuid property;
which should not be loaded. This setting overrides enabled-extensions this key lists extensions which should not be loaded.
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">
@@ -62,7 +52,6 @@
<child name="clock" schema="org.gnome.shell.clock"/> <child name="clock" schema="org.gnome.shell.clock"/>
<child name="calendar" schema="org.gnome.shell.calendar"/> <child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="recorder" schema="org.gnome.shell.recorder"/> <child name="recorder" schema="org.gnome.shell.recorder"/>
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
</schema> </schema>
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/" <schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
@@ -76,38 +65,6 @@
</key> </key>
</schema> </schema>
<schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="show-keyboard" type="b">
<default>false</default>
<_summary>Show the onscreen keyboard</_summary>
<_description>
If true, display onscreen keyboard.
</_description>
</key>
<key name="keyboard-type" type="s">
<default>'touch'</default>
<_summary>Which keyboard to use</_summary>
<_description>
The type of keyboard to use.
</_description>
</key>
<key name="enable-drag" type="b">
<default>false</default>
<_summary>Enable keyboard dragging</_summary>
<_description>
If true, enable keyboard dragging.
</_description>
</key>
<key name="enable-float" type="b">
<default>false</default>
<_summary>Enable floating keyboard</_summary>
<_description>
If true, enable floating keyboard.
</_description>
</key>
</schema>
<schema id="org.gnome.shell.clock" path="/org/gnome/shell/clock/" <schema id="org.gnome.shell.clock" path="/org/gnome/shell/clock/"
gettext-domain="@GETTEXT_PACKAGE@"> gettext-domain="@GETTEXT_PACKAGE@">
<key name="show-seconds" type="b"> <key name="show-seconds" type="b">

View File

@@ -39,11 +39,6 @@ StScrollBar
padding: 0px; padding: 0px;
} }
StScrollView.vfade
{
-st-vfade-offset: 68px;
}
StScrollView StScrollBar StScrollView StScrollBar
{ {
min-width: 16px; min-width: 16px;
@@ -187,7 +182,6 @@ StTooltip StLabel {
} }
.popup-inactive-menu-item { .popup-inactive-menu-item {
font-weight: normal;
color: #999; color: #999;
} }
@@ -264,7 +258,7 @@ StTooltip StLabel {
} }
.panel-corner:active, .panel-corner:active,
.panel-corner:overview, .panel-corner:checked,
.panel-corner:focus { .panel-corner:focus {
-panel-corner-inner-border-color: rgba(255,255,255,0.8); -panel-corner-inner-border-color: rgba(255,255,255,0.8);
} }
@@ -301,7 +295,7 @@ StTooltip StLabel {
} }
.panel-button:active, .panel-button:active,
.panel-button:overview, .panel-button:checked,
.panel-button:focus { .panel-button:focus {
border-image: url("panel-button-border.svg") 10 10 0 2; border-image: url("panel-button-border.svg") 10 10 0 2;
background-image: url("panel-button-highlight-wide.svg"); background-image: url("panel-button-highlight-wide.svg");
@@ -464,7 +458,6 @@ StTooltip StLabel {
background-gradient-start: rgba(5,5,6,0.1); background-gradient-start: rgba(5,5,6,0.1);
background-gradient-end: rgba(254,254,254,0.1); background-gradient-end: rgba(254,254,254,0.1);
background-gradient-direction: vertical; background-gradient-direction: vertical;
selected-color: black;
caret-color: rgb(128, 128, 128); caret-color: rgb(128, 128, 128);
caret-size: 1px; caret-size: 1px;
width: 250px; width: 250px;
@@ -725,8 +718,6 @@ StTooltip StLabel {
.lg-dialog StEntry .lg-dialog StEntry
{ {
color: #88ff66; color: #88ff66;
selection-background-color: #88ff66;
selected-color: black;
} }
.lg-obj-inspector-title .lg-obj-inspector-title
@@ -1139,83 +1130,6 @@ StTooltip StLabel {
icon-size: 36px; icon-size: 36px;
} }
.hotplug-transient-box {
spacing: 6px;
padding: 2px 72px 2px 12px;
}
.hotplug-notification-item {
background-color: #3c3c3c;
padding: 0px 10px;
border-radius: 8px;
border: 1px solid #181818;
}
.hotplug-notification-item:hover {
border: 1px solid #a1a1a1;
}
.hotplug-notification-item:focus {
background-color: #666666;
}
.hotplug-notification-item:active {
border: 1px solid #a1a1a1;
background-color: #2b2b2b;
}
.hotplug-notification-item-icon {
icon-size: 24px;
padding: 2px 5px;
}
.hotplug-resident-box {
spacing: 8px;
}
.hotplug-resident-mount {
spacing: 8px;
border-radius: 4px;
color: #ccc;
}
.hotplug-resident-mount:hover {
background-gradient-direction: horizontal;
background-gradient-start: rgba(255, 255, 255, 0.1);
background-gradient-end: rgba(255, 255, 255, 0);
color: #fff;
}
.hotplug-resident-mount-label {
color: inherit;
padding-left: 6px;
}
.hotplug-resident-mount-icon {
icon-size: 24px;
padding-left: 6px;
}
.hotplug-resident-eject-icon {
icon-size: 16px;
}
.hotplug-resident-eject-button {
padding: 2px;
border: 1px solid #2b2b2b;
border-radius: 5px;
color: #ccc;
}
.hotplug-resident-eject-button:hover {
color: #fff;
background-color: #2b2b2b;
border: 1px solid #a1a1a1;
}
.chat-log-message { .chat-log-message {
color: #888888; color: #888888;
} }
@@ -1275,8 +1189,6 @@ StTooltip StLabel {
color: #545454; color: #545454;
background-color: #e8e8e8; background-color: #e8e8e8;
caret-color: #545454; caret-color: #545454;
selection-background-color: #bcbcbc;
selected-color: #323232;
box-shadow: 0px 0px 6px 2px rgba(255,255,255,0.9); box-shadow: 0px 0px 6px 2px rgba(255,255,255,0.9);
} }
@@ -1343,16 +1255,6 @@ StTooltip StLabel {
padding-left: 4px; padding-left: 4px;
} }
.summary-source-counter {
color: white;
background-color: #3465A4;
text-shadow: black 1px 1px 0;
font-size: 9pt;
border-radius: 1em;
min-height: 1em;
min-width: 1em;
}
.source-title { .source-title {
font-size: 9pt; font-size: 9pt;
font-weight: bold; font-weight: bold;
@@ -1568,8 +1470,6 @@ StTooltip StLabel {
font-weight: bold; font-weight: bold;
width: 23em; width: 23em;
color: white; color: white;
selection-background-color: white;
selected-color: black;
} }
.run-dialog { .run-dialog {
@@ -1673,90 +1573,6 @@ StTooltip StLabel {
color: #444444; color: #444444;
} }
/* ShellMountOperation Dialogs */
.shell-mount-operation-icon {
icon-size: 48px;
}
.mount-password-reask {
color: red;
}
.show-processes-dialog,
.mount-question-dialog {
spacing: 24px;
}
.show-processes-dialog-subject,
.mount-question-dialog-subject {
font-size: 12pt;
font-weight: bold;
color: #666666;
padding-top: 10px;
padding-left: 17px;
padding-bottom: 6px;
}
.show-processes-dialog-subject:rtl,
.mount-question-dialog-subject:rtl {
padding-left: 0px;
padding-right: 17px;
}
.show-processes-dialog-description,
.mount-question-dialog-description {
font-size: 10pt;
color: white;
padding-left: 17px;
width: 28em;
}
.show-processes-dialog-description:rtl,
.mount-question-dialog-description:rtl {
padding-right: 17px;
}
.show-processes-dialog-app-list {
font-size: 10pt;
max-height: 200px;
padding-top: 24px;
padding-left: 49px;
padding-right: 32px;
}
.show-processes-dialog-app-list:rtl {
padding-right: 49px;
padding-left: 32px;
}
.show-processes-dialog-app-list-item {
color: #ccc;
}
.show-processes-dialog-app-list-item:hover {
color: white;
}
.show-processes-dialog-app-list-item:ltr {
padding-right: 1em;
}
.show-processes-dialog-app-list-item:rtl {
padding-left: 1em;
}
.show-processes-dialog-app-list-item-icon:ltr {
padding-right: 17px;
}
.show-processes-dialog-app-list-item-icon:rtl {
padding-left: 17px;
}
.show-processes-dialog-app-list-item-name {
font-size: 10pt;
}
/* PolicyKit Authentication Dialog */ /* PolicyKit Authentication Dialog */
.polkit-dialog { .polkit-dialog {
/* this is the width of the entire modal popup */ /* this is the width of the entire modal popup */
@@ -1839,57 +1655,3 @@ StTooltip StLabel {
.magnifier-zoom-region.full-screen { .magnifier-zoom-region.full-screen {
border-width: 0px; border-width: 0px;
} }
/* On-screen Keyboard */
#keyboard {
background: rgba(0,0,0,0.8);
}
.keyboard-layout {
spacing: 10px;
padding: 10px;
}
.keyboard-row {
spacing: 15px;
}
.keyboard-key {
min-height: 30px;
min-width: 30px;
background-gradient-start: rgba(255,245,245,0.4);
background-gradient-end: rgba(105,105,105,0.1);
background-gradient-direction: vertical;
font-size: 14pt;
font-weight: bold;
border-radius: 10px;
border: 2px solid #a0a0a0;
color: white;
}
.keyboard-key:grayed {
color: #808080;
border-color: #808080;
}
.keyboard-key:checked,
.keyboard-key:hover {
background: #303030;
border: 3px solid white;
}
.keyboard-key:active {
background: #808080;
}
.keyboard-subkeys {
color: white;
padding: 5px;
-arrow-border-radius: 10px;
-arrow-background-color: #090909;
-arrow-border-width: 2px;
-arrow-border-color: white;
-arrow-base: 20px;
-arrow-rise: 10px;
}

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="16"
id="svg6503"
version="1.1"
inkscape:version="0.47pre4 r22446"
sodipodi:docname="mosaic-view-active.svg">
<defs
id="defs6505">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective6511" />
<inkscape:perspective
id="perspective6494"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.197802"
inkscape:cx="-15.97056"
inkscape:cy="16"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1680"
inkscape:window-height="997"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata6508">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-16)">
<g
style="display:inline;fill:#cbcbcb;fill-opacity:1"
transform="translate(-449.85476,-685.85869)"
id="g5306">
<rect
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none"
id="rect5308"
width="11"
height="7"
x="450.5"
y="710.5"
rx="0.99999958"
ry="1" />
<rect
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
id="rect5310"
width="11"
height="7"
x="462.5"
y="702.5"
rx="0.99999958"
ry="1" />
<rect
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999976000000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
id="rect5312"
width="11"
height="7"
x="450.5"
y="702.5"
rx="0.99999958"
ry="1" />
<rect
style="fill:#cbcbcb;fill-opacity:1;stroke:#000000;stroke-width:0.99999970000000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.44262299999999999;stroke-dasharray:none;display:inline"
id="rect5314"
width="11"
height="7"
x="462.5"
y="710.5"
rx="0.99999958"
ry="1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

113
data/theme/mosaic-view.svg Normal file
View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="16"
id="svg6503"
version="1.1"
inkscape:version="0.47pre4 r22446"
sodipodi:docname="New document 19">
<defs
id="defs6505">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective6511" />
<inkscape:perspective
id="perspective6494"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.197802"
inkscape:cx="16"
inkscape:cy="16"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1680"
inkscape:window-height="997"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata6508">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-16)">
<g
style="display:inline"
transform="translate(-449.85476,-685.85869)"
id="g5306">
<rect
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none"
id="rect5308"
width="11"
height="7"
x="450.5"
y="710.5"
rx="0.99999958"
ry="1" />
<rect
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
id="rect5310"
width="11"
height="7"
x="462.5"
y="702.5"
rx="0.99999958"
ry="1" />
<rect
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
id="rect5312"
width="11"
height="7"
x="450.5"
y="702.5"
rx="0.99999958"
ry="1" />
<rect
style="fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.442623;stroke-dasharray:none;display:inline"
id="rect5314"
width="11"
height="7"
x="462.5"
y="710.5"
rx="0.99999958"
ry="1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="98"
height="98"
id="svg6375"
version="1.1"
inkscape:version="0.47 r22583"
sodipodi:docname="add-workspace.svg">
<defs
id="defs6377">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective6383" />
<inkscape:perspective
id="perspective6366"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.9590209"
inkscape:cx="56.650687"
inkscape:cy="20.635343"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1680"
inkscape:window-height="997"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata6380">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,66)">
<g
id="g2824"
transform="matrix(11.568551,0,0,11.698271,-78.828159,-304.81518)">
<path
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 11.07363,21.36834 0,6.43903"
id="path5322" />
<path
style="fill:none;stroke:#666666;stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
d="m 14.29314,24.58786 -6.43902,0"
id="path5324" />
</g>
<path
style="fill:#000000;fill-opacity:0.98823529"
d="m 48.239516,97.908047 c -0.41677,-0.05102 -1.269253,-0.222408 -1.894408,-0.380859 -4.088493,-1.036262 -7.520781,-4.753234 -8.330163,-9.021094 -0.154947,-0.817026 -0.257819,-6.68112 -0.257819,-14.696556 l 0,-13.337088 -13.829177,-0.08909 C 10.802042,60.298796 10.026884,60.268266 8.6851548,59.783022 3.6288503,57.954375 0.62673331,53.828648 0.62673331,48.708554 c 0,-5.625522 4.25936019,-10.425065 9.97721469,-11.242548 0.987903,-0.141242 7.368912,-0.254994 14.460646,-0.257791 l 12.692532,-0.005 0,-13.586668 c 0,-14.6441583 0.03287,-15.0698926 1.364686,-17.6753047 2.185477,-4.2754229 6.938193,-6.75739913 11.687647,-6.10355607 3.382776,0.46569661 6.737962,2.72496967 8.414081,5.66577137 1.480816,2.5981315 1.519067,3.0522448 1.519067,18.0333334 l 0,13.666424 12.692533,0.005 c 7.091733,0.0028 13.472742,0.116549 14.460646,0.257791 6.395303,0.914337 10.804785,6.623716 9.941157,12.871766 -0.698243,5.051565 -4.792685,9.104635 -9.941157,9.840713 -0.987904,0.141242 -7.368913,0.254995 -14.460646,0.257791 l -12.692533,0.005 0,13.801945 c 0,13.031417 -0.02798,13.895893 -0.501177,15.484801 -1.526902,5.127058 -6.919246,8.802262 -12.001914,8.18002 z"
id="path2828"
transform="translate(0,-66)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -2,62 +2,24 @@
<!-- 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.011539,0,0,0.57582113,-0.39262194,71.83807)" gradientTransform="matrix(1.0525552,0,0,1.0525552,-2.5162753,-9.0000838)"
cx="47.428951" cx="47.878681"
cy="167.16817" cy="171.25"
fx="47.428951" fx="47.878681"
fy="167.16817" fy="171.25"
r="37" /> r="37" />
<linearGradient <linearGradient
id="linearGradient36429"> id="linearGradient36429">
@@ -97,7 +59,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.15252127,-9.281289,132.52772)" gradientTransform="matrix(1.1891549,0,0,0.55513246,-9.281289,36.12653)"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
id="radialGradient7488" id="radialGradient7488"
xlink:href="#linearGradient36471" /> xlink:href="#linearGradient36471" />
@@ -110,21 +72,19 @@
id="g30864" id="g30864"
transform="translate(255.223,70.118091)"> transform="translate(255.223,70.118091)">
<rect <rect
ry="3.4593496" ry="3.5996203"
rx="3.4593496" rx="3.5996203"
y="99.596962" y="98"
x="12.596948" x="11"
height="71.116341" height="74"
width="71.116341" width="74"
id="rect14000" id="rect14000"
style="opacity:0.37187500000000001;fill:url(#radialGradient7461);fill-opacity:1;stroke:none" /> style="opacity:0.371875;fill:url(#radialGradient7461);fill-opacity:1;stroke:none" />
<path <path
id="rect34520" id="rect34520"
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" 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"
style="opacity:0.35;fill:none;stroke:url(#radialGradient7488);stroke-width:1;stroke-opacity:1" style="opacity:0.2;fill:none;stroke:url(#radialGradient7488);stroke-width:1;stroke-opacity:1"
connector-curvature="0" inkscape:connector-curvature="0" />
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccscc" />
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="5.8600588"
height="9"
id="svg3647"
version="1.1"
inkscape:version="0.47 r22583"
sodipodi:docname="section-more.svg">
<defs
id="defs3649">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective3655" />
<inkscape:perspective
id="perspective3603"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="82.777778"
inkscape:cx="2.9300294"
inkscape:cy="5.466443"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1680"
inkscape:window-height="997"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata3652">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-262.78425,-490.71933)">
<path
transform="matrix(0,-0.98149546,0.71467449,0,25.404986,578.15569)"
d="M 88.830127,340 80.169873,340 84.5,332.5 88.830127,340 z"
inkscape:randomized="0"
inkscape:rounded="0"
inkscape:flatsided="true"
sodipodi:arg2="1.5707963"
sodipodi:arg1="0.52359878"
sodipodi:r2="2.5"
sodipodi:r1="5"
sodipodi:cy="337.5"
sodipodi:cx="84.5"
sodipodi:sides="3"
id="path5497-5"
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.59699643;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
sodipodi:type="star" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

87
data/theme/section-more.svg Executable file
View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="5.8600588"
height="9"
id="svg3647"
version="1.1"
inkscape:version="0.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>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="16"
id="svg6446"
version="1.1"
inkscape:version="0.47pre4 r22446"
sodipodi:docname="single-view-active.svg">
<defs
id="defs6448">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective6454" />
<inkscape:perspective
id="perspective6441"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.197802"
inkscape:cx="0.014720032"
inkscape:cy="16"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1680"
inkscape:window-height="997"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata6451">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-17)">
<rect
ry="0.5"
rx="0.49999979"
y="17.483809"
x="0.53483802"
height="15"
width="23"
id="rect5304"
style="fill:#cccccc;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="16"
id="svg6446"
version="1.1"
inkscape:version="0.47pre4 r22446"
sodipodi:docname="single-view.svg">
<defs
id="defs6448">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective6454" />
<inkscape:perspective
id="perspective6441"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.197802"
inkscape:cx="0.014720032"
inkscape:cy="16"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1680"
inkscape:window-height="997"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata6451">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-17)">
<rect
ry="0.5"
rx="0.49999979"
y="17.483809"
x="0.53483802"
height="15"
width="23"
id="rect5304"
style="fill:#626262;fill-opacity:1;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -13,8 +13,8 @@
height="22" height="22"
id="svg3199" id="svg3199"
version="1.1" version="1.1"
inkscape:version="0.48.1 r9760" inkscape:version="0.47 r22583"
sodipodi:docname="toggle-on-intl.svg"> sodipodi:docname="New document 11">
<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="1" inkscape:zoom="0.35"
inkscape:cx="49.147112" inkscape:cx="32.500004"
inkscape:cy="17.532036" inkscape:cy="10.999997"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false" showgrid="false"
inkscape:window-width="1412" inkscape:window-width="609"
inkscape:window-height="1067" inkscape:window-height="501"
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:#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" 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"
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

View File

@@ -13,8 +13,8 @@
height="22" height="22"
id="svg2857" id="svg2857"
version="1.1" version="1.1"
inkscape:version="0.48.1 r9760" inkscape:version="0.47 r22583"
sodipodi:docname="toggle-on-us.svg"> sodipodi:docname="New document 2">
<defs <defs
id="defs2859"> id="defs2859">
<inkscape:perspective <inkscape:perspective
@@ -40,18 +40,16 @@
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1" inkscape:zoom="1"
inkscape:cx="19.689855" inkscape:cx="-69.642856"
inkscape:cy="2.0517979" inkscape:cy="42.428569"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false" showgrid="false"
inkscape:window-width="941" inkscape:window-width="609"
inkscape:window-height="751" inkscape:window-height="501"
inkscape:window-x="2577" inkscape:window-x="0"
inkscape:window-y="206" inkscape:window-y="26"
inkscape:window-maximized="0" inkscape:window-maximized="0" />
borderlayer="true"
inkscape:showpageshadow="false" />
<metadata <metadata
id="metadata2862"> id="metadata2862">
<rdf:RDF> <rdf:RDF>
@@ -60,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>
@@ -74,7 +72,7 @@
transform="translate(-351.35714,708.36218)" transform="translate(-351.35714,708.36218)"
id="g16453"> id="g16453">
<rect <rect
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" 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"
id="rect16256-9-4" id="rect16256-9-4"
width="63.000004" width="63.000004"
height="19" height="19"

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -10,14 +10,11 @@ nobase_dist_js_DATA = \
misc/history.js \ misc/history.js \
misc/modemManager.js \ misc/modemManager.js \
misc/params.js \ misc/params.js \
misc/screenSaver.js \
misc/util.js \ misc/util.js \
perf/core.js \ perf/core.js \
ui/altTab.js \ ui/altTab.js \
ui/appDisplay.js \ ui/appDisplay.js \
ui/appFavorites.js \ ui/appFavorites.js \
ui/automountManager.js \
ui/autorunManager.js \
ui/boxpointer.js \ ui/boxpointer.js \
ui/calendar.js \ ui/calendar.js \
ui/chrome.js \ ui/chrome.js \
@@ -30,8 +27,6 @@ nobase_dist_js_DATA = \
ui/environment.js \ ui/environment.js \
ui/extensionSystem.js \ ui/extensionSystem.js \
ui/iconGrid.js \ ui/iconGrid.js \
ui/keyboard.js \
ui/layout.js \
ui/lightbox.js \ ui/lightbox.js \
ui/link.js \ ui/link.js \
ui/lookingGlass.js \ ui/lookingGlass.js \
@@ -40,7 +35,6 @@ nobase_dist_js_DATA = \
ui/main.js \ ui/main.js \
ui/messageTray.js \ ui/messageTray.js \
ui/modalDialog.js \ ui/modalDialog.js \
ui/shellMountOperation.js \
ui/notificationDaemon.js \ ui/notificationDaemon.js \
ui/overview.js \ ui/overview.js \
ui/panel.js \ ui/panel.js \

View File

@@ -109,8 +109,7 @@ 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' }
] ]
}; };

View File

@@ -1,53 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const DBus = imports.dbus;
const Lang = imports.lang;
const ScreenSaverIface = {
name: 'org.gnome.ScreenSaver',
methods: [{ name: 'GetActive',
inSignature: '',
outSignature: 'b' },
{ name: 'Lock',
inSignature: '' },
{ name: 'SetActive',
inSignature: 'b' }],
signals: [{ name: 'ActiveChanged',
inSignature: 'b' }]
};
function ScreenSaverProxy() {
this._init();
}
ScreenSaverProxy.prototype = {
_init: function() {
DBus.session.proxifyObject(this,
'org.gnome.ScreenSaver',
'/org/gnome/ScreenSaver');
DBus.session.watch_name('org.gnome.ScreenSaver',
false, // do not launch a name-owner if none exists
Lang.bind(this, this._onSSAppeared),
Lang.bind(this, this._onSSVanished));
this.screenSaverActive = false;
this.connect('ActiveChanged',
Lang.bind(this, this._onActiveChanged));
},
_onSSAppeared: function(owner) {
this.GetActiveRemote(Lang.bind(this, function(isActive) {
this.screenSaverActive = isActive;
}))
},
_onSSVanished: function(oldOwner) {
this.screenSaverActive = false;
},
_onActiveChanged: function(object, isActive) {
this.screenSaverActive = isActive;
}
};
DBus.proxifyPrototype(ScreenSaverProxy.prototype, ScreenSaverIface);

View File

@@ -7,6 +7,9 @@ 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');
@@ -45,7 +48,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, argv] = GLib.shell_parse_argv(command_line); let [success, argc, argv] = GLib.shell_parse_argv(command_line);
trySpawn(argv); trySpawn(argv);
} catch (err) { } catch (err) {
_handleSpawnError(command_line, err); _handleSpawnError(command_line, err);
@@ -85,10 +88,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, argv; let success, argc, argv;
try { try {
[success, argv] = GLib.shell_parse_argv(command_line); [success, argc, 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

View File

@@ -14,8 +14,7 @@ const Tweener = imports.ui.tweener;
const POPUP_APPICON_SIZE = 96; const POPUP_APPICON_SIZE = 96;
const POPUP_SCROLL_TIME = 0.10; // seconds const POPUP_SCROLL_TIME = 0.10; // seconds
const POPUP_FADE_IN_TIME = 0.4; // seconds const POPUP_FADE_TIME = 0.1; // seconds
const POPUP_FADE_OUT_TIME = 0.1; // seconds
const APP_ICON_HOVER_TIMEOUT = 200; // milliseconds const APP_ICON_HOVER_TIMEOUT = 200; // milliseconds
@@ -75,7 +74,7 @@ AltTabPopup.prototype = {
_allocate: function (actor, box, flags) { _allocate: function (actor, box, flags) {
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT); let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT); let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
@@ -88,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 - rightPadding, childBox.x1 + childNaturalWidth); childBox.x2 = Math.min(primary.x + primary.width - hPadding, 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);
@@ -98,6 +97,8 @@ 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);
@@ -120,7 +121,7 @@ AltTabPopup.prototype = {
} }
}, },
show : function(backward, binding) { show : function(backward, switch_group) {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
let apps = tracker.get_running_apps (''); let apps = tracker.get_running_apps ('');
@@ -144,14 +145,8 @@ 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 (binding == 'switch_group') { if (switch_group) {
if (backward) { if (backward) {
this._select(0, this._appIcons[0].cachedWindows.length - 1); this._select(0, this._appIcons[0].cachedWindows.length - 1);
} else { } else {
@@ -160,10 +155,6 @@ AltTabPopup.prototype = {
else else
this._select(0, 0); this._select(0, 0);
} }
} else if (binding == 'switch_group_backward') {
this._select(0, this._appIcons[0].cachedWindows.length - 1);
} else if (binding == 'switch_windows_backward') {
this._select(this._appIcons.length - 1);
} else if (this._appIcons.length == 1) { } else if (this._appIcons.length == 1) {
this._select(0); this._select(0);
} else if (backward) { } else if (backward) {
@@ -183,15 +174,12 @@ AltTabPopup.prototype = {
return false; return false;
} }
// Using easeInOutExpo over 400ms gives us 150ms of "nearly this.actor.opacity = 0;
// invisible" (less than 10% opacity), followed by a 100ms this.actor.show();
// tween in (to 90% opacity, with the last 10% coming over the
// next 150ms). So if the user releases Alt quickly after we
// start tweening, they'll never see the switcher.
Tweener.addTween(this.actor, Tweener.addTween(this.actor,
{ opacity: 255, { opacity: 255,
time: POPUP_FADE_IN_TIME, time: POPUP_FADE_TIME,
transition: 'easeInOutExpo' transition: 'easeOutQuad'
}); });
return true; return true;
@@ -227,25 +215,33 @@ AltTabPopup.prototype = {
this._disableHover(); this._disableHover();
if (keysym == Clutter.Escape) { if (action == Meta.KeyBindingAction.SWITCH_GROUP)
this.destroy();
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
this._select(this._currentApp, backwards ? this._previousWindow() : this._nextWindow()); this._select(this._currentApp, backwards ? this._previousWindow() : this._nextWindow());
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) { else if (keysym == Clutter.Escape)
this._select(this._currentApp, this._previousWindow()); this.destroy();
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) { else if (this._thumbnailsFocused) {
this._select(backwards ? this._previousApp() : this._nextApp()); if (action == Meta.KeyBindingAction.SWITCH_WINDOWS)
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD) { if (backwards) {
this._select(this._previousApp()); if (this._currentWindow == 0 || this._currentWindow == -1)
} else if (this._thumbnailsFocused) { this._select(this._previousApp());
if (keysym == Clutter.Left) else
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 (keysym == Clutter.Left) if (action == Meta.KeyBindingAction.SWITCH_WINDOWS)
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());
@@ -374,7 +370,7 @@ AltTabPopup.prototype = {
if (this.actor.visible) { if (this.actor.visible) {
Tweener.addTween(this.actor, Tweener.addTween(this.actor,
{ opacity: 0, { opacity: 0,
time: POPUP_FADE_OUT_TIME, time: POPUP_FADE_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: Lang.bind(this, onComplete: Lang.bind(this,
function() { function() {
@@ -587,7 +583,7 @@ SwitcherList.prototype = {
this._rightArrow.opacity = this._rightGradient.opacity; this._rightArrow.opacity = this._rightGradient.opacity;
}, },
addItem : function(item, label) { addItem : function(item) {
let bbox = new St.Button({ style_class: 'item-box', let bbox = new St.Button({ style_class: 'item-box',
reactive: true }); reactive: true });
@@ -598,8 +594,6 @@ 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);
}, },
@@ -632,7 +626,7 @@ SwitcherList.prototype = {
this._items[this._highlighted].add_style_pseudo_class('selected'); this._items[this._highlighted].add_style_pseudo_class('selected');
} }
let monitor = Main.layoutManager.primaryMonitor; let monitor = global.get_primary_monitor();
let itemSize = this._items[index].allocation.x2 - this._items[index].allocation.x1; let itemSize = this._items[index].allocation.x2 - this._items[index].allocation.x1;
let [posX, posY] = this._items[index].get_transformed_position(); let [posX, posY] = this._items[index].get_transformed_position();
posX += this.actor.x; posX += this.actor.x;
@@ -660,7 +654,7 @@ SwitcherList.prototype = {
_scrollToRight : function() { _scrollToRight : function() {
this._scrollableLeft = true; this._scrollableLeft = true;
let monitor = Main.layoutManager.primaryMonitor; let monitor = global.get_primary_monitor();
let padding = this.actor.get_theme_node().get_horizontal_padding(); let padding = this.actor.get_theme_node().get_horizontal_padding();
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding(); let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
let x = this._items[this._highlighted].allocation.x2 - monitor.width + padding + parentPadding; let x = this._items[this._highlighted].allocation.x2 - monitor.width + padding + parentPadding;
@@ -757,7 +751,7 @@ SwitcherList.prototype = {
let children = this._list.get_children(); let children = this._list.get_children();
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let parentRightPadding = this.actor.get_parent().get_theme_node().get_padding(St.Side.RIGHT); let parentRightPadding = this.actor.get_parent().get_theme_node().get_padding(St.Side.RIGHT);
if (this.actor.allocation.x2 == primary.x + primary.width - parentRightPadding) { if (this.actor.allocation.x2 == primary.x + primary.width - parentRightPadding) {
if (this._squareItems) if (this._squareItems)
@@ -887,7 +881,7 @@ AppSwitcher.prototype = {
totalSpacing += this._separator.width + this._list.spacing; totalSpacing += this._separator.width + this._list.spacing;
// We just assume the whole screen here due to weirdness happing with the passed width // We just assume the whole screen here due to weirdness happing with the passed width
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding(); let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
let availWidth = primary.width - parentPadding - this.actor.get_theme_node().get_horizontal_padding(); let availWidth = primary.width - parentPadding - this.actor.get_theme_node().get_horizontal_padding();
let height = 0; let height = 0;
@@ -985,7 +979,7 @@ AppSwitcher.prototype = {
_addIcon : function(appIcon) { _addIcon : function(appIcon) {
this.icons.push(appIcon); this.icons.push(appIcon);
this.addItem(appIcon.actor, appIcon.label); this.addItem(appIcon.actor);
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' });
@@ -1055,12 +1049,9 @@ 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);
} }
}, },

View File

@@ -9,6 +9,8 @@ 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;
@@ -44,7 +46,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,
style_class: 'vfade' }); vfade: true });
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,
@@ -172,12 +174,10 @@ ViewByCategories.prototype = {
// (used only before the actor is mapped the first time) // (used only before the actor is mapped the first time)
this._currentCategory = -2; this._currentCategory = -2;
this._filters = new St.BoxLayout({ vertical: true, reactive: true }); this._filters = new St.BoxLayout({ vertical: true, reactive: true });
this._filtersBox = new St.ScrollView({ x_fill: false, this._filters.connect('scroll-event', Lang.bind(this, this._scrollFilter));
y_fill: false,
style_class: 'vfade' });
this._filtersBox.add_actor(this._filters);
this.actor.add(this._view.actor, { expand: true, x_fill: true, y_fill: true }); this.actor.add(this._view.actor, { expand: true, x_fill: true, y_fill: true });
this.actor.add(this._filtersBox, { expand: false, y_fill: false, y_align: St.Align.START }); this.actor.add(this._filters, { expand: false, y_fill: false, y_align: St.Align.START });
// Always select the "All" filter when switching to the app view // Always select the "All" filter when switching to the app view
this.actor.connect('notify::mapped', Lang.bind(this, this.actor.connect('notify::mapped', Lang.bind(this,
@@ -195,6 +195,14 @@ ViewByCategories.prototype = {
this.actor.add(this._focusDummy); this.actor.add(this._focusDummy);
}, },
_scrollFilter: function(actor, event) {
let direction = event.get_scroll_direction();
if (direction == Clutter.ScrollDirection.UP)
this._selectCategory(Math.max(this._currentCategory - 1, -1))
else if (direction == Clutter.ScrollDirection.DOWN)
this._selectCategory(Math.min(this._currentCategory + 1, this._sections.length - 1));
},
_selectCategory: function(num) { _selectCategory: function(num) {
if (this._currentCategory == num) // nothing to do if (this._currentCategory == num) // nothing to do
return; return;
@@ -327,16 +335,8 @@ BaseAppSearchProvider.prototype = {
params = Params.parse(params, { workspace: null, params = Params.parse(params, { workspace: null,
timestamp: null }); timestamp: null });
let workspace = params.workspace ? params.workspace.index() : -1;
let event = Clutter.get_current_event();
let modifiers = event ? Shell.get_event_state(event) : 0;
let openNewWindow = modifiers & Clutter.ModifierType.CONTROL_MASK;
let app = this._appSys.get_app(id); let app = this._appSys.get_app(id);
if (openNewWindow) app.activate(params.workspace ? params.workspace.index() : -1);
app.open_new_window(workspace);
else
app.activate(workspace);
}, },
dragActivateResult: function(id, params) { dragActivateResult: function(id, params) {
@@ -434,8 +434,6 @@ 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));

View File

@@ -3,6 +3,8 @@
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;

View File

@@ -1,278 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Lang = imports.lang;
const DBus = imports.dbus;
const Mainloop = imports.mainloop;
const Gio = imports.gi.Gio;
const Params = imports.misc.params;
const Main = imports.ui.main;
const ShellMountOperation = imports.ui.shellMountOperation;
const ScreenSaver = imports.misc.screenSaver;
// GSettings keys
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
const SETTING_ENABLE_AUTOMOUNT = 'automount';
const AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
const ConsoleKitSessionIface = {
name: 'org.freedesktop.ConsoleKit.Session',
methods: [{ name: 'IsActive',
inSignature: '',
outSignature: 'b' }],
signals: [{ name: 'ActiveChanged',
inSignature: 'b' }]
};
const ConsoleKitSessionProxy = DBus.makeProxyClass(ConsoleKitSessionIface);
const ConsoleKitManagerIface = {
name: 'org.freedesktop.ConsoleKit.Manager',
methods: [{ name: 'GetCurrentSession',
inSignature: '',
outSignature: 'o' }]
};
function ConsoleKitManager() {
this._init();
};
ConsoleKitManager.prototype = {
_init: function() {
this.sessionActive = true;
DBus.system.proxifyObject(this,
'org.freedesktop.ConsoleKit',
'/org/freedesktop/ConsoleKit/Manager');
DBus.system.watch_name('org.freedesktop.ConsoleKit',
false, // do not launch a name-owner if none exists
Lang.bind(this, this._onManagerAppeared),
Lang.bind(this, this._onManagerVanished));
},
_onManagerAppeared: function(owner) {
this.GetCurrentSessionRemote(Lang.bind(this, this._onCurrentSession));
},
_onManagerVanished: function(oldOwner) {
this.sessionActive = true;
},
_onCurrentSession: function(session) {
this._ckSession = new ConsoleKitSessionProxy(DBus.system, 'org.freedesktop.ConsoleKit', session);
this._ckSession.connect
('ActiveChanged', Lang.bind(this, function(object, isActive) {
this.sessionActive = isActive;
}));
this._ckSession.IsActiveRemote(Lang.bind(this, function(isActive) {
this.sessionActive = isActive;
}));
}
};
DBus.proxifyPrototype(ConsoleKitManager.prototype, ConsoleKitManagerIface);
function AutomountManager() {
this._init();
}
AutomountManager.prototype = {
_init: function() {
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
this._volumeQueue = [];
this.ckListener = new ConsoleKitManager();
this._ssProxy = new ScreenSaver.ScreenSaverProxy();
this._ssProxy.connect('ActiveChanged',
Lang.bind(this,
this._screenSaverActiveChanged));
this._volumeMonitor = Gio.VolumeMonitor.get();
this._volumeMonitor.connect('volume-added',
Lang.bind(this,
this._onVolumeAdded));
this._volumeMonitor.connect('volume-removed',
Lang.bind(this,
this._onVolumeRemoved));
this._volumeMonitor.connect('drive-connected',
Lang.bind(this,
this._onDriveConnected));
this._volumeMonitor.connect('drive-disconnected',
Lang.bind(this,
this._onDriveDisconnected));
this._volumeMonitor.connect('drive-eject-button',
Lang.bind(this,
this._onDriveEjectButton));
Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
},
_screenSaverActiveChanged: function(object, isActive) {
if (!isActive) {
this._volumeQueue.forEach(Lang.bind(this, function(volume) {
this._checkAndMountVolume(volume);
}));
}
// clear the queue anyway
this._volumeQueue = [];
},
_startupMountAll: function() {
let volumes = this._volumeMonitor.get_volumes();
volumes.forEach(Lang.bind(this, function(volume) {
this._checkAndMountVolume(volume, { checkSession: false,
useMountOp: false });
}));
return false;
},
_onDriveConnected: function() {
// if we're not in the current ConsoleKit session,
// or screensaver is active, don't play sounds
if (!this.ckListener.sessionActive)
return;
if (this._ssProxy.screenSaverActive)
return;
global.play_theme_sound(0, 'device-added-media');
},
_onDriveDisconnected: function() {
// if we're not in the current ConsoleKit session,
// or screensaver is active, don't play sounds
if (!this.ckListener.sessionActive)
return;
if (this._ssProxy.screenSaverActive)
return;
global.play_theme_sound(0, 'device-removed-media');
},
_onDriveEjectButton: function(monitor, drive) {
// TODO: this code path is not tested, as the GVfs volume monitor
// doesn't emit this signal just yet.
if (!this.ckListener.sessionActive)
return;
// we force stop/eject in this case, so we don't have to pass a
// mount operation object
if (drive.can_stop()) {
drive.stop
(Gio.MountUnmountFlags.FORCE, null, null,
Lang.bind(this, function(drive, res) {
try {
drive.stop_finish(res);
} catch (e) {
log("Unable to stop the drive after drive-eject-button " + e.toString());
}
}));
} else if (drive.can_eject()) {
drive.eject_with_operation
(Gio.MountUnmountFlags.FORCE, null, null,
Lang.bind(this, function(drive, res) {
try {
drive.eject_with_operation_finish(res);
} catch (e) {
log("Unable to eject the drive after drive-eject-button " + e.toString());
}
}));
}
},
_onVolumeAdded: function(monitor, volume) {
this._checkAndMountVolume(volume);
},
_checkAndMountVolume: function(volume, params) {
params = Params.parse(params, { checkSession: true,
useMountOp: true });
if (params.checkSession) {
// if we're not in the current ConsoleKit session,
// don't attempt automount
if (!this.ckListener.sessionActive)
return;
if (this._ssProxy.screenSaverActive) {
if (this._volumeQueue.indexOf(volume) == -1)
this._volumeQueue.push(volume);
return;
}
}
if (!this._settings.get_boolean(SETTING_ENABLE_AUTOMOUNT) ||
!volume.should_automount() ||
!volume.can_mount()) {
// allow the autorun to run anyway; this can happen if the
// mount gets added programmatically later, even if
// should_automount() or can_mount() are false, like for
// blank optical media.
this._allowAutorun(volume);
this._allowAutorunExpire(volume);
return;
}
if (params.useMountOp) {
let operation = new ShellMountOperation.ShellMountOperation(volume);
this._mountVolume(volume, operation.mountOp);
} else {
this._mountVolume(volume, null);
}
},
_mountVolume: function(volume, operation) {
this._allowAutorun(volume);
volume.mount(0, operation, null,
Lang.bind(this, this._onVolumeMounted));
},
_onVolumeMounted: function(volume, res) {
this._allowAutorunExpire(volume);
try {
volume.mount_finish(res);
} catch (e) {
let string = e.toString();
// FIXME: needs proper error code handling instead of this
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480
if (string.indexOf('No key available with this passphrase') != -1)
this._reaskPassword(volume);
else
log('Unable to mount volume ' + volume.get_name() + ': ' + string);
}
},
_onVolumeRemoved: function(monitor, volume) {
this._volumeQueue =
this._volumeQueue.filter(function(element) {
return (element != volume);
});
},
_reaskPassword: function(volume) {
let operation = new ShellMountOperation.ShellMountOperation(volume, { reaskPassword: true });
this._mountVolume(volume, operation.mountOp);
},
_allowAutorun: function(volume) {
volume.allowAutorun = true;
},
_allowAutorunExpire: function(volume) {
Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, function() {
volume.allowAutorun = false;
return false;
});
}
}

View File

@@ -1,634 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Lang = imports.lang;
const DBus = imports.dbus;
const Gio = imports.gi.Gio;
const St = imports.gi.St;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const ShellMountOperation = imports.ui.shellMountOperation;
// GSettings keys
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
const SETTING_DISABLE_AUTORUN = 'autorun-never';
const SETTING_START_APP = 'autorun-x-content-start-app';
const SETTING_IGNORE = 'autorun-x-content-ignore';
const SETTING_OPEN_FOLDER = 'autorun-x-content-open-folder';
const AutorunSetting = {
RUN: 0,
IGNORE: 1,
FILES: 2,
ASK: 3
};
const HOTPLUG_ICON_SIZE = 16;
// misc utils
function ignoreAutorunForMount(mount) {
let root = mount.get_root();
let volume = mount.get_volume();
if ((root.is_native() && !isMountRootHidden(root)) ||
(volume && volume.allowAutorun && volume.should_automount()))
return false;
return true;
}
function isMountRootHidden(root) {
let path = root.get_path();
// skip any mounts in hidden directory hierarchies
return (path.indexOf('/.') != -1);
}
function startAppForMount(app, mount) {
let files = [];
let root = mount.get_root();
let retval = false;
files.push(root);
try {
retval = app.launch(files,
global.create_app_launch_context())
} catch (e) {
log('Unable to launch the application ' + app.get_name()
+ ': ' + e.toString());
}
return retval;
}
/******************************************/
const HotplugSnifferIface = {
name: 'org.gnome.Shell.HotplugSniffer',
methods: [{ name: 'SniffURI',
inSignature: 's',
outSignature: 'as' }]
};
const HotplugSniffer = function() {
this._init();
};
HotplugSniffer.prototype = {
_init: function() {
DBus.session.proxifyObject(this,
'org.gnome.Shell.HotplugSniffer',
'/org/gnome/Shell/HotplugSniffer');
},
};
DBus.proxifyPrototype(HotplugSniffer.prototype, HotplugSnifferIface);
function ContentTypeDiscoverer(callback) {
this._init(callback);
}
ContentTypeDiscoverer.prototype = {
_init: function(callback) {
this._callback = callback;
},
guessContentTypes: function(mount) {
// guess mount's content types using GIO
mount.guess_content_type(false, null,
Lang.bind(this,
this._onContentTypeGuessed));
},
_onContentTypeGuessed: function(mount, res) {
let contentTypes = [];
try {
contentTypes = mount.guess_content_type_finish(res);
} catch (e) {
log('Unable to guess content types on added mount ' + mount.get_name()
+ ': ' + e.toString());
}
if (contentTypes.length) {
this._emitCallback(mount, contentTypes);
} else {
let root = mount.get_root();
let hotplugSniffer = new HotplugSniffer();
hotplugSniffer.SniffURIRemote
(root.get_uri(), DBus.CALL_FLAG_START,
Lang.bind(this, function(contentTypes) {
this._emitCallback(mount, contentTypes);
}));
}
},
_emitCallback: function(mount, contentTypes) {
if (!contentTypes)
contentTypes = [];
// we're not interested in win32 software content types here
contentTypes = contentTypes.filter(function(type) {
return (type != 'x-content/win32-software');
});
let apps = [];
contentTypes.forEach(function(type) {
let app = Gio.app_info_get_default_for_type(type, false);
if (app)
apps.push(app);
});
if (apps.length == 0)
apps.push(Gio.app_info_get_default_for_type('inode/directory', false));
this._callback(mount, apps, contentTypes);
}
}
function AutorunManager() {
this._init();
}
AutorunManager.prototype = {
_init: function() {
this._volumeMonitor = Gio.VolumeMonitor.get();
this._volumeMonitor.connect('mount-added',
Lang.bind(this,
this._onMountAdded));
this._volumeMonitor.connect('mount-removed',
Lang.bind(this,
this._onMountRemoved));
this._transDispatcher = new AutorunTransientDispatcher();
this._createResidentSource();
let mounts = this._volumeMonitor.get_mounts();
mounts.forEach(Lang.bind(this, function (mount) {
let discoverer = new ContentTypeDiscoverer(Lang.bind (this,
function (mount, apps) {
this._residentSource.addMount(mount, apps);
}));
discoverer.guessContentTypes(mount);
}));
},
_createResidentSource: function() {
this._residentSource = new AutorunResidentSource();
this._residentSource.connect('destroy',
Lang.bind(this,
this._createResidentSource));
},
_onMountAdded: function(monitor, mount) {
// don't do anything if our session is not the currently
// active one
if (!Main.automountManager.ckListener.sessionActive)
return;
let discoverer = new ContentTypeDiscoverer(Lang.bind (this,
function (mount, apps, contentTypes) {
this._transDispatcher.addMount(mount, apps, contentTypes);
this._residentSource.addMount(mount, apps);
}));
discoverer.guessContentTypes(mount);
},
_onMountRemoved: function(monitor, mount) {
this._transDispatcher.removeMount(mount);
this._residentSource.removeMount(mount);
},
ejectMount: function(mount) {
let mountOp = new ShellMountOperation.ShellMountOperation(mount);
// first, see if we have a drive
let drive = mount.get_drive();
let volume = mount.get_volume();
if (drive &&
drive.get_start_stop_type() == Gio.DriveStartStopType.SHUTDOWN &&
drive.can_stop()) {
drive.stop(0, mountOp.mountOp, null,
Lang.bind(this, this._onStop));
} else {
if (mount.can_eject()) {
mount.eject_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onEject));
} else if (volume && volume.can_eject()) {
volume.eject_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onEject));
} else if (drive && drive.can_eject()) {
drive.eject_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onEject));
} else if (mount.can_unmount()) {
mount.unmount_with_operation(0, mountOp.mountOp, null,
Lang.bind(this, this._onUnmount));
}
}
},
_onUnmount: function(mount, res) {
try {
mount.unmount_with_operation_finish(res);
} catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
// but we can't access the error code from JS.
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480
log('Unable to eject the mount ' + mount.get_name()
+ ': ' + e.toString());
}
},
_onEject: function(source, res) {
try {
source.eject_with_operation_finish(res);
} catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
// but we can't access the error code from JS.
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480
log('Unable to eject the drive ' + source.get_name()
+ ': ' + e.toString());
}
},
_onStop: function(drive, res) {
try {
drive.stop_finish(res);
} catch (e) {
// FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
// but we can't access the error code from JS.
// See https://bugzilla.gnome.org/show_bug.cgi?id=591480
log('Unable to stop the drive ' + drive.get_name()
+ ': ' + e.toString());
}
},
}
function AutorunResidentSource() {
this._init();
}
AutorunResidentSource.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function() {
MessageTray.Source.prototype._init.call(this, _('Removable Devices'));
this._mounts = [];
this._notification = new AutorunResidentNotification(this);
this._setSummaryIcon(this.createNotificationIcon(HOTPLUG_ICON_SIZE));
},
addMount: function(mount, apps) {
if (ignoreAutorunForMount(mount))
return;
let filtered = this._mounts.filter(function (element) {
return (element.mount == mount);
});
if (filtered.length != 0)
return;
let element = { mount: mount, apps: apps };
this._mounts.push(element);
this._redisplay();
},
removeMount: function(mount) {
this._mounts =
this._mounts.filter(function (element) {
return (element.mount != mount);
});
this._redisplay();
},
_redisplay: function() {
if (this._mounts.length == 0) {
this._notification.destroy();
this.destroy();
return;
}
this._notification.updateForMounts(this._mounts);
// add ourselves as a source, and push the notification
if (!Main.messageTray.contains(this)) {
Main.messageTray.add(this);
this.pushNotification(this._notification);
}
},
createNotificationIcon: function(iconSize) {
return new St.Icon ({ icon_name: 'drive-harddisk',
icon_size: iconSize ? iconSize : this.ICON_SIZE });
}
}
function AutorunResidentNotification(source) {
this._init(source);
}
AutorunResidentNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source) {
MessageTray.Notification.prototype._init.call(this, source,
source.title, null,
{ customContent: true });
// set the notification as resident
this.setResident(true);
this._layout = new St.BoxLayout ({ style_class: 'hotplug-resident-box',
vertical: true });
this.addActor(this._layout,
{ x_expand: true,
x_fill: true });
},
updateForMounts: function(mounts) {
// remove all the layout content
this._layout.destroy_children();
for (let idx = 0; idx < mounts.length; idx++) {
let element = mounts[idx];
let actor = this._itemForMount(element.mount, element.apps);
this._layout.add(actor, { x_fill: true,
expand: true });
}
},
_itemForMount: function(mount, apps) {
let item = new St.BoxLayout();
// prepare the mount button content
let mountLayout = new St.BoxLayout();
let mountIcon = new St.Icon({ gicon: mount.get_icon(),
style_class: 'hotplug-resident-mount-icon' });
mountLayout.add_actor(mountIcon);
let labelBin = new St.Bin({ y_align: St.Align.MIDDLE });
let mountLabel =
new St.Label({ text: mount.get_name(),
style_class: 'hotplug-resident-mount-label',
track_hover: true,
reactive: true });
labelBin.add_actor(mountLabel);
mountLayout.add_actor(labelBin);
let mountButton = new St.Button({ child: mountLayout,
x_align: St.Align.START,
x_fill: true,
style_class: 'hotplug-resident-mount',
button_mask: St.ButtonMask.ONE });
item.add(mountButton, { x_align: St.Align.START,
expand: true });
let ejectIcon =
new St.Icon({ icon_name: 'media-eject',
style_class: 'hotplug-resident-eject-icon' });
let ejectButton =
new St.Button({ style_class: 'hotplug-resident-eject-button',
button_mask: St.ButtonMask.ONE,
child: ejectIcon });
item.add(ejectButton, { x_align: St.Align.END });
// now connect signals
mountButton.connect('clicked', Lang.bind(this, function(actor, event) {
startAppForMount(apps[0], mount);
}));
ejectButton.connect('clicked', Lang.bind(this, function() {
Main.autorunManager.ejectMount(mount);
}));
return item;
},
}
function AutorunTransientDispatcher() {
this._init();
}
AutorunTransientDispatcher.prototype = {
_init: function() {
this._sources = [];
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
},
_getAutorunSettingForType: function(contentType) {
let runApp = this._settings.get_strv(SETTING_START_APP);
if (runApp.indexOf(contentType) != -1)
return AutorunSetting.RUN;
let ignore = this._settings.get_strv(SETTING_IGNORE);
if (ignore.indexOf(contentType) != -1)
return AutorunSetting.IGNORE;
let openFiles = this._settings.get_strv(SETTING_OPEN_FOLDER);
if (openFiles.indexOf(contentType) != -1)
return AutorunSetting.FILES;
return AutorunSetting.ASK;
},
_getSourceForMount: function(mount) {
let filtered =
this._sources.filter(function (source) {
return (source.mount == mount);
});
// we always make sure not to add two sources for the same
// mount in addMount(), so it's safe to assume filtered.length
// is always either 1 or 0.
if (filtered.length == 1)
return filtered[0];
return null;
},
_addSource: function(mount, apps) {
// if we already have a source showing for this
// mount, return
if (this._getSourceForMount(mount))
return;
// add a new source
this._sources.push(new AutorunTransientSource(mount, apps));
},
addMount: function(mount, apps, contentTypes) {
// if autorun is disabled globally, return
if (this._settings.get_boolean(SETTING_DISABLE_AUTORUN))
return;
// if the mount doesn't want to be autorun, return
if (ignoreAutorunForMount(mount))
return;
let setting = this._getAutorunSettingForType(contentTypes[0]);
// check at the settings for the first content type
// to see whether we should ask
if (setting == AutorunSetting.IGNORE)
return; // return right away
let success = false;
let app = null;
if (setting == AutorunSetting.RUN) {
app = Gio.app_info_get_default_for_type(type, false);
} else if (setting == AutorunSetting.FILES) {
app = Gio.app_info_get_default_for_type('inode/directory', false);
}
if (app)
success = startAppForMount(app, mount);
// we fallback here also in case the settings did not specify 'ask',
// but we failed launching the default app or the default file manager
if (!success)
this._addSource(mount, apps);
},
removeMount: function(mount) {
let source = this._getSourceForMount(mount);
// if we aren't tracking this mount, don't do anything
if (!source)
return;
// destroy the notification source
source.destroy();
}
}
function AutorunTransientSource(mount, apps) {
this._init(mount, apps);
}
AutorunTransientSource.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function(mount, apps) {
MessageTray.Source.prototype._init.call(this, mount.get_name());
this.mount = mount;
this.apps = apps;
this._notification = new AutorunTransientNotification(this);
this._setSummaryIcon(this.createNotificationIcon(this.ICON_SIZE));
// add ourselves as a source, and popup the notification
Main.messageTray.add(this);
this.notify(this._notification);
},
createNotificationIcon: function(iconSize) {
return new St.Icon({ gicon: this.mount.get_icon(),
icon_size: iconSize ? iconSize : this.ICON_SIZE });
}
}
function AutorunTransientNotification(source) {
this._init(source);
}
AutorunTransientNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source) {
MessageTray.Notification.prototype._init.call(this, source,
source.title, null,
{ customContent: true });
this._box = new St.BoxLayout({ style_class: 'hotplug-transient-box',
vertical: true });
this.addActor(this._box);
this._mount = source.mount;
source.apps.forEach(Lang.bind(this, function (app) {
let actor = this._buttonForApp(app);
if (actor)
this._box.add(actor, { x_fill: true,
x_align: St.Align.START });
}));
this._box.add(this._buttonForEject(), { x_fill: true,
x_align: St.Align.START });
// set the notification to transient and urgent, so that it
// expands out
this.setTransient(true);
this.setUrgency(MessageTray.Urgency.CRITICAL);
},
_buttonForApp: function(app) {
let box = new St.BoxLayout();
let icon = new St.Icon({ gicon: app.get_icon(),
style_class: 'hotplug-notification-item-icon' });
box.add(icon);
let label = new St.Bin({ y_align: St.Align.MIDDLE,
child: new St.Label
({ text: _("Open with %s").format(app.get_display_name()) })
});
box.add(label);
let button = new St.Button({ child: box,
x_fill: true,
x_align: St.Align.START,
button_mask: St.ButtonMask.ONE,
style_class: 'hotplug-notification-item' });
button.connect('clicked', Lang.bind(this, function() {
startAppForMount(app, this._mount);
this.destroy();
}));
return button;
},
_buttonForEject: function() {
let box = new St.BoxLayout();
let icon = new St.Icon({ icon_name: 'media-eject',
style_class: 'hotplug-notification-item-icon' });
box.add(icon);
let label = new St.Bin({ y_align: St.Align.MIDDLE,
child: new St.Label
({ text: _("Eject") })
});
box.add(label);
let button = new St.Button({ child: box,
x_fill: true,
x_align: St.Align.START,
button_mask: St.ButtonMask.ONE,
style_class: 'hotplug-notification-item' });
button.connect('clicked', Lang.bind(this, function() {
Main.autorunManager.ejectMount(this._mount);
}));
return button;
}
}

View File

@@ -6,7 +6,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 Main = imports.ui.main;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const POPUP_ANIMATION_TIME = 0.15; const POPUP_ANIMATION_TIME = 0.15;
@@ -330,7 +329,7 @@ BoxPointer.prototype = {
// We also want to keep it onscreen, and separated from the // We also want to keep it onscreen, and separated from the
// edge by the same distance as the main part of the box is // edge by the same distance as the main part of the box is
// separated from its sourceActor // separated from its sourceActor
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
let borderWidth = themeNode.get_length('-arrow-border-width'); let borderWidth = themeNode.get_length('-arrow-border-width');
let arrowBase = themeNode.get_length('-arrow-base'); let arrowBase = themeNode.get_length('-arrow-base');

View File

@@ -8,6 +8,9 @@ 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;

View File

@@ -8,13 +8,13 @@ const Signals = imports.signals;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const ScreenSaver = imports.misc.screenSaver;
// This manages the shell "chrome"; the UI that's visible in the // This manages the shell "chrome"; the UI that's visible in the
// normal mode (ie, outside the Overview), that surrounds the main // normal mode (ie, outside the Overview), that surrounds the main
// workspace content. // workspace content.
const defaultParams = { const defaultParams = {
visibleInOverview: false,
visibleInFullscreen: false, visibleInFullscreen: false,
affectsStruts: true, affectsStruts: true,
affectsInputRegion: true affectsInputRegion: true
@@ -36,12 +36,8 @@ Chrome.prototype = {
this._trackedActors = []; this._trackedActors = [];
Main.connect('initialized', Lang.bind(this, this._finishInit)); global.screen.connect('monitors-changed',
}, Lang.bind(this, this._monitorsChanged));
_finishInit: function() {
Main.layoutManager.connect('monitors-changed',
Lang.bind(this, this._relayout));
global.screen.connect('restacked', global.screen.connect('restacked',
Lang.bind(this, this._windowsRestacked)); Lang.bind(this, this._windowsRestacked));
@@ -54,15 +50,9 @@ Chrome.prototype = {
Main.overview.connect('hidden', Main.overview.connect('hidden',
Lang.bind(this, this._overviewHidden)); Lang.bind(this, this._overviewHidden));
this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy(); this._updateMonitors();
this._screenSaverProxy.connect('ActiveChanged', Lang.bind(this, this._onScreenSaverActiveChanged)); this._updateFullscreen();
this._screenSaverProxy.GetActiveRemote(Lang.bind(this, this._queueUpdateRegions();
function(result, err) {
if (!err)
this._onScreenSaverActiveChanged(this._screenSaverProxy, result);
}));
this._relayout();
}, },
_allocated: function(actor, box, flags) { _allocated: function(actor, box, flags) {
@@ -83,8 +73,11 @@ 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 %visibleInFullscreen is %true, the actor will be visible // If %visibleInOverview is %true in @params, @actor will remain
// even when a fullscreen window should be covering it. // visible when the overview is brought up. Otherwise it will
// 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.
@@ -103,7 +96,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
// %visibleInFullscreen child of a non-%visibleInFullscreen parent). // %visibleInOverview child of a non-%visibleInOverview 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();
@@ -196,8 +189,10 @@ 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.visibleInFullscreen && if (this._inOverview && !actorData.visibleInOverview)
this._findMonitorForActor(actorData.actor).inFullscreen) this.actor.set_skip_paint(actorData.actor, true);
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);
@@ -216,18 +211,18 @@ Chrome.prototype = {
this._queueUpdateRegions(); this._queueUpdateRegions();
}, },
_relayout: function() { _updateMonitors: function() {
this._monitors = Main.layoutManager.monitors; let monitors = global.get_monitors();
this._primaryMonitor = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
this._monitors = monitors;
this._updateFullscreen(); for (let i = 0; i < monitors.length; i++) {
this._updateVisibility(); let monitor = monitors[i];
this._queueUpdateRegions(); if (monitor.x == primary.x &&
}, monitor.y == primary.y &&
monitor.width == primary.width &&
_onScreenSaverActiveChanged: function(proxy, screenSaverActive) { monitor.height == primary.height)
this.actor.visible = !screenSaverActive; this._primaryMonitor = monitor;
this._queueUpdateRegions(); }
}, },
_findMonitorForRect: function(x, y, w, h) { _findMonitorForRect: function(x, y, w, h) {
@@ -266,6 +261,15 @@ Chrome.prototype = {
return this._primaryMonitor; // Not on any monitor, pretend its on the primary return this._primaryMonitor; // Not on any monitor, pretend its on the primary
}, },
_monitorsChanged: function() {
this._updateMonitors();
// Update everything that depends on monitor positions
this._updateFullscreen();
this._updateVisibility();
this._queueUpdateRegions();
},
_queueUpdateRegions: function() { _queueUpdateRegions: function() {
if (!this._updateRegionIdle) if (!this._updateRegionIdle)
this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions), this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions),
@@ -331,6 +335,11 @@ 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() {

View File

@@ -153,14 +153,14 @@ CtrlAltTabPopup.prototype = {
}, },
_getPreferredWidth: function (actor, forHeight, alloc) { _getPreferredWidth: function (actor, forHeight, alloc) {
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
alloc.min_size = primary.width; alloc.min_size = primary.width;
alloc.natural_size = primary.width; alloc.natural_size = primary.width;
}, },
_getPreferredHeight: function (actor, forWidth, alloc) { _getPreferredHeight: function (actor, forWidth, alloc) {
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
alloc.min_size = primary.height; alloc.min_size = primary.height;
alloc.natural_size = primary.height; alloc.natural_size = primary.height;
@@ -168,7 +168,7 @@ CtrlAltTabPopup.prototype = {
_allocate: function (actor, box, flags) { _allocate: function (actor, box, flags) {
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT); let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
let vPadding = this.actor.get_theme_node().get_vertical_padding(); let vPadding = this.actor.get_theme_node().get_vertical_padding();
@@ -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, text); this.addItem(box);
} }
}; };

View File

@@ -6,6 +6,8 @@ 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;
@@ -324,7 +326,7 @@ Dash.prototype = {
this._favRemoveTarget = null; this._favRemoveTarget = null;
})); }));
} }
DND.removeDragMonitor(this._dragMonitor); DND.removeMonitor(this._dragMonitor);
}, },
_onDragMotion: function(dragEvent) { _onDragMotion: function(dragEvent) {
@@ -342,10 +344,7 @@ Dash.prototype = {
let srcIsFavorite = (id in favorites); let srcIsFavorite = (id in favorites);
if (srcIsFavorite && if (srcIsFavorite && this._favRemoveTarget == null) {
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);

View File

@@ -8,6 +8,8 @@ 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;
@@ -198,7 +200,6 @@ 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);
}, },

View File

@@ -61,7 +61,7 @@ function addDragMonitor(monitor) {
dragMonitors.push(monitor); dragMonitors.push(monitor);
} }
function removeDragMonitor(monitor) { function removeMonitor(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 uiGroup // transformed size when it's reparented to the stage
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(Main.uiGroup); this._dragActor.reparent(this.actor.get_stage());
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() == Main.uiGroup) { if (this._dragActor.get_parent() == this._dragActor.get_stage()) {
if (this._restoreOnSuccess) { if (this._restoreOnSuccess) {
this._restoreDragActor(event.get_time()); this._restoreDragActor(event.get_time());
return true; return true;

View File

@@ -1,5 +1,8 @@
/* -*- 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;

View File

@@ -22,6 +22,9 @@ 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;

View File

@@ -1,22 +1,14 @@
/* -*- 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');
// We can't import shell JS modules yet, because they may have const Tweener = imports.ui.tweener;
// 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
@@ -39,42 +31,49 @@ function _patchContainerClass(containerClass) {
}; };
} }
// Replace @method with something that throws an error instead
function _blockMethod(method, replacement, reason) {
let match = method.match(/^(.+)\.([^.]+)$/);
if (!match)
throw new Error('Bad method name "' + method + '"');
let proto = 'imports.gi.' + match[1] + '.prototype';
let property = match[2];
if (!global.set_property_mutable(proto, property, true))
throw new Error('Bad method name "' + method + '"');
// eval() is evil in general, but we know it's safe here since
// set_property_mutable() would have failed if proto was
// malformed.
let node = eval(proto);
let msg = 'Do not use "' + method + '".';
if (replacement)
msg += ' Use "' + replacement + '" instead.';
if (reason)
msg += ' (' + reason + ')';
node[property] = function() {
throw new Error(msg);
};
global.set_property_mutable(proto, property, false);
}
function init() { function init() {
// Add some bindings to the global JS namespace; (gjs keeps the web Tweener.init();
// browser convention of having that namespace be called 'window'.) String.prototype.format = Format.format;
window.global = Shell.Global.get();
window._ = Gettext.gettext;
window.C_ = Gettext.pgettext;
window.ngettext = Gettext.ngettext;
// Set the default direction for St widgets (this needs to be done before any use of St)
if (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL) {
St.Widget.set_default_direction(St.TextDirection.RTL);
}
// Miscellaneous monkeypatching
_patchContainerClass(St.BoxLayout);
_patchContainerClass(St.Table);
Clutter.Actor.prototype.toString = function() {
return St.describe_actor(this);
};
let origToString = Object.prototype.toString;
Object.prototype.toString = function() {
let base = origToString.call(this);
if ('actor' in this && this.actor instanceof Clutter.Actor)
return base.replace(/\]$/, ' delegate for ' + this.actor.toString().substring(1));
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);
@@ -82,10 +81,24 @@ function init() {
St.set_slow_down_factor(factor); St.set_slow_down_factor(factor);
} }
// OK, now things are initialized enough that we can import shell JS _patchContainerClass(St.BoxLayout);
const Format = imports.misc.format; _patchContainerClass(St.Table);
const Tweener = imports.ui.tweener;
Tweener.init(); Clutter.Actor.prototype.toString = function() {
String.prototype.format = Format.format; return St.describe_actor(this);
};
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;
} }

View File

@@ -23,9 +23,8 @@ const ExtensionType = {
const extensionMeta = {}; const extensionMeta = {};
// Maps uuid -> importer object (extension directory tree) // Maps uuid -> importer object (extension directory tree)
const extensions = {}; const extensions = {};
// Arrays of uuids // Array of uuids
var disabledExtensions; var disabledExtensions;
var enabledExtensions;
// GFile for user extensions // GFile for user extensions
var userExtensionsDir = null; var userExtensionsDir = null;
@@ -179,7 +178,6 @@ 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) {
@@ -197,10 +195,7 @@ 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();
// Enable all but disabled extensions if enabledExtensions is not set. let enabled = disabledExtensions.indexOf(name) < 0;
// 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);
} }

View File

@@ -42,10 +42,10 @@ BaseIcon.prototype = {
box.add_actor(this._iconBin); box.add_actor(this._iconBin);
if (params.showLabel) { if (params.showLabel) {
this.label = new St.Label({ text: label }); this._name = new St.Label({ text: label });
box.add_actor(this.label); box.add_actor(this._name);
} else { } else {
this.label = null; this._name = 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.label) { if (this._name) {
let [labelMinHeight, labelNatHeight] = this.label.get_preferred_height(-1); let [labelMinHeight, labelNatHeight] = this._name.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.label.allocate(childBox, flags); this._name.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.label) { if (this._name) {
let [labelMinHeight, labelNatHeight] = this.label.get_preferred_height(forWidth); let [labelMinHeight, labelNatHeight] = this._name.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;
} }

View File

@@ -1,609 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Caribou = imports.gi.Caribou;
const Clutter = imports.gi.Clutter;
const DBus = imports.dbus;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const PopupMenu = imports.ui.popupMenu;
const Tweener = imports.ui.tweener;
const KEYBOARD_SCHEMA = 'org.gnome.shell.keyboard';
const SHOW_KEYBOARD = 'show-keyboard';
const KEYBOARD_TYPE = 'keyboard-type';
const ENABLE_DRAGGABLE = 'enable-drag';
const ENABLE_FLOAT = 'enable-float';
// Key constants taken from Antler
const PRETTY_KEYS = {
'BackSpace': '\u232b',
'space': ' ',
'Return': '\u23ce',
'Caribou_Prefs': '\u2328',
'Caribou_ShiftUp': '\u2b06',
'Caribou_ShiftDown': '\u2b07',
'Caribou_Emoticons': '\u263a',
'Caribou_Symbols': '123',
'Caribou_Symbols_More': '{#*',
'Caribou_Alpha': 'Abc',
'Tab': 'Tab',
'Escape': 'Esc',
'Control_L': 'Ctrl',
'Alt_L': 'Alt'
};
const CaribouKeyboardIface = {
name: 'org.gnome.Caribou.Keyboard',
methods: [ { name: 'Show',
inSignature: '',
outSignature: ''
},
{ name: 'Hide',
inSignature: '',
outSignature: ''
},
{ name: 'SetCursorLocation',
inSignature: 'iiii',
outSignature: ''
},
{ name: 'SetEntryLocation',
inSignature: 'iiii',
outSignature: ''
} ],
properties: [ { name: 'Name',
signature: 's',
access: 'read' } ]
};
function Key() {
this._init.apply(this, arguments);
}
Key.prototype = {
_init : function(key, key_width, key_height) {
this._key = key;
this._width = key_width;
this._height = key_height;
this.actor = this._getKey();
this._extended_keys = this._key.get_extended_keys();
this._extended_keyboard = {};
if (this._key.name == "Control_L" || this._key.name == "Alt_L")
this._key.latch = true;
this._key.connect('key-pressed', Lang.bind(this, function ()
{ this.actor.checked = true }));
this._key.connect('key-released', Lang.bind(this, function ()
{ this.actor.checked = false; }));
if (this._extended_keys.length > 0) {
this._grabbed = false;
this._eventCaptureId = 0;
this._key.connect('notify::show-subkeys', Lang.bind(this, this._onShowSubkeysChanged));
this._boxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
{ x_fill: true,
y_fill: true,
x_align: St.Align.START });
// Adds style to existing keyboard style to avoid repetition
this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
this._getExtendedKeys();
this.actor._extended_keys = this._extended_keyboard;
this._boxPointer.actor.hide();
Main.chrome.addActor(this._boxPointer.actor, { visibleInFullscreen: true,
affectsStruts: false });
}
},
_getKey: function () {
let label = this._key.name;
if (label.length > 1) {
let pretty = PRETTY_KEYS[label];
if (pretty)
label = pretty;
else
label = this._getUnichar(this._key);
}
label = GLib.markup_escape_text(label, -1);
let button = new St.Button ({ label: label, style_class: 'keyboard-key' });
button.width = this._width;
button.key_width = this._key.width;
button.height = this._height;
button.draggable = false;
button.connect('button-press-event', Lang.bind(this, function () { this._key.press(); }));
button.connect('button-release-event', Lang.bind(this, function () { this._key.release(); }));
return button;
},
_getUnichar: function(key) {
let keyval = key.keyval;
let unichar = Gdk.keyval_to_unicode(keyval);
if (unichar) {
return String.fromCharCode(unichar);
} else {
return key.name;
}
},
_getExtendedKeys: function () {
this._extended_keyboard = new St.BoxLayout({ style_class: 'keyboard-layout',
vertical: false });
for (let i = 0; i < this._extended_keys.length; ++i) {
let extended_key = this._extended_keys[i];
let label = this._getUnichar(extended_key);
let key = new St.Button({ label: label, style_class: 'keyboard-key' });
key.extended_key = extended_key;
key.width = this._width;
key.height = this._height;
key.draggable = false;
key.connect('button-press-event', Lang.bind(this, function () { extended_key.press(); }));
key.connect('button-release-event', Lang.bind(this, function () { extended_key.release(); }));
this._extended_keyboard.add(key);
}
this._boxPointer.bin.add_actor(this._extended_keyboard);
},
_onEventCapture: function (actor, event) {
let source = event.get_source();
if (event.type() == Clutter.EventType.BUTTON_PRESS ||
(event.type() == Clutter.EventType.BUTTON_RELEASE && source.draggable)) {
if (this._extended_keyboard.contains(source)) {
if (source.draggable) {
source.extended_key.press();
source.extended_key.release();
}
this._ungrab();
return false;
}
this._boxPointer.actor.hide();
this._ungrab();
return true;
}
return false;
},
_ungrab: function () {
global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0;
this._grabbed = false;
Main.popModal(this.actor);
},
_onShowSubkeysChanged: function () {
if (this._key.show_subkeys) {
this.actor.fake_release();
this._boxPointer.actor.raise_top();
this._boxPointer.setPosition(this.actor, 5, 0.5);
this._boxPointer.show(true);
this.actor.set_hover(false);
if (!this._grabbed) {
Main.pushModal(this.actor);
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture));
this._grabbed = true;
}
this._key.release();
} else {
if (this._grabbed)
this._ungrab();
this._boxPointer.hide(true);
}
}
};
function Keyboard() {
this._init.apply(this, arguments);
}
Keyboard.prototype = {
_init: function () {
DBus.session.exportObject('/org/gnome/Caribou/Keyboard', this);
DBus.session.acquire_name('org.gnome.Caribou.Keyboard', 0, null, null);
this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA });
this._keyboardSettings.connect('changed', Lang.bind(this, this._display));
this._setupKeyboard();
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._redraw));
Main.layoutManager.bottomBox.add_actor(this.actor);
},
init: function () {
this._display();
},
_setupKeyboard: function() {
if (this._keyboardNotifyId)
this._keyboard.disconnect(this._keyboardNotifyId);
let children = this.actor.get_children();
for (let i = 0; i < children.length; i++)
children[i].destroy();
this._keyboard = new Caribou.KeyboardModel({ keyboard_type: this._keyboardSettings.get_string(KEYBOARD_TYPE) });
this._groups = {};
this._current_page = null;
// Initialize keyboard key measurements
this._numOfHorizKeys = 0;
this._numOfVertKeys = 0;
this._floatId = 0;
this._addKeys();
this._keyboardNotifyId = this._keyboard.connect('notify::active-group', Lang.bind(this, this._onGroupChanged));
},
_display: function () {
if (this._keyboard.keyboard_type != this._keyboardSettings.get_string(KEYBOARD_TYPE))
this._setupKeyboard();
this._showKeyboard = this._keyboardSettings.get_boolean(SHOW_KEYBOARD);
this._draggable = this._keyboardSettings.get_boolean(ENABLE_DRAGGABLE);
this._floating = this._keyboardSettings.get_boolean(ENABLE_FLOAT);
if (this._floating) {
this._floatId = this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
this._dragging = false;
}
else
this.actor.disconnect(this._floatId);
if (this._showKeyboard)
this.show();
else {
this.hide();
this.destroySource();
}
},
_startDragging: function (actor, event) {
if (this._dragging) // don't allow two drags at the same time
return;
this._dragging = true;
this._preDragStageMode = global.stage_input_mode;
Clutter.grab_pointer(this.actor);
global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN);
this._releaseId = this.actor.connect('button-release-event', Lang.bind(this, this._endDragging));
this._motionId = this.actor.connect('motion-event', Lang.bind(this, this._motionEvent));
[this._dragStartX, this._dragStartY] = event.get_coords();
[this._currentX, this._currentY] = this.actor.get_position();
},
_endDragging: function () {
if (this._dragging) {
this.actor.disconnect(this._releaseId);
this.actor.disconnect(this._motionId);
Clutter.ungrab_pointer();
global.set_stage_input_mode(this._preDragStageMode);
global.unset_cursor();
this._dragging = false;
}
return true;
},
_motionEvent: function(actor, event) {
let absX, absY;
[absX, absY] = event.get_coords();
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
this._moveHandle(absX, absY);
return true;
},
_moveHandle: function (stageX, stageY) {
let x, y;
x = stageX - this._dragStartX + this._currentX;
y = stageY - this._dragStartY + this._currentY;
this.actor.set_position(x,y);
},
_addKeys: function () {
let groups = this._keyboard.get_groups();
for (let i = 0; i < groups.length; ++i) {
let gname = groups[i];
let group = this._keyboard.get_group(gname);
group.connect('notify::active-level', Lang.bind(this, this._onLevelChanged));
let layers = {};
let levels = group.get_levels();
for (let j = 0; j < levels.length; ++j) {
let lname = levels[j];
let level = group.get_level(lname);
let layout = new St.BoxLayout({ style_class: 'keyboard-layout',
vertical: true });
this._loadRows(level, layout);
layers[lname] = layout;
this.actor.add(layout, { x_fill: false });
layout.hide();
}
this._groups[gname] = layers;
}
this._setActiveLayer();
},
_getTrayIcon: function () {
let trayButton = new St.Button ({ label: "tray", style_class: 'keyboard-key' });
trayButton.key_width = 1;
trayButton.connect('button-press-event', Lang.bind(this, function () {
Main.layoutManager.updateForTray();
}));
Main.overview.connect('showing', Lang.bind(this, function () {
trayButton.reactive = false;
trayButton.add_style_pseudo_class('grayed');
}));
Main.overview.connect('hiding', Lang.bind(this, function () {
trayButton.reactive = true;
trayButton.remove_style_pseudo_class('grayed');
}));
return trayButton;
},
_addRows : function (keys, layout) {
let keyboard_row = new St.BoxLayout();
for (let i = 0; i < keys.length; ++i) {
let children = keys[i].get_children();
let right_box = new St.BoxLayout({ style_class: 'keyboard-row' });
let left_box = new St.BoxLayout({ style_class: 'keyboard-row' });
for (let j = 0; j < children.length; ++j) {
if (this._numOfHorizKeys == 0)
this._numOfHorizKeys = children.length;
let key = children[j];
let button = new Key(key, 0, 0);
if (key.align == 'right')
right_box.add(button.actor);
else
left_box.add(button.actor);
if (key.name == "Caribou_Prefs") {
key.connect('key-released', Lang.bind(this, this._onPrefsClick));
// Add new key for hiding message tray
right_box.add(this._getTrayIcon());
}
}
keyboard_row.add(left_box, { expand: true, x_fill: false, x_align: St.Align.START });
keyboard_row.add(right_box, { expand: true, x_fill: false, x_align: St.Align.END });
}
layout.add(keyboard_row);
},
_manageTray: function () {
this.createSource();
},
_onPrefsClick: function () {
this.hide();
this._manageTray();
},
_loadRows : function (level, layout) {
let rows = level.get_rows();
for (let i = 0; i < rows.length; ++i) {
let row = rows[i];
if (this._numOfVertKeys == 0)
this._numOfVertKeys = rows.length;
this._addRows(row.get_columns(), layout);
}
},
_redraw: function () {
let monitor = Main.layoutManager.bottomMonitor;
let maxHeight = monitor.height / 3;
this.actor.width = monitor.width;
let layout = this._current_page;
let verticalSpacing = layout.get_theme_node().get_length('spacing');
let padding = layout.get_theme_node().get_length('padding');
let box = layout.get_children()[0].get_children()[0];
let horizontalSpacing = box.get_theme_node().get_length('spacing');
let allHorizontalSpacing = (this._numOfHorizKeys - 1) * horizontalSpacing;
let keyWidth = Math.floor((this.actor.width - allHorizontalSpacing - 2 * padding) / this._numOfHorizKeys);
let allVerticalSpacing = (this._numOfVertKeys - 1) * verticalSpacing;
let keyHeight = Math.floor((maxHeight - allVerticalSpacing - 2 * padding) / this._numOfVertKeys);
let keySize = Math.min(keyWidth, keyHeight);
this.actor.height = keySize * this._numOfVertKeys + allVerticalSpacing + 2 * padding;
let rows = this._current_page.get_children();
for (let i = 0; i < rows.length; ++i) {
let keyboard_row = rows[i];
let boxes = keyboard_row.get_children();
for (let j = 0; j < boxes.length; ++j) {
let keys = boxes[j].get_children();
for (let k = 0; k < keys.length; ++k) {
let child = keys[k];
child.width = keySize * child.key_width;
child.height = keySize;
child.draggable = this._draggable;
if (child._extended_keys) {
let extended_keys = child._extended_keys.get_children();
for (let n = 0; n < extended_keys.length; ++n) {
let extended_key = extended_keys[n];
extended_key.width = keySize;
extended_key.height = keySize;
extended_key.draggable = this._draggable;
}
}
}
}
}
},
_onLevelChanged: function () {
this._setActiveLayer();
this._redraw();
},
_onGroupChanged: function () {
this._setActiveLayer();
this._redraw();
},
_setActiveLayer: function () {
let active_group_name = this._keyboard.active_group;
let active_group = this._keyboard.get_group(active_group_name);
let active_level = active_group.active_level;
let layers = this._groups[active_group_name];
if (this._current_page != null) {
this._current_page.hide();
}
this._current_page = layers[active_level];
this._current_page.show();
},
createSource: function () {
if (this._source == null) {
this._source = new KeyboardSource(this);
Main.messageTray.add(this._source);
}
},
destroySource: function () {
if (this._source) {
this._source.destroy();
this._source = null;
}
},
show: function () {
this._redraw();
Main.layoutManager.showKeyboard();
},
hide: function () {
Main.layoutManager.hideKeyboard();
},
// Window placement method
_updatePosition: function (x, y) {
let primary = Main.layoutManager.primaryMonitor;
x -= this.actor.width / 2;
// Determines bottom/top centered
if (y <= primary.height / 2)
y += this.actor.height / 2;
else
y -= 3 * this.actor.height / 2;
// Accounting for monitor boundaries
if (x < primary.x)
x = primary.x;
if (x + this.actor.width > primary.width)
x = primary.width - this.actor.width;
this.actor.set_position(x, y);
},
_moveTemporarily: function () {
this._currentWindow = global.screen.get_display().focus_window;
let rect = this._currentWindow.get_outer_rect();
this._currentWindow.x = rect.x;
this._currentWindow.y = rect.y;
let newX = this._currentWindow.x;
let newY = 3 * this.actor.height / 2;
this._currentWindow.move_frame(true, newX, newY);
},
_setLocation: function (x, y) {
if (this._floating)
this._updatePosition(x, y);
else {
if (y >= 2 * this.actor.height)
this._moveTemporarily();
}
},
// D-Bus methods
Show: function() {
this.destroySource();
this.show();
},
Hide: function() {
if (this._currentWindow) {
this._currentWindow.move_frame(true, this._currentWindow.x, this._currentWindow.y);
this._currentWindow = null;
}
this.hide();
this._manageTray();
},
SetCursorLocation: function(x, y, w, h) {
this._setLocation(x, y);
},
SetEntryLocation: function(x, y, w, h) {
this._setLocation(x, y);
},
get Name() {
return 'gnome-shell';
}
};
DBus.conformExport(Keyboard.prototype, CaribouKeyboardIface);
function KeyboardSource() {
this._init.apply(this, arguments);
}
KeyboardSource.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function(keyboard) {
this._keyboard = keyboard;
MessageTray.Source.prototype._init.call(this, _("Keyboard"));
this._setSummaryIcon(this.createNotificationIcon());
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'input-keyboard',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
},
handleSummaryClick: function() {
let event = Clutter.get_current_event();
if (event.type() != Clutter.EventType.BUTTON_RELEASE)
return false;
if (event.get_button() != 1)
return false;
this.open();
return true;
},
open: function() {
this._keyboard.show();
this._keyboard.destroySource();
}
};

View File

@@ -1,422 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Signals = imports.signals;
const St = imports.gi.St;
const Main = imports.ui.main;
const Meta = imports.gi.Meta;
const Panel = imports.ui.panel;
const Tweener = imports.ui.tweener;
const State = {
HIDDEN: 0,
SHOWING: 1,
SHOWN: 2,
HIDING: 3
};
const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
function LayoutManager() {
this._init.apply(this, arguments);
}
LayoutManager.prototype = {
_init: function () {
this._rtl = (St.Widget.get_default_direction() == St.TextDirection.RTL);
this.monitors = [];
this.primaryMonitor = null;
this.primaryIndex = -1;
this._hotCorners = [];
this.bottomBox = new Clutter.Group();
this.topBox = new Clutter.Group({ clip_to_allocation: true });
this.bottomBox.add_actor(this.topBox);
global.screen.connect('monitors-changed', Lang.bind(this, this._monitorsChanged));
this._updateMonitors();
Main.connect('layout-initialized', Lang.bind(this, this._initChrome));
Main.connect('main-ui-initialized', Lang.bind(this, this._finishInit));
},
_initChrome: function() {
Main.chrome.addActor(this.bottomBox, { affectsStruts: false,
visibleInFullscreen: true });
},
// _updateHotCorners needs access to Main.panel
_finishInit: function() {
this._updateHotCorners();
this.topBox.height = Main.messageTray.actor.height;
this.topBox.y = - Main.messageTray.actor.height;
this._keyboardState = Main.keyboard.actor.visible ? State.SHOWN : State.HIDDEN;
this._traySummoned = true;
Main.keyboard.actor.connect('allocation-changed', Lang.bind(this, this._reposition));
},
_reposition: function () {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function () { this._updateForKeyboard(); }));
},
_updateForKeyboard: function () {
if (Tweener.isTweening(this.bottomBox))
return;
this.topBox.y = - Main.messageTray.actor.height;
let bottom = this.bottomMonitor.y + this.bottomMonitor.height;
if (this._keyboardState == State.SHOWN)
this.bottomBox.y = bottom - Main.keyboard.actor.height;
else {
this.bottomBox.y = bottom;
this._keyboardState = State.HIDDEN;
}
},
updateForTray: function () {
if (this._keyboardState == State.SHOWN) {
if (this._traySummoned) {
Main.messageTray.lock();
this._traySummoned = false;
}
else {
Main.messageTray.unlock();
this._traySummoned = true;
}
}
else {
Main.messageTray.unlock();
this._traySummoned = false;
}
},
showKeyboard: function () {
let bottom = this.bottomMonitor.y + this.bottomMonitor.height;
// Keyboard height cannot be found directly since the first
// call to this method may be when Keyboard.Keyboard() has
// not returned; therefore the keyboard would be null
Tweener.addTween(this.bottomBox,
{ y: bottom - Main.keyboard.actor.height,
time: 0.5,
transition: 'easeOutQuad',
});
this._keyboardState = State.SHOWN;
this.updateForTray();
},
hideKeyboard: function () {
let bottom = this.bottomMonitor.y + this.bottomMonitor.height;
Tweener.addTween(this.bottomBox,
{ y: bottom,
time: 0.5,
transition: 'easeOutQuad'
});
this._keyboardState = State.HIDDEN;
this.updateForTray();
},
// This is called by Main after everything else is constructed;
// _updateHotCorners needs access to Main.panel, which didn't exist
// yet when the LayoutManager was constructed.
init: function() {
global.screen.connect('monitors-changed', Lang.bind(this, this._monitorsChanged));
this._updateHotCorners();
},
_updateMonitors: function() {
let screen = global.screen;
this.monitors = [];
let nMonitors = screen.get_n_monitors();
for (let i = 0; i < nMonitors; i++)
this.monitors.push(screen.get_monitor_geometry(i));
if (nMonitors == 1) {
this.primaryIndex = this.bottomIndex = 0;
} else {
// If there are monitors below the primary, then we need
// to split primary from bottom.
this.primaryIndex = this.bottomIndex = screen.get_primary_monitor();
for (let i = 0; i < this.monitors.length; i++) {
let monitor = this.monitors[i];
if (this._isAboveOrBelowPrimary(monitor)) {
if (monitor.y > this.monitors[this.bottomIndex].y)
this.bottomIndex = i;
}
}
}
this.primaryMonitor = this.monitors[this.primaryIndex];
this.bottomMonitor = this.monitors[this.bottomIndex];
this.bottomBox.set_position(0, this.bottomMonitor.y + this.bottomMonitor.height);
this.bottomBox.width = this.bottomMonitor.width;
},
_updateHotCorners: function() {
// destroy old hot corners
for (let i = 0; i < this._hotCorners.length; i++)
this._hotCorners[i].destroy();
this._hotCorners = [];
// build new hot corners
for (let i = 0; i < this.monitors.length; i++) {
if (i == this.primaryIndex)
continue;
let monitor = this.monitors[i];
let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x;
let cornerY = monitor.y;
let haveTopLeftCorner = true;
// Check if we have a top left (right for RTL) corner.
// I.e. if there is no monitor directly above or to the left(right)
let besideX = this._rtl ? monitor.x + 1 : cornerX - 1;
let besideY = cornerY;
let aboveX = cornerX;
let aboveY = cornerY - 1;
for (let j = 0; j < this.monitors.length; j++) {
if (i == j)
continue;
let otherMonitor = this.monitors[j];
if (besideX >= otherMonitor.x &&
besideX < otherMonitor.x + otherMonitor.width &&
besideY >= otherMonitor.y &&
besideY < otherMonitor.y + otherMonitor.height) {
haveTopLeftCorner = false;
break;
}
if (aboveX >= otherMonitor.x &&
aboveX < otherMonitor.x + otherMonitor.width &&
aboveY >= otherMonitor.y &&
aboveY < otherMonitor.y + otherMonitor.height) {
haveTopLeftCorner = false;
break;
}
}
if (!haveTopLeftCorner)
continue;
let corner = new HotCorner();
this._hotCorners.push(corner);
corner.actor.set_position(cornerX, cornerY);
Main.chrome.addActor(corner.actor, { affectsStruts: false });
}
},
_monitorsChanged: function() {
this._updateMonitors();
this._updateHotCorners();
this.emit('monitors-changed');
},
_isAboveOrBelowPrimary: function(monitor) {
let primary = this.monitors[this.primaryIndex];
let monitorLeft = monitor.x, monitorRight = monitor.x + monitor.width;
let primaryLeft = primary.x, primaryRight = primary.x + primary.width;
if ((monitorLeft >= primaryLeft && monitorLeft <= primaryRight) ||
(monitorRight >= primaryLeft && monitorRight <= primaryRight) ||
(primaryLeft >= monitorLeft && primaryLeft <= monitorRight) ||
(primaryRight >= monitorLeft && primaryRight <= monitorRight))
return true;
return false;
},
get focusIndex() {
let screen = global.screen;
let display = screen.get_display();
let focusWindow = display.focus_window;
if (focusWindow) {
let wrect = focusWindow.get_outer_rect();
for (let i = 0; i < this.monitors.length; i++) {
let monitor = this.monitors[i];
if (monitor.x <= wrect.x && monitor.y <= wrect.y &&
monitor.x + monitor.width > wrect.x &&
monitor.y + monitor.height > wrect.y)
return i;
}
}
return this.primaryIndex;
},
get focusMonitor() {
return this.monitors[this.focusIndex];
}
};
Signals.addSignalMethods(LayoutManager.prototype);
// HotCorner:
//
// This class manages a "hot corner" that can toggle switching to
// overview.
function HotCorner() {
this._init();
}
HotCorner.prototype = {
_init : function() {
// We use this flag to mark the case where the user has entered the
// hot corner and has not left both the hot corner and a surrounding
// guard area (the "environs"). This avoids triggering the hot corner
// multiple times due to an accidental jitter.
this._entered = false;
this.actor = new Clutter.Group({ name: 'hot-corner-environs',
width: 3,
height: 3,
reactive: true });
this._corner = new Clutter.Rectangle({ name: 'hot-corner',
width: 1,
height: 1,
opacity: 0,
reactive: true });
this._corner._delegate = this;
this.actor.add_actor(this._corner);
if (St.Widget.get_default_direction() == St.TextDirection.RTL) {
this._corner.set_position(this.actor.width - this._corner.width, 0);
this.actor.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
} else {
this._corner.set_position(0, 0);
}
this._activationTime = 0;
this.actor.connect('leave-event',
Lang.bind(this, this._onEnvironsLeft));
// Clicking on the hot corner environs should result in the
// same behavior as clicking on the hot corner.
this.actor.connect('button-release-event',
Lang.bind(this, this._onCornerClicked));
// In addition to being triggered by the mouse enter event,
// the hot corner can be triggered by clicking on it. This is
// useful if the user wants to undo the effect of triggering
// the hot corner once in the hot corner.
this._corner.connect('enter-event',
Lang.bind(this, this._onCornerEntered));
this._corner.connect('button-release-event',
Lang.bind(this, this._onCornerClicked));
this._corner.connect('leave-event',
Lang.bind(this, this._onCornerLeft));
},
destroy: function() {
this.actor.destroy();
},
_addRipple : function(delay, time, startScale, startOpacity, finalScale, finalOpacity) {
// We draw a ripple by using a source image and animating it scaling
// outwards and fading away. We want the ripples to move linearly
// or it looks unrealistic, but if the opacity of the ripple goes
// linearly to zero it fades away too quickly, so we use Tweener's
// 'onUpdate' to give a non-linear curve to the fade-away and make
// it more visible in the middle section.
let [x, y] = this._corner.get_transformed_position();
let ripple = new St.BoxLayout({ style_class: 'ripple-box',
opacity: 255 * Math.sqrt(startOpacity),
scale_x: startScale,
scale_y: startScale,
x: x,
y: y });
ripple._opacity = startOpacity;
if (ripple.get_direction() == St.TextDirection.RTL)
ripple.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
Tweener.addTween(ripple, { _opacity: finalOpacity,
scale_x: finalScale,
scale_y: finalScale,
delay: delay,
time: time,
transition: 'linear',
onUpdate: function() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
onComplete: function() { ripple.destroy(); } });
Main.uiGroup.add_actor(ripple);
},
rippleAnimation: function() {
// Show three concentric ripples expanding outwards; the exact
// parameters were found by trial and error, so don't look
// for them to make perfect sense mathematically
// delay time scale opacity => scale opacity
this._addRipple(0.0, 0.83, 0.25, 1.0, 1.5, 0.0);
this._addRipple(0.05, 1.0, 0.0, 0.7, 1.25, 0.0);
this._addRipple(0.35, 1.0, 0.0, 0.3, 1, 0.0);
},
handleDragOver: function(source, actor, x, y, time) {
if (source != Main.xdndHandler)
return;
if (!Main.overview.visible && !Main.overview.animationInProgress) {
this.rippleAnimation();
Main.overview.showTemporarily();
Main.overview.beginItemDrag(actor);
}
},
_onCornerEntered : function() {
if (!this._entered) {
this._entered = true;
if (!Main.overview.animationInProgress) {
this._activationTime = Date.now() / 1000;
this.rippleAnimation();
Main.overview.toggle();
}
}
return false;
},
_onCornerClicked : function() {
if (this.shouldToggleOverviewOnClick())
Main.overview.toggle();
return true;
},
_onCornerLeft : function(actor, event) {
if (event.get_related() != this.actor)
this._entered = false;
// Consume event, otherwise this will confuse onEnvironsLeft
return true;
},
_onEnvironsLeft : function(actor, event) {
if (event.get_related() != this._corner)
this._entered = false;
return false;
},
// Checks if the Activities button is currently sensitive to
// clicks. The first call to this function within the
// HOT_CORNER_ACTIVATION_TIMEOUT time of the hot corner being
// triggered will return false. This avoids opening and closing
// the overview if the user both triggered the hot corner and
// clicked the Activities button.
shouldToggleOverviewOnClick: function() {
if (Main.overview.animationInProgress)
return false;
if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > HOT_CORNER_ACTIVATION_TIMEOUT)
return true;
return false;
}
};

View File

@@ -5,13 +5,14 @@ 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;
@@ -99,19 +100,12 @@ 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;
@@ -436,7 +430,7 @@ Inspector.prototype = {
if (!this._eventHandler) if (!this._eventHandler)
return; return;
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let [minWidth, minHeight, natWidth, natHeight] = let [minWidth, minHeight, natWidth, natHeight] =
this._eventHandler.get_preferred_size(); this._eventHandler.get_preferred_size();
@@ -582,53 +576,6 @@ 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();
} }
@@ -798,7 +745,12 @@ 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({ can_focus: true }); this._entry = new St.Entry();
/* 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();
@@ -811,9 +763,6 @@ 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);
@@ -907,7 +856,7 @@ LookingGlass.prototype = {
}, },
_resizeTo: function(actor) { _resizeTo: function(actor) {
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let myWidth = primary.width * 0.7; let myWidth = primary.width * 0.7;
let myHeight = primary.height * 0.7; let myHeight = primary.height * 0.7;
let [srcX, srcY] = actor.get_transformed_position(); let [srcX, srcY] = actor.get_transformed_position();
@@ -960,7 +909,6 @@ 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;

View File

@@ -1,5 +1,11 @@
/* -*- 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;
@@ -10,24 +16,21 @@ const Lang = imports.lang;
const Mainloop = imports.mainloop; 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 Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const AutomountManager = imports.ui.automountManager;
const AutorunManager = imports.ui.autorunManager;
const Chrome = imports.ui.chrome; const Chrome = imports.ui.chrome;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const EndSessionDialog = imports.ui.endSessionDialog; const EndSessionDialog = imports.ui.endSessionDialog;
const PolkitAuthenticationAgent = imports.ui.polkitAuthenticationAgent; const PolkitAuthenticationAgent = imports.ui.polkitAuthenticationAgent;
const Environment = imports.ui.environment; const Environment = imports.ui.environment;
const ExtensionSystem = imports.ui.extensionSystem; const ExtensionSystem = imports.ui.extensionSystem;
const Keyboard = imports.ui.keyboard;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
const Panel = imports.ui.panel; const Panel = imports.ui.panel;
const PlaceDisplay = imports.ui.placeDisplay; const PlaceDisplay = imports.ui.placeDisplay;
const RunDialog = imports.ui.runDialog; const RunDialog = imports.ui.runDialog;
const Layout = imports.ui.layout;
const LookingGlass = imports.ui.lookingGlass; const LookingGlass = imports.ui.lookingGlass;
const NotificationDaemon = imports.ui.notificationDaemon; const NotificationDaemon = imports.ui.notificationDaemon;
const WindowAttentionHandler = imports.ui.windowAttentionHandler; const WindowAttentionHandler = imports.ui.windowAttentionHandler;
@@ -43,41 +46,41 @@ const Util = imports.misc.util;
const DEFAULT_BACKGROUND_COLOR = new Clutter.Color(); const DEFAULT_BACKGROUND_COLOR = new Clutter.Color();
DEFAULT_BACKGROUND_COLOR.from_pixel(0x2266bbff); DEFAULT_BACKGROUND_COLOR.from_pixel(0x2266bbff);
let automountManager = null;
let autorunManager = null;
let chrome = null; let chrome = null;
let panel = null; let panel = null;
let hotCorners = [];
let placesManager = null; let placesManager = null;
let overview = null; let overview = null;
let runDialog = null;
let lookingGlass = null;
let wm = null; let wm = null;
let messageTray = null; let messageTray = null;
let notificationDaemon = null; let notificationDaemon = null;
let windowAttentionHandler = null; let windowAttentionHandler = null;
let telepathyClient = null; let telepathyClient = null;
let ctrlAltTabManager = null; let ctrlAltTabManager = null;
let recorder = null;
let shellDBusService = null; let shellDBusService = null;
let modalCount = 0;
let modalActorFocusStack = [];
let uiGroup = null; let uiGroup = null;
let magnifier = null; let magnifier = null;
let xdndHandler = null; let xdndHandler = null;
let statusIconDispatcher = null; let statusIconDispatcher = null;
let keyboard = null;
let layoutManager = null;
let _runDialog = null;
let lookingGlass = null;
let _recorder = null;
let _modalCount = 0;
let _modalActorFocusStack = [];
let _errorLogStack = []; let _errorLogStack = [];
let _startDate; let _startDate;
let _defaultCssStylesheet = null; let _defaultCssStylesheet = null;
let _cssStylesheet = null; let _cssStylesheet = null;
const Main = this; let background = null;
Signals.addSignalMethods(Main)
function start() { function start() {
// Monkey patch utility functions into the global proxy; // Add a binding for 'global' in the global JS namespace; (gjs
// 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;
@@ -99,6 +102,8 @@ 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
@@ -136,62 +141,46 @@ function start() {
global.overlay_group.reparent(uiGroup); global.overlay_group.reparent(uiGroup);
global.stage.add_actor(uiGroup); global.stage.add_actor(uiGroup);
// Initialize JS modules. We do this in several steps, so that
// less-fundamental modules can depend on more-fundamental ones.
// Overall layout management
layoutManager = new Layout.LayoutManager();
chrome = new Chrome.Chrome();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
Main.emit('layout-initialized');
// Major UI elements; initialize overview first since both panel
// and messageTray connect to its signals
overview = new Overview.Overview();
panel = new Panel.Panel();
messageTray = new MessageTray.MessageTray();
keyboard = new Keyboard.Keyboard();
Main.emit('main-ui-initialized');
// Now the rest of the JS modules (arbitrarily in alphabetical
// order).
keyboard.init();
magnifier = new Magnifier.Magnifier();
notificationDaemon = new NotificationDaemon.NotificationDaemon();
placesManager = new PlaceDisplay.PlacesManager(); placesManager = new PlaceDisplay.PlacesManager();
statusIconDispatcher = new StatusIconDispatcher.StatusIconDispatcher();
telepathyClient = new TelepathyClient.Client();
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
wm = new WindowManager.WindowManager();
xdndHandler = new XdndHandler.XdndHandler(); xdndHandler = new XdndHandler.XdndHandler();
automountManager = new AutomountManager.AutomountManager(); ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
autorunManager = new AutorunManager.AutorunManager(); overview = new Overview.Overview();
chrome = new Chrome.Chrome();
magnifier = new Magnifier.Magnifier();
statusIconDispatcher = new StatusIconDispatcher.StatusIconDispatcher();
panel = new Panel.Panel();
wm = new WindowManager.WindowManager();
messageTray = new MessageTray.MessageTray();
notificationDaemon = new NotificationDaemon.NotificationDaemon();
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
telepathyClient = new TelepathyClient.Client();
Main.emit('initialized'); overview.init();
statusIconDispatcher.start(messageTray.actor);
_startDate = new Date(); _startDate = new Date();
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' }); let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
global.screen.connect('toggle-recording', function() { global.screen.connect('toggle-recording', function() {
if (_recorder == null) { if (recorder == null) {
_recorder = new Shell.Recorder({ stage: global.stage }); recorder = new Shell.Recorder({ stage: global.stage });
} }
if (_recorder.is_recording()) { if (recorder.is_recording()) {
_recorder.pause(); recorder.pause();
} else { } else {
// read the parameters from GSettings always in case they have changed // read the parameters from GSettings always in case they have changed
_recorder.set_framerate(recorderSettings.get_int('framerate')); recorder.set_framerate(recorderSettings.get_int('framerate'));
_recorder.set_filename('shell-%d%u-%c.' + recorderSettings.get_string('file-extension')); recorder.set_filename('shell-%d%u-%c.' + recorderSettings.get_string('file-extension'));
let pipeline = recorderSettings.get_string('pipeline'); let pipeline = recorderSettings.get_string('pipeline');
if (!pipeline.match(/^\s*$/)) if (!pipeline.match(/^\s*$/))
_recorder.set_pipeline(pipeline); recorder.set_pipeline(pipeline);
else else
_recorder.set_pipeline(null); recorder.set_pipeline(null);
_recorder.record(); recorder.record();
} }
}); });
@@ -204,10 +193,14 @@ function start() {
// Attempt to become a PolicyKit authentication agent // Attempt to become a PolicyKit authentication agent
PolkitAuthenticationAgent.init() PolkitAuthenticationAgent.init()
global.screen.connect('monitors-changed', _relayout);
ExtensionSystem.init(); ExtensionSystem.init();
ExtensionSystem.loadExtensions(); ExtensionSystem.loadExtensions();
// Initialize the panel status area now that extensions are loaded // Perform initial relayout here
_relayout();
panel.startStatusArea(); panel.startStatusArea();
panel.startupAnimation(); panel.startupAnimation();
@@ -230,7 +223,6 @@ 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();
} }
@@ -322,24 +314,17 @@ function _windowRemoved(workspace, window) {
function _windowLeftMonitor(metaScreen, monitorIndex, metaWin) { function _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
// If the window left the primary monitor, that // If the window left the primary monitor, that
// might make that workspace empty // might make that workspace empty
if (monitorIndex == layoutManager.primaryIndex) if (monitorIndex == global.get_primary_monitor_index())
_queueCheckWorkspaces(); _queueCheckWorkspaces();
} }
function _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) { function _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
// If the window entered the primary monitor, that // If the window entered the primary monitor, that
// might make that workspace non-empty // might make that workspace non-empty
if (monitorIndex == layoutManager.primaryIndex) if (monitorIndex == global.get_primary_monitor_index())
_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);
@@ -423,21 +408,12 @@ 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);
} }
@@ -503,16 +479,80 @@ function _getAndClearErrorStack() {
return errors; return errors;
} }
function logStackTrace(msg) { function _relayout() {
try { let monitors = global.get_monitors();
throw new Error(); // destroy old corners
} catch (e) { for (let i = 0; i < hotCorners.length; i++)
// e.stack must have at least two lines, with the first being hotCorners[i].destroy();
// logStackTrace() (which we strip off), and the second being hotCorners = [];
// our caller.
let trace = e.stack.substr(e.stack.indexOf('\n') + 1);
log(msg ? (msg + '\n' + trace) : trace); let primary = global.get_primary_monitor();
for (let i = 0; i < monitors.length; i++) {
let monitor = monitors[i];
let isPrimary = (monitor.x == primary.x &&
monitor.y == primary.y &&
monitor.width == primary.width &&
monitor.height == primary.height);
let cornerX = monitor.x;
let cornerY = monitor.y;
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
cornerX += monitor.width;
let haveTopLeftCorner = true;
/* Check if we have a top left (right for RTL) corner.
* I.e. if there is no monitor directly above or to the left(right) */
let besideX;
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
besideX = monitor.x + 1;
else
besideX = cornerX - 1;
let besideY = cornerY;
let aboveX = cornerX;
let aboveY = cornerY - 1;
for (let j = 0; j < monitors.length; j++) {
if (i == j)
continue;
let otherMonitor = monitors[j];
if (besideX >= otherMonitor.x &&
besideX < otherMonitor.x + otherMonitor.width &&
besideY >= otherMonitor.y &&
besideY < otherMonitor.y + otherMonitor.height) {
haveTopLeftCorner = false;
break;
}
if (aboveX >= otherMonitor.x &&
aboveX < otherMonitor.x + otherMonitor.width &&
aboveY >= otherMonitor.y &&
aboveY < otherMonitor.y + otherMonitor.height) {
haveTopLeftCorner = false;
break;
}
}
/* We only want hot corners where there is a natural top-left
* corner, and on the primary monitor */
if (!isPrimary && !haveTopLeftCorner)
continue;
let corner = new Panel.HotCorner(isPrimary ? panel.button : null);
hotCorners.push(corner);
corner.actor.set_position(cornerX, cornerY);
if (isPrimary)
panel.setHotCorner(corner);
} }
panel.relayout();
overview.relayout();
// To avoid updating the position and size of the workspaces
// in the overview, we just hide the overview. The positions
// will be updated when it is next shown.
overview.hide();
} }
function isWindowActorDisplayedOnWorkspace(win, workspaceIndex) { function isWindowActorDisplayedOnWorkspace(win, workspaceIndex) {
@@ -532,7 +572,7 @@ function getWindowActorsForWorkspace(workspaceIndex) {
// all key events will be delivered to the stage, so ::captured-event // all key events will be delivered to the stage, so ::captured-event
// on the stage can be used for global keybindings.) // on the stage can be used for global keybindings.)
function _globalKeyPressHandler(actor, event) { function _globalKeyPressHandler(actor, event) {
if (_modalCount == 0) if (modalCount == 0)
return false; return false;
if (event.type() != Clutter.EventType.KEY_PRESS) if (event.type() != Clutter.EventType.KEY_PRESS)
return false; return false;
@@ -557,7 +597,7 @@ function _globalKeyPressHandler(actor, event) {
// Other bindings are only available when the overview is up and // Other bindings are only available when the overview is up and
// no modal dialog is present. // no modal dialog is present.
if (!overview.visible || _modalCount > 1) if (!overview.visible || modalCount > 1)
return false; return false;
// This isn't a Meta.KeyBindingAction yet // This isn't a Meta.KeyBindingAction yet
@@ -598,8 +638,8 @@ function _globalKeyPressHandler(actor, event) {
} }
function _findModal(actor) { function _findModal(actor) {
for (let i = 0; i < _modalActorFocusStack.length; i++) { for (let i = 0; i < modalActorFocusStack.length; i++) {
if (_modalActorFocusStack[i].actor == actor) if (modalActorFocusStack[i].actor == actor)
return i; return i;
} }
return -1; return -1;
@@ -629,7 +669,7 @@ function pushModal(actor, timestamp) {
if (timestamp == undefined) if (timestamp == undefined)
timestamp = global.get_current_time(); timestamp = global.get_current_time();
if (_modalCount == 0) { if (modalCount == 0) {
if (!global.begin_modal(timestamp)) { if (!global.begin_modal(timestamp)) {
log('pushModal: invocation of begin_modal failed'); log('pushModal: invocation of begin_modal failed');
return false; return false;
@@ -638,11 +678,11 @@ function pushModal(actor, timestamp) {
global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN); global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN);
_modalCount += 1; modalCount += 1;
let actorDestroyId = actor.connect('destroy', function() { let actorDestroyId = actor.connect('destroy', function() {
let index = _findModal(actor); let index = _findModal(actor);
if (index >= 0) if (index >= 0)
_modalActorFocusStack.splice(index, 1); modalActorFocusStack.splice(index, 1);
}); });
let curFocus = global.stage.get_key_focus(); let curFocus = global.stage.get_key_focus();
let curFocusDestroyId; let curFocusDestroyId;
@@ -650,10 +690,10 @@ function pushModal(actor, timestamp) {
curFocusDestroyId = curFocus.connect('destroy', function() { curFocusDestroyId = curFocus.connect('destroy', function() {
let index = _findModal(actor); let index = _findModal(actor);
if (index >= 0) if (index >= 0)
_modalActorFocusStack[index].actor = null; modalActorFocusStack[index].actor = null;
}); });
} }
_modalActorFocusStack.push({ actor: actor, modalActorFocusStack.push({ actor: actor,
focus: curFocus, focus: curFocus,
destroyId: actorDestroyId, destroyId: actorDestroyId,
focusDestroyId: curFocusDestroyId }); focusDestroyId: curFocusDestroyId });
@@ -688,28 +728,28 @@ function popModal(actor, timestamp) {
throw new Error('incorrect pop'); throw new Error('incorrect pop');
} }
_modalCount -= 1; modalCount -= 1;
let record = _modalActorFocusStack[focusIndex]; let record = modalActorFocusStack[focusIndex];
record.actor.disconnect(record.destroyId); record.actor.disconnect(record.destroyId);
if (focusIndex == _modalActorFocusStack.length - 1) { if (focusIndex == modalActorFocusStack.length - 1) {
if (record.focus) if (record.focus)
record.focus.disconnect(record.focusDestroyId); record.focus.disconnect(record.focusDestroyId);
global.stage.set_key_focus(record.focus); global.stage.set_key_focus(record.focus);
} else { } else {
let t = _modalActorFocusStack[_modalActorFocusStack.length - 1]; let t = modalActorFocusStack[modalActorFocusStack.length - 1];
if (t.focus) if (t.focus)
t.focus.disconnect(t.focusDestroyId); t.focus.disconnect(t.focusDestroyId);
// Remove from the middle, shift the focus chain up // Remove from the middle, shift the focus chain up
for (let i = _modalActorFocusStack.length - 1; i > focusIndex; i--) { for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) {
_modalActorFocusStack[i].focus = _modalActorFocusStack[i - 1].focus; modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus;
_modalActorFocusStack[i].focusDestroyId = _modalActorFocusStack[i - 1].focusDestroyId; modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId;
} }
} }
_modalActorFocusStack.splice(focusIndex, 1); modalActorFocusStack.splice(focusIndex, 1);
if (_modalCount > 0) if (modalCount > 0)
return; return;
global.end_modal(timestamp); global.end_modal(timestamp);
@@ -725,10 +765,10 @@ function createLookingGlass() {
} }
function getRunDialog() { function getRunDialog() {
if (_runDialog == null) { if (runDialog == null) {
_runDialog = new RunDialog.RunDialog(); runDialog = new RunDialog.RunDialog();
} }
return _runDialog; return runDialog;
} }
/** /**

View File

@@ -20,6 +20,9 @@ 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;
@@ -557,7 +560,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,
style_class: 'vfade' }); vfade: true });
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 });
@@ -829,7 +832,6 @@ 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) {
@@ -880,96 +882,20 @@ Source.prototype = {
_init: function(title) { _init: function(title) {
this.title = title; this.title = title;
this.actor = new Shell.GenericContainer();
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this,
function() {
this._actorDestroyed = true;
}));
this._actorDestroyed = false;
this._counterLabel = new St.Label();
this._counterBin = new St.Bin({ style_class: 'summary-source-counter',
child: this._counterLabel });
this._counterBin.hide();
this._iconBin = new St.Bin({ width: this.ICON_SIZE, this._iconBin = new St.Bin({ width: this.ICON_SIZE,
height: this.ICON_SIZE, height: this.ICON_SIZE,
x_fill: true, x_fill: true,
y_fill: true }); y_fill: true });
this.actor.add_actor(this._iconBin);
this.actor.add_actor(this._counterBin);
this.isTransient = false; this.isTransient = false;
this.isChat = false; this.isChat = false;
this.notifications = []; this.notifications = [];
}, },
_getPreferredWidth: function (actor, forHeight, alloc) {
let [min, nat] = this._iconBin.get_preferred_width(forHeight);
alloc.min_size = min; alloc.nat_size = nat;
},
_getPreferredHeight: function (actor, forWidth, alloc) {
let [min, nat] = this._iconBin.get_preferred_height(forWidth);
alloc.min_size = min; alloc.nat_size = nat;
},
_allocate: function(actor, box, flags) {
// the iconBin should fill our entire box
this._iconBin.allocate(box, flags);
let childBox = new Clutter.ActorBox();
let [minWidth, minHeight, naturalWidth, naturalHeight] = this._counterBin.get_preferred_size();
let direction = this.actor.get_direction();
if (direction == St.TextDirection.LTR) {
// allocate on the right in LTR
childBox.x1 = box.x2 - naturalWidth;
childBox.x2 = box.x2;
} else {
// allocate on the left in RTL
childBox.x1 = 0;
childBox.x2 = naturalWidth;
}
childBox.y1 = box.y2 - naturalHeight;
childBox.y2 = box.y2;
this._counterBin.allocate(childBox, flags);
},
_setCount: function(count, visible) {
if (isNaN(parseInt(count)))
throw new Error("Invalid notification count: " + count);
if (this._actorDestroyed)
return;
this._counterBin.visible = visible;
this._counterLabel.set_text(count.toString());
},
_updateCount: function() {
let count = this.notifications.length;
this._setCount(count, count > 1);
},
setTransient: function(isTransient) { setTransient: function(isTransient) {
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.
@@ -980,7 +906,7 @@ Source.prototype = {
// Unlike createNotificationIcon, this always returns the same actor; // Unlike createNotificationIcon, this always returns the same actor;
// there is only one summary icon actor for a Source. // there is only one summary icon actor for a Source.
getSummaryIcon: function() { getSummaryIcon: function() {
return this.actor; return this._iconBin;
}, },
pushNotification: function(notification) { pushNotification: function(notification) {
@@ -999,11 +925,7 @@ Source.prototype = {
this.notifications.splice(index, 1); this.notifications.splice(index, 1);
if (this.notifications.length == 0) if (this.notifications.length == 0)
this._lastNotificationRemoved(); this._lastNotificationRemoved();
this._updateCount();
})); }));
this._updateCount();
}, },
notify: function(notification) { notify: function(notification) {
@@ -1040,8 +962,6 @@ Source.prototype = {
for (let i = this.notifications.length - 1; i >= 0; i--) for (let i = this.notifications.length - 1; i >= 0; i--)
if (!this.notifications[i].resident) if (!this.notifications[i].resident)
this.notifications[i].destroy(); this.notifications[i].destroy();
this._updateCount();
}, },
// Default implementation is to destroy this source, but subclasses can override // Default implementation is to destroy this source, but subclasses can override
@@ -1078,11 +998,6 @@ 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;
@@ -1090,7 +1005,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,
style_class: 'vfade' }); vfade: true });
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);
@@ -1301,9 +1216,9 @@ MessageTray.prototype = {
this._focusGrabber.connect('focus-grabbed', Lang.bind(this, this._focusGrabber.connect('focus-grabbed', Lang.bind(this,
function() { function() {
if (this._summaryBoxPointer.bin.child) if (this._summaryBoxPointer.bin.child)
this.lock(); this._lock();
})); }));
this._focusGrabber.connect('focus-ungrabbed', Lang.bind(this, this.unlock)); this._focusGrabber.connect('focus-ungrabbed', Lang.bind(this, this._unlock));
this._focusGrabber.connect('button-pressed', Lang.bind(this, this._focusGrabber.connect('button-pressed', Lang.bind(this,
function(focusGrabber, source) { function(focusGrabber, source) {
if (this._clickedSummaryItem && !this._clickedSummaryItem.actor.contains(source)) if (this._clickedSummaryItem && !this._clickedSummaryItem.actor.contains(source))
@@ -1313,7 +1228,7 @@ MessageTray.prototype = {
this._focusGrabber.connect('escape-pressed', Lang.bind(this, this._escapeTray)); this._focusGrabber.connect('escape-pressed', Lang.bind(this, this._escapeTray));
this._trayState = State.HIDDEN; this._trayState = State.HIDDEN;
this._locked = 0; this._locked = false;
this._useLongerTrayLeftTimeout = false; this._useLongerTrayLeftTimeout = false;
this._trayLeftTimeoutId = 0; this._trayLeftTimeoutId = 0;
this._pointerInTray = false; this._pointerInTray = false;
@@ -1329,21 +1244,21 @@ MessageTray.prototype = {
this._notificationRemoved = false; this._notificationRemoved = false;
this._reNotifyAfterHideNotification = null; this._reNotifyAfterHideNotification = null;
Main.layoutManager.topBox.add_actor(this.actor); Main.chrome.addActor(this.actor, { affectsStruts: false,
visibleInOverview: true });
Main.chrome.trackActor(this._notificationBin); Main.chrome.trackActor(this._notificationBin);
Main.chrome.trackActor(this._summaryBin);
Main.chrome.trackActor(this._summaryBoxPointer.actor); Main.chrome.trackActor(this._summaryBoxPointer.actor);
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._setSizePosition)); global.screen.connect('monitors-changed', Lang.bind(this, this._setSizePosition));
this._setSizePosition(); this._setSizePosition();
Main.overview.connect('showing', Lang.bind(this, Main.overview.connect('showing', Lang.bind(this,
function() { function() {
this._overviewVisible = true; this._overviewVisible = true;
if (this._locked > 0) { if (this._locked) {
this._unsetClickedSummaryItem(); this._unsetClickedSummaryItem();
this.unlock(); this._unlock();
} else { } else {
this._updateState(); this._updateState();
} }
@@ -1351,9 +1266,9 @@ MessageTray.prototype = {
Main.overview.connect('hiding', Lang.bind(this, Main.overview.connect('hiding', Lang.bind(this,
function() { function() {
this._overviewVisible = false; this._overviewVisible = false;
if (this._locked > 0) { if (this._locked) {
this._unsetClickedSummaryItem(); this._unsetClickedSummaryItem();
this.unlock(); this._unlock();
} else { } else {
this._updateState(); this._updateState();
} }
@@ -1370,20 +1285,20 @@ MessageTray.prototype = {
}, },
_setSizePosition: function() { _setSizePosition: function() {
let monitor = Main.layoutManager.bottomMonitor; let primary = global.get_primary_monitor();
this.actor.x = monitor.x; this.actor.x = primary.x;
this.actor.y = -1; this.actor.y = primary.y + primary.height - 1;
this.actor.width = monitor.width; this.actor.width = primary.width;
this._notificationBin.x = 0; this._notificationBin.x = 0;
this._notificationBin.width = monitor.width; this._notificationBin.width = primary.width;
this._summaryBin.x = 0; this._summaryBin.x = 0;
this._summaryBin.width = monitor.width; this._summaryBin.width = primary.width;
if (this._pointerBarrier) if (this._pointerBarrier)
global.destroy_pointer_barrier(this._pointerBarrier); global.destroy_pointer_barrier(this._pointerBarrier);
this._pointerBarrier = this._pointerBarrier =
global.create_pointer_barrier(monitor.x + monitor.width, monitor.y + monitor.height - this.actor.height, global.create_pointer_barrier(primary.x + primary.width, primary.y + primary.height - this.actor.height,
monitor.x + monitor.width, monitor.y + monitor.height, primary.x + primary.width, primary.y + primary.height,
4 /* BarrierNegativeX */); 4 /* BarrierNegativeX */);
@@ -1524,16 +1439,15 @@ MessageTray.prototype = {
this._notificationQueue.splice(index, 1); this._notificationQueue.splice(index, 1);
}, },
lock: function() { _lock: function() {
this._locked += 1; this._locked = true;
this._updateState();
}, },
unlock: function() { _unlock: function() {
if (this._locked > 0) if (!this._locked)
this._locked -= 1; return;
this._pointerInSummary = false; this._locked = false;
this._pointerInTray = false; this._pointerInTray = this.actor.hover && !this._summaryBoxPointer.bin.hover;
this._updateState(); this._updateState();
}, },
@@ -1694,8 +1608,6 @@ 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();
} }
@@ -1817,7 +1729,7 @@ MessageTray.prototype = {
}, },
_escapeTray: function() { _escapeTray: function() {
this.unlock(); this._unlock();
this._pointerInTray = false; this._pointerInTray = false;
this._pointerInSummary = false; this._pointerInSummary = false;
this._updateNotificationTimeout(0); this._updateNotificationTimeout(0);
@@ -1835,7 +1747,7 @@ MessageTray.prototype = {
let notificationsPending = this._notificationQueue.length > 0 && (!this._busy || notificationUrgent); let notificationsPending = this._notificationQueue.length > 0 && (!this._busy || notificationUrgent);
let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved; let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved;
let notificationExpanded = this._notificationBin.y < 0; let notificationExpanded = this._notificationBin.y < 0;
let notificationExpired = (this._notificationTimeoutId == 0 && !(this._notification && this._notification.urgency == Urgency.CRITICAL) && !this._pointerInTray && (this._locked == 0)) || this._notificationRemoved; let notificationExpired = (this._notificationTimeoutId == 0 && !(this._notification && this._notification.urgency == Urgency.CRITICAL) && !this._pointerInTray && !this._locked) || this._notificationRemoved;
let canShowNotification = notificationsPending && this._summaryState == State.HIDDEN; let canShowNotification = notificationsPending && this._summaryState == State.HIDDEN;
if (this._notificationState == State.HIDDEN) { if (this._notificationState == State.HIDDEN) {
@@ -1851,17 +1763,17 @@ MessageTray.prototype = {
} }
// Summary // Summary
let summarySummoned = this._pointerInSummary || this._overviewVisible || (this._locked > 0); let summarySummoned = this._pointerInSummary || this._overviewVisible;
let summaryPinned = this._summaryTimeoutId != 0 || this._pointerInTray || summarySummoned; let summaryPinned = this._summaryTimeoutId != 0 || this._pointerInTray || summarySummoned || this._locked;
let summaryHovered = this._pointerInTray || this._pointerInSummary; let summaryHovered = this._pointerInTray || this._pointerInSummary;
let summaryVisibleWithNoHover = (this._overviewVisible || this._locked > 0) && !summaryHovered; let summaryVisibleWithNoHover = (this._overviewVisible || this._locked) && !summaryHovered;
let summaryNotificationIsForExpandedSummaryItem = (this._clickedSummaryItem == this._expandedSummaryItem); let summaryNotificationIsForExpandedSummaryItem = (this._clickedSummaryItem == this._expandedSummaryItem);
let notificationsVisible = (this._notificationState == State.SHOWING || let notificationsVisible = (this._notificationState == State.SHOWING ||
this._notificationState == State.SHOWN); this._notificationState == State.SHOWN);
let notificationsDone = !notificationsVisible && !notificationsPending; let notificationsDone = !notificationsVisible && !notificationsPending;
let summaryOptionalInOverview = this._overviewVisible && (this._locked == 0) && !summaryHovered; let summaryOptionalInOverview = this._overviewVisible && !this._locked && !summaryHovered;
let mustHideSummary = (notificationsPending && (notificationUrgent || summaryOptionalInOverview)) let mustHideSummary = (notificationsPending && (notificationUrgent || summaryOptionalInOverview))
|| notificationsVisible; || notificationsVisible;
@@ -1945,16 +1857,18 @@ MessageTray.prototype = {
}, },
_showTray: function() { _showTray: function() {
let primary = global.get_primary_monitor();
this._tween(this.actor, '_trayState', State.SHOWN, this._tween(this.actor, '_trayState', State.SHOWN,
{ y: 0, { y: primary.y + primary.height - this.actor.height,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
}, },
_hideTray: function() { _hideTray: function() {
let primary = global.get_primary_monitor();
this._tween(this.actor, '_trayState', State.HIDDEN, this._tween(this.actor, '_trayState', State.HIDDEN,
{ y: Main.layoutManager.topBox.height - 1, { y: primary.y + primary.height - 1,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
@@ -2100,15 +2014,9 @@ 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,
@@ -2123,6 +2031,7 @@ MessageTray.prototype = {
}, },
_showSummary: function(timeout) { _showSummary: function(timeout) {
let primary = global.get_primary_monitor();
this._summaryBin.opacity = 0; this._summaryBin.opacity = 0;
this._summaryBin.y = this.actor.height; this._summaryBin.y = this.actor.height;
this._tween(this._summaryBin, '_summaryState', State.SHOWN, this._tween(this._summaryBin, '_summaryState', State.SHOWN,

View File

@@ -10,6 +10,8 @@ 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;
@@ -149,7 +151,7 @@ ModalDialog.prototype = {
}, },
_fadeOpen: function() { _fadeOpen: function() {
let monitor = Main.layoutManager.focusMonitor; let monitor = global.get_focus_monitor();
this._backgroundBin.set_position(monitor.x, monitor.y); this._backgroundBin.set_position(monitor.x, monitor.y);
this._backgroundBin.set_size(monitor.width, monitor.height); this._backgroundBin.set_size(monitor.width, monitor.height);

View File

@@ -7,6 +7,8 @@ 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;
@@ -97,10 +99,8 @@ NotificationDaemon.prototype = {
this._notifications = {}; this._notifications = {};
this._busProxy = new Bus(); this._busProxy = new Bus();
Main.connect('initialized', Lang.bind(this, function() { Main.statusIconDispatcher.connect('message-icon-added', Lang.bind(this, this._onTrayIconAdded));
Main.statusIconDispatcher.connect('message-icon-added', Lang.bind(this, this._onTrayIconAdded)); Main.statusIconDispatcher.connect('message-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
Main.statusIconDispatcher.connect('message-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
}));
Shell.WindowTracker.get_default().connect('notify::focus-app', Shell.WindowTracker.get_default().connect('notify::focus-app',
Lang.bind(this, this._onFocusAppChanged)); Lang.bind(this, this._onFocusAppChanged));
@@ -124,7 +124,7 @@ NotificationDaemon.prototype = {
} else if (hints['image-data']) { } else if (hints['image-data']) {
let [width, height, rowStride, hasAlpha, let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = hints['image-data']; bitsPerSample, nChannels, data] = hints['image-data'];
return textureCache.load_from_raw(data, hasAlpha, return textureCache.load_from_raw(data, data.length, hasAlpha,
width, height, rowStride, size); width, height, rowStride, size);
} else { } else {
let stockIcon; let stockIcon;
@@ -150,7 +150,7 @@ NotificationDaemon.prototype = {
// //
// Either a pid or ndata.notification is needed to retrieve or // Either a pid or ndata.notification is needed to retrieve or
// create a source. // create a source.
_getSource: function(title, pid, ndata, sender) { _getSource: function(title, pid, ndata) {
if (!pid && !(ndata && ndata.notification)) if (!pid && !(ndata && ndata.notification))
return null; return null;
@@ -167,13 +167,10 @@ 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])
let source = this._sources[pid]; return this._sources[pid];
source.setTitle(title);
return source;
}
let source = new Source(title, pid, sender); let source = new Source(title, pid);
source.setTransient(isForTransientNotification); source.setTransient(isForTransientNotification);
if (!isForTransientNotification) { if (!isForTransientNotification) {
@@ -192,11 +189,9 @@ NotificationDaemon.prototype = {
actions, hints, timeout) { actions, hints, timeout) {
let id; let id;
// Filter out chat, presence, calls and invitation notifications from // Filter out chat and presence notifications from Empathy, since we
// Empathy, since we handle that information from telepathyClient.js // handle that information from telepathyClient.js
if (appName == 'Empathy' && (hints['category'] == 'im.received' || if (appName == 'Empathy' && (hints['category'] == 'im.received' ||
hints['category'] == 'x-empathy.im.room-invitation' ||
hints['category'] == 'x-empathy.call.incoming' ||
hints['category'] == 'presence.online' || hints['category'] == 'presence.online' ||
hints['category'] == 'presence.offline')) { hints['category'] == 'presence.offline')) {
// Ignore replacesId since we already sent back a // Ignore replacesId since we already sent back a
@@ -248,7 +243,7 @@ NotificationDaemon.prototype = {
let sender = DBus.getCurrentMessageContext().sender; let sender = DBus.getCurrentMessageContext().sender;
let pid = this._senderToPid[sender]; let pid = this._senderToPid[sender];
let source = this._getSource(appName, pid, ndata, sender); let source = this._getSource(appName, pid, ndata);
if (source) { if (source) {
this._notifyForSource(source, ndata); this._notifyForSource(source, ndata);
@@ -269,7 +264,7 @@ NotificationDaemon.prototype = {
if (!ndata) if (!ndata)
return; return;
source = this._getSource(appName, pid, ndata, sender); source = this._getSource(appName, pid, ndata);
// We only store sender-pid entries for persistent sources. // We only store sender-pid entries for persistent sources.
// Removing the entries once the source is destroyed // Removing the entries once the source is destroyed
@@ -418,7 +413,7 @@ NotificationDaemon.prototype = {
}, },
_onTrayIconAdded: function(o, icon) { _onTrayIconAdded: function(o, icon) {
let source = this._getSource(icon.title || icon.wm_class || _("Unknown"), icon.pid, null, null); let source = this._getSource(icon.title || icon.wm_class || _("Unknown"), icon.pid, null);
source.setTrayIcon(icon); source.setTrayIcon(icon);
}, },
@@ -431,28 +426,18 @@ NotificationDaemon.prototype = {
DBus.conformExport(NotificationDaemon.prototype, NotificationDaemonIface); DBus.conformExport(NotificationDaemon.prototype, NotificationDaemonIface);
function Source(title, pid, sender) { function Source(title, pid) {
this._init(title, pid, sender); this._init(title, pid);
} }
Source.prototype = { Source.prototype = {
__proto__: MessageTray.Source.prototype, __proto__: MessageTray.Source.prototype,
_init: function(title, pid, sender) { _init: function(title, pid) {
MessageTray.Source.prototype._init.call(this, title); MessageTray.Source.prototype._init.call(this, title);
this._pid = pid; this._pid = pid;
if (sender) this._appStateChangedId = 0;
// TODO: dbus-glib implementation of watch_name() doesnt return an id to be used for
// unwatch_name() or implement unwatch_name(), however when we move to using GDBus implementation,
// we should save the id here and call unwatch_name() with it in destroy().
// Moving to GDBus is the work in progress: https://bugzilla.gnome.org/show_bug.cgi?id=648651
// and https://bugzilla.gnome.org/show_bug.cgi?id=622921 .
DBus.session.watch_name(sender,
false,
null,
Lang.bind(this, this._onNameVanished));
this._setApp(); this._setApp();
if (this.app) if (this.app)
this.title = this.app.get_name(); this.title = this.app.get_name();
@@ -461,14 +446,6 @@ Source.prototype = {
this._trayIcon = null; this._trayIcon = null;
}, },
_onNameVanished: function() {
// Destroy the notification source when its sender is removed from DBus.
// Sender being removed from DBus would normally result in a tray icon being removed,
// so allow the code path that handles the tray icon being removed to handle that case.
if (!this.trayIcon)
this.destroy();
},
processNotification: function(notification, icon) { processNotification: function(notification, icon) {
if (!this.app) if (!this.app)
this._setApp(); this._setApp();
@@ -521,6 +498,10 @@ Source.prototype = {
if (!this.app) if (!this.app)
return; return;
// We only update the app if this.app is null, so we can't disconnect the old this._appStateChangedId
// even if it were non-zero for some reason.
this._appStateChangedId = this.app.connect('notify::state', Lang.bind(this, this._appStateChanged));
// Only override the icon if we were previously using // Only override the icon if we were previously using
// notification-based icons (ie, not a trayicon) or if it was unset before // notification-based icons (ie, not a trayicon) or if it was unset before
if (!this._trayIcon) { if (!this._trayIcon) {
@@ -545,6 +526,19 @@ Source.prototype = {
this.destroy(); this.destroy();
}, },
_appStateChanged: function() {
// Destroy notification sources when their apps exit.
// The app exiting would normally result in a tray icon being removed,
// so the associated source would be destroyed through the code path
// that handles the tray icon being removed. We should not destroy
// the source associated with a tray icon when the application state
// is Shell.AppState.STOPPED because running applications that have
// no open windows would also have that state. This is often the case
// for applications that use tray icons.
if (!this._trayIcon && this.app.get_state() == Shell.AppState.STOPPED)
this.destroy();
},
openApp: function() { openApp: function() {
if (this.app == null) if (this.app == null)
return; return;
@@ -557,6 +551,10 @@ Source.prototype = {
}, },
destroy: function() { destroy: function() {
if (this.app && this._appStateChangedId) {
this.app.disconnect(this._appStateChangedId);
this._appStateChangedId = 0;
}
MessageTray.Source.prototype.destroy.call(this); MessageTray.Source.prototype.destroy.call(this);
} }
}; };

View File

@@ -8,6 +8,8 @@ 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;
@@ -121,7 +123,7 @@ Overview.prototype = {
let spacing = node.get_length('spacing'); let spacing = node.get_length('spacing');
if (spacing != this._spacing) { if (spacing != this._spacing) {
this._spacing = spacing; this._spacing = spacing;
this._relayout(); this.relayout();
} }
})); }));
@@ -153,18 +155,6 @@ Overview.prototype = {
this._coverPane.hide(); this._coverPane.hide();
this._windowSwitchTimeoutId = 0;
this._windowSwitchTimestamp = 0;
this._lastActiveWorkspaceIndex = -1;
this._lastHoveredWindow = null;
this._needsFakePointerEvent = false;
this.workspaces = null;
Main.connect('initialized', Lang.bind(this, this._finishInit));
},
_finishInit: function() {
// XDND // XDND
this._dragMonitor = { this._dragMonitor = {
dragMotion: Lang.bind(this, this._onDragMotion) dragMotion: Lang.bind(this, this._onDragMotion)
@@ -173,11 +163,22 @@ Overview.prototype = {
Main.xdndHandler.connect('drag-begin', Lang.bind(this, this._onDragBegin)); Main.xdndHandler.connect('drag-begin', Lang.bind(this, this._onDragBegin));
Main.xdndHandler.connect('drag-end', Lang.bind(this, this._onDragEnd)); Main.xdndHandler.connect('drag-end', Lang.bind(this, this._onDragEnd));
this._windowSwitchTimeoutId = 0;
this._windowSwitchTimestamp = 0;
this._lastActiveWorkspaceIndex = -1;
this._lastHoveredWindow = null;
this._needsFakePointerEvent = false;
this.workspaces = null;
},
// The members we construct that are implemented in JS might
// want to access the overview as Main.overview to connect
// signal handlers and so forth. So we create them after
// construction in this init() method.
init: function() {
this.shellInfo = new ShellInfo(); this.shellInfo = new ShellInfo();
// The members we construct that are implemented in JS might
// want to access the overview as Main.overview to connect
// signal handlers and so forth. So we create them here.
this.viewSelector = new ViewSelector.ViewSelector(); this.viewSelector = new ViewSelector.ViewSelector();
this._group.add_actor(this.viewSelector.actor); this._group.add_actor(this.viewSelector.actor);
@@ -203,8 +204,6 @@ Overview.prototype = {
// the left of the overview // the left of the overview
Main.ctrlAltTabManager.addGroup(this.dash.actor, _("Dash"), 'user-bookmarks'); Main.ctrlAltTabManager.addGroup(this.dash.actor, _("Dash"), 'user-bookmarks');
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._relayout));
this._relayout();
}, },
_onDragBegin: function() { _onDragBegin: function() {
@@ -223,7 +222,7 @@ Overview.prototype = {
} }
this._resetWindowSwitchTimeout(); this._resetWindowSwitchTimeout();
this._lastHoveredWindow = null; this._lastHoveredWindow = null;
DND.removeDragMonitor(this._dragMonitor); DND.removeMonitor(this._dragMonitor);
this.endItemDrag(); this.endItemDrag();
}, },
@@ -284,8 +283,7 @@ 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();
@@ -394,7 +392,7 @@ Overview.prototype = {
[stageX, stageY] = event.get_coords(); [stageX, stageY] = event.get_coords();
let dx = this._dragX - stageX; let dx = this._dragX - stageX;
let dy = this._dragY - stageY; let dy = this._dragY - stageY;
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
this._dragX = stageX; this._dragX = stageX;
this._dragY = stageY; this._dragY = stageY;
@@ -441,25 +439,23 @@ Overview.prototype = {
return clone; return clone;
}, },
_relayout: function () { relayout: function () {
// To avoid updating the position and size of the workspaces let primary = global.get_primary_monitor();
// we just hide the overview. The positions will be updated
// when it is next shown.
this.hide();
let primary = Main.layoutManager.primaryMonitor;
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL); let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
let contentY = Main.panel.actor.height;
let contentHeight = primary.height - contentY - Main.messageTray.actor.height;
this._group.set_position(primary.x, primary.y); this._group.set_position(primary.x, primary.y);
this._group.set_size(primary.width, primary.height); this._group.set_size(primary.width, primary.height);
this._coverPane.set_position(primary.x, primary.y); this._coverPane.set_position(0, contentY);
this._coverPane.set_size(primary.width, primary.height); this._coverPane.set_size(primary.width, contentHeight);
let dashWidth = Math.round(DASH_SPLIT_FRACTION * primary.width); let dashWidth = Math.round(DASH_SPLIT_FRACTION * primary.width);
let viewWidth = primary.width - dashWidth - this._spacing; let viewWidth = primary.width - dashWidth - this._spacing;
let viewHeight = primary.height - 2 * this._spacing; let viewHeight = contentHeight - 2 * this._spacing;
let viewY = primary.y + this._spacing; let viewY = contentY + this._spacing;
let viewX = rtl ? 0 : dashWidth + this._spacing; let viewX = rtl ? 0 : dashWidth + this._spacing;
// Set the dash's x position - y is handled by a constraint // Set the dash's x position - y is handled by a constraint

View File

@@ -9,10 +9,11 @@ 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;
const Layout = imports.ui.layout;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
@@ -25,6 +26,8 @@ const PANEL_ICON_SIZE = 24;
const STARTUP_ANIMATION_TIME = 0.2; const STARTUP_ANIMATION_TIME = 0.2;
const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
const BUTTON_DND_ACTIVATION_TIMEOUT = 250; const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
const ANIMATED_ICON_UPDATE_TIMEOUT = 100; const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
@@ -301,7 +304,6 @@ 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;
@@ -318,7 +320,6 @@ 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;
@@ -543,163 +544,13 @@ AppMenuButton.prototype = {
Signals.addSignalMethods(AppMenuButton.prototype); Signals.addSignalMethods(AppMenuButton.prototype);
// Activities button. Because everything else in the top bar is a
// PanelMenu.Button, it simplifies some things to make this be one too.
// We just hack it up to not actually have a menu attached to it.
function ActivitiesButton() {
this._init.apply(this, arguments);
}
ActivitiesButton.prototype = { function PanelCorner(side) {
__proto__: PanelMenu.Button.prototype, this._init(side);
_init: function() {
PanelMenu.Button.prototype._init.call(this, 0.0);
let container = new Shell.GenericContainer();
container.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
container.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
container.connect('allocate', Lang.bind(this, this._allocate));
this.actor.child = container;
this.actor.name = 'panelActivities';
/* Translators: If there is no suitable word for "Activities"
in your language, you can use the word for "Overview". */
this._label = new St.Label({ text: _("Activities") });
container.add_actor(this._label);
this._hotCorner = new Layout.HotCorner();
container.add_actor(this._hotCorner.actor);
// Hack up our menu...
this.menu.open = Lang.bind(this, this._onMenuOpenRequest);
this.menu.close = Lang.bind(this, this._onMenuCloseRequest);
this.menu.toggle = Lang.bind(this, this._onMenuToggleRequest);
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this.actor.connect_after('button-release-event', Lang.bind(this, this._onButtonRelease));
this.actor.connect_after('key-release-event', Lang.bind(this, this._onKeyRelease));
Main.overview.connect('showing', Lang.bind(this, function() {
this.actor.add_style_pseudo_class('overview');
this._escapeMenuGrab();
}));
Main.overview.connect('hiding', Lang.bind(this, function() {
this.actor.remove_style_pseudo_class('overview');
this._escapeMenuGrab();
}));
this._xdndTimeOut = 0;
},
_getPreferredWidth: function(actor, forHeight, alloc) {
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_width(forHeight);
},
_getPreferredHeight: function(actor, forWidth, alloc) {
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_height(forWidth);
},
_allocate: function(actor, box, flags) {
this._label.allocate(box, flags);
// The hot corner needs to be outside any padding/alignment
// that has been imposed on us
let primary = Main.layoutManager.primaryMonitor;
let hotBox = new Clutter.ActorBox();
let ok, x, y;
if (actor.get_direction() == St.TextDirection.LTR) {
[ok, x, y] = actor.transform_stage_point(primary.x, primary.y)
} else {
[ok, x, y] = actor.transform_stage_point(primary.x + primary.width, primary.y);
// hotCorner.actor has northeast gravity, so we don't need
// to adjust x for its width
}
hotBox.x1 = Math.round(x);
hotBox.x2 = hotBox.x1 + this._hotCorner.actor.width;
hotBox.y1 = Math.round(y);
hotBox.y2 = hotBox.y1 + this._hotCorner.actor.height;
this._hotCorner.actor.allocate(hotBox, flags);
},
handleDragOver: function(source, actor, x, y, time) {
if (source != Main.xdndHandler)
return;
if (this._xdndTimeOut != 0)
Mainloop.source_remove(this._xdndTimeOut);
this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT,
Lang.bind(this, this._xdndShowOverview, actor));
},
_escapeMenuGrab: function() {
if (this.menu.isOpen)
this.menu.close();
},
_onCapturedEvent: function(actor, event) {
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
if (!this._hotCorner.shouldToggleOverviewOnClick())
return true;
}
return false;
},
_onMenuOpenRequest: function() {
this.menu.isOpen = true;
this.menu.emit('open-state-changed', true);
},
_onMenuCloseRequest: function() {
this.menu.isOpen = false;
this.menu.emit('open-state-changed', false);
},
_onMenuToggleRequest: function() {
this.menu.isOpen = !this.menu.isOpen;
this.menu.emit('open-state-changed', this.menu.isOpen);
},
_onButtonRelease: function() {
if (this.menu.isOpen) {
this.menu.close();
Main.overview.toggle();
}
},
_onKeyRelease: function(actor, event) {
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) {
if (this.menu.isOpen)
this.menu.close();
Main.overview.toggle();
}
},
_xdndShowOverview: function(actor) {
let [x, y, mask] = global.get_pointer();
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (pickedActor == this.actor) {
if (!Main.overview.visible && !Main.overview.animationInProgress) {
Main.overview.showTemporarily();
Main.overview.beginItemDrag(actor);
}
}
Mainloop.source_remove(this._xdndTimeOut);
this._xdndTimeOut = 0;
}
};
function PanelCorner(panel, side) {
this._init(panel, side);
} }
PanelCorner.prototype = { PanelCorner.prototype = {
_init: function(panel, side) { _init: function(side) {
this._panel = panel;
this._side = side; this._side = side;
this.actor = new St.DrawingArea({ style_class: 'panel-corner' }); this.actor = new St.DrawingArea({ style_class: 'panel-corner' });
this.actor.connect('repaint', Lang.bind(this, this._repaint)); this.actor.connect('repaint', Lang.bind(this, this._repaint));
@@ -775,14 +626,185 @@ PanelCorner.prototype = {
this.actor.set_size(cornerRadius, this.actor.set_size(cornerRadius,
innerBorderWidth + cornerRadius); innerBorderWidth + cornerRadius);
if (this._side == St.Side.LEFT) if (this._side == St.Side.LEFT)
this.actor.set_position(this._panel.actor.x, this.actor.set_position(Main.panel.actor.x,
this._panel.actor.y + this._panel.actor.height - innerBorderWidth); Main.panel.actor.y + Main.panel.actor.height - innerBorderWidth);
else else
this.actor.set_position(this._panel.actor.x + this._panel.actor.width - cornerRadius, this.actor.set_position(Main.panel.actor.x + Main.panel.actor.width - cornerRadius,
this._panel.actor.y + this._panel.actor.height - innerBorderWidth); Main.panel.actor.y + Main.panel.actor.height - innerBorderWidth);
} }
}; };
/**
* HotCorner:
*
* This class manages the "hot corner" that can toggle switching to
* overview.
*/
function HotCorner(button) {
this._init(button);
}
HotCorner.prototype = {
_init : function(button) {
// This is the activities button associated with this hot corner,
// if this is on the primary monitor (or null with the corner is
// on a different monitor)
this._button = button;
// We use this flag to mark the case where the user has entered the
// hot corner and has not left both the hot corner and a surrounding
// guard area (the "environs"). This avoids triggering the hot corner
// multiple times due to an accidental jitter.
this._entered = false;
this.actor = new Clutter.Group({ width: 3,
height: 3,
reactive: true });
this._corner = new Clutter.Rectangle({ width: 1,
height: 1,
opacity: 0,
reactive: true });
this.actor.add_actor(this._corner);
if (St.Widget.get_default_direction() == St.TextDirection.RTL) {
this._corner.set_position(this.actor.width - this._corner.width, 0);
this.actor.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
} else {
this._corner.set_position(0, 0);
}
this._activationTime = 0;
this.actor.connect('enter-event',
Lang.bind(this, this._onEnvironsEntered));
this.actor.connect('leave-event',
Lang.bind(this, this._onEnvironsLeft));
// Clicking on the hot corner environs should result in the same bahavior
// as clicking on the hot corner.
this.actor.connect('button-release-event',
Lang.bind(this, this._onCornerClicked));
// In addition to being triggered by the mouse enter event, the hot corner
// can be triggered by clicking on it. This is useful if the user wants to
// undo the effect of triggering the hot corner once in the hot corner.
this._corner.connect('enter-event',
Lang.bind(this, this._onCornerEntered));
this._corner.connect('button-release-event',
Lang.bind(this, this._onCornerClicked));
this._corner.connect('leave-event',
Lang.bind(this, this._onCornerLeft));
this._corner._delegate = this._corner;
this._corner.handleDragOver = Lang.bind(this,
function(source, actor, x, y, time) {
if (source == Main.xdndHandler) {
if(!Main.overview.visible && !Main.overview.animationInProgress) {
this.rippleAnimation();
Main.overview.showTemporarily();
Main.overview.beginItemDrag(actor);
}
}
});
Main.chrome.addActor(this.actor, { visibleInOverview: true, affectsStruts: false });
},
destroy: function() {
this.actor.destroy();
},
_addRipple : function(delay, time, startScale, startOpacity, finalScale, finalOpacity) {
// We draw a ripple by using a source image and animating it scaling
// outwards and fading away. We want the ripples to move linearly
// or it looks unrealistic, but if the opacity of the ripple goes
// linearly to zero it fades away too quickly, so we use Tweener's
// 'onUpdate' to give a non-linear curve to the fade-away and make
// it more visible in the middle section.
let [x, y] = this._corner.get_transformed_position();
let ripple = new St.BoxLayout({ style_class: 'ripple-box',
opacity: 255 * Math.sqrt(startOpacity),
scale_x: startScale,
scale_y: startScale,
x: x,
y: y });
ripple._opacity = startOpacity;
if (ripple.get_direction() == St.TextDirection.RTL)
ripple.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
Tweener.addTween(ripple, { _opacity: finalOpacity,
scale_x: finalScale,
scale_y: finalScale,
delay: delay,
time: time,
transition: 'linear',
onUpdate: function() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
onComplete: function() { ripple.destroy(); } });
Main.uiGroup.add_actor(ripple);
},
rippleAnimation: function() {
// Show three concentric ripples expanding outwards; the exact
// parameters were found by trial and error, so don't look
// for them to make perfect sense mathematically
// delay time scale opacity => scale opacity
this._addRipple(0.0, 0.83, 0.25, 1.0, 1.5, 0.0);
this._addRipple(0.05, 1.0, 0.0, 0.7, 1.25, 0.0);
this._addRipple(0.35, 1.0, 0.0, 0.3, 1, 0.0);
},
_onEnvironsEntered : function() {
if (this._button)
this._button.hover = true;
},
_onCornerEntered : function() {
if (!this._entered) {
this._entered = true;
if (!Main.overview.animationInProgress) {
this._activationTime = Date.now() / 1000;
this.rippleAnimation();
Main.overview.toggle();
}
}
return false;
},
_onCornerClicked : function() {
if (!Main.overview.animationInProgress)
this.maybeToggleOverviewOnClick();
return true;
},
_onCornerLeft : function(actor, event) {
if (event.get_related() != this.actor)
this._entered = false;
// Consume event, otherwise this will confuse onEnvironsLeft
return true;
},
_onEnvironsLeft : function(actor, event) {
if (this._button)
this._button.hover = false;
if (event.get_related() != this._corner)
this._entered = false;
return false;
},
// Toggles the overview unless this is the first click on the Activities button within the HOT_CORNER_ACTIVATION_TIMEOUT time
// of the hot corner being triggered. This check avoids opening and closing the overview if the user both triggered the hot corner
// and clicked the Activities button.
maybeToggleOverviewOnClick: function() {
if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > HOT_CORNER_ACTIVATION_TIMEOUT)
Main.overview.toggle();
this._activationTime = 0;
}
}
function Panel() { function Panel() {
this._init(); this._init();
@@ -795,8 +817,6 @@ 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');
})); }));
@@ -812,8 +832,8 @@ Panel.prototype = {
this._centerBox = new St.BoxLayout({ name: 'panelCenter' }); this._centerBox = new St.BoxLayout({ name: 'panelCenter' });
this._rightBox = new St.BoxLayout({ name: 'panelRight' }); this._rightBox = new St.BoxLayout({ name: 'panelRight' });
this._leftCorner = new PanelCorner(this, St.Side.LEFT); this._leftCorner = new PanelCorner(St.Side.LEFT);
this._rightCorner = new PanelCorner(this, St.Side.RIGHT); this._rightCorner = new PanelCorner(St.Side.RIGHT);
/* This box container ensures that the centerBox is positioned in the *absolute* /* This box container ensures that the centerBox is positioned in the *absolute*
* center, but can be pushed aside if necessary. */ * center, but can be pushed aside if necessary. */
@@ -887,16 +907,31 @@ Panel.prototype = {
})); }));
/* Button on the left side of the panel. */ /* Button on the left side of the panel. */
this._activitiesButton = new ActivitiesButton(); /* Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". */
this._activities = this._activitiesButton.actor; let label = new St.Label({ text: _("Activities") });
this._leftBox.add(this._activities); this.button = new St.Button({ name: 'panelActivities',
style_class: 'panel-button',
reactive: true,
can_focus: true });
this.button.set_child(label);
this.button._delegate = this.button;
this.button._xdndTimeOut = 0;
this.button.handleDragOver = Lang.bind(this,
function(source, actor, x, y, time) {
if (source == Main.xdndHandler) {
if (this.button._xdndTimeOut != 0)
Mainloop.source_remove(this.button._xdndTimeOut);
this.button._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT,
Lang.bind(this,
function() {
this._xdndShowOverview(actor);
}));
}
});
this._leftBox.add(this.button);
// The activities button has a pretend menu, so as to integrate // Synchronize the buttons pseudo classes with its corner
// more cleanly with the rest of the panel this.button.connect('style-changed', Lang.bind(this,
this._menus.addMenu(this._activitiesButton.menu);
// Synchronize the button's pseudo classes with its corner
this._activities.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._rightCorner : this._leftCorner; let corner = rtl ? this._rightCorner : this._leftCorner;
@@ -904,10 +939,12 @@ Panel.prototype = {
corner.actor.set_style_pseudo_class(pseudoClass); corner.actor.set_style_pseudo_class(pseudoClass);
})); }));
this._appMenu = new AppMenuButton(); this._hotCorner = null;
this._leftBox.add(this._appMenu.actor);
this._menus.addMenu(this._appMenu.menu); let appMenuButton = new AppMenuButton();
this._leftBox.add(appMenuButton.actor);
this._menus.addMenu(appMenuButton.menu);
/* center */ /* center */
this._dateMenu = new DateMenu.DateMenuButton(); this._dateMenu = new DateMenu.DateMenuButton();
@@ -926,12 +963,12 @@ Panel.prototype = {
this._rightBox.add(this._trayBox); this._rightBox.add(this._trayBox);
this._rightBox.add(this._statusBox); this._rightBox.add(this._statusBox);
this._userMenu = new StatusMenu.StatusMenuButton(); this._statusmenu = new StatusMenu.StatusMenuButton();
this._userMenu.actor.name = 'panelStatus'; this._statusmenu.actor.name = 'panelStatus';
this._rightBox.add(this._userMenu.actor); this._rightBox.add(this._statusmenu.actor);
// Synchronize the buttons pseudo classes with its corner // Synchronize the buttons pseudo classes with its corner
this._userMenu.actor.connect('style-changed', Lang.bind(this, this._statusmenu.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;
@@ -939,17 +976,68 @@ Panel.prototype = {
corner.actor.set_style_pseudo_class(pseudoClass); corner.actor.set_style_pseudo_class(pseudoClass);
})); }));
Main.chrome.addActor(this.actor); Main.statusIconDispatcher.connect('status-icon-added', Lang.bind(this, this._onTrayIconAdded));
Main.chrome.addActor(this._leftCorner.actor, { affectsStruts: false, Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
affectsInputRegion: false });
Main.chrome.addActor(this._rightCorner.actor, { affectsStruts: false, // TODO: decide what to do with the rest of the panel in the Overview mode (make it fade-out, become non-reactive, etc.)
affectsInputRegion: false }); // We get into the Overview mode on button-press-event as opposed to button-release-event because eventually we'll probably
// have the Overview act like a menu that allows the user to release the mouse on the activity the user wants
// to switch to.
this.button.connect('clicked', Lang.bind(this, function(b) {
if (!Main.overview.animationInProgress) {
this._hotCorner.maybeToggleOverviewOnClick();
return true;
} else {
return false;
}
}));
// In addition to pressing the button, the Overview can be entered and exited by other means, such as
// pressing the System key, Alt+F1 or Esc. We want the button to be pressed in when the Overview is entered
// and to be released when it is exited regardless of how it was triggered.
Main.overview.connect('showing', Lang.bind(this, function() {
this.button.checked = true;
}));
Main.overview.connect('hiding', Lang.bind(this, function() {
this.button.checked = false;
}));
Main.chrome.addActor(this.actor, { visibleInOverview: true });
Main.chrome.addActor(this._leftCorner.actor, { visibleInOverview: true,
affectsStruts: false,
affectsInputRegion: false });
Main.chrome.addActor(this._rightCorner.actor, { visibleInOverview: true,
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 });
},
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._relayout)); _xdndShowOverview: function (actor) {
this._relayout(); let [x, y, mask] = global.get_pointer();
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (pickedActor != this.button) {
Mainloop.source_remove(this.button._xdndTimeOut);
this.button._xdndTimeOut = 0;
return;
}
if(!Main.overview.visible && !Main.overview.animationInProgress) {
Main.overview.showTemporarily();
Main.overview.beginItemDrag(actor);
}
Mainloop.source_remove(this.button._xdndTimeOut);
this.button._xdndTimeOut = 0;
},
// While there can be multiple hotcorners (one per monitor), the hot corner
// that is on top of the Activities button is special since it needs special
// coordination with clicking on that button
setHotCorner: function(corner) {
this._hotCorner = corner;
}, },
startStatusArea: function() { startStatusArea: function() {
@@ -963,16 +1051,11 @@ 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;
} }
Main.statusIconDispatcher.connect('status-icon-added', Lang.bind(this, this._onTrayIconAdded));
Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
// PopupMenuManager depends on menus being added in order for // PopupMenuManager depends on menus being added in order for
// keyboard navigation, so we couldn't add this before // keyboard navigation
this._menus.addMenu(this._userMenu.menu); this._menus.addMenu(this._statusmenu.menu);
}, },
startupAnimation: function() { startupAnimation: function() {
@@ -999,8 +1082,8 @@ Panel.prototype = {
}); });
}, },
_relayout: function() { relayout: function() {
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
this.actor.set_position(primary.x, primary.y); this.actor.set_position(primary.x, primary.y);
this.actor.set_size(primary.width, -1); this.actor.set_size(primary.width, -1);

View File

@@ -26,7 +26,8 @@ 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, { affectsStruts: false }); Main.chrome.addActor(this.menu.actor, { visibleInOverview: true,
affectsStruts: false });
this.menu.actor.hide(); this.menu.actor.hide();
}, },
@@ -35,7 +36,7 @@ Button.prototype = {
// Setting the max-height won't do any good if the minimum height of the // Setting the max-height won't do any good if the minimum height of the
// menu is higher then the screen; it's useful if part of the menu is // menu is higher then the screen; it's useful if part of the menu is
// scrollable so the minimum height is smaller than the natural height // scrollable so the minimum height is smaller than the natural height
let monitor = Main.layoutManager.primaryMonitor; let monitor = global.get_primary_monitor();
this.menu.actor.style = ('max-height: ' + this.menu.actor.style = ('max-height: ' +
Math.round(monitor.height - Main.panel.actor.height) + Math.round(monitor.height - Main.panel.actor.height) +
'px;'); 'px;');

View File

@@ -7,6 +7,8 @@ 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;
@@ -268,7 +270,10 @@ PlacesManager.prototype = {
if (!GLib.file_test(this._bookmarksPath, GLib.FileTest.EXISTS)) if (!GLib.file_test(this._bookmarksPath, GLib.FileTest.EXISTS))
return; return;
let bookmarksContent = Shell.get_file_contents_utf8_sync(this._bookmarksPath); let [success, bookmarksContent, len] = GLib.file_get_contents(this._bookmarksPath);
if (!success)
return;
let bookmarks = bookmarksContent.split('\n'); let bookmarks = bookmarksContent.split('\n');

View File

@@ -22,6 +22,8 @@
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;

View File

@@ -13,6 +13,9 @@ 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) {
@@ -704,35 +707,11 @@ 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._statusBin = new St.Bin({ x_align: St.Align.END }); this.connect('activate', Lang.bind(this,function(from) {
this.addActor(this._statusBin, { align: St.Align.END });
this._statusLabel = new St.Label({ text: '',
style_class: 'popup-inactive-menu-item'
});
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() {
@@ -946,14 +925,6 @@ PopupMenuBase.prototype = {
}); });
}, },
get firstMenuItem() {
let items = this._getMenuItems();
if (items.length)
return items[0];
else
return null;
},
removeAll: function() { removeAll: function() {
let children = this._getMenuItems(); let children = this._getMenuItems();
for (let i = 0; i < children.length; i++) { for (let i = 0; i < children.length; i++) {

View File

@@ -8,6 +8,8 @@ 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;
@@ -23,10 +25,6 @@ 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() {
@@ -173,7 +171,6 @@ __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');
})); }));
@@ -194,7 +191,7 @@ __proto__: ModalDialog.ModalDialog.prototype,
}), }),
'debugexit': Lang.bind(this, function() { 'debugexit': Lang.bind(this, function() {
Meta.quit(Meta.ExitCode.ERROR); Meta.exit(Meta.ExitCode.ERROR);
}), }),
// rt is short for "reload theme" // rt is short for "reload theme"
@@ -314,11 +311,8 @@ __proto__: ModalDialog.ModalDialog.prototype,
f(); f();
} else if (input) { } else if (input) {
try { try {
if (inTerminal) { if (inTerminal)
let exec = this._terminalSettings.get_string(EXEC_KEY); command = 'gnome-terminal -x ' + input;
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
@@ -333,46 +327,33 @@ __proto__: ModalDialog.ModalDialog.prototype,
if (GLib.file_test(path, GLib.FileTest.EXISTS)) { if (GLib.file_test(path, GLib.FileTest.EXISTS)) {
let file = Gio.file_new_for_path(path); let file = Gio.file_new_for_path(path);
try { Gio.app_info_launch_default_for_uri(file.get_uri(),
Gio.app_info_launch_default_for_uri(file.get_uri(), global.create_app_launch_context());
global.create_app_launch_context());
} catch (e) {
// The exception from gjs contains an error string like:
// Error invoking Gio.app_info_launch_default_for_uri: No application
// is registered as handling this file
// We are only interested in the part after the first colon.
let message = e.message.replace(/[^:]*: *(.+)/, '$1');
this._showError(message);
}
} else { } else {
this._showError(e.message); this._commandError = true;
this._errorMessage.set_text(e.message);
if (!this._errorBox.visible) {
let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1);
let parentActor = this._errorBox.get_parent();
Tweener.addTween(parentActor,
{ height: parentActor.height + errorBoxNaturalHeight,
time: DIALOG_GROW_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
parentActor.set_height(-1);
this._errorBox.show();
})
});
}
} }
} }
} }
}, },
_showError : function(message) {
this._commandError = true;
this._errorMessage.set_text(message);
if (!this._errorBox.visible) {
let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1);
let parentActor = this._errorBox.get_parent();
Tweener.addTween(parentActor,
{ height: parentActor.height + errorBoxNaturalHeight,
time: DIALOG_GROW_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
parentActor.set_height(-1);
this._errorBox.show();
})
});
}
},
open: function() { open: function() {
this._history.lastItem(); this._history.lastItem();
this._errorBox.hide(); this._errorBox.hide();

View File

@@ -3,11 +3,10 @@
const DBus = imports.dbus; const DBus = imports.dbus;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Mainloop = imports.mainloop; 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 Main = imports.ui.main;
// This module provides functionality for driving the shell user interface // This module provides functionality for driving the shell user interface
// in an automated fashion. The primary current use case for this is // in an automated fashion. The primary current use case for this is
// automated performance testing (see runPerfScript()), but it could // automated performance testing (see runPerfScript()), but it could
@@ -247,14 +246,18 @@ function _collect(scriptModule, outputFile) {
Shell.write_string_to_stream(out, '"events":\n'); Shell.write_string_to_stream(out, '"events":\n');
Shell.PerfLog.get_default().dump_events(out); Shell.PerfLog.get_default().dump_events(out);
let monitors = Main.layoutManager.monitors; let monitors = global.get_monitors();
let primary = Main.layoutManager.primaryIndex; let primary = global.get_primary_monitor();
Shell.write_string_to_stream(out, ',\n"monitors":\n['); Shell.write_string_to_stream(out, ',\n"monitors":\n[');
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
let monitor = monitors[i]; let monitor = monitors[i];
let is_primary = (monitor.x == primary.x &&
monitor.y == primary.y &&
monitor.width == primary.width &&
monitor.height == primary.height);
if (i != 0) if (i != 0)
Shell.write_string_to_stream(out, ', '); Shell.write_string_to_stream(out, ', ');
Shell.write_string_to_stream(out, '"%s%dx%d+%d+%d"'.format(i == primary ? "*" : "", Shell.write_string_to_stream(out, '"%s%dx%d+%d+%d"'.format(is_primary ? "*" : "",
monitor.width, monitor.height, monitor.width, monitor.height,
monitor.x, monitor.y)); monitor.x, monitor.y));
} }

View File

@@ -7,6 +7,9 @@ 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;
@@ -157,7 +160,7 @@ SearchProvider.prototype = {
}, },
/** /**
* getResultMeta: * getResultInfo:
* @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'
@@ -273,7 +276,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] = Shell.parse_search_provider(source); let [success, name, url, langs, icon_uri] = global.parse_search_provider(source);
let provider ={ name: name, let provider ={ name: name,
url: url, url: url,
id: this._providers.length, id: this._providers.length,

View File

@@ -2,6 +2,8 @@
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;
@@ -28,7 +30,6 @@ 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) {
@@ -38,11 +39,6 @@ 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);
@@ -81,8 +77,6 @@ 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;
}, },
@@ -199,7 +193,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,
style_class: 'vfade' }); vfade: true });
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);
@@ -265,7 +259,6 @@ 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;

View File

@@ -1,405 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Lang = imports.lang;
const Signals = imports.signals;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Pango = imports.gi.Pango;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const ModalDialog = imports.ui.modalDialog;
const Params = imports.misc.params;
const LIST_ITEM_ICON_SIZE = 48;
/* ------ Common Utils ------- */
function _setLabelText(label, text) {
if (text) {
label.set_text(text);
label.show();
} else {
label.set_text('');
label.hide();
}
}
function _setButtonsForChoices(dialog, choices) {
let buttons = [];
for (let idx = 0; idx < choices.length; idx++) {
let button = idx;
buttons.unshift({ label: choices[idx],
action: Lang.bind(dialog, function() {
dialog.emit('response', button);
})});
}
dialog.setButtons(buttons);
}
function _setLabelsForMessage(dialog, message) {
let labels = message.split('\n');
_setLabelText(dialog.subjectLabel, labels[0]);
if (labels.length > 1)
_setLabelText(dialog.descriptionLabel, labels[1]);
}
/* -------------------------------------------------------- */
function ListItem(app) {
this._init(app);
}
ListItem.prototype = {
_init: function(app) {
this._app = app;
let layout = new St.BoxLayout({ vertical: false});
this.actor = new St.Button({ style_class: 'show-processes-dialog-app-list-item',
can_focus: true,
child: layout,
reactive: true,
x_align: St.Align.START,
x_fill: true });
this._icon = this._app.create_icon_texture(LIST_ITEM_ICON_SIZE);
let iconBin = new St.Bin({ style_class: 'show-processes-dialog-app-list-item-icon',
child: this._icon });
layout.add(iconBin);
this._nameLabel = new St.Label({ text: this._app.get_name(),
style_class: 'show-processes-dialog-app-list-item-name' });
let labelBin = new St.Bin({ y_align: St.Align.MIDDLE,
child: this._nameLabel });
layout.add(labelBin);
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
},
_onClicked: function() {
this.emit('activate');
this._app.activate(-1);
}
};
Signals.addSignalMethods(ListItem.prototype);
function ShellMountOperation(source, params) {
this._init(source, params);
}
ShellMountOperation.prototype = {
_init: function(source, params) {
params = Params.parse(params, { reaskPassword: false });
this._reaskPassword = params.reaskPassword;
this._dialog = null;
this._processesDialog = null;
this.mountOp = new Shell.MountOperation();
this.mountOp.connect('ask-question',
Lang.bind(this, this._onAskQuestion));
this.mountOp.connect('ask-password',
Lang.bind(this, this._onAskPassword));
this.mountOp.connect('show-processes-2',
Lang.bind(this, this._onShowProcesses2));
this.mountOp.connect('aborted',
Lang.bind(this, this._onAborted));
this._icon = new St.Icon({ gicon: source.get_icon(),
style_class: 'shell-mount-operation-icon' });
},
_onAskQuestion: function(op, message, choices) {
this._dialog = new ShellMountQuestionDialog(this._icon);
this._dialog.connect('response',
Lang.bind(this, function(object, choice) {
this.mountOp.set_choice(choice);
this.mountOp.reply(Gio.MountOperationResult.HANDLED);
this._dialog.close(global.get_current_time());
this._dialog = null;
}));
this._dialog.update(message, choices);
this._dialog.open(global.get_current_time());
},
_onAskPassword: function(op, message) {
this._notificationShowing = true;
this._source = new ShellMountPasswordSource(message, this._icon, this._reaskPassword);
this._source.connect('password-ready',
Lang.bind(this, function(source, password) {
this.mountOp.set_password(password);
this.mountOp.reply(Gio.MountOperationResult.HANDLED);
this._notificationShowing = false;
this._source.destroy();
}));
this._source.connect('destroy',
Lang.bind(this, function() {
if (!this._notificationShowing)
return;
this._notificationShowing = false;
this.mountOp.reply(Gio.MountOperationResult.ABORTED);
}));
},
_onAborted: function(op) {
if (!this._dialog)
return;
this._dialog.close(global.get_current_time());
this._dialog = null;
},
_onShowProcesses2: function(op) {
let processes = op.get_show_processes_pids();
let choices = op.get_show_processes_choices();
let message = op.get_show_processes_message();
if (!this._processesDialog) {
this._processesDialog = new ShellProcessesDialog(this._icon);
this._dialog = this._processesDialog;
this._processesDialog.connect('response',
Lang.bind(this, function(object, choice) {
if (choice == -1) {
this.mountOp.reply(Gio.MountOperationResult.ABORTED);
} else {
this.mountOp.set_choice(choice);
this.mountOp.reply(Gio.MountOperationResult.HANDLED);
}
this._processesDialog.close(global.get_current_time());
this._dialog = null;
}));
this._processesDialog.open(global.get_current_time());
}
this._processesDialog.update(message, processes, choices);
},
}
function ShellMountQuestionDialog(icon) {
this._init(icon);
}
ShellMountQuestionDialog.prototype = {
__proto__: ModalDialog.ModalDialog.prototype,
_init: function(icon) {
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: 'mount-question-dialog' });
let mainContentLayout = new St.BoxLayout();
this.contentLayout.add(mainContentLayout, { x_fill: true,
y_fill: false });
this._iconBin = new St.Bin({ child: icon });
mainContentLayout.add(this._iconBin,
{ x_fill: true,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
let messageLayout = new St.BoxLayout({ vertical: true });
mainContentLayout.add(messageLayout,
{ y_align: St.Align.START });
this.subjectLabel = new St.Label({ style_class: 'mount-question-dialog-subject' });
messageLayout.add(this.subjectLabel,
{ y_fill: false,
y_align: St.Align.START });
this.descriptionLabel = new St.Label({ style_class: 'mount-question-dialog-description' });
this.descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this.descriptionLabel.clutter_text.line_wrap = true;
messageLayout.add(this.descriptionLabel,
{ y_fill: true,
y_align: St.Align.START });
},
update: function(message, choices) {
_setLabelsForMessage(this, message);
_setButtonsForChoices(this, choices);
}
}
Signals.addSignalMethods(ShellMountQuestionDialog.prototype);
function ShellMountPasswordSource(message, icon, reaskPassword) {
this._init(message, icon, reaskPassword);
}
ShellMountPasswordSource.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function(message, icon, reaskPassword) {
let strings = message.split('\n');
MessageTray.Source.prototype._init.call(this, strings[0]);
this._notification = new ShellMountPasswordNotification(this, strings, icon, reaskPassword);
// add ourselves as a source, and popup the notification
Main.messageTray.add(this);
this.notify(this._notification);
},
}
Signals.addSignalMethods(ShellMountPasswordSource.prototype);
function ShellMountPasswordNotification(source, strings, icon, reaskPassword) {
this._init(source, strings, icon, reaskPassword);
}
ShellMountPasswordNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source, strings, icon, reaskPassword) {
MessageTray.Notification.prototype._init.call(this, source,
strings[0], null,
{ customContent: true,
icon: icon });
// set the notification to transient and urgent, so that it
// expands out
this.setTransient(true);
this.setUrgency(MessageTray.Urgency.CRITICAL);
if (strings[1])
this.addBody(strings[1]);
if (reaskPassword) {
let label = new St.Label({ style_class: 'mount-password-reask',
text: _("Wrong password, please try again") });
this.addActor(label);
}
this._responseEntry = new St.Entry({ style_class: 'mount-password-entry',
can_focus: true });
this.setActionArea(this._responseEntry);
this._responseEntry.clutter_text.connect('activate',
Lang.bind(this, this._onEntryActivated));
this._responseEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
this._responseEntry.grab_key_focus();
},
_onEntryActivated: function() {
let text = this._responseEntry.get_text();
if (text == '')
return;
this.source.emit('password-ready', text);
}
}
function ShellProcessesDialog(icon) {
this._init(icon);
}
ShellProcessesDialog.prototype = {
__proto__: ModalDialog.ModalDialog.prototype,
_init: function(icon) {
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: 'show-processes-dialog' });
let mainContentLayout = new St.BoxLayout();
this.contentLayout.add(mainContentLayout, { x_fill: true,
y_fill: false });
this._iconBin = new St.Bin({ child: icon });
mainContentLayout.add(this._iconBin,
{ x_fill: true,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
let messageLayout = new St.BoxLayout({ vertical: true });
mainContentLayout.add(messageLayout,
{ y_align: St.Align.START });
this.subjectLabel = new St.Label({ style_class: 'show-processes-dialog-subject' });
messageLayout.add(this.subjectLabel,
{ y_fill: false,
y_align: St.Align.START });
this.descriptionLabel = new St.Label({ style_class: 'show-processes-dialog-description' });
this.descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this.descriptionLabel.clutter_text.line_wrap = true;
messageLayout.add(this.descriptionLabel,
{ y_fill: true,
y_align: St.Align.START });
let scrollView = new St.ScrollView({ style_class: 'show-processes-dialog-app-list'});
scrollView.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.AUTOMATIC);
this.contentLayout.add(scrollView,
{ x_fill: true,
y_fill: true });
scrollView.hide();
this._applicationList = new St.BoxLayout({ vertical: true });
scrollView.add_actor(this._applicationList,
{ x_fill: true,
y_fill: true,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
this._applicationList.connect('actor-added',
Lang.bind(this, function() {
if (this._applicationList.get_children().length == 1)
scrollView.show();
}));
this._applicationList.connect('actor-removed',
Lang.bind(this, function() {
if (this._applicationList.get_children().length == 0)
scrollView.hide();
}));
},
_setAppsForPids: function(pids) {
// remove all the items
this._applicationList.destroy_children();
pids.forEach(Lang.bind(this, function(pid) {
let tracker = Shell.WindowTracker.get_default();
let app = tracker.get_app_from_pid(pid);
if (!app)
return;
let item = new ListItem(app);
this._applicationList.add(item.actor, { x_fill: true });
item.connect('activate',
Lang.bind(this, function() {
// use -1 to indicate Cancel
this.emit('response', -1);
}));
}));
},
update: function(message, processes, choices) {
this._setAppsForPids(processes);
_setLabelsForMessage(this, message);
_setButtonsForChoices(this, choices);
}
}
Signals.addSignalMethods(ShellProcessesDialog.prototype);

View File

@@ -10,11 +10,13 @@ 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';
@@ -40,8 +42,6 @@ const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor';
const HIGH_CONTRAST_THEME = 'HighContrast'; const HIGH_CONTRAST_THEME = 'HighContrast';
const KEYBOARD_SCHEMA = 'org.gnome.shell.keyboard'
function ATIndicator() { function ATIndicator() {
this._init.apply(this, arguments); this._init.apply(this, arguments);
} }
@@ -70,9 +70,9 @@ ATIndicator.prototype = {
// 'screen-reader-enabled'); // 'screen-reader-enabled');
// this.menu.addMenuItem(screenReader); // this.menu.addMenuItem(screenReader);
let screenKeyboard = this._buildItem(_("Screen Keyboard"), KEYBOARD_SCHEMA, // let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
'show-keyboard'); // 'screen-keyboard-enabled');
this.menu.addMenuItem(screenKeyboard); // this.menu.addMenuItem(screenKeyboard);
let visualBell = this._buildItemGConf(_("Visual Alerts"), client, KEY_VISUAL_BELL); let visualBell = this._buildItemGConf(_("Visual Alerts"), client, KEY_VISUAL_BELL);
this.menu.addMenuItem(visualBell); this.menu.addMenuItem(visualBell);
@@ -91,7 +91,6 @@ 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);
}); });

View File

@@ -16,6 +16,9 @@ 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,
@@ -64,7 +67,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(_("Set up a New Device...")), new PopupMenu.PopupMenuItem(_("Setup 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
@@ -90,7 +93,6 @@ 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);
}); });
@@ -109,11 +111,7 @@ Indicator.prototype = {
current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED; current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED;
this._killswitch.setToggleState(on); this._killswitch.setToggleState(on);
if (can_toggle) this._killswitch.actor.reactive = 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();
@@ -129,6 +127,13 @@ 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();
@@ -137,8 +142,12 @@ 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++) {
if (item._device.device_path == devices[j].device_path) { // we need to deep compare because BluetoothSimpleDevice is a boxed type
this._updateDeviceItem(item, devices[j]); // (but we take advantage of that, because _skip will disappear the next
// 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;
} }
@@ -153,7 +162,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._item) if (d._skip)
continue; continue;
let item = this._createDeviceItem(d); let item = this._createDeviceItem(d);
if (item) { if (item) {
@@ -168,62 +177,23 @@ 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);
// adopt the device object, and add a back link
item._device = device; 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;
item._connectedMenuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected); let menuitem = 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;
@@ -232,11 +202,9 @@ 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;
@@ -245,12 +213,11 @@ Indicator.prototype = {
item._connected = ConnectionState.DISCONNECTED; item._connected = ConnectionState.DISCONNECTED;
menuitem.setToggleState(false); menuitem.setToggleState(false);
} }
menuitem.setStatus(null);
}); });
} }
})); }));
item.menu.addMenuItem(item._connectedMenuitem); item.menu.addMenuItem(menuitem);
} }
if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_PUSH) { if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_PUSH) {
@@ -296,6 +263,8 @@ Indicator.prototype = {
default: default:
break; break;
} }
return item;
}, },
_updateFullMenu: function() { _updateFullMenu: function() {

View File

@@ -9,11 +9,13 @@ 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);
} }
@@ -69,11 +71,9 @@ 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);
}); });

View File

@@ -18,6 +18,9 @@ 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',
@@ -41,10 +44,6 @@ 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 = { const NMAppletHelperInterface = {
name: 'org.gnome.network_manager_applet', name: 'org.gnome.network_manager_applet',
methods: [ methods: [
@@ -192,7 +191,63 @@ NMNetworkMenuItem.prototype = {
apObj.updateId = 0; apObj.updateId = 0;
} }
PopupMenu.PopupBaseMenuItem.prototype.destroy.call(this); PopupMenu.PopupImageMenuItem.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);
} }
}; };
@@ -201,13 +256,7 @@ function NMWiredSectionTitleMenuItem() {
} }
NMWiredSectionTitleMenuItem.prototype = { NMWiredSectionTitleMenuItem.prototype = {
__proto__: PopupMenu.PopupSwitchMenuItem.prototype, __proto__: NMDeviceTitleMenuItem.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) {
@@ -219,7 +268,7 @@ NMWiredSectionTitleMenuItem.prototype = {
}, },
activate: function(event) { activate: function(event) {
PopupMenu.PopupSwitchMenuItem.prototype.activate.call(this, event); NMDeviceTitleMenuItem.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');
@@ -245,12 +294,10 @@ function NMWirelessSectionTitleMenuItem() {
} }
NMWirelessSectionTitleMenuItem.prototype = { NMWirelessSectionTitleMenuItem.prototype = {
__proto__: PopupMenu.PopupSwitchMenuItem.prototype, __proto__: NMDeviceTitleMenuItem.prototype,
_init: function(client, property, title, params) { _init: function(client, property, title, params) {
params = params || { }; NMDeviceTitleMenuItem.prototype._init.call(this, title, 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';
@@ -276,7 +323,7 @@ NMWirelessSectionTitleMenuItem.prototype = {
}, },
activate: function(event) { activate: function(event) {
PopupMenu.PopupSwitchMenuItem.prototype.activate.call(this, event); NMDeviceTitleMenuItem.prototype.activate.call(this, event);
this._client[this._setEnabledFunc](this._switch.state); this._client[this._setEnabledFunc](this._switch.state);
}, },
@@ -325,14 +372,15 @@ NMDevice.prototype = {
}; };
this._connections.push(obj); this._connections.push(obj);
} }
this._connections.sort(this._connectionSortFunction); this._connections.sort(function(one, two) {
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 PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' }); this.statusItem = new NMDeviceTitleMenuItem(this._getDescription());
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();
@@ -433,7 +481,9 @@ NMDevice.prototype = {
timestamp: connection._timestamp, timestamp: connection._timestamp,
}; };
this._connections.push(obj); this._connections.push(obj);
this._connections.sort(this._connectionSortFunction); this._connections.sort(function(one, two) {
return two.timestamp - one.timestamp;
});
this._clearSection(); this._clearSection();
this._createSection(); this._createSection();
@@ -468,13 +518,6 @@ NMDevice.prototype = {
return this.device.connection_valid(connection); 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) {
// do nothing by default, we want to keep the conneciton list visible // do nothing by default, we want to keep the conneciton list visible
// in the majority of cases (wired, wwan, vpn) // in the majority of cases (wired, wwan, vpn)
@@ -482,15 +525,11 @@ 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:
@@ -549,7 +588,6 @@ 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;
} }
@@ -568,23 +606,13 @@ 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);
@@ -792,7 +820,7 @@ NMDeviceModem.prototype = {
})); }));
} }
NMDevice.prototype._init.call(this, client, device, connections); NMDevice.prototype._init.call(this, client, device, connections, 1);
}, },
setEnabled: function(enabled) { setEnabled: function(enabled) {
@@ -998,7 +1026,6 @@ 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);
} }
@@ -1011,14 +1038,6 @@ NMDeviceWireless.prototype = {
} }
} }
} }
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));
@@ -1026,13 +1045,8 @@ NMDeviceWireless.prototype = {
}, },
destroy: function() { destroy: function() {
if (this._apChangedId) {
// see above for this HACK
GObject.Object.prototype.disconnect.call(this.device, this._apChangedId);
this._apChangedId = 0;
}
if (this._apAddedId) { if (this._apAddedId) {
// see above for this HACK
GObject.Object.prototype.disconnect.call(this.device, this._apAddedId); GObject.Object.prototype.disconnect.call(this.device, this._apAddedId);
this._apAddedId = 0; this._apAddedId = 0;
} }
@@ -1098,19 +1112,6 @@ 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;
@@ -1142,32 +1143,6 @@ NMDeviceWireless.prototype = {
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;
@@ -1190,8 +1165,6 @@ 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) {
@@ -1200,8 +1173,6 @@ 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,
@@ -1210,8 +1181,7 @@ NMDeviceWireless.prototype = {
item: null, item: null,
accessPoints: [ accessPoint ] accessPoints: [ accessPoint ]
}; };
apObj.ssidText = NetworkManager.utils_ssid_to_utf8(apObj.ssid); this._networks.push(apObj);
needsupdate = true;
} }
// check if this enables new connections for this group // check if this enables new connections for this group
@@ -1220,44 +1190,12 @@ NMDeviceWireless.prototype = {
if (accessPoint.connection_valid(connection) && 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;
} }
} }
if (needsupdate) { // update everything
if (apObj.item) this._clearSection();
apObj.item.destroy(); this._createSection();
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) {
@@ -1281,29 +1219,12 @@ NMDeviceWireless.prototype = {
if (apObj.accessPoints.length == 0) { if (apObj.accessPoints.length == 0) {
if (apObj.item) if (apObj.item)
apObj.item.destroy(); apObj.item.destroy();
if (this._overflowItem) {
if (!apObj.isMore) {
// we removed an item in the main menu, and we have a more submenu
// we need to extract the first item in more and move it to the submenu
let apObj = this._overflowItem.menu.firstMenuItem;
if (apObj.item) {
apObj.item.destroy();
this._createNetworkItem(apObj, NUM_VISIBLE_NETWORKS-1);
}
}
// This can happen if the removed connection is from the overflow
// menu, or if we just moved the last connection out from the menu
if (this._overflowItem.menu.length == 0) {
this._overflowItem.destroy();
this._overflowItem = null;
}
}
this._networks.splice(pos, 1); this._networks.splice(pos, 1);
if (this._overflowItem &&
this._overflowItem.menu.length == 0) {
this._overflowItem.destroy();
this._overflowItem = null;
}
} else if (apObj.item) } else if (apObj.item)
apObj.item.updateAccessPoints(apObj.accessPoints); apObj.item.updateAccessPoints(apObj.accessPoints);
}, },
@@ -1352,12 +1273,6 @@ 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();
@@ -1383,7 +1298,6 @@ NMDeviceWireless.prototype = {
} }
if (forceupdate || anyauto) { if (forceupdate || anyauto) {
this._networks.sort(this._networkSortFunction);
this._clearSection(); this._clearSection();
this._createSection(); this._createSection();
} }
@@ -1399,24 +1313,42 @@ NMDeviceWireless.prototype = {
this._connections.push(obj); this._connections.push(obj);
// find an appropriate access point // find an appropriate access point
let forceupdate = false; let any = false, 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 (ap.connection_valid(connection)) { if (ap.connection_valid(connection)) {
apObj.connections.push(connection); apObj.connections.push(connection);
// this potentially changes the sorting order any = true;
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();
} }
@@ -1468,50 +1400,6 @@ 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) {
apObj.isMore = false;
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);
apObj.isMore = true;
}
},
_createSection: function() { _createSection: function() {
if (!this._shouldShowConnectionList()) if (!this._shouldShowConnectionList())
return; return;
@@ -1521,14 +1409,58 @@ NMDeviceWireless.prototype = {
this.section.addMenuItem(this._activeConnectionItem); this.section.addMenuItem(this._activeConnectionItem);
} }
let activeOffset = this._activeConnectionItem ? 1 : 0; let activeAp = this.device.active_access_point;
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 (apObj == this._activeNetwork) if(activeAp && ssidCompare(apObj.ssid, activeApSsid))
continue; continue;
this._createNetworkItem(apObj, j + activeOffset); let menuItem;
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 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 (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);
}
} }
}, },
}; };
@@ -1603,7 +1535,6 @@ 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);
}); });
@@ -1682,18 +1613,21 @@ 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 (devices.length == 0) if (managedDevices.length == 0)
section.actor.hide(); section.actor.hide();
else { else {
section.actor.show(); section.actor.show();
if (devices.length == 1) { if (managedDevices.length == 1) {
let dev = devices[0]; let dev = managedDevices[0];
dev.statusItem.actor.hide(); dev.statusItem.actor.hide();
item.updateForDevice(dev); item.updateForDevice(dev);
} else { } else {
devices.forEach(function(dev) { managedDevices.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

View File

@@ -7,13 +7,15 @@ 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 BUS_NAME = 'org.gnome.SettingsDaemon'; const Gettext = imports.gettext.domain('gnome-shell');
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power'; const _ = Gettext.gettext;
const BUS_NAME = 'org.gnome.PowerManager';
const OBJECT_PATH = '/org/gnome/PowerManager';
const UPDeviceType = { const UPDeviceType = {
UNKNOWN: 0, UNKNOWN: 0,
@@ -41,7 +43,7 @@ const UPDeviceState = {
}; };
const PowerManagerInterface = { const PowerManagerInterface = {
name: 'org.gnome.SettingsDaemon.Power', name: 'org.gnome.PowerManager',
methods: [ methods: [
{ name: 'GetDevices', inSignature: '', outSignature: 'a(susbut)' }, { name: 'GetDevices', inSignature: '', outSignature: 'a(susbut)' },
{ name: 'GetPrimaryDevice', inSignature: '', outSignature: '(susbut)' }, { name: 'GetPrimaryDevice', inSignature: '', outSignature: '(susbut)' },
@@ -81,7 +83,6 @@ 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);
}); });
@@ -93,6 +94,7 @@ Indicator.prototype = {
_readPrimaryDevice: function() { _readPrimaryDevice: function() {
this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(device, error) { this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(device, error) {
if (error) { if (error) {
this._checkError(error);
this._hasPrimary = false; this._hasPrimary = false;
this._primaryDeviceId = null; this._primaryDeviceId = null;
this._batteryItem.actor.hide(); this._batteryItem.actor.hide();
@@ -113,15 +115,15 @@ Indicator.prototype = {
let timestring; let timestring;
if (time > 60) { if (time > 60) {
if (minutes == 0) { if (minutes == 0) {
timestring = ngettext("%d hour remaining", "%d hours remaining", hours).format(hours); timestring = Gettext.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, ngettext("hour", "hours", hours), minutes, ngettext("minute", "minutes", minutes)); timestring = template.format (hours, Gettext.ngettext("hour", "hours", hours), minutes, Gettext.ngettext("minute", "minutes", minutes));
} }
} else } else
timestring = ngettext("%d minute remaining", "%d minutes remaining", minutes).format(minutes); timestring = Gettext.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) + '%';
@@ -144,6 +146,7 @@ Indicator.prototype = {
this._deviceItems = []; this._deviceItems = [];
if (error) { if (error) {
this._checkError(error);
this._deviceSep.actor.hide(); this._deviceSep.actor.hide();
return; return;
} }
@@ -174,12 +177,21 @@ Indicator.prototype = {
this.setGIcon(gicon); this.setGIcon(gicon);
this.actor.show(); this.actor.show();
} else { } else {
this._checkError(error);
this.menu.close(); this.menu.close();
this.actor.hide(); this.actor.hide();
} }
})); }));
this._readPrimaryDevice(); this._readPrimaryDevice();
this._readOtherDevices(); this._readOtherDevices();
},
_checkError: function(error) {
if (!this._restarted && error && error.message.match(/org\.freedesktop\.DBus\.Error\.(UnknownMethod|InvalidArgs)/)) {
Util.killall('gnome-power-manager');
Util.spawn(['gnome-power-manager']);
this._restarted = true;
}
} }
}; };

View File

@@ -9,11 +9,13 @@ 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;
@@ -62,7 +64,6 @@ 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);
}); });

View File

@@ -4,7 +4,6 @@ const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon; const NotificationDaemon = imports.ui.notificationDaemon;
const Util = imports.misc.util; const Util = imports.misc.util;
@@ -39,10 +38,10 @@ StatusIconDispatcher.prototype = {
// status icons // status icons
// http://bugzilla.gnome.org/show_bug.cgi=id=621382 // http://bugzilla.gnome.org/show_bug.cgi=id=621382
Util.killall('indicator-application-service'); Util.killall('indicator-application-service');
},
Main.connect('initialized', Lang.bind(this, function() { start: function(themeWidget) {
this._traymanager.manage_stage(global.stage, Main.messageTray.actor); this._traymanager.manage_stage(global.stage, themeWidget);
}));
}, },
_onTrayIconAdded: function(o, icon) { _onTrayIconAdded: function(o, icon) {

View File

@@ -9,19 +9,30 @@ 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;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const ScreenSaver = imports.misc.screenSaver;
const Util = imports.misc.util; const Util = imports.misc.util;
const BUS_NAME = 'org.gnome.ScreenSaver';
const OBJECT_PATH = '/org/gnome/ScreenSaver';
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching'; const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen'; const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out'; const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const ScreenSaverInterface = {
name: BUS_NAME,
methods: [ { name: 'Lock', inSignature: '' } ]
};
let ScreenSaverProxy = DBus.makeProxyClass(ScreenSaverInterface);
// Adapted from gdm/gui/user-switch-applet/applet.c // Adapted from gdm/gui/user-switch-applet/applet.c
// //
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>. // Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
@@ -48,12 +59,11 @@ 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()
this._upClient = new UPowerGlib.Client(); this._upClient = new UPowerGlib.Client();
this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy(); this._screenSaverProxy = new ScreenSaverProxy(DBus.session, BUS_NAME, OBJECT_PATH);
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._iconBox = new St.Bin(); this._iconBox = new St.Bin();
@@ -81,25 +91,12 @@ 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));
}, },
@@ -116,25 +113,13 @@ StatusMenuButton.prototype = {
}, },
_updateSessionSeparator: function() { _updateSessionSeparator: function() {
let sessionItemsVisible = this._loginScreenItem.actor.visible || let showSeparator = 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() {
@@ -164,34 +149,16 @@ 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..."));
} }
@@ -237,7 +204,6 @@ 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));
@@ -291,11 +257,8 @@ StatusMenuButton.prototype = {
_onLoginScreenActivate: function() { _onLoginScreenActivate: function() {
Main.overview.hide(); Main.overview.hide();
// Ensure we only move to GDM after the screensaver has activated; in some this._gdm.goto_login_session();
// OS configurations, the X server may block event processing on VT switch this._onLockScreenActivate();
this._screenSaverProxy.SetActiveRemote(true, Lang.bind(this, function() {
this._gdm.goto_login_session();
}));
}, },
_onQuitSessionActivate: function() { _onQuitSessionActivate: function() {
@@ -308,8 +271,7 @@ StatusMenuButton.prototype = {
if (this._haveSuspend && if (this._haveSuspend &&
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) { this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
// Ensure we only suspend after the screensaver has activated 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 {

View File

@@ -9,6 +9,9 @@ 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;
@@ -24,9 +27,6 @@ const SCROLLBACK_IDLE_LENGTH = 5;
// See Source._displayPendingMessages // See Source._displayPendingMessages
const SCROLLBACK_HISTORY_LINES = 10; const SCROLLBACK_HISTORY_LINES = 10;
// See Notification._onEntryChanged
const COMPOSING_STOP_TIMEOUT = 5;
const NotificationDirection = { const NotificationDirection = {
SENT: 'chat-sent', SENT: 'chat-sent',
RECEIVED: 'chat-received' RECEIVED: 'chat-received'
@@ -72,34 +72,27 @@ function Client() {
Client.prototype = { Client.prototype = {
_init : function() { _init : function() {
// channel path -> ChatSource // channel path -> Source
this._chatSources = {}; this._sources = {};
this._chatState = Tp.ChannelChatState.ACTIVE;
// Set up a SimpleObserver, which will call _observeChannels whenever a // Set up a SimpleObserver, which will call _observeChannels whenever a
// channel matching its filters is detected. // channel matching its filters is detected.
// 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._tpClient = new Shell.TpClient({ 'dbus_daemon': dbus, this._observer = Tp.SimpleObserver.new(dbus, true, 'GnomeShell', true,
'name': 'GnomeShell', Lang.bind(this, this._observeChannels));
'uniquify-name': true })
this._tpClient.set_observe_channels_func(
Lang.bind(this, this._observeChannels));
this._tpClient.set_approve_channels_func(
Lang.bind(this, this._approveChannels));
this._tpClient.set_handle_channels_func(
Lang.bind(this, this._handleChannels));
// Allow other clients (such as Empathy) to pre-empt our channels if // We only care about single-user text-based chats
// needed let props = {};
this._tpClient.set_delegated_channels_callback( props[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT;
Lang.bind(this, this._delegatedChannelsCb)); props[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE] = Tp.HandleType.CONTACT;
this._observer.add_observer_filter(props);
try { try {
this._tpClient.register(); this._observer.register();
} catch (e) { } catch (e) {
throw new Error('Couldn\'t register Telepathy client. Error: \n' + e); throw new Error('Couldn\'t register SimpleObserver. Error: \n' + e);
} }
}, },
@@ -112,7 +105,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, contactFeatures.length, contactFeatures,
Lang.bind(this, function() { Lang.bind(this, function() {
this._finishObserveChannels(account, conn, channels, context); this._finishObserveChannels(account, conn, channels, context);
})); }));
@@ -132,216 +125,60 @@ Client.prototype = {
continue; continue;
/* Request a TpContact */ /* Request a TpContact */
Shell.get_tp_contacts(conn, [targetHandle], Shell.get_tp_contacts(conn, 1, [targetHandle],
contactFeatures, contactFeatures.length, 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;
/* We got the TpContact */ /* We got the TpContact */
this._createChatSource(account, conn, channel, contacts[0]); this._createSource(account, conn, channel, contacts[0]);
}), null); }), null);
} }
context.accept(); context.accept();
}, },
_createChatSource: function(account, conn, channel, contact) { _createSource: function(account, conn, channel, contact) {
if (this._chatSources[channel.get_object_path()]) if (this._sources[channel.get_object_path()])
return; return;
let source = new ChatSource(account, conn, channel, contact, this._tpClient); let source = new Source(account, conn, channel, contact);
this._chatSources[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)) { delete this._sources[channel.get_object_path()];
// 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._chatSources[channel.get_object_path()];
})); }));
},
_handleChannels: function(handler, account, conn, channels,
requests, user_action_time, context) {
this._handlingChannels(account, conn, channels);
context.accept();
},
_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._chatSources[channel.get_object_path()];
if (source)
source.notify();
}
}
},
_displayRoomInvitation: function(conn, channel, dispatchOp, context) {
// We can only approve the rooms if we have been invited to it
let selfHandle = channel.group_get_self_handle();
if (selfHandle == 0) {
Shell.decline_dispatch_op(context, 'Not invited to the room');
return;
}
let [invited, inviter, reason, msg] = channel.group_get_local_pending_info(selfHandle);
if (!invited) {
Shell.decline_dispatch_op(context, 'Not invited to the room');
return;
}
// Request a TpContact for the inviter
Shell.get_tp_contacts(conn, [inviter],
contactFeatures,
Lang.bind(this, this._createRoomInviteSource, channel, context, dispatchOp));
context.delay();
},
_createRoomInviteSource: function(connection, contacts, failed, channel, context, dispatchOp) {
if (contacts.length < 1) {
Shell.decline_dispatch_op(context, 'Failed to get inviter');
return;
}
// We got the TpContact
// FIXME: We don't have a 'chat room' icon (bgo #653737) use
// system-users for now as Empathy does.
let source = new ApproverSource(dispatchOp, _("Invitation"), 'system-users');
Main.messageTray.add(source);
let notif = new RoomInviteNotification(source, dispatchOp, channel, contacts[0]);
source.notify(notif);
context.accept();
},
_approveChannels: function(approver, account, conn, channels,
dispatchOp, context) {
let channel = channels[0];
let chanType = channel.get_channel_type();
if (chanType == Tp.IFACE_CHANNEL_TYPE_TEXT)
this._approveTextChannel(account, conn, channel, dispatchOp, context);
else if (chanType == Tp.IFACE_CHANNEL_TYPE_STREAMED_MEDIA ||
chanType == 'org.freedesktop.Telepathy.Channel.Type.Call.DRAFT')
this._approveCall(account, conn, channel, dispatchOp, context);
},
_approveTextChannel: function(account, conn, channel, dispatchOp, context) {
let [targetHandle, targetHandleType] = channel.get_handle();
if (targetHandleType == Tp.HandleType.CONTACT) {
// Approve private text 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, [channel]);
} catch (err) {
throw new Error('Failed to Claim channel: ' + err);
}}));
context.accept();
} else {
this._displayRoomInvitation(conn, channel, dispatchOp, context);
}
},
_approveCall: function(account, conn, channel, dispatchOp, context) {
let [targetHandle, targetHandleType] = channel.get_handle();
Shell.get_tp_contacts(conn, [targetHandle],
contactFeatures,
Lang.bind(this, this._createAudioVideoSource, channel, context, dispatchOp));
},
_createAudioVideoSource: function(connection, contacts, failed, channel, context, dispatchOp) {
if (contacts.length < 1) {
Shell.decline_dispatch_op(context, 'Failed to get inviter');
return;
}
let isVideo = false;
let props = channel.borrow_immutable_properties();
if (props['org.freedesktop.Telepathy.Channel.Type.Call.DRAFT.InitialVideo'] ||
props[Tp.PROP_CHANNEL_TYPE_STREAMED_MEDIA_INITIAL_VIDEO])
isVideo = true;
// We got the TpContact
let source = new ApproverSource(dispatchOp, _("Call"), isVideo ? 'camera-web' : 'audio-input-microphone');
Main.messageTray.add(source);
let notif = new AudioVideoNotification(source, dispatchOp, channel, contacts[0], isVideo);
source.notify(notif);
context.accept();
},
_delegatedChannelsCb: function(client, channels) {
// Nothing to do as we don't make a distinction between observed and
// handled channels.
} }
}; };
function ChatSource(account, conn, channel, contact, client) { function Source(account, conn, channel, contact) {
this._init(account, conn, channel, contact, client); this._init(account, conn, channel, contact);
} }
ChatSource.prototype = { Source.prototype = {
__proto__: MessageTray.Source.prototype, __proto__: MessageTray.Source.prototype,
_init: function(account, conn, channel, contact, client) { _init: function(account, conn, channel, contact) {
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;
this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed)); this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed));
this._notification = new ChatNotification(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());
@@ -358,7 +195,7 @@ ChatSource.prototype = {
_updateAlias: function() { _updateAlias: function() {
let oldAlias = this.title; let oldAlias = this.title;
this.setTitle(this._contact.get_alias()); this.title = this._contact.get_alias();
this._notification.appendAliasChange(oldAlias, this.title); this._notification.appendAliasChange(oldAlias, this.title);
this.pushNotification(this._notification); this.pushNotification(this._notification);
}, },
@@ -387,17 +224,13 @@ ChatSource.prototype = {
}, },
open: function(notification) { open: function(notification) {
if (this._client.is_handling_channel(this._channel)) { let props = {};
// We are handling the channel, try to pass it to Empathy props[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT;
this._client.delegate_channels_async([this._channel], global.get_current_time(), "", null); [props[Tp.PROP_CHANNEL_TARGET_HANDLE], props[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE]] = this._channel.get_handle();
}
else {
// We are not the handler, just ask to present the channel
let dbus = Tp.DBusDaemon.dup();
let cd = Tp.ChannelDispatcher.new(dbus);
cd.present_channel_async(this._channel, global.get_current_time(), null); let req = Tp.AccountChannelRequest.new(this._account, props, global.get_current_time());
}
req.ensure_channel_async('', null, null);
}, },
_getLogMessages: function() { _getLogMessages: function() {
@@ -415,20 +248,7 @@ ChatSource.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 = []; let pendingMessages = pendingTpMessages.map(function (tpMessage) { return makeMessageFromTpMessage(tpMessage, NotificationDirection.RECEIVED); });
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);
}
this._updateCount();
let showTimestamp = false; let showTimestamp = false;
@@ -464,7 +284,6 @@ ChatSource.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);
@@ -474,17 +293,7 @@ ChatSource.prototype = {
this.destroy(); this.destroy();
}, },
_updateCount: function() {
this._setCount(this._pendingMessages.length, this._pendingMessages.length > 0);
},
_messageReceived: function(channel, message) { _messageReceived: function(channel, message) {
if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT)
return;
this._pendingMessages.push(message);
this._updateCount();
message = makeMessageFromTpMessage(message, NotificationDirection.RECEIVED); message = makeMessageFromTpMessage(message, NotificationDirection.RECEIVED);
this._notification.appendMessage(message); this._notification.appendMessage(message);
this.notify(); this.notify();
@@ -511,25 +320,10 @@ ChatSource.prototype = {
} }
let msg = Tp.ClientMessage.new_text(type, text); let msg = Tp.ClientMessage.new_text(type, text);
this._channel.send_message_async(msg, 0, Lang.bind(this, function (src, result) { this._channel.send_message_async(msg, 0, null);
this._channel.send_message_finish(result);
}));
}, },
setChatState: function(state) { _presenceChanged: function (contact, presence, type, status, message) {
// We don't want to send COMPOSING every time a letter is typed into
// the entry. We send the state only when it changes. Telepathy/Empathy
// might change it behind our back if the user is using both
// gnome-shell's entry and the Empathy conversation window. We could
// keep track of it with the ChatStateChanged signal but it is good
// enough right now.
if (state != this._chatState) {
this._chatState = state;
this._channel.set_chat_state_async(state, null);
}
},
_presenceChanged: function (contact, presence, status, message) {
let msg, shouldNotify, title; let msg, shouldNotify, title;
if (this._presence == presence) if (this._presence == presence)
@@ -562,53 +356,14 @@ ChatSource.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);
this._updateCount();
}
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;
} }
}; };
function ChatNotification(source) { function Notification(source) {
this._init(source); this._init(source);
} }
ChatNotification.prototype = { Notification.prototype = {
__proto__: MessageTray.Notification.prototype, __proto__: MessageTray.Notification.prototype,
_init: function(source) { _init: function(source) {
@@ -618,7 +373,6 @@ ChatNotification.prototype = {
this._responseEntry = new St.Entry({ style_class: 'chat-response', this._responseEntry = new St.Entry({ style_class: 'chat-response',
can_focus: true }); can_focus: true });
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated)); this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));
this._responseEntry.clutter_text.connect('text-changed', Lang.bind(this, this._onEntryChanged));
this.setActionArea(this._responseEntry); this.setActionArea(this._responseEntry);
this._oldMaxScrollAdjustment = 0; this._oldMaxScrollAdjustment = 0;
@@ -635,7 +389,6 @@ ChatNotification.prototype = {
this._history = []; this._history = [];
this._timestampTimeoutId = 0; this._timestampTimeoutId = 0;
this._composingTimeoutId = 0;
}, },
/** /**
@@ -671,35 +424,13 @@ ChatNotification.prototype = {
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)
@@ -722,7 +453,23 @@ ChatNotification.prototype = {
Lang.bind(this, this.appendTimestamp)); Lang.bind(this, this.appendTimestamp));
} }
this._filterMessages(); if (this._history.length > 1) {
// Keep the scrollback from growing too long. If the most
// recent message (before the one we just added) is within
// SCROLLBACK_RECENT_TIME, we will keep
// SCROLLBACK_RECENT_LENGTH previous messages. Otherwise
// we'll keep SCROLLBACK_IDLE_LENGTH messages.
let 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) {
@@ -764,9 +511,6 @@ ChatNotification.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;
}, },
@@ -778,23 +522,21 @@ ChatNotification.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) {
oldAlias = GLib.markup_escape_text(oldAlias, -1); // FIXME: uncomment this after 3.0 string freeze ends
newAlias = GLib.markup_escape_text(newAlias, -1);
/* Translators: this is the other person changing their old IM name to their new // oldAlias = GLib.markup_escape_text(oldAlias, -1);
IM name. */ // newAlias = GLib.markup_escape_text(newAlias, -1);
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 });
this._filterMessages(); // /* Translators: this is the other person changing their old IM name to their new
// 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() {
@@ -808,166 +550,5 @@ ChatNotification.prototype = {
// see Source._messageSent // see Source._messageSent
this._responseEntry.set_text(''); this._responseEntry.set_text('');
this.source.respond(text); this.source.respond(text);
},
_composingStopTimeout: function() {
this._composingTimeoutId = 0;
this.source.setChatState(Tp.ChannelChatState.PAUSED);
return false;
},
_onEntryChanged: function() {
let text = this._responseEntry.get_text();
// If we're typing, we want to send COMPOSING.
// If we empty the entry, we want to send ACTIVE.
// If we've stopped typing for COMPOSING_STOP_TIMEOUT
// seconds, we want to send PAUSED.
// Remove composing timeout.
if (this._composingTimeoutId > 0) {
Mainloop.source_remove(this._composingTimeoutId);
this._composingTimeoutId = 0;
}
if (text != '') {
this.source.setChatState(Tp.ChannelChatState.COMPOSING);
this._composingTimeoutId = Mainloop.timeout_add_seconds(
COMPOSING_STOP_TIMEOUT,
Lang.bind(this, this._composingStopTimeout));
} else {
this.source.setChatState(Tp.ChannelChatState.ACTIVE);
}
}
};
function ApproverSource(dispatchOp, text, icon) {
this._init(dispatchOp, text, icon);
}
ApproverSource.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function(dispatchOp, text, icon) {
MessageTray.Source.prototype._init.call(this, text);
this._icon = icon;
this._setSummaryIcon(this.createNotificationIcon());
this._dispatchOp = dispatchOp;
// Destroy the source if the channel dispatch operation is invalidated
// as we can't approve any more.
this._invalidId = dispatchOp.connect('invalidated',
Lang.bind(this, function(domain, code, msg) {
this.destroy();
}));
},
destroy: function() {
if (this._invalidId != 0) {
this._dispatchOp.disconnect(this._invalidId);
this._invalidId = 0;
}
MessageTray.Source.prototype.destroy.call(this);
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: this._icon,
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE });
}
}
function RoomInviteNotification(source, dispatchOp, channel, inviter) {
this._init(source, dispatchOp, channel, inviter);
}
RoomInviteNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source, dispatchOp, channel, inviter) {
MessageTray.Notification.prototype._init.call(this,
source,
/* translators: argument is a room name like
* room@jabber.org for example. */
_("Invitation to %s").format(channel.get_identifier()),
null,
{ customContent: true });
this.setResident(true);
/* translators: first argument is the name of a contact and the second
* one the name of a room. "Alice is inviting you to join room@jabber.org
* for example. */
this.addBody(_("%s is inviting you to join %s").format(inviter.get_alias(), channel.get_identifier()));
this.addButton('decline', _("Decline"));
this.addButton('accept', _("Accept"));
this.connect('action-invoked', Lang.bind(this, function(self, action) {
switch (action) {
case 'decline':
dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE,
'', function(src, result) {
src.leave_channels_finish(result)});
break;
case 'accept':
dispatchOp.handle_with_time_async('', global.get_current_time(),
function(src, result) {
src.handle_with_time_finish(result)});
break;
}
this.destroy();
}));
}
};
// Audio Video
function AudioVideoNotification(source, dispatchOp, channel, contact, isVideo) {
this._init(source, dispatchOp, channel, contact, isVideo);
}
AudioVideoNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source, dispatchOp, channel, contact, isVideo) {
let title = '';
if (isVideo)
/* translators: argument is a contact name like Alice for example. */
title = _("Video call from %s").format(contact.get_alias());
else
/* translators: argument is a contact name like Alice for example. */
title = _("Call from %s").format(contact.get_alias());
MessageTray.Notification.prototype._init.call(this,
source,
title,
null,
{ customContent: true });
this.setResident(true);
this.addButton('reject', _("Reject"));
this.addButton('answer', _("Answer"));
this.connect('action-invoked', Lang.bind(this, function(self, action) {
switch (action) {
case 'reject':
dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE,
'', function(src, result) {
src.leave_channels_finish(result)});
break;
case 'answer':
dispatchOp.handle_with_time_async('', global.get_current_time(),
function(src, result) {
src.handle_with_time_finish(result)});
break;
}
this.destroy();
}));
} }
}; };

View File

@@ -8,6 +8,8 @@ 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;
@@ -141,19 +143,13 @@ SearchTab.prototype = {
'edit-find'); 'edit-find');
this._text.connect('text-changed', Lang.bind(this, this._onTextChanged)); this._text.connect('text-changed', Lang.bind(this, this._onTextChanged));
this._text.connect('key-press-event', Lang.bind(this, function (o, e) { this._text.connect('activate', Lang.bind(this, function (se) {
// We can't connect to 'activate' here because search providers if (this._searchTimeoutId > 0) {
// might want to do something with the modifiers in activateSelected. Mainloop.source_remove(this._searchTimeoutId);
let symbol = e.get_key_symbol(); this._doSearch();
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._doSearch();
}
this._searchResults.activateSelected();
return true;
} }
return false; this._searchResults.activateSelected();
return true;
})); }));
this._entry.connect('notify::mapped', Lang.bind(this, this._onMapped)); this._entry.connect('notify::mapped', Lang.bind(this, this._onMapped));

View File

@@ -2,6 +2,8 @@
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;

View File

@@ -6,7 +6,6 @@ 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;
@@ -23,7 +22,8 @@ function getDimShader() {
if (dimShader === null) if (dimShader === null)
return null; return null;
if (!dimShader) { if (!dimShader) {
let source = Shell.get_file_contents_utf8_sync(global.datadir + '/shaders/dim-window.glsl'); let [success, source, length] = GLib.file_get_contents(global.datadir +
'/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);
@@ -119,8 +119,6 @@ WindowManager.prototype = {
this.setKeybindingHandler('switch_to_workspace_down', Lang.bind(this, this._showWorkspaceSwitcher)); this.setKeybindingHandler('switch_to_workspace_down', Lang.bind(this, this._showWorkspaceSwitcher));
this.setKeybindingHandler('switch_windows', Lang.bind(this, this._startAppSwitcher)); this.setKeybindingHandler('switch_windows', Lang.bind(this, this._startAppSwitcher));
this.setKeybindingHandler('switch_group', Lang.bind(this, this._startAppSwitcher)); this.setKeybindingHandler('switch_group', Lang.bind(this, this._startAppSwitcher));
this.setKeybindingHandler('switch_windows_backward', Lang.bind(this, this._startAppSwitcher));
this.setKeybindingHandler('switch_group_backward', Lang.bind(this, this._startAppSwitcher));
this.setKeybindingHandler('switch_panels', Lang.bind(this, this._startA11ySwitcher)); this.setKeybindingHandler('switch_panels', Lang.bind(this, this._startA11ySwitcher));
Main.overview.connect('showing', Lang.bind(this, function() { Main.overview.connect('showing', Lang.bind(this, function() {
@@ -182,7 +180,7 @@ WindowManager.prototype = {
*/ */
this._minimizing.push(actor); this._minimizing.push(actor);
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let xDest = primary.x; let xDest = primary.x;
if (St.Widget.get_default_direction() == St.TextDirection.RTL) if (St.Widget.get_default_direction() == St.TextDirection.RTL)
xDest += primary.width; xDest += primary.width;
@@ -536,7 +534,7 @@ WindowManager.prototype = {
let tabPopup = new AltTab.AltTabPopup(); let tabPopup = new AltTab.AltTabPopup();
if (!tabPopup.show(backwards, binding)) if (!tabPopup.show(backwards, binding == 'switch_group'))
tabPopup.destroy(); tabPopup.destroy();
}, },

View File

@@ -1,7 +1,6 @@
/* -*- 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;
@@ -28,8 +27,6 @@ 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.
@@ -225,12 +222,8 @@ WindowClone.prototype = {
let [width, height] = this.actor.get_transformed_size(); let [width, height] = this.actor.get_transformed_size();
let monitorIndex = this.metaWindow.get_monitor(); let monitorIndex = this.metaWindow.get_monitor();
let monitor = Main.layoutManager.monitors[monitorIndex]; let availArea = global.get_monitors()[monitorIndex];
let availArea = new Meta.Rectangle({ x: monitor.x, if (monitorIndex == global.get_primary_monitor_index()) {
y: monitor.y,
width: monitor.width,
height: monitor.height });
if (monitorIndex == Main.layoutManager.primaryIndex) {
availArea.y += Main.panel.actor.height; availArea.y += Main.panel.actor.height;
availArea.height -= Main.panel.actor.height; availArea.height -= Main.panel.actor.height;
} }
@@ -312,21 +305,6 @@ WindowClone.prototype = {
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');
}, },
@@ -419,8 +397,6 @@ 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();
}, },
@@ -457,20 +433,9 @@ 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 (side == St.Side.LEFT) if (St.Widget.get_default_direction() == St.TextDirection.RTL)
buttonX = cloneX - (button.width - button._overlap); buttonX = cloneX - (button.width - button._overlap);
else else
buttonX = cloneX + (cloneWidth - button._overlap); buttonX = cloneX + (cloneWidth - button._overlap);
@@ -597,7 +562,7 @@ Workspace.prototype = {
this._height = 0; this._height = 0;
this.monitorIndex = monitorIndex; this.monitorIndex = monitorIndex;
this._monitor = Main.layoutManager.monitors[this.monitorIndex]; this._monitor = global.get_monitors()[this.monitorIndex];
this._windowOverlaysGroup = new Clutter.Group(); this._windowOverlaysGroup = new Clutter.Group();
// Without this the drop area will be overlapped. // Without this the drop area will be overlapped.
this._windowOverlaysGroup.set_size(0, 0); this._windowOverlaysGroup.set_size(0, 0);
@@ -652,7 +617,6 @@ 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;
})); }));
@@ -675,6 +639,16 @@ 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;

View File

@@ -56,7 +56,7 @@ WorkspaceSwitcherPopup.prototype = {
_getPreferredHeight : function (actor, forWidth, alloc) { _getPreferredHeight : function (actor, forWidth, alloc) {
let children = this._list.get_children(); let children = this._list.get_children();
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let availHeight = primary.height; let availHeight = primary.height;
availHeight -= Main.panel.actor.height; availHeight -= Main.panel.actor.height;
@@ -82,7 +82,7 @@ WorkspaceSwitcherPopup.prototype = {
}, },
_getPreferredWidth : function (actor, forHeight, alloc) { _getPreferredWidth : function (actor, forHeight, alloc) {
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
this._childWidth = Math.round(this._childHeight * primary.width / primary.height); this._childWidth = Math.round(this._childHeight * primary.width / primary.height);
alloc.min_size = this._childWidth; alloc.min_size = this._childWidth;
@@ -125,7 +125,7 @@ WorkspaceSwitcherPopup.prototype = {
}, },
_position: function() { _position: function() {
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
this._container.x = primary.x + Math.floor((primary.width - this._container.width) / 2); this._container.x = primary.x + Math.floor((primary.width - this._container.width) / 2);
this._container.y = primary.y + Main.panel.actor.height + this._container.y = primary.y + Main.panel.actor.height +
Math.floor(((primary.height - Main.panel.actor.height) - this._container.height) / 2); Math.floor(((primary.height - Main.panel.actor.height) - this._container.height) / 2);

View File

@@ -146,7 +146,7 @@ function WorkspaceThumbnail(metaWorkspace) {
WorkspaceThumbnail.prototype = { WorkspaceThumbnail.prototype = {
_init : function(metaWorkspace) { _init : function(metaWorkspace) {
this.metaWorkspace = metaWorkspace; this.metaWorkspace = metaWorkspace;
this.monitorIndex = Main.layoutManager.primaryIndex; this.monitorIndex = global.get_primary_monitor_index();
this.actor = new St.Group({ reactive: true, this.actor = new St.Group({ reactive: true,
clip_to_allocation: true, clip_to_allocation: true,
@@ -170,7 +170,7 @@ WorkspaceThumbnail.prototype = {
this._background = new Clutter.Clone({ source: global.background_actor }); this._background = new Clutter.Clone({ source: global.background_actor });
this._contents.add_actor(this._background); this._contents.add_actor(this._background);
let monitor = Main.layoutManager.primaryMonitor; let monitor = global.get_primary_monitor();
this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height); this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height);
let windows = global.get_window_actors().filter(this._isMyWindow, this); let windows = global.get_window_actors().filter(this._isMyWindow, this);
@@ -178,11 +178,6 @@ 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]);
} }
@@ -262,18 +257,11 @@ WorkspaceThumbnail.prototype = {
return; return;
// Check if window still should be here // Check if window still should be here
if (win && this._isMyWindow(win) && this._isOverviewWindow(win)) if (win && this._isMyWindow(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();
}, },
@@ -302,11 +290,6 @@ 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;
@@ -333,13 +316,6 @@ 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();
}, },
@@ -350,14 +326,6 @@ 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;
}, },
@@ -371,8 +339,7 @@ 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
@@ -528,7 +495,7 @@ ThumbnailsBox.prototype = {
// The "porthole" is the portion of the screen that we show in the workspaces // The "porthole" is the portion of the screen that we show in the workspaces
let panelHeight = Main.panel.actor.height; let panelHeight = Main.panel.actor.height;
let monitor = Main.layoutManager.primaryMonitor; let monitor = global.get_primary_monitor();
this._porthole = { this._porthole = {
x: monitor.x, x: monitor.x,
y: monitor.y + panelHeight, y: monitor.y + panelHeight,

View File

@@ -7,6 +7,8 @@ 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;
@@ -49,12 +51,9 @@ 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
@@ -70,10 +69,10 @@ WorkspacesView.prototype = {
this._workspaces[activeWorkspaceIndex].actor.raise_top(); this._workspaces[activeWorkspaceIndex].actor.raise_top();
this._extraWorkspaces = []; this._extraWorkspaces = [];
let monitors = Main.layoutManager.monitors; let monitors = global.get_monitors();
let m = 0; let m = 0;
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
if (i == Main.layoutManager.primaryIndex) if (i == global.get_primary_monitor_index())
continue; continue;
let ws = new Workspace.Workspace(null, i); let ws = new Workspace.Workspace(null, i);
this._extraWorkspaces[m++] = ws; this._extraWorkspaces[m++] = ws;
@@ -96,8 +95,7 @@ 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._clipX, this._clipY, this.actor.set_clip(this._x, this._y, this._width, this._height);
this._clipWidth, this._clipHeight);
})); }));
this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
@@ -141,13 +139,6 @@ 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))
@@ -161,10 +152,6 @@ 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];
@@ -239,6 +226,27 @@ WorkspacesView.prototype = {
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() {
@@ -259,6 +267,17 @@ 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;
@@ -281,9 +300,12 @@ WorkspacesView.prototype = {
} }
}, },
updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces) { updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces, lostWorkspaces) {
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,
@@ -291,13 +313,12 @@ 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);
@@ -383,7 +404,7 @@ WorkspacesView.prototype = {
this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate); this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
} }
let primary = Main.layoutManager.primaryMonitor; let primary = global.get_primary_monitor();
let activeWorkspaceIndex = global.screen.get_active_workspace_index(); let activeWorkspaceIndex = global.screen.get_active_workspace_index();
let topWorkspace, bottomWorkspace; let topWorkspace, bottomWorkspace;
@@ -449,7 +470,7 @@ WorkspacesView.prototype = {
Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._timeoutId);
this._timeoutId = 0; this._timeoutId = 0;
} }
DND.removeDragMonitor(this._dragMonitor); DND.removeMonitor(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++)
@@ -550,7 +571,8 @@ WorkspacesDisplay.prototype = {
controls.connect('scroll-event', controls.connect('scroll-event',
Lang.bind(this, this._onScrollEvent)); Lang.bind(this, this._onScrollEvent));
this._monitorIndex = Main.layoutManager.primaryIndex; this._monitorIndex = global.get_primary_monitor_index();
this._monitor = global.get_monitors()[this._monitorIndex];
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox(); this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
controls.add_actor(this._thumbnailsBox.actor); controls.add_actor(this._thumbnailsBox.actor);
@@ -566,10 +588,7 @@ WorkspacesDisplay.prototype = {
this._updateAlwaysZoom(); this._updateAlwaysZoom();
Main.layoutManager.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;
})); }));
@@ -579,6 +598,7 @@ WorkspacesDisplay.prototype = {
this._updateAlwaysZoom(); this._updateAlwaysZoom();
})); }));
this._nWorkspacesNotifyId = 0;
this._switchWorkspaceNotifyId = 0; this._switchWorkspaceNotifyId = 0;
this._itemDragBeginId = 0; this._itemDragBeginId = 0;
@@ -608,6 +628,10 @@ 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));
@@ -638,6 +662,10 @@ 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;
@@ -686,15 +714,10 @@ WorkspacesDisplay.prototype = {
}, },
_updateAlwaysZoom: function() { _updateAlwaysZoom: function() {
// Always show the pager if workspaces are actually used, this._alwaysZoomOut = false;
// e.g. there are windows on more than one
this._alwaysZoomOut = global.screen.n_workspaces > 2;
if (this._alwaysZoomOut) let monitors = global.get_monitors();
return; let primary = global.get_primary_monitor();
let monitors = Main.layoutManager.monitors;
let primary = Main.layoutManager.primaryMonitor;
/* Look for any monitor to the right of the primary, if there is /* Look for any monitor to the right of the primary, if there is
* one, we always keep zoom out, otherwise its hard to reach * one, we always keep zoom out, otherwise its hard to reach
@@ -762,13 +785,6 @@ 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)
@@ -807,12 +823,6 @@ 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
@@ -838,23 +848,24 @@ WorkspacesDisplay.prototype = {
lostWorkspaces = this._workspaces.splice(removedIndex, lostWorkspaces = this._workspaces.splice(removedIndex,
removedNum); removedNum);
for (let l = 0; l < lostWorkspaces.length; l++) { // Don't let the user try to select this workspace as it's
lostWorkspaces[l].disconnectAll(); // making its exit.
lostWorkspaces[l].destroy(); for (let l = 0; l < lostWorkspaces.length; l++)
} 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; let shouldZoom = this._alwaysZoomOut || this._controls.hover || (this._inDrag && !this._cancelledDrag);
if (shouldZoom != this._zoomOut) { if (shouldZoom != this._zoomOut) {
this._zoomOut = shouldZoom; this._zoomOut = shouldZoom;
this._updateWorkspacesGeometry(); this._updateWorkspacesGeometry();
@@ -878,22 +889,12 @@ WorkspacesDisplay.prototype = {
_dragBegin: function() { _dragBegin: function() {
this._inDrag = true; this._inDrag = true;
this._cancelledDrag = false; this._cancelledDrag = false;
this._dragMonitor = { this._updateZoom();
dragMotion: Lang.bind(this, this._onDragMotion)
};
DND.addDragMonitor(this._dragMonitor);
}, },
_dragCancelled: function() { _dragCancelled: function() {
this._cancelledDrag = true; this._cancelledDrag = true;
DND.removeDragMonitor(this._dragMonitor); this._updateZoom();
},
_onDragMotion: function(dragEvent) {
let controlsHovered = this._controls.contains(dragEvent.targetActor);
this._controls.set_hover(controlsHovered);
return DND.DragMotionResult.CONTINUE;
}, },
_dragEnd: function() { _dragEnd: function() {

View File

@@ -36,48 +36,53 @@ visually attractive and easy to use experience.
.SH OPTIONS .SH OPTIONS
.TP .TP
.B \-\-replace .B \-r, \-\-replace
Replace the running window manager Replace the running metacity/gnome-panel
.br .br
.TP .TP
.B \-\-sm-disable .B \-v, \-\-verbose
Disable connection to the session manager Shows details about the results of running `gnome-shell'.
.br .br
.TP .TP
.B \-\-sm-client-id=ID .B \-g, \-\-debug
Specify session management ID Run under a debugger
.br .br
.TP .TP
.B \-\-sm-save-file=FILE .B \-\-debug\-command
Initialize session from savefile Command to use for debugging (defaults to 'gdb \-\-args')
.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
Make X calls synchronous .br
Make X calls synchronously, useful when debugging down X errors
.br .br
.TP .TP
.B \-\-version .B \-\-xephyr
Print version and exit Run a debugging instance inside Xephyr
.br .br
.TP .TP
.B \-\-help .B \-\-geometry
Display help and exit Specify Xephyr screen geometry
.br
.TP
.B \-w, \-\-wide
Use widescreen (1280x800) with Xephyr
.br
.TP
.B \-\-create\-extension
Create a new GNOME Shell extension
.TP
.B \-\-eval\-file
Evaluate the contents of the given JavaScript file
.br .br
.SH BUGS .SH BUGS

View File

@@ -1,7 +1,6 @@
af af
an
ar ar
be ast
bg bg
bn bn
bn_IN bn_IN
@@ -12,7 +11,6 @@ da
de de
el el
en_GB en_GB
eo
es es
et et
eu eu
@@ -36,6 +34,7 @@ mr
nb nb
nl nl
nn nn
oc
pa pa
pl pl
pt pt

File diff suppressed because it is too large Load Diff

1217
po/be.po

File diff suppressed because it is too large Load Diff

859
po/ca.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

280
po/da.po
View File

@@ -14,8 +14,8 @@ 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-03-30 22:40+0200\n" "POT-Creation-Date: 2013-10-07 18:42+0200\n"
"PO-Revision-Date: 2011-03-30 19:55+0000\n" "PO-Revision-Date: 2013-10-06 13:50+0200\n"
"Last-Translator: Kris Thomsen <lakristho@gmail.com>\n" "Last-Translator: Kris Thomsen <lakristho@gmail.com>\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n" "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
"Language: da\n" "Language: da\n"
@@ -33,6 +33,11 @@ msgid "Window management and application launching"
msgstr "Vindueshåndtering og åbning af programmer" msgstr "Vindueshåndtering og åbning af programmer"
#: ../data/org.gnome.shell.gschema.xml.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Aktivér interne værktøjer, som er nyttige for udviklere og testere fra Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.h:2
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."
@@ -40,20 +45,11 @@ msgstr ""
"Tillad adgang til interne fejlsøgnings- og overvågningsværktøjer med brug af " "Tillad adgang til interne fejlsøgnings- og overvågningsværktøjer med brug af "
"dialogen Alt-F2." "dialogen Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Aktivér interne værktøjer, som er nyttige for udviklere og testere fra 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 "Uuids of extensions to disable"
msgstr "Filendelse til at gemme skærmoptagelser" msgstr "Uuid'er for udvidelser der deaktiveres"
#: ../data/org.gnome.shell.gschema.xml.in.h:4 #: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr "Billedfrekvens brugt til skærmoptagelser."
#: ../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."
@@ -61,31 +57,87 @@ msgstr ""
"GNOME-skallens udvidelser har en uuid-indstilling; denne nøgle oplister " "GNOME-skallens udvidelser har en uuid-indstilling; denne nøgle oplister "
"udvidelser som ikke skal indlæses." "udvidelser som ikke skal indlæses."
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Whether to collect stats about applications usage"
msgstr "Om der skal indsamles statistik om programmers brug"
#: ../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 ""
msgstr "Historik for kommandodialog (Alt-F2)" "The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Skallen overvåger normalt aktive programmer for at kunne vise de mest brugte "
"(f.eks. i genveje). Selvom disse data er holdt private, vil du muligvis "
"ønske at deaktivere dem af private grunde. Bemærk at selvom du gør dette, "
"vil det ikke fjerne de allerede gemte data."
#: ../data/org.gnome.shell.gschema.xml.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for the looking glass dialog"
msgstr "Historik for looking glass-dialogen"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "If true, display date in the clock, in addition to time."
msgstr "Hvis sand vises datoen i uret, som tillæg til tiden."
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "If true, display seconds in time."
msgstr "Hvis sand vises sekunder i klokkeslæt."
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "If true, display the ISO week date in the calendar."
msgstr "Hvis sand vises ISO-ugenummeret i kalenderen."
#: ../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 "Liste over skrivebordsfil-id'er til favoritprogrammer" msgstr "Liste over skrivebordsfil-id'er til favoritprogrammer"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"Programmerne som passer til disse identifikatorer vil blive vist i "
"favoritområdet."
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "disabled OpenSearch providers"
msgstr "deaktiverede OpenSearch-udbydere"
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "History for command (Alt-F2) dialog"
msgstr "Historik for kommandodialog (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "History for the looking glass dialog"
msgstr "Historik for looking glass-dialogen"
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "Show the week date in the calendar"
msgstr "Vis ugenummer i kalenderen"
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "If true, display the ISO week date in the calendar."
msgstr "Hvis sand vises ISO-ugenummeret i kalenderen."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show time with seconds"
msgstr "Vis tid med sekunder"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "If true, display seconds in time."
msgstr "Hvis sand vises sekunder i klokkeslæt."
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show date in clock"
msgstr "Vis dato i uret"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "If true, display date in the clock, in addition to time."
msgstr "Hvis sand vises datoen i uret, som tillæg til tiden."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Framerate used for recording screencasts."
msgstr "Billedfrekvens brugt til skærmoptagelser."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"Billedfrekvensen på den endelige skærmoptagelse, optaget af GNOME-skallens "
"skærmoptager i billeder-per-sekund."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Datakanalen for Gstreamer bruges til indkodning af skærmoptagelsen"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@@ -110,27 +162,11 @@ msgstr ""
"%T ! queue ! webmmux\" og optager i WEBM-formatet med VP8-codec'et. %T " "%T ! queue ! webmmux\" og optager i WEBM-formatet med VP8-codec'et. %T "
"bruges som pladsholder for et gæt om det optimale trådantal på systemet." "bruges som pladsholder for et gæt om det optimale trådantal på systemet."
#: ../data/org.gnome.shell.gschema.xml.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "Show date in clock" msgid "File extension used for storing the screencast"
msgstr "Vis dato i uret" msgstr "Filendelse til at gemme skærmoptagelser"
#: ../data/org.gnome.shell.gschema.xml.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Show the week date in the calendar"
msgstr "Vis ugenummer i kalenderen"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Vis tid med sekunder"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"Programmerne som passer til disse identifikatorer vil blive vist i "
"favoritområdet."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "" 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 "
@@ -140,42 +176,6 @@ msgstr ""
"og bruge denne endelse. Det skal ændres når der optages i et andet " "og bruge denne endelse. Det skal ændres når der optages i et andet "
"containerformat." "containerformat."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"Billedfrekvensen på den endelige skærmoptagelse, optaget af GNOME-skallens "
"skærmoptager i billeder-per-sekund."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Datakanalen for Gstreamer bruges til indkodning af skærmoptagelsen"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Skallen overvåger normalt aktive programmer for at kunne vise de mest brugte "
"(f.eks. i genveje). Selvom disse data er holdt private, vil du muligvis "
"ønske at deaktivere dem af private grunde. Bemærk at selvom du gør dette, "
"vil det ikke fjerne de allerede gemte data."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Uuids of extensions to disable"
msgstr "Uuid'er for udvidelser der deaktiveres"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "Whether to collect stats about applications usage"
msgstr "Om der skal indsamles statistik om programmers brug"
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "disabled OpenSearch providers"
msgstr "deaktiverede OpenSearch-udbydere"
#: ../js/misc/util.js:71 #: ../js/misc/util.js:71
msgid "Command not found" msgid "Command not found"
msgstr "Kommando ikke fundet" msgstr "Kommando ikke fundet"
@@ -192,27 +192,27 @@ msgid "Execution of '%s' failed:"
msgstr "Kørsel af \"%s\" mislykkedes:" msgstr "Kørsel af \"%s\" mislykkedes:"
#. 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 "Alle" msgstr "Alle"
#: ../js/ui/appDisplay.js:328 #: ../js/ui/appDisplay.js:359
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "PROGRAMMER" msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:354 #: ../js/ui/appDisplay.js:385
msgid "SETTINGS" msgid "SETTINGS"
msgstr "INDSTILLINGER" msgstr "INDSTILLINGER"
#: ../js/ui/appDisplay.js:625 #: ../js/ui/appDisplay.js:656
msgid "New Window" msgid "New Window"
msgstr "Nyt vindue" msgstr "Nyt vindue"
#: ../js/ui/appDisplay.js:628 #: ../js/ui/appDisplay.js:659
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Fjern fra favoritter" msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:629 #: ../js/ui/appDisplay.js:660
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Føj til favoritter" msgstr "Føj til favoritter"
@@ -345,13 +345,13 @@ msgid "Nothing Scheduled"
msgstr "Intet planlagt" msgstr "Intet planlagt"
#. 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:496
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#. 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:499
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d. %B %Y" msgstr "%A, %d. %B %Y"
@@ -372,7 +372,7 @@ msgstr "Denne uge"
msgid "Next week" msgid "Next week"
msgstr "Næste uge" msgstr "Næste uge"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1007 #: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1037
msgid "Remove" msgid "Remove"
msgstr "Fjern" msgstr "Fjern"
@@ -497,7 +497,7 @@ msgstr "Systemet vil genstarte automatisk om %d sekunder."
msgid "Restarting the system." msgid "Restarting the system."
msgstr "Genstarter systemet." msgstr "Genstarter systemet."
#: ../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 "Annullér" msgstr "Annullér"
@@ -532,11 +532,11 @@ msgstr "Vis kilde"
msgid "Web Page" msgid "Web Page"
msgstr "Webside" msgstr "Webside"
#: ../js/ui/messageTray.js:1000 #: ../js/ui/messageTray.js:1030
msgid "Open" msgid "Open"
msgstr "Åbn" msgstr "Åbn"
#: ../js/ui/messageTray.js:2164 #: ../js/ui/messageTray.js:2194
msgid "System Information" msgid "System Information"
msgstr "Systeminformation" msgstr "Systeminformation"
@@ -559,18 +559,18 @@ msgid "Dash"
msgstr "Favoritområde" msgstr "Favoritområde"
#. 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:524 #: ../js/ui/panel.js:533
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "Afslut %s" msgstr "Afslut %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:902 #: ../js/ui/panel.js:911
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:1003 #: ../js/ui/panel.js:1012
msgid "Top Bar" msgid "Top Bar"
msgstr "Toppanel" msgstr "Toppanel"
@@ -628,11 +628,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Indtast en kommando:" msgstr "Indtast en kommando:"
#: ../js/ui/searchDisplay.js:310 #: ../js/ui/searchDisplay.js:311
msgid "Searching..." msgid "Searching..."
msgstr "Søger..." msgstr "Søger..."
#: ../js/ui/searchDisplay.js:324 #: ../js/ui/searchDisplay.js:325
msgid "No matching results." msgid "No matching results."
msgstr "Ingen resultater fundet." msgstr "Ingen resultater fundet."
@@ -836,139 +836,139 @@ msgstr "Vis tastaturlayout..."
msgid "Localization Settings" msgid "Localization Settings"
msgstr "Indstillinger for sprog" msgstr "Indstillinger for sprog"
#: ../js/ui/status/network.js:104 ../js/ui/status/network.js:1454 #: ../js/ui/status/network.js:122 ../js/ui/status/network.js:1428
msgid "<unknown>" msgid "<unknown>"
msgstr "<ukendt>" msgstr "<ukendt>"
#. 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:339
msgid "disabled" msgid "disabled"
msgstr "deaktiveret" msgstr "deaktiveret"
#: ../js/ui/status/network.js:494 #: ../js/ui/status/network.js:538
msgid "connecting..." msgid "connecting..."
msgstr "forbinder..." msgstr "forbinder..."
#. 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:541
msgid "authentication required" msgid "authentication required"
msgstr "godkendelse påkrævet" msgstr "godkendelse påkrævet"
#. 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:551
msgid "firmware missing" msgid "firmware missing"
msgstr "firmware mangler" msgstr "firmware mangler"
#. 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:558
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabel er ikke sat i" msgstr "kabel er ikke sat i"
#. 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:563
msgid "unavailable" msgid "unavailable"
msgstr "utilgængelig" msgstr "utilgængelig"
#: ../js/ui/status/network.js:521 #: ../js/ui/status/network.js:565
msgid "connection failed" msgid "connection failed"
msgstr "forbindelse mislykkedes" msgstr "forbindelse mislykkedes"
#. 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:646 ../js/ui/status/network.js:1376
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Forbundet (privat)" msgstr "Forbundet (privat)"
#: ../js/ui/status/network.js:683 #: ../js/ui/status/network.js:731
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Auto ethernet" msgstr "Auto ethernet"
#: ../js/ui/status/network.js:758 #: ../js/ui/status/network.js:799
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Auto bredbånd" msgstr "Auto bredbånd"
#: ../js/ui/status/network.js:761 #: ../js/ui/status/network.js:802
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Auto opringning" msgstr "Auto opringning"
#. 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:926 ../js/ui/status/network.js:1388
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Auto %s" msgstr "Auto %s"
#: ../js/ui/status/network.js:906 #: ../js/ui/status/network.js:928
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Auto bluetooth" msgstr "Auto bluetooth"
#: ../js/ui/status/network.js:1416 #: ../js/ui/status/network.js:1390
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Auto trådløs" msgstr "Auto trådløs"
#: ../js/ui/status/network.js:1474 #: ../js/ui/status/network.js:1459
msgid "More..." msgid "More..."
msgstr "Mere..." msgstr "Mere..."
#: ../js/ui/status/network.js:1497 #: ../js/ui/status/network.js:1482
msgid "Enable networking" msgid "Enable networking"
msgstr "Aktivér netværk" msgstr "Aktivér netværk"
#: ../js/ui/status/network.js:1509 #: ../js/ui/status/network.js:1494
msgid "Wired" msgid "Wired"
msgstr "Trådet" msgstr "Trådet"
#: ../js/ui/status/network.js:1520 #: ../js/ui/status/network.js:1505
msgid "Wireless" msgid "Wireless"
msgstr "Trådløs" msgstr "Trådløs"
#: ../js/ui/status/network.js:1530 #: ../js/ui/status/network.js:1515
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobilt bredbånd" msgstr "Mobilt bredbånd"
#: ../js/ui/status/network.js:1540 #: ../js/ui/status/network.js:1525
msgid "VPN Connections" msgid "VPN Connections"
msgstr "VPN-forbindelser" msgstr "VPN-forbindelser"
#: ../js/ui/status/network.js:1549 #: ../js/ui/status/network.js:1537
msgid "Network Settings" msgid "Network Settings"
msgstr "Indstillinger for netværk" msgstr "Indstillinger for netværk"
#: ../js/ui/status/network.js:1844 #: ../js/ui/status/network.js:1831
#, 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 "Du er nu forbundet til den mobile bredbåndsforbindelse \"%s\"" msgstr "Du er nu forbundet til den mobile bredbåndsforbindelse \"%s\""
#: ../js/ui/status/network.js:1848 #: ../js/ui/status/network.js:1835
#, c-format #, c-format
msgid "You're now connected to wireless network '%s'" msgid "You're now connected to wireless network '%s'"
msgstr "Du er nu forbundet til det trådløse netværk \"%s\"" msgstr "Du er nu forbundet til det trådløse netværk \"%s\""
#: ../js/ui/status/network.js:1852 #: ../js/ui/status/network.js:1839
#, c-format #, c-format
msgid "You're now connected to wired network '%s'" msgid "You're now connected to wired network '%s'"
msgstr "Du er nu forbundet til det trådede netværk \"%s\"" msgstr "Du er nu forbundet til det trådede netværk \"%s\""
#: ../js/ui/status/network.js:1856 #: ../js/ui/status/network.js:1843
#, c-format #, c-format
msgid "You're now connected to VPN network '%s'" msgid "You're now connected to VPN network '%s'"
msgstr "Du er nu forbundet til VPN-netværket \"%s\"" msgstr "Du er nu forbundet til VPN-netværket \"%s\""
#: ../js/ui/status/network.js:1861 #: ../js/ui/status/network.js:1848
#, c-format #, c-format
msgid "You're now connected to '%s'" msgid "You're now connected to '%s'"
msgstr "Du er nu forbundet til \"%s\"" msgstr "Du er nu forbundet til \"%s\""
#: ../js/ui/status/network.js:1869 #: ../js/ui/status/network.js:1856
msgid "Connection established" msgid "Connection established"
msgstr "Forbindelse oprettet" msgstr "Forbindelse oprettet"
#: ../js/ui/status/network.js:1991 #: ../js/ui/status/network.js:1982
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Netværk er deaktiveret" msgstr "Netværk er deaktiveret"
#: ../js/ui/status/network.js:2116 #: ../js/ui/status/network.js:2107
msgid "Network Manager" msgid "Network Manager"
msgstr "Netværkshåndtering" msgstr "Netværkshåndtering"
@@ -1093,7 +1093,7 @@ msgstr "%s er optaget."
#. 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:482 #: ../js/ui/telepathyClient.js:488
#, no-c-format #, no-c-format
msgid "Sent at %X on %A" msgid "Sent at %X on %A"
msgstr "Sendt kl. %X i %As" msgstr "Sendt kl. %X i %As"
@@ -1142,11 +1142,11 @@ msgstr[1] "%u inputs"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemlyde" msgstr "Systemlyde"
#: ../src/main.c:446 #: ../src/main.c:445
msgid "Print version" msgid "Print version"
msgstr "Udskriv version" msgstr "Udskriv version"
#: ../src/shell-app.c:454 #: ../src/shell-app.c:464
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Kunne ikke køre \"%s\"" msgstr "Kunne ikke køre \"%s\""
@@ -1215,6 +1215,12 @@ msgstr "Filsystem"
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%1$s: %2$s" msgstr "%1$s: %2$s"
#~ msgid "calendar:week_start:0"
#~ msgstr "calendar:week_start:1"
#~ msgid "calendar:MY"
#~ msgstr "calendar:MY"
#~| msgid "Applications" #~| msgid "Applications"
#~ msgid "No such application" #~ msgid "No such application"
#~ msgstr "Intet sådant program" #~ msgstr "Intet sådant program"

622
po/de.po

File diff suppressed because it is too large Load Diff

1222
po/eo.po

File diff suppressed because it is too large Load Diff

635
po/es.po

File diff suppressed because it is too large Load Diff

853
po/fa.po

File diff suppressed because it is too large Load Diff

349
po/ga.po
View File

@@ -156,31 +156,31 @@ msgstr ""
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "" msgstr ""
#: ../js/misc/util.js:68 #: ../js/misc/util.js:71
msgid "Command not found" msgid "Command not found"
msgstr "Ordú gan aimsiú" msgstr "Ordú gan aimsiú"
#. Replace "Error invoking GLib.shell_parse_argv: " with #. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer #. something nicer
#: ../js/misc/util.js:95 #: ../js/misc/util.js:98
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Níorbh fhéidir ordú a pharsáil:" msgstr "Níorbh fhéidir ordú a pharsáil:"
#: ../js/misc/util.js:103 #: ../js/misc/util.js:106
#, c-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "" msgstr ""
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:258 #: ../js/ui/appDisplay.js:260
msgid "All" msgid "All"
msgstr "Gach Feidhmchlár" msgstr "Gach Feidhmchlár"
#: ../js/ui/appDisplay.js:357 #: ../js/ui/appDisplay.js:359
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "FEIDHMCHLÁIR" msgstr "FEIDHMCHLÁIR"
#: ../js/ui/appDisplay.js:383 #: ../js/ui/appDisplay.js:385
msgid "SETTINGS" msgid "SETTINGS"
msgstr "SOCRUITHE" msgstr "SOCRUITHE"
@@ -196,12 +196,12 @@ msgstr "Bain ó na Ceanáin"
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Cuir Leis na Ceanáin" msgstr "Cuir Leis na Ceanáin"
#: ../js/ui/appFavorites.js:89 #: ../js/ui/appFavorites.js:91
#, c-format #, c-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "Cuireadh %s leis na ceanáin." msgstr "Cuireadh %s leis na ceanáin."
#: ../js/ui/appFavorites.js:120 #: ../js/ui/appFavorites.js:122
#, c-format #, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Baineadh %s ó na ceanáin." msgstr "Baineadh %s ó na ceanáin."
@@ -209,19 +209,19 @@ msgstr "Baineadh %s ó na ceanáin."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: ../js/ui/calendar.js:63 #: ../js/ui/calendar.js:66
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "An Lá ar Fad" msgstr "An Lá ar Fad"
#. Translators: Shown in calendar event list, if 24h format #. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:68 #: ../js/ui/calendar.js:71
msgctxt "event list time" msgctxt "event list time"
msgid "%H:%M" msgid "%H:%M"
msgstr "%H:%M" msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format #. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:75 #: ../js/ui/calendar.js:78
msgctxt "event list time" msgctxt "event list time"
msgid "%l:%M %p" msgid "%l:%M %p"
msgstr "%l:%M %p" msgstr "%l:%M %p"
@@ -231,43 +231,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: ../js/ui/calendar.js:115 #: ../js/ui/calendar.js:118
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "D" msgstr "D"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:117 #: ../js/ui/calendar.js:120
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "L" msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:119 #: ../js/ui/calendar.js:122
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:121 #: ../js/ui/calendar.js:124
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "C" msgstr "C"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:123 #: ../js/ui/calendar.js:126
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "D" msgstr "D"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:125 #: ../js/ui/calendar.js:128
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "A" msgstr "A"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:127 #: ../js/ui/calendar.js:130
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
@@ -278,267 +278,267 @@ msgstr "S"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. #.
#: ../js/ui/calendar.js:140 #: ../js/ui/calendar.js:143
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "Do" msgstr "Do"
#. Translators: Event list abbreviation for Monday #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:142 #: ../js/ui/calendar.js:145
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "L" msgstr "L"
#. Translators: Event list abbreviation for Tuesday #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:144 #: ../js/ui/calendar.js:147
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "M" msgstr "M"
#. Translators: Event list abbreviation for Wednesday #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:146 #: ../js/ui/calendar.js:149
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "C" msgstr "C"
#. Translators: Event list abbreviation for Thursday #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:148 #: ../js/ui/calendar.js:151
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "Dé" msgstr "Dé"
#. Translators: Event list abbreviation for Friday #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:150 #: ../js/ui/calendar.js:153
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "A" msgstr "A"
#. Translators: Event list abbreviation for Saturday #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:152 #: ../js/ui/calendar.js:155
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:701 #: ../js/ui/calendar.js:704
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Faic Sceidealta" msgstr "Faic Sceidealta"
#. 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:717 ../js/ui/telepathyClient.js:491 #: ../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, %d %B" msgstr "%A, %d %B"
#. 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:720 ../js/ui/telepathyClient.js:494 #: ../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, %d %B, %Y" msgstr "%A, %d %B, %Y"
#: ../js/ui/calendar.js:730 #: ../js/ui/calendar.js:733
msgid "Today" msgid "Today"
msgstr "Inniu" msgstr "Inniu"
#: ../js/ui/calendar.js:734 #: ../js/ui/calendar.js:737
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Amárach" msgstr "Amárach"
#: ../js/ui/calendar.js:743 #: ../js/ui/calendar.js:746
msgid "This week" msgid "This week"
msgstr "An seachtain seo" msgstr "An seachtain seo"
#: ../js/ui/calendar.js:751 #: ../js/ui/calendar.js:754
msgid "Next week" msgid "Next week"
msgstr "An seachtain seo chugainn" msgstr "An seachtain seo chugainn"
#: ../js/ui/dash.js:172 ../js/ui/messageTray.js:1034 #: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1037
msgid "Remove" msgid "Remove"
msgstr "Bain" msgstr "Bain"
#: ../js/ui/dateMenu.js:89 #: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Socruithe Dáta agus Ama" msgstr "Socruithe Dáta agus Ama"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Oscail an Féilire" msgstr "Oscail an Féilire"
#. 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:162 #: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R:%S" msgstr "%a %e %b, %R:%S"
#: ../js/ui/dateMenu.js:163 #: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %e %b, %R" msgstr "%a %e %b, %R"
#. 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:167 #: ../js/ui/dateMenu.js:169
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R:%S" msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:168 #: ../js/ui/dateMenu.js:170
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. 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:175 #: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l:%M:%S %p" msgstr "%a %e %b, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:176 #: ../js/ui/dateMenu.js:178
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l:%M %p" msgstr "%a %e %b, %l:%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:180 #: ../js/ui/dateMenu.js:182
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p" msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:183
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l:%M %p" msgstr "%a %l:%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:192 #: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %e %B, %Y" msgstr "%A %e %B, %Y"
#: ../js/ui/docDisplay.js:16 #: ../js/ui/docDisplay.js:19
msgid "RECENT ITEMS" msgid "RECENT ITEMS"
msgstr "MÍREANNA LE DÉANAÍ" msgstr "MÍREANNA LE DÉANAÍ"
#: ../js/ui/endSessionDialog.js:60 #: ../js/ui/endSessionDialog.js:63
#, c-format #, c-format
msgid "Log Out %s" msgid "Log Out %s"
msgstr "Logáil %s Amach" msgstr "Logáil %s Amach"
#: ../js/ui/endSessionDialog.js:61 ../js/ui/endSessionDialog.js:67 #: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out" msgid "Log Out"
msgstr "Logáil Amach" msgstr "Logáil Amach"
#: ../js/ui/endSessionDialog.js:62 #: ../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 "" msgstr ""
"Cliceáil Logáil Amach chun scor de na feidhmchláir seo agus logáil amach as " "Cliceáil Logáil Amach chun scor de na feidhmchláir seo agus logáil amach as "
"an gcóras." "an gcóras."
#: ../js/ui/endSessionDialog.js:63 #: ../js/ui/endSessionDialog.js:66
#, c-format #, c-format
msgid "%s will be logged out automatically in %d seconds." msgid "%s will be logged out automatically in %d seconds."
msgstr "Logálfar %s amach go huathoibríoch i gceann %d soicind." msgstr "Logálfar %s amach go huathoibríoch i gceann %d soicind."
#: ../js/ui/endSessionDialog.js:64 #: ../js/ui/endSessionDialog.js:67
#, c-format #, c-format
msgid "You will be logged out automatically in %d seconds." msgid "You will be logged out automatically in %d seconds."
msgstr "Logálfar thú amach go huathoibríoch i gceann %d soicind." msgstr "Logálfar thú amach go huathoibríoch i gceann %d soicind."
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:68
msgid "Logging out of the system." msgid "Logging out of the system."
msgstr "Á logáil amach as an gcóras." msgstr "Á logáil amach as an gcóras."
#: ../js/ui/endSessionDialog.js:72 ../js/ui/endSessionDialog.js:79 #: ../js/ui/endSessionDialog.js:75 ../js/ui/endSessionDialog.js:82
msgid "Power Off" msgid "Power Off"
msgstr "Múch" msgstr "Múch"
#: ../js/ui/endSessionDialog.js:73 #: ../js/ui/endSessionDialog.js:76
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 ""
"Cliceáil Múch chun scor de na feidhmchláir seo agus an córas a mhúchadh." "Cliceáil Múch chun scor de na feidhmchláir seo agus an córas a mhúchadh."
#: ../js/ui/endSessionDialog.js:74 #: ../js/ui/endSessionDialog.js:77
#, c-format #, c-format
msgid "The system will power off automatically in %d seconds." msgid "The system will power off automatically in %d seconds."
msgstr "Múchfar an córas go huathoibríoch i gceann %d soicind." msgstr "Múchfar an córas go huathoibríoch i gceann %d soicind."
#: ../js/ui/endSessionDialog.js:75 #: ../js/ui/endSessionDialog.js:78
msgid "Powering off the system." msgid "Powering off the system."
msgstr "Córas á mhúchadh." msgstr "Córas á mhúchadh."
#: ../js/ui/endSessionDialog.js:77 ../js/ui/endSessionDialog.js:85 #: ../js/ui/endSessionDialog.js:80 ../js/ui/endSessionDialog.js:88
#: ../js/ui/endSessionDialog.js:90 #: ../js/ui/endSessionDialog.js:93
msgid "Restart" msgid "Restart"
msgstr "Atosaigh" msgstr "Atosaigh"
#: ../js/ui/endSessionDialog.js:86 #: ../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 "" msgstr ""
"Cliceáil Atosaigh chun scor de na feidhmchláir seo agus an córas a atosú." "Cliceáil Atosaigh chun scor de na feidhmchláir seo agus an córas a atosú."
#: ../js/ui/endSessionDialog.js:87 #: ../js/ui/endSessionDialog.js:90
#, c-format #, c-format
msgid "The system will restart automatically in %d seconds." msgid "The system will restart automatically in %d seconds."
msgstr "Atosófar an córas go huathoibríoch i gceann %d soicind." msgstr "Atosófar an córas go huathoibríoch i gceann %d soicind."
#: ../js/ui/endSessionDialog.js:88 #: ../js/ui/endSessionDialog.js:91
msgid "Restarting the system." msgid "Restarting the system."
msgstr "Córas á atosú." msgstr "Córas á atosú."
#: ../js/ui/endSessionDialog.js:410 ../js/ui/polkitAuthenticationAgent.js:170 #: ../js/ui/endSessionDialog.js:413 ../js/ui/polkitAuthenticationAgent.js:172
#: ../js/ui/status/bluetooth.js:488 #: ../js/ui/status/bluetooth.js:466
msgid "Cancel" msgid "Cancel"
msgstr "Cealaigh" msgstr "Cealaigh"
#: ../js/ui/lookingGlass.js:594 #: ../js/ui/lookingGlass.js:588
msgid "No extensions installed" msgid "No extensions installed"
msgstr "" msgstr ""
#: ../js/ui/lookingGlass.js:631 #: ../js/ui/lookingGlass.js:625
msgid "Enabled" msgid "Enabled"
msgstr "Cumasaithe" msgstr "Cumasaithe"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:633 ../src/gvc/gvc-mixer-control.c:1091 #: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1091
msgid "Disabled" msgid "Disabled"
msgstr "Díchumasaithe" msgstr "Díchumasaithe"
#: ../js/ui/lookingGlass.js:635 #: ../js/ui/lookingGlass.js:629
msgid "Error" msgid "Error"
msgstr "Earráid" msgstr "Earráid"
#: ../js/ui/lookingGlass.js:637 #: ../js/ui/lookingGlass.js:631
msgid "Out of date" msgid "Out of date"
msgstr "As dáta" msgstr "As dáta"
#: ../js/ui/lookingGlass.js:662 #: ../js/ui/lookingGlass.js:656
msgid "View Source" msgid "View Source"
msgstr "Féach Foinse" msgstr "Féach Foinse"
#: ../js/ui/lookingGlass.js:668 #: ../js/ui/lookingGlass.js:662
msgid "Web Page" msgid "Web Page"
msgstr "Suíomh Gréasáin" msgstr "Suíomh Gréasáin"
#: ../js/ui/messageTray.js:1027 #: ../js/ui/messageTray.js:1030
msgid "Open" msgid "Open"
msgstr "Oscail" msgstr "Oscail"
#: ../js/ui/messageTray.js:2191 #: ../js/ui/messageTray.js:2194
msgid "System Information" msgid "System Information"
msgstr "Eolas an Chórais" msgstr "Eolas an Chórais"
#: ../js/ui/overview.js:89 #: ../js/ui/overview.js:91
msgid "Undo" msgid "Undo"
msgstr "Cealaigh" msgstr "Cealaigh"
#: ../js/ui/overview.js:184 #: ../js/ui/overview.js:186
msgid "Windows" msgid "Windows"
msgstr "Fuinneoga" msgstr "Fuinneoga"
#: ../js/ui/overview.js:187 #: ../js/ui/overview.js:189
msgid "Applications" msgid "Applications"
msgstr "Feidhmchláir" msgstr "Feidhmchláir"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:203 #: ../js/ui/overview.js:205
msgid "Dash" msgid "Dash"
msgstr "Deais" msgstr "Deais"
@@ -550,40 +550,40 @@ msgstr "Scoir %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:913 #: ../js/ui/panel.js:911
msgid "Activities" msgid "Activities"
msgstr "Gníomhartha" msgstr "Gníomhartha"
#: ../js/ui/panel.js:1015 #: ../js/ui/panel.js:1012
msgid "Top Bar" msgid "Top Bar"
msgstr "" msgstr ""
#: ../js/ui/placeDisplay.js:120 #: ../js/ui/placeDisplay.js:122
#, c-format #, c-format
msgid "Failed to unmount '%s'" msgid "Failed to unmount '%s'"
msgstr "" msgstr ""
#: ../js/ui/placeDisplay.js:123 #: ../js/ui/placeDisplay.js:125
msgid "Retry" msgid "Retry"
msgstr "" msgstr ""
#: ../js/ui/placeDisplay.js:163 #: ../js/ui/placeDisplay.js:165
msgid "Connect to..." msgid "Connect to..."
msgstr "Ceangail le..." msgstr "Ceangail le..."
#: ../js/ui/placeDisplay.js:375 #: ../js/ui/placeDisplay.js:380
msgid "PLACES & DEVICES" msgid "PLACES & DEVICES"
msgstr "ÁITEANNA & GLÉASANNA" msgstr "ÁITEANNA & GLÉASANNA"
#: ../js/ui/polkitAuthenticationAgent.js:72 #: ../js/ui/polkitAuthenticationAgent.js:74
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Fíordheimhniú de Dhíth" msgstr "Fíordheimhniú de Dhíth"
#: ../js/ui/polkitAuthenticationAgent.js:106 #: ../js/ui/polkitAuthenticationAgent.js:108
msgid "Administrator" msgid "Administrator"
msgstr "Riarthóir" msgstr "Riarthóir"
#: ../js/ui/polkitAuthenticationAgent.js:174 #: ../js/ui/polkitAuthenticationAgent.js:176
msgid "Authenticate" msgid "Authenticate"
msgstr "Fíordheimhnigh" msgstr "Fíordheimhnigh"
@@ -591,11 +591,11 @@ msgstr "Fíordheimhnigh"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: ../js/ui/polkitAuthenticationAgent.js:262 #: ../js/ui/polkitAuthenticationAgent.js:264
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Tá brón orm, theip sé sin. Bain triail eile as, le do thoil." msgstr "Tá brón orm, theip sé sin. Bain triail eile as, le do thoil."
#: ../js/ui/polkitAuthenticationAgent.js:274 #: ../js/ui/polkitAuthenticationAgent.js:276
msgid "Password:" msgid "Password:"
msgstr "Focal faire:" msgstr "Focal faire:"
@@ -604,11 +604,11 @@ msgstr "Focal faire:"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:676 #: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:203 #: ../js/ui/runDialog.js:205
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Iontráil ordú, le do thoil:" msgstr "Iontráil ordú, le do thoil:"
@@ -620,44 +620,44 @@ msgstr "Á chuardach..."
msgid "No matching results." msgid "No matching results."
msgstr "Gan torthaí comhoiriúnaigh." msgstr "Gan torthaí comhoiriúnaigh."
#: ../js/ui/statusMenu.js:159 ../js/ui/statusMenu.js:161 #: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:163
#: ../js/ui/statusMenu.js:226 #: ../js/ui/statusMenu.js:228
msgid "Power Off..." msgid "Power Off..."
msgstr "Múch..." msgstr "Múch..."
#: ../js/ui/statusMenu.js:161 ../js/ui/statusMenu.js:225 #: ../js/ui/statusMenu.js:163 ../js/ui/statusMenu.js:227
msgid "Suspend" msgid "Suspend"
msgstr "Cuir ar Fionraí" msgstr "Cuir ar Fionraí"
#: ../js/ui/statusMenu.js:182 #: ../js/ui/statusMenu.js:184
msgid "Available" msgid "Available"
msgstr "Ar Fáil" msgstr "Ar Fáil"
#: ../js/ui/statusMenu.js:187 #: ../js/ui/statusMenu.js:189
msgid "Busy" msgid "Busy"
msgstr "Gnóthach" msgstr "Gnóthach"
#: ../js/ui/statusMenu.js:195 #: ../js/ui/statusMenu.js:197
msgid "My Account" msgid "My Account"
msgstr "Mo Chuntas" msgstr "Mo Chuntas"
#: ../js/ui/statusMenu.js:199 #: ../js/ui/statusMenu.js:201
msgid "System Settings" msgid "System Settings"
msgstr "Socruithe an Chórais" msgstr "Socruithe an Chórais"
#: ../js/ui/statusMenu.js:206 #: ../js/ui/statusMenu.js:208
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Cuir Scáileán Faoi Ghlas" msgstr "Cuir Scáileán Faoi Ghlas"
#: ../js/ui/statusMenu.js:211 #: ../js/ui/statusMenu.js:213
msgid "Switch User" msgid "Switch User"
msgstr "Athraigh Úsáideoir" msgstr "Athraigh Úsáideoir"
#: ../js/ui/statusMenu.js:216 #: ../js/ui/statusMenu.js:218
msgid "Log Out..." msgid "Log Out..."
msgstr "Logáil Amach..." msgstr "Logáil Amach..."
#: ../js/ui/status/accessibility.js:59 #: ../js/ui/status/accessibility.js:62
msgid "Zoom" msgid "Zoom"
msgstr "Súmáil" msgstr "Súmáil"
@@ -667,165 +667,165 @@ msgstr "Súmáil"
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA, #. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled'); #. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard); #. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:74 #: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "Foláirimh Amhairc" msgstr "Foláirimh Amhairc"
#: ../js/ui/status/accessibility.js:77 #: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "Eochracha Greamaitheacha" msgstr "Eochracha Greamaitheacha"
#: ../js/ui/status/accessibility.js:80 #: ../js/ui/status/accessibility.js:83
msgid "Slow Keys" msgid "Slow Keys"
msgstr "Eochracha Malla" msgstr "Eochracha Malla"
#: ../js/ui/status/accessibility.js:83 #: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "Eochracha Preabtha" msgstr "Eochracha Preabtha"
#: ../js/ui/status/accessibility.js:86 #: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Eochracha Luiche" msgstr "Eochracha Luiche"
#: ../js/ui/status/accessibility.js:90 #: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings" msgid "Universal Access Settings"
msgstr "Socruithe Rochtana Uilíche" msgstr "Socruithe Rochtana Uilíche"
#: ../js/ui/status/accessibility.js:143 #: ../js/ui/status/accessibility.js:146
msgid "High Contrast" msgid "High Contrast"
msgstr "Ardchodarsnacht" msgstr "Ardchodarsnacht"
#: ../js/ui/status/accessibility.js:180 #: ../js/ui/status/accessibility.js:183
msgid "Large Text" msgid "Large Text"
msgstr "Téacs Mór" msgstr "Téacs Mór"
#: ../js/ui/status/bluetooth.js:39 ../js/ui/status/bluetooth.js:261 #: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:237
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:389 #: ../js/ui/status/bluetooth.js:333 ../js/ui/status/bluetooth.js:367
#: ../js/ui/status/bluetooth.js:429 ../js/ui/status/bluetooth.js:462 #: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:440
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:52 #: ../js/ui/status/bluetooth.js:55
msgid "Visibility" msgid "Visibility"
msgstr "Infheictheacht" msgstr "Infheictheacht"
#: ../js/ui/status/bluetooth.js:66 #: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..." msgid "Send Files to Device..."
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:67 #: ../js/ui/status/bluetooth.js:70
msgid "Set up a New Device..." msgid "Setup a New Device..."
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:92 #: ../js/ui/status/bluetooth.js:95
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Socruithe Bluetooth" msgstr "Socruithe Bluetooth"
#: ../js/ui/status/bluetooth.js:212 #: ../js/ui/status/bluetooth.js:188
msgid "Connection" msgid "Connection"
msgstr "Ceangal" msgstr "Ceangal"
#: ../js/ui/status/bluetooth.js:248 #: ../js/ui/status/bluetooth.js:224
msgid "Send Files..." msgid "Send Files..."
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:253 #: ../js/ui/status/bluetooth.js:229
msgid "Browse Files..." msgid "Browse Files..."
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:262 #: ../js/ui/status/bluetooth.js:238
msgid "Error browsing device" msgid "Error browsing device"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:263 #: ../js/ui/status/bluetooth.js:239
#, 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 "" msgstr ""
#: ../js/ui/status/bluetooth.js:271 #: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings" msgid "Keyboard Settings"
msgstr "Socruithe Méarchláir" msgstr "Socruithe Méarchláir"
#: ../js/ui/status/bluetooth.js:276 #: ../js/ui/status/bluetooth.js:252
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Socruithe Luiche" msgstr "Socruithe Luiche"
#: ../js/ui/status/bluetooth.js:283 ../js/ui/status/volume.js:63 #: ../js/ui/status/bluetooth.js:259 ../js/ui/status/volume.js:66
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Socruithe Fuaime" msgstr "Socruithe Fuaime"
#: ../js/ui/status/bluetooth.js:390 #: ../js/ui/status/bluetooth.js:368
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:396 #: ../js/ui/status/bluetooth.js:374
#, c-format #, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:398 #: ../js/ui/status/bluetooth.js:376
msgid "Always grant access" msgid "Always grant access"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:399 #: ../js/ui/status/bluetooth.js:377
msgid "Grant this time only" msgid "Grant this time only"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:400 #: ../js/ui/status/bluetooth.js:378
msgid "Reject" msgid "Reject"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:430 #: ../js/ui/status/bluetooth.js:408
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/bluetooth.js:470 #: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:437 #: ../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 "" msgstr ""
#: ../js/ui/status/bluetooth.js:439 #: ../js/ui/status/bluetooth.js:417
msgid "Matches" msgid "Matches"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:440 #: ../js/ui/status/bluetooth.js:418
msgid "Does not match" msgid "Does not match"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:463 #: ../js/ui/status/bluetooth.js:441
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:471 #: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "" msgstr ""
#: ../js/ui/status/bluetooth.js:487 #: ../js/ui/status/bluetooth.js:465
msgid "OK" msgid "OK"
msgstr "" msgstr ""
#: ../js/ui/status/keyboard.js:70 #: ../js/ui/status/keyboard.js:73
msgid "Show Keyboard Layout..." msgid "Show Keyboard Layout..."
msgstr "" msgstr ""
#: ../js/ui/status/keyboard.js:73 #: ../js/ui/status/keyboard.js:76
msgid "Localization Settings" msgid "Localization Settings"
msgstr "Socruithe Logánaithe" msgstr "Socruithe Logánaithe"
#: ../js/ui/status/network.js:123 #: ../js/ui/status/network.js:109 ../js/ui/status/network.js:1501
msgid "<unknown>" msgid "<unknown>"
msgstr "<anaithnid>" msgstr "<anaithnid>"
#. 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:340 #: ../js/ui/status/network.js:326
msgid "disabled" msgid "disabled"
msgstr "díchumasaithe" msgstr "díchumasaithe"
@@ -966,13 +966,13 @@ msgstr "Tá líonrú díchumasaithe"
msgid "Network Manager" msgid "Network Manager"
msgstr "Bainisteoir Líonra" msgstr "Bainisteoir Líonra"
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:85
msgid "Power Settings" msgid "Power Settings"
msgstr "Socruithe Cumhachta" msgstr "Socruithe Cumhachta"
#. 0 is reported when UPower does not have enough data #. 0 is reported when UPower does not have enough data
#. to estimate battery life #. to estimate battery life
#: ../js/ui/status/power.js:108 #: ../js/ui/status/power.js:111
msgid "Estimating..." msgid "Estimating..."
msgstr "Á mheasúnú..." msgstr "Á mheasúnú..."
@@ -987,12 +987,12 @@ msgstr[3] "%d n-uaire fágtha"
msgstr[4] "%d uair fágtha" msgstr[4] "%d uair fágtha"
#. 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"
#: ../js/ui/status/power.js:118 #: ../js/ui/status/power.js:121
#, c-format #, c-format
msgid "%d %s %d %s remaining" msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s fágtha" msgstr "%d %s %d %s fágtha"
#: ../js/ui/status/power.js:120 #: ../js/ui/status/power.js:123
msgid "hour" msgid "hour"
msgid_plural "hours" msgid_plural "hours"
msgstr[0] "uair" msgstr[0] "uair"
@@ -1020,78 +1020,78 @@ msgstr[2] "%d nóiméad fágtha"
msgstr[3] "%d nóiméad fágtha" msgstr[3] "%d nóiméad fágtha"
msgstr[4] "%d nóiméad fágtha" msgstr[4] "%d nóiméad fágtha"
#: ../js/ui/status/power.js:225 #: ../js/ui/status/power.js:228
msgid "AC adapter" msgid "AC adapter"
msgstr "Cuibheoir SA" msgstr "Cuibheoir SA"
#: ../js/ui/status/power.js:227 #: ../js/ui/status/power.js:230
msgid "Laptop battery" msgid "Laptop battery"
msgstr "Cadhnra ríomhaire glúine" msgstr "Cadhnra ríomhaire glúine"
#: ../js/ui/status/power.js:229 #: ../js/ui/status/power.js:232
msgid "UPS" msgid "UPS"
msgstr "UPS" msgstr "UPS"
#: ../js/ui/status/power.js:231 #: ../js/ui/status/power.js:234
msgid "Monitor" msgid "Monitor"
msgstr "Scáileán" msgstr "Scáileán"
#: ../js/ui/status/power.js:233 #: ../js/ui/status/power.js:236
msgid "Mouse" msgid "Mouse"
msgstr "Luch" msgstr "Luch"
#: ../js/ui/status/power.js:235 #: ../js/ui/status/power.js:238
msgid "Keyboard" msgid "Keyboard"
msgstr "Méarchlár" msgstr "Méarchlár"
#: ../js/ui/status/power.js:237 #: ../js/ui/status/power.js:240
msgid "PDA" msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:239 #: ../js/ui/status/power.js:242
msgid "Cell phone" msgid "Cell phone"
msgstr "Fón póca" msgstr "Fón póca"
#: ../js/ui/status/power.js:241 #: ../js/ui/status/power.js:244
msgid "Media player" msgid "Media player"
msgstr "Seinnteoir meán" msgstr "Seinnteoir meán"
#: ../js/ui/status/power.js:243 #: ../js/ui/status/power.js:246
msgid "Tablet" msgid "Tablet"
msgstr "Táibléad" msgstr "Táibléad"
#: ../js/ui/status/power.js:245 #: ../js/ui/status/power.js:248
msgid "Computer" msgid "Computer"
msgstr "Ríomhaire" msgstr "Ríomhaire"
#: ../js/ui/status/power.js:247 ../src/shell-app-system.c:1088 #: ../js/ui/status/power.js:250 ../src/shell-app-system.c:1088
msgid "Unknown" msgid "Unknown"
msgstr "Anaithnid" msgstr "Anaithnid"
#: ../js/ui/status/volume.js:42 #: ../js/ui/status/volume.js:45
msgid "Volume" msgid "Volume"
msgstr "Airde" msgstr "Airde"
#: ../js/ui/status/volume.js:55 #: ../js/ui/status/volume.js:58
msgid "Microphone" msgid "Microphone"
msgstr "Micreafón" msgstr "Micreafón"
#: ../js/ui/telepathyClient.js:330 #: ../js/ui/telepathyClient.js:335
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "Tá %s ar líne." msgstr "Tá %s ar líne."
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:340
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "Tá %s ar líne." msgstr "Tá %s ar líne."
#: ../js/ui/telepathyClient.js:338 #: ../js/ui/telepathyClient.js:343
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "Tá %s amuigh." msgstr "Tá %s amuigh."
#: ../js/ui/telepathyClient.js:341 #: ../js/ui/telepathyClient.js:346
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "Tá %s gnóthach." msgstr "Tá %s gnóthach."
@@ -1099,36 +1099,29 @@ msgstr "Tá %s gnóthach."
#. 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:483 #: ../js/ui/telepathyClient.js:484
#, no-c-format #, no-c-format
msgid "Sent at %X on %A" msgid "Sent at %X on %A"
msgstr "Seoladh ag %X ar %A" msgstr "Seoladh ag %X ar %A"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/telepathyClient.js:528
#, c-format
msgid "%s is now known as %s"
msgstr ""
#. 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
#. characters. #. characters.
#: ../js/ui/viewSelector.js:120 #: ../js/ui/viewSelector.js:122
msgid "Type to search..." msgid "Type to search..."
msgstr "Cuardaigh..." msgstr "Cuardaigh..."
#: ../js/ui/viewSelector.js:140 ../src/shell-util.c:254 #: ../js/ui/viewSelector.js:142 ../src/shell-util.c:250
msgid "Search" msgid "Search"
msgstr "Cuardaigh" msgstr "Cuardaigh"
#: ../js/ui/windowAttentionHandler.js:40 #: ../js/ui/windowAttentionHandler.js:42
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "" msgstr ""
#: ../js/ui/windowAttentionHandler.js:42 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "" msgstr ""
@@ -1165,7 +1158,7 @@ msgstr ""
msgid "Print version" msgid "Print version"
msgstr "Taispeáin leagan" msgstr "Taispeáin leagan"
#: ../src/shell-app.c:464 #: ../src/shell-app.c:454
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "" msgstr ""
@@ -1182,13 +1175,13 @@ msgstr "Réamhshocrú"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "" msgstr ""
#: ../src/shell-util.c:93 #: ../src/shell-util.c:89
msgid "Home Folder" msgid "Home Folder"
msgstr "Fillteán Baile" msgstr "Fillteán Baile"
#. Translators: this is the same string as the one found in #. Translators: this is the same string as the one found in
#. * nautilus #. * nautilus
#: ../src/shell-util.c:108 #: ../src/shell-util.c:104
msgid "File System" msgid "File System"
msgstr "Córas Comhad" msgstr "Córas Comhad"
@@ -1197,7 +1190,7 @@ msgstr "Córas Comhad"
#. * example, "Trash: some-directory". It means that the #. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash. #. * directory called "some-directory" is in the trash.
#. #.
#: ../src/shell-util.c:304 #: ../src/shell-util.c:300
#, c-format #, c-format
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%1$s: %2$s" msgstr "%1$s: %2$s"

875
po/gl.po

File diff suppressed because it is too large Load Diff

676
po/he.po

File diff suppressed because it is too large Load Diff

457
po/hu.po
View File

@@ -3,20 +3,22 @@
# 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.
# #
# Gabor Kelemen <kelemeng at gnome dot hu>, 2009, 2010, 2011. # Gabor Kelemen <kelemeng at gnome dot hu>, 2009, 2010, 2011.
# Balázs Úr <urbalazs at gmail dot com>, 2013.
msgid "" 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: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"POT-Creation-Date: 2011-04-01 13:34+0200\n" "shell&keywords=I18N+L10N&component=general\n"
"PO-Revision-Date: 2011-04-01 13:36+0200\n" "POT-Creation-Date: 2013-10-07 16:43+0000\n"
"Last-Translator: Gabor Kelemen <kelemeng at gnome dot hu>\n" "PO-Revision-Date: 2013-10-13 13:38+0200\n"
"Last-Translator: Balázs Úr <urbalazs at gmail dot com>\n"
"Language-Team: Hungarian <gnome at fsf dot hu>\n" "Language-Team: Hungarian <gnome at fsf dot hu>\n"
"Language: \n" "Language: \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"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: KBabel 1.11.4\n" "X-Generator: Lokalize 1.2\n"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
@@ -27,6 +29,12 @@ msgid "Window management and application launching"
msgstr "Ablakkezelés és alkalmazásindítás" msgstr "Ablakkezelés és alkalmazásindítás"
#: ../data/org.gnome.shell.gschema.xml.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Fejlesztők és tesztelők számára hasznos belső eszközök engedélyezése az Alt-"
"F2 ablakból"
#: ../data/org.gnome.shell.gschema.xml.in.h:2
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."
@@ -34,21 +42,11 @@ msgstr ""
"Belső hibakereső és megfigyelő eszközök elérésének engedélyezése az Alt-F2 " "Belső hibakereső és megfigyelő eszközök elérésének engedélyezése az Alt-F2 "
"ablak használatával." "ablak használatával."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Fejlesztők és tesztelők számára hasznos belső eszközök engedélyezése az Alt-"
"F2 ablakból"
#: ../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 "Uuids of extensions to disable"
msgstr "A képernyővideó tárolásához használt fájlkiterjesztés" msgstr "Letiltandó kiterjesztések uuid-jei"
#: ../data/org.gnome.shell.gschema.xml.in.h:4 #: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr "A képernyővideók felvételéhez használt képkockasebesség."
#: ../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."
@@ -56,31 +54,87 @@ msgstr ""
"A GNOME Shell kiterjesztések rendelkeznek egy uuid tulajdonsággal; ez a " "A GNOME Shell kiterjesztések rendelkeznek egy uuid tulajdonsággal; ez a "
"kulcs felsorolja a be nem töltendő kiterjesztéseket." "kulcs felsorolja a be nem töltendő kiterjesztéseket."
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Whether to collect stats about applications usage"
msgstr "Statisztikák gyűjtése alkalmazások használatáról"
#: ../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 ""
msgstr "A parancsablak (Alt-F2) előzményei" "The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"A Shell általában figyeli az aktív alkalmazásokat a legtöbbet használtak "
"megjelenítése érdekében (például az indítóikonokban). Noha ezek az adatok "
"titkosak maradnak, magánszférájának védelme érdekében letilthatja ezek "
"gyűjtését. Ne feledje, hogy ez nem fogja a már mentett adatokat törölni."
#: ../data/org.gnome.shell.gschema.xml.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for the looking glass dialog"
msgstr "A távcső ablak előzményei"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "If true, display date in the clock, in addition to time."
msgstr "Az idő mellett a dátum is jelenjen meg."
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "If true, display seconds in time."
msgstr "A másodpercek is jelenjenek meg."
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "If true, display the ISO week date in the calendar."
msgstr "Ha igazra van állítva, a naptárban megjelenik az ISO hétszám."
#: ../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 "A kedvenc alkalmazások asztalifájl-azonosítóinak listája" msgstr "A kedvenc alkalmazások asztalifájl-azonosítóinak listája"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"Az itt felsorolt azonosítóknak megfelelő alkalmazások jelennek meg a "
"kedvencek területen."
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "disabled OpenSearch providers"
msgstr "kikapcsolt OpenSearch szolgáltatók"
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "History for command (Alt-F2) dialog"
msgstr "A parancsablak (Alt-F2) előzményei"
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "History for the looking glass dialog"
msgstr "A távcső ablak előzményei"
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "Show the week date in the calendar"
msgstr "Hetek számának megjelenítése a naptárban"
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "If true, display the ISO week date in the calendar."
msgstr "Ha igazra van állítva, a naptárban megjelenik az ISO hétszám."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show time with seconds"
msgstr "Másodpercek megjelenítése"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "If true, display seconds in time."
msgstr "A másodpercek is jelenjenek meg."
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show date in clock"
msgstr "Dátum megjelenítése az órában"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "If true, display date in the clock, in addition to time."
msgstr "Az idő mellett a dátum is jelenjen meg."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Framerate used for recording screencasts."
msgstr "A képernyővideók felvételéhez használt képkockasebesség."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"A GNOME Shell képernyőfelvevője által felvett eredményül kapott "
"képernyővideó képkockasebessége képkocka/másodpercben."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "A képernyővideó kódolására használt GStreamer adatcsatorna"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@@ -107,27 +161,11 @@ msgstr ""
"VP8 kodek használatával. A %T egy helykitöltő, a rendszeren optimális " "VP8 kodek használatával. A %T egy helykitöltő, a rendszeren optimális "
"szálmennyiség megtippelésére." "szálmennyiség megtippelésére."
#: ../data/org.gnome.shell.gschema.xml.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "Show date in clock" msgid "File extension used for storing the screencast"
msgstr "Dátum megjelenítése az órában" msgstr "A képernyővideó tárolásához használt fájlkiterjesztés"
#: ../data/org.gnome.shell.gschema.xml.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Show the week date in the calendar"
msgstr "Hetek számának megjelenítése a naptárban"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Másodpercek megjelenítése"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"Az itt felsorolt azonosítóknak megfelelő alkalmazások jelennek meg a "
"kedvencek területen."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "" 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 "
@@ -137,107 +175,69 @@ msgstr ""
"névvel, és ezzel a kiterjesztéssel fog rendelkezni. Más tárolóformátumba " "névvel, és ezzel a kiterjesztéssel fog rendelkezni. Más tárolóformátumba "
"való rögzítéskor módosítani kell." "való rögzítéskor módosítani kell."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"A GNOME Shell képernyőfelvevője által felvett eredményül kapott "
"képernyővideó képkockasebessége képkocka/másodpercben."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "A képernyővideó kódolására használt GStreamer adatcsatorna"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"A Shell általában figyeli az aktív alkalmazásokat a legtöbbet használtak "
"megjelenítése érdekében (például az indítóikonokban). Noha ezek az adatok "
"titkosak maradnak, magánszférájának védelme érdekében letilthatja ezek "
"gyűjtését. Ne feledje, hogy ez nem fogja a már mentett adatokat törölni."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Uuids of extensions to disable"
msgstr "Letiltandó kiterjesztések uuid-jei"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "Whether to collect stats about applications usage"
msgstr "Statisztikák gyűjtése alkalmazások használatáról"
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "disabled OpenSearch providers"
msgstr "kikapcsolt OpenSearch szolgáltatók"
#: ../js/misc/util.js:71 #: ../js/misc/util.js:71
msgid "Command not found" msgid "Command not found"
msgstr "A parancs nem található" msgstr "A parancs nem található"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:98 #: ../js/misc/util.js:98
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "A parancs nem dolgozható fel:" msgstr "A parancs nem dolgozható fel:"
#: ../js/misc/util.js:106 #: ../js/misc/util.js:106
#, c-format #, javascript-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "„%s” végrehajtása meghiúsult:" msgstr "„%s” végrehajtása meghiúsult:"
#. 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 "Összes" msgstr "Összes"
#: ../js/ui/appDisplay.js:328 #: ../js/ui/appDisplay.js:359
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "ALKALMAZÁSOK" msgstr "ALKALMAZÁSOK"
#: ../js/ui/appDisplay.js:354 #: ../js/ui/appDisplay.js:385
msgid "SETTINGS" msgid "SETTINGS"
msgstr "BEÁLLÍTÁSOK" msgstr "BEÁLLÍTÁSOK"
#: ../js/ui/appDisplay.js:625 #: ../js/ui/appDisplay.js:656
msgid "New Window" msgid "New Window"
msgstr "Új ablak" msgstr "Új ablak"
#: ../js/ui/appDisplay.js:628 #: ../js/ui/appDisplay.js:659
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Eltávolítás a Kedvencek közül" msgstr "Eltávolítás a Kedvencek közül"
#: ../js/ui/appDisplay.js:629 #: ../js/ui/appDisplay.js:660
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Hozzáadás a Kedvencekhez" msgstr "Hozzáadás a Kedvencekhez"
#: ../js/ui/appFavorites.js:91 #: ../js/ui/appFavorites.js:91
#, c-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s felvéve a Kedvencek közé." msgstr "%s felvéve a Kedvencek közé."
#: ../js/ui/appFavorites.js:122 #: ../js/ui/appFavorites.js:122
#, c-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s eltávolítva a Kedvencek közül" msgstr "%s eltávolítva a Kedvencek közül"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #. */
#: ../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 "Egész nap" msgstr "Egész nap"
#. 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
msgctxt "event list time" msgctxt "event list time"
msgid "%H:%M" msgid "%H:%M"
msgstr "%k.%M" msgstr "%k.%M"
#. Transators: Shown in calendar event list, if 12h format #. Transators: Shown in calendar event list, if 12h format */
#: ../js/ui/calendar.js:78 #: ../js/ui/calendar.js:78
msgctxt "event list time" msgctxt "event list time"
msgid "%l:%M %p" msgid "%l:%M %p"
@@ -247,43 +247,43 @@ msgstr "%p %l.%M"
#. * #. *
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #. */
#: ../js/ui/calendar.js:118 #: ../js/ui/calendar.js:118
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "V" msgstr "V"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:120 #: ../js/ui/calendar.js:120
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "H" msgstr "H"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:122 #: ../js/ui/calendar.js:122
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "K" msgstr "K"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:124 #: ../js/ui/calendar.js:124
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "Sz" msgstr "Sz"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:126 #: ../js/ui/calendar.js:126
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "Cs" msgstr "Cs"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:128 #: ../js/ui/calendar.js:128
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "P" msgstr "P"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:130 #: ../js/ui/calendar.js:130
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
@@ -294,61 +294,69 @@ msgstr "Sz"
#. * NOTE: These list abbreviations are normally not shown together #. * NOTE: These list abbreviations are normally not shown together
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. #. */
#: ../js/ui/calendar.js:143 #: ../js/ui/calendar.js:143
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "V" msgstr "V"
#. Translators: Event list abbreviation for Monday #. Translators: Event list abbreviation for Monday */
#: ../js/ui/calendar.js:145 #: ../js/ui/calendar.js:145
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "H" msgstr "H"
#. Translators: Event list abbreviation for Tuesday #. Translators: Event list abbreviation for Tuesday */
#: ../js/ui/calendar.js:147 #: ../js/ui/calendar.js:147
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "K" msgstr "K"
#. Translators: Event list abbreviation for Wednesday #. Translators: Event list abbreviation for Wednesday */
#: ../js/ui/calendar.js:149 #: ../js/ui/calendar.js:149
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "Sze" msgstr "Sze"
#. Translators: Event list abbreviation for Thursday #. Translators: Event list abbreviation for Thursday */
#: ../js/ui/calendar.js:151 #: ../js/ui/calendar.js:151
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "Cs" msgstr "Cs"
#. Translators: Event list abbreviation for Friday #. Translators: Event list abbreviation for Friday */
#: ../js/ui/calendar.js:153 #: ../js/ui/calendar.js:153
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "P" msgstr "P"
#. Translators: Event list abbreviation for Saturday #. Translators: Event list abbreviation for Saturday */
#: ../js/ui/calendar.js:155 #: ../js/ui/calendar.js:155
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "Szo" msgstr "Szo"
#. Translators: Text to show if there are no events #: ../js/ui/calendar.js:375 ../js/ui/calendar.js:644
msgid "calendar:week_start:0"
msgstr "calendar:week_start:1"
#: ../js/ui/calendar.js:387
msgid "calendar:MY"
msgstr "calendar:YM"
#. 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 "Semmi sincs ütemezve" msgstr "Semmi sincs ütemezve"
#. 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:496
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/telepathyClient.js:493 #: ../js/ui/calendar.js:723 ../js/ui/telepathyClient.js:499
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %Y %B %d" msgstr "%A, %Y %B %d"
@@ -369,7 +377,7 @@ msgstr "Ezen a héten"
msgid "Next week" msgid "Next week"
msgstr "Jövő héten" msgstr "Jövő héten"
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1007 #: ../js/ui/dash.js:174 ../js/ui/messageTray.js:1037
msgid "Remove" msgid "Remove"
msgstr "Eltávolítás" msgstr "Eltávolítás"
@@ -382,7 +390,7 @@ msgid "Open Calendar"
msgstr "Naptár megnyitása" msgstr "Naptár megnyitása"
#. 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
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %k.%M.%S" msgstr "%a %b %e, %k.%M.%S"
@@ -392,7 +400,7 @@ msgid "%a %b %e, %R"
msgstr "%a %b %e, %k.%M" msgstr "%a %b %e, %k.%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
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %k.%M.%S" msgstr "%a %k.%M.%S"
@@ -402,7 +410,7 @@ msgid "%a %R"
msgstr "%a %k.%M" msgstr "%a %k.%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
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %p %l.%M.%S" msgstr "%a %b %e, %p %l.%M.%S"
@@ -412,7 +420,7 @@ msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %p %l.%M" msgstr "%a %b %e, %p %l.%M"
#. 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
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a, %p %l.%M.%S" msgstr "%a, %p %l.%M.%S"
@@ -423,7 +431,7 @@ msgstr "%a, %p %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").
#. #. */
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:194
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%Y. %b %e %A" msgstr "%Y. %b %e %A"
@@ -433,7 +441,7 @@ msgid "RECENT ITEMS"
msgstr "LEGUTÓBBI ELEMEK" msgstr "LEGUTÓBBI ELEMEK"
#: ../js/ui/endSessionDialog.js:63 #: ../js/ui/endSessionDialog.js:63
#, c-format #, javascript-format
msgid "Log Out %s" msgid "Log Out %s"
msgstr "%s kijelentkeztetése" msgstr "%s kijelentkeztetése"
@@ -448,12 +456,12 @@ msgstr ""
"kijelentkezéshez a rendszerből." "kijelentkezéshez a rendszerből."
#: ../js/ui/endSessionDialog.js:66 #: ../js/ui/endSessionDialog.js:66
#, c-format #, javascript-format
msgid "%s will be logged out automatically in %d seconds." msgid "%s will be logged out automatically in %d seconds."
msgstr "%s automatikusan ki fog jelentkezni %d másodperc múlva." msgstr "%s automatikusan ki fog jelentkezni %d másodperc múlva."
#: ../js/ui/endSessionDialog.js:67 #: ../js/ui/endSessionDialog.js:67
#, c-format #, javascript-format
msgid "You will be logged out automatically in %d seconds." msgid "You will be logged out automatically in %d seconds."
msgstr "Automatikusan ki fog jelentkezni %d másodperc múlva." msgstr "Automatikusan ki fog jelentkezni %d másodperc múlva."
@@ -467,10 +475,12 @@ msgstr "Kikapcsolás"
#: ../js/ui/endSessionDialog.js:76 #: ../js/ui/endSessionDialog.js:76
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 "Nyomja meg a Kikapcsolás gombot az alkalmazások bezárásához és a rendszer kikapcsolásához." msgstr ""
"Nyomja meg a Kikapcsolás gombot az alkalmazások bezárásához és a rendszer "
"kikapcsolásához."
#: ../js/ui/endSessionDialog.js:77 #: ../js/ui/endSessionDialog.js:77
#, c-format #, javascript-format
msgid "The system will power off automatically in %d seconds." msgid "The system will power off automatically in %d seconds."
msgstr "A rendszer automatikusan kikapcsol %d másodperc múlva." msgstr "A rendszer automatikusan kikapcsol %d másodperc múlva."
@@ -490,7 +500,7 @@ msgstr ""
"újraindításához." "újraindításához."
#: ../js/ui/endSessionDialog.js:90 #: ../js/ui/endSessionDialog.js:90
#, c-format #, javascript-format
msgid "The system will restart automatically in %d seconds." msgid "The system will restart automatically in %d seconds."
msgstr "A rendszer automatikusan újraindul %d másodperc múlva." msgstr "A rendszer automatikusan újraindul %d másodperc múlva."
@@ -498,7 +508,7 @@ msgstr "A rendszer automatikusan újraindul %d másodperc múlva."
msgid "Restarting the system." msgid "Restarting the system."
msgstr "A rendszer újraindítása." msgstr "A rendszer újraindítása."
#: ../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 "Mégse" msgstr "Mégse"
@@ -533,11 +543,11 @@ msgstr "Forrás megtekintése"
msgid "Web Page" msgid "Web Page"
msgstr "Weblap" msgstr "Weblap"
#: ../js/ui/messageTray.js:1000 #: ../js/ui/messageTray.js:1030
msgid "Open" msgid "Open"
msgstr "Megnyitás" msgstr "Megnyitás"
#: ../js/ui/messageTray.js:2164 #: ../js/ui/messageTray.js:2194
msgid "System Information" msgid "System Information"
msgstr "Rendszerinformációk" msgstr "Rendszerinformációk"
@@ -554,30 +564,27 @@ msgid "Applications"
msgstr "Alkalmazások" msgstr "Alkalmazások"
# FIXME - valami jobbat # FIXME - valami jobbat
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:205 #: ../js/ui/overview.js:205
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#. TODO - _quit() doesn't really work on apps in state STARTING yet #: ../js/ui/panel.js:533
#: ../js/ui/panel.js:524 #, javascript-format
#, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "%s bezárása" msgstr "%s bezárása"
#. 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:902 #: ../js/ui/panel.js:911
msgid "Activities" msgid "Activities"
msgstr "Tevékenységek" msgstr "Tevékenységek"
#: ../js/ui/panel.js:1003 #: ../js/ui/panel.js:1012
msgid "Top Bar" msgid "Top Bar"
msgstr "Felső sáv" msgstr "Felső sáv"
#: ../js/ui/placeDisplay.js:122 #: ../js/ui/placeDisplay.js:122
#, c-format #, javascript-format
msgid "Failed to unmount '%s'" msgid "Failed to unmount '%s'"
msgstr "„%s” leválasztása meghiúsult" msgstr "„%s” leválasztása meghiúsult"
@@ -608,7 +615,7 @@ msgstr "Hitelesítés"
#. Translators: "that didn't work" refers to the fact that the #. Translators: "that didn't work" refers to the fact that the
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance. */
#: ../js/ui/polkitAuthenticationAgent.js:264 #: ../js/ui/polkitAuthenticationAgent.js:264
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "A hitelesítés sikertelen. Próbálja újra." msgstr "A hitelesítés sikertelen. Próbálja újra."
@@ -617,11 +624,6 @@ msgstr "A hitelesítés sikertelen. Próbálja újra."
msgid "Password:" msgid "Password:"
msgstr "Jelszó:" msgstr "Jelszó:"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:679 #: ../js/ui/popupMenu.js:679
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@@ -630,11 +632,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Adjon meg egy parancsot:" msgstr "Adjon meg egy parancsot:"
#: ../js/ui/searchDisplay.js:310 #: ../js/ui/searchDisplay.js:311
msgid "Searching..." msgid "Searching..."
msgstr "Keresés…" msgstr "Keresés…"
#: ../js/ui/searchDisplay.js:324 #: ../js/ui/searchDisplay.js:325
msgid "No matching results." msgid "No matching results."
msgstr "Nincs találat." msgstr "Nincs találat."
@@ -679,12 +681,6 @@ msgstr "Kijelentkezés…"
msgid "Zoom" msgid "Zoom"
msgstr "Nagyítás" msgstr "Nagyítás"
#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#. let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
#. 'screen-keyboard-enabled');
#. this.menu.addMenuItem(screenKeyboard);
#: ../js/ui/status/accessibility.js:77 #: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "Vizuális figyelmeztetések" msgstr "Vizuális figyelmeztetések"
@@ -756,7 +752,7 @@ msgid "Error browsing device"
msgstr "Hiba az eszköz tallózásakor" msgstr "Hiba az eszköz tallózásakor"
#: ../js/ui/status/bluetooth.js:239 #: ../js/ui/status/bluetooth.js:239
#, c-format #, javascript-format
msgid "The requested device cannot be browsed, error is '%s'" msgid "The requested device cannot be browsed, error is '%s'"
msgstr "A kért eszköz nem tallózható. A hiba: „%s”" msgstr "A kért eszköz nem tallózható. A hiba: „%s”"
@@ -773,12 +769,12 @@ msgid "Sound Settings"
msgstr "Hangbeállítások" msgstr "Hangbeállítások"
#: ../js/ui/status/bluetooth.js:368 #: ../js/ui/status/bluetooth.js:368
#, c-format #, javascript-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Felhatalmazási kérés a következőtől: %s" msgstr "Felhatalmazási kérés a következőtől: %s"
#: ../js/ui/status/bluetooth.js:374 #: ../js/ui/status/bluetooth.js:374
#, c-format #, javascript-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "A(z) %s eszköz szeretné használni a(z) „%s” szolgáltatást" msgstr "A(z) %s eszköz szeretné használni a(z) „%s” szolgáltatást"
@@ -795,17 +791,17 @@ msgid "Reject"
msgstr "Visszautasítás" msgstr "Visszautasítás"
#: ../js/ui/status/bluetooth.js:408 #: ../js/ui/status/bluetooth.js:408
#, c-format #, javascript-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Párosítás megerősítése ehhez: %s" msgstr "Párosítás megerősítése ehhez: %s"
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448 #: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format #, javascript-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Az eszköz (%s) párosítást kér a számítógéppel" msgstr "Az eszköz (%s) párosítást kér a számítógéppel"
#: ../js/ui/status/bluetooth.js:415 #: ../js/ui/status/bluetooth.js:415
#, c-format #, javascript-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 "Erősítse meg, hogy a(z) „%s” PIN megegyezik az eszközön lévővel." msgstr "Erősítse meg, hogy a(z) „%s” PIN megegyezik az eszközön lévővel."
@@ -818,7 +814,7 @@ msgid "Does not match"
msgstr "Nem egyezik" msgstr "Nem egyezik"
#: ../js/ui/status/bluetooth.js:441 #: ../js/ui/status/bluetooth.js:441
#, c-format #, javascript-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Párosítási kérés ehhez: %s" msgstr "Párosítási kérés ehhez: %s"
@@ -838,139 +834,139 @@ msgstr "Billentyűzetkiosztás megjelenítése…"
msgid "Localization Settings" msgid "Localization Settings"
msgstr "Lokalizációs beállítások" msgstr "Lokalizációs beállítások"
#: ../js/ui/status/network.js:104 ../js/ui/status/network.js:1454 #: ../js/ui/status/network.js:122 ../js/ui/status/network.js:1428
msgid "<unknown>" msgid "<unknown>"
msgstr "<ismeretlen>" msgstr "<ismeretlen>"
#. 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:339
msgid "disabled" msgid "disabled"
msgstr "tiltva" msgstr "tiltva"
#: ../js/ui/status/network.js:494 #: ../js/ui/status/network.js:538
msgid "connecting..." msgid "connecting..."
msgstr "kapcsolódás…" msgstr "kapcsolódás…"
#. 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:541
msgid "authentication required" msgid "authentication required"
msgstr "hitelesítés szükséges" msgstr "hitelesítés szükséges"
#. 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:551
msgid "firmware missing" msgid "firmware missing"
msgstr "hiányzó firmware" msgstr "hiányzó firmware"
#. 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:558
msgid "cable unplugged" msgid "cable unplugged"
msgstr "vezeték kihúzva" msgstr "vezeték kihúzva"
#. 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:563
msgid "unavailable" msgid "unavailable"
msgstr "nem érhető el" msgstr "nem érhető el"
#: ../js/ui/status/network.js:521 #: ../js/ui/status/network.js:565
msgid "connection failed" msgid "connection failed"
msgstr "a kapcsolódás meghiúsult" msgstr "a kapcsolódás meghiúsult"
#. 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:646 ../js/ui/status/network.js:1376
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Kapcsolódva (privát)" msgstr "Kapcsolódva (privát)"
#: ../js/ui/status/network.js:683 #: ../js/ui/status/network.js:731
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Auto Ethernet" msgstr "Auto Ethernet"
#: ../js/ui/status/network.js:758 #: ../js/ui/status/network.js:799
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Auto széles sáv" msgstr "Auto széles sáv"
#: ../js/ui/status/network.js:761 #: ../js/ui/status/network.js:802
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Auto betárcsázós" msgstr "Auto betárcsázós"
#. 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:926 ../js/ui/status/network.js:1388
#, c-format #, javascript-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Auto %s" msgstr "Auto %s"
#: ../js/ui/status/network.js:906 #: ../js/ui/status/network.js:928
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Auto Bluetooth" msgstr "Auto Bluetooth"
#: ../js/ui/status/network.js:1416 #: ../js/ui/status/network.js:1390
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Auto vezeték nélküli" msgstr "Auto vezeték nélküli"
#: ../js/ui/status/network.js:1474 #: ../js/ui/status/network.js:1459
msgid "More..." msgid "More..."
msgstr "Több…" msgstr "Több…"
#: ../js/ui/status/network.js:1497 #: ../js/ui/status/network.js:1482
msgid "Enable networking" msgid "Enable networking"
msgstr "Hálózat engedélyezése" msgstr "Hálózat engedélyezése"
#: ../js/ui/status/network.js:1509 #: ../js/ui/status/network.js:1494
msgid "Wired" msgid "Wired"
msgstr "Vezetékes" msgstr "Vezetékes"
#: ../js/ui/status/network.js:1520 #: ../js/ui/status/network.js:1505
msgid "Wireless" msgid "Wireless"
msgstr "Vezeték nélküli" msgstr "Vezeték nélküli"
#: ../js/ui/status/network.js:1530 #: ../js/ui/status/network.js:1515
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobil széles sáv" msgstr "Mobil széles sáv"
#: ../js/ui/status/network.js:1540 #: ../js/ui/status/network.js:1525
msgid "VPN Connections" msgid "VPN Connections"
msgstr "VPN kapcsolatok" msgstr "VPN kapcsolatok"
#: ../js/ui/status/network.js:1549 #: ../js/ui/status/network.js:1537
msgid "Network Settings" msgid "Network Settings"
msgstr "Hálózati beállítások" msgstr "Hálózati beállítások"
#: ../js/ui/status/network.js:1844 #: ../js/ui/status/network.js:1831
#, c-format #, javascript-format
msgid "You're now connected to mobile broadband connection '%s'" msgid "You're now connected to mobile broadband connection '%s'"
msgstr "Csatlakozott a(z) „%s” mobil széles sávú kapcsolathoz" msgstr "Csatlakozott a(z) „%s” mobil széles sávú kapcsolathoz"
#: ../js/ui/status/network.js:1848 #: ../js/ui/status/network.js:1835
#, c-format #, javascript-format
msgid "You're now connected to wireless network '%s'" msgid "You're now connected to wireless network '%s'"
msgstr "Csatlakozott a(z) „%s” vezeték nélküli hálózathoz" msgstr "Csatlakozott a(z) „%s” vezeték nélküli hálózathoz"
#: ../js/ui/status/network.js:1852 #: ../js/ui/status/network.js:1839
#, c-format #, javascript-format
msgid "You're now connected to wired network '%s'" msgid "You're now connected to wired network '%s'"
msgstr "Csatlakozott a(z) „%s” vezetékes hálózathoz" msgstr "Csatlakozott a(z) „%s” vezetékes hálózathoz"
#: ../js/ui/status/network.js:1856 #: ../js/ui/status/network.js:1843
#, c-format #, javascript-format
msgid "You're now connected to VPN network '%s'" msgid "You're now connected to VPN network '%s'"
msgstr "Csatlakozott a(z) „%s” VPN hálózathoz" msgstr "Csatlakozott a(z) „%s” VPN hálózathoz"
#: ../js/ui/status/network.js:1861 #: ../js/ui/status/network.js:1848
#, c-format #, javascript-format
msgid "You're now connected to '%s'" msgid "You're now connected to '%s'"
msgstr "Csatlakozott ehhez: „%s”" msgstr "Csatlakozott ehhez: „%s”"
#: ../js/ui/status/network.js:1869 #: ../js/ui/status/network.js:1856
msgid "Connection established" msgid "Connection established"
msgstr "Kapcsolat létrejött" msgstr "Kapcsolat létrejött"
#: ../js/ui/status/network.js:1991 #: ../js/ui/status/network.js:1982
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Hálózat letiltva" msgstr "Hálózat letiltva"
#: ../js/ui/status/network.js:2116 #: ../js/ui/status/network.js:2107
msgid "Network Manager" msgid "Network Manager"
msgstr "Hálózatkezelő" msgstr "Hálózatkezelő"
@@ -978,22 +974,20 @@ msgstr "Hálózatkezelő"
msgid "Power Settings" msgid "Power Settings"
msgstr "Energiabeállítások" msgstr "Energiabeállítások"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:111 #: ../js/ui/status/power.js:111
msgid "Estimating..." msgid "Estimating..."
msgstr "Becslés…" msgstr "Becslés…"
#: ../js/ui/status/power.js:118 #: ../js/ui/status/power.js:118
#, c-format #, javascript-format
msgid "%d hour remaining" msgid "%d hour remaining"
msgid_plural "%d hours remaining" msgid_plural "%d hours remaining"
msgstr[0] "%d óra van hátra" msgstr[0] "%d óra van hátra"
msgstr[1] "%d óra van hátra" msgstr[1] "%d óra van hátra"
#. 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" */
#: ../js/ui/status/power.js:121 #: ../js/ui/status/power.js:121
#, c-format #, javascript-format
msgid "%d %s %d %s remaining" msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s van hátra" msgstr "%d %s %d %s van hátra"
@@ -1010,7 +1004,7 @@ msgstr[0] "perc"
msgstr[1] "perc" msgstr[1] "perc"
#: ../js/ui/status/power.js:126 #: ../js/ui/status/power.js:126
#, c-format #, javascript-format
msgid "%d minute remaining" msgid "%d minute remaining"
msgid_plural "%d minutes remaining" msgid_plural "%d minutes remaining"
msgstr[0] "%d perc van hátra" msgstr[0] "%d perc van hátra"
@@ -1073,37 +1067,36 @@ msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:335
#, c-format #, javascript-format
msgid "%s is online." msgid "%s is online."
msgstr "%s elérhető." msgstr "%s elérhető."
#: ../js/ui/telepathyClient.js:340 #: ../js/ui/telepathyClient.js:340
#, c-format #, javascript-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s kilépett." msgstr "%s kilépett."
#: ../js/ui/telepathyClient.js:343 #: ../js/ui/telepathyClient.js:343
#, c-format #, javascript-format
msgid "%s is away." msgid "%s is away."
msgstr "%s távol van." msgstr "%s távol van."
#: ../js/ui/telepathyClient.js:346 #: ../js/ui/telepathyClient.js:346
#, c-format #, javascript-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s elfoglalt." msgstr "%s elfoglalt."
#. 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:482 #: ../js/ui/telepathyClient.js:488
#, no-c-format
msgid "Sent at %X on %A" msgid "Sent at %X on %A"
msgstr "Elküldve: %A, %X" msgstr "Elküldve: %A, %X"
#. 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
#. characters. #. characters. */
#: ../js/ui/viewSelector.js:122 #: ../js/ui/viewSelector.js:122
msgid "Type to search..." msgid "Type to search..."
msgstr "Gépeljen a kereséshez…" msgstr "Gépeljen a kereséshez…"
@@ -1113,12 +1106,12 @@ msgid "Search"
msgstr "Oldalsáv" msgstr "Oldalsáv"
#: ../js/ui/windowAttentionHandler.js:42 #: ../js/ui/windowAttentionHandler.js:42
#, c-format #, javascript-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "%s indítása befejeződött" msgstr "%s indítása befejeződött"
#: ../js/ui/windowAttentionHandler.js:44 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, javascript-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "„%s” kész" msgstr "„%s” kész"
@@ -1144,11 +1137,11 @@ msgstr[1] "%u bemenet"
msgid "System Sounds" msgid "System Sounds"
msgstr "Rendszerhangok" msgstr "Rendszerhangok"
#: ../src/main.c:446 #: ../src/main.c:445
msgid "Print version" msgid "Print version"
msgstr "Verzió kiírása" msgstr "Verzió kiírása"
#: ../src/shell-app.c:454 #: ../src/shell-app.c:464
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "„%s” indítása meghiúsult" msgstr "„%s” indítása meghiúsult"

619
po/it.po

File diff suppressed because it is too large Load Diff

609
po/lv.po

File diff suppressed because it is too large Load Diff

599
po/nb.po

File diff suppressed because it is too large Load Diff

2032
po/nn.po

File diff suppressed because it is too large Load Diff

2643
po/oc.po Normal file

File diff suppressed because it is too large Load Diff

662
po/pa.po

File diff suppressed because it is too large Load Diff

735
po/ru.po

File diff suppressed because it is too large Load Diff

104
po/sk.po
View File

@@ -8,7 +8,7 @@ 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-" "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-04-26 12:47+0000\n" "POT-Creation-Date: 2011-04-26 21:10+0000\n"
"PO-Revision-Date: 2011-04-27 08:53+0200\n" "PO-Revision-Date: 2011-04-27 08:53+0200\n"
"Last-Translator: Peter Mráz <etkinator@gmail.com>\n" "Last-Translator: Peter Mráz <etkinator@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n" "Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
@@ -60,7 +60,7 @@ msgid "History for command (Alt-F2) dialog"
msgstr "História dialógového okna príkazov (Alt-F2)" msgstr "História dialógového okna príkazov (Alt-F2)"
# neviem ako preložiť looking glass # neviem ako preložiť looking glass
#PŠ: tak si zisti, čo to znamená v prostredí gnome-shell # PŠ: tak si zisti, čo to znamená v prostredí gnome-shell
#: ../data/org.gnome.shell.gschema.xml.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.h:7
#, fuzzy #, fuzzy
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
@@ -102,15 +102,15 @@ msgid ""
"at the optimal thread count on the system." "at the optimal thread count on the system."
msgstr "" msgstr ""
"Nastavuje zreťazenie systému GStreamer určené pre kódované nahrávok. Používa " "Nastavuje zreťazenie systému GStreamer určené pre kódované nahrávok. Používa "
"rovnakú syntax ako gst-launch. Zreťazenie by malo mať ďalej nepripojený cieľ, " "rovnakú syntax ako gst-launch. Zreťazenie by malo mať ďalej nepripojený "
"v ktorom sa video nahráva. Obvykle má nepripojený zdroj; výstup z takého " "cieľ, v ktorom sa video nahráva. Obvykle má nepripojený zdroj; výstup z "
"zdroja sa bude zapisovať do výstupného súboru. Zreťazenie je ale schopné " "takého zdroja sa bude zapisovať do výstupného súboru. Zreťazenie je ale "
"zabezpečiť i vlastný výstup, čo sa dá využiť na odosielanie výstupu na " "schopné zabezpečiť i vlastný výstup, čo sa dá využiť na odosielanie výstupu "
"server icecast cez shout2send a pod. Ak toto nie je nastavené, alebo je to " "na server icecast cez shout2send a pod. Ak toto nie je nastavené, alebo je "
"nastavené na prázdnu hodnotu, použije sa predvolené zreťazenie. Teraz je to " "to nastavené na prázdnu hodnotu, použije sa predvolené zreťazenie. Teraz je "
"„videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux“, čo " "to „videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux“, čo "
"nahráva do WEBM použitím kodeku VP8. %T sa použije ako zástupný symbol odhadu " "nahráva do WEBM použitím kodeku VP8. %T sa použije ako zástupný symbol "
"najvhodnejšieho počtu vlákien v systéme." "odhadu najvhodnejšieho počtu vlákien v systéme."
#: ../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"
@@ -138,8 +138,8 @@ msgid ""
"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 ""
"Súbor pre nahrané záznamy diania na obrazovke bude mať jedinečný názov " "Súbor pre nahrané záznamy diania na obrazovke bude mať jedinečný názov na "
"na základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného " "základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného "
"formátu kontajneru by mala byť zmenená." "formátu kontajneru by mala byť zmenená."
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:19
@@ -578,11 +578,11 @@ msgstr "Ukončiť %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:913 #: ../js/ui/panel.js:911
msgid "Activities" msgid "Activities"
msgstr "Aktivity" msgstr "Aktivity"
#: ../js/ui/panel.js:1015 #: ../js/ui/panel.js:1012
msgid "Top Bar" msgid "Top Bar"
msgstr "Horná lišta" msgstr "Horná lišta"
@@ -854,141 +854,141 @@ msgid "Localization Settings"
msgstr "Miestne nastavenia" msgstr "Miestne nastavenia"
# zariadenie # zariadenie
#: ../js/ui/status/network.js:113 #: ../js/ui/status/network.js:109 ../js/ui/status/network.js:1501
msgid "<unknown>" msgid "<unknown>"
msgstr "<neznáme>" msgstr "<neznáme>"
#. 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:330 #: ../js/ui/status/network.js:326
msgid "disabled" msgid "disabled"
msgstr "zakázané" msgstr "zakázané"
#: ../js/ui/status/network.js:528 #: ../js/ui/status/network.js:524
msgid "connecting..." msgid "connecting..."
msgstr "pripája sa..." msgstr "pripája sa..."
#. 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:531 #: ../js/ui/status/network.js:527
msgid "authentication required" msgid "authentication required"
msgstr "požaduje sa overenie totožnosti" msgstr "požaduje sa overenie totožnosti"
#. 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:541 #: ../js/ui/status/network.js:537
msgid "firmware missing" msgid "firmware missing"
msgstr "chýba firmvér" msgstr "chýba firmvér"
#. 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:548 #: ../js/ui/status/network.js:544
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kábel odpojený" msgstr "kábel odpojený"
#. 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:553 #: ../js/ui/status/network.js:549
msgid "unavailable" msgid "unavailable"
msgstr "nedostupné" msgstr "nedostupné"
#: ../js/ui/status/network.js:555 #: ../js/ui/status/network.js:551
msgid "connection failed" msgid "connection failed"
msgstr "pripojenie zlyhalo" msgstr "pripojenie zlyhalo"
#. 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:635 ../js/ui/status/network.js:1532 #: ../js/ui/status/network.js:631 ../js/ui/status/network.js:1449
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Pripojené (súkromne)" msgstr "Pripojené (súkromne)"
#: ../js/ui/status/network.js:720 #: ../js/ui/status/network.js:716
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "" msgstr ""
#: ../js/ui/status/network.js:795 #: ../js/ui/status/network.js:791
msgid "Auto broadband" msgid "Auto broadband"
msgstr "" msgstr ""
#: ../js/ui/status/network.js:798 #: ../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:944 ../js/ui/status/network.js:1544 #: ../js/ui/status/network.js:940 ../js/ui/status/network.js:1461
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "" msgstr ""
#: ../js/ui/status/network.js:946 #: ../js/ui/status/network.js:942
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "" msgstr ""
#: ../js/ui/status/network.js:1546 #: ../js/ui/status/network.js:1463
msgid "Auto wireless" msgid "Auto wireless"
msgstr "" msgstr ""
#: ../js/ui/status/network.js:1583 #: ../js/ui/status/network.js:1521
msgid "More..." msgid "More..."
msgstr "Viac..." msgstr "Viac..."
#: ../js/ui/status/network.js:1625 #: ../js/ui/status/network.js:1544
msgid "Enable networking" msgid "Enable networking"
msgstr "Povoliť sieť" msgstr "Povoliť sieť"
#: ../js/ui/status/network.js:1637 #: ../js/ui/status/network.js:1556
msgid "Wired" msgid "Wired"
msgstr "Drôtové" msgstr "Drôtové"
#: ../js/ui/status/network.js:1648 #: ../js/ui/status/network.js:1567
msgid "Wireless" msgid "Wireless"
msgstr "Bezdrôtové" msgstr "Bezdrôtové"
# podľa prekladu v module NetworkManager # podľa prekladu v module NetworkManager
#: ../js/ui/status/network.js:1658 #: ../js/ui/status/network.js:1577
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobilné" msgstr "Mobilné"
#: ../js/ui/status/network.js:1668 #: ../js/ui/status/network.js:1587
msgid "VPN Connections" msgid "VPN Connections"
msgstr "VPN pripojenie" msgstr "VPN pripojenie"
#: ../js/ui/status/network.js:1680 #: ../js/ui/status/network.js:1599
msgid "Network Settings" msgid "Network Settings"
msgstr "Nastavenia siete" msgstr "Nastavenia siete"
#: ../js/ui/status/network.js:1974 #: ../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 "Teraz ste pripojený k mobilnej sieti „%s“" msgstr "Teraz ste pripojený k mobilnej sieti „%s“"
#: ../js/ui/status/network.js:1978 #: ../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 "Teraz ste pripojený k bezdrôtovej sieti „%s“" msgstr "Teraz ste pripojený k bezdrôtovej sieti „%s“"
#: ../js/ui/status/network.js:1982 #: ../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 "Teraz ste pripojený k drôtovej sieti „%s“" msgstr "Teraz ste pripojený k drôtovej sieti „%s“"
#: ../js/ui/status/network.js:1986 #: ../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 "Teraz ste pripojený k VPN sieti „%s“" msgstr "Teraz ste pripojený k VPN sieti „%s“"
#: ../js/ui/status/network.js:1991 #: ../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 "Teraz ste pripojený k „%s“" msgstr "Teraz ste pripojený k „%s“"
# PŠ: tu by sa asi zišlo connection preložiť ako spojenie - predsa len to je zaužívané slovné spojenie... alebo established preložiť inakšie # PŠ: tu by sa asi zišlo connection preložiť ako spojenie - predsa len to je zaužívané slovné spojenie... alebo established preložiť inakšie
#: ../js/ui/status/network.js:1999 #: ../js/ui/status/network.js:1918
msgid "Connection established" msgid "Connection established"
msgstr "Pripojenie nadviazané" msgstr "Pripojenie nadviazané"
#: ../js/ui/status/network.js:2125 #: ../js/ui/status/network.js:2044
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Sieť je zakázaná" msgstr "Sieť je zakázaná"
#: ../js/ui/status/network.js:2250 #: ../js/ui/status/network.js:2169
msgid "Network Manager" msgid "Network Manager"
msgstr "Správca siete" msgstr "Správca siete"
@@ -1123,13 +1123,6 @@ msgstr "%s je zaneprázdnený."
msgid "Sent at %X on %A" msgid "Sent at %X on %A"
msgstr "Čas odoslania: %A, %R" msgstr "Čas odoslania: %A, %R"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/telepathyClient.js:529
#, c-format
msgid "%s is now known as %s"
msgstr "%s odteraz vystupuje ako %s"
# nič lepšie ma nenapadlo # nič lepšie ma nenapadlo
#. 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
@@ -1149,7 +1142,7 @@ msgid "%s has finished starting"
msgstr "Spúšťanie %s je dokočené" msgstr "Spúšťanie %s je dokočené"
# ide o zriadenie # ide o zriadenie
#PŠ: a to máš odkiaľ? %s je totiž titulok okna! # PŠ: a to máš odkiaľ? %s je totiž titulok okna!
#: ../js/ui/windowAttentionHandler.js:44 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
@@ -1229,7 +1222,7 @@ msgid "United Kingdom"
msgstr "Veľká Británia" msgstr "Veľká Británia"
# nastavenia # nastavenia
#PŠ: zase nesprávne: ide o APN (Access Point Name, pri GPRS pripojení) - názov, takže mužský rod # PŠ: zase nesprávne: ide o APN (Access Point Name, pri GPRS pripojení) - názov, takže mužský rod
#: ../src/shell-mobile-providers.c:526 #: ../src/shell-mobile-providers.c:526
msgid "Default" msgid "Default"
msgstr "Predvolený" msgstr "Predvolený"
@@ -1259,6 +1252,9 @@ msgstr "Súborový systém"
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%1$s: %2$s" msgstr "%1$s: %2$s"
#~ msgid "%s is now known as %s"
#~ msgstr "%s odteraz vystupuje ako %s"
#~ msgid "No such application" #~ msgid "No such application"
#~ msgstr "Aplikácia neexistuje" #~ msgstr "Aplikácia neexistuje"

Some files were not shown because too many files have changed in this diff Show More