Merge lp:~tkluck/ubuntu/oneiric/gnome-shell/fix-bluetooth-device-switch into lp:ubuntu/oneiric/gnome-shell

Proposed by Timo Kluck
Status: Rejected
Rejected by: Colin Watson
Proposed branch: lp:~tkluck/ubuntu/oneiric/gnome-shell/fix-bluetooth-device-switch
Merge into: lp:ubuntu/oneiric/gnome-shell
Diff against target: 31109 lines (+10705/-4907)
173 files modified
.pc/01_favorite_apps.patch/data/org.gnome.shell.gschema.xml.in (+0/-136)
.pc/03_remove-glx-dependency-on-armel.patch/configure (+11/-11)
.pc/03_remove-glx-dependency-on-armel.patch/configure.ac (+2/-2)
.pc/04_bluetooth-fix-connection-from-gs-menu.patch/js/ui/status/bluetooth.js (+508/-0)
.pc/applied-patches (+1/-1)
NEWS (+66/-0)
configure (+11/-11)
configure.ac (+2/-2)
data/org.gnome.shell.gschema.xml.in (+9/-1)
data/theme/gdm.css (+15/-1)
data/theme/gnome-shell.css (+7/-9)
debian/changelog (+60/-0)
debian/control (+3/-3)
debian/control.in (+3/-3)
debian/gnome-shell.gsettings-override (+3/-0)
debian/patches/01_favorite_apps.patch (+0/-16)
debian/patches/04_bluetooth-fix-connection-from-gs-menu.patch (+31/-0)
debian/patches/series (+1/-1)
js/Makefile.am (+1/-0)
js/Makefile.in (+1/-0)
js/gdm/batch.js (+2/-2)
js/gdm/consoleKit.js (+1/-1)
js/gdm/fingerprint.js (+1/-1)
js/gdm/loginDialog.js (+44/-10)
js/gdm/powerMenu.js (+2/-2)
js/misc/config.js (+4/-3)
js/misc/config.js.in (+2/-1)
js/misc/docInfo.js (+1/-1)
js/misc/fileUtils.js (+2/-0)
js/misc/format.js (+1/-1)
js/misc/gnomeSession.js (+3/-3)
js/misc/history.js (+1/-1)
js/misc/modemManager.js (+1/-1)
js/misc/params.js (+1/-1)
js/misc/screenSaver.js (+1/-1)
js/misc/util.js (+1/-1)
js/perf/core.js (+1/-1)
js/ui/altTab.js (+47/-32)
js/ui/appDisplay.js (+1/-1)
js/ui/appFavorites.js (+1/-1)
js/ui/automountManager.js (+6/-2)
js/ui/autorunManager.js (+2/-2)
js/ui/boxpointer.js (+26/-12)
js/ui/calendar.js (+1/-1)
js/ui/contactDisplay.js (+9/-3)
js/ui/ctrlAltTab.js (+1/-1)
js/ui/dash.js (+64/-48)
js/ui/dateMenu.js (+1/-1)
js/ui/dnd.js (+1/-1)
js/ui/docDisplay.js (+1/-1)
js/ui/endSessionDialog.js (+2/-2)
js/ui/environment.js (+1/-1)
js/ui/extensionSystem.js (+3/-3)
js/ui/iconGrid.js (+1/-1)
js/ui/keyboard.js (+44/-14)
js/ui/layout.js (+24/-8)
js/ui/lightbox.js (+1/-1)
js/ui/link.js (+1/-1)
js/ui/lookingGlass.js (+11/-13)
js/ui/magnifier.js (+1/-1)
js/ui/magnifierDBus.js (+1/-1)
js/ui/main.js (+3/-5)
js/ui/messageTray.js (+5/-3)
js/ui/modalDialog.js (+1/-1)
js/ui/networkAgent.js (+9/-26)
js/ui/notificationDaemon.js (+17/-2)
js/ui/overview.js (+1/-1)
js/ui/panel.js (+1/-1)
js/ui/panelMenu.js (+1/-1)
js/ui/placeDisplay.js (+1/-1)
js/ui/polkitAuthenticationAgent.js (+4/-2)
js/ui/popupMenu.js (+8/-4)
js/ui/runDialog.js (+3/-1)
js/ui/scripting.js (+1/-1)
js/ui/search.js (+1/-1)
js/ui/searchDisplay.js (+1/-1)
js/ui/shellDBus.js (+1/-1)
js/ui/shellEntry.js (+173/-0)
js/ui/shellMountOperation.js (+1/-1)
js/ui/status/accessibility.js (+1/-1)
js/ui/status/bluetooth.js (+3/-2)
js/ui/status/keyboard.js (+1/-1)
js/ui/status/network.js (+1/-1)
js/ui/status/power.js (+5/-5)
js/ui/status/volume.js (+1/-1)
js/ui/statusIconDispatcher.js (+1/-1)
js/ui/telepathyClient.js (+13/-8)
js/ui/tweener.js (+1/-1)
js/ui/userMenu.js (+51/-11)
js/ui/viewSelector.js (+7/-3)
js/ui/windowAttentionHandler.js (+9/-30)
js/ui/windowManager.js (+18/-10)
js/ui/workspace.js (+27/-5)
js/ui/workspaceSwitcherPopup.js (+1/-1)
js/ui/workspaceThumbnail.js (+1/-1)
js/ui/workspacesView.js (+2/-70)
js/ui/xdndHandler.js (+1/-1)
po/LINGUAS (+2/-0)
po/POTFILES.in (+1/-1)
po/ast.po (+1630/-0)
po/bg.po (+97/-88)
po/ca.po (+75/-64)
po/ca@valencia.po (+80/-68)
po/de.po (+158/-131)
po/en_GB.po (+283/-239)
po/eo.po (+115/-105)
po/es.po (+109/-94)
po/fa.po (+174/-174)
po/fr.po (+88/-88)
po/ga.po (+743/-310)
po/gl.po (+157/-133)
po/hu.po (+157/-136)
po/it.po (+94/-84)
po/ja.po (+133/-131)
po/ko.po (+74/-69)
po/ku.po (+1575/-0)
po/lt.po (+222/-184)
po/lv.po (+94/-80)
po/nl.po (+801/-355)
po/pl.po (+143/-131)
po/pt_BR.po (+110/-109)
po/ru.po (+175/-211)
po/sl.po (+78/-68)
po/sr.po (+91/-90)
po/sr@latin.po (+91/-90)
po/sv.po (+81/-74)
po/ta.po (+121/-117)
po/te.po (+73/-108)
po/uk.po (+754/-316)
po/vi.po (+205/-215)
po/zh_CN.po (+102/-100)
src/hotplug-sniffer/hotplug-mimetypes.h (+2/-0)
src/hotplug-sniffer/hotplug-sniffer.c (+1/-0)
src/hotplug-sniffer/shell-mime-sniffer.c (+1/-0)
src/hotplug-sniffer/shell-mime-sniffer.h (+1/-0)
src/shell-a11y.c (+2/-2)
src/shell-a11y.h (+2/-2)
src/shell-app-private.h (+0/-2)
src/shell-app-system.c (+16/-26)
src/shell-app-usage.c (+39/-0)
src/shell-app-usage.h (+4/-0)
src/shell-app.c (+12/-21)
src/shell-contact-system.c (+173/-39)
src/shell-contact-system.h (+3/-0)
src/shell-global.c (+4/-0)
src/shell-mount-operation.c (+1/-0)
src/shell-mount-operation.h (+1/-0)
src/shell-recorder.c (+3/-3)
src/shell-tp-client.c (+2/-0)
src/shell-tp-client.h (+2/-0)
src/shell-util.c (+1/-17)
src/shell-util.h (+0/-2)
src/st/st-entry.c (+79/-3)
src/st/st-texture-cache.c (+13/-5)
src/st/st-theme-node-drawing.c (+8/-18)
tests/interactive/border-radius.js (+1/-1)
tests/interactive/border-width.js (+1/-1)
tests/interactive/borders.js (+1/-1)
tests/interactive/box-layout.js (+1/-1)
tests/interactive/box-shadows.js (+1/-1)
tests/interactive/calendar.js (+1/-1)
tests/interactive/css-fonts.js (+1/-1)
tests/interactive/entry.js (+1/-1)
tests/interactive/icons.js (+1/-1)
tests/interactive/inline-style.js (+1/-1)
tests/interactive/scroll-view-sizing.js (+1/-1)
tests/interactive/scrolling.js (+1/-1)
tests/interactive/table.js (+1/-1)
tests/interactive/transitions.js (+1/-1)
tests/testcommon/ui.js (+1/-1)
tests/unit/format.js (+1/-1)
tests/unit/markup.js (+1/-1)
tests/unit/url.js (+1/-1)
To merge this branch: bzr merge lp:~tkluck/ubuntu/oneiric/gnome-shell/fix-bluetooth-device-switch
Reviewer Review Type Date Requested Status
Jeremy Bícha Needs Fixing
Ubuntu branches Pending
Review via email: mp+89040@code.launchpad.net

Description of the change

This fixes #918208:

"""
The device connection switches in the gnome-shell bluetooth menu can be toggled but don't work: their status is independent from the actual connection status.

This is a known bug with a trivial patch, and it has already been fixed in master:
https://bugzilla.gnome.org/show_bug.cgi?id=662384

It would be nice if the trivial fix could be incorporated into the Ubuntu's 3.2.1 package.
"""

To post a comment you must log in.
Revision history for this message
Jeremy Bícha (jbicha) wrote :

Hi, bugs need to be fixed in the current development release (precise) before being proposed against a stable release. Could you propose a merge with https://code.launchpad.net/~ubuntu-desktop/gnome-shell/ubuntu instead?

review: Needs Fixing
Revision history for this message
Colin Watson (cjwatson) wrote :

Rejected by request of seb128.

Revision history for this message
Sebastien Bacher (seb128) wrote :

Rejecting the merge request since it was adressed to the wrong serie (oneiric rather than oneiric-proposed) and the fix seems to have been uploaded since according to the bug

Unmerged revisions

46. By Timo Kluck

Fix bluetooth device connecting from gnome-shell menu

45. By Evan Broder

No-change rebuild to fix up dependencies (LP: #903382)

44. By Jeremy Bícha

[ Jeremy Bicha ]
* New upstream release (LP: #878672).
  - Restore the IM state on startup - if you were available in when you
    logged out, then you'll be set available again when you log in.
  - Improve searching for contacts in the overview: search more fields,
    show a more meaningful name, require that all search terms match.
  - Improve search for applications in the overview: take frequency into
    account and tweak match algorithm
  - Remove the "Show Password" switch from network password prompts, and
    move the functionality to a right-click menu
  - Add context menus with Cut/Paste options to most entries
  - Display a caps-lock warning in password entries
  - Show the state of installed extensions in Looking Glass
  - Load user extensions after system ones
  - Fix problem with many applications showing extra-large icons in
    notifications
  - Fix a problem where alt-Tab had trouble tracking the current
    application with certain applications such as Emacs.
  - Fix confusion between different users avatar images
  - Remove behavior where you could switch workspaces by bumping
    a dragged window in the overview against a screen edge; it was
    leftover and just confusing.
  - Fix long-standing bug where the Dash in the overview could end up
    mis-sized and run off the screen
  - Fix automatic launching of applications when media is inserted
  - Fix handling of vertically stacked monitors with NVIDIA drivers
  - Translation marking fixes
  - Code cleanups and warning fixes
  - Small memory leak fixes
  - On screen keyboard:
    + Show the keyboard immediately when it's turned enabled
    + Fix problem where keyboard would hide when starting to type
      in the search entry
    + Fix problem with keyboard hiding when selected accented characters
  - Misc bug fixes
* debian/control.in:
  - Bump minimum mutter to 3.2.1
  - Drop dependency against libdconf0 and let dh_installgsettings set
    the right dependencies.
  - Depends on cups-pk-helper instead of recommends to ensure that
    the printer applet works (LP: #877367)
* 01_favorite_apps.patch: dropped, replaced by override file.
* New upstream release.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== removed directory '.pc/01_favorite_apps.patch'
2=== removed directory '.pc/01_favorite_apps.patch/data'
3=== removed file '.pc/01_favorite_apps.patch/data/org.gnome.shell.gschema.xml.in'
4--- .pc/01_favorite_apps.patch/data/org.gnome.shell.gschema.xml.in 2011-09-22 08:50:45 +0000
5+++ .pc/01_favorite_apps.patch/data/org.gnome.shell.gschema.xml.in 1970-01-01 00:00:00 +0000
6@@ -1,136 +0,0 @@
7-<schemalist>
8- <schema id="org.gnome.shell" path="/org/gnome/shell/"
9- gettext-domain="@GETTEXT_PACKAGE@">
10- <key name="development-tools" type="b">
11- <default>true</default>
12- <_summary>
13- Enable internal tools useful for developers and testers from Alt-F2
14- </_summary>
15- <_description>
16- Allows access to internal debugging and monitoring tools
17- using the Alt-F2 dialog.
18- </_description>
19- </key>
20- <key name="enabled-extensions" type="as">
21- <default>[]</default>
22- <_summary>Uuids of extensions to enable</_summary>
23- <_description>
24- GNOME Shell extensions have a uuid property; this key lists extensions
25- which should be loaded. disabled-extensions overrides this setting for
26- extensions that appear in both lists.
27- </_description>
28- </key>
29- <key name="enable-app-monitoring" type="b">
30- <default>true</default>
31- <_summary>Whether to collect stats about applications usage</_summary>
32- <_description>
33- The shell normally monitors active applications in order to present
34- the most used ones (e.g. in launchers). While this data will be
35- kept private, you may want to disable this for privacy reasons.
36- Please note that doing so won't remove already saved data.
37- </_description>
38- </key>
39- <key name="favorite-apps" type="as">
40- <default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
41- <_summary>List of desktop file IDs for favorite applications</_summary>
42- <_description>
43- The applications corresponding to these identifiers
44- will be displayed in the favorites area.
45- </_description>
46- </key>
47- <key name="disabled-open-search-providers" type="as">
48- <default>[]</default>
49- <_summary>disabled OpenSearch providers</_summary>
50- </key>
51- <key name="command-history" type="as">
52- <default>[]</default>
53- <_summary>History for command (Alt-F2) dialog</_summary>
54- </key>
55- <key name="looking-glass-history" type="as">
56- <default>[]</default>
57- <_summary>History for the looking glass dialog</_summary>
58- </key>
59- <child name="clock" schema="org.gnome.shell.clock"/>
60- <child name="calendar" schema="org.gnome.shell.calendar"/>
61- <child name="recorder" schema="org.gnome.shell.recorder"/>
62- <child name="keyboard" schema="org.gnome.shell.keyboard"/>
63- </schema>
64-
65- <schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
66- gettext-domain="@GETTEXT_PACKAGE@">
67- <key name="show-weekdate" type="b">
68- <default>false</default>
69- <_summary>Show the week date in the calendar</_summary>
70- <_description>
71- If true, display the ISO week date in the calendar.
72- </_description>
73- </key>
74- </schema>
75-
76- <schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
77- gettext-domain="@GETTEXT_PACKAGE@">
78- <key name="keyboard-type" type="s">
79- <default>'touch'</default>
80- <_summary>Which keyboard to use</_summary>
81- <_description>
82- The type of keyboard to use.
83- </_description>
84- </key>
85- </schema>
86-
87- <schema id="org.gnome.shell.clock" path="/org/gnome/shell/clock/"
88- gettext-domain="@GETTEXT_PACKAGE@">
89- <key name="show-seconds" type="b">
90- <default>false</default>
91- <_summary>Show time with seconds</_summary>
92- <_description>
93- If true, display seconds in time.
94- </_description>
95- </key>
96- <key name="show-date" type="b">
97- <default>false</default>
98- <_summary>Show date in clock</_summary>
99- <_description>
100- If true, display date in the clock, in addition to time.
101- </_description>
102- </key>
103- </schema>
104-
105- <schema id="org.gnome.shell.recorder" path="/org/gnome/shell/recorder/"
106- gettext-domain="@GETTEXT_PACKAGE@">
107- <key name="framerate" type="i">
108- <default>15</default>
109- <_summary>Framerate used for recording screencasts.</_summary>
110- <_description>
111- The framerate of the resulting screencast recordered
112- by GNOME Shell's screencast recorder in frames-per-second.
113- </_description>
114- </key>
115- <key name="pipeline" type="s">
116- <default>''</default>
117- <_summary>The gstreamer pipeline used to encode the screencast</_summary>
118- <_description>
119- Sets the GStreamer pipeline used to encode recordings.
120- It follows the syntax used for gst-launch. The pipeline should have
121- an unconnected sink pad where the recorded video is recorded. It will
122- normally have a unconnected source pad; output from that pad
123- will be written into the output file. However the pipeline can also
124- take care of its own output - this might be used to send the output
125- to an icecast server via shout2send or similar. When unset or set
126- to an empty value, the default pipeline will be used. This is currently
127- 'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux'
128- and records to WEBM using the VP8 codec. %T is used as a placeholder
129- for a guess at the optimal thread count on the system.
130- </_description>
131- </key>
132- <key name="file-extension" type="s">
133- <default>'webm'</default>
134- <_summary>File extension used for storing the screencast</_summary>
135- <_description>
136- The filename for recorded screencasts will be a unique filename
137- based on the current date, and use this extension. It should be
138- changed when recording to a different container format.
139- </_description>
140- </key>
141- </schema>
142-</schemalist>
143
144=== modified file '.pc/03_remove-glx-dependency-on-armel.patch/configure'
145--- .pc/03_remove-glx-dependency-on-armel.patch/configure 2011-09-28 06:48:58 +0000
146+++ .pc/03_remove-glx-dependency-on-armel.patch/configure 2012-01-18 14:13:28 +0000
147@@ -1,6 +1,6 @@
148 #! /bin/sh
149 # Guess values for system-dependent variables and create Makefiles.
150-# Generated by GNU Autoconf 2.68 for gnome-shell 3.2.0.
151+# Generated by GNU Autoconf 2.68 for gnome-shell 3.2.1.
152 #
153 # Report bugs to <https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell>.
154 #
155@@ -571,8 +571,8 @@
156 # Identity of this package.
157 PACKAGE_NAME='gnome-shell'
158 PACKAGE_TARNAME='gnome-shell'
159-PACKAGE_VERSION='3.2.0'
160-PACKAGE_STRING='gnome-shell 3.2.0'
161+PACKAGE_VERSION='3.2.1'
162+PACKAGE_STRING='gnome-shell 3.2.1'
163 PACKAGE_BUGREPORT='https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell'
164 PACKAGE_URL=''
165
166@@ -1453,7 +1453,7 @@
167 # Omit some internal or obsolete options to make the list less imposing.
168 # This message is too long to be a string in the A/UX 3.1 sh.
169 cat <<_ACEOF
170-\`configure' configures gnome-shell 3.2.0 to adapt to many kinds of systems.
171+\`configure' configures gnome-shell 3.2.1 to adapt to many kinds of systems.
172
173 Usage: $0 [OPTION]... [VAR=VALUE]...
174
175@@ -1523,7 +1523,7 @@
176
177 if test -n "$ac_init_help"; then
178 case $ac_init_help in
179- short | recursive ) echo "Configuration of gnome-shell 3.2.0:";;
180+ short | recursive ) echo "Configuration of gnome-shell 3.2.1:";;
181 esac
182 cat <<\_ACEOF
183
184@@ -1698,7 +1698,7 @@
185 test -n "$ac_init_help" && exit $ac_status
186 if $ac_init_version; then
187 cat <<\_ACEOF
188-gnome-shell configure 3.2.0
189+gnome-shell configure 3.2.1
190 generated by GNU Autoconf 2.68
191
192 Copyright (C) 2010 Free Software Foundation, Inc.
193@@ -2067,7 +2067,7 @@
194 This file contains any messages produced by compilers while
195 running configure, to aid debugging if configure makes a mistake.
196
197-It was created by gnome-shell $as_me 3.2.0, which was
198+It was created by gnome-shell $as_me 3.2.1, which was
199 generated by GNU Autoconf 2.68. Invocation command line was
200
201 $ $0 $@
202@@ -2894,7 +2894,7 @@
203
204 # Define the identity of the package.
205 PACKAGE='gnome-shell'
206- VERSION='3.2.0'
207+ VERSION='3.2.1'
208
209
210 cat >>confdefs.h <<_ACEOF
211@@ -14948,7 +14948,7 @@
212 CLUTTER_MIN_VERSION=1.7.5
213 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
214 GJS_MIN_VERSION=1.29.18
215-MUTTER_MIN_VERSION=3.0.0
216+MUTTER_MIN_VERSION=3.2.1
217 FOLKS_MIN_VERSION=0.5.2
218 GTK_MIN_VERSION=3.0.0
219 GIO_MIN_VERSION=2.29.10
220@@ -17259,7 +17259,7 @@
221 # report actual input values of CONFIG_FILES etc. instead of their
222 # values after options handling.
223 ac_log="
224-This file was extended by gnome-shell $as_me 3.2.0, which was
225+This file was extended by gnome-shell $as_me 3.2.1, which was
226 generated by GNU Autoconf 2.68. Invocation command line was
227
228 CONFIG_FILES = $CONFIG_FILES
229@@ -17325,7 +17325,7 @@
230 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
231 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
232 ac_cs_version="\\
233-gnome-shell config.status 3.2.0
234+gnome-shell config.status 3.2.1
235 configured by $0, generated by GNU Autoconf 2.68,
236 with options \\"\$ac_cs_config\\"
237
238
239=== modified file '.pc/03_remove-glx-dependency-on-armel.patch/configure.ac'
240--- .pc/03_remove-glx-dependency-on-armel.patch/configure.ac 2011-09-28 06:48:58 +0000
241+++ .pc/03_remove-glx-dependency-on-armel.patch/configure.ac 2012-01-18 14:13:28 +0000
242@@ -1,5 +1,5 @@
243 AC_PREREQ(2.63)
244-AC_INIT([gnome-shell],[3.2.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
245+AC_INIT([gnome-shell],[3.2.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
246
247 AC_CONFIG_HEADERS([config.h])
248 AC_CONFIG_SRCDIR([src/shell-global.c])
249@@ -67,7 +67,7 @@
250 CLUTTER_MIN_VERSION=1.7.5
251 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
252 GJS_MIN_VERSION=1.29.18
253-MUTTER_MIN_VERSION=3.0.0
254+MUTTER_MIN_VERSION=3.2.1
255 FOLKS_MIN_VERSION=0.5.2
256 GTK_MIN_VERSION=3.0.0
257 GIO_MIN_VERSION=2.29.10
258
259=== added directory '.pc/04_bluetooth-fix-connection-from-gs-menu.patch'
260=== added file '.pc/04_bluetooth-fix-connection-from-gs-menu.patch/.timestamp'
261=== added directory '.pc/04_bluetooth-fix-connection-from-gs-menu.patch/js'
262=== added directory '.pc/04_bluetooth-fix-connection-from-gs-menu.patch/js/ui'
263=== added directory '.pc/04_bluetooth-fix-connection-from-gs-menu.patch/js/ui/status'
264=== added file '.pc/04_bluetooth-fix-connection-from-gs-menu.patch/js/ui/status/bluetooth.js'
265--- .pc/04_bluetooth-fix-connection-from-gs-menu.patch/js/ui/status/bluetooth.js 1970-01-01 00:00:00 +0000
266+++ .pc/04_bluetooth-fix-connection-from-gs-menu.patch/js/ui/status/bluetooth.js 2012-01-18 14:13:28 +0000
267@@ -0,0 +1,508 @@
268+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
269+
270+const Clutter = imports.gi.Clutter;
271+const Gdk = imports.gi.Gdk;
272+const GLib = imports.gi.GLib;
273+const Gio = imports.gi.Gio;
274+const GnomeBluetoothApplet = imports.gi.GnomeBluetoothApplet;
275+const Gtk = imports.gi.Gtk;
276+const Lang = imports.lang;
277+const Mainloop = imports.mainloop;
278+const St = imports.gi.St;
279+const Shell = imports.gi.Shell;
280+
281+const Main = imports.ui.main;
282+const MessageTray = imports.ui.messageTray;
283+const PanelMenu = imports.ui.panelMenu;
284+const PopupMenu = imports.ui.popupMenu;
285+
286+const ConnectionState = {
287+ DISCONNECTED: 0,
288+ CONNECTED: 1,
289+ DISCONNECTING: 2,
290+ CONNECTING: 3
291+}
292+
293+function Indicator() {
294+ this._init.apply(this, arguments);
295+}
296+
297+Indicator.prototype = {
298+ __proto__: PanelMenu.SystemStatusButton.prototype,
299+
300+ _init: function() {
301+ PanelMenu.SystemStatusButton.prototype._init.call(this, 'bluetooth-disabled', null);
302+
303+ GLib.spawn_command_line_sync ('pkill -f "^bluetooth-applet$"');
304+ this._applet = new GnomeBluetoothApplet.Applet();
305+
306+ this._killswitch = new PopupMenu.PopupSwitchMenuItem(_("Bluetooth"), false);
307+ this._applet.connect('notify::killswitch-state', Lang.bind(this, this._updateKillswitch));
308+ this._killswitch.connect('toggled', Lang.bind(this, function() {
309+ let current_state = this._applet.killswitch_state;
310+ if (current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED &&
311+ current_state != GnomeBluetoothApplet.KillswitchState.NO_ADAPTER) {
312+ this._applet.killswitch_state = this._killswitch.state ?
313+ GnomeBluetoothApplet.KillswitchState.UNBLOCKED:
314+ GnomeBluetoothApplet.KillswitchState.SOFT_BLOCKED;
315+ } else
316+ this._killswitch.setToggleState(false);
317+ }));
318+
319+ this._discoverable = new PopupMenu.PopupSwitchMenuItem(_("Visibility"), this._applet.discoverable);
320+ this._applet.connect('notify::discoverable', Lang.bind(this, function() {
321+ this._discoverable.setToggleState(this._applet.discoverable);
322+ }));
323+ this._discoverable.connect('toggled', Lang.bind(this, function() {
324+ this._applet.discoverable = this._discoverable.state;
325+ }));
326+
327+ this._updateKillswitch();
328+ this.menu.addMenuItem(this._killswitch);
329+ this.menu.addMenuItem(this._discoverable);
330+ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
331+
332+ this._fullMenuItems = [new PopupMenu.PopupSeparatorMenuItem(),
333+ new PopupMenu.PopupMenuItem(_("Send Files to Device...")),
334+ new PopupMenu.PopupMenuItem(_("Set up a New Device...")),
335+ new PopupMenu.PopupSeparatorMenuItem()];
336+ this._hasDevices = false;
337+
338+ this._fullMenuItems[1].connect('activate', function() {
339+ GLib.spawn_command_line_async('bluetooth-sendto');
340+ });
341+ this._fullMenuItems[2].connect('activate', function() {
342+ GLib.spawn_command_line_async('bluetooth-wizard');
343+ });
344+
345+ for (let i = 0; i < this._fullMenuItems.length; i++) {
346+ let item = this._fullMenuItems[i];
347+ this.menu.addMenuItem(item);
348+ }
349+
350+ this._deviceItemPosition = 3;
351+ this._deviceItems = [];
352+ this._applet.connect('devices-changed', Lang.bind(this, this._updateDevices));
353+ this._updateDevices();
354+
355+ this._applet.connect('notify::show-full-menu', Lang.bind(this, this._updateFullMenu));
356+ this._updateFullMenu();
357+
358+ this.menu.addSettingsAction(_("Bluetooth Settings"), 'bluetooth-properties.desktop');
359+
360+ this._applet.connect('pincode-request', Lang.bind(this, this._pinRequest));
361+ this._applet.connect('confirm-request', Lang.bind(this, this._confirmRequest));
362+ this._applet.connect('auth-request', Lang.bind(this, this._authRequest));
363+ this._applet.connect('cancel-request', Lang.bind(this, this._cancelRequest));
364+ },
365+
366+ _updateKillswitch: function() {
367+ let current_state = this._applet.killswitch_state;
368+ let on = current_state == GnomeBluetoothApplet.KillswitchState.UNBLOCKED;
369+ let has_adapter = current_state != GnomeBluetoothApplet.KillswitchState.NO_ADAPTER;
370+ let can_toggle = current_state != GnomeBluetoothApplet.KillswitchState.NO_ADAPTER &&
371+ current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED;
372+
373+ this._killswitch.setToggleState(on);
374+ if (can_toggle)
375+ this._killswitch.setStatus(null);
376+ else
377+ /* TRANSLATORS: this means that bluetooth was disabled by hardware rfkill */
378+ this._killswitch.setStatus(_("hardware disabled"));
379+
380+ if (has_adapter)
381+ this.actor.show();
382+ else
383+ this.actor.hide();
384+
385+ if (on) {
386+ this._discoverable.actor.show();
387+ this.setIcon('bluetooth-active');
388+ } else {
389+ this._discoverable.actor.hide();
390+ this.setIcon('bluetooth-disabled');
391+ }
392+ },
393+
394+ _updateDevices: function() {
395+ let devices = this._applet.get_devices();
396+
397+ let newlist = [ ];
398+ for (let i = 0; i < this._deviceItems.length; i++) {
399+ let item = this._deviceItems[i];
400+ let destroy = true;
401+ for (let j = 0; j < devices.length; j++) {
402+ if (item._device.device_path == devices[j].device_path) {
403+ this._updateDeviceItem(item, devices[j]);
404+ destroy = false;
405+ break;
406+ }
407+ }
408+ if (destroy)
409+ item.destroy();
410+ else
411+ newlist.push(item);
412+ }
413+
414+ this._deviceItems = newlist;
415+ this._hasDevices = newlist.length > 0;
416+ for (let i = 0; i < devices.length; i++) {
417+ let d = devices[i];
418+ if (d._item)
419+ continue;
420+ let item = this._createDeviceItem(d);
421+ if (item) {
422+ this.menu.addMenuItem(item, this._deviceItemPosition + this._deviceItems.length);
423+ this._deviceItems.push(item);
424+ this._hasDevices = true;
425+ }
426+ }
427+ },
428+
429+ _updateDeviceItem: function(item, device) {
430+ if (!device.can_connect && device.capabilities == GnomeBluetoothApplet.Capabilities.NONE) {
431+ item.destroy();
432+ return;
433+ }
434+
435+ let prevDevice = item._device;
436+ let prevCapabilities = prevDevice.capabilities;
437+ let prevCanConnect = prevDevice.can_connect;
438+
439+ // adopt the new device object
440+ item._device = device;
441+ device._item = item;
442+
443+ // update properties
444+ item.label.text = device.alias;
445+
446+ if (prevCapabilities != device.capabilities ||
447+ prevCanConnect != device.can_connect) {
448+ // need to rebuild the submenu
449+ item.menu.removeAll();
450+ this._buildDeviceSubMenu(item, device);
451+ }
452+
453+ // update connected property
454+ if (device.can_connect)
455+ item._connectedMenuitem.setToggleState(device.connected);
456+ },
457+
458+ _createDeviceItem: function(device) {
459+ if (!device.can_connect && device.capabilities == GnomeBluetoothApplet.Capabilities.NONE)
460+ return null;
461+ let item = new PopupMenu.PopupSubMenuMenuItem(device.alias);
462+
463+ // adopt the device object, and add a back link
464+ item._device = device;
465+ device._item = item;
466+
467+ this._buildDeviceSubMenu(item, device);
468+
469+ return item;
470+ },
471+
472+ _buildDeviceSubMenu: function(item, device) {
473+ if (device.can_connect) {
474+ item._connected = device.connected;
475+ item._connectedMenuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
476+ item._connectedMenuitem.connect('toggled', Lang.bind(this, function() {
477+ if (item._connected > ConnectionState.CONNECTED) {
478+ // operation already in progress, revert
479+ // (should not happen anyway)
480+ menuitem.setToggleState(menuitem.state);
481+ }
482+ if (item._connected) {
483+ item._connected = ConnectionState.DISCONNECTING;
484+ menuitem.setStatus(_("disconnecting..."));
485+ this._applet.disconnect_device(item._device.device_path, function(applet, success) {
486+ if (success) { // apply
487+ item._connected = ConnectionState.DISCONNECTED;
488+ menuitem.setToggleState(false);
489+ } else { // revert
490+ item._connected = ConnectionState.CONNECTED;
491+ menuitem.setToggleState(true);
492+ }
493+ menuitem.setStatus(null);
494+ });
495+ } else {
496+ item._connected = ConnectionState.CONNECTING;
497+ menuitem.setStatus(_("connecting..."));
498+ this._applet.connect_device(item._device.device_path, function(applet, success) {
499+ if (success) { // apply
500+ item._connected = ConnectionState.CONNECTED;
501+ menuitem.setToggleState(true);
502+ } else { // revert
503+ item._connected = ConnectionState.DISCONNECTED;
504+ menuitem.setToggleState(false);
505+ }
506+ menuitem.setStatus(null);
507+ });
508+ }
509+ }));
510+
511+ item.menu.addMenuItem(item._connectedMenuitem);
512+ }
513+
514+ if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_PUSH) {
515+ item.menu.addAction(_("Send Files..."), Lang.bind(this, function() {
516+ this._applet.send_to_address(device.bdaddr, device.alias);
517+ }));
518+ }
519+ if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_FILE_TRANSFER) {
520+ item.menu.addAction(_("Browse Files..."), Lang.bind(this, function(event) {
521+ this._applet.browse_address(device.bdaddr, event.get_time(),
522+ Lang.bind(this, function(applet, result) {
523+ try {
524+ applet.browse_address_finish(result);
525+ } catch (e) {
526+ this._ensureSource();
527+ this._source.notify(new MessageTray.Notification(this._source,
528+ _("Bluetooth"),
529+ _("Error browsing device"),
530+ { body: _("The requested device cannot be browsed, error is '%s'").format(e) }));
531+ }
532+ }));
533+ }));
534+ }
535+
536+ switch (device.type) {
537+ case GnomeBluetoothApplet.Type.KEYBOARD:
538+ item.menu.addSettingsAction(_("Keyboard Settings"), 'gnome-keyboard-panel.desktop');
539+ break;
540+ case GnomeBluetoothApplet.Type.MOUSE:
541+ item.menu.addSettingsAction(_("Mouse Settings"), 'gnome-mouse-panel.desktop');
542+ break;
543+ case GnomeBluetoothApplet.Type.HEADSET:
544+ case GnomeBluetoothApplet.Type.HEADPHONES:
545+ case GnomeBluetoothApplet.Type.OTHER_AUDIO:
546+ item.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
547+ break;
548+ default:
549+ break;
550+ }
551+ },
552+
553+ _updateFullMenu: function() {
554+ if (this._applet.show_full_menu) {
555+ this._showAll(this._fullMenuItems);
556+ if (this._hasDevices)
557+ this._showAll(this._deviceItems);
558+ } else {
559+ this._hideAll(this._fullMenuItems);
560+ this._hideAll(this._deviceItems);
561+ }
562+ },
563+
564+ _showAll: function(items) {
565+ for (let i = 0; i < items.length; i++)
566+ items[i].actor.show();
567+ },
568+
569+ _hideAll: function(items) {
570+ for (let i = 0; i < items.length; i++)
571+ items[i].actor.hide();
572+ },
573+
574+ _destroyAll: function(items) {
575+ for (let i = 0; i < items.length; i++)
576+ items[i].destroy();
577+ },
578+
579+ _ensureSource: function() {
580+ if (!this._source) {
581+ this._source = new Source();
582+ Main.messageTray.add(this._source);
583+ }
584+ },
585+
586+ _authRequest: function(applet, device_path, name, long_name, uuid) {
587+ this._ensureSource();
588+ this._source.notify(new AuthNotification(this._source, this._applet, device_path, name, long_name, uuid));
589+ },
590+
591+ _confirmRequest: function(applet, device_path, name, long_name, pin) {
592+ this._ensureSource();
593+ this._source.notify(new ConfirmNotification(this._source, this._applet, device_path, name, long_name, pin));
594+ },
595+
596+ _pinRequest: function(applet, device_path, name, long_name, numeric) {
597+ this._ensureSource();
598+ this._source.notify(new PinNotification(this._source, this._applet, device_path, name, long_name, numeric));
599+ },
600+
601+ _cancelRequest: function() {
602+ this._source.destroy();
603+ }
604+}
605+
606+function Source() {
607+ this._init.apply(this, arguments);
608+}
609+
610+Source.prototype = {
611+ __proto__: MessageTray.Source.prototype,
612+
613+ _init: function() {
614+ MessageTray.Source.prototype._init.call(this, _("Bluetooth"));
615+
616+ this._setSummaryIcon(this.createNotificationIcon());
617+ },
618+
619+ notify: function(notification) {
620+ this._private_destroyId = notification.connect('destroy', Lang.bind(this, function(notification) {
621+ if (this.notification == notification) {
622+ // the destroyed notification is the last for this source
623+ this.notification.disconnect(this._private_destroyId);
624+ this.destroy();
625+ }
626+ }));
627+
628+ MessageTray.Source.prototype.notify.call(this, notification);
629+ },
630+
631+ createNotificationIcon: function() {
632+ return new St.Icon({ icon_name: 'bluetooth-active',
633+ icon_type: St.IconType.SYMBOLIC,
634+ icon_size: this.ICON_SIZE });
635+ }
636+}
637+
638+function AuthNotification() {
639+ this._init.apply(this, arguments);
640+}
641+
642+AuthNotification.prototype = {
643+ __proto__: MessageTray.Notification.prototype,
644+
645+ _init: function(source, applet, device_path, name, long_name, uuid) {
646+ MessageTray.Notification.prototype._init.call(this,
647+ source,
648+ _("Bluetooth"),
649+ _("Authorization request from %s").format(name),
650+ { customContent: true });
651+ this.setResident(true);
652+
653+ this._applet = applet;
654+ this._devicePath = device_path;
655+ this.addBody(_("Device %s wants access to the service '%s'").format(long_name, uuid));
656+
657+ this.addButton('always-grant', _("Always grant access"));
658+ this.addButton('grant', _("Grant this time only"));
659+ this.addButton('reject', _("Reject"));
660+
661+ this.connect('action-invoked', Lang.bind(this, function(self, action) {
662+ switch (action) {
663+ case 'always-grant':
664+ this._applet.agent_reply_auth(this._devicePath, true, true);
665+ break;
666+ case 'grant':
667+ this._applet.agent_reply_auth(this._devicePath, true, false);
668+ break;
669+ case 'reject':
670+ default:
671+ this._applet.agent_reply_auth(this._devicePath, false, false);
672+ }
673+ this.destroy();
674+ }));
675+ }
676+}
677+
678+function ConfirmNotification() {
679+ this._init.apply(this, arguments);
680+}
681+
682+ConfirmNotification.prototype = {
683+ __proto__: MessageTray.Notification.prototype,
684+
685+ _init: function(source, applet, device_path, name, long_name, pin) {
686+ MessageTray.Notification.prototype._init.call(this,
687+ source,
688+ _("Bluetooth"),
689+ _("Pairing confirmation for %s").format(name),
690+ { customContent: true });
691+ this.setResident(true);
692+
693+ this._applet = applet;
694+ this._devicePath = device_path;
695+ this.addBody(_("Device %s wants to pair with this computer").format(long_name));
696+ this.addBody(_("Please confirm whether the PIN '%s' matches the one on the device.").format(pin));
697+
698+ this.addButton('matches', _("Matches"));
699+ this.addButton('does-not-match', _("Does not match"));
700+
701+ this.connect('action-invoked', Lang.bind(this, function(self, action) {
702+ if (action == 'matches')
703+ this._applet.agent_reply_confirm(this._devicePath, true);
704+ else
705+ this._applet.agent_reply_confirm(this._devicePath, false);
706+ this.destroy();
707+ }));
708+ }
709+}
710+
711+function PinNotification() {
712+ this._init.apply(this, arguments);
713+}
714+
715+PinNotification.prototype = {
716+ __proto__: MessageTray.Notification.prototype,
717+
718+ _init: function(source, applet, device_path, name, long_name, numeric) {
719+ MessageTray.Notification.prototype._init.call(this,
720+ source,
721+ _("Bluetooth"),
722+ _("Pairing request for %s").format(name),
723+ { customContent: true });
724+ this.setResident(true);
725+
726+ this._applet = applet;
727+ this._devicePath = device_path;
728+ this._numeric = numeric;
729+ this.addBody(_("Device %s wants to pair with this computer").format(long_name));
730+ this.addBody(_("Please enter the PIN mentioned on the device."));
731+
732+ this._entry = new St.Entry();
733+ this._entry.connect('key-release-event', Lang.bind(this, function(entry, event) {
734+ let key = event.get_key_symbol();
735+ if (key == Clutter.KEY_Return) {
736+ this.emit('action-invoked', 'ok');
737+ return true;
738+ } else if (key == Clutter.KEY_Escape) {
739+ this.emit('action-invoked', 'cancel');
740+ return true;
741+ }
742+ return false;
743+ }));
744+ this.addActor(this._entry);
745+
746+ this.addButton('ok', _("OK"));
747+ this.addButton('cancel', _("Cancel"));
748+
749+ this.connect('action-invoked', Lang.bind(this, function(self, action) {
750+ if (action == 'ok') {
751+ if (this._numeric) {
752+ let num = parseInt(this._entry.text);
753+ if (isNaN(num)) {
754+ // user reply was empty, or was invalid
755+ // cancel the operation
756+ num = -1;
757+ }
758+ this._applet.agent_reply_passkey(this._devicePath, num);
759+ } else
760+ this._applet.agent_reply_pincode(this._devicePath, this._entry.text);
761+ } else {
762+ if (this._numeric)
763+ this._applet.agent_reply_passkey(this._devicePath, -1);
764+ else
765+ this._applet.agent_reply_pincode(this._devicePath, null);
766+ }
767+ this.destroy();
768+ }));
769+ },
770+
771+ grabFocus: function(lockTray) {
772+ MessageTray.Notification.prototype.grabFocus.call(this, lockTray);
773+ global.stage.set_key_focus(this._entry);
774+ }
775+}
776
777=== modified file '.pc/applied-patches'
778--- .pc/applied-patches 2011-09-22 08:50:45 +0000
779+++ .pc/applied-patches 2012-01-18 14:13:28 +0000
780@@ -1,2 +1,2 @@
781-01_favorite_apps.patch
782 03_remove-glx-dependency-on-armel.patch
783+04_bluetooth-fix-connection-from-gs-menu.patch
784
785=== modified file 'NEWS'
786--- NEWS 2011-09-28 00:41:45 +0000
787+++ NEWS 2012-01-18 14:13:28 +0000
788@@ -1,3 +1,69 @@
789+3.2.1
790+=====
791+* Restore the IM state on startup - if you were available in when you logged
792+ out, then you'll be set available again when you log in.
793+ [Florian; #65902, #661485]
794+* Improve searching for contacts in the overview: search more fields,
795+ show a more meaningful name, require that all search terms match.
796+ [Florian, Matthias; #660580]
797+* Improve search for applications in the overview: take frequency into
798+ account and tweak match algorithm [Florian; #623372]
799+* Remove the "Show Password" switch from network password prompts, and
800+ move the functionality to a right-click menu [Florian; #658948]
801+* Add context menus with Cut/Paste options to most entries [Florian; #659275]
802+* On screen keyboard:
803+ - Show the keyboard immediately when it's turned enabled [Dan; #659743]
804+ - Fix problem where keyboard would hide when starting to type
805+ in the search entry [Nohemi; #661340]
806+ - Fix problem with keyboard hiding when selected accented characters
807+ [Nohemi; 661707]
808+* Login mode:
809+ - Allow hitting Enter to select the first user [Ray; #657996]
810+ - Fix flicker of a fingerprint prompt that could show up [Ray; #660492]
811+ - Fix password bullets vanishing during login [Ray; #657894]
812+ - Misc bug fixes and visual tweaks [Ray; #659763, #660919, #661479]
813+* Display a caps-lock warning in password entries [Florian; #660806]
814+* Show the state of installed extensions in Looking Glass [Jasper; #660494]
815+* Load user extensions after system ones [Jasper; #661815]
816+* Fix problem with many applications showing extra-large icons in
817+ notifications [Marina; #659158]
818+* Fix a problem where alt-Tab had trouble tracking the current
819+ application with certain applications such as Emacs. [Dan; #645026]
820+* Fix confusion between different users avatar images [Florian; #660585]
821+* Remove behavior where you could switch workspaces by bumping
822+ a dragged window in the overview against a screen edge; it was
823+ leftover and just confusing. [Florian; #660838]
824+* Fix long-standing bug where the Dash in the overview could end up mis-sized
825+ and run off the screen [Florian; #649248]
826+* Fix automatic launching of applications when media is inserted
827+ [Cosimo; #660821]
828+* Fix handling of vertically stacked monitors with NVIDIA drivers
829+ [Florian; #661387]
830+* Translation marking fixes [Jasper, Wouter; #660600]
831+* Code cleanups and warning fixes [Adel, Dan, Florian, Jasper;
832+ #659822, #659940, #660122, #660358, #660968, #661231]
833+* Small memory leak fixes [Florian, Jasper; #661231]
834+* Misc bug fixes [Adel, Florian, Jasper; #659274, #659861, #660166, #660310,
835+ #660397, #660608, #660606, #660674, #660774. #660848, #661151, #661617]
836+
837+Contributors:
838+ Wouter Bolsterlee, Cosimo Cecchi, Matthias Clasen, Nohemi Fernandez,
839+ Adel Gadllah, Florian Müllner, Jasper St. Pierre, Ray Strode, Dan Winship,
840+ Marina Zhurakhinskaya
841+
842+Translations:
843+ Tiffany Antopolski [eo], Xandru Armesto [ast], Alexander Shopov,
844+ Ivaylo Valkov [bg], Gil Forcada [ca], Carles Ferrando [ca@valencia],
845+ Mario Blättermann, Paul Seyfert [de], Bruce Cowan [en_GB],
846+ Jorge González, Daniel Mustieles [es], Arash Mousavi [fa], Bruno Brouard [fr],
847+ Seán de Búrca [ga], Fran Diéguez [gl], Gabor Kelemen [hu], Luca Ferretti [it],
848+ Takayuki Kusano [ja], Changwoo Ryu [ko], Erdal Ronahi [ku],
849+ Algimantas Margevičius [lt], Rudolfs Mazurs [lv], Wouter Bolsterlee [nl],
850+ Piotr Drąg [pl], Adorilson Bezerra [pt_BR], Yuri Myasoedov [ru],
851+ Matej Urbančič [sl], Daniel Nylander [sv], Miroslav Nikolić [sr, sr@latin],
852+ Tirumurti Vasudevan [ta], Krishnababu Krothapalli [te], Daniel Korostil [uk],
853+ Nguyễn Thái Ngọc Duy [vi], YunQiang Su [zh_CN]
854+
855 3.2.0
856 =====
857 * Prevent the fallback on-screen keyboard from showing up while
858
859=== modified file 'configure'
860--- configure 2011-09-28 06:48:58 +0000
861+++ configure 2012-01-18 14:13:28 +0000
862@@ -1,6 +1,6 @@
863 #! /bin/sh
864 # Guess values for system-dependent variables and create Makefiles.
865-# Generated by GNU Autoconf 2.68 for gnome-shell 3.2.0.
866+# Generated by GNU Autoconf 2.68 for gnome-shell 3.2.1.
867 #
868 # Report bugs to <https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell>.
869 #
870@@ -571,8 +571,8 @@
871 # Identity of this package.
872 PACKAGE_NAME='gnome-shell'
873 PACKAGE_TARNAME='gnome-shell'
874-PACKAGE_VERSION='3.2.0'
875-PACKAGE_STRING='gnome-shell 3.2.0'
876+PACKAGE_VERSION='3.2.1'
877+PACKAGE_STRING='gnome-shell 3.2.1'
878 PACKAGE_BUGREPORT='https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell'
879 PACKAGE_URL=''
880
881@@ -1453,7 +1453,7 @@
882 # Omit some internal or obsolete options to make the list less imposing.
883 # This message is too long to be a string in the A/UX 3.1 sh.
884 cat <<_ACEOF
885-\`configure' configures gnome-shell 3.2.0 to adapt to many kinds of systems.
886+\`configure' configures gnome-shell 3.2.1 to adapt to many kinds of systems.
887
888 Usage: $0 [OPTION]... [VAR=VALUE]...
889
890@@ -1523,7 +1523,7 @@
891
892 if test -n "$ac_init_help"; then
893 case $ac_init_help in
894- short | recursive ) echo "Configuration of gnome-shell 3.2.0:";;
895+ short | recursive ) echo "Configuration of gnome-shell 3.2.1:";;
896 esac
897 cat <<\_ACEOF
898
899@@ -1698,7 +1698,7 @@
900 test -n "$ac_init_help" && exit $ac_status
901 if $ac_init_version; then
902 cat <<\_ACEOF
903-gnome-shell configure 3.2.0
904+gnome-shell configure 3.2.1
905 generated by GNU Autoconf 2.68
906
907 Copyright (C) 2010 Free Software Foundation, Inc.
908@@ -2067,7 +2067,7 @@
909 This file contains any messages produced by compilers while
910 running configure, to aid debugging if configure makes a mistake.
911
912-It was created by gnome-shell $as_me 3.2.0, which was
913+It was created by gnome-shell $as_me 3.2.1, which was
914 generated by GNU Autoconf 2.68. Invocation command line was
915
916 $ $0 $@
917@@ -2894,7 +2894,7 @@
918
919 # Define the identity of the package.
920 PACKAGE='gnome-shell'
921- VERSION='3.2.0'
922+ VERSION='3.2.1'
923
924
925 cat >>confdefs.h <<_ACEOF
926@@ -14948,7 +14948,7 @@
927 CLUTTER_MIN_VERSION=1.7.5
928 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
929 GJS_MIN_VERSION=1.29.18
930-MUTTER_MIN_VERSION=3.0.0
931+MUTTER_MIN_VERSION=3.2.1
932 FOLKS_MIN_VERSION=0.5.2
933 GTK_MIN_VERSION=3.0.0
934 GIO_MIN_VERSION=2.29.10
935@@ -17250,7 +17250,7 @@
936 # report actual input values of CONFIG_FILES etc. instead of their
937 # values after options handling.
938 ac_log="
939-This file was extended by gnome-shell $as_me 3.2.0, which was
940+This file was extended by gnome-shell $as_me 3.2.1, which was
941 generated by GNU Autoconf 2.68. Invocation command line was
942
943 CONFIG_FILES = $CONFIG_FILES
944@@ -17316,7 +17316,7 @@
945 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
946 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
947 ac_cs_version="\\
948-gnome-shell config.status 3.2.0
949+gnome-shell config.status 3.2.1
950 configured by $0, generated by GNU Autoconf 2.68,
951 with options \\"\$ac_cs_config\\"
952
953
954=== modified file 'configure.ac'
955--- configure.ac 2011-09-28 06:48:58 +0000
956+++ configure.ac 2012-01-18 14:13:28 +0000
957@@ -1,5 +1,5 @@
958 AC_PREREQ(2.63)
959-AC_INIT([gnome-shell],[3.2.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
960+AC_INIT([gnome-shell],[3.2.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
961
962 AC_CONFIG_HEADERS([config.h])
963 AC_CONFIG_SRCDIR([src/shell-global.c])
964@@ -67,7 +67,7 @@
965 CLUTTER_MIN_VERSION=1.7.5
966 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
967 GJS_MIN_VERSION=1.29.18
968-MUTTER_MIN_VERSION=3.0.0
969+MUTTER_MIN_VERSION=3.2.1
970 FOLKS_MIN_VERSION=0.5.2
971 GTK_MIN_VERSION=3.0.0
972 GIO_MIN_VERSION=2.29.10
973
974=== modified file 'data/org.gnome.shell.gschema.xml.in'
975--- data/org.gnome.shell.gschema.xml.in 2011-09-22 08:50:45 +0000
976+++ data/org.gnome.shell.gschema.xml.in 2012-01-18 14:13:28 +0000
977@@ -31,7 +31,7 @@
978 </_description>
979 </key>
980 <key name="favorite-apps" type="as">
981- <default>[ 'firefox.desktop', 'thunderbird.desktop', 'empathy.desktop', 'banshee.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
982+ <default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
983 <_summary>List of desktop file IDs for favorite applications</_summary>
984 <_description>
985 The applications corresponding to these identifiers
986@@ -50,6 +50,14 @@
987 <default>[]</default>
988 <_summary>History for the looking glass dialog</_summary>
989 </key>
990+ <key name="saved-im-presence" type="i">
991+ <default>1</default>
992+ <_summary></_summary>
993+ </key>
994+ <key name="saved-session-presence" type="i">
995+ <default>0</default>
996+ <_summary></_summary>
997+ </key>
998 <child name="clock" schema="org.gnome.shell.clock"/>
999 <child name="calendar" schema="org.gnome.shell.calendar"/>
1000 <child name="recorder" schema="org.gnome.shell.recorder"/>
1001
1002=== modified file 'data/theme/gdm.css'
1003--- data/theme/gdm.css 2011-09-21 16:26:15 +0000
1004+++ data/theme/gdm.css 2012-01-18 14:13:28 +0000
1005@@ -98,8 +98,12 @@
1006 color: #666666;
1007 }
1008
1009+.login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
1010+ color: white;
1011+}
1012+
1013 .login-dialog-prompt-layout {
1014- padding-bottom: 64px;
1015+ padding-bottom: 32px;
1016 }
1017 .login-dialog-prompt-label {
1018 color: white;
1019@@ -117,6 +121,16 @@
1020 width: 15em;
1021 }
1022
1023+.login-dialog-prompt-entry .capslock-warning {
1024+ icon-size: 16px;
1025+ warning-color: #999;
1026+}
1027+
1028+.login-dialog-prompt-entry:insensitive {
1029+ color: rgba(0,0,0,0.7);
1030+ border: 2px solid #565656;
1031+}
1032+
1033 .login-dialog-session-list {
1034 color: #ffffff;
1035 font-size: 10.5pt;
1036
1037=== modified file 'data/theme/gnome-shell.css'
1038--- data/theme/gnome-shell.css 2011-09-21 16:26:15 +0000
1039+++ data/theme/gnome-shell.css 2012-01-18 14:13:28 +0000
1040@@ -907,7 +907,7 @@
1041 font-weight: bold;
1042 }
1043
1044-.lg-extension-actions {
1045+.lg-extension-meta {
1046 spacing: 6px;
1047 }
1048
1049@@ -1907,6 +1907,12 @@
1050 border: 2px solid #3465a4;
1051 }
1052
1053+.polkit-dialog-password-entry .capslock-warning {
1054+ icon-size: 16px;
1055+ warning-color: #999;
1056+ padding: 0 4px;
1057+}
1058+
1059 .polkit-dialog-error-label {
1060 font-size: 10pt;
1061 color: #ffff00;
1062@@ -1925,14 +1931,6 @@
1063 padding-bottom: 8px;
1064 }
1065
1066-.network-dialog-show-password-checkbox {
1067- padding-top: 5px;
1068- padding-bottom: 5px;
1069- font-size: 10pt;
1070- color: white;
1071- spacing: 10px;
1072-}
1073-
1074 .network-dialog-secret-table {
1075 spacing-rows: 15px;
1076 }
1077
1078=== modified file 'debian/changelog'
1079--- debian/changelog 2011-09-28 06:48:58 +0000
1080+++ debian/changelog 2012-01-18 14:13:28 +0000
1081@@ -1,3 +1,63 @@
1082+gnome-shell (3.2.1-0ubuntu1.2~tkluck1) oneiric; urgency=low
1083+
1084+ * Fix bluetooth device connecting from gnome-shell menu
1085+
1086+ -- Timo Kluck <tkluck@infty.nl> Wed, 18 Jan 2012 14:34:22 +0100
1087+
1088+gnome-shell (3.2.1-0ubuntu1.1) oneiric-proposed; urgency=low
1089+
1090+ * No-change rebuild to fix up dependencies (LP: #903382)
1091+
1092+ -- Evan Broder <evan@ebroder.net> Mon, 19 Dec 2011 23:13:06 -0800
1093+
1094+gnome-shell (3.2.1-0ubuntu1) oneiric-proposed; urgency=low
1095+
1096+ [ Jeremy Bicha ]
1097+ * New upstream release (LP: #878672).
1098+ - Restore the IM state on startup - if you were available in when you
1099+ logged out, then you'll be set available again when you log in.
1100+ - Improve searching for contacts in the overview: search more fields,
1101+ show a more meaningful name, require that all search terms match.
1102+ - Improve search for applications in the overview: take frequency into
1103+ account and tweak match algorithm
1104+ - Remove the "Show Password" switch from network password prompts, and
1105+ move the functionality to a right-click menu
1106+ - Add context menus with Cut/Paste options to most entries
1107+ - Display a caps-lock warning in password entries
1108+ - Show the state of installed extensions in Looking Glass
1109+ - Load user extensions after system ones
1110+ - Fix problem with many applications showing extra-large icons in
1111+ notifications
1112+ - Fix a problem where alt-Tab had trouble tracking the current
1113+ application with certain applications such as Emacs.
1114+ - Fix confusion between different users avatar images
1115+ - Remove behavior where you could switch workspaces by bumping
1116+ a dragged window in the overview against a screen edge; it was
1117+ leftover and just confusing.
1118+ - Fix long-standing bug where the Dash in the overview could end up
1119+ mis-sized and run off the screen
1120+ - Fix automatic launching of applications when media is inserted
1121+ - Fix handling of vertically stacked monitors with NVIDIA drivers
1122+ - Translation marking fixes
1123+ - Code cleanups and warning fixes
1124+ - Small memory leak fixes
1125+ - On screen keyboard:
1126+ + Show the keyboard immediately when it's turned enabled
1127+ + Fix problem where keyboard would hide when starting to type
1128+ in the search entry
1129+ + Fix problem with keyboard hiding when selected accented characters
1130+ - Misc bug fixes
1131+ * debian/control.in:
1132+ - Bump minimum mutter to 3.2.1
1133+ - Drop dependency against libdconf0 and let dh_installgsettings set
1134+ the right dependencies.
1135+ - Depends on cups-pk-helper instead of recommends to ensure that
1136+ the printer applet works (LP: #877367)
1137+ * 01_favorite_apps.patch: dropped, replaced by override file.
1138+ * New upstream release.
1139+
1140+ -- Jeremy Bicha <jbicha@ubuntu.com> Mon, 24 Oct 2011 06:43:05 +0200
1141+
1142 gnome-shell (3.2.0-0ubuntu1) oneiric; urgency=low
1143
1144 * New upstream stable release.
1145
1146=== modified file 'debian/control'
1147--- debian/control 2011-09-28 06:48:58 +0000
1148+++ debian/control 2012-01-18 14:13:28 +0000
1149@@ -36,7 +36,7 @@
1150 libgudev-1.0-dev,
1151 libnm-glib-dev (>= 0.8.999),
1152 libstartup-notification0-dev (>= 0.11),
1153- libmutter-dev (>= 3.1.92),
1154+ libmutter-dev (>= 3.2.1),
1155 librsvg2-dev,
1156 libwnck-dev,
1157 libclutter-1.0-dev (>= 1.7.5),
1158@@ -62,7 +62,7 @@
1159 ${shlibs:Depends},
1160 ${misc:Depends},
1161 caribou,
1162- libdconf0 | gsettings-backend,
1163+ cups-pk-helper,
1164 gnome-settings-daemon (>= 2.91.5.1),
1165 gsettings-desktop-schemas (>= 0.1.7),
1166 gnome-icon-theme-symbolic (>= 2.91),
1167@@ -78,7 +78,7 @@
1168 python,
1169 pkg-config,
1170 mesa-utils
1171-Recommends: gnome-control-center, gnome-user-guide, gnome-themes-standard, cups-pk-helper, gnome-session-fallback
1172+Recommends: gnome-control-center, gnome-user-guide, gnome-themes-standard, gnome-session-fallback
1173 Breaks: gnome-control-center (<< 1:3.0)
1174 Description: graphical shell for the GNOME desktop
1175 The GNOME Shell redefines user interactions with the GNOME desktop.
1176
1177=== modified file 'debian/control.in'
1178--- debian/control.in 2011-09-28 06:48:58 +0000
1179+++ debian/control.in 2012-01-18 14:13:28 +0000
1180@@ -31,7 +31,7 @@
1181 libgudev-1.0-dev,
1182 libnm-glib-dev (>= 0.8.999),
1183 libstartup-notification0-dev (>= 0.11),
1184- libmutter-dev (>= 3.1.92),
1185+ libmutter-dev (>= 3.2.1),
1186 librsvg2-dev,
1187 libwnck-dev,
1188 libclutter-1.0-dev (>= 1.7.5),
1189@@ -57,7 +57,7 @@
1190 ${shlibs:Depends},
1191 ${misc:Depends},
1192 caribou,
1193- libdconf0 | gsettings-backend,
1194+ cups-pk-helper,
1195 gnome-settings-daemon (>= 2.91.5.1),
1196 gsettings-desktop-schemas (>= 0.1.7),
1197 gnome-icon-theme-symbolic (>= 2.91),
1198@@ -73,7 +73,7 @@
1199 python,
1200 pkg-config,
1201 mesa-utils
1202-Recommends: gnome-control-center, gnome-user-guide, gnome-themes-standard, cups-pk-helper, gnome-session-fallback
1203+Recommends: gnome-control-center, gnome-user-guide, gnome-themes-standard, gnome-session-fallback
1204 Breaks: gnome-control-center (<< 1:3.0)
1205 Description: graphical shell for the GNOME desktop
1206 The GNOME Shell redefines user interactions with the GNOME desktop.
1207
1208=== added file 'debian/gnome-shell.gsettings-override'
1209--- debian/gnome-shell.gsettings-override 1970-01-01 00:00:00 +0000
1210+++ debian/gnome-shell.gsettings-override 2012-01-18 14:13:28 +0000
1211@@ -0,0 +1,3 @@
1212+[org.gnome.shell]
1213+favorite-apps=[ 'firefox.desktop', 'thunderbird.desktop', 'empathy.desktop', 'banshee.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]
1214+
1215
1216=== removed file 'debian/patches/01_favorite_apps.patch'
1217--- debian/patches/01_favorite_apps.patch 2011-09-22 08:50:45 +0000
1218+++ debian/patches/01_favorite_apps.patch 1970-01-01 00:00:00 +0000
1219@@ -1,16 +0,0 @@
1220-Description: Use Ubuntu defaults (Firefox, Thunderbird, and Banshee)
1221-Forwarded: not-needed
1222-Author: Jeremy Bicha <jbicha@ubuntu.com>
1223-Index: oneiric/data/org.gnome.shell.gschema.xml.in
1224-===================================================================
1225---- oneiric.orig/data/org.gnome.shell.gschema.xml.in 2011-09-20 18:38:13.116385829 -0400
1226-+++ oneiric/data/org.gnome.shell.gschema.xml.in 2011-09-20 18:38:36.746420484 -0400
1227-@@ -31,7 +31,7 @@
1228- </_description>
1229- </key>
1230- <key name="favorite-apps" type="as">
1231-- <default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
1232-+ <default>[ 'firefox.desktop', 'thunderbird.desktop', 'empathy.desktop', 'banshee.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
1233- <_summary>List of desktop file IDs for favorite applications</_summary>
1234- <_description>
1235- The applications corresponding to these identifiers
1236
1237=== added file 'debian/patches/04_bluetooth-fix-connection-from-gs-menu.patch'
1238--- debian/patches/04_bluetooth-fix-connection-from-gs-menu.patch 1970-01-01 00:00:00 +0000
1239+++ debian/patches/04_bluetooth-fix-connection-from-gs-menu.patch 2012-01-18 14:13:28 +0000
1240@@ -0,0 +1,31 @@
1241+From 0ed0dc89b51f8e584dd21c87a7178ba138bed44b Mon Sep 17 00:00:00 2001
1242+From: Alessandro Crismani <alessandro.crismani@gmail.com>
1243+Date: Tue, 13 Dec 2011 10:01:34 +0100
1244+Subject: [PATCH] Bluetooth: fix connecting devices from GS's panel on 3.2.1
1245+
1246+Connecting devices from Gnome Shell's panel on Gnome 3.2.1 fails because
1247+of an undefined variable in
1248+js/ui/status/bluetooth.js:buildDeviceSubMenu. More explicitly, the
1249+menuitem variable is not declared and hence connecting and disconnecting
1250+fails. Fix it to make the bluetooth panel menu item work.
1251+---
1252+ js/ui/status/bluetooth.js | 3 ++-
1253+ 1 files changed, 2 insertions(+), 1 deletions(-)
1254+
1255+diff --git a/js/ui/status/bluetooth.js b/js/ui/status/bluetooth.js
1256+index f2d95f5..3aa7960 100644
1257+--- a/js/ui/status/bluetooth.js
1258++++ b/js/ui/status/bluetooth.js
1259+@@ -205,7 +205,8 @@ Indicator.prototype = {
1260+ _buildDeviceSubMenu: function(item, device) {
1261+ if (device.can_connect) {
1262+ item._connected = device.connected;
1263+- item._connectedMenuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
1264++ let menuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
1265++ item._connectedMenuitem = menuitem;
1266+ item._connectedMenuitem.connect('toggled', Lang.bind(this, function() {
1267+ if (item._connected > ConnectionState.CONNECTED) {
1268+ // operation already in progress, revert
1269+--
1270+1.7.8
1271+
1272
1273=== modified file 'debian/patches/series'
1274--- debian/patches/series 2011-09-22 08:50:45 +0000
1275+++ debian/patches/series 2012-01-18 14:13:28 +0000
1276@@ -1,2 +1,2 @@
1277-01_favorite_apps.patch
1278 03_remove-glx-dependency-on-armel.patch
1279+04_bluetooth-fix-connection-from-gs-menu.patch
1280
1281=== modified file 'js/Makefile.am'
1282--- js/Makefile.am 2011-09-22 08:50:45 +0000
1283+++ js/Makefile.am 2012-01-18 14:13:28 +0000
1284@@ -46,6 +46,7 @@
1285 ui/messageTray.js \
1286 ui/modalDialog.js \
1287 ui/networkAgent.js \
1288+ ui/shellEntry.js \
1289 ui/shellMountOperation.js \
1290 ui/notificationDaemon.js \
1291 ui/overview.js \
1292
1293=== modified file 'js/Makefile.in'
1294--- js/Makefile.in 2011-09-22 08:50:45 +0000
1295+++ js/Makefile.in 2012-01-18 14:13:28 +0000
1296@@ -337,6 +337,7 @@
1297 ui/messageTray.js \
1298 ui/modalDialog.js \
1299 ui/networkAgent.js \
1300+ ui/shellEntry.js \
1301 ui/shellMountOperation.js \
1302 ui/notificationDaemon.js \
1303 ui/overview.js \
1304
1305=== modified file 'js/gdm/batch.js'
1306--- js/gdm/batch.js 2011-09-04 08:02:35 +0000
1307+++ js/gdm/batch.js 2012-01-18 14:13:28 +0000
1308@@ -1,5 +1,5 @@
1309-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
1310- *
1311+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1312+/*
1313 * Copyright 2011 Red Hat, Inc
1314 *
1315 * This program is free software; you can redistribute it and/or modify
1316
1317=== modified file 'js/gdm/consoleKit.js'
1318--- js/gdm/consoleKit.js 2011-09-21 16:26:15 +0000
1319+++ js/gdm/consoleKit.js 2012-01-18 14:13:28 +0000
1320@@ -1,4 +1,4 @@
1321-// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
1322+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1323
1324 const DBus = imports.dbus;
1325
1326
1327=== modified file 'js/gdm/fingerprint.js'
1328--- js/gdm/fingerprint.js 2011-09-21 16:26:15 +0000
1329+++ js/gdm/fingerprint.js 2012-01-18 14:13:28 +0000
1330@@ -1,4 +1,4 @@
1331-// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
1332+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1333
1334 const DBus = imports.dbus;
1335 const Lang = imports.lang;
1336
1337=== modified file 'js/gdm/loginDialog.js'
1338--- js/gdm/loginDialog.js 2011-09-21 16:26:15 +0000
1339+++ js/gdm/loginDialog.js 2012-01-18 14:13:28 +0000
1340@@ -1,5 +1,5 @@
1341-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
1342- *
1343+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1344+/*
1345 * Copyright 2011 Red Hat, Inc
1346 *
1347 * This program is free software; you can redistribute it and/or modify
1348@@ -297,6 +297,20 @@
1349 x_align: St.Align.START,
1350 y_align: St.Align.MIDDLE });
1351 this._items = {};
1352+
1353+ this.actor.connect('key-focus-in', Lang.bind(this, this._moveFocusToItems));
1354+ },
1355+
1356+ _moveFocusToItems: function() {
1357+ let hasItems = Object.keys(this._items).length > 0;
1358+
1359+ if (!hasItems)
1360+ return;
1361+
1362+ if (global.stage.get_key_focus() != this.actor)
1363+ return;
1364+
1365+ this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
1366 },
1367
1368 _showItem: function(item) {
1369@@ -502,6 +516,8 @@
1370 item.showFocusAnimation(0);
1371 }));
1372
1373+ this._moveFocusToItems();
1374+
1375 this.emit('item-added', item);
1376 },
1377
1378@@ -694,10 +710,13 @@
1379 let ids = GdmGreeter.get_session_ids();
1380 ids.sort();
1381
1382- if (ids.length <= 1)
1383+ if (ids.length <= 1) {
1384 this._box.hide();
1385- else
1386+ this._button.hide();
1387+ } else {
1388+ this._button.show();
1389 this._box.show();
1390+ }
1391
1392 for (let i = 0; i < ids.length; i++) {
1393 let [sessionName, sessionDescription] = GdmGreeter.get_session_name_and_description(ids[i]);
1394@@ -922,6 +941,7 @@
1395
1396 function() {
1397 this._sessionList.close();
1398+ this._promptFingerprintMessage.hide();
1399 this._userList.actor.show();
1400 this._userList.actor.opacity = 255;
1401 return this._userList.showItems();
1402@@ -943,7 +963,18 @@
1403 },
1404
1405 _onInfo: function(client, serviceName, info) {
1406- // we don't want fingerprint messages with the word UPEK in them
1407+ // We don't display fingerprint messages, because they
1408+ // have words like UPEK in them. Instead we use the messages
1409+ // as a cue to display our own message.
1410+ if (serviceName == _FINGERPRINT_SERVICE_NAME &&
1411+ this._haveFingerprintReader &&
1412+ (!this._promptFingerprintMessage.visible ||
1413+ this._promptFingerprintMessage.opacity != 255)) {
1414+
1415+ _fadeInActor(this._promptFingerprintMessage);
1416+ return;
1417+ }
1418+
1419 if (serviceName != _PASSWORD_SERVICE_NAME)
1420 return;
1421 Main.notifyError(info);
1422@@ -971,10 +1002,10 @@
1423 },
1424
1425 function() {
1426- if (!this._haveFingerprintReader)
1427- return null;
1428-
1429- return _fadeInActor(this._promptFingerprintMessage);
1430+ // Show it with 0 opacity so we preallocate space for it
1431+ // in the event we need to fade in the message
1432+ this._promptFingerprintMessage.opacity = 0;
1433+ this._promptFingerprintMessage.show();
1434 },
1435
1436 function() {
1437@@ -1046,6 +1077,8 @@
1438
1439 function() {
1440 this._promptFingerprintMessage.hide();
1441+ this._promptEntry.reactive = true;
1442+ this._promptEntry.remove_style_pseudo_class('insensitive');
1443 this._promptEntry.set_text('');
1444 }];
1445
1446@@ -1061,7 +1094,8 @@
1447
1448 function() {
1449 let _text = this._promptEntry.get_text();
1450- this._promptEntry.set_text('');
1451+ this._promptEntry.reactive = false;
1452+ this._promptEntry.add_style_pseudo_class('insensitive');
1453 this._greeterClient.call_answer_query(serviceName, _text);
1454 }];
1455
1456
1457=== modified file 'js/gdm/powerMenu.js'
1458--- js/gdm/powerMenu.js 2011-09-21 16:26:15 +0000
1459+++ js/gdm/powerMenu.js 2012-01-18 14:13:28 +0000
1460@@ -1,5 +1,5 @@
1461-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
1462- *
1463+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1464+/*
1465 * Copyright 2011 Red Hat, Inc
1466 *
1467 * This program is free software; you can redistribute it and/or modify
1468
1469=== modified file 'js/misc/config.js'
1470--- js/misc/config.js 2011-09-28 00:41:45 +0000
1471+++ js/misc/config.js 2012-01-18 14:13:28 +0000
1472@@ -1,10 +1,11 @@
1473-/* mode: js2; indent-tabs-mode: nil; tab-size: 4 */
1474+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1475+
1476 /* The name of this package (not localized) */
1477 const PACKAGE_NAME = 'gnome-shell';
1478 /* The version of this package */
1479-const PACKAGE_VERSION = '3.2.0';
1480+const PACKAGE_VERSION = '3.2.1';
1481 /* The version of GJS we're linking to */
1482-const GJS_VERSION = '1.29.19';
1483+const GJS_VERSION = '1.30.0';
1484 /* 1 if gnome-bluetooth is available, 0 otherwise */
1485 const HAVE_BLUETOOTH = 1;
1486 /* The system TLS CA list */
1487
1488=== modified file 'js/misc/config.js.in'
1489--- js/misc/config.js.in 2011-09-21 16:26:15 +0000
1490+++ js/misc/config.js.in 2012-01-18 14:13:28 +0000
1491@@ -1,4 +1,5 @@
1492-/* mode: js2; indent-tabs-mode: nil; tab-size: 4 */
1493+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1494+
1495 /* The name of this package (not localized) */
1496 const PACKAGE_NAME = '@PACKAGE_NAME@';
1497 /* The version of this package */
1498
1499=== modified file 'js/misc/docInfo.js'
1500--- js/misc/docInfo.js 2011-02-25 12:23:23 +0000
1501+++ js/misc/docInfo.js 2012-01-18 14:13:28 +0000
1502@@ -1,4 +1,4 @@
1503-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1504+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1505
1506 const St = imports.gi.St;
1507 const Shell = imports.gi.Shell;
1508
1509=== modified file 'js/misc/fileUtils.js'
1510--- js/misc/fileUtils.js 2011-09-21 16:26:15 +0000
1511+++ js/misc/fileUtils.js 2012-01-18 14:13:28 +0000
1512@@ -1,3 +1,5 @@
1513+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1514+
1515 const Gio = imports.gi.Gio;
1516 const GLib = imports.gi.GLib;
1517
1518
1519=== modified file 'js/misc/format.js'
1520--- js/misc/format.js 2010-07-13 14:36:34 +0000
1521+++ js/misc/format.js 2012-01-18 14:13:28 +0000
1522@@ -1,4 +1,4 @@
1523-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1524+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1525
1526 /*
1527 * This function is intended to extend the String object and provide
1528
1529=== modified file 'js/misc/gnomeSession.js'
1530--- js/misc/gnomeSession.js 2011-07-20 14:46:28 +0000
1531+++ js/misc/gnomeSession.js 2012-01-18 14:13:28 +0000
1532@@ -1,4 +1,4 @@
1533-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1534+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1535
1536 const DBus = imports.dbus;
1537 const Lang = imports.lang;
1538@@ -78,7 +78,7 @@
1539 Inhibitor.prototype = {
1540 _init: function(objectPath) {
1541 DBus.session.proxifyObject(this,
1542- "org.gnome.SessionManager",
1543+ 'org.gnome.SessionManager',
1544 objectPath);
1545 this.isLoaded = false;
1546 this._loadingPropertiesCount = InhibitorIface.properties.length;
1547@@ -94,7 +94,7 @@
1548
1549 if (this._loadingPropertiesCount == 0) {
1550 this.isLoaded = true;
1551- this.emit("is-loaded");
1552+ this.emit('is-loaded');
1553 }
1554 }));
1555 }
1556
1557=== modified file 'js/misc/history.js'
1558--- js/misc/history.js 2011-05-31 19:31:47 +0000
1559+++ js/misc/history.js 2012-01-18 14:13:28 +0000
1560@@ -1,4 +1,4 @@
1561-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1562+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1563
1564 const Lang = imports.lang;
1565 const Signals = imports.signals;
1566
1567=== modified file 'js/misc/modemManager.js'
1568--- js/misc/modemManager.js 2011-03-24 19:28:12 +0000
1569+++ js/misc/modemManager.js 2012-01-18 14:13:28 +0000
1570@@ -1,4 +1,4 @@
1571-// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
1572+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1573
1574 const DBus = imports.dbus;
1575 const Lang = imports.lang;
1576
1577=== modified file 'js/misc/params.js'
1578--- js/misc/params.js 2010-05-31 11:03:29 +0000
1579+++ js/misc/params.js 2012-01-18 14:13:28 +0000
1580@@ -1,4 +1,4 @@
1581-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1582+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1583
1584 // parse:
1585 // @params: caller-provided parameter object, or %null
1586
1587=== modified file 'js/misc/screenSaver.js'
1588--- js/misc/screenSaver.js 2011-08-24 02:33:44 +0000
1589+++ js/misc/screenSaver.js 2012-01-18 14:13:28 +0000
1590@@ -1,4 +1,4 @@
1591-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1592+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1593
1594 const DBus = imports.dbus;
1595 const Lang = imports.lang;
1596
1597=== modified file 'js/misc/util.js'
1598--- js/misc/util.js 2011-09-21 16:26:15 +0000
1599+++ js/misc/util.js 2012-01-18 14:13:28 +0000
1600@@ -1,4 +1,4 @@
1601-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1602+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1603
1604 const Gdk = imports.gi.Gdk;
1605 const Gio = imports.gi.Gio;
1606
1607=== modified file 'js/perf/core.js'
1608--- js/perf/core.js 2011-09-04 08:02:35 +0000
1609+++ js/perf/core.js 2012-01-18 14:13:28 +0000
1610@@ -1,4 +1,4 @@
1611-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1612+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1613
1614 const Main = imports.ui.main;
1615 const Scripting = imports.ui.scripting;
1616
1617=== modified file 'js/ui/altTab.js'
1618--- js/ui/altTab.js 2011-09-22 08:50:45 +0000
1619+++ js/ui/altTab.js 2012-01-18 14:13:28 +0000
1620@@ -1,4 +1,4 @@
1621-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1622+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1623
1624 const Clutter = imports.gi.Clutter;
1625 const Gdk = imports.gi.Gdk;
1626@@ -134,11 +134,40 @@
1627 }
1628 },
1629
1630+ _getAppLists: function() {
1631+ let tracker = Shell.WindowTracker.get_default();
1632+ let appSys = Shell.AppSystem.get_default();
1633+ let allApps = appSys.get_running ();
1634+
1635+ let screen = global.screen;
1636+ let display = screen.get_display();
1637+ let windows = display.get_tab_list(Meta.TabList.NORMAL, screen,
1638+ screen.get_active_workspace());
1639+
1640+ // windows is only the windows on the current workspace. For
1641+ // each one, if it corresponds to an app we know, move that
1642+ // app from allApps to apps.
1643+ let apps = [];
1644+ for (let i = 0; i < windows.length && allApps.length != 0; i++) {
1645+ let app = tracker.get_window_app(windows[i]);
1646+ let index = allApps.indexOf(app);
1647+ if (index != -1) {
1648+ apps.push(app);
1649+ allApps.splice(index, 1);
1650+ }
1651+ }
1652+
1653+ // Now @apps is a list of apps on the current workspace, in
1654+ // standard Alt+Tab order (MRU except for minimized windows),
1655+ // and allApps is a list of apps that only appear on other
1656+ // workspaces, sorted by user_time, which is good enough.
1657+ return [apps, allApps];
1658+ },
1659+
1660 show : function(backward, binding, mask) {
1661- let appSys = Shell.AppSystem.get_default();
1662- let apps = appSys.get_running ();
1663+ let [localApps, otherApps] = this._getAppLists();
1664
1665- if (!apps.length)
1666+ if (localApps.length == 0 && otherApps.length == 0)
1667 return false;
1668
1669 if (!Main.pushModal(this.actor))
1670@@ -152,7 +181,7 @@
1671 this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
1672 this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
1673
1674- this._appSwitcher = new AppSwitcher(apps, this);
1675+ this._appSwitcher = new AppSwitcher(localApps, otherApps, this);
1676 this.actor.add_actor(this._appSwitcher.actor);
1677 this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
1678 this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
1679@@ -846,33 +875,32 @@
1680 }
1681 };
1682
1683-function AppSwitcher(apps, altTabPopup) {
1684- this._init(apps, altTabPopup);
1685+function AppSwitcher() {
1686+ this._init.apply(this, arguments);
1687 }
1688
1689 AppSwitcher.prototype = {
1690 __proto__ : SwitcherList.prototype,
1691
1692- _init : function(apps, altTabPopup) {
1693+ _init : function(localApps, otherApps, altTabPopup) {
1694 SwitcherList.prototype._init.call(this, true);
1695
1696- // Construct the AppIcons, sort by time, add to the popup
1697+ // Construct the AppIcons, add to the popup
1698 let activeWorkspace = global.screen.get_active_workspace();
1699 let workspaceIcons = [];
1700 let otherIcons = [];
1701- for (let i = 0; i < apps.length; i++) {
1702- let appIcon = new AppIcon(apps[i]);
1703+ for (let i = 0; i < localApps.length; i++) {
1704+ let appIcon = new AppIcon(localApps[i]);
1705 // Cache the window list now; we don't handle dynamic changes here,
1706 // and we don't want to be continually retrieving it
1707 appIcon.cachedWindows = appIcon.app.get_windows();
1708- if (this._hasWindowsOnWorkspace(appIcon, activeWorkspace))
1709- workspaceIcons.push(appIcon);
1710- else
1711- otherIcons.push(appIcon);
1712- }
1713-
1714- workspaceIcons.sort(Lang.bind(this, this._sortAppIcon));
1715- otherIcons.sort(Lang.bind(this, this._sortAppIcon));
1716+ workspaceIcons.push(appIcon);
1717+ }
1718+ for (let i = 0; i < otherApps.length; i++) {
1719+ let appIcon = new AppIcon(otherApps[i]);
1720+ appIcon.cachedWindows = appIcon.app.get_windows();
1721+ otherIcons.push(appIcon);
1722+ }
1723
1724 this.icons = [];
1725 this._arrows = [];
1726@@ -1012,19 +1040,6 @@
1727
1728 if (appIcon.cachedWindows.length == 1)
1729 arrow.hide();
1730- },
1731-
1732- _hasWindowsOnWorkspace: function(appIcon, workspace) {
1733- let windows = appIcon.cachedWindows;
1734- for (let i = 0; i < windows.length; i++) {
1735- if (windows[i].get_workspace() == workspace)
1736- return true;
1737- }
1738- return false;
1739- },
1740-
1741- _sortAppIcon : function(appIcon1, appIcon2) {
1742- return appIcon1.app.compare(appIcon2.app);
1743 }
1744 };
1745
1746
1747=== modified file 'js/ui/appDisplay.js'
1748--- js/ui/appDisplay.js 2011-09-21 16:26:15 +0000
1749+++ js/ui/appDisplay.js 2012-01-18 14:13:28 +0000
1750@@ -1,4 +1,4 @@
1751-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1752+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1753
1754 const Clutter = imports.gi.Clutter;
1755 const GLib = imports.gi.GLib;
1756
1757=== modified file 'js/ui/appFavorites.js'
1758--- js/ui/appFavorites.js 2011-09-04 08:02:35 +0000
1759+++ js/ui/appFavorites.js 2012-01-18 14:13:28 +0000
1760@@ -1,4 +1,4 @@
1761-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1762+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1763
1764 const Shell = imports.gi.Shell;
1765 const Lang = imports.lang;
1766
1767=== modified file 'js/ui/automountManager.js'
1768--- js/ui/automountManager.js 2011-08-24 02:33:44 +0000
1769+++ js/ui/automountManager.js 2012-01-18 14:13:28 +0000
1770@@ -1,4 +1,4 @@
1771-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1772+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1773
1774 const Lang = imports.lang;
1775 const DBus = imports.dbus;
1776@@ -209,10 +209,14 @@
1777 }
1778 }
1779
1780+ // Volume is already mounted, don't bother.
1781+ if (volume.get_mount())
1782+ return;
1783+
1784 if (!this._settings.get_boolean(SETTING_ENABLE_AUTOMOUNT) ||
1785 !volume.should_automount() ||
1786 !volume.can_mount()) {
1787- // allow the autorun to run anyway; this can happen if the
1788+ // allow the autorun to run anyway; this can happen if the
1789 // mount gets added programmatically later, even if
1790 // should_automount() or can_mount() are false, like for
1791 // blank optical media.
1792
1793=== modified file 'js/ui/autorunManager.js'
1794--- js/ui/autorunManager.js 2011-09-28 00:41:45 +0000
1795+++ js/ui/autorunManager.js 2012-01-18 14:13:28 +0000
1796@@ -1,4 +1,4 @@
1797-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1798+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1799
1800 const Lang = imports.lang;
1801 const DBus = imports.dbus;
1802@@ -491,7 +491,7 @@
1803 let app = null;
1804
1805 if (setting == AutorunSetting.RUN) {
1806- app = Gio.app_info_get_default_for_type(type, false);
1807+ app = Gio.app_info_get_default_for_type(contentTypes[0], false);
1808 } else if (setting == AutorunSetting.FILES) {
1809 app = Gio.app_info_get_default_for_type('inode/directory', false);
1810 }
1811
1812=== modified file 'js/ui/boxpointer.js'
1813--- js/ui/boxpointer.js 2011-09-04 08:02:35 +0000
1814+++ js/ui/boxpointer.js 2012-01-18 14:13:28 +0000
1815@@ -1,4 +1,4 @@
1816-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1817+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1818
1819 const Clutter = imports.gi.Clutter;
1820 const Lang = imports.lang;
1821@@ -46,6 +46,7 @@
1822 this._yOffset = 0;
1823 this._xPosition = 0;
1824 this._yPosition = 0;
1825+ this._sourceAlignment = 0.5;
1826 },
1827
1828 show: function(animate, onComplete) {
1829@@ -75,7 +76,7 @@
1830 Tweener.addTween(this, { opacity: 255,
1831 xOffset: 0,
1832 yOffset: 0,
1833- transition: "linear",
1834+ transition: 'linear',
1835 onComplete: onComplete,
1836 time: POPUP_ANIMATION_TIME });
1837 },
1838@@ -106,7 +107,7 @@
1839 Tweener.addTween(this, { opacity: 0,
1840 xOffset: xOffset,
1841 yOffset: yOffset,
1842- transition: "linear",
1843+ transition: 'linear',
1844 time: POPUP_ANIMATION_TIME,
1845 onComplete: Lang.bind(this, function () {
1846 this.actor.hide();
1847@@ -180,7 +181,7 @@
1848 this.bin.allocate(childBox, flags);
1849
1850 if (this._sourceActor && this._sourceActor.mapped)
1851- this._reposition(this._sourceActor, this._alignment);
1852+ this._reposition(this._sourceActor, this._arrowAlignment);
1853 },
1854
1855 _drawBorder: function(area) {
1856@@ -312,24 +313,37 @@
1857 this.actor.show();
1858
1859 this._sourceActor = sourceActor;
1860- this._alignment = alignment;
1861+ this._arrowAlignment = alignment;
1862
1863 this._reposition(sourceActor, alignment);
1864 },
1865
1866+ setSourceAlignment: function(alignment) {
1867+ this._sourceAlignment = alignment;
1868+
1869+ if (!this._sourceActor)
1870+ return;
1871+
1872+ // We need to show it now to force an allocation,
1873+ // so that we can query the correct size.
1874+ this.actor.show();
1875+
1876+ this._reposition(this._sourceActor, this._arrowAlignment);
1877+ },
1878+
1879 _reposition: function(sourceActor, alignment) {
1880 // Position correctly relative to the sourceActor
1881 let sourceNode = sourceActor.get_theme_node();
1882 let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
1883 let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
1884- let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) / 2;
1885- let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) / 2;
1886+ let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
1887+ let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
1888 let [minWidth, minHeight, natWidth, natHeight] = this.actor.get_preferred_size();
1889
1890 // We also want to keep it onscreen, and separated from the
1891 // edge by the same distance as the main part of the box is
1892 // separated from its sourceActor
1893- let primary = Main.layoutManager.primaryMonitor;
1894+ let monitor = Main.layoutManager.findMonitorForActor(sourceActor);
1895 let themeNode = this.actor.get_theme_node();
1896 let borderWidth = themeNode.get_length('-arrow-border-width');
1897 let arrowBase = themeNode.get_length('-arrow-base');
1898@@ -364,8 +378,8 @@
1899 case St.Side.BOTTOM:
1900 resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
1901
1902- resX = Math.max(resX, primary.x + 10);
1903- resX = Math.min(resX, primary.x + primary.width - (10 + natWidth));
1904+ resX = Math.max(resX, monitor.x + 10);
1905+ resX = Math.min(resX, monitor.x + monitor.width - (10 + natWidth));
1906 this.setArrowOrigin(sourceCenterX - resX);
1907 break;
1908
1909@@ -373,8 +387,8 @@
1910 case St.Side.RIGHT:
1911 resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
1912
1913- resY = Math.max(resY, primary.y + 10);
1914- resY = Math.min(resY, primary.y + primary.height - (10 + natHeight));
1915+ resY = Math.max(resY, monitor.y + 10);
1916+ resY = Math.min(resY, monitor.y + monitor.height - (10 + natHeight));
1917
1918 this.setArrowOrigin(sourceCenterY - resY);
1919 break;
1920
1921=== modified file 'js/ui/calendar.js'
1922--- js/ui/calendar.js 2011-09-04 08:02:35 +0000
1923+++ js/ui/calendar.js 2012-01-18 14:13:28 +0000
1924@@ -1,4 +1,4 @@
1925-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1926+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1927
1928 const DBus = imports.dbus;
1929 const Clutter = imports.gi.Clutter;
1930
1931=== modified file 'js/ui/contactDisplay.js'
1932--- js/ui/contactDisplay.js 2011-09-04 08:02:35 +0000
1933+++ js/ui/contactDisplay.js 2012-01-18 14:13:28 +0000
1934@@ -1,4 +1,4 @@
1935-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1936+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1937
1938 const Folks = imports.gi.Folks
1939 const Lang = imports.lang;
1940@@ -26,7 +26,8 @@
1941
1942 Contact.prototype = {
1943 _init: function(id) {
1944- this.individual = Shell.ContactSystem.get_default().get_individual(id);
1945+ this._contactSys = Shell.ContactSystem.get_default();
1946+ this.individual = this._contactSys.get_individual(id);
1947
1948 this.actor = new St.Bin({ style_class: 'contact',
1949 reactive: true,
1950@@ -56,7 +57,12 @@
1951 x_align: St.Align.START,
1952 y_align: St.Align.MIDDLE });
1953
1954- let aliasText = this.individual.alias || _("Unknown");
1955+ let email = this._contactSys.get_email_for_display(this.individual);
1956+ let aliasText = this.individual.alias ||
1957+ this.individual.full_name ||
1958+ this.individual.nickname ||
1959+ email ||
1960+ _("Unknown");
1961 let aliasLabel = new St.Label({ text: aliasText,
1962 style_class: 'contact-details-alias' });
1963 details.add(aliasLabel, { x_fill: true,
1964
1965=== modified file 'js/ui/ctrlAltTab.js'
1966--- js/ui/ctrlAltTab.js 2011-09-21 16:26:15 +0000
1967+++ js/ui/ctrlAltTab.js 2012-01-18 14:13:28 +0000
1968@@ -1,4 +1,4 @@
1969-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1970+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1971
1972 const Clutter = imports.gi.Clutter;
1973 const Gdk = imports.gi.Gdk;
1974
1975=== modified file 'js/ui/dash.js'
1976--- js/ui/dash.js 2011-09-21 16:26:15 +0000
1977+++ js/ui/dash.js 2012-01-18 14:13:28 +0000
1978@@ -1,4 +1,4 @@
1979-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
1980+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1981
1982 const Clutter = imports.gi.Clutter;
1983 const Signals = imports.signals;
1984@@ -37,6 +37,7 @@
1985 this.child = null;
1986 this._childScale = 1;
1987 this._childOpacity = 255;
1988+ this.animatingOut = false;
1989 },
1990
1991 _allocate: function(actor, box, flags) {
1992@@ -115,6 +116,7 @@
1993 return;
1994 }
1995
1996+ this.animatingOut = true;
1997 this.childScale = 1.0;
1998 Tweener.addTween(this,
1999 { childScale: 0.0,
2000@@ -177,12 +179,6 @@
2001 this._iconBin._delegate = this;
2002
2003 this.setChild(this._iconBin);
2004- this.hiding = false;
2005- },
2006-
2007- animateOutAndDestroy: function() {
2008- DashItemContainer.prototype.animateOutAndDestroy.call(this);
2009- this.hiding = true;
2010 },
2011
2012 _createIcon: function(size) {
2013@@ -314,15 +310,12 @@
2014 _endDrag: function() {
2015 this._clearDragPlaceholder();
2016 if (this._favRemoveTarget) {
2017- this._favRemoveTarget.actor.hide();
2018- this._adjustIconSize();
2019- this._favRemoveTarget.actor.show();
2020-
2021 this._favRemoveTarget.animateOutAndDestroy();
2022 this._favRemoveTarget.actor.connect('destroy', Lang.bind(this,
2023 function() {
2024 this._favRemoveTarget = null;
2025 }));
2026+ this._adjustIconSize();
2027 }
2028 DND.removeDragMonitor(this._dragMonitor);
2029 },
2030@@ -401,8 +394,18 @@
2031 },
2032
2033 _adjustIconSize: function() {
2034- let children = this._box.get_children();
2035- if (children.length == 0) {
2036+ // For the icon size, we only consider children which are "proper"
2037+ // icons (i.e. ignoring drag placeholders) and which are not
2038+ // animating out (which means they will be destroyed at the end of
2039+ // the animation)
2040+ let iconChildren = this._box.get_children().filter(function(actor) {
2041+ return actor._delegate.child &&
2042+ actor._delegate.child._delegate &&
2043+ actor._delegate.child._delegate.icon &&
2044+ !actor._delegate.animatingOut;
2045+ });
2046+
2047+ if (iconChildren.length == 0) {
2048 this._box.add_style_pseudo_class('empty');
2049 return;
2050 }
2051@@ -412,23 +415,45 @@
2052 if (this._maxHeight == -1)
2053 return;
2054
2055- let iconChildren = children.filter(function(actor) {
2056- return actor.visible &&
2057- actor._delegate.child &&
2058- actor._delegate.child._delegate &&
2059- actor._delegate.child._delegate.icon;
2060- });
2061-
2062- // Compute the amount of extra space (or missing space) we have
2063- // per icon with the current icon size
2064- let [minHeight, natHeight] = this.actor.get_preferred_height(-1);
2065- let diff = (this._maxHeight - natHeight) / iconChildren.length;
2066+
2067+ let themeNode = this.actor.get_theme_node();
2068+ let maxAllocation = new Clutter.ActorBox({ x1: 0, y1: 0,
2069+ x2: 42 /* whatever */,
2070+ y2: this._maxHeight });
2071+ let maxContent = themeNode.get_content_box(maxAllocation);
2072+ let availHeight = maxContent.y2 - maxContent.y1;
2073+ let spacing = themeNode.get_length('spacing');
2074+
2075+
2076+ let firstIcon = iconChildren[0]._delegate.child._delegate.icon;
2077+
2078+ let minHeight, natHeight;
2079+
2080+ // Enforce the current icon size during the size request if
2081+ // the icon is animating
2082+ if (firstIcon._animating) {
2083+ let [currentWidth, currentHeight] = firstIcon.icon.get_size();
2084+
2085+ firstIcon.icon.set_size(this.iconSize, this.iconSize);
2086+ [minHeight, natHeight] = iconChildren[0].get_preferred_height(-1);
2087+
2088+ firstIcon.icon.set_size(currentWidth, currentHeight);
2089+ } else {
2090+ [minHeight, natHeight] = iconChildren[0].get_preferred_height(-1);
2091+ }
2092+
2093+
2094+ // Subtract icon padding and box spacing from the available height
2095+ availHeight -= iconChildren.length * (natHeight - this.iconSize) +
2096+ (iconChildren.length - 1) * spacing;
2097+
2098+ let availSize = availHeight / iconChildren.length;
2099
2100 let iconSizes = [ 16, 22, 24, 32, 48, 64 ];
2101
2102 let newIconSize = 16;
2103 for (let i = 0; i < iconSizes.length; i++) {
2104- if (iconSizes[i] < this.iconSize + diff)
2105+ if (iconSizes[i] < availSize)
2106 newIconSize = iconSizes[i];
2107 }
2108
2109@@ -459,11 +484,15 @@
2110 icon.icon.set_size(icon.icon.width * scale,
2111 icon.icon.height * scale);
2112
2113+ icon._animating = true;
2114 Tweener.addTween(icon.icon,
2115 { width: targetWidth,
2116 height: targetHeight,
2117 time: DASH_ANIMATION_TIME,
2118- transition: 'easeOutQuad'
2119+ transition: 'easeOutQuad',
2120+ onComplete: function() {
2121+ icon._animating = false;
2122+ }
2123 });
2124 }
2125 },
2126@@ -566,29 +595,7 @@
2127 this._box.insert_actor(addedItems[i].item.actor,
2128 addedItems[i].pos);
2129
2130- // Hide removed actors to not take them into account
2131- // when adjusting the icon size ...
2132- for (let i = 0; i < removedActors.length; i++)
2133- removedActors[i].hide();
2134-
2135- // ... and do the same for the remove target if necessary
2136- if (this._favRemoveTarget && this._favRemoveTarget.hiding)
2137- this._favRemoveTarget.actor.hide();
2138-
2139- this._adjustIconSize();
2140-
2141- if (this._favRemoveTarget && this._favRemoveTarget.hiding)
2142- this._favRemoveTarget.actor.show();
2143-
2144- // Skip animations on first run when adding the initial set
2145- // of items, to avoid all items zooming in at once
2146- if (!this._shownInitially) {
2147- this._shownInitially = true;
2148- return;
2149- }
2150-
2151 for (let i = 0; i < removedActors.length; i++) {
2152- removedActors[i].show();
2153 let item = removedActors[i]._delegate;
2154
2155 // Don't animate item removal when the overview is hidden
2156@@ -598,6 +605,15 @@
2157 item.actor.destroy();
2158 }
2159
2160+ this._adjustIconSize();
2161+
2162+ // Skip animations on first run when adding the initial set
2163+ // of items, to avoid all items zooming in at once
2164+ if (!this._shownInitially) {
2165+ this._shownInitially = true;
2166+ return;
2167+ }
2168+
2169 // Don't animate item addition when the overview is hidden
2170 if (!Main.overview.visible)
2171 return;
2172
2173=== modified file 'js/ui/dateMenu.js'
2174--- js/ui/dateMenu.js 2011-09-21 16:26:15 +0000
2175+++ js/ui/dateMenu.js 2012-01-18 14:13:28 +0000
2176@@ -1,4 +1,4 @@
2177-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2178+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2179
2180 const GLib = imports.gi.GLib;
2181 const Gio = imports.gi.Gio;
2182
2183=== modified file 'js/ui/dnd.js'
2184--- js/ui/dnd.js 2011-07-20 14:46:28 +0000
2185+++ js/ui/dnd.js 2012-01-18 14:13:28 +0000
2186@@ -1,4 +1,4 @@
2187-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2188+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2189
2190 const Clutter = imports.gi.Clutter;
2191 const Gtk = imports.gi.Gtk;
2192
2193=== modified file 'js/ui/docDisplay.js'
2194--- js/ui/docDisplay.js 2011-09-04 08:02:35 +0000
2195+++ js/ui/docDisplay.js 2012-01-18 14:13:28 +0000
2196@@ -1,4 +1,4 @@
2197-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2198+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2199
2200 const DocInfo = imports.misc.docInfo;
2201 const Params = imports.misc.params;
2202
2203=== modified file 'js/ui/endSessionDialog.js'
2204--- js/ui/endSessionDialog.js 2011-09-21 16:26:15 +0000
2205+++ js/ui/endSessionDialog.js 2012-01-18 14:13:28 +0000
2206@@ -1,5 +1,5 @@
2207-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
2208- *
2209+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2210+/*
2211 * Copyright 2010 Red Hat, Inc
2212 *
2213 * This program is free software; you can redistribute it and/or modify
2214
2215=== modified file 'js/ui/environment.js'
2216--- js/ui/environment.js 2011-07-20 14:46:28 +0000
2217+++ js/ui/environment.js 2012-01-18 14:13:28 +0000
2218@@ -1,4 +1,4 @@
2219-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2220+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2221
2222 imports.gi.versions.Clutter = '1.0';
2223 imports.gi.versions.Gio = '2.0';
2224
2225=== modified file 'js/ui/extensionSystem.js'
2226--- js/ui/extensionSystem.js 2011-09-21 16:26:15 +0000
2227+++ js/ui/extensionSystem.js 2012-01-18 14:13:28 +0000
2228@@ -1,4 +1,4 @@
2229-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2230+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2231
2232 const Lang = imports.lang;
2233 const Signals = imports.signals;
2234@@ -289,7 +289,7 @@
2235 }
2236
2237 if (extensions[uuid] != undefined) {
2238- logExtensionError(uuid, "extension already loaded");
2239+ logExtensionError(uuid, 'extension already loaded');
2240 return;
2241 }
2242
2243@@ -450,7 +450,6 @@
2244 }
2245
2246 function loadExtensions() {
2247- _loadExtensionsIn(userExtensionsDir, ExtensionType.PER_USER);
2248 let systemDataDirs = GLib.get_system_data_dirs();
2249 for (let i = 0; i < systemDataDirs.length; i++) {
2250 let dirPath = systemDataDirs[i] + '/gnome-shell/extensions';
2251@@ -458,6 +457,7 @@
2252 if (dir.query_exists(null))
2253 _loadExtensionsIn(dir, ExtensionType.SYSTEM);
2254 }
2255+ _loadExtensionsIn(userExtensionsDir, ExtensionType.PER_USER);
2256 }
2257
2258 function InstallExtensionDialog(uuid, version_tag, name) {
2259
2260=== modified file 'js/ui/iconGrid.js'
2261--- js/ui/iconGrid.js 2011-07-20 14:46:28 +0000
2262+++ js/ui/iconGrid.js 2012-01-18 14:13:28 +0000
2263@@ -1,4 +1,4 @@
2264-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2265+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2266
2267 const Clutter = imports.gi.Clutter;
2268 const Shell = imports.gi.Shell;
2269
2270=== modified file 'js/ui/keyboard.js'
2271--- js/ui/keyboard.js 2011-09-28 00:41:45 +0000
2272+++ js/ui/keyboard.js 2012-01-18 14:13:28 +0000
2273@@ -1,4 +1,4 @@
2274-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2275+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2276
2277 const Caribou = imports.gi.Caribou;
2278 const Clutter = imports.gi.Clutter;
2279@@ -75,7 +75,7 @@
2280 this._extended_keys = this._key.get_extended_keys();
2281 this._extended_keyboard = null;
2282
2283- if (this._key.name == "Control_L" || this._key.name == "Alt_L")
2284+ if (this._key.name == 'Control_L' || this._key.name == 'Alt_L')
2285 this._key.latch = true;
2286
2287 this._key.connect('key-pressed', Lang.bind(this, function ()
2288@@ -218,7 +218,7 @@
2289 this._redraw();
2290 },
2291
2292- _settingsChanged: function () {
2293+ _settingsChanged: function (settings, key) {
2294 this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD);
2295 if (!this._enableKeyboard && !this._keyboard)
2296 return;
2297@@ -228,9 +228,20 @@
2298
2299 if (this._keyboard)
2300 this._destroyKeyboard();
2301- if (this._enableKeyboard)
2302- this._setupKeyboard();
2303- else
2304+
2305+ if (this._enableKeyboard) {
2306+ // If we've been called because the setting actually just
2307+ // changed to true (as opposed to being called from
2308+ // this._init()), then we want to pop up the keyboard.
2309+ let showKeyboard = (settings != null);
2310+
2311+ // However, caribou-gtk-module or this._onKeyFocusChanged
2312+ // will probably immediately tell us to hide it, so we
2313+ // have to fake things out so we'll ignore that request.
2314+ if (showKeyboard)
2315+ this._timestamp = global.display.get_current_time_roundtrip() + 1;
2316+ this._setupKeyboard(showKeyboard);
2317+ } else
2318 Main.layoutManager.hideKeyboard(true);
2319 },
2320
2321@@ -246,7 +257,7 @@
2322 this._destroySource();
2323 },
2324
2325- _setupKeyboard: function() {
2326+ _setupKeyboard: function(show) {
2327 this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
2328 Main.layoutManager.keyboardBox.add_actor(this.actor);
2329 Main.layoutManager.trackChrome(this.actor);
2330@@ -263,20 +274,26 @@
2331
2332 this._keyboardNotifyId = this._keyboard.connect('notify::active-group', Lang.bind(this, this._onGroupChanged));
2333 this._focusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
2334- this._createSource();
2335+
2336+ if (show)
2337+ this.show();
2338+ else
2339+ this._createSource();
2340 },
2341
2342 _onKeyFocusChanged: function () {
2343 let focus = global.stage.key_focus;
2344
2345- // Showing an extended key popup will grab focus, but ignore that
2346- if (focus && focus._extended_keys)
2347+ // Showing an extended key popup and clicking a key from the extended keys
2348+ // will grab focus, but ignore that
2349+ if (focus && (focus._extended_keys || (focus._key && focus._key.extended_key)))
2350 return;
2351
2352+ let time = global.current_event_time();
2353 if (focus instanceof Clutter.Text)
2354- this.show();
2355+ this.Show(time);
2356 else
2357- this.hide();
2358+ this.Hide(time);
2359 },
2360
2361 _addKeys: function () {
2362@@ -305,7 +322,8 @@
2363 },
2364
2365 _getTrayIcon: function () {
2366- let trayButton = new St.Button ({ label: "tray", style_class: 'keyboard-key' });
2367+ let trayButton = new St.Button ({ label: _("tray"),
2368+ style_class: 'keyboard-key' });
2369 trayButton.key_width = 1;
2370 trayButton.connect('button-press-event', Lang.bind(this, function () {
2371 Main.messageTray.toggle();
2372@@ -339,7 +357,7 @@
2373 right_box.add(button.actor);
2374 else
2375 left_box.add(button.actor);
2376- if (key.name == "Caribou_Prefs") {
2377+ if (key.name == 'Caribou_Prefs') {
2378 key.connect('key-released', Lang.bind(this, this.hide));
2379
2380 // Add new key for hiding message tray
2381@@ -476,6 +494,9 @@
2382
2383 // D-Bus methods
2384 Show: function(timestamp) {
2385+ if (!this._enableKeyboard)
2386+ return;
2387+
2388 if (timestamp - this._timestamp < 0)
2389 return;
2390
2391@@ -484,6 +505,9 @@
2392 },
2393
2394 Hide: function(timestamp) {
2395+ if (!this._enableKeyboard)
2396+ return;
2397+
2398 if (timestamp - this._timestamp < 0)
2399 return;
2400
2401@@ -492,10 +516,16 @@
2402 },
2403
2404 SetCursorLocation: function(x, y, w, h) {
2405+ if (!this._enableKeyboard)
2406+ return;
2407+
2408 // this._setLocation(x, y);
2409 },
2410
2411 SetEntryLocation: function(x, y, w, h) {
2412+ if (!this._enableKeyboard)
2413+ return;
2414+
2415 // this._setLocation(x, y);
2416 },
2417
2418
2419=== modified file 'js/ui/layout.js'
2420--- js/ui/layout.js 2011-09-28 06:48:58 +0000
2421+++ js/ui/layout.js 2012-01-18 14:13:28 +0000
2422@@ -1,4 +1,4 @@
2423-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2424+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2425
2426 const Clutter = imports.gi.Clutter;
2427 const Lang = imports.lang;
2428@@ -216,10 +216,10 @@
2429 let monitorLeft = monitor.x, monitorRight = monitor.x + monitor.width;
2430 let primaryLeft = primary.x, primaryRight = primary.x + primary.width;
2431
2432- if ((monitorLeft >= primaryLeft && monitorLeft <= primaryRight) ||
2433- (monitorRight >= primaryLeft && monitorRight <= primaryRight) ||
2434- (primaryLeft >= monitorLeft && primaryLeft <= monitorRight) ||
2435- (primaryRight >= monitorLeft && primaryRight <= monitorRight))
2436+ if ((monitorLeft >= primaryLeft && monitorLeft < primaryRight) ||
2437+ (monitorRight > primaryLeft && monitorRight <= primaryRight) ||
2438+ (primaryLeft >= monitorLeft && primaryLeft < monitorRight) ||
2439+ (primaryRight > monitorLeft && primaryRight <= monitorRight))
2440 return true;
2441
2442 return false;
2443@@ -369,6 +369,10 @@
2444 // Removes @actor from the chrome
2445 removeChrome: function(actor) {
2446 this._chrome.removeActor(actor);
2447+ },
2448+
2449+ findMonitorForActor: function(actor) {
2450+ return this._chrome.findMonitorForActor(actor);
2451 }
2452 };
2453 Signals.addSignalMethods(LayoutManager.prototype);
2454@@ -621,7 +625,7 @@
2455 // We can't use Params.parse here because we want to drop
2456 // the extra values like ancestorData.actor
2457 for (let prop in defaultParams) {
2458- if (!params[prop])
2459+ if (!params.hasOwnProperty(prop))
2460 params[prop] = ancestorData[prop];
2461 }
2462
2463@@ -700,7 +704,7 @@
2464 else if (this._inOverview)
2465 visible = true;
2466 else if (!actorData.visibleInFullscreen &&
2467- this._findMonitorForActor(actorData.actor).inFullscreen)
2468+ this.findMonitorForActor(actorData.actor).inFullscreen)
2469 visible = false;
2470 else
2471 visible = true;
2472@@ -762,7 +766,7 @@
2473
2474 // This call guarantees that we return some monitor to simplify usage of it
2475 // In practice all tracked actors should be visible on some monitor anyway
2476- _findMonitorForActor: function(actor) {
2477+ findMonitorForActor: function(actor) {
2478 let [x, y] = actor.get_transformed_position();
2479 let [w, h] = actor.get_transformed_size();
2480 let monitor = this._findMonitorForRect(x, y, w, h);
2481@@ -821,6 +825,18 @@
2482 monitor.inFullscreen = true;
2483 }
2484 if (layer == Meta.StackLayer.OVERRIDE_REDIRECT) {
2485+ // Check whether the window is screen sized
2486+ let isScreenSized =
2487+ (window.x == 0 && window.y == 0 &&
2488+ window.width == global.screen_width &&
2489+ window.height == global.screen_height);
2490+
2491+ if (isScreenSized) {
2492+ for (let i = 0; i < this._monitors.length; i++)
2493+ this._monitors[i].inFullscreen = true;
2494+ }
2495+
2496+ // Or whether it is monitor sized
2497 let monitor = this._findMonitorForWindow(window);
2498 if (monitor &&
2499 window.x <= monitor.x &&
2500
2501=== modified file 'js/ui/lightbox.js'
2502--- js/ui/lightbox.js 2010-12-19 00:08:30 +0000
2503+++ js/ui/lightbox.js 2012-01-18 14:13:28 +0000
2504@@ -1,4 +1,4 @@
2505-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2506+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2507
2508 const Lang = imports.lang;
2509 const Meta = imports.gi.Meta;
2510
2511=== modified file 'js/ui/link.js'
2512--- js/ui/link.js 2010-12-19 00:08:30 +0000
2513+++ js/ui/link.js 2012-01-18 14:13:28 +0000
2514@@ -1,4 +1,4 @@
2515-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2516+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2517
2518 const Lang = imports.lang;
2519 const Signals = imports.signals;
2520
2521=== modified file 'js/ui/lookingGlass.js'
2522--- js/ui/lookingGlass.js 2011-09-21 16:26:15 +0000
2523+++ js/ui/lookingGlass.js 2012-01-18 14:13:28 +0000
2524@@ -1,4 +1,4 @@
2525-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2526+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2527
2528 const Clutter = imports.gi.Clutter;
2529 const Cogl = imports.gi.Cogl;
2530@@ -17,6 +17,7 @@
2531 const History = imports.misc.history;
2532 const ExtensionSystem = imports.ui.extensionSystem;
2533 const Link = imports.ui.link;
2534+const ShellEntry = imports.ui.shellEntry;
2535 const Tweener = imports.ui.tweener;
2536 const Main = imports.ui.main;
2537
2538@@ -157,9 +158,9 @@
2539 function objectToString(o) {
2540 if (typeof(o) == typeof(objectToString)) {
2541 // special case this since the default is way, way too verbose
2542- return "<js function>";
2543+ return '<js function>';
2544 } else {
2545- return "" + o;
2546+ return '' + o;
2547 }
2548 }
2549
2550@@ -322,7 +323,7 @@
2551 link = new St.Label({ text: '<error>' });
2552 }
2553 let hbox = new St.BoxLayout();
2554- let propText = propName + ": " + valueStr;
2555+ let propText = propName + ': ' + valueStr;
2556 hbox.add(new St.Label({ text: propName + ': ' }));
2557 hbox.add(link);
2558 this._container.add_actor(hbox);
2559@@ -343,7 +344,7 @@
2560 this.actor.move_anchor_point(Math.floor(sourceX + sourceWidth / 2),
2561 Math.floor(sourceY + sourceHeight / 2));
2562 Tweener.addTween(this.actor, { scale_x: 1, scale_y: 1,
2563- transition: "easeOutQuad",
2564+ transition: 'easeOutQuad',
2565 time: 0.2 });
2566 } else {
2567 this.actor.set_scale(1, 1);
2568@@ -710,27 +711,23 @@
2569 text: meta.description || 'No description' });
2570 box.add(description, { expand: true });
2571
2572- let metaBox = new St.BoxLayout();
2573+ let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' });
2574 box.add(metaBox);
2575 let stateString = this._stateToString(meta.state);
2576 let state = new St.Label({ style_class: 'lg-extension-state',
2577 text: this._stateToString(meta.state) });
2578-
2579- let actionsContainer = new St.Bin({ x_align: St.Align.END });
2580- metaBox.add(actionsContainer);
2581- let actionsBox = new St.BoxLayout({ style_class: 'lg-extension-actions' });
2582- actionsContainer.set_child(actionsBox);
2583+ metaBox.add(state);
2584
2585 let viewsource = new Link.Link({ label: _("View Source") });
2586 viewsource.actor._extensionMeta = meta;
2587 viewsource.actor.connect('clicked', Lang.bind(this, this._onViewSource));
2588- actionsBox.add(viewsource.actor);
2589+ metaBox.add(viewsource.actor);
2590
2591 if (meta.url) {
2592 let webpage = new Link.Link({ label: _("Web Page") });
2593 webpage.actor._extensionMeta = meta;
2594 webpage.actor.connect('clicked', Lang.bind(this, this._onWebPage));
2595- actionsBox.add(webpage.actor);
2596+ metaBox.add(webpage.actor);
2597 }
2598
2599 return box;
2600@@ -820,6 +817,7 @@
2601 entryArea.add(label);
2602
2603 this._entry = new St.Entry({ can_focus: true });
2604+ ShellEntry.addContextMenu(this._entry);
2605 entryArea.add(this._entry, { expand: true });
2606
2607 this._windowList = new WindowList();
2608
2609=== modified file 'js/ui/magnifier.js'
2610--- js/ui/magnifier.js 2011-02-25 12:23:23 +0000
2611+++ js/ui/magnifier.js 2012-01-18 14:13:28 +0000
2612@@ -1,4 +1,4 @@
2613-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2614+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2615
2616 const Clutter = imports.gi.Clutter;
2617 const Gio = imports.gi.Gio;
2618
2619=== modified file 'js/ui/magnifierDBus.js'
2620--- js/ui/magnifierDBus.js 2011-01-12 23:41:41 +0000
2621+++ js/ui/magnifierDBus.js 2012-01-18 14:13:28 +0000
2622@@ -1,4 +1,4 @@
2623-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2624+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2625
2626 const DBus = imports.dbus;
2627 const Main = imports.ui.main;
2628
2629=== modified file 'js/ui/main.js'
2630--- js/ui/main.js 2011-09-22 08:50:45 +0000
2631+++ js/ui/main.js 2012-01-18 14:13:28 +0000
2632@@ -1,4 +1,4 @@
2633-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2634+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2635
2636 const Clutter = imports.gi.Clutter;
2637 const DBus = imports.dbus;
2638@@ -129,8 +129,6 @@
2639 function _initUserSession() {
2640 _initRecorder();
2641
2642- keyboard.init();
2643-
2644 global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT, false, -1, 1);
2645
2646 ExtensionSystem.init();
2647@@ -496,9 +494,9 @@
2648 function notifyError(msg, details) {
2649 // Also print to stderr so it's logged somewhere
2650 if (details)
2651- log("error: " + msg + ": " + details);
2652+ log('error: ' + msg + ': ' + details);
2653 else
2654- log("error: " + msg)
2655+ log('error: ' + msg);
2656
2657 notify(msg, details);
2658 }
2659
2660=== modified file 'js/ui/messageTray.js'
2661--- js/ui/messageTray.js 2011-09-28 06:48:58 +0000
2662+++ js/ui/messageTray.js 2012-01-18 14:13:28 +0000
2663@@ -1,4 +1,4 @@
2664-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2665+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2666
2667 const Clutter = imports.gi.Clutter;
2668 const GLib = imports.gi.GLib;
2669@@ -252,7 +252,8 @@
2670 this._prevFocusedWindow = global.display.focus_window;
2671 this._prevKeyFocusActor = global.stage.get_key_focus();
2672
2673- if (!Main.overview.visible)
2674+ if (global.stage_input_mode == Shell.StageInputMode.NONREACTIVE ||
2675+ global.stage_input_mode == Shell.StageInputMode.NORMAL)
2676 global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
2677
2678 // Use captured-event to notice clicks outside the focused actor
2679@@ -702,6 +703,7 @@
2680 this._imageBin.opacity = 230;
2681 this._table.add_style_class_name('multi-line-notification');
2682 this._table.add_style_class_name('notification-with-image');
2683+ this._addBannerBody();
2684 this._updateLastColumnSettings();
2685 this._table.add(this._imageBin, { row: 1,
2686 col: 1,
2687@@ -1585,7 +1587,7 @@
2688
2689 summaryItemToRemove.actor.destroy();
2690
2691- if (needUpdate);
2692+ if (needUpdate)
2693 this._updateState();
2694 },
2695
2696
2697=== modified file 'js/ui/modalDialog.js'
2698--- js/ui/modalDialog.js 2011-09-21 16:26:15 +0000
2699+++ js/ui/modalDialog.js 2012-01-18 14:13:28 +0000
2700@@ -1,4 +1,4 @@
2701-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2702+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2703
2704 const Clutter = imports.gi.Clutter;
2705 const Gdk = imports.gi.Gdk;
2706
2707=== modified file 'js/ui/networkAgent.js'
2708--- js/ui/networkAgent.js 2011-09-21 16:26:15 +0000
2709+++ js/ui/networkAgent.js 2012-01-18 14:13:28 +0000
2710@@ -1,5 +1,5 @@
2711-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
2712- *
2713+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2714+/*
2715 * Copyright 2011 Giovanni Campagna <scampa.giovanni@gmail.com>
2716 *
2717 * This program is free software; you can redistribute it and/or modify
2718@@ -30,6 +30,7 @@
2719
2720 const ModalDialog = imports.ui.modalDialog;
2721 const PopupMenu = imports.ui.popupMenu;
2722+const ShellEntry = imports.ui.shellEntry;
2723
2724 function NetworkSecretDialog() {
2725 this._init.apply(this, arguments);
2726@@ -103,6 +104,8 @@
2727 secret.entry = new St.Entry({ style_class: 'polkit-dialog-password-entry',
2728 text: secret.value, can_focus: reactive,
2729 reactive: reactive });
2730+ ShellEntry.addContextMenu(secret.entry,
2731+ { isPassword: secret.password });
2732
2733 if (secret.validate)
2734 secret.valid = secret.validate(secret);
2735@@ -127,34 +130,14 @@
2736 } else
2737 secret.valid = true;
2738
2739- secretTable.add(label, { row: pos, col: 0, x_align: St.Align.START, y_align: St.Align.START });
2740+ secretTable.add(label, { row: pos, col: 0, x_expand: false, x_fill: true, x_align: St.Align.START, y_align: St.Align.START });
2741 secretTable.add(secret.entry, { row: pos, col: 1, x_expand: true, x_fill: true, y_align: St.Align.END });
2742 pos++;
2743
2744- if (secret.password) {
2745+ if (secret.password)
2746 secret.entry.clutter_text.set_password_char('\u25cf');
2747+ }
2748
2749- // FIXME: need a real checkbox here
2750- let button = new St.Button({ button_mask: St.ButtonMask.ONE,
2751- can_focus: true });
2752- let checkbox = new St.BoxLayout({ vertical: false,
2753- style_class: 'network-dialog-show-password-checkbox'
2754- });
2755- let _switch = new PopupMenu.Switch(false);
2756- checkbox.add(_switch.actor);
2757- checkbox.add(new St.Label({ text: _("Show password") }), { expand: true });
2758- button.connect('clicked', function() {
2759- _switch.toggle();
2760- if (_switch.state)
2761- secret.entry.clutter_text.set_password_char('');
2762- else
2763- secret.entry.clutter_text.set_password_char('\u25cf');
2764- });
2765- button.child = checkbox;
2766- secretTable.add(button, { row: pos, col: 1, x_expand: true, x_fill: true, y_fill: true })
2767- pos++;
2768- }
2769- }
2770 messageBox.add(secretTable);
2771
2772 this._okButton = { label: _("Connect"),
2773@@ -404,4 +387,4 @@
2774 this._dialogs[requestId].close(global.get_current_time());
2775 this._dialogs[requestId].destroy();
2776 }
2777-};
2778\ No newline at end of file
2779+};
2780
2781=== modified file 'js/ui/notificationDaemon.js'
2782--- js/ui/notificationDaemon.js 2011-09-04 08:02:35 +0000
2783+++ js/ui/notificationDaemon.js 2012-01-18 14:13:28 +0000
2784@@ -1,4 +1,4 @@
2785-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2786+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2787
2788 const Clutter = imports.gi.Clutter;
2789 const DBus = imports.dbus;
2790@@ -109,6 +109,14 @@
2791 _iconForNotificationData: function(icon, hints, size) {
2792 let textureCache = St.TextureCache.get_default();
2793
2794+ // If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon
2795+ // and don't show a large image. There are currently many applications that use
2796+ // notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets
2797+ // the 'image-data' hint. These applications don't typically pass in 'app_icon'
2798+ // argument to Notify() and actually expect the pixbuf to be shown as an icon.
2799+ // So the logic here does the right thing for this case. If both an icon and either
2800+ // one of 'image-data' or 'image-path' are specified, we show both an icon and
2801+ // a large image.
2802 if (icon) {
2803 if (icon.substr(0, 7) == 'file://')
2804 return textureCache.load_uri_async(icon, size, size);
2805@@ -119,6 +127,12 @@
2806 return new St.Icon({ icon_name: icon,
2807 icon_type: St.IconType.FULLCOLOR,
2808 icon_size: size });
2809+ } else if (hints['image-data']) {
2810+ let [width, height, rowStride, hasAlpha,
2811+ bitsPerSample, nChannels, data] = hints['image-data'];
2812+ return textureCache.load_from_raw(data, hasAlpha, width, height, rowStride, size);
2813+ } else if (hints['image-path']) {
2814+ return textureCache.load_uri_async(GLib.filename_to_uri(hints['image-path'], null), size, size);
2815 } else {
2816 let stockIcon;
2817 switch (hints.urgency) {
2818@@ -330,7 +344,8 @@
2819 clear: true });
2820 }
2821
2822- if (hints['image-data'] || hints['image-path']) {
2823+ // We only display a large image if an icon is also specified.
2824+ if (icon && (hints['image-data'] || hints['image-path'])) {
2825 let image = null;
2826 if (hints['image-data']) {
2827 let [width, height, rowStride, hasAlpha,
2828
2829=== modified file 'js/ui/overview.js'
2830--- js/ui/overview.js 2011-09-21 16:26:15 +0000
2831+++ js/ui/overview.js 2012-01-18 14:13:28 +0000
2832@@ -1,4 +1,4 @@
2833-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2834+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2835
2836 const Clutter = imports.gi.Clutter;
2837 const Gtk = imports.gi.Gtk;
2838
2839=== modified file 'js/ui/panel.js'
2840--- js/ui/panel.js 2011-09-21 16:26:15 +0000
2841+++ js/ui/panel.js 2012-01-18 14:13:28 +0000
2842@@ -1,4 +1,4 @@
2843-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2844+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2845
2846 const Cairo = imports.cairo;
2847 const Clutter = imports.gi.Clutter;
2848
2849=== modified file 'js/ui/panelMenu.js'
2850--- js/ui/panelMenu.js 2011-09-21 16:26:15 +0000
2851+++ js/ui/panelMenu.js 2012-01-18 14:13:28 +0000
2852@@ -1,4 +1,4 @@
2853-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2854+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2855
2856 const Clutter = imports.gi.Clutter;
2857 const Gtk = imports.gi.Gtk;
2858
2859=== modified file 'js/ui/placeDisplay.js'
2860--- js/ui/placeDisplay.js 2011-09-04 08:02:35 +0000
2861+++ js/ui/placeDisplay.js 2012-01-18 14:13:28 +0000
2862@@ -1,4 +1,4 @@
2863-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2864+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2865
2866 const GLib = imports.gi.GLib;
2867 const Gio = imports.gi.Gio;
2868
2869=== modified file 'js/ui/polkitAuthenticationAgent.js'
2870--- js/ui/polkitAuthenticationAgent.js 2011-09-21 16:26:15 +0000
2871+++ js/ui/polkitAuthenticationAgent.js 2012-01-18 14:13:28 +0000
2872@@ -1,5 +1,5 @@
2873-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
2874- *
2875+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2876+/*
2877 * Copyright 2010 Red Hat, Inc
2878 *
2879 * This program is free software; you can redistribute it and/or modify
2880@@ -33,6 +33,7 @@
2881 const PolkitAgent = imports.gi.PolkitAgent;
2882
2883 const ModalDialog = imports.ui.modalDialog;
2884+const ShellEntry = imports.ui.shellEntry;
2885
2886 function AuthenticationDialog(actionId, message, cookie, userNames) {
2887 this._init(actionId, message, cookie, userNames);
2888@@ -139,6 +140,7 @@
2889 this._passwordEntry = new St.Entry({ style_class: 'polkit-dialog-password-entry',
2890 text: "",
2891 can_focus: true});
2892+ ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
2893 this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivate));
2894 this._passwordBox.add(this._passwordEntry,
2895 {expand: true });
2896
2897=== modified file 'js/ui/popupMenu.js'
2898--- js/ui/popupMenu.js 2011-09-28 00:41:45 +0000
2899+++ js/ui/popupMenu.js 2012-01-18 14:13:28 +0000
2900@@ -1,4 +1,4 @@
2901-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2902+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2903
2904 const Cairo = imports.cairo;
2905 const Clutter = imports.gi.Clutter;
2906@@ -1142,10 +1142,10 @@
2907 PopupMenu.prototype = {
2908 __proto__: PopupMenuBase.prototype,
2909
2910- _init: function(sourceActor, alignment, arrowSide) {
2911+ _init: function(sourceActor, arrowAlignment, arrowSide) {
2912 PopupMenuBase.prototype._init.call (this, sourceActor, 'popup-menu-content');
2913
2914- this._alignment = alignment;
2915+ this._arrowAlignment = arrowAlignment;
2916 this._arrowSide = arrowSide;
2917
2918 this._boxPointer = new BoxPointer.BoxPointer(arrowSide,
2919@@ -1198,13 +1198,17 @@
2920 this._boxPointer.setArrowOrigin(origin);
2921 },
2922
2923+ setSourceAlignment: function(alignment) {
2924+ this._boxPointer.setSourceAlignment(alignment);
2925+ },
2926+
2927 open: function(animate) {
2928 if (this.isOpen)
2929 return;
2930
2931 this.isOpen = true;
2932
2933- this._boxPointer.setPosition(this.sourceActor, this._alignment);
2934+ this._boxPointer.setPosition(this.sourceActor, this._arrowAlignment);
2935 this._boxPointer.show(animate);
2936
2937 this.actor.raise_top();
2938
2939=== modified file 'js/ui/runDialog.js'
2940--- js/ui/runDialog.js 2011-08-24 02:33:44 +0000
2941+++ js/ui/runDialog.js 2012-01-18 14:13:28 +0000
2942@@ -1,4 +1,4 @@
2943-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2944+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2945
2946 const Clutter = imports.gi.Clutter;
2947 const Gio = imports.gi.Gio;
2948@@ -12,6 +12,7 @@
2949 const FileUtils = imports.misc.fileUtils;
2950 const Main = imports.ui.main;
2951 const ModalDialog = imports.ui.modalDialog;
2952+const ShellEntry = imports.ui.shellEntry;
2953 const Tweener = imports.ui.tweener;
2954 const Util = imports.misc.util;
2955 const History = imports.misc.history;
2956@@ -210,6 +211,7 @@
2957 this.contentLayout.add(label, { y_align: St.Align.START });
2958
2959 let entry = new St.Entry({ style_class: 'run-dialog-entry' });
2960+ ShellEntry.addContextMenu(entry);
2961
2962 this._entryText = entry.clutter_text;
2963 this.contentLayout.add(entry, { y_align: St.Align.START });
2964
2965=== modified file 'js/ui/scripting.js'
2966--- js/ui/scripting.js 2011-08-24 02:33:44 +0000
2967+++ js/ui/scripting.js 2012-01-18 14:13:28 +0000
2968@@ -1,4 +1,4 @@
2969-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2970+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2971
2972 const DBus = imports.dbus;
2973 const Gio = imports.gi.Gio;
2974
2975=== modified file 'js/ui/search.js'
2976--- js/ui/search.js 2011-09-21 16:26:15 +0000
2977+++ js/ui/search.js 2012-01-18 14:13:28 +0000
2978@@ -1,4 +1,4 @@
2979-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2980+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2981
2982 const Gio = imports.gi.Gio;
2983 const GLib = imports.gi.GLib;
2984
2985=== modified file 'js/ui/searchDisplay.js'
2986--- js/ui/searchDisplay.js 2011-09-21 16:26:15 +0000
2987+++ js/ui/searchDisplay.js 2012-01-18 14:13:28 +0000
2988@@ -1,4 +1,4 @@
2989-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2990+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2991
2992 const Clutter = imports.gi.Clutter;
2993 const Lang = imports.lang;
2994
2995=== modified file 'js/ui/shellDBus.js'
2996--- js/ui/shellDBus.js 2011-09-21 16:26:15 +0000
2997+++ js/ui/shellDBus.js 2012-01-18 14:13:28 +0000
2998@@ -1,4 +1,4 @@
2999-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3000+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3001
3002 const DBus = imports.dbus;
3003 const Lang = imports.lang;
3004
3005=== added file 'js/ui/shellEntry.js'
3006--- js/ui/shellEntry.js 1970-01-01 00:00:00 +0000
3007+++ js/ui/shellEntry.js 2012-01-18 14:13:28 +0000
3008@@ -0,0 +1,173 @@
3009+const Clutter = imports.gi.Clutter;
3010+const Gtk = imports.gi.Gtk;
3011+const Lang = imports.lang;
3012+const St = imports.gi.St;
3013+
3014+const Main = imports.ui.main;
3015+const Params = imports.misc.params;
3016+const PopupMenu = imports.ui.popupMenu;
3017+
3018+
3019+function _EntryMenu(entry, params) {
3020+ this._init(entry, params);
3021+};
3022+
3023+_EntryMenu.prototype = {
3024+ __proto__: PopupMenu.PopupMenu.prototype,
3025+
3026+ _init: function(entry, params) {
3027+ params = Params.parse (params, { isPassword: false });
3028+
3029+ PopupMenu.PopupMenu.prototype._init.call(this, entry, 0, St.Side.TOP);
3030+
3031+ this.actor.add_style_class_name('entry-context-menu');
3032+
3033+ this._entry = entry;
3034+ this._clipboard = St.Clipboard.get_default();
3035+
3036+ // Populate menu
3037+ let item;
3038+ item = new PopupMenu.PopupMenuItem(_("Copy"));
3039+ item.connect('activate', Lang.bind(this, this._onCopyActivated));
3040+ this.addMenuItem(item);
3041+ this._copyItem = item;
3042+
3043+ item = new PopupMenu.PopupMenuItem(_("Paste"));
3044+ item.connect('activate', Lang.bind(this, this._onPasteActivated));
3045+ this.addMenuItem(item);
3046+ this._pasteItem = item;
3047+
3048+ this._passwordItem = null;
3049+ if (params.isPassword) {
3050+ item = new PopupMenu.PopupMenuItem('');
3051+ item.connect('activate', Lang.bind(this,
3052+ this._onPasswordActivated));
3053+ this.addMenuItem(item);
3054+ this._passwordItem = item;
3055+ }
3056+
3057+ Main.uiGroup.add_actor(this.actor);
3058+ this.actor.hide();
3059+ },
3060+
3061+ open: function() {
3062+ this._updatePasteItem();
3063+ this._updateCopyItem();
3064+ if (this._passwordItem)
3065+ this._updatePasswordItem();
3066+
3067+ let direction = Gtk.DirectionType.TAB_FORWARD;
3068+ if (!this.actor.navigate_focus(null, direction, false))
3069+ this.actor.grab_key_focus();
3070+
3071+ PopupMenu.PopupMenu.prototype.open.call(this);
3072+ },
3073+
3074+ _updateCopyItem: function() {
3075+ let selection = this._entry.clutter_text.get_selection();
3076+ this._copyItem.setSensitive(selection && selection != '');
3077+ },
3078+
3079+ _updatePasteItem: function() {
3080+ this._clipboard.get_text(Lang.bind(this,
3081+ function(clipboard, text) {
3082+ this._pasteItem.setSensitive(text && text != '');
3083+ }));
3084+ },
3085+
3086+ _updatePasswordItem: function() {
3087+ let textHidden = (this._entry.clutter_text.password_char);
3088+ if (textHidden)
3089+ this._passwordItem.label.set_text(_("Show Text"));
3090+ else
3091+ this._passwordItem.label.set_text(_("Hide Text"));
3092+ },
3093+
3094+ _onCopyActivated: function() {
3095+ let selection = this._entry.clutter_text.get_selection();
3096+ this._clipboard.set_text(selection);
3097+ },
3098+
3099+ _onPasteActivated: function() {
3100+ this._clipboard.get_text(Lang.bind(this,
3101+ function(clipboard, text) {
3102+ if (!text)
3103+ return;
3104+ this._entry.clutter_text.delete_selection();
3105+ let pos = this._entry.clutter_text.get_cursor_position();
3106+ this._entry.clutter_text.insert_text(text, pos);
3107+ }));
3108+ },
3109+
3110+ _onPasswordActivated: function() {
3111+ let visible = !!(this._entry.clutter_text.password_char);
3112+ this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf');
3113+ }
3114+};
3115+
3116+
3117+function _setMenuAlignment(entry, stageX) {
3118+ let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0);
3119+ if (success)
3120+ entry._menu.setSourceAlignment(entryX / entry.width);
3121+};
3122+
3123+function _onClicked(action, actor) {
3124+ let entry = actor._menu ? actor : actor.get_parent();
3125+
3126+ if (entry._menu.isOpen) {
3127+ entry._menu.close();
3128+ } else if (action.get_button() == 3) {
3129+ let [stageX, stageY] = action.get_coords();
3130+ _setMenuAlignment(entry, stageX);
3131+ entry._menu.open();
3132+ }
3133+};
3134+
3135+function _onLongPress(action, actor, state) {
3136+ let entry = actor._menu ? actor : actor.get_parent();
3137+
3138+ if (state == Clutter.LongPressState.QUERY)
3139+ return action.get_button() == 1 && !entry._menu.isOpen;
3140+
3141+ if (state == Clutter.LongPressState.ACTIVATE) {
3142+ let [stageX, stageY] = action.get_coords();
3143+ _setMenuAlignment(entry, stageX);
3144+ entry._menu.open();
3145+ }
3146+ return false;
3147+};
3148+
3149+function _onPopup(actor) {
3150+ let entry = actor._menu ? actor : actor.get_parent();
3151+ let [success, textX, textY, lineHeight] = entry.clutter_text.position_to_coords(-1);
3152+ if (success)
3153+ entry._menu.setSourceAlignment(textX / entry.width);
3154+ entry._menu.open();
3155+};
3156+
3157+function addContextMenu(entry, params) {
3158+ if (entry._menu)
3159+ return;
3160+
3161+ entry._menu = new _EntryMenu(entry, params);
3162+ entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry });
3163+ entry._menuManager.addMenu(entry._menu);
3164+
3165+ let clickAction;
3166+
3167+ // Add a click action to both the entry and its clutter_text; the former
3168+ // so padding is included in the clickable area, the latter because the
3169+ // event processing of ClutterText prevents event-bubbling.
3170+ clickAction = new Clutter.ClickAction();
3171+ clickAction.connect('clicked', _onClicked);
3172+ clickAction.connect('long-press', _onLongPress);
3173+ entry.clutter_text.add_action(clickAction);
3174+
3175+ clickAction = new Clutter.ClickAction();
3176+ clickAction.connect('clicked', _onClicked);
3177+ clickAction.connect('long-press', _onLongPress);
3178+ entry.add_action(clickAction);
3179+
3180+ entry.connect('popup-menu', _onPopup);
3181+}
3182
3183=== modified file 'js/ui/shellMountOperation.js'
3184--- js/ui/shellMountOperation.js 2011-09-04 08:02:35 +0000
3185+++ js/ui/shellMountOperation.js 2012-01-18 14:13:28 +0000
3186@@ -1,4 +1,4 @@
3187-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3188+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3189
3190 const Lang = imports.lang;
3191 const Signals = imports.signals;
3192
3193=== modified file 'js/ui/status/accessibility.js'
3194--- js/ui/status/accessibility.js 2011-09-21 16:26:15 +0000
3195+++ js/ui/status/accessibility.js 2012-01-18 14:13:28 +0000
3196@@ -1,4 +1,4 @@
3197-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3198+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3199
3200 const DBus = imports.dbus;
3201 const GConf = imports.gi.GConf;
3202
3203=== modified file 'js/ui/status/bluetooth.js'
3204--- js/ui/status/bluetooth.js 2011-09-04 08:02:35 +0000
3205+++ js/ui/status/bluetooth.js 2012-01-18 14:13:28 +0000
3206@@ -1,4 +1,4 @@
3207-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3208+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3209
3210 const Clutter = imports.gi.Clutter;
3211 const Gdk = imports.gi.Gdk;
3212@@ -205,7 +205,8 @@
3213 _buildDeviceSubMenu: function(item, device) {
3214 if (device.can_connect) {
3215 item._connected = device.connected;
3216- item._connectedMenuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
3217+ let menuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
3218+ item._connectedMenuitem = menuitem;
3219 item._connectedMenuitem.connect('toggled', Lang.bind(this, function() {
3220 if (item._connected > ConnectionState.CONNECTED) {
3221 // operation already in progress, revert
3222
3223=== modified file 'js/ui/status/keyboard.js'
3224--- js/ui/status/keyboard.js 2011-09-21 16:26:15 +0000
3225+++ js/ui/status/keyboard.js 2012-01-18 14:13:28 +0000
3226@@ -1,4 +1,4 @@
3227-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3228+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3229
3230 const Clutter = imports.gi.Clutter;
3231 const GdkPixbuf = imports.gi.GdkPixbuf;
3232
3233=== modified file 'js/ui/status/network.js'
3234--- js/ui/status/network.js 2011-09-21 16:26:15 +0000
3235+++ js/ui/status/network.js 2012-01-18 14:13:28 +0000
3236@@ -1,4 +1,4 @@
3237-// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
3238+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3239 const ByteArray = imports.byteArray;
3240 const DBus = imports.dbus;
3241 const GLib = imports.gi.GLib;
3242
3243=== modified file 'js/ui/status/power.js'
3244--- js/ui/status/power.js 2011-09-22 08:50:45 +0000
3245+++ js/ui/status/power.js 2012-01-18 14:13:28 +0000
3246@@ -1,4 +1,4 @@
3247-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3248+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3249
3250 const Gio = imports.gi.Gio;
3251 const DBus = imports.dbus;
3252@@ -43,8 +43,8 @@
3253 const PowerManagerInterface = {
3254 name: 'org.gnome.SettingsDaemon.Power',
3255 methods: [
3256- { name: 'GetDevices', inSignature: '', outSignature: 'a(susbut)' },
3257- { name: 'GetPrimaryDevice', inSignature: '', outSignature: '(susbut)' },
3258+ { name: 'GetDevices', inSignature: '', outSignature: 'a(susdut)' },
3259+ { name: 'GetPrimaryDevice', inSignature: '', outSignature: '(susdut)' },
3260 ],
3261 signals: [
3262 { name: 'Changed', inSignature: '' },
3263@@ -155,7 +155,7 @@
3264 _devicesChanged: function() {
3265 this._proxy.GetRemote('Icon', Lang.bind(this, function(icon, error) {
3266 if (icon) {
3267- let gicon = Shell.util_icon_from_string (icon);
3268+ let gicon = Gio.icon_new_for_string(icon);
3269 this.setGIcon(gicon);
3270 this.actor.show();
3271 } else {
3272@@ -183,7 +183,7 @@
3273 this._box = new St.BoxLayout({ style_class: 'popup-device-menu-item' });
3274 this._label = new St.Label({ text: this._deviceTypeToString(device_type) });
3275
3276- this._icon = new St.Icon({ gicon: Shell.util_icon_from_string(icon),
3277+ this._icon = new St.Icon({ gicon: Gio.icon_new_for_string(icon),
3278 icon_type: St.IconType.SYMBOLIC,
3279 style_class: 'popup-menu-icon' });
3280
3281
3282=== modified file 'js/ui/status/volume.js'
3283--- js/ui/status/volume.js 2011-09-21 16:26:15 +0000
3284+++ js/ui/status/volume.js 2012-01-18 14:13:28 +0000
3285@@ -1,4 +1,4 @@
3286-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3287+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3288
3289 const Clutter = imports.gi.Clutter;
3290 const DBus = imports.dbus;
3291
3292=== modified file 'js/ui/statusIconDispatcher.js'
3293--- js/ui/statusIconDispatcher.js 2011-04-11 21:03:31 +0000
3294+++ js/ui/statusIconDispatcher.js 2012-01-18 14:13:28 +0000
3295@@ -1,4 +1,4 @@
3296-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3297+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3298
3299 const Lang = imports.lang;
3300 const Shell = imports.gi.Shell;
3301
3302=== modified file 'js/ui/telepathyClient.js'
3303--- js/ui/telepathyClient.js 2011-09-28 00:41:45 +0000
3304+++ js/ui/telepathyClient.js 2012-01-18 14:13:28 +0000
3305@@ -1,4 +1,4 @@
3306-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3307+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3308
3309 const DBus = imports.dbus;
3310 const Gio = imports.gi.Gio;
3311@@ -257,7 +257,7 @@
3312 // FIXME: We don't have a 'chat room' icon (bgo #653737) use
3313 // system-users for now as Empathy does.
3314 let source = new ApproverSource(dispatchOp, _("Invitation"),
3315- Shell.util_icon_from_string('system-users'));
3316+ Gio.icon_new_for_string('system-users'));
3317 Main.messageTray.add(source);
3318
3319 let notif = new RoomInviteNotification(source, dispatchOp, channel, contacts[0]);
3320@@ -325,8 +325,8 @@
3321
3322 // We got the TpContact
3323 let source = new ApproverSource(dispatchOp, _("Call"), isVideo ?
3324- Shell.util_icon_from_string('camera-web') :
3325- Shell.util_icon_from_string('audio-input-microphone'));
3326+ Gio.icon_new_for_string('camera-web') :
3327+ Gio.icon_new_for_string('audio-input-microphone'));
3328 Main.messageTray.add(source);
3329
3330 let notif = new AudioVideoNotification(source, dispatchOp, channel, contacts[0], isVideo);
3331@@ -539,9 +539,13 @@
3332
3333 _updateAlias: function() {
3334 let oldAlias = this.title;
3335- this.setTitle(this._contact.get_alias());
3336- this._notification.appendAliasChange(oldAlias, this.title);
3337- this.pushNotification(this._notification);
3338+ let newAlias = this._contact.get_alias();
3339+
3340+ if (oldAlias == newAlias)
3341+ return;
3342+
3343+ this.setTitle(newAlias);
3344+ this._notification.appendAliasChange(oldAlias, newAlias);
3345 },
3346
3347 createNotificationIcon: function() {
3348@@ -570,7 +574,7 @@
3349 open: function(notification) {
3350 if (this._client.is_handling_channel(this._channel)) {
3351 // We are handling the channel, try to pass it to Empathy
3352- this._client.delegate_channels_async([this._channel], global.get_current_time(), "", null);
3353+ this._client.delegate_channels_async([this._channel], global.get_current_time(), '', null);
3354 }
3355 else {
3356 // We are not the handler, just ask to present the channel
3357@@ -1198,6 +1202,7 @@
3358 this.setResident(true);
3359
3360 this.addButton('reject', _("Reject"));
3361+ /* translators: this is a button label (verb), not a noun */
3362 this.addButton('answer', _("Answer"));
3363
3364 this.connect('action-invoked', Lang.bind(this, function(self, action) {
3365
3366=== modified file 'js/ui/tweener.js'
3367--- js/ui/tweener.js 2011-02-25 12:23:23 +0000
3368+++ js/ui/tweener.js 2012-01-18 14:13:28 +0000
3369@@ -1,4 +1,4 @@
3370-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3371+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3372
3373 const Clutter = imports.gi.Clutter;
3374 const Lang = imports.lang;
3375
3376=== modified file 'js/ui/userMenu.js'
3377--- js/ui/userMenu.js 2011-09-21 16:26:15 +0000
3378+++ js/ui/userMenu.js 2012-01-18 14:13:28 +0000
3379@@ -1,4 +1,4 @@
3380-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3381+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3382
3383 const AccountsService = imports.gi.AccountsService;
3384 const DBus = imports.dbus;
3385@@ -158,22 +158,29 @@
3386 Lang.bind(this, this._changeIMStatus));
3387
3388 this._presence = new GnomeSession.Presence();
3389- this._presence.getStatus(Lang.bind(this, this._sessionStatusChanged));
3390 this._presence.connect('StatusChanged',
3391 Lang.bind(this, this._sessionStatusChanged));
3392
3393+ this._sessionPresenceRestored = false;
3394+ this._imPresenceRestored = false;
3395 this._currentPresence = undefined;
3396- this._previousPresence = undefined;
3397
3398 this._accountMgr = Tp.AccountManager.dup()
3399 this._accountMgr.connect('most-available-presence-changed',
3400 Lang.bind(this, this._IMStatusChanged));
3401 this._accountMgr.prepare_async(null, Lang.bind(this,
3402 function(mgr) {
3403- let [presence, s, msg] = mgr.get_most_available_presence();
3404+ let [presence, status, msg] = mgr.get_most_available_presence();
3405
3406- this._previousPresence = presence;
3407- this._IMStatusChanged(mgr, presence, s, msg);
3408+ let savedPresence = global.settings.get_int('saved-im-presence');
3409+ if (savedPresence == presence) {
3410+ this._IMStatusChanged(mgr, presence, status, msg);
3411+ } else {
3412+ this._setComboboxPresence(savedPresence);
3413+ status = this._statusForPresence(savedPresence);
3414+ msg = msg ? msg : '';
3415+ mgr.set_all_requested_presences(savedPresence, status, msg);
3416+ }
3417 }));
3418
3419 this._userManager = AccountsService.UserManager.get_default();
3420@@ -261,19 +268,35 @@
3421 },
3422
3423 _IMStatusChanged: function(accountMgr, presence, status, message) {
3424+ if (!this._imPresenceRestored)
3425+ this._imPresenceRestored = true;
3426+
3427 if (presence == this._currentPresence)
3428 return;
3429
3430 this._currentPresence = presence;
3431+ this._setComboboxPresence(presence);
3432+
3433+ if (!this._sessionPresenceRestored) {
3434+ this._presence.getStatus(Lang.bind(this, this._sessionStatusChanged));
3435+ return;
3436+ }
3437
3438 if (presence == Tp.ConnectionPresenceType.AVAILABLE)
3439 this._presence.setStatus(GnomeSession.PresenceStatus.AVAILABLE);
3440
3441- if (!this._expectedPresence || presence != this._expectedPresence)
3442- this._previousPresence = presence;
3443+ // We ignore the actual value of _expectedPresence and never safe
3444+ // the first presence change after an "automatic" change, assuming
3445+ // that it is the response to our request; this is to account for
3446+ // mission control falling back to "similar" presences if an account
3447+ // type does not implement the requested presence.
3448+ if (!this._expectedPresence)
3449+ global.settings.set_int('saved-im-presence', presence);
3450 else
3451 this._expectedPresence = undefined;
3452+ },
3453
3454+ _setComboboxPresence: function(presence) {
3455 let activatedItem;
3456
3457 if (presence == Tp.ConnectionPresenceType.AVAILABLE)
3458@@ -310,13 +333,16 @@
3459 return;
3460
3461 status = this._statusForPresence(newPresence);
3462- msg = msg ? msg : "";
3463+ msg = msg ? msg : '';
3464 this._accountMgr.set_all_requested_presences(newPresence, status, msg);
3465 },
3466
3467 getIMPresenceForSessionStatus: function(sessionStatus) {
3468+ // Restore the last user-set presence when coming back from
3469+ // BUSY/IDLE (otherwise the last user-set presence matches
3470+ // the current one)
3471 if (sessionStatus == GnomeSession.PresenceStatus.AVAILABLE)
3472- return this._previousPresence;
3473+ return global.settings.get_int('saved-im-presence');
3474
3475 if (sessionStatus == GnomeSession.PresenceStatus.BUSY) {
3476 // Only change presence if the current one is "more present" than
3477@@ -337,6 +363,20 @@
3478 },
3479
3480 _sessionStatusChanged: function(sessionPresence, sessionStatus) {
3481+ if (!this._imPresenceRestored)
3482+ return;
3483+
3484+ if (!this._sessionPresenceRestored) {
3485+ let savedStatus = global.settings.get_int('saved-session-presence');
3486+ if (sessionStatus != savedStatus) {
3487+ this._presence.setStatus(savedStatus);
3488+ return;
3489+ }
3490+ this._sessionPresenceRestored = true;
3491+ }
3492+
3493+ global.settings.set_int('saved-session-presence', sessionStatus);
3494+
3495 let [presence, s, msg] = this._accountMgr.get_most_available_presence();
3496 let newPresence, status;
3497
3498@@ -346,7 +386,7 @@
3499 return;
3500
3501 status = this._statusForPresence(newPresence);
3502- msg = msg ? msg : "";
3503+ msg = msg ? msg : '';
3504
3505 this._expectedPresence = newPresence;
3506 this._accountMgr.set_all_requested_presences(newPresence, status, msg);
3507
3508=== modified file 'js/ui/viewSelector.js'
3509--- js/ui/viewSelector.js 2011-09-21 16:26:15 +0000
3510+++ js/ui/viewSelector.js 2012-01-18 14:13:28 +0000
3511@@ -1,4 +1,4 @@
3512-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3513+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3514
3515 const Clutter = imports.gi.Clutter;
3516 const Gtk = imports.gi.Gtk;
3517@@ -12,6 +12,7 @@
3518 const Main = imports.ui.main;
3519 const Search = imports.ui.search;
3520 const SearchDisplay = imports.ui.searchDisplay;
3521+const ShellEntry = imports.ui.shellEntry;
3522 const Tweener = imports.ui.tweener;
3523
3524 function BaseTab(titleActor, pageActor, name, a11yIcon) {
3525@@ -120,6 +121,7 @@
3526 hint_text: _("Type to search..."),
3527 track_hover: true,
3528 can_focus: true });
3529+ ShellEntry.addContextMenu(this._entry);
3530 this._text = this._entry.clutter_text;
3531 this._text.connect('key-press-event', Lang.bind(this, this._onKeyPress));
3532
3533@@ -289,9 +291,11 @@
3534 _onCapturedEvent: function(actor, event) {
3535 if (event.type() == Clutter.EventType.BUTTON_PRESS) {
3536 let source = event.get_source();
3537- if (source != this._text && this._text.text == '') {
3538+ if (source != this._text && this._text.text == '' &&
3539+ !Main.layoutManager.keyboardBox.contains(source)) {
3540 // the user clicked outside after activating the entry, but
3541- // with no search term entered - cancel the search
3542+ // with no search term entered and no keyboard button pressed
3543+ // - cancel the search
3544 this._reset();
3545 }
3546 }
3547
3548=== modified file 'js/ui/windowAttentionHandler.js'
3549--- js/ui/windowAttentionHandler.js 2011-09-04 08:02:35 +0000
3550+++ js/ui/windowAttentionHandler.js 2012-01-18 14:13:28 +0000
3551@@ -1,4 +1,4 @@
3552-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3553+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3554
3555 const Lang = imports.lang;
3556 const Shell = imports.gi.Shell;
3557@@ -12,35 +12,10 @@
3558
3559 WindowAttentionHandler.prototype = {
3560 _init : function() {
3561- this._startupIds = {};
3562 this._tracker = Shell.WindowTracker.get_default();
3563- this._tracker.connect('startup-sequence-changed', Lang.bind(this, this._onStartupSequenceChanged));
3564-
3565 global.display.connect('window-demands-attention', Lang.bind(this, this._onWindowDemandsAttention));
3566 },
3567
3568- _onStartupSequenceChanged : function(tracker) {
3569- let sequences = tracker.get_startup_sequences();
3570- this._startupIds = {};
3571- for(let i = 0; i < sequences.length; i++) {
3572- this._startupIds[sequences[i].get_id()] = true;
3573- }
3574- },
3575-
3576- _getTitle : function(app, window) {
3577- if (this._startupIds[window.get_startup_id()])
3578- return app.get_name();
3579- else
3580- return window.title;
3581- },
3582-
3583- _getBanner : function(app, window) {
3584- if (this._startupIds[window.get_startup_id()])
3585- return _("%s has finished starting").format(app.get_name());
3586- else
3587- return _("'%s' is ready").format(window.title);
3588- },
3589-
3590 _onWindowDemandsAttention : function(display, window) {
3591 // We don't want to show the notification when the window is already focused,
3592 // because this is rather pointless.
3593@@ -57,12 +32,16 @@
3594 let source = new Source(app, window);
3595 Main.messageTray.add(source);
3596
3597- let notification = new MessageTray.Notification(source, this._getTitle(app, window), this._getBanner(app, window));
3598+ let banner = _("'%s' is ready").format(window.title);
3599+ let title = app.get_name();
3600+
3601+ let notification = new MessageTray.Notification(source, title, banner);
3602 source.notify(notification);
3603
3604- source.signalIDs.push(window.connect('notify::title', Lang.bind(this, function(win) {
3605- notification.update(this._getTitle(app, win), this._getBanner(app, win));
3606- })));
3607+ source.signalIDs.push(window.connect('notify::title',
3608+ Lang.bind(this, function() {
3609+ notification.update(title, banner);
3610+ })));
3611 }
3612 };
3613
3614
3615=== modified file 'js/ui/windowManager.js'
3616--- js/ui/windowManager.js 2011-09-21 16:26:15 +0000
3617+++ js/ui/windowManager.js 2012-01-18 14:13:28 +0000
3618@@ -1,4 +1,4 @@
3619-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3620+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3621
3622 const Clutter = imports.gi.Clutter;
3623 const GLib = imports.gi.GLib;
3624@@ -37,28 +37,36 @@
3625
3626 WindowDimmer.prototype = {
3627 _init: function(actor) {
3628- this.effect = new Clutter.ShaderEffect({ shader_type: Clutter.ShaderType.FRAGMENT_SHADER });
3629- this.effect.set_shader_source(getDimShaderSource());
3630+ if (Clutter.feature_available(Clutter.FeatureFlags.SHADERS_GLSL)) {
3631+ this._effect = new Clutter.ShaderEffect({ shader_type: Clutter.ShaderType.FRAGMENT_SHADER });
3632+ this._effect.set_shader_source(getDimShaderSource());
3633+ } else {
3634+ this._effect = null;
3635+ }
3636
3637 this.actor = actor;
3638 },
3639
3640 set dimFraction(fraction) {
3641 this._dimFraction = fraction;
3642+
3643+ if (this._effect == null)
3644+ return;
3645+
3646 if (!Meta.prefs_get_attach_modal_dialogs()) {
3647- this.effect.enabled = false;
3648+ this._effect.enabled = false;
3649 return;
3650 }
3651
3652 if (fraction > 0.01) {
3653- Shell.shader_effect_set_double_uniform(this.effect, 'height', this.actor.get_height());
3654- Shell.shader_effect_set_double_uniform(this.effect, 'fraction', fraction);
3655+ Shell.shader_effect_set_double_uniform(this._effect, 'height', this.actor.get_height());
3656+ Shell.shader_effect_set_double_uniform(this._effect, 'fraction', fraction);
3657
3658- if (!this.effect.actor)
3659- this.actor.add_effect(this.effect);
3660+ if (!this._effect.actor)
3661+ this.actor.add_effect(this._effect);
3662 } else {
3663- if (this.effect.actor)
3664- this.actor.remove_effect(this.effect);
3665+ if (this._effect.actor)
3666+ this.actor.remove_effect(this._effect);
3667 }
3668 },
3669
3670
3671=== modified file 'js/ui/workspace.js'
3672--- js/ui/workspace.js 2011-09-21 16:26:15 +0000
3673+++ js/ui/workspace.js 2012-01-18 14:13:28 +0000
3674@@ -1,4 +1,4 @@
3675-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3676+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3677
3678 const Clutter = imports.gi.Clutter;
3679 const GConf = imports.gi.GConf;
3680@@ -135,8 +135,11 @@
3681 this._realWindowDestroyId = this.realWindow.connect('destroy',
3682 Lang.bind(this, this._disconnectRealWindowSignals));
3683
3684- this.actor.connect('button-release-event',
3685- Lang.bind(this, this._onButtonRelease));
3686+ let clickAction = new Clutter.ClickAction();
3687+ clickAction.connect('clicked', Lang.bind(this, this._onClicked));
3688+ clickAction.connect('long-press', Lang.bind(this, this._onLongPress));
3689+
3690+ this.actor.add_action(clickAction);
3691
3692 this.actor.connect('scroll-event',
3693 Lang.bind(this, this._onScroll));
3694@@ -147,6 +150,7 @@
3695
3696 this._draggable = DND.makeDraggable(this.actor,
3697 { restoreOnSuccess: true,
3698+ manualMode: true,
3699 dragActorMaxSize: WINDOW_DND_SIZE,
3700 dragActorOpacity: DRAGGING_WINDOW_OPACITY });
3701 this._draggable.connect('drag-begin', Lang.bind(this, this._onDragBegin));
3702@@ -345,9 +349,27 @@
3703 this._zoomStep = undefined;
3704 },
3705
3706- _onButtonRelease : function (actor, event) {
3707+ _onClicked: function(action, actor) {
3708 this._selected = true;
3709- this.emit('selected', event.get_time());
3710+ this.emit('selected', global.get_current_time());
3711+ },
3712+
3713+ _onLongPress: function(action, actor, state) {
3714+ // Take advantage of the Clutter policy to consider
3715+ // a long-press canceled when the pointer movement
3716+ // exceeds dnd-drag-threshold to manually start the drag
3717+ if (state == Clutter.LongPressState.CANCEL) {
3718+ // A click cancels a long-press before any click handler is
3719+ // run - make sure to not start a drag in that case
3720+ Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
3721+ function() {
3722+ if (this._selected)
3723+ return;
3724+ let [x, y] = action.get_coords();
3725+ this._draggable.startDrag(x, y, global.get_current_time());
3726+ }));
3727+ }
3728+ return true;
3729 },
3730
3731 _onDragBegin : function (draggable, time) {
3732
3733=== modified file 'js/ui/workspaceSwitcherPopup.js'
3734--- js/ui/workspaceSwitcherPopup.js 2011-08-24 02:33:44 +0000
3735+++ js/ui/workspaceSwitcherPopup.js 2012-01-18 14:13:28 +0000
3736@@ -1,4 +1,4 @@
3737-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3738+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3739
3740 const Clutter = imports.gi.Clutter;
3741 const Lang = imports.lang;
3742
3743=== modified file 'js/ui/workspaceThumbnail.js'
3744--- js/ui/workspaceThumbnail.js 2011-09-04 08:02:35 +0000
3745+++ js/ui/workspaceThumbnail.js 2012-01-18 14:13:28 +0000
3746@@ -1,4 +1,4 @@
3747-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3748+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3749
3750 const Clutter = imports.gi.Clutter;
3751 const Lang = imports.lang;
3752
3753=== modified file 'js/ui/workspacesView.js'
3754--- js/ui/workspacesView.js 2011-09-21 16:26:15 +0000
3755+++ js/ui/workspacesView.js 2012-01-18 14:13:28 +0000
3756@@ -1,4 +1,4 @@
3757-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3758+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3759
3760 const Clutter = imports.gi.Clutter;
3761 const Lang = imports.lang;
3762@@ -109,8 +109,6 @@
3763 this._scrollAdjustment.connect('notify::value',
3764 Lang.bind(this, this._onScroll));
3765
3766- this._timeoutId = 0;
3767-
3768 this._switchWorkspaceNotifyId =
3769 global.window_manager.connect('switch-workspace',
3770 Lang.bind(this, this._activeWorkspaceChanged));
3771@@ -321,10 +319,6 @@
3772 if (this._inDrag)
3773 this._dragEnd();
3774
3775- if (this._timeoutId) {
3776- Mainloop.source_remove(this._timeoutId);
3777- this._timeoutId = 0;
3778- }
3779 if (this._itemDragBeginId > 0) {
3780 Main.overview.disconnect(this._itemDragBeginId);
3781 this._itemDragBeginId = 0;
3782@@ -383,72 +377,10 @@
3783 this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
3784 }
3785
3786- let primary = Main.layoutManager.primaryMonitor;
3787-
3788- let activeWorkspaceIndex = global.screen.get_active_workspace_index();
3789- let topWorkspace, bottomWorkspace;
3790- topWorkspace = this._workspaces[activeWorkspaceIndex - 1];
3791- bottomWorkspace = this._workspaces[activeWorkspaceIndex + 1];
3792- let hoverWorkspace = null;
3793-
3794- // reactive monitor edges
3795- let topEdge = primary.y;
3796- let switchTop = (dragEvent.y <= topEdge && topWorkspace);
3797- if (switchTop && this._dragOverLastY != topEdge) {
3798- topWorkspace.metaWorkspace.activate(global.get_current_time());
3799- this._dragOverLastY = topEdge;
3800-
3801- return DND.DragMotionResult.CONTINUE;
3802- }
3803- let bottomEdge = primary.y + primary.height - 1;
3804- let switchBottom = (dragEvent.y >= bottomEdge && bottomWorkspace);
3805- if (switchBottom && this._dragOverLastY != bottomEdge) {
3806- bottomWorkspace.metaWorkspace.activate(global.get_current_time());
3807- this._dragOverLastY = bottomEdge;
3808-
3809- return DND.DragMotionResult.CONTINUE;
3810- }
3811- this._dragOverLastY = dragEvent.y;
3812- let result = DND.DragMotionResult.CONTINUE;
3813-
3814- // check hover state of new workspace area / inactive workspaces
3815- if (topWorkspace) {
3816- if (topWorkspace.actor.contains(dragEvent.targetActor)) {
3817- hoverWorkspace = topWorkspace;
3818- result = topWorkspace.handleDragOver(dragEvent.source, dragEvent.dragActor);
3819- }
3820- }
3821-
3822- if (bottomWorkspace) {
3823- if (bottomWorkspace.actor.contains(dragEvent.targetActor)) {
3824- hoverWorkspace = bottomWorkspace;
3825- result = bottomWorkspace.handleDragOver(dragEvent.source, dragEvent.dragActor);
3826- }
3827- }
3828-
3829- // handle delayed workspace switches
3830- if (hoverWorkspace) {
3831- if (!this._timeoutId)
3832- this._timeoutId = Mainloop.timeout_add_seconds(1,
3833- Lang.bind(this, function() {
3834- hoverWorkspace.metaWorkspace.activate(global.get_current_time());
3835- return false;
3836- }));
3837- } else {
3838- if (this._timeoutId) {
3839- Mainloop.source_remove(this._timeoutId);
3840- this._timeoutId = 0;
3841- }
3842- }
3843-
3844- return result;
3845+ return DND.DragMotionResult.CONTINUE;
3846 },
3847
3848 _dragEnd: function() {
3849- if (this._timeoutId) {
3850- Mainloop.source_remove(this._timeoutId);
3851- this._timeoutId = 0;
3852- }
3853 DND.removeDragMonitor(this._dragMonitor);
3854 this._inDrag = false;
3855
3856
3857=== modified file 'js/ui/xdndHandler.js'
3858--- js/ui/xdndHandler.js 2011-03-16 21:47:27 +0000
3859+++ js/ui/xdndHandler.js 2012-01-18 14:13:28 +0000
3860@@ -1,4 +1,4 @@
3861-/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
3862+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
3863
3864 const Clutter = imports.gi.Clutter;
3865 const Lang = imports.lang;
3866
3867=== modified file 'po/LINGUAS'
3868--- po/LINGUAS 2011-09-28 00:41:45 +0000
3869+++ po/LINGUAS 2012-01-18 14:13:28 +0000
3870@@ -2,6 +2,7 @@
3871 an
3872 ar
3873 as
3874+ast
3875 be
3876 bg
3877 bn
3878@@ -31,6 +32,7 @@
3879 ja
3880 ko
3881 kn
3882+ku
3883 lt
3884 lv
3885 mr
3886
3887=== modified file 'po/POTFILES.in'
3888--- po/POTFILES.in 2011-09-22 08:50:45 +0000
3889+++ po/POTFILES.in 2012-01-18 14:13:28 +0000
3890@@ -25,6 +25,7 @@
3891 js/ui/popupMenu.js
3892 js/ui/runDialog.js
3893 js/ui/searchDisplay.js
3894+js/ui/shellEntry.js
3895 js/ui/shellMountOperation.js
3896 js/ui/status/accessibility.js
3897 js/ui/status/bluetooth.js
3898@@ -44,4 +45,3 @@
3899 src/shell-mobile-providers.c
3900 src/shell-polkit-authentication-agent.c
3901 src/shell-util.c
3902-
3903
3904=== added file 'po/ast.po'
3905--- po/ast.po 1970-01-01 00:00:00 +0000
3906+++ po/ast.po 2012-01-18 14:13:28 +0000
3907@@ -0,0 +1,1630 @@
3908+# SOME DESCRIPTIVE TITLE.
3909+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3910+# This file is distributed under the same license as the PACKAGE package.
3911+# Xandru Armesto <xandru@softastur.org>, 2011.
3912+msgid ""
3913+msgstr ""
3914+"Project-Id-Version: gnome-shell\n"
3915+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
3916+"shell&keywords=I18N+L10N&component=general\n"
3917+"POT-Creation-Date: 2011-09-30 18:14+0000\n"
3918+"PO-Revision-Date: 2011-09-30 20:56+0200\n"
3919+"Last-Translator: Xandru Armesto <xandru@softastur.org>\n"
3920+"Language-Team: Softastur <alministradores@softastur.org>\n"
3921+"Language: ast\n"
3922+"MIME-Version: 1.0\n"
3923+"Content-Type: text/plain; charset=UTF-8\n"
3924+"Content-Transfer-Encoding: 8bit\n"
3925+"Plural-Forms: nplurals=2; plural=n != 1;\n"
3926+"X-Generator: Virtaal 0.5.2\n"
3927+"X-Poedit-Language: asturian\n"
3928+
3929+#: ../data/gnome-shell.desktop.in.in.h:1
3930+msgid "GNOME Shell"
3931+msgstr "GNOME Shell"
3932+
3933+#: ../data/gnome-shell.desktop.in.in.h:2
3934+msgid "Window management and application launching"
3935+msgstr "Xestión de ventanes y aniciu d'aplicaciones"
3936+
3937+#: ../data/org.gnome.shell.gschema.xml.in.h:1
3938+msgid ""
3939+"Allows access to internal debugging and monitoring tools using the Alt-F2 "
3940+"dialog."
3941+msgstr ""
3942+"Permitir acceder a les ferramientes internes de depuración y monitorización "
3943+"usando'l diálogu Alt+F2"
3944+
3945+#: ../data/org.gnome.shell.gschema.xml.in.h:2
3946+msgid "Enable internal tools useful for developers and testers from Alt-F2"
3947+msgstr ""
3948+"Activar les ferramientes internes, útiles pa desendolcadores y probadores, "
3949+"dende Alt+F2"
3950+
3951+#: ../data/org.gnome.shell.gschema.xml.in.h:3
3952+msgid "File extension used for storing the screencast"
3953+msgstr "Estensión de ficheru qu'usar p'almacenar los «screencast»"
3954+
3955+#: ../data/org.gnome.shell.gschema.xml.in.h:4
3956+msgid "Framerate used for recording screencasts."
3957+msgstr "Tasa de fotogrames usada pa grabar «screencast»."
3958+
3959+#: ../data/org.gnome.shell.gschema.xml.in.h:5
3960+msgid ""
3961+"GNOME Shell extensions have a uuid property; this key lists extensions which "
3962+"should be loaded. disabled-extensions overrides this setting for extensions "
3963+"that appear in both lists."
3964+msgstr ""
3965+"Les estensiones de GNOME Shell tienen una propiedá uuid; esta contraseña "
3966+"llista les estensiones que nun se deben cargar. «disabled-extensions» "
3967+"sobrescribe esti axuste pa les estensiones qu'aparecen en dambes llistes."
3968+
3969+#: ../data/org.gnome.shell.gschema.xml.in.h:6
3970+msgid "History for command (Alt-F2) dialog"
3971+msgstr "Históricu del diálogu de comandos (Alt+F2)"
3972+
3973+#: ../data/org.gnome.shell.gschema.xml.in.h:7
3974+msgid "History for the looking glass dialog"
3975+msgstr "Históricu del diálogu de «looking glass»"
3976+
3977+#: ../data/org.gnome.shell.gschema.xml.in.h:8
3978+msgid "If true, display date in the clock, in addition to time."
3979+msgstr "Si ye cierta, amuesa la data nel reló, arriendes de la hora."
3980+
3981+#: ../data/org.gnome.shell.gschema.xml.in.h:9
3982+msgid "If true, display seconds in time."
3983+msgstr "Si ye cierta, amuesa los segundos na hora."
3984+
3985+#: ../data/org.gnome.shell.gschema.xml.in.h:10
3986+msgid "If true, display the ISO week date in the calendar."
3987+msgstr "Si ye cierta, amuesa la data de selmana ISO nel calendariu."
3988+
3989+#: ../data/org.gnome.shell.gschema.xml.in.h:11
3990+msgid "List of desktop file IDs for favorite applications"
3991+msgstr "Llista de ID de ficheros d'escritoriu pa les aplicaciones favorites"
3992+
3993+#: ../data/org.gnome.shell.gschema.xml.in.h:13
3994+#, no-c-format
3995+msgid ""
3996+"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
3997+"used for gst-launch. The pipeline should have an unconnected sink pad where "
3998+"the recorded video is recorded. It will normally have a unconnected source "
3999+"pad; output from that pad will be written into the output file. However the "
4000+"pipeline can also take care of its own output - this might be used to send "
4001+"the output to an icecast server via shout2send or similar. When unset or set "
4002+"to an empty value, the default pipeline will be used. This is currently "
4003+"'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and "
4004+"records to WEBM using the VP8 codec. %T is used as a placeholder for a guess "
4005+"at the optimal thread count on the system."
4006+msgstr ""
4007+"Afita la tubería GStreamer usada pa codificar grabaciones. Sigue la sintaxis "
4008+"usada pa gst-launch. La tubería tendría tener un sumideru («sink») "
4009+"d'ensamblaxe/desensamblaxe au'l videu que se ta grabando, se graba. "
4010+"Xeneralmente tendrá un orixe d'ensambláu/desensambláu; la salida d'esi puntu "
4011+"escribiráse nel ficheru de salida. Sicasí, la tubería tamién pue tomar "
4012+"parte na so propia salida; esto pue usase pa unviar la salida a un sirvidor "
4013+"«icecast» a traviés de shout2send o similar. Cuando nun ta afitáu o lo ta a "
4014+"un valor baleru, va usase la tubería predeterminada. Anguaño te «videorate ! "
4015+"vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux» y graba en WEBM "
4016+"usando'l códec VP8. Úsase %T como suposición pal númberu de filos óptimos "
4017+"nel sistema."
4018+
4019+#: ../data/org.gnome.shell.gschema.xml.in.h:14
4020+msgid "Show date in clock"
4021+msgstr "Amosar la data nel reló"
4022+
4023+#: ../data/org.gnome.shell.gschema.xml.in.h:15
4024+msgid "Show the week date in the calendar"
4025+msgstr "Amosar la data de la selmana nel calendariu"
4026+
4027+#: ../data/org.gnome.shell.gschema.xml.in.h:16
4028+msgid "Show time with seconds"
4029+msgstr "Amosar la hora con segundos"
4030+
4031+#: ../data/org.gnome.shell.gschema.xml.in.h:17
4032+msgid ""
4033+"The applications corresponding to these identifiers will be displayed in the "
4034+"favorites area."
4035+msgstr ""
4036+"Les aplicaciones correspondientes con esos identificadores van amosase nel "
4037+"área de favoritos."
4038+
4039+#: ../data/org.gnome.shell.gschema.xml.in.h:18
4040+msgid ""
4041+"The filename for recorded screencasts will be a unique filename based on the "
4042+"current date, and use this extension. It should be changed when recording to "
4043+"a different container format."
4044+msgstr ""
4045+"El nome de ficheru pa los «screencast» sedrá un nome de ficheru únicu basáu "
4046+"na data actual y usará esta estensión. Tendría de camudase al grabar n'otru "
4047+"formatu contenedor distintu."
4048+
4049+#: ../data/org.gnome.shell.gschema.xml.in.h:19
4050+msgid ""
4051+"The framerate of the resulting screencast recordered by GNOME Shell's "
4052+"screencast recorder in frames-per-second."
4053+msgstr ""
4054+"La tasa de fotogrames de la grabación resultante grabada pol grabador de "
4055+"«screencast» de GNOME Shell, en fotogrames per segundu."
4056+
4057+#: ../data/org.gnome.shell.gschema.xml.in.h:20
4058+msgid "The gstreamer pipeline used to encode the screencast"
4059+msgstr "La tubería de gstreamer usada pa codificar el «screencast»"
4060+
4061+#: ../data/org.gnome.shell.gschema.xml.in.h:21
4062+msgid ""
4063+"The shell normally monitors active applications in order to present the most "
4064+"used ones (e.g. in launchers). While this data will be kept private, you may "
4065+"want to disable this for privacy reasons. Please note that doing so won't "
4066+"remove already saved data."
4067+msgstr ""
4068+"La «shell» normalmente monitoriza toles aplicaciones actives pa presentar "
4069+"les más usaes (ex. nos lanzadores). Magar qu'estos datos se caltienen de "
4070+"forma privada, pues querer desactivalo por razones de privacidá. Nota que "
4071+"faciéndolo nun desanicies los datos yá guardaos."
4072+
4073+#: ../data/org.gnome.shell.gschema.xml.in.h:22
4074+msgid "The type of keyboard to use."
4075+msgstr "La triba de tecláu qu'usar."
4076+
4077+#: ../data/org.gnome.shell.gschema.xml.in.h:23
4078+msgid "Uuids of extensions to enable"
4079+msgstr "Uuid de les estensiones qu'activar"
4080+
4081+#: ../data/org.gnome.shell.gschema.xml.in.h:24
4082+msgid "Whether to collect stats about applications usage"
4083+msgstr ""
4084+"Indica si hai de recolectar estadístiques tocante al usu de les aplicaciones"
4085+
4086+#: ../data/org.gnome.shell.gschema.xml.in.h:25
4087+msgid "Which keyboard to use"
4088+msgstr "Qué tecláu usar"
4089+
4090+#: ../data/org.gnome.shell.gschema.xml.in.h:26
4091+msgid "disabled OpenSearch providers"
4092+msgstr "fornidores OpenSearch desactivaos"
4093+
4094+#: ../js/gdm/loginDialog.js:617
4095+msgid "Session..."
4096+msgstr "Sesión…"
4097+
4098+#: ../js/gdm/loginDialog.js:785
4099+msgctxt "title"
4100+msgid "Sign In"
4101+msgstr "Entamar sesión"
4102+
4103+#. translators: this message is shown below the password entry field
4104+#. to indicate the user can swipe their finger instead
4105+#: ../js/gdm/loginDialog.js:830
4106+msgid "(or swipe finger)"
4107+msgstr "(o pasa'l deu)"
4108+
4109+#: ../js/gdm/loginDialog.js:848
4110+msgid "Not listed?"
4111+msgstr "¿Nun ta llistáu?"
4112+
4113+#: ../js/gdm/loginDialog.js:1004 ../js/ui/endSessionDialog.js:426
4114+#: ../js/ui/extensionSystem.js:477 ../js/ui/networkAgent.js:165
4115+#: ../js/ui/polkitAuthenticationAgent.js:171 ../js/ui/status/bluetooth.js:480
4116+msgid "Cancel"
4117+msgstr "Encaboxar"
4118+
4119+#: ../js/gdm/loginDialog.js:1009
4120+msgctxt "button"
4121+msgid "Sign In"
4122+msgstr "Entamar sesión"
4123+
4124+#: ../js/gdm/loginDialog.js:1358
4125+msgid "Login Window"
4126+msgstr "Ventana d'aniciu de sesión"
4127+
4128+#: ../js/gdm/powerMenu.js:116 ../js/ui/userMenu.js:514
4129+#: ../js/ui/userMenu.js:516 ../js/ui/userMenu.js:585
4130+msgid "Suspend"
4131+msgstr "Suspender"
4132+
4133+#: ../js/gdm/powerMenu.js:121 ../js/ui/endSessionDialog.js:89
4134+#: ../js/ui/endSessionDialog.js:97 ../js/ui/endSessionDialog.js:106
4135+msgid "Restart"
4136+msgstr "Reaniciar"
4137+
4138+#: ../js/gdm/powerMenu.js:126 ../js/ui/endSessionDialog.js:80
4139+#: ../js/ui/endSessionDialog.js:91
4140+msgid "Power Off"
4141+msgstr "Apagar"
4142+
4143+#: ../js/misc/util.js:92
4144+msgid "Command not found"
4145+msgstr "Comandu non alcontráu"
4146+
4147+#. Replace "Error invoking GLib.shell_parse_argv: " with
4148+#. something nicer
4149+#: ../js/misc/util.js:119
4150+msgid "Could not parse command:"
4151+msgstr "Nun pudo analizase'l comandu:"
4152+
4153+#: ../js/misc/util.js:127
4154+#, c-format
4155+msgid "Execution of '%s' failed:"
4156+msgstr "Falló la execución de «%s»:"
4157+
4158+#. Translators: Filter to display all applications
4159+#: ../js/ui/appDisplay.js:255
4160+msgid "All"
4161+msgstr "Toes"
4162+
4163+#: ../js/ui/appDisplay.js:319
4164+msgid "APPLICATIONS"
4165+msgstr "APLICACIONES"
4166+
4167+#: ../js/ui/appDisplay.js:377
4168+msgid "SETTINGS"
4169+msgstr "CONFIGURACIÓN"
4170+
4171+#: ../js/ui/appDisplay.js:684
4172+msgid "New Window"
4173+msgstr "Ventana nueva"
4174+
4175+#: ../js/ui/appDisplay.js:687
4176+msgid "Remove from Favorites"
4177+msgstr "Quitar de los favoritos"
4178+
4179+#: ../js/ui/appDisplay.js:688
4180+msgid "Add to Favorites"
4181+msgstr "Amestar a los favoritos"
4182+
4183+#: ../js/ui/appFavorites.js:89
4184+#, c-format
4185+msgid "%s has been added to your favorites."
4186+msgstr "Amestóse %s a los favoritos."
4187+
4188+#: ../js/ui/appFavorites.js:120
4189+#, c-format
4190+msgid "%s has been removed from your favorites."
4191+msgstr "Desanicióse %s de los favoritos."
4192+
4193+#: ../js/ui/autorunManager.js:280
4194+msgid "Removable Devices"
4195+msgstr "Preseos extraíbles"
4196+
4197+#: ../js/ui/autorunManager.js:590
4198+#, c-format
4199+msgid "Open with %s"
4200+msgstr "Abrir con %s"
4201+
4202+#: ../js/ui/autorunManager.js:616
4203+msgid "Eject"
4204+msgstr "Espulsar"
4205+
4206+#. Translators: Shown in calendar event list for all day events
4207+#. * Keep it short, best if you can use less then 10 characters
4208+#.
4209+#: ../js/ui/calendar.js:63
4210+msgctxt "event list time"
4211+msgid "All Day"
4212+msgstr "Tol día"
4213+
4214+#. Translators: Shown in calendar event list, if 24h format
4215+#: ../js/ui/calendar.js:68
4216+msgctxt "event list time"
4217+msgid "%H:%M"
4218+msgstr "%H:%M"
4219+
4220+#. Transators: Shown in calendar event list, if 12h format
4221+#: ../js/ui/calendar.js:75
4222+msgctxt "event list time"
4223+msgid "%l:%M %p"
4224+msgstr "%l:%M %p"
4225+
4226+#. Translators: Calendar grid abbreviation for Sunday.
4227+#. *
4228+#. * NOTE: These grid abbreviations are always shown together
4229+#. * and in order, e.g. "S M T W T F S".
4230+#.
4231+#: ../js/ui/calendar.js:115
4232+msgctxt "grid sunday"
4233+msgid "S"
4234+msgstr "D"
4235+
4236+#. Translators: Calendar grid abbreviation for Monday
4237+#: ../js/ui/calendar.js:117
4238+msgctxt "grid monday"
4239+msgid "M"
4240+msgstr "L"
4241+
4242+#. Translators: Calendar grid abbreviation for Tuesday
4243+#: ../js/ui/calendar.js:119
4244+msgctxt "grid tuesday"
4245+msgid "T"
4246+msgstr "M"
4247+
4248+#. Translators: Calendar grid abbreviation for Wednesday
4249+#: ../js/ui/calendar.js:121
4250+msgctxt "grid wednesday"
4251+msgid "W"
4252+msgstr "m"
4253+
4254+#. Translators: Calendar grid abbreviation for Thursday
4255+#: ../js/ui/calendar.js:123
4256+msgctxt "grid thursday"
4257+msgid "T"
4258+msgstr "X"
4259+
4260+#. Translators: Calendar grid abbreviation for Friday
4261+#: ../js/ui/calendar.js:125
4262+msgctxt "grid friday"
4263+msgid "F"
4264+msgstr "V"
4265+
4266+#. Translators: Calendar grid abbreviation for Saturday
4267+#: ../js/ui/calendar.js:127
4268+msgctxt "grid saturday"
4269+msgid "S"
4270+msgstr "S"
4271+
4272+#. Translators: Event list abbreviation for Sunday.
4273+#. *
4274+#. * NOTE: These list abbreviations are normally not shown together
4275+#. * so they need to be unique (e.g. Tuesday and Thursday cannot
4276+#. * both be 'T').
4277+#.
4278+#: ../js/ui/calendar.js:140
4279+msgctxt "list sunday"
4280+msgid "Su"
4281+msgstr "Dom"
4282+
4283+#. Translators: Event list abbreviation for Monday
4284+#: ../js/ui/calendar.js:142
4285+msgctxt "list monday"
4286+msgid "M"
4287+msgstr "Llu"
4288+
4289+#. Translators: Event list abbreviation for Tuesday
4290+#: ../js/ui/calendar.js:144
4291+msgctxt "list tuesday"
4292+msgid "T"
4293+msgstr "Mar"
4294+
4295+#. Translators: Event list abbreviation for Wednesday
4296+#: ../js/ui/calendar.js:146
4297+msgctxt "list wednesday"
4298+msgid "W"
4299+msgstr "Mié"
4300+
4301+#. Translators: Event list abbreviation for Thursday
4302+#: ../js/ui/calendar.js:148
4303+msgctxt "list thursday"
4304+msgid "Th"
4305+msgstr "Xue"
4306+
4307+#. Translators: Event list abbreviation for Friday
4308+#: ../js/ui/calendar.js:150
4309+msgctxt "list friday"
4310+msgid "F"
4311+msgstr "Vie"
4312+
4313+#. Translators: Event list abbreviation for Saturday
4314+#: ../js/ui/calendar.js:152
4315+msgctxt "list saturday"
4316+msgid "S"
4317+msgstr "Sáb"
4318+
4319+#. Translators: Text to show if there are no events
4320+#: ../js/ui/calendar.js:687
4321+msgid "Nothing Scheduled"
4322+msgstr "Res programáu"
4323+
4324+#. Translators: Shown on calendar heading when selected day occurs on current year
4325+#: ../js/ui/calendar.js:703
4326+msgctxt "calendar heading"
4327+msgid "%A, %B %d"
4328+msgstr "%A, %d de %B"
4329+
4330+#. Translators: Shown on calendar heading when selected day occurs on different year
4331+#: ../js/ui/calendar.js:706
4332+msgctxt "calendar heading"
4333+msgid "%A, %B %d, %Y"
4334+msgstr "%A, %d de %B de %Y"
4335+
4336+#: ../js/ui/calendar.js:716
4337+msgid "Today"
4338+msgstr "Güei"
4339+
4340+#: ../js/ui/calendar.js:720
4341+msgid "Tomorrow"
4342+msgstr "Mañana"
4343+
4344+#: ../js/ui/calendar.js:729
4345+msgid "This week"
4346+msgstr "Esta selmana"
4347+
4348+#: ../js/ui/calendar.js:737
4349+msgid "Next week"
4350+msgstr "La selmana que vien"
4351+
4352+#: ../js/ui/contactDisplay.js:59 ../js/ui/notificationDaemon.js:444
4353+#: ../js/ui/status/power.js:223 ../src/shell-app.c:355
4354+msgid "Unknown"
4355+msgstr "Desconocíu"
4356+
4357+#: ../js/ui/contactDisplay.js:80 ../js/ui/userMenu.js:139
4358+msgid "Available"
4359+msgstr "Disponible"
4360+
4361+#: ../js/ui/contactDisplay.js:85 ../js/ui/userMenu.js:148
4362+msgid "Away"
4363+msgstr "Ausente"
4364+
4365+#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:142
4366+msgid "Busy"
4367+msgstr "Ocupáu"
4368+
4369+#: ../js/ui/contactDisplay.js:93
4370+msgid "Offline"
4371+msgstr "Desconeutáu"
4372+
4373+#: ../js/ui/contactDisplay.js:140
4374+msgid "CONTACTS"
4375+msgstr "CONTAUTOS"
4376+
4377+#: ../js/ui/dash.js:172 ../js/ui/messageTray.js:1204
4378+msgid "Remove"
4379+msgstr "Desaniciar"
4380+
4381+#: ../js/ui/dateMenu.js:99
4382+msgid "Date and Time Settings"
4383+msgstr "Axustes d'hora y data"
4384+
4385+#: ../js/ui/dateMenu.js:125
4386+msgid "Open Calendar"
4387+msgstr "Abrir calendariu"
4388+
4389+#. Translators: This is the time format with date used
4390+#. in 24-hour mode.
4391+#: ../js/ui/dateMenu.js:183
4392+msgid "%a %b %e, %R:%S"
4393+msgstr "%a %e de %b, %R:%S"
4394+
4395+#: ../js/ui/dateMenu.js:184
4396+msgid "%a %b %e, %R"
4397+msgstr "%a %e de %b, %R"
4398+
4399+#. Translators: This is the time format without date used
4400+#. in 24-hour mode.
4401+#: ../js/ui/dateMenu.js:188
4402+msgid "%a %R:%S"
4403+msgstr "%a %R:%S"
4404+
4405+#: ../js/ui/dateMenu.js:189
4406+msgid "%a %R"
4407+msgstr "%a %R"
4408+
4409+#. Translators: This is a time format with date used
4410+#. for AM/PM.
4411+#: ../js/ui/dateMenu.js:196
4412+msgid "%a %b %e, %l:%M:%S %p"
4413+msgstr "%a %e de %b, %l:%M:%S %p"
4414+
4415+#: ../js/ui/dateMenu.js:197
4416+msgid "%a %b %e, %l:%M %p"
4417+msgstr "%a %e de %b, %l:%M %p"
4418+
4419+#. Translators: This is a time format without date used
4420+#. for AM/PM.
4421+#: ../js/ui/dateMenu.js:201
4422+msgid "%a %l:%M:%S %p"
4423+msgstr "%a %l:%M:%S %p"
4424+
4425+#: ../js/ui/dateMenu.js:202
4426+msgid "%a %l:%M %p"
4427+msgstr "%a %l:%M %p"
4428+
4429+#. Translators: This is the date format to use when the calendar popup is
4430+#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
4431+#.
4432+#: ../js/ui/dateMenu.js:213
4433+msgid "%A %B %e, %Y"
4434+msgstr "%A, %e de %B de %Y"
4435+
4436+#: ../js/ui/docDisplay.js:16
4437+msgid "RECENT ITEMS"
4438+msgstr "ELEMENTOS RECIENTES"
4439+
4440+#: ../js/ui/endSessionDialog.js:60
4441+#, c-format
4442+msgid "Log Out %s"
4443+msgstr "Zarrar la sesión %s"
4444+
4445+#: ../js/ui/endSessionDialog.js:61 ../js/ui/endSessionDialog.js:75
4446+msgid "Log Out"
4447+msgstr "Zarrar la sesión"
4448+
4449+#: ../js/ui/endSessionDialog.js:62
4450+msgid "Click Log Out to quit these applications and log out of the system."
4451+msgstr ""
4452+"Calca «Zarrar la sesión» pa colar d'eses aplicaciones y zarrar la sesión del "
4453+"sistema."
4454+
4455+#: ../js/ui/endSessionDialog.js:64
4456+#, c-format
4457+msgid "%s will be logged out automatically in %d second."
4458+msgid_plural "%s will be logged out automatically in %d seconds."
4459+msgstr[0] "va zarrase automáticamente la sesión de %s en %d segundu."
4460+msgstr[1] "va zarrase automáticamente la sesión de %s en %d segundos."
4461+
4462+#: ../js/ui/endSessionDialog.js:69
4463+#, c-format
4464+msgid "You will be logged out automatically in %d second."
4465+msgid_plural "You will be logged out automatically in %d seconds."
4466+msgstr[0] "La sesión va zarrase automáticamente en %d segundu."
4467+msgstr[1] "La sesión va zarrase automáticamente en %d segundos."
4468+
4469+#: ../js/ui/endSessionDialog.js:73
4470+msgid "Logging out of the system."
4471+msgstr "Zarrando la sesión."
4472+
4473+#: ../js/ui/endSessionDialog.js:81
4474+msgid "Click Power Off to quit these applications and power off the system."
4475+msgstr "Calca «Apagar» pa colar d'eses aplicaciones y apagar el sistema."
4476+
4477+#: ../js/ui/endSessionDialog.js:83
4478+#, c-format
4479+msgid "The system will power off automatically in %d second."
4480+msgid_plural "The system will power off automatically in %d seconds."
4481+msgstr[0] "El sistema va apagase automáticamente en %d segundu."
4482+msgstr[1] "El sistema va apagase automáticamente en %d segundos."
4483+
4484+#: ../js/ui/endSessionDialog.js:87
4485+msgid "Powering off the system."
4486+msgstr "Apagando'l sistema."
4487+
4488+#: ../js/ui/endSessionDialog.js:98
4489+msgid "Click Restart to quit these applications and restart the system."
4490+msgstr "Calca «Reaniciar» pa colar d'eses aplicaciones y reaniciar el sistema."
4491+
4492+#: ../js/ui/endSessionDialog.js:100
4493+#, c-format
4494+msgid "The system will restart automatically in %d second."
4495+msgid_plural "The system will restart automatically in %d seconds."
4496+msgstr[0] "El sistema va reaniciase automáticamente en %d segundu."
4497+msgstr[1] "El sistema va reaniciase automáticamente en %d segundos."
4498+
4499+#: ../js/ui/endSessionDialog.js:104
4500+msgid "Restarting the system."
4501+msgstr "Reaniciando'l sistema."
4502+
4503+#: ../js/ui/extensionSystem.js:481
4504+msgid "Install"
4505+msgstr "Instalar"
4506+
4507+#: ../js/ui/extensionSystem.js:485
4508+#, c-format
4509+msgid "Download and install '%s' from extensions.gnome.org?"
4510+msgstr "¿Baxar ya instalar «%s» dende extensions.gnome.org?"
4511+
4512+#: ../js/ui/keyboard.js:529 ../js/ui/status/power.js:211
4513+msgid "Keyboard"
4514+msgstr "Tecláu"
4515+
4516+#: ../js/ui/lookingGlass.js:645
4517+msgid "No extensions installed"
4518+msgstr "Nun hai estensiones instalaes"
4519+
4520+#. Translators: argument is an extension UUID.
4521+#: ../js/ui/lookingGlass.js:700
4522+#, c-format
4523+msgid "%s has not emitted any errors."
4524+msgstr "%s nun emitió error nengún."
4525+
4526+#: ../js/ui/lookingGlass.js:706
4527+msgid "Hide Errors"
4528+msgstr "Anubrir Errores"
4529+
4530+#: ../js/ui/lookingGlass.js:710 ../js/ui/lookingGlass.js:760
4531+msgid "Show Errors"
4532+msgstr "Amosar Errores"
4533+
4534+#: ../js/ui/lookingGlass.js:719
4535+msgid "Enabled"
4536+msgstr "Activáu"
4537+
4538+#. translators:
4539+#. * The device has been disabled
4540+#: ../js/ui/lookingGlass.js:721 ../src/gvc/gvc-mixer-control.c:1093
4541+msgid "Disabled"
4542+msgstr "Desactiváu"
4543+
4544+#: ../js/ui/lookingGlass.js:723
4545+msgid "Error"
4546+msgstr "Fallu"
4547+
4548+#: ../js/ui/lookingGlass.js:725
4549+msgid "Out of date"
4550+msgstr "Caducáu"
4551+
4552+#: ../js/ui/lookingGlass.js:727
4553+msgid "Downloading"
4554+msgstr "Descargando"
4555+
4556+#: ../js/ui/lookingGlass.js:748
4557+msgid "View Source"
4558+msgstr "Ver fonte"
4559+
4560+#: ../js/ui/lookingGlass.js:754
4561+msgid "Web Page"
4562+msgstr "Páxina web"
4563+
4564+#: ../js/ui/messageTray.js:1197
4565+msgid "Open"
4566+msgstr "Abrir"
4567+
4568+#: ../js/ui/messageTray.js:2406
4569+msgid "System Information"
4570+msgstr "Información del sistema"
4571+
4572+#: ../js/ui/networkAgent.js:145
4573+msgid "Show password"
4574+msgstr "Amosar contraseña"
4575+
4576+#: ../js/ui/networkAgent.js:160
4577+msgid "Connect"
4578+msgstr "Coneutar"
4579+
4580+#. Cisco LEAP
4581+#: ../js/ui/networkAgent.js:255 ../js/ui/networkAgent.js:267
4582+#: ../js/ui/networkAgent.js:294 ../js/ui/networkAgent.js:314
4583+#: ../js/ui/networkAgent.js:324
4584+msgid "Password: "
4585+msgstr "Contraseña: "
4586+
4587+#. static WEP
4588+#: ../js/ui/networkAgent.js:260
4589+msgid "Key: "
4590+msgstr "Contraseña:"
4591+
4592+#. TTLS and PEAP are actually much more complicated, but this complication
4593+#. is not visible here since we only care about phase2 authentication
4594+#. (and don't even care of which one)
4595+#: ../js/ui/networkAgent.js:292 ../js/ui/networkAgent.js:310
4596+msgid "Username: "
4597+msgstr "Nome d'usuariu:"
4598+
4599+#: ../js/ui/networkAgent.js:298
4600+msgid "Identity: "
4601+msgstr "Identidá:"
4602+
4603+#: ../js/ui/networkAgent.js:300
4604+msgid "Private key password: "
4605+msgstr "Clave de la contraseña privada:"
4606+
4607+#: ../js/ui/networkAgent.js:312
4608+msgid "Service: "
4609+msgstr "Serviciu:"
4610+
4611+#: ../js/ui/networkAgent.js:341
4612+msgid "Authentication required by wireless network"
4613+msgstr "La rede inalámbrica requier autenticación"
4614+
4615+#: ../js/ui/networkAgent.js:342
4616+#, c-format
4617+msgid ""
4618+"Passwords or encryption keys are required to access the wireless network '%"
4619+"s'."
4620+msgstr ""
4621+"Necesítense contraseñes o claves de cifráu p'acceder a la rede inalámbrica «"
4622+"%s»."
4623+
4624+#: ../js/ui/networkAgent.js:346
4625+msgid "Wired 802.1X authentication"
4626+msgstr "Autenticación 802.1X cableada"
4627+
4628+#: ../js/ui/networkAgent.js:348
4629+msgid "Network name: "
4630+msgstr "Nome de la rede"
4631+
4632+#: ../js/ui/networkAgent.js:353
4633+msgid "DSL authentication"
4634+msgstr "Autenticación DSL"
4635+
4636+#: ../js/ui/networkAgent.js:360
4637+msgid "PIN code required"
4638+msgstr "Códigu PIN requeríu"
4639+
4640+#: ../js/ui/networkAgent.js:361
4641+msgid "PIN code is needed for the mobile broadband device"
4642+msgstr "Necesítase un códigu PIN pal preséu de banda ancha móvil"
4643+
4644+#: ../js/ui/networkAgent.js:362
4645+msgid "PIN: "
4646+msgstr "PIN: "
4647+
4648+#: ../js/ui/networkAgent.js:368
4649+msgid "Mobile broadband network password"
4650+msgstr "Contraseña de la rede de banda ancha móvil"
4651+
4652+#: ../js/ui/networkAgent.js:369
4653+#, c-format
4654+msgid "A password is required to connect to '%s'."
4655+msgstr "Requierse una contraseña pa coneutar a «%s»."
4656+
4657+#: ../js/ui/overview.js:91
4658+msgid "Undo"
4659+msgstr "Desfacer"
4660+
4661+#: ../js/ui/overview.js:205
4662+msgid "Windows"
4663+msgstr "Ventanes"
4664+
4665+#: ../js/ui/overview.js:208
4666+msgid "Applications"
4667+msgstr "Aplicaciones"
4668+
4669+#. Translators: this is the name of the dock/favorites area on
4670+#. the left of the overview
4671+#: ../js/ui/overview.js:230
4672+msgid "Dash"
4673+msgstr "Tableru"
4674+
4675+#. TODO - _quit() doesn't really work on apps in state STARTING yet
4676+#: ../js/ui/panel.js:539
4677+#, c-format
4678+msgid "Quit %s"
4679+msgstr "Colar de %s"
4680+
4681+#. Translators: If there is no suitable word for "Activities"
4682+#. in your language, you can use the word for "Overview".
4683+#: ../js/ui/panel.js:575
4684+msgid "Activities"
4685+msgstr "Actividaes"
4686+
4687+#: ../js/ui/panel.js:967
4688+msgid "Top Bar"
4689+msgstr "Barra superior"
4690+
4691+#: ../js/ui/placeDisplay.js:120
4692+#, c-format
4693+msgid "Failed to unmount '%s'"
4694+msgstr "Falló al desmontar «%s»"
4695+
4696+#: ../js/ui/placeDisplay.js:123
4697+msgid "Retry"
4698+msgstr "Reintentar"
4699+
4700+#: ../js/ui/placeDisplay.js:163
4701+msgid "Connect to..."
4702+msgstr "Coneutar a…"
4703+
4704+#: ../js/ui/placeDisplay.js:375
4705+msgid "PLACES & DEVICES"
4706+msgstr "LLUGARES Y PRESEOS"
4707+
4708+#: ../js/ui/polkitAuthenticationAgent.js:72
4709+msgid "Authentication Required"
4710+msgstr "Necesítase autenticación"
4711+
4712+#: ../js/ui/polkitAuthenticationAgent.js:106
4713+msgid "Administrator"
4714+msgstr "Alministrador"
4715+
4716+#: ../js/ui/polkitAuthenticationAgent.js:175
4717+msgid "Authenticate"
4718+msgstr "Autenticar"
4719+
4720+#. Translators: "that didn't work" refers to the fact that the
4721+#. * requested authentication was not gained; this can happen
4722+#. * because of an authentication error (like invalid password),
4723+#. * for instance.
4724+#: ../js/ui/polkitAuthenticationAgent.js:256
4725+msgid "Sorry, that didn't work. Please try again."
4726+msgstr "Inténtalo de nueves,"
4727+
4728+#: ../js/ui/polkitAuthenticationAgent.js:268
4729+msgid "Password:"
4730+msgstr "Contraseña:"
4731+
4732+#. Translators: this MUST be either "toggle-switch-us"
4733+#. (for toggle switches containing the English words
4734+#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
4735+#. switches containing "◯" and "|"). Other values will
4736+#. simply result in invisible toggle switches.
4737+#: ../js/ui/popupMenu.js:731
4738+msgid "toggle-switch-us"
4739+msgstr "toggle-switch-intl"
4740+
4741+#: ../js/ui/runDialog.js:208
4742+msgid "Please enter a command:"
4743+msgstr "Introduz un comandu:"
4744+
4745+#: ../js/ui/searchDisplay.js:340
4746+msgid "Searching..."
4747+msgstr "Guetando…"
4748+
4749+#: ../js/ui/searchDisplay.js:363
4750+msgid "No matching results."
4751+msgstr "Nun s'atopó dengún resultáu coincidente."
4752+
4753+#: ../js/ui/shellMountOperation.js:285
4754+msgid "Wrong password, please try again"
4755+msgstr "Contraseña incorreuta; inténtalo de nueves"
4756+
4757+#: ../js/ui/status/accessibility.js:60
4758+msgid "Zoom"
4759+msgstr "Ampliación"
4760+
4761+#. let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
4762+#. 'screen-reader-enabled');
4763+#. this.menu.addMenuItem(screenReader);
4764+#: ../js/ui/status/accessibility.js:71
4765+msgid "Screen Keyboard"
4766+msgstr "Tecláu en pantalla"
4767+
4768+#: ../js/ui/status/accessibility.js:75
4769+msgid "Visual Alerts"
4770+msgstr "Alertes visuales"
4771+
4772+#: ../js/ui/status/accessibility.js:78
4773+msgid "Sticky Keys"
4774+msgstr "Tecles persistentes"
4775+
4776+#: ../js/ui/status/accessibility.js:81
4777+msgid "Slow Keys"
4778+msgstr "Tecles lentes"
4779+
4780+#: ../js/ui/status/accessibility.js:84
4781+msgid "Bounce Keys"
4782+msgstr "Refugu de tecles"
4783+
4784+#: ../js/ui/status/accessibility.js:87
4785+msgid "Mouse Keys"
4786+msgstr "Tecles del mur"
4787+
4788+#: ../js/ui/status/accessibility.js:91
4789+msgid "Universal Access Settings"
4790+msgstr "Configuración del accesu universal"
4791+
4792+#: ../js/ui/status/accessibility.js:141
4793+msgid "High Contrast"
4794+msgstr "Contraste altu"
4795+
4796+#: ../js/ui/status/accessibility.js:178
4797+msgid "Large Text"
4798+msgstr "Testu grande"
4799+
4800+#: ../js/ui/status/bluetooth.js:39 ../js/ui/status/bluetooth.js:261
4801+#: ../js/ui/status/bluetooth.js:347 ../js/ui/status/bluetooth.js:381
4802+#: ../js/ui/status/bluetooth.js:421 ../js/ui/status/bluetooth.js:454
4803+msgid "Bluetooth"
4804+msgstr "Bluetooth"
4805+
4806+#: ../js/ui/status/bluetooth.js:52
4807+msgid "Visibility"
4808+msgstr "Visibilidá"
4809+
4810+#: ../js/ui/status/bluetooth.js:66
4811+msgid "Send Files to Device..."
4812+msgstr "Unviar ficheros al preséu…"
4813+
4814+#: ../js/ui/status/bluetooth.js:67
4815+msgid "Set up a New Device..."
4816+msgstr "Configurar un preséu nuevu…"
4817+
4818+#: ../js/ui/status/bluetooth.js:91
4819+msgid "Bluetooth Settings"
4820+msgstr "Configuración de Bluetooth"
4821+
4822+#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
4823+#: ../js/ui/status/bluetooth.js:111
4824+msgid "hardware disabled"
4825+msgstr "hardware desactiváu"
4826+
4827+#: ../js/ui/status/bluetooth.js:208
4828+msgid "Connection"
4829+msgstr "Conexón"
4830+
4831+#: ../js/ui/status/bluetooth.js:217 ../js/ui/status/network.js:486
4832+msgid "disconnecting..."
4833+msgstr "desconeutando…"
4834+
4835+#: ../js/ui/status/bluetooth.js:230 ../js/ui/status/network.js:492
4836+msgid "connecting..."
4837+msgstr "coneutando…"
4838+
4839+#: ../js/ui/status/bluetooth.js:248
4840+msgid "Send Files..."
4841+msgstr "Unviar ficheros…"
4842+
4843+#: ../js/ui/status/bluetooth.js:253
4844+msgid "Browse Files..."
4845+msgstr "Desaminar ficheros…"
4846+
4847+#: ../js/ui/status/bluetooth.js:262
4848+msgid "Error browsing device"
4849+msgstr "Fallu al desaminar el preséu"
4850+
4851+#: ../js/ui/status/bluetooth.js:263
4852+#, c-format
4853+msgid "The requested device cannot be browsed, error is '%s'"
4854+msgstr "Nun se pue desaminar el preséu solicitáu, el fallu ye «%s»"
4855+
4856+#: ../js/ui/status/bluetooth.js:271
4857+msgid "Keyboard Settings"
4858+msgstr "Configuración del tecláu"
4859+
4860+#: ../js/ui/status/bluetooth.js:274
4861+msgid "Mouse Settings"
4862+msgstr "Axustes del mur…"
4863+
4864+#: ../js/ui/status/bluetooth.js:279 ../js/ui/status/volume.js:62
4865+msgid "Sound Settings"
4866+msgstr "Configuración del soníu"
4867+
4868+#: ../js/ui/status/bluetooth.js:382
4869+#, c-format
4870+msgid "Authorization request from %s"
4871+msgstr "Solicitú d'autorización de %s"
4872+
4873+#: ../js/ui/status/bluetooth.js:388
4874+#, c-format
4875+msgid "Device %s wants access to the service '%s'"
4876+msgstr "El preséu %s quier acceder al serviciu «%s»"
4877+
4878+#: ../js/ui/status/bluetooth.js:390
4879+msgid "Always grant access"
4880+msgstr "Conceder accesu siempre"
4881+
4882+#: ../js/ui/status/bluetooth.js:391
4883+msgid "Grant this time only"
4884+msgstr "Conceder namái esta vegada"
4885+
4886+#: ../js/ui/status/bluetooth.js:392 ../js/ui/telepathyClient.js:1200
4887+msgid "Reject"
4888+msgstr "Refugar"
4889+
4890+#: ../js/ui/status/bluetooth.js:422
4891+#, c-format
4892+msgid "Pairing confirmation for %s"
4893+msgstr "Confirmación d'emparexamientu pa «%s»"
4894+
4895+#: ../js/ui/status/bluetooth.js:428 ../js/ui/status/bluetooth.js:462
4896+#, c-format
4897+msgid "Device %s wants to pair with this computer"
4898+msgstr "El preséu «%s» quier emparexase con esti equipu"
4899+
4900+#: ../js/ui/status/bluetooth.js:429
4901+#, c-format
4902+msgid "Please confirm whether the PIN '%s' matches the one on the device."
4903+msgstr "Confirma que'l PIN amosáu en «%s» concasa col del preséu."
4904+
4905+#: ../js/ui/status/bluetooth.js:431
4906+msgid "Matches"
4907+msgstr "Concasa"
4908+
4909+#: ../js/ui/status/bluetooth.js:432
4910+msgid "Does not match"
4911+msgstr "Nun concasa"
4912+
4913+#: ../js/ui/status/bluetooth.js:455
4914+#, c-format
4915+msgid "Pairing request for %s"
4916+msgstr "Solicitú d'emparexamientu pa «%s»"
4917+
4918+#: ../js/ui/status/bluetooth.js:463
4919+msgid "Please enter the PIN mentioned on the device."
4920+msgstr "Introduz el PIN mencionáu nel preséu."
4921+
4922+#: ../js/ui/status/bluetooth.js:479
4923+msgid "OK"
4924+msgstr "Aceutar"
4925+
4926+#: ../js/ui/status/keyboard.js:73
4927+msgid "Show Keyboard Layout"
4928+msgstr "Amosar la distribución del tecláu"
4929+
4930+#: ../js/ui/status/keyboard.js:78
4931+msgid "Region and Language Settings"
4932+msgstr "Configuración de rexón y llingua"
4933+
4934+#: ../js/ui/status/network.js:97
4935+msgid "<unknown>"
4936+msgstr "<desconocíu>"
4937+
4938+#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
4939+#: ../js/ui/status/network.js:285
4940+msgid "disabled"
4941+msgstr "desactivada"
4942+
4943+#. Translators: this is for network devices that are physically present but are not
4944+#. under NetworkManager's control (and thus cannot be used in the menu)
4945+#: ../js/ui/status/network.js:484
4946+msgid "unmanaged"
4947+msgstr "non xestionada"
4948+
4949+#. Translators: this is for network connections that require some kind of key or password
4950+#: ../js/ui/status/network.js:495
4951+msgid "authentication required"
4952+msgstr "necesítase autenticación"
4953+
4954+#. Translators: this is for devices that require some kind of firmware or kernel
4955+#. module, which is missing
4956+#: ../js/ui/status/network.js:505
4957+msgid "firmware missing"
4958+msgstr "falta'l «firmware»"
4959+
4960+#. Translators: this is for wired network devices that are physically disconnected
4961+#: ../js/ui/status/network.js:512
4962+msgid "cable unplugged"
4963+msgstr "cable desconeutáu"
4964+
4965+#. Translators: this is for a network device that cannot be activated (for example it
4966+#. is disabled by rfkill, or it has no coverage
4967+#: ../js/ui/status/network.js:517
4968+msgid "unavailable"
4969+msgstr "non disponible"
4970+
4971+#: ../js/ui/status/network.js:519
4972+msgid "connection failed"
4973+msgstr "falló la conexón"
4974+
4975+#: ../js/ui/status/network.js:575 ../js/ui/status/network.js:1523
4976+msgid "More..."
4977+msgstr "Más…"
4978+
4979+#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
4980+#. and we cannot access its settings (including the name)
4981+#: ../js/ui/status/network.js:611 ../js/ui/status/network.js:1458
4982+msgid "Connected (private)"
4983+msgstr "Coneutada (privada)"
4984+
4985+#: ../js/ui/status/network.js:689
4986+msgid "Auto Ethernet"
4987+msgstr "Ethernet automática"
4988+
4989+#: ../js/ui/status/network.js:753
4990+msgid "Auto broadband"
4991+msgstr "Banda ancha automática"
4992+
4993+#: ../js/ui/status/network.js:756
4994+msgid "Auto dial-up"
4995+msgstr "Marcáu automáticu"
4996+
4997+#. TRANSLATORS: this the automatic wireless connection name (including the network name)
4998+#: ../js/ui/status/network.js:878 ../js/ui/status/network.js:1470
4999+#, c-format
5000+msgid "Auto %s"
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: