Compare commits

...

56 Commits

Author SHA1 Message Date
Jasper St. Pierre
64bacc6286 popupMenu: Port to GrabHelper
https://bugzilla.gnome.org/show_bug.cgi?id=689109
2012-11-26 15:13:04 -05:00
Jasper St. Pierre
50fec9e1f8 grabHelper: Drop to the actor clicked on
This is necessary for child popups in menus, e.g. while in a combo box,
clicking outside of the user menu should drop the entire menu, but
clicking on the user menu itself should only drop the combo box.
2012-11-26 15:13:04 -05:00
Jasper St. Pierre
b03f7564e3 grabHelper: Treat the current grabbed actor as a grabbed actor
This should be obvious, but I guess it wasn't necessary for the
message tray case.
2012-11-26 15:13:04 -05:00
Jasper St. Pierre
ef9006fa65 grabHelper: Use captured-event for escape ungrabs
I have no idea why we used 'event' rather than 'captured-event' before.
'event' has some really strange quirks that came up when porting PopupMenu
to the GrabHelper
2012-11-26 15:13:04 -05:00
Jasper St. Pierre
485d16ca4e overview: Remove custom swipe scrolling implementation
https://bugzilla.gnome.org/show_bug.cgi?id=689062
2012-11-26 15:13:04 -05:00
Jasper St. Pierre
1e40264ee4 workspacesView: Don't use the overview swipe scrolling system
Switch to a ClutterPanAction instead too.

https://bugzilla.gnome.org/show_bug.cgi?id=689062
2012-11-26 15:13:04 -05:00
Jasper St. Pierre
ae22bde368 workspacesView: Clean up scroll code a bit
There's no code path that results in us not animating.

https://bugzilla.gnome.org/show_bug.cgi?id=689062
2012-11-26 15:13:04 -05:00
Jasper St. Pierre
32502af652 searchDisplay, appDisplay: Use ClutterPanAction for re-swipe scrolling
The sooner we can kill off the custom overview swipe scroll code, the
better.

https://bugzilla.gnome.org/show_bug.cgi?id=689062
2012-11-26 15:13:03 -05:00
Jasper St. Pierre
7d693cbd17 viewSelector: Set the active page immediately
This prevents some focus management issues.

https://bugzilla.gnome.org/show_bug.cgi?id=689062
2012-11-26 15:13:03 -05:00
Jasper St. Pierre
d86e57a8d9 layout: Dummy hack for now because the X server is amazing
dummy demo garbage
2012-11-26 15:12:52 -05:00
Jasper St. Pierre
75985ae0ce messageTray: Remove dwell to open
This is now covered by pointer barriers.
2012-11-26 15:12:52 -05:00
Jasper St. Pierre
7ee897ead5 layout: Don't show the tray if the user is just skirting the barrier
If the user is just pushing their mouse along the barrier's edge, rather
than pushing down onto the barrier, we shouldn't show the tray. Do this
by keeping track of the distance traveled perpendicular to the barrier,
and releasing the accumulated pressure if we pass a threshold.
2012-11-26 15:12:52 -05:00
Jasper St. Pierre
7c371392da layout: Trigger the message tray by downward pressure
https://bugzilla.gnome.org/show_bug.cgi?id=677215
2012-11-26 15:12:52 -05:00
Jasper St. Pierre
ab549f763d layout: Port to the new mutter-based barrier wrappers
... and remove our old ones.

https://bugzilla.gnome.org/show_bug.cgi?id=677215
2012-11-26 15:12:52 -05:00
Jasper St. Pierre
ea25331a55 messageTray: Remove an unused instance variable 2012-11-26 15:12:52 -05:00
Jasper St. Pierre
c6bc1526fa workspace: Add smooth scrolling support to zoom windows
https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-11-26 15:12:43 -05:00
Jasper St. Pierre
871ae3f9b2 volume: Add smooth scrolling support to adjust output volume
https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-11-26 15:12:43 -05:00
Jasper St. Pierre
8ebbf442cd popupMenu: Add smooth scrolling support for sliders
Allowing smooth scrolling on the Y axis to accurately adjust the value
of the slider.

https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-11-26 15:12:43 -05:00
Jasper St. Pierre
b936f094d1 st-scroll-view: Throw away emulated pointer events
These are sent by the X server and have large deltas. They really
should be filtered out by Clutter (or the X server) somehow, but we
don't have the means to do that yet.

https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-11-26 15:12:43 -05:00
Jasper St. Pierre
165265f4fb st-scroll-view: Add proper smooth scrolling
The code here before was added as dummy code to satisfy an error
in the missing switch, and wasn't ever tested due to the lack of XI2
in mutter. Use the same math as GtkRange does to calculate scroll bar
positions from raw XI2 deltas to allow for proper smooth scrolling.

https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-11-26 15:12:42 -05:00
Jasper St. Pierre
ca73017100 extensionSystem: Don't spam the error log with OUT_OF_DATE errors
Nobody cares

https://bugzilla.gnome.org/show_bug.cgi?id=689108
2012-11-26 15:11:58 -05:00
Cosimo Cecchi
123fb350ce screenshot: don't fire flash if we failed to take picture
https://bugzilla.gnome.org/show_bug.cgi?id=688004
2012-11-26 14:09:07 -05:00
Giovanni Campagna
1a27d7dfc0 MessageTray: remove all tweens when tweening for state parameters
MessageTray._tween sets the state variable to the in-progress value,
so it must be sure that at the end of the animation the value will
be the corresponding final and nothing else will happen in between.

https://bugzilla.gnome.org/show_bug.cgi?id=683986
2012-11-26 18:16:50 +01:00
Carlos Soriano Sánchez
b0c6d44515 Theme: improve notification scrollbar appearance
Message tray: modify bubble scrollview notification padding to
have the same padding at right, bottom, top and left since
having different padding make scrollbar looks missaligned.
Also adjust border radius of bubble to not clash the scrollbar.

https://bugzilla.gnome.org/show_bug.cgi?id=688393
2012-11-26 13:53:23 +00:00
Giovanni Campagna
6092e01428 Telepathy: consolidate and improve connection notifications
Use the empathy icon and name instead of the error icon, use
a friendlier title and remove the Reconnect button.

https://bugzilla.gnome.org/show_bug.cgi?id=687213
2012-11-26 13:49:54 +00:00
Nilamdyuti Goswami
e20ff5ae45 Assamese translation updated 2012-11-26 15:51:37 +05:30
Ani Peter
621a0d70e2 Updated Malayalam translations 2012-11-26 15:03:03 +05:30
Matthias Clasen
855b238ec5 Make it possible to not show the users name permanently
In particular on the lock screen, this can be a privacy issue.
https://bugzilla.gnome.org/show_bug.cgi?id=688577
2012-11-24 17:11:19 -05:00
Giovanni Campagna
96f44e1959 WindowOverlay: animate the close button together with the border
Since the introduction of overlay hover borders, there has a been
a timing disconnection between hiding the border and button, and
this creates noise and reduces the effect of the window+overlay
as a single unit.
Solve that by animating the close button too, so that the two actors
are shown and hidden always at the same time.
Also, consolidate the code to make it clear to future authors that
those two items need to stay coordinated.

https://bugzilla.gnome.org/show_bug.cgi?id=688966
2012-11-24 18:55:47 +01:00
Javier Jardón
242dc8cddd Revert "configure.ac: relax NetworkManager requirement to 0.9.6"
This reverts commit b8a2004872.
2012-11-24 02:03:18 +09:00
Javier Jardón
b8a2004872 configure.ac: relax NetworkManager requirement to 0.9.6
0.9.7 is an unreleased version and Its actually not needed
2012-11-24 01:40:24 +09:00
Nilamdyuti Goswami
63f08bf2c2 Assamese translation updated 2012-11-23 17:19:28 +05:30
Yaron Shahrabani
4734a9ac18 Updated Hebrew translation. 2012-11-23 10:14:22 +02:00
Giovanni Campagna
81cd1e6c40 MessageTray: be explicit about removing tweens
Turns out that tweener has a very complex logic to decide when a new
tween on the same properties overrides completely the old, and unfortunately
what we were doing was not enough in all cases.
Just be explicit, and don't let anything else mess with the state.

https://bugzilla.gnome.org/show_bug.cgi?id=688895
2012-11-22 21:36:17 +01:00
Wouter Bolsterlee
0b9cdea7d2 Updated Dutch translation 2012-11-22 13:37:24 +01:00
Tim Lunn
f63fceb2ea workspacesDisplay: add spacing around the workspacesView
On additional monitors the workspacesView takes up the entire monitor
and in some cases windows in overview can end up hard against the
edge of the monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=688133
2012-11-21 20:02:38 +01:00
Florian Müllner
f0f7165ab6 theme: Style the panel differently according to mode
https://bugzilla.gnome.org/show_bug.cgi?id=684573
2012-11-21 13:10:46 +01:00
Florian Müllner
2511f60d39 sessionMode: Add panelStyle property
The panel should change appearance according to the sessionMode,
so add a new panelStyle sessionMode property which allows to
specify a mode specific style class for the panel actors.

https://bugzilla.gnome.org/show_bug.cgi?id=684573
2012-11-21 13:10:46 +01:00
Florian Müllner
c0f868dd56 panel: Remove .in-overview style class
The panel used to be styled differently in the overview, but
nowadays this is just a left-over.

https://bugzilla.gnome.org/show_bug.cgi?id=684573
2012-11-21 13:10:46 +01:00
Florian Müllner
a112bfdaa2 panelCorner: Only overlap panel if necessary
The panel corners overlap the panel in order to hide the underline
used for active buttons where it is supposed to arc downwards
following the roundness of the corner.
Unfortunately this prevents us from using a transparent panel background,
as the overlapped area ends up with the wrong transparency. Work around
this limitation by only overlapping the panel if there is a visible
border.

https://bugzilla.gnome.org/show_bug.cgi?id=684573
2012-11-21 13:10:46 +01:00
Giovanni Campagna
4535a70f08 Block cancellation of the unlock dialog when dragging
Pressing esc while the mouse is down should not make the curtain fall,
otherwise a gray screen results.

https://bugzilla.gnome.org/show_bug.cgi?id=686800
2012-11-21 12:35:55 +01:00
Giovanni Campagna
b59529e579 MessageTray: fix closing the right click menu
We were trying to disconnect a signal we never added.

https://bugzilla.gnome.org/show_bug.cgi?id=688771
2012-11-21 12:29:43 +01:00
Stéphane Démurget
393c23820a unlockDialog: set password char on verif. failure
Commit c3cab28 removed bits setting the password char that was used to
allow typing the password after a failure but before the first question
for the new attempt came.

Without that code, in complex PAM setups you can end up with a visible
password.

https://bugzilla.gnome.org/show_bug.cgi?id=687113
2012-11-21 00:15:23 +01:00
Stéphane Démurget
e6a3958e45 appDisplay: do not show empty categories
Desktop files can specify if the application should only be shown for
specified desktops with OnlyShowIn and NotShowIn directives options.

If a menu category only contained entries for a different desktop, we
were still creating the category.

We now only add a category button if there is at least one application
to be displayed in this category.

https://bugzilla.gnome.org/show_bug.cgi?id=687970
2012-11-20 21:17:57 +01:00
Stéphane Démurget
59a7fdd2c9 Login: add a spinner for better process indication
We need to do a better job of indicating login process. This can
sometimes take a few seconds (particularly if you get your password
wrong): we need to give better feedback of what's going on.

This adds a spinner next to the login button if the authorization takes
some time.

https://bugzilla.gnome.org/show_bug.cgi?id=687113
2012-11-20 21:08:38 +01:00
Stéphane Démurget
c3cab28c9b Login: sensitivity fixes
The login dialog had these issues:
  - the entry was not really disabled, you could still edit text
  - the sensitivity state was not reset on verification failure
  - the session list was not disabled

The unlock dialog had these issues:
  - "Login as another user..." was not insensitive
  - redundant password char setting, overwriting the one given by the
    question

The entry insensitive style was also wrong.

https://bugzilla.gnome.org/show_bug.cgi?id=687113
2012-11-20 21:08:37 +01:00
Stéphane Démurget
4c55a6f436 modalDialog: do not launch disabled button actions
The "Sign In" button of the login dialog has its look disabled when the
entry is empty, but it can still be triggered by the Enter key.

This fixes the modal dialog so it does not trigger the action of an
insensitive button, and also means we do not need to connect to the
"activate" signal of the entry anymore.

https://bugzilla.gnome.org/show_bug.cgi?id=687113
2012-11-20 21:08:37 +01:00
Stéphane Démurget
c10e4c3117 modalDialog: give more control over the layout
Make the button layout public for callers to be able to have more
control over like adding custom widgets. Also, the clearButtons and
addButton methods are added as convenience for the most frequent usage.

https://bugzilla.gnome.org/show_bug.cgi?id=687113
2012-11-20 21:08:37 +01:00
Giovanni Campagna
3b70094151 MessageTray: fix popping up after there were modals
Open a modal dialog, try to open the message tray -> no effect, the message
tray is blocked by the dialog.
Close the dialog, try to open the message tray by pointer -> still
no effect, because the old timeout id was not cleared the first time,
so the dwell callback thinks the tray is about to open.

https://bugzilla.gnome.org/show_bug.cgi?id=688750
2012-11-20 20:04:30 +01:00
Giovanni Campagna
a370697385 Workspace: Highlight window clone and caption when hovered
Windows in the overview should be highlighted when hovered, to indicate
they are an active target.

Based on a patch by Marc Plano-Lesay <marc.planolesay@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=665310
2012-11-20 18:01:11 +01:00
Giovanni Campagna
8a7c0313f6 Layout: show the OSK on the monitor where the focused window lives
In multimonitor scenarios, it makes sense to show the OSK close to
the window that will actually receive keystrokes.

https://bugzilla.gnome.org/show_bug.cgi?id=685856
2012-11-20 17:57:24 +01:00
Aleksander Morgado
00201f7e6c networkAgent: ensure auto-register is set when the component is enabled
Setting auto-register to true launches the initial registration, and will
afterwards re-launch the agent registration if NetworkManager gets restarted.

When the component is disabled we'll first disable auto-registration, and only
then request to unregister.

https://bugzilla.gnome.org/show_bug.cgi?id=688379
2012-11-20 14:00:03 +01:00
Stéphane Démurget
5e3111bad8 ctrl-alt-tab: use better icons
The top panel and message tray icons were by default a gnome foot and
are replaced by better ones. The applications icon is now using the
symbolic apps icon of the dash, and the windows icon is also improved.

https://bugzilla.gnome.org/show_bug.cgi?id=641303
2012-11-20 11:42:04 +00:00
Victoria Martínez de la Cruz
a327c10c60 Add 'No Messages' label when message tray is empty
To avoid confusion in new users, a 'No Messages' label is shown when messages
tray is empty.

https://bugzilla.gnome.org/show_bug.cgi?id=686738
2012-11-20 09:36:47 +00:00
Yuri Myasoedov
938bc07e3c Fixed some errors in Russian translation 2012-11-20 11:47:45 +04:00
Sebastian Keller
d053d45a6d messageTray: don't accidentally shift the tray around in the overview
https://bugzilla.gnome.org/show_bug.cgi?id=688422
2012-11-20 01:06:47 +01:00
34 changed files with 2803 additions and 2452 deletions

View File

@@ -114,14 +114,6 @@ AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION]) GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
saved_CFLAGS=$CFLAGS
saved_LIBS=$LIBS
CFLAGS=$GNOME_SHELL_CFLAGS
LIBS=$GNOME_SHELL_LIBS
AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
CFLAGS=$saved_CFLAGS
LIBS=$saved_LIBS
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION) PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(TRAY, gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)

View File

@@ -65,6 +65,11 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
menuitem in single-user, single-session situations. menuitem in single-user, single-session situations.
</_description> </_description>
</key> </key>
<key name="show-full-name" type="b">
<default>true</default>
<_summary>Show full name in the user menu</_summary>
<_description>Whether the users full name is shown in the user menu or not.</_description>
</key>
<child name="calendar" schema="org.gnome.shell.calendar"/> <child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="recorder" schema="org.gnome.shell.recorder"/> <child name="recorder" schema="org.gnome.shell.recorder"/>
<child name="keybindings" schema="org.gnome.shell.keybindings"/> <child name="keybindings" schema="org.gnome.shell.keybindings"/>

View File

@@ -405,11 +405,13 @@ StScrollBar StButton#vhandle:active {
padding: 0 4px; padding: 0 4px;
} }
.login-dialog-prompt-entry:insensitive { .modal-dialog StEntry:insensitive {
color: rgba(0,0,0,0.7); border-color: #666666;
border: 2px solid #565656; color: #9f9f9f;
background-gradient-start: rgb(200,200,200); border: 2px solid #9f9f9f;
background-gradient-end: rgb(210,210,210); background-gradient-direction: none;
background-color: rgba(102, 102, 102, 0.15);
box-shadow: inset 0 0 rgba(0,0,0,1.0);
} }
/* Panel */ /* Panel */
@@ -418,6 +420,18 @@ StScrollBar StButton#vhandle:active {
background-color: black; background-color: black;
font-weight: bold; font-weight: bold;
height: 1.86em; height: 1.86em;
transition-duration: 250;
}
#panel.lock-screen {
height: 2em;
background-color: rgba(0,0,0,0.3);
}
#panel.unlock-screen,
#panel.login-screen {
height: 2em;
background-color: transparent;
} }
#panelLeft, #panelCenter { #panelLeft, #panelCenter {
@@ -453,6 +467,13 @@ StScrollBar StButton#vhandle:active {
-panel-corner-border-color: rgba(255,255,255,0.8); -panel-corner-border-color: rgba(255,255,255,0.8);
} }
.panel-corner.lock-screen,
.panel-corner.unlock-screen,
.panel-corner.login-screen {
-panel-corner-background-color: transparent;
-panel-corner-border-color: transparent;
}
#appMenu { #appMenu {
spacing: 4px; spacing: 4px;
} }
@@ -485,6 +506,24 @@ StScrollBar StButton#vhandle:active {
transition-duration: 100; transition-duration: 100;
} }
#panel.unlock-screen .panel-button,
#panel.lock-screen .panel-button,
#panel.login-screen .panel-button {
color: #e6e6e6;
}
#panel.unlock-screen .panel-button:hover,
#panel.lock-screen .panel-button:hover,
#panel.login-screen .panel-button:hover,
#panel.unlock-screen .panel-button:active,
#panel.lock-screen .panel-button:active,
#panel.login-screen .panel-button:active,
#panel.unlock-screen .panel-button:focus,
#panel.lock-screen .panel-button:focus,
#panel.login-screen .panel-button:focus {
color: white;
}
.panel-button:hover { .panel-button:hover {
color: white; color: white;
text-shadow: black 0px 2px 2px; text-shadow: black 0px 2px 2px;
@@ -615,6 +654,7 @@ StScrollBar StButton#vhandle:active {
border-radius: 8px; border-radius: 8px;
padding: 4px 12px; padding: 4px 12px;
-shell-caption-spacing: 12px; -shell-caption-spacing: 12px;
border: 2px solid rgba(0, 0, 0, 0);
} }
.window-close, .notification-close { .window-close, .notification-close {
@@ -625,7 +665,16 @@ StScrollBar StButton#vhandle:active {
} }
.window-close { .window-close {
-shell-close-overlap: 20px; -shell-close-overlap: 16px;
}
.window-caption:hover {
border: 2px solid rgba(255, 255, 255, 0);
}
.window-clone-border {
border: 4px solid rgba(255, 255, 255, 0.5);
border-radius: 4px;
} }
.notification-close { .notification-close {
@@ -1222,6 +1271,12 @@ StScrollBar StButton#vhandle:active {
outline: 1px solid rgba(128, 128, 128, 0.3); outline: 1px solid rgba(128, 128, 128, 0.3);
} }
.no-messages-label {
font-family: cantarell, sans-serif;
font-size: 11pt;
color: #999999;
}
.notification { .notification {
border-radius: 10px 10px 0px 0px; border-radius: 10px 10px 0px 0px;
background: rgba(0,0,0,0.8); background: rgba(0,0,0,0.8);
@@ -1255,7 +1310,7 @@ StScrollBar StButton#vhandle:active {
} }
.summary-boxpointer { .summary-boxpointer {
-arrow-border-radius: 8px; -arrow-border-radius: 15px;
-arrow-background-color: rgba(0,0,0,0.8); -arrow-background-color: rgba(0,0,0,0.8);
-arrow-base: 36px; -arrow-base: 36px;
-arrow-rise: 18px; -arrow-rise: 18px;
@@ -1276,8 +1331,8 @@ StScrollBar StButton#vhandle:active {
.summary-notification-stack-scrollview { .summary-notification-stack-scrollview {
max-height: 18em; max-height: 18em;
padding-top: 6px; padding-top: 8px;
padding-bottom: 6px; padding-bottom: 8px;
} }
.summary-notification-stack-scrollview:ltr { .summary-notification-stack-scrollview:ltr {
@@ -2195,6 +2250,10 @@ StScrollBar StButton#vhandle:active {
height: .75em; height: .75em;
} }
.login-dialog .modal-dialog-button-box {
spacing: 3px;
}
.login-dialog .modal-dialog-button { .login-dialog .modal-dialog-button {
border-radius: 5px; border-radius: 5px;
padding: 3px 18px; padding: 3px 18px;

View File

@@ -39,6 +39,7 @@ const GdmUtil = imports.gdm.util;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Panel = imports.ui.panel;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu; const UserMenu = imports.ui.userMenu;
@@ -48,6 +49,10 @@ const _SCROLL_ANIMATION_TIME = 0.5;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0; const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_HEIGHT = 16; const _LOGO_ICON_HEIGHT = 16;
const WORK_SPINNER_ICON_SIZE = 24;
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
const WORK_SPINNER_ANIMATION_TIME = 0.3;
let _loginDialog = null; let _loginDialog = null;
function _smoothlyResizeActor(actor, width, height) { function _smoothlyResizeActor(actor, width, height) {
@@ -604,6 +609,14 @@ const SessionList = new Lang.Class({
this.close(); this.close();
}, },
updateSensitivity: function(sensitive) {
this._button.reactive = sensitive;
this._button.can_focus = sensitive;
for (let id in this._items)
this._items[id].actor.reactive = sensitive;
},
setActiveSession: function(sessionId) { setActiveSession: function(sessionId) {
if (sessionId == this._activeSessionId) if (sessionId == this._activeSessionId)
return; return;
@@ -685,6 +698,7 @@ const LoginDialog = new Lang.Class({
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient); this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient);
this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion)); this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage)); this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
this._userVerifier.connect('verification-failed', Lang.bind(this, this._verificationFailed));
this._userVerifier.connect('reset', Lang.bind(this, this._reset)); this._userVerifier.connect('reset', Lang.bind(this, this._reset));
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint)); this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint)); this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
@@ -750,6 +764,9 @@ const LoginDialog = new Lang.Class({
this._promptLoginHint.hide(); this._promptLoginHint.hide();
this._promptBox.add(this._promptLoginHint); this._promptBox.add(this._promptLoginHint);
this._signInButton = null;
this._workSpinner = null;
this._sessionList = new SessionList(); this._sessionList = new SessionList();
this._sessionList.connect('session-activated', this._sessionList.connect('session-activated',
Lang.bind(this, function(list, sessionId) { Lang.bind(this, function(list, sessionId) {
@@ -829,6 +846,7 @@ const LoginDialog = new Lang.Class({
}, },
_reset: function() { _reset: function() {
this._updateSensitivity(true);
this._promptMessage.hide(); this._promptMessage.hide();
this._user = null; this._user = null;
this._verifyingUser = false; this._verifyingUser = false;
@@ -839,6 +857,13 @@ const LoginDialog = new Lang.Class({
this._showUserList(); this._showUserList();
}, },
_verificationFailed: function() {
this._promptEntry.text = '';
this._updateSensitivity(true);
this._setWorking(false);
},
_onDefaultSessionChanged: function(client, sessionId) { _onDefaultSessionChanged: function(client, sessionId) {
this._sessionList.setActiveSession(sessionId); this._sessionList.setActiveSession(sessionId);
}, },
@@ -909,35 +934,12 @@ const LoginDialog = new Lang.Class({
_showPrompt: function(forSecret) { _showPrompt: function(forSecret) {
let hold = new Batch.Hold(); let hold = new Batch.Hold();
let cancelButtonInfo = { action: Lang.bind(this, this.cancel),
label: _("Cancel"),
key: Clutter.Escape };
let okButtonInfo = { action: Lang.bind(this, function() {
hold.release();
}),
label: forSecret ? C_("button", "Sign In") : _("Next"),
default: true };
let buttons = [];
if (!this._disableUserList || this._verifyingUser)
buttons.push(cancelButtonInfo);
buttons.push(okButtonInfo);
let tasks = [function() { let tasks = [function() {
return this._fadeInPrompt(); return this._fadeInPrompt();
}, },
function() { function() {
this.setButtons(buttons); this._prepareDialog(forSecret, hold);
let updateOkButtonEnabled = Lang.bind(this, function() {
let sensitive = this._promptEntry.text.length > 0;
okButtonInfo.button.reactive = sensitive;
okButtonInfo.button.can_focus = sensitive;
});
updateOkButtonEnabled();
this._promptEntryTextChangedId = this._promptEntry.clutter_text.connect('text-changed', updateOkButtonEnabled);
}, },
hold]; hold];
@@ -947,6 +949,63 @@ const LoginDialog = new Lang.Class({
return batch.run(); return batch.run();
}, },
_prepareDialog: function(forSecret, hold) {
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();
this.buttonLayout.visible = true;
this.clearButtons();
if (!this._disableUserList || this._verifyingUser)
this.addButton({ action: Lang.bind(this, this.cancel),
label: _("Cancel"),
key: Clutter.Escape },
{ expand: true,
x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
this.buttonLayout.add(this._workSpinner.actor,
{ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
this._signInButton = this.addButton({ action: Lang.bind(this, function() {
hold.release();
}),
label: forSecret ? C_("button", "Sign In") : _("Next"),
default: true },
{ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
this._promptEntryTextChangedId =
this._promptEntry.clutter_text.connect('text-changed',
Lang.bind(this, function() {
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
}));
},
_updateSensitivity: function(sensitive) {
this._promptEntry.reactive = sensitive;
this._promptEntry.clutter_text.editable = sensitive;
this._sessionList.updateSensitivity(sensitive);
this._updateSignInButtonSensitivity(sensitive);
},
_updateSignInButtonSensitivity: function(sensitive) {
if (this._signInButton) {
this._signInButton.reactive = sensitive;
this._signInButton.can_focus = sensitive;
}
},
_hidePrompt: function() { _hidePrompt: function() {
this.setButtons([]); this.setButtons([]);
@@ -956,13 +1015,20 @@ const LoginDialog = new Lang.Class({
} }
let tasks = [function() { let tasks = [function() {
this._setWorking(false);
return GdmUtil.fadeOutActor(this._promptBox); return GdmUtil.fadeOutActor(this._promptBox);
}, },
function() { function() {
this._promptLoginHint.hide(); this._promptLoginHint.hide();
this._promptEntry.reactive = true;
this._updateSensitivity(true);
this._promptEntry.set_text(''); this._promptEntry.set_text('');
this.clearButtons();
this._workSpinner = null;
this._signInButton = null;
}]; }];
let batch = new Batch.ConsecutiveBatch(this, tasks); let batch = new Batch.ConsecutiveBatch(this, tasks);
@@ -970,6 +1036,31 @@ const LoginDialog = new Lang.Class({
return batch.run(); return batch.run();
}, },
_setWorking: function(working) {
if (!this._workSpinner)
return;
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: WORK_SPINNER_ANIMATION_DELAY,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
this._workSpinner.stop();
}
});
}
},
_askQuestion: function(verifier, serviceName, question, passwordChar) { _askQuestion: function(verifier, serviceName, question, passwordChar) {
this._promptLabel.set_text(question); this._promptLabel.set_text(question);
@@ -981,9 +1072,10 @@ const LoginDialog = new Lang.Class({
}, },
function() { function() {
let _text = this._promptEntry.get_text(); let text = this._promptEntry.get_text();
this._promptEntry.reactive = false; this._updateSensitivity(false);
this._userVerifier.answerQuery(serviceName, _text); this._setWorking(true);
this._userVerifier.answerQuery(serviceName, text);
}]; }];
let batch = new Batch.ConsecutiveBatch(this, tasks); let batch = new Batch.ConsecutiveBatch(this, tasks);

View File

@@ -48,18 +48,16 @@ const AlphabeticalView = new Lang.Class({
style_class: 'vfade' }); style_class: 'vfade' });
this.actor.add_actor(box); this.actor.add_actor(box);
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this.actor.connect('notify::mapped', Lang.bind(this, let action = new Clutter.PanAction({ interpolate: true });
function() { action.connect('pan', Lang.bind(this, this._onPan));
if (!this.actor.mapped) this.actor.add_action(action);
return; },
_onPan: function(action) {
let [dist, dx, dy] = action.get_motion_delta(0);
let adjustment = this.actor.vscroll.adjustment; let adjustment = this.actor.vscroll.adjustment;
let direction = Overview.SwipeScrollDirection.VERTICAL; adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
Main.overview.setScrollAdjustment(adjustment, direction); return false;
// Reset scroll on mapping
adjustment.value = 0;
}));
}, },
removeAll: function() { removeAll: function() {
@@ -216,6 +214,16 @@ const ViewByCategories = new Lang.Class({
}, },
_addCategory: function(name, index, dir) { _addCategory: function(name, index, dir) {
let apps;
if (dir != null) {
apps = [];
this._loadCategory(dir, apps);
if (apps.length == 0)
return;
}
let button = new St.Button({ label: GLib.markup_escape_text (name, -1), let button = new St.Button({ label: GLib.markup_escape_text (name, -1),
style_class: 'app-filter', style_class: 'app-filter',
x_align: St.Align.START, x_align: St.Align.START,
@@ -225,12 +233,9 @@ const ViewByCategories = new Lang.Class({
this._selectCategory(index); this._selectCategory(index);
})); }));
var apps;
if (dir == null) { if (dir == null) {
this._allCategoryButton = button; this._allCategoryButton = button;
} else { } else {
apps = [];
this._loadCategory(dir, apps);
this._categories.push({ apps: apps, this._categories.push({ apps: apps,
name: name, name: name,
button: button }); button: button });

View File

@@ -598,7 +598,7 @@ const NetworkAgent = new Lang.Class({
}, },
enable: function() { enable: function() {
this._native.register(); this._native.auto_register = true;
}, },
disable: function() { disable: function() {
@@ -612,6 +612,7 @@ const NetworkAgent = new Lang.Class({
this._vpnRequests[requestId].cancel(true); this._vpnRequests[requestId].cancel(true);
this._vpnRequests = { }; this._vpnRequests = { };
this._native.auto_register = false;
this._native.unregister(); this._native.unregister();
}, },

View File

@@ -383,25 +383,12 @@ const TelepathyClient = new Lang.Class({
} }
/* Display notification to ask user to accept/reject request */ /* Display notification to ask user to accept/reject request */
let source = this._ensureSubscriptionSource(); let source = this._ensureAppSource();
let notif = new SubscriptionRequestNotification(source, contact); let notif = new SubscriptionRequestNotification(source, contact);
source.notify(notif); source.notify(notif);
}, },
_ensureSubscriptionSource: function() {
if (this._subscriptionSource == null) {
this._subscriptionSource = new MessageTray.Source(_("Subscription request"),
'gtk-dialog-question');
Main.messageTray.add(this._subscriptionSource);
this._subscriptionSource.connect('destroy', Lang.bind(this, function () {
this._subscriptionSource = null;
}));
}
return this._subscriptionSource;
},
_accountConnectionStatusNotifyCb: function(account) { _accountConnectionStatusNotifyCb: function(account) {
let connectionError = account.connection_error; let connectionError = account.connection_error;
@@ -415,7 +402,7 @@ const TelepathyClient = new Lang.Class({
return; return;
/* Display notification that account failed to connect */ /* Display notification that account failed to connect */
let source = this._ensureAccountSource(); let source = this._ensureAppSource();
notif = new AccountNotification(source, account, connectionError); notif = new AccountNotification(source, account, connectionError);
this._accountNotifications[account.get_object_path()] = notif; this._accountNotifications[account.get_object_path()] = notif;
@@ -425,17 +412,16 @@ const TelepathyClient = new Lang.Class({
source.notify(notif); source.notify(notif);
}, },
_ensureAccountSource: function() { _ensureAppSource: function() {
if (this._accountSource == null) { if (this._appSource == null) {
this._accountSource = new MessageTray.Source(_("Connection error"), this._appSource = new MessageTray.Source(_("Chat"), 'empathy');
'gtk-dialog-error'); Main.messageTray.add(this._appSource);
Main.messageTray.add(this._accountSource); this._appSource.connect('destroy', Lang.bind(this, function () {
this._accountSource.connect('destroy', Lang.bind(this, function () { this._appSource = null;
this._accountSource = null;
})); }));
} }
return this._accountSource; return this._appSource;
} }
}); });
@@ -1353,26 +1339,16 @@ const AccountNotification = new Lang.Class({
this.parent(source, this.parent(source,
/* translators: argument is the account name, like /* translators: argument is the account name, like
* name@jabber.org for example. */ * name@jabber.org for example. */
_("Connection to %s failed").format(account.get_display_name()), _("Unable to connect to %s").format(account.get_display_name()),
null, { customContent: true }); this._getMessage(connectionError));
this._label = new St.Label();
this.addActor(this._label);
this._updateMessage(connectionError);
this._account = account; this._account = account;
this.addButton('reconnect', _("Reconnect")); this.addButton('view', _("View account"));
this.addButton('edit', _("Edit account"));
this.connect('action-invoked', Lang.bind(this, function(self, action) { this.connect('action-invoked', Lang.bind(this, function(self, action) {
switch (action) { switch (action) {
case 'reconnect': case 'view':
// If it fails again, a new notification should pop up with the
// new error.
account.reconnect_async(null);
break;
case 'edit':
let cmd = '/usr/bin/empathy-accounts' let cmd = '/usr/bin/empathy-accounts'
+ ' --select-account=%s' + ' --select-account=%s'
.format(account.get_path_suffix()); .format(account.get_path_suffix());
@@ -1398,19 +1374,19 @@ const AccountNotification = new Lang.Class({
if (status == Tp.ConnectionStatus.CONNECTED) { if (status == Tp.ConnectionStatus.CONNECTED) {
this.destroy(); this.destroy();
} else if (status == Tp.ConnectionStatus.DISCONNECTED) { } else if (status == Tp.ConnectionStatus.DISCONNECTED) {
this._updateMessage(account.connection_error); this.update(this.title, this._getMessage(account.connection_error));
} }
})); }));
}, },
_updateMessage: function(connectionError) { _getMessage: function(connectionError) {
let message; let message;
if (connectionError in _connectionErrorMessages) { if (connectionError in _connectionErrorMessages) {
message = _connectionErrorMessages[connectionError]; message = _connectionErrorMessages[connectionError];
} else { } else {
message = _("Unknown reason"); message = _("Unknown reason");
} }
this._label.set_text(message); return message;
}, },
destroy: function() { destroy: function() {

View File

@@ -126,11 +126,7 @@ function logExtensionError(uuid, error) {
let message = '' + error; let message = '' + error;
if (error.state)
extension.state = error.state;
else
extension.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
if (!extension.errors) if (!extension.errors)
extension.errors = []; extension.errors = [];
@@ -145,11 +141,8 @@ function loadExtension(extension) {
extension.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
if (ExtensionUtils.isOutOfDate(extension)) { if (ExtensionUtils.isOutOfDate(extension)) {
let error = new Error('extension is not compatible with current GNOME Shell and/or GJS version'); extension.state = ExtensionState.OUT_OF_DATE;
error.state = ExtensionState.OUT_OF_DATE; } else {
throw error;
}
let enabled = enabledExtensions.indexOf(extension.uuid) != -1; let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
if (enabled) { if (enabled) {
initExtension(extension.uuid); initExtension(extension.uuid);
@@ -158,6 +151,7 @@ function loadExtension(extension) {
} else { } else {
extension.state = ExtensionState.INITIALIZED; extension.state = ExtensionState.INITIALIZED;
} }
}
_signals.emit('extension-state-changed', extension); _signals.emit('extension-state-changed', extension);
} }

View File

@@ -43,7 +43,6 @@ const GrabHelper = new Lang.Class({
this._actors = []; this._actors = [];
this._capturedEventId = 0; this._capturedEventId = 0;
this._eventId = 0;
this._keyFocusNotifyId = 0; this._keyFocusNotifyId = 0;
this._focusWindowChangedId = 0; this._focusWindowChangedId = 0;
this._ignoreRelease = false; this._ignoreRelease = false;
@@ -77,10 +76,25 @@ const GrabHelper = new Lang.Class({
} }
}, },
_actorInGrabStack: function(actor) {
while (actor) {
for (let i = 0; i < this._grabStack.length; i++) {
let grab = this._grabStack[i];
if (grab.actor == actor)
return i;
}
actor = actor.get_parent();
}
return -1;
},
_isWithinGrabbedActor: function(actor) { _isWithinGrabbedActor: function(actor) {
let currentActor = this.currentGrab.actor;
while (actor) { while (actor) {
if (this._actors.indexOf(actor) != -1) if (this._actors.indexOf(actor) != -1)
return true; return true;
if (actor == currentActor)
return true;
actor = actor.get_parent(); actor = actor.get_parent();
} }
return false; return false;
@@ -90,6 +104,14 @@ const GrabHelper = new Lang.Class({
return this._grabStack[this._grabStack.length - 1] || {}; return this._grabStack[this._grabStack.length - 1] || {};
}, },
get grabbed() {
return this._grabStack.length > 0;
},
get grabStack() {
return this._grabStack;
},
_findStackIndex: function(actor) { _findStackIndex: function(actor) {
if (!actor) if (!actor)
return -1; return -1;
@@ -171,7 +193,6 @@ const GrabHelper = new Lang.Class({
return false; return false;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent)); this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this._eventId = global.stage.connect('event', Lang.bind(this, this._onEvent));
} }
this._modalCount++; this._modalCount++;
@@ -188,11 +209,6 @@ const GrabHelper = new Lang.Class({
this._capturedEventId = 0; this._capturedEventId = 0;
} }
if (this._eventId > 0) {
global.stage.disconnect(this._eventId);
this._eventId = 0;
}
Main.popModal(this._owner); Main.popModal(this._owner);
global.sync_pointer(); global.sync_pointer();
}, },
@@ -323,27 +339,22 @@ const GrabHelper = new Lang.Class({
if (Main.keyboard.shouldTakeEvent(event)) if (Main.keyboard.shouldTakeEvent(event))
return false; return false;
if (button) { if (type == Clutter.EventType.KEY_PRESS &&
// If we have a press event, ignore the next event,
// which should be a release event.
if (press)
this._ignoreRelease = true;
this.ungrab({ actor: this._grabStack[0].actor });
}
return this._modalCount > 0;
},
// We catch 'event' rather than 'key-press-event' so that we get
// a chance to run before the overview's own Escape check
_onEvent: function(actor, event) {
if (event.type() == Clutter.EventType.KEY_PRESS &&
event.get_key_symbol() == Clutter.KEY_Escape) { event.get_key_symbol() == Clutter.KEY_Escape) {
this.ungrab(); this.ungrab();
return true; return true;
} }
return false; if (button) {
// If we have a press event, ignore the next event,
// which should be a release event.
if (press)
this._ignoreRelease = true;
let i = this._actorInGrabStack(event.get_source()) + 1;
this.ungrab({ actor: this._grabStack[i].actor });
}
return this._modalCount > 0;
}, },
_onKeyFocusChanged: function() { _onKeyFocusChanged: function() {

View File

@@ -251,7 +251,7 @@ const Keyboard = new Lang.Class({
this._focusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged)); this._focusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
if (show) if (show)
this.show(); this.show(Main.layoutManager.focusIndex);
else else
this._createSource(); this._createSource();
}, },
@@ -375,7 +375,7 @@ const Keyboard = new Lang.Class({
if (!this._enableKeyboard) if (!this._enableKeyboard)
return; return;
let monitor = Main.layoutManager.bottomMonitor; let monitor = Main.layoutManager.keyboardMonitor;
let maxHeight = monitor.height / 3; let maxHeight = monitor.height / 3;
this.actor.width = monitor.width; this.actor.width = monitor.width;
@@ -462,9 +462,9 @@ const Keyboard = new Lang.Class({
actor._extended_keys || actor.extended_key; actor._extended_keys || actor.extended_key;
}, },
show: function () { show: function (monitor) {
Main.layoutManager.keyboardIndex = monitor;
this._redraw(); this._redraw();
Main.layoutManager.showKeyboard(); Main.layoutManager.showKeyboard();
this._destroySource(); this._destroySource();
}, },
@@ -512,7 +512,7 @@ const Keyboard = new Lang.Class({
if (timestamp != Clutter.CURRENT_TIME) if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp; this._timestamp = timestamp;
this.show(); this.show(Main.layoutManager.focusIndex);
}, },
Hide: function(timestamp) { Hide: function(timestamp) {
@@ -566,6 +566,7 @@ const KeyboardSource = new Lang.Class({
}, },
open: function() { open: function() {
this._keyboard.show(); // Show the OSK below the message tray
this._keyboard.show(Main.layoutManager.bottomIndex);
} }
}); });

View File

@@ -19,6 +19,12 @@ const STARTUP_ANIMATION_TIME = 0.2;
const KEYBOARD_ANIMATION_TIME = 0.5; const KEYBOARD_ANIMATION_TIME = 0.5;
const PLYMOUTH_TRANSITION_TIME = 1; const PLYMOUTH_TRANSITION_TIME = 1;
const MESSAGE_TRAY_PRESSURE_THRESHOLD = 200;
// The maximium amount that the user is allowed to travel
// perpendicular to the barrier before we release the accumulated
// pressure.
const MESSAGE_TRAY_MAX_SKIRT = 100;
const MonitorConstraint = new Lang.Class({ const MonitorConstraint = new Lang.Class({
Name: 'MonitorConstraint', Name: 'MonitorConstraint',
Extends: Clutter.Constraint, Extends: Clutter.Constraint,
@@ -103,11 +109,12 @@ const LayoutManager = new Lang.Class({
this.monitors = []; this.monitors = [];
this.primaryMonitor = null; this.primaryMonitor = null;
this.primaryIndex = -1; this.primaryIndex = -1;
this._keyboardIndex = -1;
this._hotCorners = []; this._hotCorners = [];
this._background = null; this._background = null;
this._leftPanelBarrier = 0; this._leftPanelBarrier = null;
this._rightPanelBarrier = 0; this._rightPanelBarrier = null;
this._trayBarrier = 0; this._trayBarrier = null;
this._chrome = new Chrome(this); this._chrome = new Chrome(this);
@@ -128,6 +135,8 @@ const LayoutManager = new Lang.Class({
this.trayBox = new St.Widget({ name: 'trayBox', this.trayBox = new St.Widget({ name: 'trayBox',
layout_manager: new Clutter.BinLayout() }); layout_manager: new Clutter.BinLayout() });
this.addChrome(this.trayBox); this.addChrome(this.trayBox);
this.trayBox.connect('allocation-changed',
Lang.bind(this, this._updateTrayBarrier));
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox', this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
reactive: true, reactive: true,
@@ -240,9 +249,8 @@ const LayoutManager = new Lang.Class({
this.panelBox.set_position(this.primaryMonitor.x, this.primaryMonitor.y); this.panelBox.set_position(this.primaryMonitor.x, this.primaryMonitor.y);
this.panelBox.set_size(this.primaryMonitor.width, -1); this.panelBox.set_size(this.primaryMonitor.width, -1);
this.keyboardBox.set_position(this.bottomMonitor.x, if (this.keyboardIndex < 0)
this.bottomMonitor.y + this.bottomMonitor.height); this.keyboardIndex = this.primaryIndex;
this.keyboardBox.set_size(this.bottomMonitor.width, -1);
this.trayBox.set_position(this.bottomMonitor.x, this.trayBox.set_position(this.bottomMonitor.x,
this.bottomMonitor.y + this.bottomMonitor.height); this.bottomMonitor.y + this.bottomMonitor.height);
@@ -257,24 +265,50 @@ const LayoutManager = new Lang.Class({
}, },
_updatePanelBarriers: function() { _updatePanelBarriers: function() {
if (this._leftPanelBarrier) if (this._leftPanelBarrier) {
global.destroy_pointer_barrier(this._leftPanelBarrier); this._leftPanelBarrier.destroy();
if (this._rightPanelBarrier) this._leftPanelBarrier = null;
global.destroy_pointer_barrier(this._rightPanelBarrier); }
if (this._rightPanelBarrier) {
this._rightPanelBarrier.destroy();
this._rightPanelBarrier = null;
}
if (this.panelBox.height) { if (this.panelBox.height) {
let primary = this.primaryMonitor; let primary = this.primaryMonitor;
this._leftPanelBarrier =
global.create_pointer_barrier(primary.x, primary.y, this._leftPanelBarrier = new Meta.Barrier({ display: global.display,
primary.x, primary.y + this.panelBox.height, x1: primary.x, y1: primary.y,
1 /* BarrierPositiveX */); x2: primary.x, y2: primary.y + this.panelBox.height,
this._rightPanelBarrier = directions: Meta.BarrierDirection.POSITIVE_X });
global.create_pointer_barrier(primary.x + primary.width, primary.y, this._rightPanelBarrier = new Meta.Barrier({ display: global.display,
primary.x + primary.width, primary.y + this.panelBox.height, x1: primary.x + primary.width, y1: primary.y,
4 /* BarrierNegativeX */); x2: primary.x + primary.width, y2: primary.y + this.panelBox.height,
} else { directions: Meta.BarrierDirection.NEGATIVE_X });
this._leftPanelBarrier = 0; }
this._rightPanelBarrier = 0; },
_updateTrayBarrier: function() {
let monitor = this.bottomMonitor;
if (this._trayBarrier) {
this._trayBarrier.destroy();
this._trayBarrier = null;
}
if (Main.messageTray) {
this._trayBarrier = new Meta.Barrier({ display: global.display,
x1: monitor.x, x2: monitor.x + monitor.width,
y1: monitor.y + monitor.height - 1, y2: monitor.y + monitor.height - 1,
directions: Meta.BarrierDirection.NEGATIVE_Y });
this._trayPressure = new PressureBarrier(this._trayBarrier,
MESSAGE_TRAY_PRESSURE_THRESHOLD,
MESSAGE_TRAY_MAX_SKIRT);
this._trayPressure.connect('trigger', function() {
Main.messageTray.openTray();
});
} }
}, },
@@ -305,6 +339,42 @@ const LayoutManager = new Lang.Class({
return this.monitors[index]; return this.monitors[index];
}, },
get keyboardMonitor() {
return this.monitors[this.keyboardIndex];
},
get focusIndex() {
let i = Main.layoutManager.primaryIndex;
if (global.stage_input_mode == Shell.StageInputMode.FOCUSED ||
global.stage_input_mode == Shell.StageInputMode.FULLSCREEN) {
let focusActor = global.stage.key_focus;
if (focusActor)
i = this._chrome.findIndexForActor(focusActor);
} else {
let focusWindow = global.display.focus_window;
if (focusWindow)
i = this._chrome.findIndexForWindow(focusWindow.get_compositor_private());
}
return i;
},
get focusMonitor() {
return this.monitors[this.focusIndex];
},
set keyboardIndex(v) {
this._keyboardIndex = v;
this.keyboardBox.set_position(this.keyboardMonitor.x,
this.keyboardMonitor.y + this.keyboardMonitor.height);
this.keyboardBox.set_size(this.keyboardMonitor.width, -1);
},
get keyboardIndex() {
return this._keyboardIndex;
},
_startupAnimation: function() { _startupAnimation: function() {
this.panelBox.anchor_y = this.panelBox.height; this.panelBox.anchor_y = this.panelBox.height;
@@ -363,11 +433,14 @@ const LayoutManager = new Lang.Class({
onComplete: this._showKeyboardComplete, onComplete: this._showKeyboardComplete,
onCompleteScope: this onCompleteScope: this
}); });
if (this.keyboardIndex == this.bottomIndex) {
Tweener.addTween(this.trayBox, Tweener.addTween(this.trayBox,
{ anchor_y: this.keyboardBox.height, { anchor_y: this.keyboardBox.height,
time: KEYBOARD_ANIMATION_TIME, time: KEYBOARD_ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
}
this.emit('keyboard-visible-changed', true); this.emit('keyboard-visible-changed', true);
}, },
@@ -379,6 +452,7 @@ const LayoutManager = new Lang.Class({
this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', Lang.bind(this, function () { this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', Lang.bind(this, function () {
this.keyboardBox.anchor_y = this.keyboardBox.height; this.keyboardBox.anchor_y = this.keyboardBox.height;
if (this.keyboardIndex == this.bottomIndex)
this.trayBox.anchor_y = this.keyboardBox.height; this.trayBox.anchor_y = this.keyboardBox.height;
})); }));
}, },
@@ -395,11 +469,14 @@ const LayoutManager = new Lang.Class({
onComplete: this._hideKeyboardComplete, onComplete: this._hideKeyboardComplete,
onCompleteScope: this onCompleteScope: this
}); });
if (this.keyboardIndex == this.bottomIndex) {
Tweener.addTween(this.trayBox, Tweener.addTween(this.trayBox,
{ anchor_y: 0, { anchor_y: 0,
time: immediate ? 0 : KEYBOARD_ANIMATION_TIME, time: immediate ? 0 : KEYBOARD_ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
}
this.emit('keyboard-visible-changed', false); this.emit('keyboard-visible-changed', false);
}, },
@@ -463,7 +540,7 @@ const LayoutManager = new Lang.Class({
}, },
findMonitorForActor: function(actor) { findMonitorForActor: function(actor) {
return this._chrome.findMonitorForActor(actor); return this.monitors[this._chrome.findIndexForActor(actor)];
} }
}); });
Signals.addSignalMethods(LayoutManager.prototype); Signals.addSignalMethods(LayoutManager.prototype);
@@ -812,6 +889,7 @@ const Chrome = new Lang.Class({
_relayout: function() { _relayout: function() {
this._monitors = this._layoutManager.monitors; this._monitors = this._layoutManager.monitors;
this._primaryIndex = this._layoutManager.primaryIndex;
this._primaryMonitor = this._layoutManager.primaryMonitor; this._primaryMonitor = this._layoutManager.primaryMonitor;
this._updateFullscreen(); this._updateFullscreen();
@@ -827,32 +905,47 @@ const Chrome = new Lang.Class({
let monitor = this._monitors[i]; let monitor = this._monitors[i];
if (cx >= monitor.x && cx < monitor.x + monitor.width && if (cx >= monitor.x && cx < monitor.x + monitor.width &&
cy >= monitor.y && cy < monitor.y + monitor.height) cy >= monitor.y && cy < monitor.y + monitor.height)
return monitor; return i;
} }
// If the center is not on a monitor, return the first overlapping monitor // If the center is not on a monitor, return the first overlapping monitor
for (let i = 0; i < this._monitors.length; i++) { for (let i = 0; i < this._monitors.length; i++) {
let monitor = this._monitors[i]; let monitor = this._monitors[i];
if (x + w > monitor.x && x < monitor.x + monitor.width && if (x + w > monitor.x && x < monitor.x + monitor.width &&
y + h > monitor.y && y < monitor.y + monitor.height) y + h > monitor.y && y < monitor.y + monitor.height)
return monitor; return i;
} }
// otherwise on no monitor // otherwise on no monitor
return null; return -1;
}, },
_findMonitorForWindow: function(window) { findIndexForWindow: function(window) {
return this._findMonitorForRect(window.x, window.y, window.width, window.height); let i = this._findMonitorForRect(window.x, window.y, window.width, window.height);
if (i >= 0)
return i;
return this._primaryIndex; // Not on any monitor, pretend its on the primary
}, },
// This call guarantees that we return some monitor to simplify usage of it // This call guarantees that we return some monitor to simplify usage of it
// In practice all tracked actors should be visible on some monitor anyway // In practice all tracked actors should be visible on some monitor anyway
findMonitorForActor: function(actor) { findIndexForActor: function(actor) {
let [x, y] = actor.get_transformed_position(); let [x, y] = actor.get_transformed_position();
let [w, h] = actor.get_transformed_size(); let [w, h] = actor.get_transformed_size();
let monitor = this._findMonitorForRect(x, y, w, h); let i = this._findMonitorForRect(x, y, w, h);
if (monitor) if (i >= 0)
return monitor; return i;
return this._primaryMonitor; // Not on any monitor, pretend its on the primary return this._primaryIndex; // Not on any monitor, pretend its on the primary
},
findMonitorForWindow: function(window) {
let i = this._findMonitorForRect(window.x, window.y, window.width, window.height);
if (i >= 0)
return this._monitors[i];
else
return null;
},
findMonitorForActor: function(actor) {
return this._monitors[this.findIndexForActor(actor)];
}, },
_queueUpdateRegions: function() { _queueUpdateRegions: function() {
@@ -900,7 +993,7 @@ const Chrome = new Lang.Class({
continue; continue;
if (layer == Meta.StackLayer.FULLSCREEN) { if (layer == Meta.StackLayer.FULLSCREEN) {
let monitor = this._findMonitorForWindow(window); let monitor = this.findMonitorForWindow(window);
if (monitor) if (monitor)
monitor.inFullscreen = true; monitor.inFullscreen = true;
} }
@@ -917,7 +1010,7 @@ const Chrome = new Lang.Class({
} }
// Or whether it is monitor sized // Or whether it is monitor sized
let monitor = this._findMonitorForWindow(window); let monitor = this.findMonitorForWindow(window);
if (monitor && if (monitor &&
window.x <= monitor.x && window.x <= monitor.x &&
window.x + window.width >= monitor.x + monitor.width && window.x + window.width >= monitor.x + monitor.width &&
@@ -1068,5 +1161,69 @@ const Chrome = new Lang.Class({
return false; return false;
} }
}); });
Signals.addSignalMethods(Chrome.prototype); Signals.addSignalMethods(Chrome.prototype);
const PressureBarrier = new Lang.Class({
Name: 'TrayPressure',
_init: function(barrier, pressureThreshold, perpThreshold) {
this._barrier = barrier;
this._pressureThreshold = pressureThreshold;
this._perpThreshold = perpThreshold;
this._getVelocityAndPerp = this._makeGetVelocityAndPerp(barrier);
this._reset(0);
this._barrierHitId = this._barrier.connect('hit', Lang.bind(this, this._onBarrierHit));
},
destroy: function() {
this._barrier.disconnect(this._barrierHitId);
this._barrier = null;
},
_reset: function(eventId) {
this._currentEventId = eventId;
this._currentPressure = 0;
this._perpAccumulator = 0;
},
_makeGetVelocityAndPerp: function(barrier) {
if (barrier.y1 === barrier.y2) {
return function(event) {
return [Math.abs(event.dy), event.dx];
};
} else {
return function(event) {
return [Math.abs(event.dx), event.dy];
};
}
},
_onBarrierHit: function(barrier, event) {
// Event IDs are incremented every time the user stops
// hitting the barrier. So, if the event ID switches,
// reset the current state, and start over.
if (this._currentEventId != event.event_id) {
this._reset(event.event_id);
}
let [velocity, perp] = this._getVelocityAndPerp(event);
this._perpAccumulator += perp;
// If the user travels too far in the direction perpendicular
// to the barrier, start over from scratch -- the user is simply
// trying to skirt along the barrier.
if (Math.abs(this._perpAccumulator) >= this._perpThreshold) {
this._reset(0);
return;
}
this._currentPressure += velocity;
if (this._currentPressure >= this._pressureThreshold) {
this.emit('trigger');
this._reset(0);
}
}
});
Signals.addSignalMethods(PressureBarrier.prototype);

View File

@@ -40,11 +40,6 @@ const LONGER_HIDE_TIMEOUT = 0.6;
// range from the point where it left the tray. // range from the point where it left the tray.
const MOUSE_LEFT_ACTOR_THRESHOLD = 20; const MOUSE_LEFT_ACTOR_THRESHOLD = 20;
// Time the user needs to leave the mouse on the bottom pixel row to open the tray
const TRAY_DWELL_TIME = 1000; // ms
// Time resolution when tracking the mouse to catch the open tray dwell
const TRAY_DWELL_CHECK_INTERVAL = 100; // ms
const IDLE_TIME = 1000; const IDLE_TIME = 1000;
const State = { const State = {
@@ -1441,7 +1436,6 @@ const MessageTray = new Lang.Class({
this._clickedSummaryItem = null; this._clickedSummaryItem = null;
this._clickedSummaryItemMouseButton = -1; this._clickedSummaryItemMouseButton = -1;
this._clickedSummaryItemAllocationChangedId = 0; this._clickedSummaryItemAllocationChangedId = 0;
this._pointerBarrier = 0;
this._closeButton = makeCloseButton(); this._closeButton = makeCloseButton();
this._closeButton.hide(); this._closeButton.hide();
@@ -1471,6 +1465,7 @@ const MessageTray = new Lang.Class({
this._pointerInTray = false; this._pointerInTray = false;
this._pointerInKeyboard = false; this._pointerInKeyboard = false;
this._keyboardVisible = false; this._keyboardVisible = false;
this._keyboardUnderMessageTray = false;
this._summaryState = State.HIDDEN; this._summaryState = State.HIDDEN;
this._pointerInSummary = false; this._pointerInSummary = false;
this._notificationClosed = false; this._notificationClosed = false;
@@ -1536,71 +1531,36 @@ const MessageTray = new Lang.Class({
this._summaryItems = []; this._summaryItems = [];
this._chatSummaryItemsCount = 0; this._chatSummaryItemsCount = 0;
let pointerWatcher = PointerWatcher.getPointerWatcher();
pointerWatcher.addWatch(TRAY_DWELL_CHECK_INTERVAL, Lang.bind(this, this._checkTrayDwell));
this._trayDwellTimeoutId = 0;
this._trayDwelling = false;
this._trayDwellUserTime = 0;
this._sessionUpdated(); this._sessionUpdated();
this._updateNoMessagesLabel();
},
_updateNoMessagesLabel: function() {
if (this._summaryItems.length == 0 && !this._noMessages) {
this._noMessages = new St.Label({ text: _("No Messages"),
style_class: 'no-messages-label',
x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
y_expand: true });
this.actor.add_actor(this._noMessages);
} else if (this._summaryItems.length > 0 && this._noMessages) {
this._noMessages.destroy();
this._noMessages = null;
}
}, },
_sessionUpdated: function() { _sessionUpdated: function() {
if (Main.sessionMode.isLocked || Main.sessionMode.isGreeter) if (Main.sessionMode.isLocked || Main.sessionMode.isGreeter)
Main.ctrlAltTabManager.removeGroup(this._summary); Main.ctrlAltTabManager.removeGroup(this._summary);
else else
Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'start-here-symbolic', Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'user-available-symbolic',
{ focusCallback: Lang.bind(this, this.toggleAndNavigate), { focusCallback: Lang.bind(this, this.toggleAndNavigate),
sortGroup: CtrlAltTab.SortGroup.BOTTOM }); sortGroup: CtrlAltTab.SortGroup.BOTTOM });
this._updateState(); this._updateState();
}, },
_checkTrayDwell: function(x, y) { openTray: function() {
let monitor = Main.layoutManager.bottomMonitor;
let shouldDwell = (x >= monitor.x && x <= monitor.x + monitor.width &&
y == monitor.y + monitor.height - 1);
if (shouldDwell) {
// We only set up dwell timeout when the user is not hovering over the tray
// (!this.actor.hover). This avoids bringing up the message tray after the
// user clicks on a notification with the pointer on the bottom pixel
// of the monitor. The _trayDwelling variable is used so that we only try to
// fire off one tray dwell - if it fails (because, say, the user has the mouse down),
// we don't try again until the user moves the mouse up and down again.
if (!this._trayDwelling && !this.actor.hover && this._trayDwellTimeoutId == 0) {
// Save the interaction timestamp so we can detect user input
let focusWindow = global.display.focus_window;
this._trayDwellUserTime = focusWindow ? focusWindow.user_time : 0;
this._trayDwellTimeoutId = Mainloop.timeout_add(TRAY_DWELL_TIME,
Lang.bind(this, this._trayDwellTimeout));
}
this._trayDwelling = true;
} else {
this._cancelTrayDwell();
this._trayDwelling = false;
}
},
_cancelTrayDwell: function() {
if (this._trayDwellTimeoutId != 0) {
Mainloop.source_remove(this._trayDwellTimeoutId);
this._trayDwellTimeoutId = 0;
}
},
_trayDwellTimeout: function() {
if (Main.modalCount > 0)
return false;
// If the user interacted with the focus window since we started the tray
// dwell (by clicking or typing), don't activate the message tray
let focusWindow = global.display.focus_window;
let currentUserTime = focusWindow ? focusWindow.user_time : 0;
if (currentUserTime != this._trayDwellUserTime)
return false;
this._trayDwellTimeoutId = 0;
this._traySummoned = true; this._traySummoned = true;
this._updateState(); this._updateState();
@@ -1687,6 +1647,8 @@ const MessageTray = new Lang.Class({
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateState(); return false; })); Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateState(); return false; }));
this.emit('summary-item-added', summaryItem); this.emit('summary-item-added', summaryItem);
this._updateNoMessagesLabel();
}, },
getSummaryItems: function() { getSummaryItems: function() {
@@ -1719,6 +1681,8 @@ const MessageTray = new Lang.Class({
summaryItemToRemove.actor.destroy(); summaryItemToRemove.actor.destroy();
this._updateNoMessagesLabel();
if (needUpdate) if (needUpdate)
this._updateState(); this._updateState();
}, },
@@ -1828,9 +1792,6 @@ const MessageTray = new Lang.Class({
_onTrayHoverChanged: function() { _onTrayHoverChanged: function() {
if (this.actor.hover) { if (this.actor.hover) {
// No dwell inside notifications at the bottom of the screen
this._cancelTrayDwell();
// Don't do anything if the one pixel area at the bottom is hovered over while the tray is hidden. // Don't do anything if the one pixel area at the bottom is hovered over while the tray is hidden.
if (this._trayState == State.HIDDEN && this._notificationState == State.HIDDEN) if (this._trayState == State.HIDDEN && this._notificationState == State.HIDDEN)
return; return;
@@ -1904,12 +1865,15 @@ const MessageTray = new Lang.Class({
}, },
_onKeyboardVisibleChanged: function(layoutManager, keyboardVisible) { _onKeyboardVisibleChanged: function(layoutManager, keyboardVisible) {
if (this._keyboardVisible == keyboardVisible) let keyboardUnderMessageTray = layoutManager.keyboardIndex == layoutManager.bottomIndex;
if (this._keyboardVisible == keyboardVisible &&
this._keyboardUnderMesssageTray == keyboardUnderMessageTray)
return; return;
this._keyboardVisible = keyboardVisible; this._keyboardVisible = keyboardVisible;
this._keyboardUnderMessageTray = keyboardUnderMessageTray;
if (keyboardVisible) if (keyboardVisible && keyboardUnderMessageTray)
this.actor.add_style_pseudo_class('keyboard'); this.actor.add_style_pseudo_class('keyboard');
else else
this.actor.remove_style_pseudo_class('keyboard'); this.actor.remove_style_pseudo_class('keyboard');
@@ -2013,8 +1977,7 @@ const MessageTray = new Lang.Class({
let summaryPinned = this._pointerInTray || summarySummoned || this._locked; let summaryPinned = this._pointerInTray || summarySummoned || this._locked;
let summaryHovered = this._pointerInTray || this._pointerInSummary; let summaryHovered = this._pointerInTray || this._pointerInSummary;
let notificationsVisible = (this._notificationState == State.SHOWING || let notificationsVisible = this._notificationState != State.HIDDEN;
this._notificationState == State.SHOWN);
let notificationsDone = !notificationsVisible && !notificationsPending; let notificationsDone = !notificationsVisible && !notificationsPending;
let summaryOptionalInOverview = this._overviewVisible && !this._locked && !summaryHovered; let summaryOptionalInOverview = this._overviewVisible && !this._locked && !summaryHovered;
@@ -2067,12 +2030,12 @@ const MessageTray = new Lang.Class({
this._desktopCloneState == State.SHOWN); this._desktopCloneState == State.SHOWN);
let desktopCloneShouldBeVisible = (trayShouldBeVisible && let desktopCloneShouldBeVisible = (trayShouldBeVisible &&
!this._overviewVisible && !this._overviewVisible &&
!this._keyboardVisible); (!this._keyboardVisible || !this._keyboardUnderMessageTray));
if (!desktopCloneIsVisible && desktopCloneShouldBeVisible) { if (!desktopCloneIsVisible && desktopCloneShouldBeVisible) {
this._showDesktopClone(); this._showDesktopClone();
} else if (desktopCloneIsVisible && !desktopCloneShouldBeVisible) { } else if (desktopCloneIsVisible && !desktopCloneShouldBeVisible) {
this._hideDesktopClone (this._keyboardVisible); this._hideDesktopClone (this._keyboardVisible && this._keyboardUnderMessageTray);
} }
}, },
@@ -2085,6 +2048,8 @@ const MessageTray = new Lang.Class({
params.onCompleteScope = this; params.onCompleteScope = this;
params.onCompleteParams = [statevar, value, onComplete, onCompleteScope, onCompleteParams]; params.onCompleteParams = [statevar, value, onComplete, onCompleteScope, onCompleteParams];
// Remove other tweens that could mess with the state machine
Tweener.removeTweens(actor);
Tweener.addTween(actor, params); Tweener.addTween(actor, params);
let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING; let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING;
@@ -2342,6 +2307,7 @@ const MessageTray = new Lang.Class({
} }
if (this._notificationRemoved) { if (this._notificationRemoved) {
Tweener.removeTweens(this._notificationWidget);
this._notificationWidget.y = this.actor.height; this._notificationWidget.y = this.actor.height;
this._notificationWidget.opacity = 0; this._notificationWidget.opacity = 0;
this._notificationState = State.HIDDEN; this._notificationState = State.HIDDEN;
@@ -2406,9 +2372,7 @@ const MessageTray = new Lang.Class({
this._notificationWidget.y = expandedY; this._notificationWidget.y = expandedY;
} else if (this._notification.y != expandedY) { } else if (this._notification.y != expandedY) {
// Tween also opacity here, to override a possible tween that's // Tween also opacity here, to override a possible tween that's
// currently hiding the notification. This will ensure that the // currently hiding the notification.
// notification is not removed when the onComplete handler for this
// one triggers.
this._tween(this._notificationWidget, '_notificationState', State.SHOWN, this._tween(this._notificationWidget, '_notificationState', State.SHOWN,
{ y: expandedY, { y: expandedY,
opacity: 255, opacity: 255,
@@ -2470,6 +2434,7 @@ const MessageTray = new Lang.Class({
this._summaryBoxPointerItem.prepareNotificationStackForShowing(); this._summaryBoxPointerItem.prepareNotificationStackForShowing();
} else if (this._clickedSummaryItemMouseButton == 3) { } else if (this._clickedSummaryItemMouseButton == 3) {
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu; this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
this._summaryBoxPointerCloseClickedId = 0;
} }
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child, this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
@@ -2576,8 +2541,10 @@ const MessageTray = new Lang.Class({
this._summaryBoxPointer.bin.child = null; this._summaryBoxPointer.bin.child = null;
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId); this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
this._summaryBoxPointerContentUpdatedId = 0; this._summaryBoxPointerContentUpdatedId = 0;
if (this._summaryBoxPointerCloseClickedId != 0) {
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId); this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
this._summaryBoxPointerCloseClickedId = 0; this._summaryBoxPointerCloseClickedId = 0;
}
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId); this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
this._summaryBoxPointerDoneDisplayingId = 0; this._summaryBoxPointerDoneDisplayingId = 0;

View File

@@ -58,7 +58,7 @@ const ModalDialog = new Lang.Class({
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy)); this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
this._actionKeys = {}; this._buttonKeys = {};
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent)); this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
this._backgroundBin = new St.Bin(); this._backgroundBin = new St.Bin();
@@ -95,10 +95,10 @@ const ModalDialog = new Lang.Class({
x_align: St.Align.MIDDLE, x_align: St.Align.MIDDLE,
y_align: St.Align.START }); y_align: St.Align.START });
this._buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box', this.buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
visible: false, visible: false,
vertical: false }); vertical: false });
this.dialogLayout.add(this._buttonLayout, this.dialogLayout.add(this.buttonLayout,
{ expand: true, { expand: true,
x_align: St.Align.MIDDLE, x_align: St.Align.MIDDLE,
y_align: St.Align.END }); y_align: St.Align.END });
@@ -113,35 +113,17 @@ const ModalDialog = new Lang.Class({
this._group.destroy(); this._group.destroy();
}, },
setActionKey: function(key, action) { clearButtons: function() {
this._actionKeys[key] = action; this.buttonLayout.destroy_all_children();
this._buttonKeys = {};
}, },
setButtons: function(buttons) { setButtons: function(buttons) {
this._buttonLayout.destroy_all_children(); this.clearButtons();
this._actionKeys = {}; this.buttonLayout.visible = (buttons.length > 0);
this._buttonLayout.visible = (buttons.length > 0);
for (let i = 0; i < buttons.length; i++) { for (let i = 0; i < buttons.length; i++) {
let buttonInfo = buttons[i]; let buttonInfo = buttons[i];
let label = buttonInfo['label'];
let action = buttonInfo['action'];
let key = buttonInfo['key'];
let isDefault = buttonInfo['default'];
if (isDefault && !key) {
this._actionKeys[Clutter.KEY_KP_Enter] = action;
this._actionKeys[Clutter.KEY_ISO_Enter] = action;
key = Clutter.KEY_Return;
}
buttonInfo.button = new St.Button({ style_class: 'modal-dialog-button',
reactive: true,
can_focus: true,
label: label });
if (isDefault)
buttonInfo.button.add_style_pseudo_class('default');
let x_alignment; let x_alignment;
if (buttons.length == 1) if (buttons.length == 1)
@@ -153,29 +135,62 @@ const ModalDialog = new Lang.Class({
else else
x_alignment = St.Align.MIDDLE; x_alignment = St.Align.MIDDLE;
if (!this._initialKeyFocusDestroyId) this.addButton(buttonInfo, { expand: true,
this._initialKeyFocus = buttonInfo.button;
this._buttonLayout.add(buttonInfo.button,
{ expand: true,
x_fill: false, x_fill: false,
y_fill: false, y_fill: false,
x_align: x_alignment, x_align: x_alignment,
y_align: St.Align.MIDDLE }); y_align: St.Align.MIDDLE });
}
},
buttonInfo.button.connect('clicked', action); addButton: function(buttonInfo, layoutInfo) {
let label = buttonInfo['label'];
let action = buttonInfo['action'];
let key = buttonInfo['key'];
let isDefault = buttonInfo['default'];
let keys;
if (key) if (key)
this._actionKeys[key] = action; keys = [key];
} else if (isDefault)
keys = [Clutter.KEY_Return, Clutter.KEY_KP_Enter, Clutter.KEY_ISO_Enter];
else
keys = [];
this.emit('buttons-set'); let button = new St.Button({ style_class: 'modal-dialog-button',
reactive: true,
can_focus: true,
label: label });
button.connect('clicked', action);
buttonInfo['button'] = button;
if (isDefault)
button.add_style_pseudo_class('default');
if (!this._initialKeyFocusDestroyId)
this._initialKeyFocus = button;
for (let i in keys)
this._buttonKeys[keys[i]] = buttonInfo;
this.buttonLayout.add(button, layoutInfo);
return button;
}, },
_onKeyReleaseEvent: function(object, event) { _onKeyReleaseEvent: function(object, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
let action = this._actionKeys[symbol]; let buttonInfo = this._buttonKeys[symbol];
if (action) { if (!buttonInfo)
return false;
let button = buttonInfo['button'];
let action = buttonInfo['action'];
if (action && button.reactive) {
action(); action();
return true; return true;
} }

View File

@@ -46,18 +46,6 @@ const GLSL_DIM_EFFECT_CODE = '\
cogl_color_out.xyz = cogl_color_out.xyz * (1.0 - a); \ cogl_color_out.xyz = cogl_color_out.xyz * (1.0 - a); \
cogl_color_out.a = 1.0;'; cogl_color_out.a = 1.0;';
const SwipeScrollDirection = {
NONE: 0,
HORIZONTAL: 1,
VERTICAL: 2
};
const SwipeScrollResult = {
CANCEL: 0,
SWIPE: 1,
CLICK: 2
};
const ShellInfo = new Lang.Class({ const ShellInfo = new Lang.Class({
Name: 'ShellInfo', Name: 'ShellInfo',
@@ -165,8 +153,6 @@ const Overview = new Lang.Class({
} }
})); }));
this._scrollDirection = SwipeScrollDirection.NONE;
this._scrollAdjustment = null;
this._capturedEventId = 0; this._capturedEventId = 0;
this._buttonPressId = 0; this._buttonPressId = 0;
@@ -341,159 +327,11 @@ const Overview = new Lang.Class({
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;
}, },
setScrollAdjustment: function(adjustment, direction) { addAction: function(action) {
if (this.isDummy) if (this.isDummy)
return; return;
this._scrollAdjustment = adjustment; this._group.add_action(action);
if (this._scrollAdjustment == null)
this._scrollDirection = SwipeScrollDirection.NONE;
else
this._scrollDirection = direction;
},
_onButtonPress: function(actor, event) {
if (this._scrollDirection == SwipeScrollDirection.NONE
|| event.get_button() != 1)
return;
let [stageX, stageY] = event.get_coords();
this._dragStartX = this._dragX = stageX;
this._dragStartY = this._dragY = stageY;
this._dragStartValue = this._scrollAdjustment.value;
this._lastMotionTime = -1; // used to track "stopping" while swipe-scrolling
this._capturedEventId = global.stage.connect('captured-event',
Lang.bind(this, this._onCapturedEvent));
this.emit('swipe-scroll-begin');
},
_onCapturedEvent: function(actor, event) {
let stageX, stageY;
let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold;
switch(event.type()) {
case Clutter.EventType.BUTTON_RELEASE:
[stageX, stageY] = event.get_coords();
// default to snapping back to the original value
let newValue = this._dragStartValue;
let minValue = this._scrollAdjustment.lower;
let maxValue = this._scrollAdjustment.upper - this._scrollAdjustment.page_size;
let direction;
if (this._scrollDirection == SwipeScrollDirection.HORIZONTAL) {
direction = stageX > this._dragStartX ? -1 : 1;
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
direction *= -1;
} else {
direction = stageY > this._dragStartY ? -1 : 1;
}
// We default to scroll a full page size; both the first
// and the last page may be smaller though, so we need to
// adjust difference in those cases.
let difference = direction * this._scrollAdjustment.page_size;
if (this._dragStartValue + difference > maxValue)
difference = maxValue - this._dragStartValue;
else if (this._dragStartValue + difference < minValue)
difference = minValue - this._dragStartValue;
// If the user has moved more than half the scroll
// difference, we want to "settle" to the new value
// even if the user stops dragging rather "throws" by
// releasing during the drag.
let distance = this._dragStartValue - this._scrollAdjustment.value;
let noStop = Math.abs(distance / difference) > 0.5;
// We detect if the user is stopped by comparing the
// timestamp of the button release with the timestamp of
// the last motion. Experimentally, a difference of 0 or 1
// millisecond indicates that the mouse is in motion, a
// larger difference indicates that the mouse is stopped.
if ((this._lastMotionTime > 0 &&
this._lastMotionTime > event.get_time() - 2) ||
noStop) {
if (this._dragStartValue + difference >= minValue &&
this._dragStartValue + difference <= maxValue)
newValue += difference;
}
let result;
// See if the user has moved the mouse enough to trigger
// a drag
if (Math.abs(stageX - this._dragStartX) < threshold &&
Math.abs(stageY - this._dragStartY) < threshold) {
// no motion? It's a click!
result = SwipeScrollResult.CLICK;
this.emit('swipe-scroll-end', result);
} else {
if (newValue == this._dragStartValue)
result = SwipeScrollResult.CANCEL;
else
result = SwipeScrollResult.SWIPE;
// The event capture handler is disconnected
// while scrolling to the final position, so
// to avoid undesired prelights we raise
// the cover pane.
this._coverPane.raise_top();
this._coverPane.show();
Tweener.addTween(this._scrollAdjustment,
{ value: newValue,
time: ANIMATION_TIME,
transition: 'easeOutQuad',
onCompleteScope: this,
onComplete: function() {
this._coverPane.hide();
this.emit('swipe-scroll-end',
result);
}
});
}
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
return result != SwipeScrollResult.CLICK;
case Clutter.EventType.MOTION:
[stageX, stageY] = event.get_coords();
let dx = this._dragX - stageX;
let dy = this._dragY - stageY;
let primary = Main.layoutManager.primaryMonitor;
this._dragX = stageX;
this._dragY = stageY;
this._lastMotionTime = event.get_time();
// See if the user has moved the mouse enough to trigger
// a drag
if (Math.abs(stageX - this._dragStartX) < threshold &&
Math.abs(stageY - this._dragStartY) < threshold)
return true;
if (this._scrollDirection == SwipeScrollDirection.HORIZONTAL) {
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
this._scrollAdjustment.value -= (dx / primary.width) * this._scrollAdjustment.page_size;
else
this._scrollAdjustment.value += (dx / primary.width) * this._scrollAdjustment.page_size;
} else {
this._scrollAdjustment.value += (dy / primary.height) * this._scrollAdjustment.page_size;
}
return true;
// Block enter/leave events to avoid prelights
// during swipe-scroll
case Clutter.EventType.ENTER:
case Clutter.EventType.LEAVE:
return true;
}
return false;
}, },
_getDesktopClone: function() { _getDesktopClone: function() {
@@ -596,9 +434,6 @@ const Overview = new Lang.Class({
this._modal = true; this._modal = true;
this._animateVisible(); this._animateVisible();
this._shown = true; this._shown = true;
this._buttonPressId = this._group.connect('button-press-event',
Lang.bind(this, this._onButtonPress));
}, },
fadeInDesktop: function() { fadeInDesktop: function() {
@@ -698,10 +533,6 @@ const Overview = new Lang.Class({
this._shown = false; this._shown = false;
this._syncInputMode(); this._syncInputMode();
if (this._buttonPressId > 0)
this._group.disconnect(this._buttonPressId);
this._buttonPressId = 0;
}, },
// hideTemporarily: // hideTemporarily:

View File

@@ -882,10 +882,13 @@ const PanelCorner = new Lang.Class({
let backgroundColor = node.get_color('-panel-corner-background-color'); let backgroundColor = node.get_color('-panel-corner-background-color');
let borderColor = node.get_color('-panel-corner-border-color'); let borderColor = node.get_color('-panel-corner-border-color');
let noOverlap = borderColor.alpha == 0;
let offsetY = noOverlap ? borderWidth : 0;
let cr = this.actor.get_context(); let cr = this.actor.get_context();
cr.setOperator(Cairo.Operator.SOURCE); cr.setOperator(Cairo.Operator.SOURCE);
cr.moveTo(0, 0); cr.moveTo(0, offsetY);
if (this._side == St.Side.LEFT) if (this._side == St.Side.LEFT)
cr.arc(cornerRadius, cr.arc(cornerRadius,
borderWidth + cornerRadius, borderWidth + cornerRadius,
@@ -894,7 +897,7 @@ const PanelCorner = new Lang.Class({
cr.arc(0, cr.arc(0,
borderWidth + cornerRadius, borderWidth + cornerRadius,
cornerRadius, 3 * Math.PI / 2, 2 * Math.PI); cornerRadius, 3 * Math.PI / 2, 2 * Math.PI);
cr.lineTo(cornerRadius, 0); cr.lineTo(cornerRadius, offsetY);
cr.closePath(); cr.closePath();
let savedPath = cr.copyPath(); let savedPath = cr.copyPath();
@@ -904,6 +907,9 @@ const PanelCorner = new Lang.Class({
Clutter.cairo_set_source_color(cr, over); Clutter.cairo_set_source_color(cr, over);
cr.fill(); cr.fill();
if (noOverlap)
return;
let offset = borderWidth; let offset = borderWidth;
Clutter.cairo_set_source_color(cr, backgroundColor); Clutter.cairo_set_source_color(cr, backgroundColor);
@@ -958,14 +964,9 @@ const Panel = new Lang.Class({
reactive: true }); reactive: true });
this.actor._delegate = this; this.actor._delegate = this;
this.statusArea = {}; this._sessionStyle = null;
Main.overview.connect('shown', Lang.bind(this, function () { this.statusArea = {};
this.actor.add_style_class_name('in-overview');
}));
Main.overview.connect('hiding', Lang.bind(this, function () {
this.actor.remove_style_class_name('in-overview');
}));
this.menuManager = new PopupMenu.PopupMenuManager(this); this.menuManager = new PopupMenu.PopupMenuManager(this);
@@ -995,7 +996,7 @@ const Panel = new Lang.Class({
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
Main.layoutManager.panelBox.add(this.actor); Main.layoutManager.panelBox.add(this.actor);
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here-symbolic', Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'emblem-system-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.TOP }); { sortGroup: CtrlAltTab.SortGroup.TOP });
Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel)); Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel));
@@ -1152,6 +1153,13 @@ const Panel = new Lang.Class({
this._updateBox(panel.left, this._leftBox); this._updateBox(panel.left, this._leftBox);
this._updateBox(panel.center, this._centerBox); this._updateBox(panel.center, this._centerBox);
this._updateBox(panel.right, this._rightBox); this._updateBox(panel.right, this._rightBox);
if (this._sessionStyle)
this._removeStyleClassName(this._sessionStyle);
this._sessionStyle = Main.sessionMode.panelStyle;
if (this._sessionStyle)
this._addStyleClassName(this._sessionStyle);
}, },
_initBox: function(elements, box) { _initBox: function(elements, box) {
@@ -1240,5 +1248,17 @@ const Panel = new Lang.Class({
this.statusArea[role] = indicator; this.statusArea[role] = indicator;
this._addToPanelBox(role, indicator, position, boxContainer); this._addToPanelBox(role, indicator, position, boxContainer);
return indicator; return indicator;
},
_addStyleClassName: function(className) {
this.actor.add_style_class_name(className);
this._rightCorner.actor.add_style_class_name(className);
this._leftCorner.actor.add_style_class_name(className);
},
_removeStyleClassName: function(className) {
this.actor.remove_style_class_name(className);
this._rightCorner.actor.remove_style_class_name(className);
this._leftCorner.actor.remove_style_class_name(className);
} }
}); });

View File

@@ -12,6 +12,7 @@ const St = imports.gi.St;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const GrabHelper = imports.ui.grabHelper;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
@@ -658,14 +659,23 @@ const PopupSliderMenuItem = new Lang.Class({
_onScrollEvent: function (actor, event) { _onScrollEvent: function (actor, event) {
let direction = event.get_scroll_direction(); let direction = event.get_scroll_direction();
let delta;
if (event.is_pointer_emulated())
return;
if (direction == Clutter.ScrollDirection.DOWN) { if (direction == Clutter.ScrollDirection.DOWN) {
this._value = Math.max(0, this._value - SLIDER_SCROLL_STEP); delta = -SLIDER_SCROLL_STEP;
} } else if (direction == Clutter.ScrollDirection.UP) {
else if (direction == Clutter.ScrollDirection.UP) { delta = +SLIDER_SCROLL_STEP;
this._value = Math.min(1, this._value + SLIDER_SCROLL_STEP); } else if (direction == Clutter.ScrollDirection.SMOOTH) {
let [dx, dy] = event.get_scroll_delta();
// Even though the slider is horizontal, use dy to match
// the UP/DOWN above.
delta = -dy / 10;
} }
this._value = Math.min(Math.max(0, this._value + delta), 1);
this._slider.queue_repaint(); this._slider.queue_repaint();
this.emit('value-changed', this._value); this.emit('value-changed', this._value);
}, },
@@ -1204,7 +1214,6 @@ const PopupMenu = new Lang.Class({
this.actor = this._boxPointer.actor; this.actor = this._boxPointer.actor;
this.actor._delegate = this; this.actor._delegate = this;
this.actor.style_class = 'popup-menu-boxpointer'; this.actor.style_class = 'popup-menu-boxpointer';
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this._boxWrapper = new Shell.GenericContainer(); this._boxWrapper = new Shell.GenericContainer();
this._boxWrapper.connect('get-preferred-width', Lang.bind(this, this._boxGetPreferredWidth)); this._boxWrapper.connect('get-preferred-width', Lang.bind(this, this._boxGetPreferredWidth));
@@ -1234,15 +1243,6 @@ const PopupMenu = new Lang.Class({
this.box.allocate(box, flags); this.box.allocate(box, flags);
}, },
_onKeyPressEvent: function(actor, event) {
if (event.get_key_symbol() == Clutter.Escape) {
this.close(BoxPointer.PopupAnimation.FULL);
return true;
}
return false;
},
setArrowOrigin: function(origin) { setArrowOrigin: function(origin) {
this._boxPointer.setArrowOrigin(origin); this._boxPointer.setArrowOrigin(origin);
}, },
@@ -1537,7 +1537,6 @@ const PopupComboMenu = new Lang.Class({
this.actor = this.box; this.actor = this.box;
this.actor._delegate = this; this.actor._delegate = this;
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this.actor.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn)); this.actor.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn));
sourceActor.connect('style-changed', sourceActor.connect('style-changed',
Lang.bind(this, this._onSourceActorStyleChanged)); Lang.bind(this, this._onSourceActorStyleChanged));
@@ -1545,15 +1544,6 @@ const PopupComboMenu = new Lang.Class({
global.focus_manager.add_group(this.actor); global.focus_manager.add_group(this.actor);
}, },
_onKeyPressEvent: function(actor, event) {
if (event.get_key_symbol() == Clutter.Escape) {
this.close(BoxPointer.PopupAnimation.FULL);
return true;
}
return false;
},
_onKeyFocusIn: function(actor) { _onKeyFocusIn: function(actor) {
let items = this._getMenuItems(); let items = this._getMenuItems();
let activeItem = items[this._activeItemPos]; let activeItem = items[this._activeItemPos];
@@ -2044,17 +2034,8 @@ const PopupMenuManager = new Lang.Class({
_init: function(owner) { _init: function(owner) {
this._owner = owner; this._owner = owner;
this.grabbed = false; this._grabHelper = new GrabHelper.GrabHelper(owner.actor);
this._eventCaptureId = 0;
this._enterEventId = 0;
this._leaveEventId = 0;
this._keyFocusNotifyId = 0;
this._activeMenu = null;
this._menus = []; this._menus = [];
this._menuStack = [];
this._preGrabInputMode = null;
this._grabbedFromKeynav = false;
}, },
addMenu: function(menu, position) { addMenu: function(menu, position) {
@@ -2073,6 +2054,8 @@ const PopupMenuManager = new Lang.Class({
let source = menu.sourceActor; let source = menu.sourceActor;
if (source) { if (source) {
if (!menu.blockSourceEvents)
this._grabHelper.addActor(source);
menudata.enterId = source.connect('enter-event', Lang.bind(this, function() { this._onMenuSourceEnter(menu); })); menudata.enterId = source.connect('enter-event', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusInId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); })); menudata.focusInId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
} }
@@ -2085,7 +2068,7 @@ const PopupMenuManager = new Lang.Class({
removeMenu: function(menu) { removeMenu: function(menu) {
if (menu == this._activeMenu) if (menu == this._activeMenu)
this._closeMenu(); this._closeMenu(menu);
let position = this._findMenu(menu); let position = this._findMenu(menu);
if (position == -1) // not a menu we manage if (position == -1) // not a menu we manage
@@ -2102,79 +2085,25 @@ const PopupMenuManager = new Lang.Class({
if (menudata.focusInId) if (menudata.focusInId)
menu.sourceActor.disconnect(menudata.focusInId); menu.sourceActor.disconnect(menudata.focusInId);
if (menu.sourceActor)
this._grabHelper.removeActor(menu.sourceActor);
this._menus.splice(position, 1); this._menus.splice(position, 1);
}, },
_grab: function() { get activeMenu() {
Main.pushModal(this._owner.actor); let actor = this._grabHelper.currentGrab.actor;
if (actor)
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture)); return actor._delegate;
// captured-event doesn't see enter/leave events else
this._enterEventId = global.stage.connect('enter-event', Lang.bind(this, this._onEventCapture)); return null;
this._leaveEventId = global.stage.connect('leave-event', Lang.bind(this, this._onEventCapture));
this._keyFocusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
this.grabbed = true;
},
_ungrab: function() {
global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0;
global.stage.disconnect(this._enterEventId);
this._enterEventId = 0;
global.stage.disconnect(this._leaveEventId);
this._leaveEventId = 0;
global.stage.disconnect(this._keyFocusNotifyId);
this._keyFocusNotifyId = 0;
this.grabbed = false;
Main.popModal(this._owner.actor);
}, },
_onMenuOpenState: function(menu, open) { _onMenuOpenState: function(menu, open) {
if (open) { if (open) {
if (this._activeMenu && this._activeMenu.isChildMenu(menu)) { this._grabHelper.grab({ actor: menu.actor, modal: true,
this._menuStack.push(this._activeMenu); onUngrab: Lang.bind(this, this._closeMenu, menu) });
menu.actor.grab_key_focus();
}
this._activeMenu = menu;
} else { } else {
if (this._menuStack.length > 0) { this._grabHelper.ungrab({ actor: menu.actor });
this._activeMenu = this._menuStack.pop();
if (menu.sourceActor)
menu.sourceActor.grab_key_focus();
this._didPop = true;
}
}
// Check what the focus was before calling pushModal/popModal
let focus = global.stage.key_focus;
let hadFocus = focus && this._activeMenuContains(focus);
if (open) {
if (!this.grabbed) {
this._preGrabInputMode = global.stage_input_mode;
this._grabbedFromKeynav = hadFocus;
this._grab();
}
if (hadFocus)
focus.grab_key_focus();
else
menu.actor.grab_key_focus();
} else if (menu == this._activeMenu) {
if (this.grabbed)
this._ungrab();
this._activeMenu = null;
if (this._grabbedFromKeynav) {
if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED)
global.stage_input_mode = Shell.StageInputMode.FOCUSED;
if (hadFocus && menu.sourceActor)
menu.sourceActor.grab_key_focus();
else if (focus)
focus.grab_key_focus();
}
} }
}, },
@@ -2186,87 +2115,37 @@ const PopupMenuManager = new Lang.Class({
this.removeMenu(childMenu); this.removeMenu(childMenu);
}, },
// change the currently-open menu without dropping grab
_changeMenu: function(newMenu) { _changeMenu: function(newMenu) {
if (this._activeMenu) { if (this.activeMenu) {
// _onOpenMenuState will drop the grab if it sees this._closeMenu(this.activeMenu);
// this._activeMenu being closed; so clear _activeMenu newMenu.open(false);
// before closing it to keep that from happening } else {
let oldMenu = this._activeMenu; newMenu.open(true);
this._activeMenu = null; }
for (let i = this._menuStack.length - 1; i >= 0; i--)
this._menuStack[i].close(BoxPointer.PopupAnimation.FADE);
oldMenu.close(BoxPointer.PopupAnimation.FADE);
newMenu.open(BoxPointer.PopupAnimation.FADE);
} else
newMenu.open(BoxPointer.PopupAnimation.FULL);
}, },
_onMenuSourceEnter: function(menu) { _onMenuSourceEnter: function(menu) {
if (!this.grabbed || menu == this._activeMenu) if (!this._grabHelper.grabbed)
return false; return false;
if (this._activeMenu && this._activeMenu.isChildMenu(menu)) if (this._grabHelper.isActorGrabbed(menu.actor))
return false; return false;
if (this._menuStack.indexOf(menu) != -1) let isChildMenu = this._grabHelper.grabStack.some(function(grab) {
return false; let existingMenu = grab.actor._delegate;
return existingMenu.isChildMenu(menu);
if (this._menuStack.length > 0 && this._menuStack[0].isChildMenu(menu)) });
if (isChildMenu)
return false; return false;
this._changeMenu(menu); this._changeMenu(menu);
return false; return false;
}, },
_onKeyFocusChanged: function() {
if (!this.grabbed || !this._activeMenu)
return;
let focus = global.stage.key_focus;
if (focus) {
if (this._activeMenuContains(focus))
return;
if (this._menuStack.length > 0)
return;
if (focus._delegate && focus._delegate.menu &&
this._findMenu(focus._delegate.menu) != -1)
return;
}
this._closeMenu();
},
_onMenuDestroy: function(menu) { _onMenuDestroy: function(menu) {
this.removeMenu(menu); this.removeMenu(menu);
}, },
_activeMenuContains: function(actor) {
return this._activeMenu != null
&& (this._activeMenu.actor.contains(actor) ||
(this._activeMenu.sourceActor && this._activeMenu.sourceActor.contains(actor)));
},
_eventIsOnActiveMenu: function(event) {
return this._activeMenuContains(event.get_source());
},
_shouldBlockEvent: function(event) {
let src = event.get_source();
if (this._activeMenu != null && this._activeMenu.actor.contains(src))
return false;
for (let i = 0; i < this._menus.length; i++) {
let menu = this._menus[i].menu;
if (menu.sourceActor && !menu.blockSourceEvents && menu.sourceActor.contains(src)) {
return false;
}
}
return true;
},
_findMenu: function(item) { _findMenu: function(item) {
for (let i = 0; i < this._menus.length; i++) { for (let i = 0; i < this._menus.length; i++) {
let menudata = this._menus[i]; let menudata = this._menus[i];
@@ -2276,41 +2155,7 @@ const PopupMenuManager = new Lang.Class({
return -1; return -1;
}, },
_onEventCapture: function(actor, event) { _closeMenu: function(menu) {
if (!this.grabbed) menu.close(BoxPointer.PopupAnimation.FULL);
return false;
if (this._owner.menuEventFilter &&
this._owner.menuEventFilter(event))
return true;
if (this._didPop) {
this._didPop = false;
return true;
}
let activeMenuContains = this._eventIsOnActiveMenu(event);
let eventType = event.type();
if (eventType == Clutter.EventType.BUTTON_RELEASE) {
if (activeMenuContains) {
return false;
} else {
this._closeMenu();
return true;
}
} else if (eventType == Clutter.EventType.BUTTON_PRESS && !activeMenuContains) {
this._closeMenu();
return true;
} else if (!this._shouldBlockEvent(event)) {
return false;
}
return true;
},
_closeMenu: function() {
if (this._activeMenu != null)
this._activeMenu.close(BoxPointer.PopupAnimation.FULL);
} }
}); });

View File

@@ -502,7 +502,7 @@ const ScreenShield = new Lang.Class({
if (symbol == Clutter.KEY_Escape || if (symbol == Clutter.KEY_Escape ||
symbol == Clutter.KEY_Return || symbol == Clutter.KEY_Return ||
symbol == Clutter.KEY_KP_Enter) { symbol == Clutter.KEY_KP_Enter) {
this._ensureUnlockDialog(true); this._ensureUnlockDialog(true, true);
this._hideLockScreen(true, 0); this._hideLockScreen(true, 0);
return true; return true;
} }
@@ -525,7 +525,7 @@ const ScreenShield = new Lang.Class({
// 7 standard scrolls to lift up // 7 standard scrolls to lift up
if (this._lockScreenScrollCounter > 35) { if (this._lockScreenScrollCounter > 35) {
this._ensureUnlockDialog(false); this._ensureUnlockDialog(false, true);
this._hideLockScreen(true, 0); this._hideLockScreen(true, 0);
} }
@@ -557,7 +557,7 @@ const ScreenShield = new Lang.Class({
_onDragBegin: function() { _onDragBegin: function() {
Tweener.removeTweens(this._lockScreenGroup); Tweener.removeTweens(this._lockScreenGroup);
this._lockScreenState = MessageTray.State.HIDING; this._lockScreenState = MessageTray.State.HIDING;
this._ensureUnlockDialog(false); this._ensureUnlockDialog(false, false);
return true; return true;
}, },
@@ -579,6 +579,7 @@ const ScreenShield = new Lang.Class({
// Complete motion automatically // Complete motion automatically
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0); let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
this._hideLockScreen(true, -velocityY); this._hideLockScreen(true, -velocityY);
this._ensureUnlockDialog(false, true);
} else { } else {
// restore the lock screen to its original place // restore the lock screen to its original place
// try to use the same speed as the normal animation // try to use the same speed as the normal animation
@@ -661,7 +662,7 @@ const ScreenShield = new Lang.Class({
this.actor.show(); this.actor.show();
this._isGreeter = Main.sessionMode.isGreeter; this._isGreeter = Main.sessionMode.isGreeter;
this._ensureUnlockDialog(true); this._ensureUnlockDialog(true, true);
this._hideLockScreen(false, 0); this._hideLockScreen(false, 0);
}, },
@@ -717,7 +718,7 @@ const ScreenShield = new Lang.Class({
Main.sessionMode.popMode('lock-screen'); Main.sessionMode.popMode('lock-screen');
}, },
_ensureUnlockDialog: function(onPrimary) { _ensureUnlockDialog: function(onPrimary, allowCancel) {
if (!this._dialog) { if (!this._dialog) {
let constructor = Main.sessionMode.unlockDialog; let constructor = Main.sessionMode.unlockDialog;
if (!constructor) { if (!constructor) {
@@ -740,6 +741,8 @@ const ScreenShield = new Lang.Class({
this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed)); this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded)); this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
} }
this._dialog.allowCancel = allowCancel;
}, },
_onUnlockFailed: function() { _onUnlockFailed: function() {

View File

@@ -194,15 +194,9 @@ const SearchResults = new Lang.Class({
expand: true, expand: true,
x_align: St.Align.START, x_align: St.Align.START,
y_align: St.Align.START }); y_align: St.Align.START });
this.actor.connect('notify::mapped', Lang.bind(this, let action = new Clutter.PanAction({ interpolate: true });
function() { action.connect('pan', Lang.bind(this, this._onPan));
if (!this.actor.mapped) this.actor.add_action(action);
return;
let adjustment = scrollView.vscroll.adjustment;
let direction = Overview.SwipeScrollDirection.VERTICAL;
Main.overview.setScrollAdjustment(adjustment, direction);
}));
this._statusText = new St.Label({ style_class: 'search-statustext' }); this._statusText = new St.Label({ style_class: 'search-statustext' });
this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE, this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE,
@@ -219,6 +213,13 @@ const SearchResults = new Lang.Class({
this._defaultResult = null; this._defaultResult = null;
}, },
_onPan: function(action) {
let [dist, dx, dy] = action.get_motion_delta(0);
let adjustment = this.actor.vscroll.adjustment;
adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
return false;
},
createProviderMeta: function(provider) { createProviderMeta: function(provider) {
let providerBox = new St.BoxLayout({ style_class: 'search-section', let providerBox = new St.BoxLayout({ style_class: 'search-section',
vertical: true }); vertical: true });

View File

@@ -28,6 +28,7 @@ const _modes = {
center: [], center: [],
right: [] right: []
}, },
panelStyle: null
}, },
'gdm': { 'gdm': {
@@ -41,7 +42,8 @@ const _modes = {
center: ['dateMenu'], center: ['dateMenu'],
right: ['a11y', 'display', 'keyboard', right: ['a11y', 'display', 'keyboard',
'volume', 'battery', 'powerMenu'] 'volume', 'battery', 'powerMenu']
} },
panelStyle: 'login-screen'
}, },
'lock-screen': { 'lock-screen': {
@@ -54,6 +56,7 @@ const _modes = {
center: [], center: [],
right: ['lockScreen'] right: ['lockScreen']
}, },
panelStyle: 'lock-screen'
}, },
'unlock-dialog': { 'unlock-dialog': {
@@ -65,6 +68,7 @@ const _modes = {
center: [], center: [],
right: ['a11y', 'keyboard', 'lockScreen'] right: ['a11y', 'keyboard', 'lockScreen']
}, },
panelStyle: 'unlock-screen'
}, },
'initial-setup': { 'initial-setup': {

View File

@@ -111,7 +111,7 @@ const GnomeShell = new Lang.Class({
}, },
_onScreenshotComplete: function(obj, result, area, flash, invocation) { _onScreenshotComplete: function(obj, result, area, flash, invocation) {
if (flash) { if (flash && result) {
let flashspot = new Flashspot.Flashspot(area); let flashspot = new Flashspot.Flashspot(area);
flashspot.fire(); flashspot.fire();
} }

View File

@@ -66,24 +66,32 @@ const VolumeMenu = new Lang.Class({
this._onControlStateChanged(); this._onControlStateChanged();
}, },
scroll: function(direction) { scroll: function(event) {
let direction = event.get_scroll_direction();
let currentVolume = this._output.volume; let currentVolume = this._output.volume;
let delta;
if (event.is_pointer_emulated())
return;
if (direction == Clutter.ScrollDirection.DOWN) { if (direction == Clutter.ScrollDirection.DOWN) {
delta = -VOLUME_ADJUSTMENT_STEP;
} else if (direction == Clutter.ScrollDirection.UP) {
delta = +VOLUME_ADJUSTMENT_STEP;
} else if (direction == Clutter.ScrollDirection.SMOOTH) {
let [dx, dy] = event.get_scroll_delta();
// Use the same math as in the slider.
delta = -dy / 10;
}
let prev_muted = this._output.is_muted; let prev_muted = this._output.is_muted;
this._output.volume = Math.max(0, currentVolume - this._volumeMax * VOLUME_ADJUSTMENT_STEP); this._output.volume = Math.max(0, currentVolume + this._volumeMax * delta);
if (this._output.volume < 1) { if (this._output.volume < 1) {
this._output.volume = 0; this._output.volume = 0;
if (!prev_muted) if (!prev_muted)
this._output.change_is_muted(true); this._output.change_is_muted(true);
} }
this._output.push_volume(); this._output.push_volume();
}
else if (direction == Clutter.ScrollDirection.UP) {
this._output.volume = Math.min(this._volumeMax, currentVolume + this._volumeMax * VOLUME_ADJUSTMENT_STEP);
this._output.change_is_muted(false);
this._output.push_volume();
}
this._notifyVolumeChange(); this._notifyVolumeChange();
}, },
@@ -242,6 +250,6 @@ const Indicator = new Lang.Class({
}, },
_onScrollEvent: function(actor, event) { _onScrollEvent: function(actor, event) {
this._volumeMenu.scroll(event.get_scroll_direction()); this._volumeMenu.scroll(event);
} }
}); });

View File

@@ -14,12 +14,14 @@ const St = imports.gi.St;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Panel = imports.ui.panel;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu; const UserMenu = imports.ui.userMenu;
const Batch = imports.gdm.batch; const Batch = imports.gdm.batch;
const GdmUtil = imports.gdm.util; const GdmUtil = imports.gdm.util;
const LoginDialog = imports.gdm.loginDialog;
// The timeout before going back automatically to the lock screen (in seconds) // The timeout before going back automatically to the lock screen (in seconds)
const IDLE_TIMEOUT = 2 * 60; const IDLE_TIMEOUT = 2 * 60;
@@ -151,7 +153,6 @@ const UnlockDialog = new Lang.Class({
this._promptEntry.clutter_text.set_password_char('\u25cf'); this._promptEntry.clutter_text.set_password_char('\u25cf');
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true }); ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
this.setInitialKeyFocus(this._promptEntry); this.setInitialKeyFocus(this._promptEntry);
this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock));
this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() { this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() {
this._updateOkButtonSensitivity(this._promptEntry.text.length > 0); this._updateOkButtonSensitivity(this._promptEntry.text.length > 0);
})); }));
@@ -169,15 +170,34 @@ const UnlockDialog = new Lang.Class({
this._promptLoginHint.hide(); this._promptLoginHint.hide();
this.contentLayout.add_actor(this._promptLoginHint); this.contentLayout.add_actor(this._promptLoginHint);
let cancelButton = { label: _("Cancel"), this._workSpinner = new Panel.AnimatedIcon('process-working.svg', LoginDialog.WORK_SPINNER_ICON_SIZE);
action: Lang.bind(this, this._escape), this._workSpinner.actor.opacity = 0;
key: Clutter.KEY_Escape }; this._workSpinner.actor.show();
this._okButton = { label: _("Unlock"),
action: Lang.bind(this, this._doUnlock),
default: true };
this.setButtons([cancelButton, this._okButton]);
this._updateSensitivity(true); this.allowCancel = false;
this.buttonLayout.visible = true;
this.addButton({ label: _("Cancel"),
action: Lang.bind(this, this._escape),
key: Clutter.KEY_Escape },
{ expand: true,
x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
this.buttonLayout.add(this._workSpinner.actor,
{ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
this._okButton = this.addButton({ label: _("Unlock"),
action: Lang.bind(this, this._doUnlock),
default: true },
{ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
let otherUserLabel = new St.Label({ text: _("Log in as another user"), let otherUserLabel = new St.Label({ text: _("Log in as another user"),
style_class: 'login-dialog-not-listed-label' }); style_class: 'login-dialog-not-listed-label' });
@@ -192,6 +212,8 @@ const UnlockDialog = new Lang.Class({
{ x_align: St.Align.START, { x_align: St.Align.START,
x_fill: false }); x_fill: false });
this._updateSensitivity(true);
let batch = new Batch.Hold(); let batch = new Batch.Hold();
this._userVerifier.begin(this._userName, batch); this._userVerifier.begin(this._userName, batch);
@@ -210,11 +232,35 @@ const UnlockDialog = new Lang.Class({
this._promptEntry.reactive = sensitive; this._promptEntry.reactive = sensitive;
this._promptEntry.clutter_text.editable = sensitive; this._promptEntry.clutter_text.editable = sensitive;
this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0); this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
this._otherUserButton.reactive = sensitive;
this._otherUserButton.can_focus = sensitive;
}, },
_updateOkButtonSensitivity: function(sensitive) { _updateOkButtonSensitivity: function(sensitive) {
this._okButton.button.reactive = sensitive; this._okButton.reactive = sensitive;
this._okButton.button.can_focus = sensitive; this._okButton.can_focus = sensitive;
},
_setWorking: function(working) {
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: LoginDialog.WORK_SPINNER_ANIMATION_DELAY,
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
this._workSpinner.stop();
}
});
}
}, },
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(userVerifier, message, styleClass) {
@@ -247,6 +293,7 @@ const UnlockDialog = new Lang.Class({
this._currentQuery = serviceName; this._currentQuery = serviceName;
this._updateSensitivity(true); this._updateSensitivity(true);
this._setWorking(false);
}, },
_showLoginHint: function(verifier, message) { _showLoginHint: function(verifier, message) {
@@ -265,6 +312,7 @@ const UnlockDialog = new Lang.Class({
// the actual reply to GDM will be sent as soon as asked // the actual reply to GDM will be sent as soon as asked
this._firstQuestionAnswer = this._promptEntry.text; this._firstQuestionAnswer = this._promptEntry.text;
this._updateSensitivity(false); this._updateSensitivity(false);
this._setWorking(true);
return; return;
} }
@@ -275,6 +323,7 @@ const UnlockDialog = new Lang.Class({
this._currentQuery = null; this._currentQuery = null;
this._updateSensitivity(false); this._updateSensitivity(false);
this._setWorking(true);
this._userVerifier.answerQuery(query, this._promptEntry.text); this._userVerifier.answerQuery(query, this._promptEntry.text);
}, },
@@ -297,11 +346,14 @@ const UnlockDialog = new Lang.Class({
this._promptEntry.menu.isPassword = true; this._promptEntry.menu.isPassword = true;
this._updateSensitivity(false); this._updateSensitivity(false);
this._setWorking(false);
}, },
_escape: function() { _escape: function() {
if (this.allowCancel) {
this._userVerifier.cancel(); this._userVerifier.cancel();
this.emit('failed'); this.emit('failed');
}
}, },
_otherUserClicked: function(button, event) { _otherUserClicked: function(button, event) {

View File

@@ -27,6 +27,7 @@ const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out'; const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const LOCK_ENABLED_KEY = 'lock-enabled'; const LOCK_ENABLED_KEY = 'lock-enabled';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out'; const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const SHOW_FULL_NAME_KEY = 'show-full-name';
const DIALOG_ICON_SIZE = 64; const DIALOG_ICON_SIZE = 64;
@@ -550,9 +551,12 @@ const UserMenuButton = new Lang.Class({
Lang.bind(this, this._updateSwitchUser)); Lang.bind(this, this._updateSwitchUser));
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY, this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
Lang.bind(this, this._updateLogout)); Lang.bind(this, this._updateLogout));
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY, this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
Lang.bind(this, this._updateLockScreen)); Lang.bind(this, this._updateLockScreen));
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_KEY,
Lang.bind(this, this._updateUserName));
global.settings.connect('changed::' + SHOW_FULL_NAME_KEY,
Lang.bind(this, this._updateUserName));
this._updateSwitchUser(); this._updateSwitchUser();
this._updateLogout(); this._updateLogout();
this._updateLockScreen(); this._updateLockScreen();
@@ -597,7 +601,10 @@ const UserMenuButton = new Lang.Class({
}, },
_updateUserName: function() { _updateUserName: function() {
if (this._user.is_loaded) let settings = global.settings;
if (Main.sessionMode.isLocked)
settings = this._screenSaverSettings;
if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_KEY))
this._name.set_text(this._user.get_real_name()); this._name.set_text(this._user.get_real_name());
else else
this._name.set_text(""); this._name.set_text("");

View File

@@ -84,11 +84,11 @@ const ViewSelector = new Lang.Class({
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay(); this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null, this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null,
_("Windows"), 'text-x-generic-symbolic'); _("Windows"), 'emblem-documents-symbolic');
this._appDisplay = new AppDisplay.AllAppDisplay(); this._appDisplay = new AppDisplay.AllAppDisplay();
this._appsPage = this._addPage(this._appDisplay.actor, null, this._appsPage = this._addPage(this._appDisplay.actor, null,
_("Applications"), 'system-run-symbolic'); _("Applications"), 'view-grid-symbolic');
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem); this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
this._searchPage = this._addPage(this._searchResults.actor, this._entry, this._searchPage = this._addPage(this._searchResults.actor, this._entry,
@@ -211,18 +211,19 @@ const ViewSelector = new Lang.Class({
return; return;
if(this._activePage) { if(this._activePage) {
let oldPage = this._activePage;
Tweener.addTween(this._activePage, Tweener.addTween(this._activePage,
{ opacity: 0, { opacity: 0,
time: 0.1, time: 0.1,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: Lang.bind(this, onComplete: Lang.bind(this,
function() { function() {
this._activePage.hide(); oldPage.hide();
this._activePage = page;
}) })
}); });
} }
this._activePage = page;
page.show(); page.show();
Tweener.addTween(page, Tweener.addTween(page,
{ opacity: 255, { opacity: 255,

View File

@@ -265,23 +265,37 @@ const WindowClone = new Lang.Class({
_onScroll : function (actor, event) { _onScroll : function (actor, event) {
let direction = event.get_scroll_direction(); let direction = event.get_scroll_direction();
if (direction == Clutter.ScrollDirection.UP) { let delta;
if (event.is_pointer_emulated())
return;
if (direction == Clutter.ScrollDirection.DOWN) {
delta = -SCROLL_SCALE_AMOUNT;
} else if (direction == Clutter.ScrollDirection.UP) {
delta = +SCROLL_SCALE_AMOUNT;
} else if (direction == Clutter.ScrollDirection.SMOOTH) {
let [dx, dy] = event.get_scroll_delta();
delta = -dy * 10;
}
if (delta > 0) {
if (this._zoomStep == undefined) if (this._zoomStep == undefined)
this._zoomStart(); this._zoomStart();
if (this._zoomStep < 100) { if (this._zoomStep < 100) {
this._zoomStep += SCROLL_SCALE_AMOUNT; this._zoomStep += delta;
this._zoomStep = Math.min(100, this._zoomStep);
this._zoomUpdate(); this._zoomUpdate();
} }
} else if (direction == Clutter.ScrollDirection.DOWN) { } else if (delta < 0) {
if (this._zoomStep > 0) { if (this._zoomStep > 0) {
this._zoomStep -= SCROLL_SCALE_AMOUNT; this._zoomStep += delta;
this._zoomStep = Math.max(0, this._zoomStep); this._zoomStep = Math.max(0, this._zoomStep);
this._zoomUpdate(); this._zoomUpdate();
} }
if (this._zoomStep <= 0.0) if (this._zoomStep <= 0.0)
this._zoomEnd(); this._zoomEnd();
} }
}, },
_zoomUpdate : function () { _zoomUpdate : function () {
@@ -445,6 +459,9 @@ const WindowOverlay = new Lang.Class({
this._parentActor = parentActor; this._parentActor = parentActor;
this._hidden = false; this._hidden = false;
this.borderSize = 0;
this.border = new St.Bin({ style_class: 'window-clone-border' });
let title = new St.Label({ style_class: 'window-caption', let title = new St.Label({ style_class: 'window-caption',
text: metaWindow.title }); text: metaWindow.title });
title.clutter_text.ellipsize = Pango.EllipsizeMode.END; title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
@@ -482,11 +499,13 @@ const WindowOverlay = new Lang.Class({
this.closeButton = button; this.closeButton = button;
parentActor.add_actor(this.title); parentActor.add_actor(this.title);
parentActor.add_actor(this.border);
parentActor.add_actor(this.closeButton); parentActor.add_actor(this.closeButton);
title.connect('style-changed', title.connect('style-changed',
Lang.bind(this, this._onStyleChanged)); Lang.bind(this, this._onStyleChanged));
button.connect('style-changed', button.connect('style-changed',
Lang.bind(this, this._onStyleChanged)); Lang.bind(this, this._onStyleChanged));
this.border.connect('style-changed', Lang.bind(this, this._onStyleChanged));
// force a style change if we are already on a stage - otherwise // force a style change if we are already on a stage - otherwise
// the signal will be emitted normally when we are added // the signal will be emitted normally when we are added
if (parentActor.get_stage()) if (parentActor.get_stage())
@@ -495,15 +514,17 @@ const WindowOverlay = new Lang.Class({
hide: function() { hide: function() {
this._hidden = true; this._hidden = true;
this.closeButton.hide();
this.title.hide(); this.title.hide();
this.hideCloseButton();
}, },
show: function() { show: function() {
this._hidden = false; this._hidden = false;
if (this._windowClone.actor.has_pointer)
this.closeButton.show();
this.title.show(); this.title.show();
if (this._windowClone.actor.has_pointer)
this._animateVisible();
}, },
fadeIn: function() { fadeIn: function() {
@@ -520,10 +541,14 @@ const WindowOverlay = new Lang.Class({
}, },
chromeHeights: function () { chromeHeights: function () {
return [this.closeButton.height - this.closeButton._overlap, return [Math.max(this.borderSize, this.closeButton.height - this.closeButton._overlap),
this.title.height + this.title._spacing]; this.title.height + this.title._spacing];
}, },
chromeWidths: function () {
return [this.borderSize, this.borderSize];
},
_repositionSelf: function() { _repositionSelf: function() {
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot; let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false); this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
@@ -578,16 +603,32 @@ const WindowOverlay = new Lang.Class({
title.width = titleWidth; title.width = titleWidth;
title.set_position(Math.floor(titleX), Math.floor(titleY)); title.set_position(Math.floor(titleX), Math.floor(titleY));
} }
let borderX = cloneX - this.borderSize;
let borderY = cloneY - this.borderSize;
let borderWidth = cloneWidth + 2 * this.borderSize;
let borderHeight = cloneHeight + 2 * this.borderSize;
if (animate) {
this._animateOverlayActor(this.border, borderX, borderY,
borderWidth, borderHeight);
} else {
this.border.set_position(borderX, borderY);
this.border.set_size(borderWidth, borderHeight);
}
}, },
_animateOverlayActor: function(actor, x, y, width) { _animateOverlayActor: function(actor, x, y, width, height) {
Tweener.addTween(actor, let params = { x: x,
{ x: x,
y: y, y: y,
width: width, width: width,
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad' };
});
if (height !== undefined)
params.height = height;
Tweener.addTween(actor, params);
}, },
_closeWindow: function(actor) { _closeWindow: function(actor) {
@@ -630,6 +671,43 @@ const WindowOverlay = new Lang.Class({
this._windowClone.metaWindow.disconnect(this._updateCaptionId); this._windowClone.metaWindow.disconnect(this._updateCaptionId);
this.title.destroy(); this.title.destroy();
this.closeButton.destroy(); this.closeButton.destroy();
this.border.destroy();
},
_animateVisible: function() {
this._parentActor.raise_top();
this.closeButton.show();
this.closeButton.opacity = 0;
Tweener.addTween(this.closeButton,
{ opacity: 255,
time: CLOSE_BUTTON_FADE_TIME,
transition: 'easeOutQuad' });
this.border.show();
this.border.opacity = 0;
Tweener.addTween(this.border,
{ opacity: 255,
time: CLOSE_BUTTON_FADE_TIME,
transition: 'easeOutQuad' });
this.title.add_style_pseudo_class('hover');
},
_animateInvisible: function() {
this.closeButton.opacity = 255;
Tweener.addTween(this.closeButton,
{ opacity: 0,
time: CLOSE_BUTTON_FADE_TIME,
transition: 'easeInQuad' });
this.border.opacity = 255;
Tweener.addTween(this.border,
{ opacity: 0,
time: CLOSE_BUTTON_FADE_TIME,
transition: 'easeInQuad' });
this.title.remove_style_pseudo_class('hover');
}, },
_onEnter: function() { _onEnter: function() {
@@ -639,8 +717,8 @@ const WindowOverlay = new Lang.Class({
// are shown again // are shown again
if (this._hidden) if (this._hidden)
return; return;
this._parentActor.raise_top();
this.closeButton.show(); this._animateVisible();
this.emit('show-close-button'); this.emit('show-close-button');
}, },
@@ -651,9 +729,10 @@ const WindowOverlay = new Lang.Class({
_idleToggleCloseButton: function() { _idleToggleCloseButton: function() {
this._idleToggleCloseId = 0; this._idleToggleCloseId = 0;
if (!this._windowClone.actor.has_pointer && if (!this._windowClone.actor.has_pointer &&
!this.closeButton.has_pointer) !this.closeButton.has_pointer)
this.closeButton.hide(); this._animateInvisible();
return false; return false;
}, },
@@ -664,6 +743,8 @@ const WindowOverlay = new Lang.Class({
this._idleToggleCloseId = 0; this._idleToggleCloseId = 0;
} }
this.closeButton.hide(); this.closeButton.hide();
this.border.hide();
this.title.remove_style_pseudo_class('hover');
}, },
_onStyleChanged: function() { _onStyleChanged: function() {
@@ -673,6 +754,9 @@ const WindowOverlay = new Lang.Class({
let closeNode = this.closeButton.get_theme_node(); let closeNode = this.closeButton.get_theme_node();
this.closeButton._overlap = closeNode.get_length('-shell-close-overlap'); this.closeButton._overlap = closeNode.get_length('-shell-close-overlap');
let borderNode = this.border.get_theme_node();
this.borderSize = borderNode.get_border_width(St.Side.TOP);
this._parentActor.queue_relayout(); this._parentActor.queue_relayout();
} }
}); });
@@ -1623,20 +1707,25 @@ const Workspace = new Lang.Class({
return []; return [];
let closeButtonHeight, captionHeight; let closeButtonHeight, captionHeight;
let leftBorder, rightBorder;
if (this._windowOverlays.length) { if (this._windowOverlays.length) {
// All of the overlays have the same chrome sizes, // All of the overlays have the same chrome sizes,
// so just pick the first one. // so just pick the first one.
let overlay = this._windowOverlays[0]; let overlay = this._windowOverlays[0];
[closeButtonHeight, captionHeight] = overlay.chromeHeights(); [closeButtonHeight, captionHeight] = overlay.chromeHeights();
[leftBorder, rightBorder] = overlay.chromeWidths();
} else { } else {
[closeButtonHeight, captionHeight] = [0, 0]; [closeButtonHeight, captionHeight] = [0, 0];
} }
rowSpacing += captionHeight; rowSpacing += captionHeight;
columnSpacing += rightBorder;
let area = { x: this._x, y: this._y, width: this._width, height: this._height }; let area = { x: this._x, y: this._y, width: this._width, height: this._height };
area.y += closeButtonHeight; area.y += closeButtonHeight;
area.height -= closeButtonHeight; area.height -= closeButtonHeight;
area.x += leftBorder;
area.width -= leftBorder;
if (!this._currentLayout) if (!this._currentLayout)
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing, captionHeight); this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing, captionHeight);

View File

@@ -205,11 +205,11 @@ const WorkspacesView = new Lang.Class({
this._workspaces[w].positionWindows(Workspace.WindowPositionFlags.ANIMATE); this._workspaces[w].positionWindows(Workspace.WindowPositionFlags.ANIMATE);
}, },
_scrollToActive: function(showAnimation) { _scrollToActive: function() {
let active = global.screen.get_active_workspace_index(); let active = global.screen.get_active_workspace_index();
this._updateWorkspaceActors(showAnimation); this._updateWorkspaceActors(true);
this._updateScrollAdjustment(active, showAnimation); this._updateScrollAdjustment(active);
}, },
// Update workspace actors parameters // Update workspace actors parameters
@@ -267,13 +267,12 @@ const WorkspacesView = new Lang.Class({
} }
}, },
_updateScrollAdjustment: function(index, showAnimation) { _updateScrollAdjustment: function(index) {
if (this._scrolling) if (this._scrolling)
return; return;
this._animatingScroll = true; this._animatingScroll = true;
if (showAnimation) {
Tweener.addTween(this.scrollAdjustment, { Tweener.addTween(this.scrollAdjustment, {
value: index, value: index,
time: WORKSPACE_SWITCH_TIME, time: WORKSPACE_SWITCH_TIME,
@@ -283,10 +282,6 @@ const WorkspacesView = new Lang.Class({
this._animatingScroll = false; this._animatingScroll = false;
}) })
}); });
} else {
this.scrollAdjustment.value = index;
this._animatingScroll = false;
}
}, },
updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces) { updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces) {
@@ -313,7 +308,7 @@ const WorkspacesView = new Lang.Class({
if (this._scrolling) if (this._scrolling)
return; return;
this._scrollToActive(true); this._scrollToActive();
}, },
_onDestroy: function() { _onDestroy: function() {
@@ -387,24 +382,11 @@ const WorkspacesView = new Lang.Class({
this._scrolling = true; this._scrolling = true;
}, },
endSwipeScroll: function(result) { endSwipeScroll: function() {
this._scrolling = false; this._scrolling = false;
if (result == Overview.SwipeScrollResult.CLICK) {
let [x, y, mod] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL,
x, y);
// Only switch to the workspace when there's no application
// windows open. The problem is that it's too easy to miss
// an app window and get the wrong one focused.
let active = global.screen.get_active_workspace_index();
if (this._workspaces[active].isEmpty() &&
this.actor.contains(actor))
Main.overview.hide();
}
// Make sure title captions etc are shown as necessary // Make sure title captions etc are shown as necessary
this._scrollToActive();
this._updateVisibility(); this._updateVisibility();
}, },
@@ -456,9 +438,23 @@ const WorkspacesDisplay = new Lang.Class({
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight)); this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate)); this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('notify::mapped', Lang.bind(this, this._setupSwipeScrolling));
this.actor.connect('parent-set', Lang.bind(this, this._parentSet)); this.actor.connect('parent-set', Lang.bind(this, this._parentSet));
this.actor.set_clip_to_allocation(true); this.actor.set_clip_to_allocation(true);
let action = new Clutter.PanAction();
action.connect('pan', Lang.bind(this, this._onPan));
action.connect('gesture-begin', Lang.bind(this, function() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].startSwipeScroll();
return true;
}));
action.connect('gesture-end', Lang.bind(this, function() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].endSwipeScroll();
}));
Main.overview.addAction(action);
this.actor.connect('notify::mapped', Lang.bind(this, function() {
action.enabled = this.actor.mapped;
}));
let controls = new St.Bin({ style_class: 'workspace-controls', let controls = new St.Bin({ style_class: 'workspace-controls',
request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT, request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT,
@@ -531,6 +527,13 @@ const WorkspacesDisplay = new Lang.Class({
Lang.bind(this, this._updateSwitcherVisibility)); Lang.bind(this, this._updateSwitcherVisibility));
}, },
_onPan: function(action) {
let [dist, dx, dy] = action.get_motion_delta(0);
let adjustment = this._scrollAdjustment;
adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
return false;
},
_updateSwitcherVisibility: function() { _updateSwitcherVisibility: function() {
this._thumbnailsBox.actor.visible = this._thumbnailsBox.actor.visible =
this._settings.get_boolean('dynamic-workspaces') || this._settings.get_boolean('dynamic-workspaces') ||
@@ -640,33 +643,6 @@ const WorkspacesDisplay = new Lang.Class({
} }
}, },
_setupSwipeScrolling: function() {
if (this._swipeScrollBeginId)
Main.overview.disconnect(this._swipeScrollBeginId);
this._swipeScrollBeginId = 0;
if (this._swipeScrollEndId)
Main.overview.disconnect(this._swipeScrollEndId);
this._swipeScrollEndId = 0;
if (!this.actor.mapped)
return;
let direction = Overview.SwipeScrollDirection.VERTICAL;
Main.overview.setScrollAdjustment(this._scrollAdjustment,
direction);
this._swipeScrollBeginId = Main.overview.connect('swipe-scroll-begin',
Lang.bind(this, function() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].startSwipeScroll();
}));
this._swipeScrollEndId = Main.overview.connect('swipe-scroll-end',
Lang.bind(this, function(overview, result) {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].endSwipeScroll(result);
}));
},
_workspacesOnlyOnPrimaryChanged: function() { _workspacesOnlyOnPrimaryChanged: function() {
this._workspacesOnlyOnPrimary = this._settings.get_boolean('workspaces-only-on-primary'); this._workspacesOnlyOnPrimary = this._settings.get_boolean('workspaces-only-on-primary');
@@ -706,7 +682,6 @@ const WorkspacesDisplay = new Lang.Class({
this._scrollAdjustment = view.scrollAdjustment; this._scrollAdjustment = view.scrollAdjustment;
this._scrollAdjustment.connect('notify::value', this._scrollAdjustment.connect('notify::value',
Lang.bind(this, this._scrollValueChanged)); Lang.bind(this, this._scrollValueChanged));
this._setupSwipeScrolling();
} }
this._workspacesViews.push(view); this._workspacesViews.push(view);
} }
@@ -863,8 +838,9 @@ const WorkspacesDisplay = new Lang.Class({
let clipX = rtl ? x + controlsVisible : x; let clipX = rtl ? x + controlsVisible : x;
let clipY = y + (fullHeight - clipHeight) / 2; let clipY = y + (fullHeight - clipHeight) / 2;
let overviewSpacing = Main.overview._spacing;
let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible; let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible;
widthAdjust += Main.overview._spacing; widthAdjust += overviewSpacing;
width -= widthAdjust; width -= widthAdjust;
if (rtl) if (rtl)
x += widthAdjust; x += widthAdjust;
@@ -882,10 +858,10 @@ const WorkspacesDisplay = new Lang.Class({
monitors[i].y, monitors[i].y,
monitors[i].width, monitors[i].width,
monitors[i].height); monitors[i].height);
this._workspacesViews[m].setGeometry(monitors[i].x, this._workspacesViews[m].setGeometry(monitors[i].x + overviewSpacing/2,
monitors[i].y, monitors[i].y + overviewSpacing/2,
monitors[i].width, monitors[i].width - overviewSpacing,
monitors[i].height); monitors[i].height - overviewSpacing);
m++; m++;
} }
} }

725
po/as.po

File diff suppressed because it is too large Load Diff

248
po/he.po
View File

@@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-11-09 11:32+0200\n" "POT-Creation-Date: 2012-11-23 10:13+0200\n"
"PO-Revision-Date: 2012-11-09 11:36+0200\n" "PO-Revision-Date: 2012-11-23 10:14+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n" "Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <sh.yaron@gmail.com>\n" "Language-Team: Hebrew <sh.yaron@gmail.com>\n"
"Language: he\n" "Language: he\n"
@@ -244,11 +244,11 @@ msgstr "הרחבה"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "יש לבחור את ההרחבה להגדרה באמצעות תיבת הבחירה המשולבת שלהלן." msgstr "יש לבחור את ההרחבה להגדרה באמצעות תיבת הבחירה המשולבת שלהלן."
#: ../js/gdm/loginDialog.js:560 #: ../js/gdm/loginDialog.js:565
msgid "Session..." msgid "Session..."
msgstr "הפעלה..." msgstr "הפעלה..."
#: ../js/gdm/loginDialog.js:707 #: ../js/gdm/loginDialog.js:722
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "כניסה" msgstr "כניסה"
@@ -256,40 +256,40 @@ msgstr "כניסה"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:768 #: ../js/gdm/loginDialog.js:786
msgid "Not listed?" msgid "Not listed?"
msgstr "לא רשום?" msgstr "לא רשום?"
#: ../js/gdm/loginDialog.js:912 #: ../js/gdm/loginDialog.js:962
#: ../js/ui/components/networkAgent.js:137 #: ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 #: ../js/ui/components/polkitAgent.js:162
#: ../js/ui/endSessionDialog.js:373 #: ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 #: ../js/ui/extensionDownloader.js:195
#: ../js/ui/shellMountOperation.js:396 #: ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 #: ../js/ui/status/bluetooth.js:413
#: ../js/ui/unlockDialog.js:171 #: ../js/ui/unlockDialog.js:179
msgid "Cancel" msgid "Cancel"
msgstr "ביטול" msgstr "ביטול"
#: ../js/gdm/loginDialog.js:917 #: ../js/gdm/loginDialog.js:978
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "כניסה" msgstr "כניסה"
#: ../js/gdm/loginDialog.js:917 #: ../js/gdm/loginDialog.js:978
msgid "Next" msgid "Next"
msgstr "הבא" msgstr "הבא"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:993 #: ../js/gdm/loginDialog.js:1086
#: ../js/ui/components/networkAgent.js:260 #: ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "שם משתמש:" msgstr "שם משתמש:"
#: ../js/gdm/loginDialog.js:1289 #: ../js/gdm/loginDialog.js:1382
msgid "Login Window" msgid "Login Window"
msgstr "חלון כניסה" msgstr "חלון כניסה"
@@ -347,28 +347,28 @@ msgid "Execution of '%s' failed:"
msgstr "ההרצה של '%s' נכשלה:" msgstr "ההרצה של '%s' נכשלה:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:252 #: ../js/ui/appDisplay.js:259
msgid "All" msgid "All"
msgstr "הכול" msgstr "הכול"
#: ../js/ui/appDisplay.js:310 #: ../js/ui/appDisplay.js:317
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "יישומים" msgstr "יישומים"
#: ../js/ui/appDisplay.js:370 #: ../js/ui/appDisplay.js:377
msgid "SETTINGS" msgid "SETTINGS"
msgstr "הגדרות" msgstr "הגדרות"
#: ../js/ui/appDisplay.js:675 #: ../js/ui/appDisplay.js:682
msgid "New Window" msgid "New Window"
msgstr "חלון חדש" msgstr "חלון חדש"
#: ../js/ui/appDisplay.js:678 #: ../js/ui/appDisplay.js:685
#: ../js/ui/dash.js:289 #: ../js/ui/dash.js:289
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "הסרה מהמועדפים" msgstr "הסרה מהמועדפים"
#: ../js/ui/appDisplay.js:679 #: ../js/ui/appDisplay.js:686
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "הוספה למועדפים" msgstr "הוספה למועדפים"
@@ -644,7 +644,7 @@ msgid "Sorry, that didn't work. Please try again."
msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסליחה." msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסליחה."
#. Translators: this is a filename used for screencast recording #. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:44 #: ../js/ui/components/recorder.js:48
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "צילום מסך מהקובץ %d %t" msgstr "צילום מסך מהקובץ %d %t"
@@ -1080,11 +1080,15 @@ msgstr "פתיחה"
msgid "Remove" msgid "Remove"
msgstr "הסרה" msgstr "הסרה"
#: ../js/ui/messageTray.js:1545 #: ../js/ui/messageTray.js:1552
msgid "No Messages"
msgstr "אין הודעות"
#: ../js/ui/messageTray.js:1569
msgid "Message Tray" msgid "Message Tray"
msgstr "אזור דיווח ההודעות" msgstr "אזור דיווח ההודעות"
#: ../js/ui/messageTray.js:2588 #: ../js/ui/messageTray.js:2639
msgid "System Information" msgid "System Information"
msgstr "פרטי המערכת" msgstr "פרטי המערכת"
@@ -1116,17 +1120,17 @@ msgstr "יש להקליד כדי לחפש..."
msgid "Dash" msgid "Dash"
msgstr "חלונית" msgstr "חלונית"
#: ../js/ui/panel.js:580 #: ../js/ui/panel.js:599
msgid "Quit" msgid "Quit"
msgstr "יציאה" msgstr "יציאה"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:612 #: ../js/ui/panel.js:631
msgid "Activities" msgid "Activities"
msgstr "פעילויות" msgstr "פעילויות"
#: ../js/ui/panel.js:979 #: ../js/ui/panel.js:999
msgid "Top Bar" msgid "Top Bar"
msgstr "הסרגל העליון" msgstr "הסרגל העליון"
@@ -1169,6 +1173,11 @@ msgstr[0] "התרעה אחת"
msgstr[1] "%d התרעות" msgstr[1] "%d התרעות"
msgstr[2] "2 התרעות" msgstr[2] "2 התרעות"
#: ../js/ui/screenShield.js:401
#: ../js/ui/userMenu.js:773
msgid "Lock"
msgstr "נעילה"
#: ../js/ui/searchDisplay.js:275 #: ../js/ui/searchDisplay.js:275
msgid "Searching..." msgid "Searching..."
msgstr "בחיפוש..." msgstr "בחיפוש..."
@@ -1202,66 +1211,64 @@ msgid "Remember Password"
msgstr "שמירת הססמה" msgstr "שמירת הססמה"
#: ../js/ui/shellMountOperation.js:400 #: ../js/ui/shellMountOperation.js:400
#: ../js/ui/unlockDialog.js:174 #: ../js/ui/unlockDialog.js:193
msgid "Unlock" msgid "Unlock"
msgstr "שחרור" msgstr "שחרור"
#: ../js/ui/status/accessibility.js:39 #: ../js/ui/status/accessibility.js:40
msgid "Accessibility" msgid "Accessibility"
msgstr "נגישות" msgstr "נגישות"
#: ../js/ui/status/accessibility.js:44 #: ../js/ui/status/accessibility.js:45
msgid "Zoom" msgid "Zoom"
msgstr "תקריב" msgstr "תקריב"
#: ../js/ui/status/accessibility.js:51 #: ../js/ui/status/accessibility.js:52
msgid "Screen Reader" msgid "Screen Reader"
msgstr "מקריא מסך" msgstr "מקריא מסך"
#: ../js/ui/status/accessibility.js:55 #: ../js/ui/status/accessibility.js:56
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "מקלדת מסך" msgstr "מקלדת מסך"
#: ../js/ui/status/accessibility.js:59 #: ../js/ui/status/accessibility.js:60
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "התראות חזותיות" msgstr "התראות חזותיות"
#: ../js/ui/status/accessibility.js:62 #: ../js/ui/status/accessibility.js:63
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "מקשים דביקים" msgstr "מקשים דביקים"
#: ../js/ui/status/accessibility.js:65 #: ../js/ui/status/accessibility.js:66
msgid "Slow Keys" msgid "Slow Keys"
msgstr "מקשים אטיים" msgstr "מקשים אטיים"
#: ../js/ui/status/accessibility.js:68 #: ../js/ui/status/accessibility.js:69
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "מקשים קופצים" msgstr "מקשים קופצים"
#: ../js/ui/status/accessibility.js:71 #: ../js/ui/status/accessibility.js:72
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "מקשי עכבר" msgstr "מקשי עכבר"
#: ../js/ui/status/accessibility.js:75 #: ../js/ui/status/accessibility.js:76
msgid "Universal Access Settings" msgid "Universal Access Settings"
msgstr "הגדרות גישה אוניברסלית" msgstr "הגדרות גישה אוניברסלית"
#: ../js/ui/status/accessibility.js:109 #: ../js/ui/status/accessibility.js:112
msgid "High Contrast" msgid "High Contrast"
msgstr "ניגודיות גבוהה" msgstr "ניגודיות גבוהה"
#: ../js/ui/status/accessibility.js:146 #: ../js/ui/status/accessibility.js:159
msgid "Large Text" msgid "Large Text"
msgstr "טקסט גדול" msgstr "טקסט גדול"
#: ../js/ui/status/bluetooth.js:27 #: ../js/ui/status/bluetooth.js:27
#: ../js/ui/status/bluetooth.js:31 #: ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:251 #: ../js/ui/status/bluetooth.js:288
#: ../js/ui/status/bluetooth.js:304 #: ../js/ui/status/bluetooth.js:319
#: ../js/ui/status/bluetooth.js:335 #: ../js/ui/status/bluetooth.js:355
#: ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:386
#: ../js/ui/status/bluetooth.js:400
#: ../js/ui/status/network.js:873
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1283,7 +1290,7 @@ msgstr "הגדרות Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:103 #: ../js/ui/status/bluetooth.js:103
#: ../js/ui/status/network.js:208 #: ../js/ui/status/network.js:169
msgid "hardware disabled" msgid "hardware disabled"
msgstr "מנוטרל חומרתית" msgstr "מנוטרל חומרתית"
@@ -1292,13 +1299,13 @@ msgid "Connection"
msgstr "חיבור" msgstr "חיבור"
#: ../js/ui/status/bluetooth.js:207 #: ../js/ui/status/bluetooth.js:207
#: ../js/ui/status/network.js:475 #: ../js/ui/status/network.js:436
msgid "disconnecting..." msgid "disconnecting..."
msgstr "בהליכי ניתוק..." msgstr "בהליכי ניתוק..."
#: ../js/ui/status/bluetooth.js:220 #: ../js/ui/status/bluetooth.js:220
#: ../js/ui/status/network.js:481 #: ../js/ui/status/network.js:442
#: ../js/ui/status/network.js:1507 #: ../js/ui/status/network.js:1449
msgid "connecting..." msgid "connecting..."
msgstr "בהתחברות..." msgstr "בהתחברות..."
@@ -1306,88 +1313,77 @@ msgstr "בהתחברות..."
msgid "Send Files..." msgid "Send Files..."
msgstr "שליחת קבצים..." msgstr "שליחת קבצים..."
#: ../js/ui/status/bluetooth.js:243 #: ../js/ui/status/bluetooth.js:245
msgid "Browse Files..."
msgstr "עיון בקבצים..."
#: ../js/ui/status/bluetooth.js:252
msgid "Error browsing device"
msgstr "שגיאה בעיון בהתקן"
#: ../js/ui/status/bluetooth.js:253
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'"
#: ../js/ui/status/bluetooth.js:261
msgid "Keyboard Settings" msgid "Keyboard Settings"
msgstr "הגדרות מקלדת" msgstr "הגדרות מקלדת"
#: ../js/ui/status/bluetooth.js:264 #: ../js/ui/status/bluetooth.js:248
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "הגדרות עכבר" msgstr "הגדרות עכבר"
#: ../js/ui/status/bluetooth.js:269 #: ../js/ui/status/bluetooth.js:253
#: ../js/ui/status/volume.js:234 #: ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "הגדרות שמע" msgstr "הגדרות שמע"
#: ../js/ui/status/bluetooth.js:336 #: ../js/ui/status/bluetooth.js:320
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "בקשת אישור מאת %s" msgstr "בקשת אישור מאת %s"
#: ../js/ui/status/bluetooth.js:342 #: ../js/ui/status/bluetooth.js:326
#, c-format #, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'" msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'"
#: ../js/ui/status/bluetooth.js:344 #: ../js/ui/status/bluetooth.js:328
msgid "Always grant access" msgid "Always grant access"
msgstr "תמיד להעניק גישה" msgstr "תמיד להעניק גישה"
#: ../js/ui/status/bluetooth.js:345 #: ../js/ui/status/bluetooth.js:329
msgid "Grant this time only" msgid "Grant this time only"
msgstr "הענקת גישה הפעם בלבד" msgstr "הענקת גישה הפעם בלבד"
#: ../js/ui/status/bluetooth.js:346 #: ../js/ui/status/bluetooth.js:330
msgid "Reject" msgid "Reject"
msgstr "סירוב" msgstr "סירוב"
#: ../js/ui/status/bluetooth.js:372 #. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:357
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "אישור צימוד עבור %s" msgstr "אישור צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:378 #: ../js/ui/status/bluetooth.js:363
#: ../js/ui/status/bluetooth.js:408 #: ../js/ui/status/bluetooth.js:394
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה" msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה"
#: ../js/ui/status/bluetooth.js:379 #: ../js/ui/status/bluetooth.js:364
#, c-format #, c-format
msgid "Please confirm whether the PIN '%06d' matches the one on the device." msgid "Please confirm whether the PIN '%06d' matches the one on the device."
msgstr "נא לאשר האם קוד ה־PIN '%06d' תואם את זה שמופיע בהתקן." msgstr "נא לאשר האם קוד ה־PIN '%06d' תואם את זה שמופיע בהתקן."
#: ../js/ui/status/bluetooth.js:381 #. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:367
msgid "Matches" msgid "Matches"
msgstr "התאמות" msgstr "התאמות"
#: ../js/ui/status/bluetooth.js:382 #: ../js/ui/status/bluetooth.js:368
msgid "Does not match" msgid "Does not match"
msgstr "אינו תואם" msgstr "אינו תואם"
#: ../js/ui/status/bluetooth.js:401 #: ../js/ui/status/bluetooth.js:387
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "בקשת צימוד עבור %s" msgstr "בקשת צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:409 #: ../js/ui/status/bluetooth.js:395
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן." msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן."
#: ../js/ui/status/bluetooth.js:426 #: ../js/ui/status/bluetooth.js:412
msgid "OK" msgid "OK"
msgstr "אישור" msgstr "אישור"
@@ -1403,122 +1399,114 @@ msgstr "הגדרות אזור ושפה"
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "עצמת שמע, רשת, סוללה" msgstr "עצמת שמע, רשת, סוללה"
#: ../js/ui/status/network.js:94 #: ../js/ui/status/network.js:95
msgid "<unknown>" msgid "<unknown>"
msgstr "<לא ידוע>" msgstr "<לא ידוע>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:230 #: ../js/ui/status/network.js:191
msgid "disabled" msgid "disabled"
msgstr "מנוטרל" msgstr "מנוטרל"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:473 #: ../js/ui/status/network.js:434
msgid "unmanaged" msgid "unmanaged"
msgstr "לא מנוהל" msgstr "לא מנוהל"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:484 #: ../js/ui/status/network.js:445
#: ../js/ui/status/network.js:1510 #: ../js/ui/status/network.js:1452
msgid "authentication required" msgid "authentication required"
msgstr "נדרש אימות" msgstr "נדרש אימות"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:494 #: ../js/ui/status/network.js:455
msgid "firmware missing" msgid "firmware missing"
msgstr "הקושחה חסרה" msgstr "הקושחה חסרה"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:501 #: ../js/ui/status/network.js:462
msgid "cable unplugged" msgid "cable unplugged"
msgstr "הכבל מנותק" msgstr "הכבל מנותק"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:506 #: ../js/ui/status/network.js:467
msgid "unavailable" msgid "unavailable"
msgstr "לא זמין" msgstr "לא זמין"
#: ../js/ui/status/network.js:508 #: ../js/ui/status/network.js:469
#: ../js/ui/status/network.js:1512 #: ../js/ui/status/network.js:1454
msgid "connection failed" msgid "connection failed"
msgstr "החיבור נכשל" msgstr "החיבור נכשל"
#: ../js/ui/status/network.js:560 #: ../js/ui/status/network.js:525
#: ../js/ui/status/network.js:1446 #: ../js/ui/status/network.js:1388
#: ../js/ui/status/network.js:1588 #: ../js/ui/status/network.js:1530
msgid "More..." msgid "More..."
msgstr "עוד..." msgstr "עוד..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:596 #: ../js/ui/status/network.js:561
#: ../js/ui/status/network.js:1376 #: ../js/ui/status/network.js:1318
msgid "Connected (private)" msgid "Connected (private)"
msgstr "מחובר (פרטי)" msgstr "מחובר (פרטי)"
#: ../js/ui/status/network.js:669 #: ../js/ui/status/network.js:615
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "אתרנט אוטומטי" msgstr "אתרנט אוטומטי"
#: ../js/ui/status/network.js:727 #: ../js/ui/status/network.js:673
msgid "Auto broadband" msgid "Auto broadband"
msgstr "פס רחב אוטומטי" msgstr "פס רחב אוטומטי"
#: ../js/ui/status/network.js:730 #: ../js/ui/status/network.js:676
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "חיוג אוטומטי" msgstr "חיוג אוטומטי"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:859 #: ../js/ui/status/network.js:805
#: ../js/ui/status/network.js:1393 #: ../js/ui/status/network.js:1335
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s אוטומטי" msgstr "%s אוטומטי"
#: ../js/ui/status/network.js:861 #: ../js/ui/status/network.js:807
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Bluetooth אוטומטי" msgstr "Bluetooth אוטומטי"
#: ../js/ui/status/network.js:1395 #: ../js/ui/status/network.js:1337
msgid "Auto wireless" msgid "Auto wireless"
msgstr "אלחוטי אוטומטי" msgstr "אלחוטי אוטומטי"
#: ../js/ui/status/network.js:1637 #: ../js/ui/status/network.js:1579
msgid "Enable networking" msgid "Enable networking"
msgstr "הפעלת תכונת הרשת" msgstr "הפעלת תכונת הרשת"
#: ../js/ui/status/network.js:1659 #: ../js/ui/status/network.js:1611
msgid "Wired" msgid "Wi-Fi"
msgstr "קווי" msgstr "רשת אלחוטית"
#: ../js/ui/status/network.js:1670 #: ../js/ui/status/network.js:1630
msgid "Wireless"
msgstr "אלחוטי"
#: ../js/ui/status/network.js:1680
msgid "Mobile broadband"
msgstr "פס־רחב נייד"
#: ../js/ui/status/network.js:1691
msgid "Network Settings" msgid "Network Settings"
msgstr "הגדרות הרשת" msgstr "הגדרות הרשת"
#: ../js/ui/status/network.js:1735 #: ../js/ui/status/network.js:1674
msgid "Network Manager" msgid "Network Manager"
msgstr "מנהל הרשתות" msgstr "מנהל הרשתות"
#: ../js/ui/status/network.js:1809 #: ../js/ui/status/network.js:1756
msgid "Connection failed" msgid "Connection failed"
msgstr "ההתחברות נכשל" msgstr "ההתחברות נכשל"
#: ../js/ui/status/network.js:1810 #: ../js/ui/status/network.js:1757
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "הפעלת חיבור הרשת נכשלה" msgstr "הפעלת חיבור הרשת נכשלה"
#: ../js/ui/status/network.js:2108 #: ../js/ui/status/network.js:2074
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "תכונת הרשת מנוטרלת" msgstr "תכונת הרשת מנוטרלת"
@@ -1634,10 +1622,14 @@ msgstr "עצמה"
msgid "Microphone" msgid "Microphone"
msgstr "מיקרופון" msgstr "מיקרופון"
#: ../js/ui/unlockDialog.js:181 #: ../js/ui/unlockDialog.js:202
msgid "Log in as another user" msgid "Log in as another user"
msgstr "כניסה בתור משתמש אחר" msgstr "כניסה בתור משתמש אחר"
#: ../js/ui/unlockDialog.js:225
msgid "Unlock Window"
msgstr "שחרור החלון"
#: ../js/ui/userMenu.js:176 #: ../js/ui/userMenu.js:176
msgid "Available" msgid "Available"
msgstr "זמין" msgstr "זמין"
@@ -1678,10 +1670,6 @@ msgstr "החלפת משתמש"
msgid "Log Out" msgid "Log Out"
msgstr "יציאה" msgstr "יציאה"
#: ../js/ui/userMenu.js:773
msgid "Lock"
msgstr "נעילה"
#: ../js/ui/userMenu.js:788 #: ../js/ui/userMenu.js:788
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "התקנת עדכונים והפעלה מחדש" msgstr "התקנת עדכונים והפעלה מחדש"
@@ -1798,6 +1786,24 @@ msgstr "בררת מחדל"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות" msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#~ msgid "Browse Files..."
#~ msgstr "עיון בקבצים..."
#~ msgid "Error browsing device"
#~ msgstr "שגיאה בעיון בהתקן"
#~ msgid "The requested device cannot be browsed, error is '%s'"
#~ msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'"
#~ msgid "Wired"
#~ msgstr "קווי"
#~ msgid "Wireless"
#~ msgstr "אלחוטי"
#~ msgid "Mobile broadband"
#~ msgstr "פס־רחב נייד"
#~ msgid "VPN Connections" #~ msgid "VPN Connections"
#~ msgstr "חיבורי VPN" #~ msgstr "חיבורי VPN"

111
po/ml.po
View File

@@ -11,15 +11,15 @@ msgstr ""
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug." "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" "cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-20 16:11+0000\n" "POT-Creation-Date: 2012-09-20 16:11+0000\n"
"PO-Revision-Date: 2012-09-20 22:56+0000\n" "PO-Revision-Date: 2012-11-26 15:02+0530\n"
"Last-Translator: Ani Peter <apeter@redhat.com>\n" "Last-Translator: Ani Peter <peter.ani@gmail.com>\n"
"Language-Team: Malayalam <discuss@lists.smc.org.in>\n" "Language-Team: Malayalam <discuss@lists.smc.org.in>\n"
"Language: ml\n" "Language: ml\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.0\n" "X-Generator: Lokalize 1.5\n"
"X-DamnedLies-Scope: partial\n" "X-DamnedLies-Scope: partial\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1 #: ../data/50-gnome-shell-screenshot.xml.in.h:1
@@ -61,7 +61,8 @@ msgstr "ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷ
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2" msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "" msgstr ""
"Alt-F2-ല്‍ ഡവലപ്പര്‍മാര്‍ക്കും ടെസ്റ്റേര്‍സിനും പ്രയോജനകരമായ ആന്തരിക പ്രയോഗങ്ങള്‍ പ്രവര്‍ത്തന " "Alt-F2-ല്‍ ഡവലപ്പര്‍മാര്‍ക്കും ടെസ്റ്റേര്‍സിനും പ്രയോജനകരമായ ആന്തരിക "
"പ്രയോഗങ്ങള്‍ പ്രവര്‍ത്തന "
"സജ്ജമാക്കുന്നു" "സജ്ജമാക്കുന്നു"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 #: ../data/org.gnome.shell.gschema.xml.in.in.h:2
@@ -69,7 +70,8 @@ msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 " "Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog." "dialog."
msgstr "" msgstr ""
"Alt-F2 ഡയലോഗ് ഉപയോഗിച്ചു് ആന്തരിക ഡീബഗ്ഗിലേക്കും നീരീക്ഷണ പ്രയോഗങ്ങളിലേക്കും പ്രവേശനം " "Alt-F2 ഡയലോഗ് ഉപയോഗിച്ചു് ആന്തരിക ഡീബഗ്ഗിലേക്കും നീരീക്ഷണ പ്രയോഗങ്ങളിലേക്കും "
"പ്രവേശനം "
"അനുവദിയ്ക്കുക." "അനുവദിയ്ക്കുക."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.in.h:3
@@ -83,14 +85,19 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and " "list. You can also manipulate this list with the EnableExtension and "
"DisableExtension DBus methods on org.gnome.Shell." "DisableExtension DBus methods on org.gnome.Shell."
msgstr "" msgstr ""
"ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷനുകള്‍ക്കു് ഒരു യുയുഐഡി വിശേഷതയുണ്ടു്; ലഭ്യമാക്കേണ്ട എക്സ്റ്റെന്‍ഷനുകള്‍ ഈ കീ പട്ടിക " "ഗ്നോം ഷെല്‍ എക്സ്റ്റെന്‍ഷനുകള്‍ക്കു് ഒരു യുയുഐഡി വിശേഷതയുണ്ടു്; ലഭ്യമാക്കേണ്ട "
"ലഭ്യമാക്കുന്നു. ലഭ്യമാക്കേണ്ട ഏതു് എക്സ്റ്റെന്‍ഷനും ഈ പട്ടികയിലുണ്ടാവണം. org.gnome.Shell-ല്‍ " "എക്സ്റ്റെന്‍ഷനുകള്‍ ഈ കീ പട്ടിക "
"നിങ്ങള്‍ക്കു് EnableExtension, DisableExtension എന്നീ ഡീബസ് രീതികളിലൂടെ ഈ പട്ടിക " "ലഭ്യമാക്കുന്നു. ലഭ്യമാക്കേണ്ട ഏതു് എക്സ്റ്റെന്‍ഷനും ഈ പട്ടികയിലുണ്ടാവണം. "
"org.gnome.Shell-ല്‍ "
"നിങ്ങള്‍ക്കു് EnableExtension, DisableExtension എന്നീ ഡീബസ് രീതികളിലൂടെ ഈ "
"പട്ടിക "
"കൈകാര്യം ചെയ്യുവാനും സാധിയ്ക്കുന്നു." "കൈകാര്യം ചെയ്യുവാനും സാധിയ്ക്കുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage" msgid "Whether to collect stats about applications usage"
msgstr "പ്രയോഗങ്ങളുടെ ഉപയോഗത്തെപ്പറ്റിയുള്ള സ്ഥിതിവിവരക്കണക്കുകള്‍ ശേഖരിയ്ക്കണമോ എന്നു്" msgstr ""
"പ്രയോഗങ്ങളുടെ ഉപയോഗത്തെപ്പറ്റിയുള്ള സ്ഥിതിവിവരക്കണക്കുകള്‍ ശേഖരിയ്ക്കണമോ "
"എന്നു്"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 #: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid "" msgid ""
@@ -99,9 +106,12 @@ msgid ""
"want to disable this for privacy reasons. Please note that doing so won't " "want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data." "remove already saved data."
msgstr "" msgstr ""
"ഏറ്റവും കൂടുതല്‍ തവണ ഉപയോഗിയ്ക്കുന്ന പ്രയോഗങ്ങള്‍ ലഭ്യമാക്കുന്നതിനായി ഷെല്‍ സാധാരണയായി സജീവമായ " "ഏറ്റവും കൂടുതല്‍ തവണ ഉപയോഗിയ്ക്കുന്ന പ്രയോഗങ്ങള്‍ ലഭ്യമാക്കുന്നതിനായി ഷെല്‍ "
"പ്രയോഗങ്ങളെ നിരീക്ഷിയ്ക്കുന്നു. (ഉദാഹരണത്തിനു്, ലോഞ്ചേര്‍സ്). ഈ ഡേറ്റാ സ്വകാര്യമായി " "സാധാരണയായി സജീവമായ "
"സൂക്ഷിയ്ക്കുന്നെങ്കിലും, ചില കാരണങ്ങളാല്‍ ഇതു് പ്രവര്‍ത്തന രഹിതമാക്കേണ്ടതുണ്ടു്. ഇങ്ങനെ ചെയ്യുന്നതു് " "പ്രയോഗങ്ങളെ നിരീക്ഷിയ്ക്കുന്നു. (ഉദാഹരണത്തിനു്, ലോഞ്ചേര്‍സ്). ഈ ഡേറ്റാ "
"സ്വകാര്യമായി "
"സൂക്ഷിയ്ക്കുന്നെങ്കിലും, ചില കാരണങ്ങളാല്‍ ഇതു് പ്രവര്‍ത്തന "
"രഹിതമാക്കേണ്ടതുണ്ടു്. ഇങ്ങനെ ചെയ്യുന്നതു് "
"നിങ്ങള്‍ സൂക്ഷിച്ച ഡേറ്റയെ ബാധിയ്ക്കുന്നതല്ല." "നിങ്ങള്‍ സൂക്ഷിച്ച ഡേറ്റയെ ബാധിയ്ക്കുന്നതല്ല."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.in.h:7
@@ -112,7 +122,8 @@ msgstr "ഇഷ്ടമുള്ള പ്രയോഗങ്ങള്‍ക്
msgid "" msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the "
"favorites area." "favorites area."
msgstr "ഈ ഐഡന്റിഫയറുകള്‍ക്കുള്ള പ്രയോഗങ്ങള്‍ ഉചിതമായ സ്ഥലങ്ങളില്‍ കാണിയ്ക്കുന്നു." msgstr ""
"ഈ ഐഡന്റിഫയറുകള്‍ക്കുള്ള പ്രയോഗങ്ങള്‍ ഉചിതമായ സ്ഥലങ്ങളില്‍ കാണിയ്ക്കുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
@@ -127,7 +138,8 @@ msgid ""
"Internally used to store the last IM presence explicitly set by the user. " "Internally used to store the last IM presence explicitly set by the user. "
"The value here is from the TpConnectionPresenceType enumeration." "The value here is from the TpConnectionPresenceType enumeration."
msgstr "" msgstr ""
"ഉപയോക്താവു് സജ്ജമാക്കിയ അവസാന ഐഎം ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം " "ഉപയോക്താവു് സജ്ജമാക്കിയ അവസാന ഐഎം ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് "
"ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
"TpConnectionPresenceType തരത്തിലുള്ളതാകുന്നു." "TpConnectionPresenceType തരത്തിലുള്ളതാകുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 #: ../data/org.gnome.shell.gschema.xml.in.in.h:12
@@ -135,7 +147,8 @@ msgid ""
"Internally used to store the last session presence status for the user. The " "Internally used to store the last session presence status for the user. The "
"value here is from the GsmPresenceStatus enumeration." "value here is from the GsmPresenceStatus enumeration."
msgstr "" msgstr ""
"ഉപയോക്താവിനുള്ള അവസാന സെഷന്‍ അവസ്ഥ ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം " "ഉപയോക്താവിനുള്ള അവസാന സെഷന്‍ അവസ്ഥ ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് "
"ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
"GsmPresenceStatus തരത്തിലുള്ളതാകുന്നു." "GsmPresenceStatus തരത്തിലുള്ളതാകുന്നു."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
@@ -168,7 +181,9 @@ msgstr "സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ ട
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "ബിള്‍ട്ടിന്‍ സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ തുടങ്ങുവാന്‍/നിര്‍ത്തുന്നതിനുള്ള കീക്കൂട്ടം." msgstr ""
"ബിള്‍ട്ടിന്‍ സ്ക്രീന്‍ റിക്കോര്‍ഡര്‍ തുടങ്ങുവാന്‍/നിര്‍ത്തുന്നതിനുള്ള "
"കീക്കൂട്ടം."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Which keyboard to use" msgid "Which keyboard to use"
@@ -187,7 +202,8 @@ msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "" msgstr ""
"ഗ്നോം ഷെല്ലിന്റെ സ്ക്രീന്‍കാസ്റ്റ് റിക്കോര്‍ഡര്‍ റീക്കോര്‍ഡ് ചെയ്തിട്ടുള്ള സ്ക്രീന്‍കാസ്റ്റിന്റെ " "ഗ്നോം ഷെല്ലിന്റെ സ്ക്രീന്‍കാസ്റ്റ് റിക്കോര്‍ഡര്‍ റീക്കോര്‍ഡ് ചെയ്തിട്ടുള്ള "
"സ്ക്രീന്‍കാസ്റ്റിന്റെ "
"ഫ്രെയിംറേറ്റ്, ഒരു സെക്കന്‍ഡില്‍ ഒരു ഫ്രെയിം." "ഫ്രെയിംറേറ്റ്, ഒരു സെക്കന്‍ഡില്‍ ഒരു ഫ്രെയിം."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
@@ -219,9 +235,12 @@ msgid ""
"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is " "threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is "
"used as a placeholder for a guess at the optimal thread count on the system." "used as a placeholder for a guess at the optimal thread count on the system."
msgstr "" msgstr ""
"റിക്കോര്‍ഡിങുകള്‍ എന്‍കോഡ് ചെയ്യുന്നതിനായി GStreamer പൈപ്പ് ലൈന്‍ ഉപയോഗിയ്ക്കുന്നു. " "റിക്കോര്‍ഡിങുകള്‍ എന്‍കോഡ് ചെയ്യുന്നതിനായി GStreamer പൈപ്പ് ലൈന്‍ "
"gst-launch-നുള്ള സിന്റാക്സ് ഉപയോഗിയ്ക്കുന്നു. കാലിയായി സജ്ജമാക്കുമ്പോള്‍ കാലിയാകുന്നു." "ഉപയോഗിയ്ക്കുന്നു. "
"ഇതു് നിലവില്‍ 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 " "gst-launch-നുള്ള സിന്റാക്സ് ഉപയോഗിയ്ക്കുന്നു. കാലിയായി സജ്ജമാക്കുമ്പോള്‍ "
"കാലിയാകുന്നു."
"ഇതു് നിലവില്‍ 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 "
"deadline=1000000 "
"threads=%T ! queue ! webmmux' ആകുന്നുസ WEBM VP8 കോഡ് ഉപയോഗിച്ചു് റിക്കോര്‍ഡ് " "threads=%T ! queue ! webmmux' ആകുന്നുസ WEBM VP8 കോഡ് ഉപയോഗിച്ചു് റിക്കോര്‍ഡ് "
"ചെയ്യുന്നു." "ചെയ്യുന്നു."
@@ -235,8 +254,10 @@ msgid ""
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
"a different container format." "a different container format."
msgstr "" msgstr ""
"റിക്കോര്‍ഡ് ചെയ്ത സ്ക്രീന്‍കാസ്റ്റുകള്‍ക്കുള്ള ഫയല്‍നാമം നിലവിലുള്ള തീയതി, എക്സ്റ്റെന്‍ഷന്‍ എന്നിവ " "റിക്കോര്‍ഡ് ചെയ്ത സ്ക്രീന്‍കാസ്റ്റുകള്‍ക്കുള്ള ഫയല്‍നാമം നിലവിലുള്ള തീയതി, "
"അനുസരിച്ചാകുന്നു. മറ്റൊരു ശൈലിയിലേക്കു് റിക്കോര്‍ഡ് ചെയ്യുമ്പോള്‍ ഇതു് മാറ്റണം." "എക്സ്റ്റെന്‍ഷന്‍ എന്നിവ "
"അനുസരിച്ചാകുന്നു. മറ്റൊരു ശൈലിയിലേക്കു് റിക്കോര്‍ഡ് ചെയ്യുമ്പോള്‍ ഇതു് "
"മാറ്റണം."
#: ../js/extensionPrefs/main.js:124 #: ../js/extensionPrefs/main.js:124
#, c-format #, c-format
@@ -249,7 +270,9 @@ msgstr "എക്സ്റ്റെന്‍ഷന്‍"
#: ../js/extensionPrefs/main.js:188 #: ../js/extensionPrefs/main.js:188
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "മുകളിലുള്ള കോമ്പോ ബോക്സ് ഉപയോഗിച്ചു് ക്രമീകരിയ്ക്കുന്നതിനുള്ളൊരു എക്സ്റ്റെന്‍ഷന്‍ തെര‍ഞ്ഞെടുക്കുക." msgstr ""
"മുകളിലുള്ള കോമ്പോ ബോക്സ് ഉപയോഗിച്ചു് ക്രമീകരിയ്ക്കുന്നതിനുള്ളൊരു "
"എക്സ്റ്റെന്‍ഷന്‍ തെര‍ഞ്ഞെടുക്കുക."
#: ../js/gdm/loginDialog.js:526 #: ../js/gdm/loginDialog.js:526
msgid "Session..." msgid "Session..."
@@ -578,7 +601,8 @@ msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
"'%s'." "'%s'."
msgstr "" msgstr ""
"വയര്‍ലെസ് നെറ്റ്‌വര്‍ക്ക് '%s'-ലേക്ക് പ്രവേശിക്കുന്നതിനായി രഹസ്യവാക്കുകള്‍ അല്ലെങ്കില്‍ എന്‍ക്രിപ്ഷന്‍ കീകള്‍ " "വയര്‍ലെസ് നെറ്റ്‌വര്‍ക്ക് '%s'-ലേക്ക് പ്രവേശിക്കുന്നതിനായി രഹസ്യവാക്കുകള്‍ "
"അല്ലെങ്കില്‍ എന്‍ക്രിപ്ഷന്‍ കീകള്‍ "
"ആവശ്യമുണ്ടു്." "ആവശ്യമുണ്ടു്."
#: ../js/ui/components/networkAgent.js:314 #: ../js/ui/components/networkAgent.js:314
@@ -764,7 +788,8 @@ msgstr "%s നിങ്ങള്‍ക്കു് %s അയച്ചിരി
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1206
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "നിങ്ങള്‍ ഓണ്‍ലൈന്‍ ആകുമ്പോള്‍ കാണുന്നതിനുള്ള അനുമതി %s-നു് ആവശ്യമുണ്ടു്" msgstr ""
"നിങ്ങള്‍ ഓണ്‍ലൈന്‍ ആകുമ്പോള്‍ കാണുന്നതിനുള്ള അനുമതി %s-നു് ആവശ്യമുണ്ടു്"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1298
msgid "Network error" msgid "Network error"
@@ -835,8 +860,11 @@ msgid "This account is already connected to the server"
msgstr "ഈ അക്കൌണ്ട് നിലവില്‍ സര്‍വറിലേക്കു് കണക്ട് ചെയ്തിരിയ്ക്കുന്നു" msgstr "ഈ അക്കൌണ്ട് നിലവില്‍ സര്‍വറിലേക്കു് കണക്ട് ചെയ്തിരിയ്ക്കുന്നു"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1332
msgid "Connection has been replaced by a new connection using the same resource" msgid ""
msgstr "അതേ ശ്രോതസ്സ് ഉപയോഗിച്ചു് ഒരു പുതിയ കണക്ഷന്‍ ഉപയോഗിച്ചു് ഈ കണക്ഷന്‍ മാറ്റിസ്ഥാപിയ്ക്കുന്നു" "Connection has been replaced by a new connection using the same resource"
msgstr ""
"അതേ ശ്രോതസ്സ് ഉപയോഗിച്ചു് ഒരു പുതിയ കണക്ഷന്‍ ഉപയോഗിച്ചു് ഈ കണക്ഷന്‍ "
"മാറ്റിസ്ഥാപിയ്ക്കുന്നു"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1334
msgid "The account already exists on the server" msgid "The account already exists on the server"
@@ -851,15 +879,19 @@ msgid "Certificate has been revoked"
msgstr "സമ്മതപത്രം വീണ്ടും ആവശ്യപ്പെട്ടിരിയ്ക്കുന്നു" msgstr "സമ്മതപത്രം വീണ്ടും ആവശ്യപ്പെട്ടിരിയ്ക്കുന്നു"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1340
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" msgid ""
msgstr "സമ്മതപത്രം സുരക്ഷിതമല്ലാത്തൊരു സിഫര്‍ ആല്‍ഗോരിഥം ഉപയോഗിയ്ക്കുന്നു അല്ലെങ്കില്‍ ഉചിതമല്ല" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"സമ്മതപത്രം സുരക്ഷിതമല്ലാത്തൊരു സിഫര്‍ ആല്‍ഗോരിഥം ഉപയോഗിയ്ക്കുന്നു "
"അല്ലെങ്കില്‍ ഉചിതമല്ല"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1342
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
msgstr "" msgstr ""
"സര്‍വറിന്റെ സമ്മതപത്രത്തിന്റെ വ്യാപ്തി, അല്ലെങ്കില്‍ സര്‍വര്‍ സമ്മതപത്ര ചെയിന്റെ വ്യാപ്തി, എന്നിവ " "സര്‍വറിന്റെ സമ്മതപത്രത്തിന്റെ വ്യാപ്തി, അല്ലെങ്കില്‍ സര്‍വര്‍ സമ്മതപത്ര "
"ചെയിന്റെ വ്യാപ്തി, എന്നിവ "
"പരിധിയില്‍ കൂടുന്നു" "പരിധിയില്‍ കൂടുന്നു"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1344
@@ -918,7 +950,8 @@ msgstr "പുറത്ത് കടക്കുക"
#: ../js/ui/endSessionDialog.js:63 #: ../js/ui/endSessionDialog.js:63
msgid "Click Log Out to quit these applications and log out of the system." msgid "Click Log Out to quit these applications and log out of the system."
msgstr "" msgstr ""
"ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പുറത്തു കടക്കുക ക്ലിക്ക് ചെയ്തു് സിസ്റ്റത്തില്‍ നിന്നും " "ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പുറത്തു കടക്കുക ക്ലിക്ക് "
"ചെയ്തു് സിസ്റ്റത്തില്‍ നിന്നും "
"പുറത്തു് കടക്കുക." "പുറത്തു് കടക്കുക."
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:65
@@ -952,7 +985,8 @@ msgstr "നിര്‍ത്തുക"
#: ../js/ui/endSessionDialog.js:82 #: ../js/ui/endSessionDialog.js:82
msgid "Click Power Off to quit these applications and power off the system." msgid "Click Power Off to quit these applications and power off the system."
msgstr "" msgstr ""
"ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പവര്‍ ഓഫ് ചെയ്യുക ക്ലിക്ക് ചെയ്തു സിസ്റ്റിന്റെ പവര്‍ " "ഈ പ്രയോഗങ്ങളില്‍ നിന്നും പുറത്തു് കടക്കുന്നതിനായി പവര്‍ ഓഫ് ചെയ്യുക ക്ലിക്ക് "
"ചെയ്തു സിസ്റ്റിന്റെ പവര്‍ "
"ഓഫ് ചെയ്യുക." "ഓഫ് ചെയ്യുക."
#: ../js/ui/endSessionDialog.js:84 #: ../js/ui/endSessionDialog.js:84
@@ -983,7 +1017,8 @@ msgstr "പുനരാരംഭിക്കുക"
#: ../js/ui/endSessionDialog.js:99 #: ../js/ui/endSessionDialog.js:99
msgid "Click Restart to quit these applications and restart the system." msgid "Click Restart to quit these applications and restart the system."
msgstr "ഈ പ്രയോഗങ്ങള്‍ നിറുത്തി സിസ്റ്റം പുനരാരംഭിക്കുവാന്‍ പുനരാരംഭിക്കൂ അമര്‍ത്തുക" msgstr ""
"ഈ പ്രയോഗങ്ങള്‍ നിറുത്തി സിസ്റ്റം പുനരാരംഭിക്കുവാന്‍ പുനരാരംഭിക്കൂ അമര്‍ത്തുക"
#: ../js/ui/endSessionDialog.js:101 #: ../js/ui/endSessionDialog.js:101
#, c-format #, c-format
@@ -1003,7 +1038,9 @@ msgstr "ഇന്‍സ്റ്റോള്‍"
#: ../js/ui/extensionDownloader.js:204 #: ../js/ui/extensionDownloader.js:204
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "extensions.gnome.org ഇല്‍ നിന്നും '%s' ഡൗണ്‍ലോട് ചെയ്ത് ഇന്‍സ്റ്റോള്‍ ചെയ്യേണമോ?" msgstr ""
"extensions.gnome.org ഇല്‍ നിന്നും '%s' ഡൗണ്‍ലോട് ചെയ്ത് ഇന്‍സ്റ്റോള്‍ "
"ചെയ്യേണമോ?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:327
msgid "tray" msgid "tray"
@@ -1660,8 +1697,10 @@ msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
msgstr "" msgstr ""
"ചാറ്റ് സന്ദേശങ്ങള്‍ എന്ന പോലെ അറിയിപ്പുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുന്നു. മറ്റുള്ളവരുടെ ചാറ്റ് സന്ദേശങ്ങള്‍ " "ചാറ്റ് സന്ദേശങ്ങള്‍ എന്ന പോലെ അറിയിപ്പുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുന്നു. "
"നിങ്ങള്‍ക്കു് കാണുവാന്‍ സാധ്യമല്ല എന്നു് നിങ്ങളുടെ ഓണ്‍ലൈന്‍ അവസ്ഥയില്‍ വ്യക്തമാക്കുന്നു." "മറ്റുള്ളവരുടെ ചാറ്റ് സന്ദേശങ്ങള്‍ "
"നിങ്ങള്‍ക്കു് കാണുവാന്‍ സാധ്യമല്ല എന്നു് നിങ്ങളുടെ ഓണ്‍ലൈന്‍ അവസ്ഥയില്‍ "
"വ്യക്തമാക്കുന്നു."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:85
msgid "Windows" msgid "Windows"

1989
po/nl.po

File diff suppressed because it is too large Load Diff

281
po/ru.po
View File

@@ -13,18 +13,16 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-10-31 16:48+0000\n" "POT-Creation-Date: 2012-10-31 16:48+0000\n"
"PO-Revision-Date: 2012-11-04 20:48+0400\n" "PO-Revision-Date: 2012-11-20 11:46+0300\n"
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n" "Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
"Language-Team: русский <gnome-cyr@gnome.org>\n" "Language-Team: русский <gnome-cyr@gnome.org>\n"
"Language: ru\n" "Language: ru\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Lokalize 1.2\n" "X-Generator: Lokalize 1.2\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1 #: ../data/50-gnome-shell-screenshot.xml.in.h:1
@@ -65,55 +63,32 @@ msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "Включить внутренние инструменты из Alt-F2 для разработчиков и тестеров" msgstr "Включить внутренние инструменты из Alt-F2 для разработчиков и тестеров"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 #: ../data/org.gnome.shell.gschema.xml.in.in.h:2
msgid "" msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog."
"Allows access to internal debugging and monitoring tools using the Alt-F2 " msgstr "Разрешает доступ к внутренней отладке и инструментам наблюдения, используя диалог Alt-F2."
"dialog."
msgstr ""
"Разрешает доступ к внутренней отладке и инструментам наблюдения, используя "
"диалог Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "Uuids of extensions to enable" msgid "Uuids of extensions to enable"
msgstr "Uuid включенных расширений" msgstr "Uuid включенных расширений"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 #: ../data/org.gnome.shell.gschema.xml.in.in.h:4
msgid "" msgid "GNOME Shell extensions have a uuid property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension DBus methods on org.gnome.Shell."
"GNOME Shell extensions have a uuid property; this key lists extensions which " msgstr "У расширений GNOME Shell есть свойство uuid; в этом ключе перечислены расширения, которые должны быть загружены. Этим список также можно управлять через методы DBus EnableExtension и DisableExtension сервиса org.gnome.Shell."
"should be loaded. Any extension that wants to be loaded needs to be in this "
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension DBus methods on org.gnome.Shell."
msgstr ""
"У расширений GNOME Shell есть свойство uuid; в этом ключе перечислены "
"расширения, которые должны быть загружены. Этим список также можно управлять "
"через методы DBus EnableExtension и DisableExtension сервиса org.gnome.Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage" msgid "Whether to collect stats about applications usage"
msgstr "Собирать ли статистику об использовании приложений" msgstr "Собирать ли статистику об использовании приложений"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 #: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid "" msgid "The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data."
"The shell normally monitors active applications in order to present the most " msgstr "Обычно, оболочка отслеживает активные приложения, чтобы определить наиболее используемые приложения. Хотя эти данные хранятся как личные, возможно вы захотите отключить эту возможность из соображений безопасности. Это не приведёт к удалению уже сохранённых данных."
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Обычно, оболочка отслеживает активные приложения, чтобы определить наиболее "
"используемые приложения. Хотя эти данные хранятся как личные, возможно вы "
"захотите отключить эту возможность из соображений безопасности. Это не "
"приведёт к удалению уже сохранённых данных."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
msgstr "Список идентификаторов desktop-файлов для избранных приложений" msgstr "Список идентификаторов desktop-файлов для избранных приложений"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 #: ../data/org.gnome.shell.gschema.xml.in.in.h:8
msgid "" msgid "The applications corresponding to these identifiers will be displayed in the favorites area."
"The applications corresponding to these identifiers will be displayed in the " msgstr "Приложения, соответствующие этих идентификаторам, будут показаны в области избранных приложений."
"favorites area."
msgstr ""
"Приложения, соответствующие этих идентификаторам, будут показаны в области "
"избранных приложений."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
@@ -124,33 +99,20 @@ msgid "History for the looking glass dialog"
msgstr "История просмотра прозрачного диалога" msgstr "История просмотра прозрачного диалога"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "" msgid "Internally used to store the last IM presence explicitly set by the user. The value here is from the TpConnectionPresenceType enumeration."
"Internally used to store the last IM presence explicitly set by the user. " msgstr "Используется для хранения статуса о присутствии, установленного пользователем. Данное значение берётся из перечисления TpConnectionPresenceType."
"The value here is from the TpConnectionPresenceType enumeration."
msgstr ""
"Используется для хранения статуса о присутствии, установленного "
"пользователем. Данное значение берётся из перечисления "
"TpConnectionPresenceType."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 #: ../data/org.gnome.shell.gschema.xml.in.in.h:12
msgid "" msgid "Internally used to store the last session presence status for the user. The value here is from the GsmPresenceStatus enumeration."
"Internally used to store the last session presence status for the user. The " msgstr "Используется для хранения статуса о присутствии для последнего сеанса. Данное значение берётся из перечисления GsmPresenceStatus."
"value here is from the GsmPresenceStatus enumeration."
msgstr ""
"Используется для хранения статуса о присутствии для последнего сеанса. "
"Данное значение берётся из перечисления GsmPresenceStatus."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu." msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Всегда показывать в меню пункт «Завершить сеанс»." msgstr "Всегда показывать в меню пункт «Завершить сеанс»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "" msgid "This key overrides the automatic hiding of the 'Log out' menuitem in single-user, single-session situations."
"This key overrides the automatic hiding of the 'Log out' menuitem in single-" msgstr "Этот ключ переопределяет автоматическое скрытие пункта «Завершить сеанс» при использовании одиночного сеанса."
"user, single-session situations."
msgstr ""
"Этот ключ переопределяет автоматическое скрытие пункта «Завершить сеанс» при "
"использовании одиночного сеанса."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
@@ -182,8 +144,7 @@ msgstr "Комбинация клавиш для переключения зап
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "" msgstr "Комбинация клавиш для запуска/остановки встроенного средства записи экрана."
"Комбинация клавиш для запуска/остановки встроенного средства записи экрана."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
@@ -198,12 +159,8 @@ msgid "Framerate used for recording screencasts."
msgstr "Частота смены кадров для записи скринкастов." msgstr "Частота смены кадров для записи скринкастов."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
"The framerate of the resulting screencast recordered by GNOME Shell's " msgstr "Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/сек)."
"screencast recorder in frames-per-second."
msgstr ""
"Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/"
"сек)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
@@ -211,44 +168,16 @@ msgstr "Конвейер gstreamer, используемый для кодиро
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system."
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " msgstr "Устанавливает конвейер GStreamer для кодирования записей. Соответствует синтаксису, используемому для gst-launch. Конвейер должен иметь неподключенный входной коннектор, где происходит запись видео. Выход коннектора обычно отключён, выход с этого коннектора записывается в файл вывода. Однако конвейер также может позаботиться о своём выводе, что можно использовать для отправки вывода на сервер icecast через shout2send или нечто подобное. При сбросе или установке пустого значения будет использоваться конвейер по умолчанию. В данный момент это «vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux»; запись выполняется в WEBM с помощью кодека VP8. %T используется как заполнитель для определения оптимального количества потоков в системе."
"used for gst-launch. The pipeline should have an unconnected sink pad where "
"the recorded video is recorded. It will normally have a unconnected source "
"pad; output from that pad will be written into the output file. However the "
"pipeline can also take care of its own output - this might be used to send "
"the output to an icecast server via shout2send or similar. When unset or set "
"to an empty value, the default pipeline will be used. This is currently "
"'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 "
"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is "
"used as a placeholder for a guess at the optimal thread count on the system."
msgstr ""
"Устанавливает конвейер GStreamer для кодирования записей. Соответствует "
"синтаксису, используемому для gst-launch. Конвейер должен иметь "
"неподключенный входной коннектор, где происходит запись видео. Выход "
"коннектора обычно отключён, выход с этого коннектора записывается в файл "
"вывода. Однако конвейер также может позаботиться о своём выводе, что можно "
"использовать для отправки вывода на сервер icecast через shout2send или "
"нечто подобное. При сбросе или установке пустого значения будет "
"использоваться конвейер по умолчанию. В данный момент это «vp8enc "
"min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! "
"queue ! webmmux»; запись выполняется в WEBM с помощью кодека VP8. %T "
"используется как заполнитель для определения оптимального количества потоков "
"в системе."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Расширение файла, использующееся для хранения скринкастов" msgstr "Расширение файла, использующееся для хранения скринкастов"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format."
"The filename for recorded screencasts will be a unique filename based on the " msgstr "Имя файла записанного скринкаста будет уникальным именем, основанным на текущей дате, и использует это расширение. Оно должно быть изменено, если запись выполняется в другой контейнерный формат."
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"Имя файла записанного скринкаста будет уникальным именем, основанным на "
"текущей дате, и использует это расширение. Оно должно быть изменено, если "
"запись выполняется в другой контейнерный формат."
#: ../js/extensionPrefs/main.js:124 #: ../js/extensionPrefs/main.js:124
#, c-format #, c-format
@@ -279,10 +208,14 @@ msgstr "Вход в систему"
msgid "Not listed?" msgid "Not listed?"
msgstr "Нет в списке?" msgstr "Нет в списке?"
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/networkAgent.js:137
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/components/polkitAgent.js:162
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167 #: ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195
#: ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427
#: ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Отмена" msgstr "Отмена"
@@ -300,7 +233,9 @@ msgstr "Окно входа в систему"
msgid "Power" msgid "Power"
msgstr "Питание" msgstr "Питание"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668 #: ../js/gdm/powerMenu.js:89
#: ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:779 #: ../js/ui/userMenu.js:779
msgid "Suspend" msgid "Suspend"
msgstr "Ждущий режим" msgstr "Ждущий режим"
@@ -309,7 +244,9 @@ msgstr "Ждущий режим"
msgid "Restart" msgid "Restart"
msgstr "Перезапустить" msgstr "Перезапустить"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668 #: ../js/gdm/powerMenu.js:99
#: ../js/ui/userMenu.js:666
#: ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:778
msgid "Power Off" msgid "Power Off"
msgstr "Выключить" msgstr "Выключить"
@@ -355,13 +292,14 @@ msgstr "ПРИЛОЖЕНИЯ"
#: ../js/ui/appDisplay.js:370 #: ../js/ui/appDisplay.js:370
msgid "SETTINGS" msgid "SETTINGS"
msgstr "НАСТРОЙКИ" msgstr "ПАРАМЕТРЫ"
#: ../js/ui/appDisplay.js:675 #: ../js/ui/appDisplay.js:675
msgid "New Window" msgid "New Window"
msgstr "Новое окно" msgstr "Новое окно"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290 #: ../js/ui/appDisplay.js:678
#: ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Удалить из избранного" msgstr "Удалить из избранного"
@@ -538,7 +476,8 @@ msgstr "Открыть с помощью %s"
msgid "Eject" msgid "Eject"
msgstr "Извлечь" msgstr "Извлечь"
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260 #: ../js/ui/components/keyring.js:86
#: ../js/ui/components/polkitAgent.js:260
msgid "Password:" msgid "Password:"
msgstr "Пароль:" msgstr "Пароль:"
@@ -590,11 +529,8 @@ msgstr "Беспроводная сеть требует подтвержден
#: ../js/ui/components/networkAgent.js:310 #: ../js/ui/components/networkAgent.js:310
#, c-format #, c-format
msgid "" msgid "Passwords or encryption keys are required to access the wireless network '%s'."
"Passwords or encryption keys are required to access the wireless network " msgstr "Для доступа к беспроводной сети «%s» требуются пароли или ключи шифрования."
"'%s'."
msgstr ""
"Для доступа к беспроводной сети «%s» требуются пароли или ключи шифрования."
#: ../js/ui/components/networkAgent.js:314 #: ../js/ui/components/networkAgent.js:314
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
@@ -645,7 +581,8 @@ msgstr "Подтвердить"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:381 #: ../js/ui/components/polkitAgent.js:248
#: ../js/ui/shellMountOperation.js:381
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Извините, это не сработало. Попробуйте снова." msgstr "Извините, это не сработало. Попробуйте снова."
@@ -850,8 +787,7 @@ msgid "This account is already connected to the server"
msgstr "Эта учётная запись уже подключена к серверу" msgstr "Эта учётная запись уже подключена к серверу"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1334
msgid "" msgid "Connection has been replaced by a new connection using the same resource"
"Connection has been replaced by a new connection using the same resource"
msgstr "Соединение было заменено новым, используя тот же источник" msgstr "Соединение было заменено новым, используя тот же источник"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1336
@@ -860,27 +796,19 @@ msgstr "Учётная запись уже существует на серве
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1338
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "" msgstr "Сервер в настоящее время сильно перегружен, чтобы обработать соединение"
"Сервер в настоящее время сильно перегружен, чтобы обработать соединение"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1340
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Сертификат аннулирован" msgstr "Сертификат аннулирован"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1342
msgid "" msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
"Certificate uses an insecure cipher algorithm or is cryptographically weak" msgstr "Сертификат использует небезопасный алгоритм шифрования или он криптографически нестоек"
msgstr ""
"Сертификат использует небезопасный алгоритм шифрования или он "
"криптографически нестоек"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1344
msgid "" msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
"The length of the server certificate, or the depth of the server certificate " msgstr "Длина сертификата сервера, или глубина цепочки сертификатов сервера, превышает пределы, установленные библиотекой криптографии"
"chain, exceed the limits imposed by the cryptography library"
msgstr ""
"Длина сертификата сервера, или глубина цепочки сертификатов сервера, "
"превышает пределы, установленные библиотекой криптографии"
#: ../js/ui/components/telepathyClient.js:1346 #: ../js/ui/components/telepathyClient.js:1346
msgid "Internal error" msgid "Internal error"
@@ -905,7 +833,8 @@ msgstr "Изменить учётную запись"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Неизвестная причина" msgstr "Неизвестная причина"
#: ../js/ui/dash.js:253 ../js/ui/dash.js:292 #: ../js/ui/dash.js:253
#: ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Показать приложения" msgstr "Показать приложения"
@@ -937,17 +866,14 @@ msgstr "Выйти из системы"
#: ../js/ui/endSessionDialog.js:63 #: ../js/ui/endSessionDialog.js:63
msgid "Click Log Out to quit these applications and log out of the system." msgid "Click Log Out to quit these applications and log out of the system."
msgstr "" msgstr "Нажмите «Выйти из системы», чтобы закрыть эти приложения и выйти из системы."
"Нажмите «Выйти из системы», чтобы закрыть эти приложения и выйти из системы."
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:65
#, c-format #, c-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "" msgstr[0] "Сеанс пользователя %s будет автоматически завершён через %d секунду."
"Сеанс пользователя %s будет автоматически завершён через %d секунду." msgstr[1] "Сеанс пользователя %s будет автоматически завершён через %d секунды."
msgstr[1] ""
"Сеанс пользователя %s будет автоматически завершён через %d секунды."
msgstr[2] "Сеанс пользователя %s будет автоматически завершён через %d секунд." msgstr[2] "Сеанс пользователя %s будет автоматически завершён через %d секунд."
#: ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:70
@@ -988,7 +914,8 @@ msgstr[2] "Система будет автоматически выключен
msgid "Powering off the system." msgid "Powering off the system."
msgstr "Выключение системы." msgstr "Выключение системы."
#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107 #: ../js/ui/endSessionDialog.js:90
#: ../js/ui/endSessionDialog.js:107
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "Перезапустить" msgstr "Перезапустить"
@@ -1005,9 +932,7 @@ msgstr "Перезапустить"
#: ../js/ui/endSessionDialog.js:99 #: ../js/ui/endSessionDialog.js:99
msgid "Click Restart to quit these applications and restart the system." msgid "Click Restart to quit these applications and restart the system."
msgstr "" msgstr "Нажмите «Перезапустить», чтобы закрыть эти приложения и перезапустить систему."
"Нажмите «Перезапустить», чтобы закрыть эти приложения и перезапустить "
"систему."
#: ../js/ui/endSessionDialog.js:101 #: ../js/ui/endSessionDialog.js:101
#, c-format #, c-format
@@ -1034,7 +959,8 @@ msgstr "Загрузить и установить расширение «%s»
msgid "tray" msgid "tray"
msgstr "лоток" msgstr "лоток"
#: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584
#: ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Клавиатура" msgstr "Клавиатура"
@@ -1053,7 +979,8 @@ msgstr "%s не сообщал о каких-либо ошибках."
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Скрыть ошибки" msgstr "Скрыть ошибки"
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815 #: ../js/ui/lookingGlass.js:755
#: ../js/ui/lookingGlass.js:815
msgid "Show Errors" msgid "Show Errors"
msgstr "Показать ошибки" msgstr "Показать ошибки"
@@ -1063,7 +990,8 @@ msgstr "Включено"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:767 ../src/gvc/gvc-mixer-control.c:1082 #: ../js/ui/lookingGlass.js:767
#: ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled" msgid "Disabled"
msgstr "Выключено" msgstr "Выключено"
@@ -1103,7 +1031,8 @@ msgstr "Панель сообщений"
msgid "System Information" msgid "System Information"
msgstr "Системная информация" msgstr "Системная информация"
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374 #: ../js/ui/notificationDaemon.js:506
#: ../src/shell-app.c:374
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Неизвестно" msgstr "Неизвестно"
@@ -1211,7 +1140,8 @@ msgstr "Пароль"
msgid "Remember Password" msgid "Remember Password"
msgstr "Запомнить пароль" msgstr "Запомнить пароль"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170 #: ../js/ui/shellMountOperation.js:400
#: ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Разблокировать" msgstr "Разблокировать"
@@ -1263,10 +1193,14 @@ msgstr "Высокая контрастность"
msgid "Large Text" msgid "Large Text"
msgstr "Крупный текст" msgstr "Крупный текст"
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 #: ../js/ui/status/bluetooth.js:27
#: ../js/ui/status/bluetooth.js:251 ../js/ui/status/bluetooth.js:304 #: ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:335 ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:251
#: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:867 #: ../js/ui/status/bluetooth.js:304
#: ../js/ui/status/bluetooth.js:335
#: ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:400
#: ../js/ui/status/network.js:867
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1287,7 +1221,8 @@ msgid "Bluetooth Settings"
msgstr "Настроить Bluetooth" msgstr "Настроить Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:208 #: ../js/ui/status/bluetooth.js:103
#: ../js/ui/status/network.js:208
msgid "hardware disabled" msgid "hardware disabled"
msgstr "устройство выключено" msgstr "устройство выключено"
@@ -1295,11 +1230,13 @@ msgstr "устройство выключено"
msgid "Connection" msgid "Connection"
msgstr "Соединение" msgstr "Соединение"
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:458 #: ../js/ui/status/bluetooth.js:207
#: ../js/ui/status/network.js:458
msgid "disconnecting..." msgid "disconnecting..."
msgstr "отключение…" msgstr "отключение…"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:464 #: ../js/ui/status/bluetooth.js:220
#: ../js/ui/status/network.js:464
#: ../js/ui/status/network.js:934 #: ../js/ui/status/network.js:934
msgid "connecting..." msgid "connecting..."
msgstr "подключение…" msgstr "подключение…"
@@ -1329,7 +1266,8 @@ msgstr "Настроить клавиатуру"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Настроить мышь" msgstr "Настроить мышь"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234 #: ../js/ui/status/bluetooth.js:269
#: ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Настроить звук" msgstr "Настроить звук"
@@ -1356,7 +1294,8 @@ msgstr "Предоставить единовременно"
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Подтверждение на сопряжение с %s" msgstr "Подтверждение на сопряжение с %s"
#: ../js/ui/status/bluetooth.js:378 ../js/ui/status/bluetooth.js:408 #: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:408
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Устройство %s пытается выполнить сопряжение с этим компьютером" msgstr "Устройство %s пытается выполнить сопряжение с этим компьютером"
@@ -1389,11 +1328,11 @@ msgstr "OK"
#: ../js/ui/status/keyboard.js:228 #: ../js/ui/status/keyboard.js:228
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Показывать раскладку клавиатуры" msgstr "Показать раскладку клавиатуры"
#: ../js/ui/status/keyboard.js:233 #: ../js/ui/status/keyboard.js:233
msgid "Region and Language Settings" msgid "Region and Language Settings"
msgstr "Региональные и языковые настройки" msgstr "Региональные и языковые параметры"
#: ../js/ui/status/lockScreenMenu.js:18 #: ../js/ui/status/lockScreenMenu.js:18
msgid "Volume, network, battery" msgid "Volume, network, battery"
@@ -1415,7 +1354,8 @@ msgid "unmanaged"
msgstr "не управляется" msgstr "не управляется"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:467 ../js/ui/status/network.js:937 #: ../js/ui/status/network.js:467
#: ../js/ui/status/network.js:937
msgid "authentication required" msgid "authentication required"
msgstr "требуется подтверждение подлинности" msgstr "требуется подтверждение подлинности"
@@ -1436,17 +1376,20 @@ msgstr "кабель не подключен"
msgid "unavailable" msgid "unavailable"
msgstr "недоступное" msgstr "недоступное"
#: ../js/ui/status/network.js:491 ../js/ui/status/network.js:939 #: ../js/ui/status/network.js:491
#: ../js/ui/status/network.js:939
msgid "connection failed" msgid "connection failed"
msgstr "сбой подключения" msgstr "сбой подключения"
#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1529 #: ../js/ui/status/network.js:552
#: ../js/ui/status/network.js:1529
msgid "More..." msgid "More..."
msgstr "Ещё…" msgstr "Ещё…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1459 #: ../js/ui/status/network.js:588
#: ../js/ui/status/network.js:1459
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Подключено (частное)" msgstr "Подключено (частное)"
@@ -1463,7 +1406,8 @@ msgid "Auto dial-up"
msgstr "Автоматическое коммутируемое" msgstr "Автоматическое коммутируемое"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476 #: ../js/ui/status/network.js:853
#: ../js/ui/status/network.js:1476
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Автоматическое %s" msgstr "Автоматическое %s"
@@ -1566,7 +1510,8 @@ msgstr[0] "Осталась %d минута"
msgstr[1] "Осталось %d минуты" msgstr[1] "Осталось %d минуты"
msgstr[2] "Осталось %d минут" msgstr[2] "Осталось %d минут"
#: ../js/ui/status/power.js:112 ../js/ui/status/power.js:186 #: ../js/ui/status/power.js:112
#: ../js/ui/status/power.js:186
#, c-format #, c-format
msgctxt "percent of battery remaining" msgctxt "percent of battery remaining"
msgid "%d%%" msgid "%d%%"
@@ -1618,7 +1563,8 @@ msgid "Unknown"
msgstr "Неизвестно" msgstr "Неизвестно"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221 #: ../js/ui/status/volume.js:47
#: ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Громкость" msgstr "Громкость"
@@ -1683,12 +1629,8 @@ msgid "Your chat status will be set to busy"
msgstr "Будет установлен статус «не беспокоить»" msgstr "Будет установлен статус «не беспокоить»"
#: ../js/ui/userMenu.js:804 #: ../js/ui/userMenu.js:804
msgid "" msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
"Notifications are now disabled, including chat messages. Your online status " msgstr "Уведомления отключены, включая сообщения в чате. Ваш статус доступности изменён, чтобы другие знали, что вы возможно не видите их сообщения."
"has been adjusted to let others know that you might not see their messages."
msgstr ""
"Уведомления отключены, включая сообщения в чате. Ваш статус доступности "
"изменён, чтобы другие знали, что вы возможно не видите их сообщения."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:85
msgid "Windows" msgid "Windows"
@@ -1735,9 +1677,9 @@ msgstr "Календарь Evolution"
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
msgstr[0] "%u вывод" msgstr[0] "%u выход"
msgstr[1] "%u вывода" msgstr[1] "%u выхода"
msgstr[2] "%u выводов" msgstr[2] "%u выходов"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
@@ -1763,8 +1705,7 @@ msgstr "Режим, используемый GDM для окна входа в
#: ../src/main.c:344 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr "Использовать для экрана входа в систему определённый режим, например «gdm»"
"Использовать для экрана входа в систему определённый режим, например «gdm»"
#: ../src/main.c:350 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"

View File

@@ -1007,54 +1007,6 @@ shell_global_end_modal (ShellGlobal *global,
meta_plugin_end_modal (global->plugin, timestamp); meta_plugin_end_modal (global->plugin, timestamp);
} }
/**
* shell_global_create_pointer_barrier:
* @global: a #ShellGlobal
* @x1: left X coordinate
* @y1: top Y coordinate
* @x2: right X coordinate
* @y2: bottom Y coordinate
* @directions: The directions we're allowed to pass through
*
* If supported by X creates a pointer barrier.
*
* Return value: value you can pass to shell_global_destroy_pointer_barrier()
*/
guint32
shell_global_create_pointer_barrier (ShellGlobal *global,
int x1, int y1, int x2, int y2,
int directions)
{
#if HAVE_XFIXESCREATEPOINTERBARRIER
return (guint32)
XFixesCreatePointerBarrier (global->xdisplay,
DefaultRootWindow (global->xdisplay),
x1, y1,
x2, y2,
directions,
0, NULL);
#else
return 0;
#endif
}
/**
* shell_global_destroy_pointer_barrier:
* @global: a #ShellGlobal
* @barrier: a pointer barrier
*
* Destroys the @barrier created by shell_global_create_pointer_barrier().
*/
void
shell_global_destroy_pointer_barrier (ShellGlobal *global, guint32 barrier)
{
#if HAVE_XFIXESCREATEPOINTERBARRIER
g_return_if_fail (barrier > 0);
XFixesDestroyPointerBarrier (global->xdisplay, (PointerBarrier)barrier);
#endif
}
/* Code to close all file descriptors before we exec; copied from gspawn.c in GLib. /* Code to close all file descriptors before we exec; copied from gspawn.c in GLib.
* *
* Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering * Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering

View File

@@ -70,15 +70,6 @@ void shell_global_set_cursor (ShellGlobal *global,
ShellCursor type); ShellCursor type);
void shell_global_unset_cursor (ShellGlobal *global); void shell_global_unset_cursor (ShellGlobal *global);
guint32 shell_global_create_pointer_barrier (ShellGlobal *global,
int x1,
int y1,
int x2,
int y2,
int directions);
void shell_global_destroy_pointer_barrier (ShellGlobal *global,
guint32 barrier);
void shell_global_get_pointer (ShellGlobal *global, void shell_global_get_pointer (ShellGlobal *global,
int *x, int *x,
int *y, int *y,

View File

@@ -665,6 +665,45 @@ st_scroll_view_allocate (ClutterActor *actor,
} }
static void
adjust_with_delta (StAdjustment *adj,
gdouble delta)
{
gdouble new_value, page_size, scroll_unit;
g_object_get (adj,
"page-size", &page_size,
NULL);
scroll_unit = pow (page_size, 2.0 / 3.0);
new_value = st_adjustment_get_value (adj) + delta * scroll_unit;
st_adjustment_set_value (adj, new_value);
}
static void
adjust_with_direction (StAdjustment *adj,
ClutterScrollDirection direction)
{
gdouble delta;
switch (direction)
{
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_LEFT:
delta = -1.0;
break;
case CLUTTER_SCROLL_RIGHT:
case CLUTTER_SCROLL_DOWN:
delta = 1.0;
break;
case CLUTTER_SCROLL_SMOOTH:
g_assert_not_reached ();
break;
}
adjust_with_delta (adj, delta);
}
static void static void
st_scroll_view_style_changed (StWidget *widget) st_scroll_view_style_changed (StWidget *widget)
{ {
@@ -687,57 +726,32 @@ st_scroll_view_scroll_event (ClutterActor *self,
ClutterScrollEvent *event) ClutterScrollEvent *event)
{ {
StScrollViewPrivate *priv = ST_SCROLL_VIEW (self)->priv; StScrollViewPrivate *priv = ST_SCROLL_VIEW (self)->priv;
gdouble value, step, hvalue, vvalue, delta_x, delta_y;
/* don't handle scroll events if requested not to */ /* don't handle scroll events if requested not to */
if (!priv->mouse_scroll) if (!priv->mouse_scroll)
return FALSE; return FALSE;
switch (event->direction) /* throw away this garbage event. we want smooth scrolling. */
{ if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
case CLUTTER_SCROLL_SMOOTH: return TRUE;
clutter_event_get_scroll_delta ((ClutterEvent *)event,
&delta_x, &delta_y);
g_object_get (priv->hadjustment,
"value", &hvalue,
NULL);
g_object_get (priv->vadjustment,
"value", &vvalue,
NULL);
break;
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_DOWN:
g_object_get (priv->vadjustment,
"step-increment", &step,
"value", &value,
NULL);
break;
case CLUTTER_SCROLL_LEFT:
case CLUTTER_SCROLL_RIGHT:
g_object_get (priv->hadjustment,
"step-increment", &step,
"value", &value,
NULL);
break;
}
switch (event->direction) switch (event->direction)
{ {
case CLUTTER_SCROLL_SMOOTH: case CLUTTER_SCROLL_SMOOTH:
st_adjustment_set_value (priv->hadjustment, hvalue + delta_x); {
st_adjustment_set_value (priv->vadjustment, vvalue + delta_y); gdouble delta_x, delta_y;
clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
adjust_with_delta (priv->hadjustment, delta_x);
adjust_with_delta (priv->vadjustment, delta_y);
}
break; break;
case CLUTTER_SCROLL_UP: case CLUTTER_SCROLL_UP:
st_adjustment_set_value (priv->vadjustment, value - step);
break;
case CLUTTER_SCROLL_DOWN: case CLUTTER_SCROLL_DOWN:
st_adjustment_set_value (priv->vadjustment, value + step); adjust_with_direction (priv->vadjustment, event->direction);
break; break;
case CLUTTER_SCROLL_LEFT: case CLUTTER_SCROLL_LEFT:
st_adjustment_set_value (priv->hadjustment, value - step);
break;
case CLUTTER_SCROLL_RIGHT: case CLUTTER_SCROLL_RIGHT:
st_adjustment_set_value (priv->hadjustment, value + step); adjust_with_direction (priv->hadjustment, event->direction);
break; break;
} }