Compare commits

..

52 Commits

Author SHA1 Message Date
d2052a885e NetworkMenu: use async initialization for libnm-glib objects
NMClient recently got more heavyweight, with a property holding supported
connections. As fully initializing a NMObject is a recursive operation
and requires multiple DBus calls, switch to async initalization for NMClient
and NMRemoteSettings.

https://bugzilla.gnome.org/show_bug.cgi?id=683288
2012-11-02 14:11:10 +01:00
afcc1b7b52 Try to do more async initialization
Synchronous calls in the main loop are a performance killer, especially
at login.
2012-11-02 14:11:10 +01:00
a6b4d68a1d Port to GDBus 2
The GDBus bindings in gjs have been updated to leverage metaclasses
and gobject inheritance, which should result in cleaner and more
maintainable code.
2012-11-02 14:11:10 +01:00
aef9b733e5 loginDialog: drop spurious parameter
_onNotListed had an unusued, incorrect parameter.

This commit drops it.

https://bugzilla.gnome.org/show_bug.cgi?id=660660
2012-11-01 14:24:45 -04:00
348208617b Use the correct icon in the restart dialog
It currently uses system-shutdown-symbolic. view-refresh-symbolic
is a better fit in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=670687
2012-11-01 16:21:52 +00:00
2c34c8e20f Overview search box is too subtle
When it isn't focused, the search box can be quite hard to see.

The text/icon/border color is changed to be brighter in order to increase
contrast with the dark background and this works well with various
wallpapers.

https://bugzilla.gnome.org/show_bug.cgi?id=686479
2012-11-01 11:32:40 +00:00
d19fa731d6 Updated Polish translation 2012-10-31 19:15:34 +01:00
59bb1cc387 Add a setting to force the 'Log out' menuitem
I've heard quite a bit of feedback from people who want to log out,
even if they are the sole user on their system. It doesn't seem worth
alienating them over this; so add a setting to make the 'Log out' item
always show up.
https://bugzilla.gnome.org/show_bug.cgi?id=686057
2012-10-31 12:46:49 -04:00
56909d0646 Show 'Log out' in more situations
When the current user is a remote account, or a we are logged in
as root, we should always show 'Log out'.

https://bugzilla.gnome.org/show_bug.cgi?id=686736
2012-10-31 12:45:08 -04:00
04da29c939 appMenu: Update on icon theme changes
While we recreate icons on style changes elsewhere, the faded
icon in the application menu will stick around after icon theme
changes until another application is focused.

https://bugzilla.gnome.org/show_bug.cgi?id=687224
2012-10-31 00:06:46 +01:00
307f7a3024 IM status menu: adjust the combo popup background
The transparent background for available/unavailable IM status menu
makes the text difficult to read.

Simplifies that by using the default combo-popup background instead of a
custom one.

https://bugzilla.gnome.org/show_bug.cgi?id=658091
2012-10-30 22:51:50 +00:00
e80bfa39f5 userMenu: Use "offline" instead of "unavailable"
https://bugzilla.gnome.org/show_bug.cgi?id=687226
2012-10-30 23:01:22 +01:00
29714922ea calendar: Drop unnecessary libedataserverui dependency
The libedataserverui dependency is a relic of the old E-D-S API.
As of 3.6.0, E-D-S now centralizes authentication prompts so clients
don't have to display their own.  This also allows trading the GTK+
main loop for a plain GMainLoop in gnome-shell-calendar-server.c.

https://bugzilla.gnome.org/show_bug.cgi?id=687189
2012-10-30 14:18:39 -04:00
88192114ac NetworkAgent: cancel requests when disabling component
When the NetworkAgent is disabled (for example because the lock screen
is being activated), cancel all modal dialogs.

https://bugzilla.gnome.org/show_bug.cgi?id=685239
2012-10-30 16:34:13 +01:00
9d78208b76 NetworkMenu: don't use a global switch for all VPN connections
Stop pretending that VPN is a NMDevice, and split the useful bits into
a NMConnectionBased interface.
Make each connection have its own switch menu item and handle its own
status, and remove the VPN section title, which is no longer needed.

https://bugzilla.gnome.org/show_bug.cgi?id=682929
2012-10-30 16:08:33 +01:00
d817bf0395 theme: standardize the run dialog text styles a bit
Use the standard color for dialog headings, and use the standard
text style for the entry field. These tweaks make the dialog easier
to read.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
4d51056226 runDialog: Remove "Run" button again
While not in the mockups, it was introduced during review of commit
0c807bddaf after discussion on IRC, but the designers disagree;
remove it again.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
a607174a25 runDialog: Add entry to focus chain
Currently the entry takes the intial key focus, but is not actually
part of the focus chain. Fix that, even though keynav does not work
too well for the dialog anyway, due to the entry consuming tab for
command completion.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
37d6a624b7 Improve the button insensitive style
The current insensitive style for buttons needs to be improved. Right
now we just change the text color: this doesn't make it clear that the
button is actually insensitive.

Instead of just changing the text color, we make the button background
almost transparent. We also make the text color the same as the border
color, use a thinner border.

This patch also simplifies some border rule overwrites to emphasis
only the border width is changed on focus, and makes the button look
closer to the mockups.

https://bugzilla.gnome.org/show_bug.cgi?id=687110
2012-10-30 12:35:48 +00:00
0c807bddaf runDialog: Better match style of other modal dialogs
Update the run dialog to
 - use a proper title
 - use dialog buttons
 - use the standard entry style

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-29 19:12:12 +01:00
a0470bfc66 UnlockDialog: clear the password on failure
It is wrong, and the user can't correct it because it's obfuscated.
Just let him type it again.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:12 +01:00
b9463d23e8 ShellUserVerifier: fix fail counter
If it is updated after checking, it counts the number of failures
not including the current one, so it allows one extra attempt. Instead,
by updating it before checking, we get the expected result of dropping the
curtain at the third password.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:12 +01:00
04debd1623 LoginDialog: clear previous auth failed messages when trying again
When the user has the entered the password for the second time
and clicked OK, clear messages from the previous attempt, so any
new failure is shown clearly.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:11 +01:00
9d31576cf5 App search: Match GenericName too
This is making shell search results more useful in many cases,
such as 'web', 'browser', spreadsheet'.
https://bugzilla.gnome.org/show_bug.cgi?id=687121
2012-10-29 11:24:36 -04:00
8daca28a90 Updated Slovak translation 2012-10-28 19:50:05 +00:00
9899604261 Updated Slovak translation 2012-10-28 18:27:51 +00:00
687e1eabed Overview: Resize the window title labels on content change
Reposition the window overlay when the title changes, using the current
transformed size of the window clone.
Includes a test that changes title to a string of random length every 3 seconds.

Based on a patch by Alex Hultman <alexhultman@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=620874
2012-10-27 18:18:48 +02:00
eb09f34114 recorder: save recorded video as recent item
Often the first thing a user wants to do after making a recording
is post it somewhere.

This commit adds the video to recently used items, so that it shows
up prominently in open file choosers.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
fbeb446ed7 recorder: rename "filename" property to "file-template"
The filename property is actually a template string with
substitution variables, not a filename.

This commit renames for clarity.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
92033ce0f5 recorder: keep test-recorder alive until done recording
Recording continues for some time after the recorder object
is closed, since closing isn't a synchronous operation.

This commit defers quiting the test-recorder application until
the recording is finished.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
9171bab5e5 recorder: keep recorder object alive until pipeline finishes
We want to make sure the recorder isn't finalized until the
saved recording hits disk.  This means the pipeline object needs
a hard reference on the recorder.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
f9819eb7b0 recorder: Clean up stage lifetime handling
The stage is a floating object. We don't own a reference
to it, so we shouldn't unref it.

This commit removes the erroneous unref call and makes sure
we call clutter_actor_destroy on the stage when we're done
with it.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
85728f0d15 layout: Use a MetaBackgroundActor, not a custom ClutterX11TexturePixmap
While looking at how the plymouth implementation was built, I was so
short-sighted and focused on the string "_XROOTPMAP_ID" that I didn't
realize it was the name of the standard background on the root window.
Remove our own implementation, and switch to using a standard mutter
MetaBackgroundActor.

https://bugzilla.gnome.org/show_bug.cgi?id=682428
2012-10-26 11:54:25 -04:00
9396849d56 message-tray: Restore Fittsability of summary items
The reactive area of tray items should extend to the screen edge. This
regressed when implementing the new tray design, make it work again.

https://bugzilla.gnome.org/show_bug.cgi?id=686474
2012-10-26 16:32:07 +02:00
6f5e5672bb panelMenu: Fix exception when destroying menuless button
There's explicit API to create PanelMenu.Buttons with no menu, so
guard against this case in destroy().

https://bugzilla.gnome.org/show_bug.cgi?id=686763
2012-10-26 15:49:26 +02:00
b936e60876 screenShield: Tweak curtain animation timings
Rationale:
 - Getting something out of the way should be quick;

 - Very few things in the real world move linearly so, linear
   animations, especially for something as big and visible as this,
   felt too artificial;

 - Moving the curtain out should start slower to make it feel like
   having weight (it fills the whole screen after all) but quickly
   accelerate towards the end to make it snappy too.

https://bugzilla.gnome.org/show_bug.cgi?id=686745
2012-10-26 12:56:17 +02:00
fa4bd91213 build: Stop linking gnome-desktop
Since commit 80eac7370e removed the last build-time dependency ages
ago, we only use GnomeDesktop via introspection.
2012-10-26 12:37:33 +02:00
81eeef7d3c messageTray: Hide summary notification immediately when closing the tray
When the summary notification is open when the tray is closed, we end
up with two concurrent animations: the notification fading out, and the
tray moving away from underneath it. Sliding out the tray should be the
primary transition here, so hide the notification immediately to not
draw the user's attention away from it.

https://bugzilla.gnome.org/show_bug.cgi?id=686888
2012-10-25 22:45:36 +02:00
a7b5134820 messageTray: Hide notification close button immediately on click
Having the close button move away from under the pointer after
clicking it is confusing and distracts from the main transition,
which is hiding the notification. Just hide it immediately.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:32 +02:00
92a01c67ba messageTray: Don't destroy the notification when clicking on the close button
Clicking on the close button should simply hide the notification.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:32 +02:00
71c23613b5 messageTray: Only hide the notification stack on clicking close
Rather than destroying the entire source, which is unintuitive, simply
close the notification. Removing the entire source is still possible
by right-clicking on the summary item and choosing "Remove".

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:05 +02:00
4f876995de messageTray: make SummaryItem._closeButton public
Use this to show/hide the close button instead of closeButtonVisible.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 21:45:18 +02:00
9cf4a76196 po: Enforce RTL in fa/ug for messages that might end up as LTR
See commit 8b796d80a7.

https://bugzilla.gnome.org/show_bug.cgi?id=686630
2012-10-25 20:12:25 +02:00
9efe5287e4 gdm: Move logo into the panel
GDM has a 'logo' key in its schema to allow distributors to add
some branding. It is currently placed above the user list, which
no longer works too well since the login screen lost its dialog
window. Display the logo in the top-left corner instead of the
Activities button instead.

https://bugzilla.gnome.org/show_bug.cgi?id=685852
2012-10-25 18:31:16 +02:00
8c4b34de4e messageTray: Fix close button position in RTL locales 2012-10-25 18:31:16 +02:00
93e3559dc3 style: Adjust close button overlap
After changing the button size, we need to adjust the x-offset by
1px (apparently the y-offset already assumed the correct size).
2012-10-25 18:31:16 +02:00
caa0f63e1f style: Fix close button size
The image is actually 32px, so we end up with a slightly fuzzy
button when scaling up to 34px. Don't do that.

Spotted by lamefun.xOr<at>gmail.com

https://bugzilla.gnome.org/show_bug.cgi?id=686574
2012-10-25 18:27:59 +02:00
a4e29e1244 calendar: Handle calendar-server errors
The current code assumes that the GetEvents call will always
receive, causing an exception in the error case.

https://bugzilla.gnome.org/show_bug.cgi?id=686805
2012-10-24 18:26:03 +02:00
599f2f43e3 Revert "screenShield: Connect to the actor's show signal instead of using BEFORE_REDRAW"
This reverts commit bdeb7d86b6.

git bz PEBKAC
2012-10-24 10:17:43 -04:00
3a453c5f73 messageTray: Fix lightbox
Commit 448517032e accidentally reverted the condition for showing
the lightbox. Fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=686728
2012-10-24 09:03:12 +02:00
98b313c75f popupMenu: Overwrite ongoing animations when calling close repeatedly
Currently close() is a no-op when the menu has already been closed.
However, repeated calls could pass different animation parameters.
For instance in the user menu, we try to hide the menu immediately
before locking the screen, to avoid the popup jumping across the
screen while fading out - as we do this from the corresponding
item's activate handler, the closing is still animated if the menu's
own handler (which requests a full animation) is run first.
Fix this by changing close() to overwrite ongoing animations before
bailing out early.

https://bugzilla.gnome.org/show_bug.cgi?id=686484
2012-10-23 22:21:45 +02:00
8b796d80a7 po: Enforce RTL in he for messages that might end up as LTR
As the messages start with a string placeholder that might be
untranslated, we need an explicit mark to ensure that the string
does not end up as LTR.

https://bugzilla.gnome.org/show_bug.cgi?id=686630
2012-10-23 22:21:45 +02:00
54 changed files with 1857 additions and 1177 deletions

View File

@ -52,7 +52,7 @@ AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
AC_MSG_RESULT(yes)
build_recorder=true
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11"
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl)
else
AC_MSG_RESULT(no)
@ -97,8 +97,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
libnm-glib libnm-util gnome-keyring-1
gcr-3 >= $GCR_MIN_VERSION
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
gcr-3 >= $GCR_MIN_VERSION)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
@ -139,7 +138,7 @@ PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
AC_SUBST([HAVE_BLUETOOTH],[0])
AC_MSG_RESULT([no])])
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-3.0 >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0)
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
AC_SUBST(CALENDAR_SERVER_CFLAGS)
AC_SUBST(CALENDAR_SERVER_LIBS)

View File

@ -57,6 +57,14 @@ value here is from the TpConnectionPresenceType enumeration.</_summary>
<_summary>Internally used to store the last session presence status for the user. The
value here is from the GsmPresenceStatus enumeration.</_summary>
</key>
<key name="always-show-log-out" type="b">
<default>false</default>
<_summary>Always show the 'Log out' menuitem in the user menu.</_summary>
<_description>
This key overrides the automatic hiding of the 'Log out'
menuitem in single-user, single-session situations.
</_description>
</key>
<child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="recorder" schema="org.gnome.shell.recorder"/>
<child name="keybindings" schema="org.gnome.shell.keybindings"/>

View File

@ -39,7 +39,6 @@ stage {
/* small */
.app-well-menu,
.contact-details-status,
.run-dialog-label,
.run-dialog-error-label {
font-size: 9pt;
}
@ -311,7 +310,7 @@ StScrollBar StButton#vhandle:active {
.notification-icon-button:focus,
.hotplug-notification-item:focus,
.modal-dialog-button:focus {
border: 2px solid #8b8b8b;
border-width: 2px;
}
.dash-search-button:active,
@ -326,17 +325,20 @@ StScrollBar StButton#vhandle:active {
background-gradient-end: rgba(255, 255, 255, 0.2);
}
.notification-button:insensitive,
.notification-icon-button:insensitive,
.notification-button:insensitive {
.modal-dialog-button:insensitive {
border-color: #666666;
color: #9f9f9f;
background-gradient-direction: none;
background-color: rgba(102, 102, 102, 0.15);
}
/* Entries */
#searchEntry,
.notification StEntry,
.login-dialog-prompt-entry,
.prompt-dialog-password-entry {
.modal-dialog StEntry {
color: rgb(64, 64, 64);
caret-color: rgb(64, 64, 64);
font-size: 12pt;
@ -346,6 +348,7 @@ StScrollBar StButton#vhandle:active {
}
#searchEntry,
.run-dialog-entry,
.notification StEntry {
border: 2px solid rgba(245,245,245,0.2);
background-gradient-start: rgba(5,5,6,0.1);
@ -358,8 +361,7 @@ StScrollBar StButton#vhandle:active {
#searchEntry:focus,
#searchEntry:hover,
.notification StEntry:focus,
.login-dialog-prompt-entry,
.prompt-dialog-password-entry {
.modal-dialog StEntry {
border: 2px solid rgb(136,138,133);
background-gradient-start: rgb(200,200,200);
background-gradient-end: white;
@ -368,12 +370,17 @@ StScrollBar StButton#vhandle:active {
}
.notification StEntry:focus,
.prompt-dialog-password-entry:focus,
.login-dialog-prompt-entry:focus {
.modal-dialog StEntry:focus {
border: 2px solid #3465a4;
}
#searchEntry {
border-color: rgba(245,245,245,0.3);
color: rgb(192, 192, 192);
caret-color: rgb(192, 192, 192);
}
#searchEntry:hover {
color: rgb(128, 128, 128);
caret-color: rgb(128, 128, 128);
}
@ -386,8 +393,7 @@ StScrollBar StButton#vhandle:active {
}
.notification StEntry,
.prompt-dialog-password-entry,
.login-dialog-prompt-entry {
.modal-dialog StEntry {
border-radius: 5px;
padding: 4px 4px;
}
@ -551,7 +557,6 @@ StScrollBar StButton#vhandle:active {
}
.status-chooser-combo.popup-combo-menu {
background-color: rgba(0,0,0,0.7);
padding: .4em 0em;
border-radius: 4px;
border: 1px solid #5f5f5f;
@ -614,9 +619,9 @@ StScrollBar StButton#vhandle:active {
.window-close, .notification-close {
background-image: url("close-window.svg");
background-size: 34px;
height: 34px;
width: 34px;
background-size: 32px;
height: 32px;
width: 32px;
}
.window-close {
@ -627,15 +632,22 @@ StScrollBar StButton#vhandle:active {
/* we start out in the top right of the
* notification, inset.
*
* center is 32px/2 = 17px
* center is 32px/2 = 16px
*
* adjust left 2px
* adjust down 8px */
-shell-close-overlap-x: 15px;
-shell-close-overlap-x: 14px;
-shell-close-overlap-y: -12px;
}
.notification-close:rtl {
/* as above, but starting out in the top left of the
* notification. */
-shell-close-overlap-x: -14px;
}
.window-close:rtl {
-st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5);
}
@ -682,6 +694,11 @@ StScrollBar StButton#vhandle:active {
.search-entry-icon {
icon-size: 1em;
color: #c0c0c0;
}
#searchEntry:hover .search-entry-icon,
#searchEntry:focus .search-entry-icon {
color: #8d8f8a;
}
@ -1193,7 +1210,6 @@ StScrollBar StButton#vhandle:active {
background: #2e3436 url(message-tray-background.png);
background-repeat: repeat;
transition-duration: 250;
height: 72px;
}
#message-tray:keyboard {
@ -1203,7 +1219,7 @@ StScrollBar StButton#vhandle:active {
#message-tray:overview {
background: rgba(0, 0, 0, 0.1);
border-top: 1px solid rgba(128, 128, 128, 0.3);
outline: 1px solid rgba(128, 128, 128, 0.3);
}
.notification {
@ -1425,28 +1441,34 @@ StScrollBar StButton#vhandle:active {
}
#summary-mode {
padding: 0px 6px 0px 6px; /* same as the values in .summary-source */
height: 60px;
spacing: 10px;
height: 72px;
}
.summary-source-button {
border-radius: 4px;
transition-duration: 100;
padding: 6px 3px 6px 3px;
}
.summary-source-button:hover {
.summary-source-button:last-child:ltr {
padding-right: 6px;
}
.summary-source-button:last-child:rtl {
padding-left: 6px;
}
.summary-source-button:hover .summary-source {
background-color: rgba(255,255,255,0.1);
}
.summary-source-button:focus,
.summary-source-button:selected {
.summary-source-button:focus .summary-source,
.summary-source-button:selected .summary-source {
background-color: rgba(255,255,255,0.33);
}
.summary-source {
padding-right: 6px;
padding-left: 6px;
border-radius: 4px;
padding: 0 6px 0 6px;
transition-duration: 100;
}
.summary-source-counter {
@ -1624,35 +1646,26 @@ StScrollBar StButton#vhandle:active {
padding: 4px 32px 5px;
}
.modal-dialog-button:insensitive {
color: rgb(60, 60, 60);
}
.modal-dialog-button:focus {
padding: 3px 31px 4px;
}
/* Run Dialog */
.run-dialog-label {
font-size: 12pt;
font-weight: bold;
color: #999999;
padding-bottom: .4em;
}
.run-dialog-error-box {
padding-top: 15px;
spacing: 5px;
}
.run-dialog-entry {
font-weight: bold;
width: 23em;
selection-background-color: white;
selected-color: black;
}
.run-dialog {
border-radius: 16px;
padding-right: 21px;
padding-left: 21px;
padding-bottom: 15px;
padding-top: 15px;
.modal-dialog .run-dialog-entry {
width: 20em;
}
.lightbox {
@ -2178,24 +2191,20 @@ StScrollBar StButton#vhandle:active {
height: .75em;
}
.login-dialog .modal-dialog-button {
border: 1px solid #666666;
border-radius: 5px;
padding: 3px 18px;
}
.login-dialog .modal-dialog-button:focus {
padding: 2px 17px;
border: 2px solid #8b8b8b;
}
.login-dialog .modal-dialog-button:default {
background-gradient-start: #6793c4;
background-gradient-end: #335d8f;
background-gradient-direction: vertical;
padding: 2px 17px;
border: 2px solid #16335d;
border-color: #16335d;
}
.login-dialog .modal-dialog-button:default:focus {
@ -2213,6 +2222,13 @@ StScrollBar StButton#vhandle:active {
background-gradient-end: #74a0d0;
}
.login-dialog .modal-dialog-button:default:insensitive {
border-color: #666666;
color: #9f9f9f;
background-gradient-direction: none;
background-color: rgba(102, 102, 102, 0.15);
}
.login-dialog-message-warning {
color: orange;
}

View File

@ -21,7 +21,16 @@ const GnomeShellIface = <interface name="org.gnome.Shell.Extensions">
</signal>
</interface>;
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
const GnomeShellProxy = new Gio.DBusProxyClass({
Name: 'GnomeShellProxy',
Interface: GnomeShellIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.Shell',
g_object_path: '/org/gnome/Shell' });
}
});
function stripPrefix(string, prefix) {
if (string.slice(0, prefix.length) == prefix)
@ -191,7 +200,8 @@ const Application = new Lang.Class({
this._extensionPrefsBin.add(label);
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
this._shellProxy = new GnomeShellProxy();
this._shellProxy.init(null);
this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
if (ExtensionUtils.extensions[uuid] !== undefined)
this._scanExtensions();

View File

@ -11,16 +11,14 @@ const FprintManagerIface = <interface name='net.reactivated.Fprint.Manager'>
</method>
</interface>;
const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface);
const FprintManager = new Gio.DBusProxyClass({
Name: 'FprintManager',
Interface: FprintManagerIface,
function FprintManager() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
g_interface_name: FprintManagerInfo.name,
g_interface_info: FprintManagerInfo,
g_name: 'net.reactivated.Fprint',
g_object_path: '/net/reactivated/Fprint/Manager',
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
self.init(null);
return self;
}
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'net.reactivated.Fprint',
g_object_path: '/net/reactivated/Fprint/Manager',
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
}
});

View File

@ -39,13 +39,14 @@ const GdmUtil = imports.gdm.util;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const PanelMenu = imports.ui.panelMenu;
const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu;
const _RESIZE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 0.5;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_NAME_SIZE = 48;
const _LOGO_ICON_HEIGHT = 16;
let _loginDialog = null;
@ -82,6 +83,36 @@ function _smoothlyResizeActor(actor, width, height) {
return hold;
}
const LogoMenuButton = new Lang.Class({
Name: 'LogoMenuButton',
Extends: PanelMenu.Button,
_init: function() {
this.parent(0.0, null, true);
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._iconBin = new St.Bin();
this.actor.add_actor(this._iconBin);
this._updateLogo();
},
_updateLogo: function() {
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
let icon = null;
if (path) {
let file = Gio.file_new_for_path(path);
let cache = St.TextureCache.get_default();
icon = cache.load_uri_async(file.get_uri(), -1, _LOGO_ICON_HEIGHT);
}
this._iconBin.set_child(icon);
}
});
const UserListItem = new Lang.Class({
Name: 'UserListItem',
@ -659,17 +690,11 @@ const LoginDialog = new Lang.Class({
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
Lang.bind(this, this._updateBanner));
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
Lang.bind(this, this._updateBanner));
this._logoBox = new St.Bin({ style_class: 'login-dialog-logo-box' });
this.contentLayout.add(this._logoBox);
this._updateLogo();
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
text: '' });
this.contentLayout.add(this._bannerLabel);
@ -770,20 +795,6 @@ const LoginDialog = new Lang.Class({
},
_updateLogo: function() {
this._logoBox.child = null;
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
if (path) {
let file = Gio.file_new_for_path(path);
let uri = file.get_uri();
let textureCache = St.TextureCache.get_default();
this._logoBox.child = textureCache.load_uri_async(uri, -1, _LOGO_ICON_NAME_SIZE);
}
},
_updateBanner: function() {
let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY);
let text = this._settings.get_string(GdmUtil.BANNER_MESSAGE_TEXT_KEY);
@ -802,8 +813,7 @@ const LoginDialog = new Lang.Class({
let tasks = [this._hidePrompt,
new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel,
this._fadeInNotListedButton,
this._fadeInLogo]),
this._fadeInNotListedButton]),
function() {
this._sessionList.close();
@ -829,9 +839,13 @@ const LoginDialog = new Lang.Class({
},
_showMessage: function(userVerifier, message, styleClass) {
this._promptMessage.text = message;
this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
if (message) {
this._promptMessage.text = message;
this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
} else {
GdmUtil.fadeOutActor(this._promptMessage);
}
},
_showLoginHint: function(verifier, message) {
@ -1075,7 +1089,7 @@ const LoginDialog = new Lang.Class({
}));
},
_onNotListedClicked: function(user) {
_onNotListedClicked: function() {
let tasks = [function() {
return this._userList.hideItems();
},
@ -1089,8 +1103,7 @@ const LoginDialog = new Lang.Class({
},
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
this._fadeOutNotListedButton,
this._fadeOutLogo]),
this._fadeOutNotListedButton]),
function() {
let hold = new Batch.Hold();
@ -1103,14 +1116,6 @@ const LoginDialog = new Lang.Class({
batch.run();
},
_fadeInLogo: function() {
return GdmUtil.fadeInActor(this._logoBox);
},
_fadeOutLogo: function() {
return GdmUtil.fadeOutActor(this._logoBox);
},
_fadeInBanner: function() {
return GdmUtil.fadeInActor(this._bannerLabel);
},
@ -1159,8 +1164,7 @@ const LoginDialog = new Lang.Class({
},
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
this._fadeOutNotListedButton,
this._fadeOutLogo]),
this._fadeOutNotListedButton]),
function() {
return this._userList.shrinkToNaturalHeight();

View File

@ -35,7 +35,13 @@ const PowerMenuButton = new Lang.Class({
/* Translators: accessible name of the power menu in the login screen */
this.parent('system-shutdown-symbolic', _("Power"));
this._loginManager = LoginManager.getLoginManager();
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
this._updateHaveShutdown();
this._updateHaveRestart();
this._updateHaveSuspend();
}));
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::disable-restart-buttons',
@ -64,6 +70,12 @@ const PowerMenuButton = new Lang.Class({
},
_updateHaveShutdown: function() {
if (!this._loginManager) {
this._haveShutdown = false;
this._powerOffItem.actor.visible = false;
return;
}
this._loginManager.canPowerOff(Lang.bind(this, function(result) {
this._haveShutdown = result;
this._powerOffItem.actor.visible = this._haveShutdown;
@ -72,6 +84,12 @@ const PowerMenuButton = new Lang.Class({
},
_updateHaveRestart: function() {
if (!this._loginManager) {
this._haveRestart = false;
this._restartItem.actor.visible = false;
return;
}
this._loginManager.canReboot(Lang.bind(this, function(result) {
this._haveRestart = result;
this._restartItem.actor.visible = this._haveRestart;
@ -80,6 +98,12 @@ const PowerMenuButton = new Lang.Class({
},
_updateHaveSuspend: function() {
if (!this._loginManager) {
this._haveSuspend = false;
this._suspendItem.actor.visible = false;
return;
}
this._loginManager.canSuspend(Lang.bind(this, function(result) {
this._haveSuspend = result;
this._suspendItem.actor.visible = this._haveSuspend;

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
@ -16,7 +17,16 @@ const ProviderIface = <interface name='org.freedesktop.realmd.Provider'>
<arg name="realm" type="ao" direction="out"/>
</method>
</interface>;
const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface);
const Provider = new Gio.DBusProxyClass({
Name: 'RealmdProvider',
Interface: ProviderIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.realmd',
g_object_path: '/org/freedesktop/realmd' });
}
});
const ServiceIface = <interface name="org.freedesktop.realmd.Service">
<method name="Cancel">
@ -31,7 +41,16 @@ const ServiceIface = <interface name="org.freedesktop.realmd.Service">
<arg name="operation" type="s"/>
</signal>
</interface>;
const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface);
const Service = new Gio.DBusProxyClass({
Name: 'RealmdService',
Interface: ServiceIface,
_init: function(service) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.realmd',
g_object_path: service });
}
});
const RealmIface = <interface name="org.freedesktop.realmd.Realm">
<property name="Name" type="s" access="read"/>
@ -51,16 +70,22 @@ const RealmIface = <interface name="org.freedesktop.realmd.Realm">
<arg name="options" type="a{sv}" direction="in"/>
</method>
</interface>;
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
const Realm = new Gio.DBusProxyClass({
Name: 'RealmdRealm',
Interface: RealmIface,
_init: function(realm) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.realmd',
g_object_path: realm });
}
});
const Manager = new Lang.Class({
Name: 'Manager',
_init: function(parentActor) {
this._aggregateProvider = Provider(Gio.DBus.system,
'org.freedesktop.realmd',
'/org/freedesktop/realmd',
Lang.bind(this, this._reloadRealms))
this._aggregateProvider = new Provider();
this._realms = {};
this._aggregateProvider.connect('g-properties-changed',
@ -68,6 +93,16 @@ const Manager = new Lang.Class({
if ('Realms' in properties.deep_unpack())
this._reloadRealms();
}));
this._aggregateProvider.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
} catch(e) {
return;
}
this._reloadRealms();
}));
},
_reloadRealms: function() {
@ -77,10 +112,8 @@ const Manager = new Lang.Class({
return;
for (let i = 0; i < realmPaths.length; i++) {
let realm = Realm(Gio.DBus.system,
'org.freedesktop.realmd',
realmPaths[i],
Lang.bind(this, this._onRealmLoaded));
let realm = new Realm(realmPaths[i]);
realm.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, this._onRealmLoaded));
}
},
@ -97,9 +130,10 @@ const Manager = new Lang.Class({
this._updateLoginFormat();
},
_onRealmLoaded: function(realm, error) {
if (error)
return;
_onRealmLoaded: function(realm, result) {
try {
realm.init_finish(result);
} catch(e) { return; }
this._reloadRealm(realm);

View File

@ -82,6 +82,8 @@ const ShellUserVerifier = new Lang.Class({
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._fprintManager = new Fprint.FprintManager();
this._fprintManager.init(null);
this._realmManager = new Realmd.Manager();
this._failCounter = 0;
@ -125,6 +127,9 @@ const ShellUserVerifier = new Lang.Class({
},
answerQuery: function(serviceName, answer) {
// Clear any previous message
this.emit('show-message', null, null);
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
},
@ -134,11 +139,14 @@ const ShellUserVerifier = new Lang.Class({
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY))
return;
this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this,
function(device, error) {
if (!error && device)
this._haveFingerprintReader = true;
}));
this._fprintManager.GetDefaultDeviceRemote(this._cancellable, Lang.bind(this, function(manager, result) {
try {
let device = manager.GetDefaultDeviceFinish(result);
this._haveFingerprintReader = !!device;
} catch(e) {
this._haveFingerprintReader = false;
}
}));
},
_reportInitError: function(where, error) {
@ -330,12 +338,11 @@ const ShellUserVerifier = new Lang.Class({
// Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
// go back to the welcome screen.
this._failCounter++;
let canRetry = retry && this._userName &&
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
if (canRetry) {
this._failCounter++;
this.clear();
this.begin(this._userName, new Batch.Hold());
} else {

View File

@ -21,11 +21,16 @@ const PresenceStatus = {
IDLE: 3
};
var PresenceProxy = Gio.DBusProxy.makeProxyWrapper(PresenceIface);
function Presence(initCallback, cancellable) {
return new PresenceProxy(Gio.DBus.session, 'org.gnome.SessionManager',
'/org/gnome/SessionManager/Presence', initCallback, cancellable);
}
const Presence = new Gio.DBusProxyClass({
Name: 'GnomeSessionPresence',
Interface: PresenceIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.SessionManager',
g_object_path: '/org/gnome/SessionManager/Presence' });
}
});
// Note inhibitors are immutable objects, so they don't
// change at runtime (changes always come in the form
@ -39,10 +44,16 @@ const InhibitorIface = <interface name="org.gnome.SessionManager.Inhibitor">
</method>
</interface>;
var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface);
function Inhibitor(objectPath, initCallback, cancellable) {
return new InhibitorProxy(Gio.DBus.session, 'org.gnome.SessionManager', objectPath, initCallback, cancellable);
}
const Inhibitor = new Gio.DBusProxyClass({
Name: 'GnomeSessionInhibitor',
Interface: InhibitorIface,
_init: function(inhibitor) {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.SessionManager',
g_object_path: inhibitor });
}
});
// Not the full interface, only the methods we use
const SessionManagerIface = <interface name="org.gnome.SessionManager">
@ -66,7 +77,14 @@ const SessionManagerIface = <interface name="org.gnome.SessionManager">
</signal>
</interface>;
var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface);
function SessionManager(initCallback, cancellable) {
return new SessionManagerProxy(Gio.DBus.session, 'org.gnome.SessionManager', '/org/gnome/SessionManager', initCallback, cancellable);
}
const SessionManager = new Gio.DBusProxyClass({
Name: 'GnomeSessionManager',
Interface: SessionManagerIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.SessionManager',
g_object_path: '/org/gnome/SessionManager' });
},
});

View File

@ -2,6 +2,7 @@
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Shell = imports.gi.Shell;
@ -33,8 +34,26 @@ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session
<signal name='Unlock' />
</interface>;
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
const SystemdLoginManager = new Gio.DBusProxyClass({
Name: 'SystemdLoginManager',
Interface: SystemdLoginManagerIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.login1',
g_object_path: '/org/freedesktop/login1' });
}
});
const SystemdLoginSession = new Gio.DBusProxyClass({
Name: 'SystemdLoginSession',
Interface: SystemdLoginSessionIface,
_init: function(session) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.login1',
g_object_path: session });
}
});
const ConsoleKitManagerIface = <interface name='org.freedesktop.ConsoleKit.Manager'>
<method name='CanRestart'>
@ -61,51 +80,128 @@ const ConsoleKitSessionIface = <interface name='org.freedesktop.ConsoleKit.Sessi
<signal name='Unlock' />
</interface>;
const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface);
const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface);
const ConsoleKitSession = new Gio.DBusProxyClass({
Name: 'ConsoleKitSession',
Interface: ConsoleKitSessionIface,
_init: function(session) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ConsoleKit',
g_object_path: session });
}
});
const ConsoleKitManager = new Gio.DBusProxyClass({
Name: 'ConsoleKitManager',
Interface: ConsoleKitManagerIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ConsoleKit',
g_object_path: '/org/freedesktop/ConsoleKit/Manager' });
}
});
function haveSystemd() {
return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0;
}
let _loginManager = null;
let _pendingAsyncCallbacks = [];
/**
* LoginManager:
* An abstraction over systemd/logind and ConsoleKit.
*
*/
function getLoginManager() {
function getLoginManager(asyncCallback) {
if (_loginManager == null) {
if (haveSystemd())
_loginManager = new LoginManagerSystemd();
else
_loginManager = new LoginManagerConsoleKit();
}
if (_pendingAsyncCallbacks.length == 0) {
let manager;
return _loginManager;
if (haveSystemd())
manager = new LoginManagerSystemd();
else
manager = new LoginManagerConsoleKit();
manager.initAsync(null, function(obj, result) {
obj.initFinish(result);
_loginManager = manager;
_pendingAsyncCallbacks.forEach(function (f) { f(obj) });
_pendingAsyncCallbacks = [];
});
_pendingAsyncCallbacks = [asyncCallback];
} else {
_pendingAsyncCallbacks.push(asyncCallback);
}
} else {
GLib.idle_add(GLib.PRIORITY_DEFAULT, function() {
asyncCallback(_loginManager);
});
}
}
const LoginManagerSystemd = new Lang.Class({
Name: 'LoginManagerSystemd',
Extends: GObject.Object,
_init: function() {
this._proxy = new SystemdLoginManager(Gio.DBus.system,
'org.freedesktop.login1',
'/org/freedesktop/login1');
this.parent();
this._proxy = new SystemdLoginManager();
},
initAsync: function(cancellable, asyncCallback) {
let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null);
simpleResult.set_check_cancellable(cancellable);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
if (cancellable && cancellable.is_cancelled())
return;
this._fetchCurrentSession(cancellable, simpleResult);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
simpleResult.complete();
}
}));
},
initFinish: function(simpleResult) {
if (!simpleResult.propagate_error())
return simpleResult.get_op_res_gboolean();
return true;
},
_fetchCurrentSession: function(cancellable, simpleResult) {
this._currentSession = new SystemdLoginSession('/org/freedesktop/login1/session/' +
GLib.getenv('XDG_SESSION_ID'));
this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
simpleResult.set_op_res_gboolean(true);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
}
simpleResult.complete();
}));
},
// Having this function is a bit of a hack since the Systemd and ConsoleKit
// session objects have different interfaces - but in both cases there are
// Lock/Unlock signals, and that's all we count upon at the moment.
//
// This is only valid after async initialization
getCurrentSessionProxy: function() {
if (!this._currentSession) {
this._currentSession = new SystemdLoginSession(Gio.DBus.system,
'org.freedesktop.login1',
'/org/freedesktop/login1/session/' +
GLib.getenv('XDG_SESSION_ID'));
}
return this._currentSession;
},
@ -114,66 +210,126 @@ const LoginManagerSystemd = new Lang.Class({
},
canPowerOff: function(asyncCallback) {
this._proxy.CanPowerOffRemote(function(result, error) {
if (error)
asyncCallback(false);
else
asyncCallback(result[0] != 'no');
this._proxy.CanPowerOffRemote(null, function(proxy, result) {
let val = false;
try {
val = proxy.CanPowerOffFinish(result)[0] != 'no';
} catch(e) { }
asyncCallback(val);
});
},
canReboot: function(asyncCallback) {
this._proxy.CanRebootRemote(function(result, error) {
if (error)
asyncCallback(false);
else
asyncCallback(result[0] != 'no');
this._proxy.CanRebootRemote(null, function(proxy, result) {
let val = false;
try {
val = proxy.CanRebootFinish(result)[0] != 'no';
} catch(e) { }
asyncCallback(val);
});
},
canSuspend: function(asyncCallback) {
this._proxy.CanSuspendRemote(function(result, error) {
if (error)
asyncCallback(false);
else
asyncCallback(result[0] != 'no');
this._proxy.CanSuspendRemote(null, function(proxy, result) {
let val = false;
try {
val = proxy.CanRebootFinish(result)[0] != 'no';
} catch(e) { }
asyncCallback(val);
});
},
powerOff: function() {
this._proxy.PowerOffRemote(true);
this._proxy.PowerOffRemote(true, null, null);
},
reboot: function() {
this._proxy.RebootRemote(true);
this._proxy.RebootRemote(true, null, null);
},
suspend: function() {
this._proxy.SuspendRemote(true);
this._proxy.SuspendRemote(true, null, null);
}
});
const LoginManagerConsoleKit = new Lang.Class({
Name: 'LoginManagerConsoleKit',
Extends: GObject.Object,
_init: function() {
this._proxy = new ConsoleKitManager(Gio.DBus.system,
'org.freedesktop.ConsoleKit',
'/org/freedesktop/ConsoleKit/Manager');
this.parent();
this._proxy = new ConsoleKitManager();
this._upClient = new UPowerGlib.Client();
},
initAsync: function(cancellable, asyncCallback) {
let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null);
simpleResult.set_check_cancellable(cancellable);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
if (cancellable && cancellable.is_cancelled())
return;
this._fetchCurrentSession(cancellable, simpleResult);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
simpleResult.complete();
}
}));
},
initFinish: function(simpleResult) {
if (!simpleResult.propagate_error())
return simpleResult.get_op_res_gboolean();
return true;
},
_fetchCurrentSession: function(cancellable, simpleResult) {
this._proxy.GetCurrentSessionRemote(cancellable, Lang.bind(this, function(proxy, result) {
try {
let [currentSessionId] = proxy.GetCurrentSessionFinish(result);
if (cancellable && cancellable.is_cancelled())
return;
this._createSessionProxy(currentSessionId, cancellable, simpleResult);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
simpleResult.complete();
}
}));
},
_createSessionProxy: function(currentSessionId, cancellable, simpleResult) {
this._currentSession = new ConsoleKitSession(currentSessionId);
this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
simpleResult.set_op_res_gboolean(true);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
}
simpleResult.complete();
}));
},
// Having this function is a bit of a hack since the Systemd and ConsoleKit
// session objects have different interfaces - but in both cases there are
// Lock/Unlock signals, and that's all we count upon at the moment.
getCurrentSessionProxy: function() {
if (!this._currentSession) {
let [currentSessionId] = this._proxy.GetCurrentSessionSync();
this._currentSession = new ConsoleKitSession(Gio.DBus.system,
'org.freedesktop.ConsoleKit',
currentSessionId);
}
return this._currentSession;
},
@ -185,26 +341,32 @@ const LoginManagerConsoleKit = new Lang.Class({
session.connectSignal('ActiveChanged', Lang.bind(this, function(object, senderName, [isActive]) {
this._sessionActive = isActive;
}));
[this._sessionActive] = session.IsActiveSync();
[this._sessionActive] = session.IsActiveSync(null);
return this._sessionActive;
},
canPowerOff: function(asyncCallback) {
this._proxy.CanStopRemote(function(result, error) {
if (error)
asyncCallback(false);
else
asyncCallback(result[0]);
this._proxy.CanStopRemote(null, function(proxy, result) {
let val = false;
try {
[val] = proxy.CanStopFinish(result);
} catch(e) { }
asyncCallback(val);
});
},
canReboot: function(asyncCallback) {
this._proxy.CanRestartRemote(function(result, error) {
if (error)
asyncCallback(false);
else
asyncCallback(result[0]);
this._proxy.CanRestartRemote(null, function(proxy, result) {
let val = false;
try {
[val] = proxy.CanRestartFinish(result);
} catch(e) { }
asyncCallback(val);
});
},
@ -216,11 +378,11 @@ const LoginManagerConsoleKit = new Lang.Class({
},
powerOff: function() {
this._proxy.StopRemote();
this._proxy.StopRemote(null, null);
},
reboot: function() {
this._proxy.RestartRemote();
this._proxy.RestartRemote(null, null);
},
suspend: function() {

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
@ -26,7 +27,16 @@ const ModemGsmNetworkInterface = <interface name="org.freedesktop.ModemManager.M
</signal>
</interface>;
const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface);
const ModemGsmNetworkProxy = new Gio.DBusProxyClass({
Name: 'ModemGsmNetworkProxy',
Interface: ModemGsmNetworkInterface,
_init: function(modem) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ModemManager',
g_object_path: modem });
}
});
const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma">
<method name="GetSignalQuality">
@ -40,7 +50,16 @@ const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.C
</signal>
</interface>;
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
const ModemCdmaProxy = new Gio.DBusProxyClass({
Name: 'ModemCdmaProxy',
Interface: ModemCdmaInterface,
_init: function(modem) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ModemManager',
g_object_path: modem });
},
});
let _providersTable;
function _getProvidersTable() {
@ -54,11 +73,18 @@ const ModemGsm = new Lang.Class({
Name: 'ModemGsm',
_init: function(path) {
this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
this._proxy = new ModemGsmNetworkProxy(path);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
obj.init_finish(result);
this._finishInit();
}));
this.signal_quality = 0;
this.operator_name = null;
},
_finishInit: function() {
// Code is duplicated because the function have different signatures
this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, [quality]) {
this.signal_quality = quality;
@ -68,24 +94,19 @@ const ModemGsm = new Lang.Class({
this.operator_name = this._findOperatorName(name, code);
this.emit('notify::operator-name');
}));
this._proxy.GetRegistrationInfoRemote(Lang.bind(this, function([result], err) {
if (err) {
log(err);
return;
}
let [status, code, name] = result;
this._proxy.GetRegistrationInfoRemote(null, Lang.bind(this, function(proxy, result) {
let [status, code, name] = proxy.GetRegistrationInfoFinish(result);
this.operator_name = this._findOperatorName(name, code);
this.emit('notify::operator-name');
}));
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
if (err) {
this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) {
try {
[this.signal_quality] = proxy.GetSignalQualityFinish(result);
} catch(e) {
// it will return an error if the device is not connected
this.signal_quality = 0;
} else {
let [quality] = result;
this.signal_quality = quality;
}
this.emit('notify::signal-quality');
}));
},
@ -157,10 +178,18 @@ const ModemCdma = new Lang.Class({
Name: 'ModemCdma',
_init: function(path) {
this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
this._proxy = new ModemCdmaProxy(path);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
obj.init_finish(result);
this._finishInit();
}));
this.signal_quality = 0;
this.operator_name = null;
},
_finishInit: function() {
this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, params) {
this.signal_quality = params[0];
this.emit('notify::signal-quality');
@ -170,30 +199,31 @@ const ModemCdma = new Lang.Class({
if (this.operator_name == null)
this._refreshServingSystem();
}));
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
if (err) {
this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) {
try {
[this.signal_quality] = proxy.GetSignalQualityFinish(result);
} catch(e) {
// it will return an error if the device is not connected
this.signal_quality = 0;
} else {
let [quality] = result;
this.signal_quality = quality;
}
this.emit('notify::signal-quality');
}));
},
_refreshServingSystem: function() {
this._proxy.GetServingSystemRemote(Lang.bind(this, function([result], err) {
if (err) {
// it will return an error if the device is not connected
this.operator_name = null;
} else {
let [bandClass, band, id] = result;
this._proxy.GetServingSystemRemote(null, Lang.bind(this, function(proxy, result) {
try {
let [bandClass, band, name] = proxy.GetServingSystemFinish(result);
if (name.length > 0)
this.operator_name = this._findProviderForSid(id);
this.operator_name = this._findProviderForSid(name);
else
this.operator_name = null;
} catch(e) {
// it will return an error if the device is not connected
this.operator_name = null;
}
this.emit('notify::operator-name');
}));
},

View File

@ -141,6 +141,7 @@ const BoxPointer = new Lang.Class({
this._muteInput();
Tweener.removeTweens(this);
Tweener.addTween(this, { opacity: fade ? 0 : 255,
xOffset: xOffset,
yOffset: yOffset,

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const St = imports.gi.St;
@ -200,19 +201,17 @@ const CalendarServerIface = <interface name="org.gnome.Shell.CalendarServer">
<signal name="Changed" />
</interface>;
const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface);
const CalendarServer = new Gio.DBusProxyClass({
Name: 'CalendarServer',
Interface: CalendarServerIface,
function CalendarServer() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
g_interface_name: CalendarServerInfo.name,
g_interface_info: CalendarServerInfo,
g_name: 'org.gnome.Shell.CalendarServer',
g_object_path: '/org/gnome/Shell/CalendarServer',
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
self.init(null);
return self;
}
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.Shell.CalendarServer',
g_object_path: '/org/gnome/Shell/CalendarServer',
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
}
});
function _datesEqual(a, b) {
if (a < b)
@ -242,11 +241,15 @@ const DBusEventSource = new Lang.Class({
this._dbusProxy = new CalendarServer();
this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
this._dbusProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
if (this._dbusProxy.g_name_owner)
this._onNameAppeared();
else
this._onNameVanished();
this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
} catch(e) {
return;
}
this._resetCache();
this.emit('changed');
}));
},
@ -256,51 +259,52 @@ const DBusEventSource = new Lang.Class({
this._lastRequestEnd = null;
},
_onNameAppeared: function(owner) {
this._resetCache();
this._loadEvents(true);
},
_onNameVanished: function(oldOwner) {
this._resetCache();
this.emit('changed');
},
_onChanged: function() {
this._loadEvents(false);
},
_onEventsReceived: function([appointments]) {
let newEvents = [];
if (appointments != null) {
for (let n = 0; n < appointments.length; n++) {
let a = appointments[n];
let date = new Date(a[4] * 1000);
let end = new Date(a[5] * 1000);
let summary = a[1];
let allDay = a[3];
let event = new CalendarEvent(date, end, summary, allDay);
newEvents.push(event);
}
newEvents.sort(function(event1, event2) {
return event1.date.getTime() - event2.date.getTime();
});
_onEventsReceived: function(proxy, result) {
let appointments;
try {
[appointments] = proxy.call_finish(result).deep_unpack();
} catch(e if e instanceof GLib.Error) {
// ignore errors coming from DBus
appointments = [];
}
let newEvents = [];
for (let n = 0; n < appointments.length; n++) {
let a = appointments[n];
let date = new Date(a[4] * 1000);
let end = new Date(a[5] * 1000);
let summary = a[1];
let allDay = a[3];
let event = new CalendarEvent(date, end, summary, allDay);
newEvents.push(event);
}
newEvents.sort(function(event1, event2) {
return event1.date.getTime() - event2.date.getTime();
});
this._events = newEvents;
this.emit('changed');
},
_loadEvents: function(forceReload) {
if (this._curRequestBegin && this._curRequestEnd){
/* Can't use GetEventsRemote because we need to pass the
flags here */
let callFlags = Gio.DBusCallFlags.NO_AUTO_START;
if (forceReload)
callFlags = Gio.DBusCallFlags.NONE;
this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
this._curRequestEnd.getTime() / 1000,
forceReload,
Lang.bind(this, this._onEventsReceived),
callFlags);
callFlags = Gio.DBusCallFlags.NONE;
this._dbusProxy.call("GetEvents",
GLib.Variant.new("(xxb)", [this._curRequestBegin.getTime() / 1000,
this._curRequestEnd.getTime() / 1000,
forceReload]),
callFlags,
-1,
null,
Lang.bind(this, this._onEventsReceived));
}
},
@ -393,7 +397,6 @@ const Calendar = new Lang.Class({
this._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, function() {
this._update(false);
}));
this._update(true);
}
},

View File

@ -33,7 +33,9 @@ const AutomountManager = new Lang.Class({
Lang.bind(this, this._InhibitorsChanged));
this._inhibited = false;
this._loginManager = LoginManager.getLoginManager();
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
}));
this._volumeMonitor = Gio.VolumeMonitor.get();
},
@ -85,7 +87,7 @@ const AutomountManager = new Lang.Class({
_onDriveConnected: function() {
// if we're not in the current ConsoleKit session,
// or screensaver is active, don't play sounds
if (!this._loginManager.sessionActive)
if (!this._loginManager || !this._loginManager.sessionActive)
return;
global.play_theme_sound(0, 'device-added-media');
@ -94,7 +96,7 @@ const AutomountManager = new Lang.Class({
_onDriveDisconnected: function() {
// if we're not in the current ConsoleKit session,
// or screensaver is active, don't play sounds
if (!this._loginManager.sessionActive)
if (!this._loginManager || !this._loginManager.sessionActive)
return;
global.play_theme_sound(0, 'device-removed-media');
@ -103,7 +105,7 @@ const AutomountManager = new Lang.Class({
_onDriveEjectButton: function(monitor, drive) {
// TODO: this code path is not tested, as the GVfs volume monitor
// doesn't emit this signal just yet.
if (!this._loginManager.sessionActive)
if (!this._loginManager || !this._loginManager.sessionActive)
return;
// we force stop/eject in this case, so we don't have to pass a
@ -143,7 +145,7 @@ const AutomountManager = new Lang.Class({
if (params.checkSession) {
// if we're not in the current ConsoleKit session,
// don't attempt automount
if (!this._loginManager.sessionActive)
if (!this._loginManager || !this._loginManager.sessionActive)
return;
}

View File

@ -2,6 +2,7 @@
const Lang = imports.lang;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const St = imports.gi.St;
const LoginManager = imports.misc.loginManager;
@ -82,12 +83,16 @@ const HotplugSnifferIface = <interface name="org.gnome.Shell.HotplugSniffer">
</method>
</interface>;
const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface);
function HotplugSniffer() {
return new HotplugSnifferProxy(Gio.DBus.session,
'org.gnome.Shell.HotplugSniffer',
'/org/gnome/Shell/HotplugSniffer');
}
const HotplugSniffer = new Gio.DBusProxyClass({
Name: 'HotplugSnifferProxy',
Interface: HotplugSnifferIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.Shell.HotplugSniffer',
g_object_path: '/org/gnome/Shell/HotplugSniffer' });
}
});
const ContentTypeDiscoverer = new Lang.Class({
Name: 'ContentTypeDiscoverer',
@ -127,10 +132,14 @@ const ContentTypeDiscoverer = new Lang.Class({
let root = mount.get_root();
let hotplugSniffer = new HotplugSniffer();
hotplugSniffer.SniffURIRemote(root.get_uri(),
Lang.bind(this, function([contentTypes]) {
this._emitCallback(mount, contentTypes);
}));
hotplugSniffer.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
proxy.SniffURIRemote(root.get_uri(), null, Lang.bind(this, function(proxy, result) {
let [contentTypes] = proxy.SniffURIFinish(result);
this._emitCallback(mount, contentTypes);
}));
}));
}
},
@ -162,7 +171,9 @@ const AutorunManager = new Lang.Class({
Name: 'AutorunManager',
_init: function() {
this._loginManager = LoginManager.getLoginManager();
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
}));
this._volumeMonitor = Gio.VolumeMonitor.get();
@ -215,7 +226,7 @@ const AutorunManager = new Lang.Class({
_onMountAdded: function(monitor, mount) {
// don't do anything if our session is not the currently
// active one
if (!this._loginManager.sessionActive)
if (!this._loginManager || !this._loginManager.sessionActive)
return;
this._processMount(mount, true);

View File

@ -408,7 +408,10 @@ const VPNRequestHandler = new Lang.Class({
}
},
cancel: function() {
cancel: function(respond) {
if (respond)
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
if (this._newStylePlugin && this._shellDialog) {
this._shellDialog.close(global.get_current_time());
this._shellDialog.destroy();
@ -599,6 +602,16 @@ const NetworkAgent = new Lang.Class({
},
disable: function() {
let requestId;
for (requestId in this._dialogs)
this._dialogs[requestId].cancel();
this._dialogs = { };
for (requestId in this._vpnRequests)
this._vpnRequests[requestId].cancel(true);
this._vpnRequests = { };
this._native.unregister();
},
@ -622,7 +635,7 @@ const NetworkAgent = new Lang.Class({
this._dialogs[requestId].destroy();
delete this._dialogs[requestId];
} else if (this._vpnRequests[requestId]) {
this._vpnRequests[requestId].cancel();
this._vpnRequests[requestId].cancel(false);
delete this._vpnRequests[requestId];
}
},

View File

@ -41,7 +41,7 @@ const Recorder = new Lang.Class({
recorder.set_framerate(this._recorderSettings.get_int('framerate'));
/* Translators: this is a filename used for screencast recording */
// xgettext:no-c-format
recorder.set_filename(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
recorder.set_file_template(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
let pipeline = this._recorderSettings.get_string('pipeline');
if (!pipeline.match(/^\s*$/))

View File

@ -105,7 +105,7 @@ const restartDialogContent = {
endDescription: _("Restarting the system."),
confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart") }],
iconName: 'system-shutdown-symbolic',
iconName: 'view-refresh-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon'
};
@ -218,6 +218,34 @@ function init() {
_endSessionDialog = new EndSessionDialog();
}
const EndSessionExporter = new Gio.DBusImplementerClass({
Name: 'EndSessionExporter',
Interface: EndSessionDialogIface,
_init: function() {
this.parent();
this.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
},
OpenAsync: function(parameters, invocation) {
this.emit('open', parameters, invocation);
},
close: function() {
this.emit_signal('Closed');
},
cancel: function() {
this.emit_signal('Canceled');
},
confirm: function(type) {
this.emit_signal(type);
},
});
Signals.addSignalMethods(EndSessionExporter.prototype);
const EndSessionDialog = new Lang.Class({
Name: 'EndSessionDialog',
Extends: ModalDialog.ModalDialog,
@ -295,8 +323,8 @@ const EndSessionDialog = new Lang.Class({
scrollView.hide();
}));
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
this._exporter = new EndSessionExporter();
this._exporter.connect('open', Lang.bind(this, this._onOpenRequest));
},
_onDestroy: function() {
@ -387,19 +415,19 @@ const EndSessionDialog = new Lang.Class({
close: function() {
this.parent();
this._dbusImpl.emit_signal('Closed', null);
this._exporter.close();
},
cancel: function() {
this._stopTimer();
this._dbusImpl.emit_signal('Canceled', null);
this._exporter.cancel();
this.close(global.get_current_time());
},
_confirm: function(signal) {
this._fadeOutDialog();
this._stopTimer();
this._dbusImpl.emit_signal(signal, null);
this._exporter.confirm(signal);
},
_onOpened: function() {
@ -452,7 +480,7 @@ const EndSessionDialog = new Lang.Class({
this._updateContent();
},
OpenAsync: function(parameters, invocation) {
_onOpenRequest: function(exporter, parameters, invocation) {
let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters;
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._inhibitors = [];
@ -466,7 +494,10 @@ const EndSessionDialog = new Lang.Class({
}
for (let i = 0; i < inhibitorObjectPaths.length; i++) {
let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i], Lang.bind(this, function(proxy, error) {
let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i]);
inhibitor.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._onInhibitorLoaded(proxy);
}));

View File

@ -2,7 +2,6 @@
const Caribou = imports.gi.Caribou;
const Clutter = imports.gi.Clutter;
const DBus = imports.dbus;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
@ -191,13 +190,14 @@ const Key = new Lang.Class({
}
});
const Keyboard = new Lang.Class({
const Keyboard = new Gio.DBusImplementerClass({
// HACK: we can't set Name, because it collides with Name dbus property
// Name: 'Keyboard',
Interface: CaribouKeyboardIface,
_init: function () {
this._impl = Gio.DBusExportedObject.wrapJSObject(CaribouKeyboardIface, this);
this._impl.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
this.parent();
this.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
this.actor = null;
this._focusInTray = false;

View File

@ -104,7 +104,7 @@ const LayoutManager = new Lang.Class({
this.primaryMonitor = null;
this.primaryIndex = -1;
this._hotCorners = [];
this._rootPixmap = null;
this._background = null;
this._leftPanelBarrier = 0;
this._rightPanelBarrier = 0;
this._trayBarrier = 0;
@ -333,30 +333,30 @@ const LayoutManager = new Lang.Class({
// to the greeter. Otherwise, we'll just animate the panel,
// as usual.
if (Main.sessionMode.isGreeter) {
this._rootPixmap = global.create_xrootpmap_texture();
if (this._rootPixmap != null) {
Main.uiGroup.add_actor(this._rootPixmap);
Tweener.addTween(this._rootPixmap,
this._background = Meta.BackgroundActor.new_for_screen(global.screen);
if (this._background != null) {
Main.uiGroup.add_actor(this._background);
Tweener.addTween(this._background,
{ opacity: 0,
time: PLYMOUTH_TRANSITION_TIME,
transition: 'linear',
onComplete: this._fadeRootpmapComplete,
onComplete: this._fadeBackgroundComplete,
onCompleteScope: this });
plymouthTransitionRunning = true;
}
}
if (!plymouthTransitionRunning)
this._fadeRootpmapComplete();
this._fadeBackgroundComplete();
},
_fadeRootpmapComplete: function() {
_fadeBackgroundComplete: function() {
// Don't animate the strut
this._chrome.freezeUpdateRegions();
if (this._rootPixmap != null) {
this._rootPixmap.destroy();
this._rootPixmap = null;
if (this._background != null) {
this._background.destroy();
this._background = null;
}
Tweener.addTween(this.panelBox,

View File

@ -96,14 +96,15 @@ const ZoomRegionIface = <interface name={ZOOM_SERVICE_NAME}>
// '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc.
let _zoomRegionInstanceCount = 0;
const ShellMagnifier = new Lang.Class({
const ShellMagnifier = new Gio.DBusImplementerClass({
Name: 'ShellMagnifier',
Interface: MagnifierIface,
_init: function() {
this._zoomers = {};
this.parent();
this.export(Gio.DBus.session, MAG_SERVICE_PATH);
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this);
this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH);
this._zoomers = {};
},
/**
@ -332,14 +333,15 @@ const ShellMagnifier = new Lang.Class({
* @zoomerObjectPath: String that is the path to a DBus ZoomRegion.
* @zoomRegion: The actual zoom region associated with the object path.
*/
const ShellMagnifierZoomRegion = new Lang.Class({
const ShellMagnifierZoomRegion = new Gio.DBusImplementerClass({
Name: 'ShellMagnifierZoomRegion',
Interface: ZoomRegionIface,
_init: function(zoomerObjectPath, zoomRegion) {
this._zoomRegion = zoomRegion;
this.parent();
this.export(Gio.DBus.session, zoomerObjectPath);
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this);
this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath);
this._zoomRegion = zoomRegion;
},
/**
@ -417,6 +419,6 @@ const ShellMagnifierZoomRegion = new Lang.Class({
},
destroy: function() {
this._dbusImpl.unexport();
this.unexport();
}
});

View File

@ -1237,12 +1237,6 @@ const SummaryItem = new Lang.Class({
this.notificationStackWidget = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._closeButton = makeCloseButton();
this._closeButton.connect('clicked', Lang.bind(this, function() {
source.destroy();
source.emit('done-displaying-content');
}));
this.notificationStackView = new St.ScrollView({ style_class: source.isChat ? '' : 'summary-notification-stack-scrollview',
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER });
@ -1251,7 +1245,9 @@ const SummaryItem = new Lang.Class({
vertical: true });
this.notificationStackView.add_actor(this.notificationStack);
this.notificationStackWidget.add_actor(this.notificationStackView);
this.notificationStackWidget.add_actor(this._closeButton);
this.closeButton = makeCloseButton();
this.notificationStackWidget.add_actor(this.closeButton);
this._stackedNotifications = [];
this._oldMaxScrollAdjustment = 0;
@ -1268,14 +1264,6 @@ const SummaryItem = new Lang.Class({
global.focus_manager.add_group(this.rightClickMenu);
},
get closeButtonVisible() {
return this._closeButton.visible;
},
set closeButtonVisible(v) {
this._closeButton.visible = v;
},
_onKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Up) {
actor.emit('clicked', 1);
@ -1377,13 +1365,16 @@ const MessageTray = new Lang.Class({
Name: 'MessageTray',
_init: function() {
this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) {
this._presence = new GnomeSession.Presence();
this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._onStatusChanged(proxy.status);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._onStatusChanged(status);
}));
}));
this._busy = false;
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._onStatusChanged(status);
}));
this.actor = new St.Widget({ name: 'message-tray',
reactive: true,
@ -1603,12 +1594,9 @@ const MessageTray = new Lang.Class({
_onCloseClicked: function() {
if (this._notificationState == State.SHOWN) {
this._closeButton.hide();
this._notificationClosed = true;
this._notification.emit('done-displaying');
if (!this._notification.resident)
this._notification.destroy();
this._updateState();
this._notificationClosed = false;
}
},
@ -2101,9 +2089,8 @@ const MessageTray = new Lang.Class({
transition: 'easeOutQuad'
});
if (this._overviewVisible) {
if (!this._overviewVisible)
this._lightbox.show();
}
return true;
},
@ -2141,6 +2128,10 @@ const MessageTray = new Lang.Class({
},
_hideTray: function() {
// Having the summary item animate out while sliding down the tray
// is distracting, so hide it immediately in case it was visible.
this._summaryBoxPointer.actor.hide();
this._tween(this.actor, '_trayState', State.HIDDEN,
{ y: 0,
time: ANIMATION_TIME,
@ -2420,7 +2411,10 @@ const MessageTray = new Lang.Class({
this._notificationQueue = newQueue;
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget;
this._summaryBoxPointerItem.closeButtonVisible = true;
let closeButton = this._summaryBoxPointerItem.closeButton;
closeButton.show();
this._summaryBoxPointerCloseClickedId = closeButton.connect('clicked', Lang.bind(this, this._hideSummaryBoxPointer));
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
} else if (this._clickedSummaryItemMouseButton == 3) {
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
@ -2530,6 +2524,8 @@ const MessageTray = new Lang.Class({
this._summaryBoxPointer.bin.child = null;
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
this._summaryBoxPointerContentUpdatedId = 0;
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
this._summaryBoxPointerCloseClickedId = 0;
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
this._summaryBoxPointerDoneDisplayingId = 0;

View File

@ -25,10 +25,19 @@ const BusIface = <interface name="org.freedesktop.DBus">
</method>
</interface>;
var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface);
function Bus() {
return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
}
const Bus = new Gio.DBusProxyClass({
Name: 'SessionBusProxy',
Interface: BusIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.freedesktop.DBus',
g_object_path: '/org/freedesktop/DBus',
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES |
Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS |
Gio.DBusProxyFlags.DO_NOT_AUTO_START) });
}
});
const NotificationDaemonIface = <interface name="org.freedesktop.Notifications">
<method name="Notify">
@ -103,17 +112,20 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
'ibus-ui-gtk': 'keyboard'
};
const NotificationDaemon = new Lang.Class({
const NotificationDaemon = new Gio.DBusImplementerClass({
Name: 'NotificationDaemon',
Interface: NotificationDaemonIface,
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(NotificationDaemonIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
this.parent();
this.export(Gio.DBus.session, '/org/freedesktop/Notifications');
this._sources = [];
this._senderToPid = {};
this._notifications = {};
this._busProxy = new Bus();
// This is synchronous but fast because of the flags we use.
this._busProxy.init(null);
this._trayManager = new Shell.TrayManager();
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
@ -316,18 +328,20 @@ const NotificationDaemon = new Lang.Class({
return invocation.return_value(GLib.Variant.new('(u)', [id]));;
}
this._busProxy.GetConnectionUnixProcessIDRemote(sender, Lang.bind(this, function (result, excp) {
this._busProxy.GetConnectionUnixProcessIDRemote(sender, null, Lang.bind(this, function (proxy, result) {
// The app may have updated or removed the notification
ndata = this._notifications[id];
if (!ndata)
return;
if (excp) {
let pid;
try {
[pid] = proxy.GetConnectionUnixProcessIDFinish(result);
} catch(excp) {
logError(excp, 'Call to GetConnectionUnixProcessID failed');
return;
}
let [pid] = result;
source = this._getSource(appName, pid, ndata, sender, null);
// We only store sender-pid entries for persistent sources.
@ -487,13 +501,11 @@ const NotificationDaemon = new Lang.Class({
},
_emitNotificationClosed: function(id, reason) {
this._dbusImpl.emit_signal('NotificationClosed',
GLib.Variant.new('(uu)', [id, reason]));
this.emit_signal('NotificationClosed', id, reason);
},
_emitActionInvoked: function(id, action) {
this._dbusImpl.emit_signal('ActionInvoked',
GLib.Variant.new('(us)', [id, action]));
this.emit_signal('ActionInvoked', id, action);
},
_onTrayIconAdded: function(o, icon) {

View File

@ -247,6 +247,10 @@ const AppMenuButton = new Lang.Class({
this._container.connect('get-preferred-height', Lang.bind(this, this._getContentPreferredHeight));
this._container.connect('allocate', Lang.bind(this, this._contentAllocate));
let textureCache = St.TextureCache.get_default();
textureCache.connect('icon-theme-changed',
Lang.bind(this, this._onIconThemeChanged));
this._iconBox = new Shell.Slicer({ name: 'appMenuIcon' });
this._iconBox.connect('style-changed',
Lang.bind(this, this._onIconBoxStyleChanged));
@ -332,6 +336,15 @@ const AppMenuButton = new Lang.Class({
this._updateIconBoxClip();
},
_onIconThemeChanged: function() {
if (this._iconBox.child == null)
return;
this._iconBox.child.destroy();
let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
this._iconBox.set_child(icon);
},
_updateIconBoxClip: function() {
let allocation = this._iconBox.allocation;
if (this._iconBottomClip > 0)
@ -901,6 +914,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
'logo': imports.gdm.loginDialog.LogoMenuButton,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
'userMenu': imports.ui.userMenu.UserMenuButton

View File

@ -214,7 +214,8 @@ const Button = new Lang.Class({
destroy: function() {
this.actor._delegate = null;
this.menu.destroy();
if (this.menu)
this.menu.destroy();
this.actor.destroy();
this.emit('destroy');

View File

@ -1269,13 +1269,14 @@ const PopupMenu = new Lang.Class({
},
close: function(animate) {
if (!this.isOpen)
return;
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
this._boxPointer.hide(animate);
if (this._boxPointer.actor.visible)
this._boxPointer.hide(animate);
if (!this.isOpen)
return;
this.isOpen = false;
this.emit('open-state-changed', false);

View File

@ -29,8 +29,15 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
</method>
</interface>;
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
var SearchProviderProxy = new Gio.DBusProxyClass({
Name: 'SearchProviderProxy',
Interface: SearchProviderIface,
_init: function(params) {
params.g_bus_type = Gio.BusType.SESSION;
this.parent(params);
}
});
function loadRemoteSearchProviders(addProviderCallback) {
let dataDirs = GLib.get_system_data_dirs();
@ -90,13 +97,22 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
icon,
busName,
objectPath);
remoteProvider.initAsync(null, function(obj, result) {
try {
remoteProvider.initFinish(result);
} catch(e) {
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
return;
}
addProviderCallback(remoteProvider);
});
loadedProviders[objectPath] = remoteProvider;
} catch(e) {
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
continue;
}
addProviderCallback(remoteProvider);
}
}));
@ -107,13 +123,41 @@ const RemoteSearchProvider = new Lang.Class({
Extends: Search.SearchProvider,
_init: function(title, icon, dbusName, dbusPath) {
this._proxy = new SearchProviderProxy(Gio.DBus.session,
dbusName, dbusPath);
this.parent(title.toUpperCase());
this._proxy = new SearchProviderProxy({ g_name: dbusName,
g_object_path: dbusPath });
this._cancellable = new Gio.Cancellable();
},
initAsync: function(cancellable, asyncCallback) {
// Can't pass "this" as source object, because RemoteSearchProvider
// is not a GObject.Object (and in gjs you can't inherit from a JS
// type that in turn inherits from GObject)
let simpleResult = Gio.SimpleAsyncResult.new(null, asyncCallback, null);
simpleResult.set_check_cancellable(cancellable);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
simpleResult.set_op_res_gboolean(true);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
}
simpleResult.complete();
}));
},
initFinish: function(simpleResult) {
if (!simpleResult.propagate_error())
return simpleResult.get_op_res_gboolean();
return false;
},
createIcon: function(size, meta) {
if (meta['gicon']) {
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),
@ -131,10 +175,17 @@ const RemoteSearchProvider = new Lang.Class({
icon_size: size });
},
_getResultsFinished: function(results, error) {
if (error)
return;
this.searchSystem.pushResults(this, results[0]);
_getResultsFinished: function(proxy, result) {
try {
// We rely on a small implementation detail of the
// GDBus bindings here: all *Finish are equal
let [results] = proxy.GetInitialResultSetFinish(result);
this.searchSystem.pushResults(this, results);
} catch(e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
log('Received error from search provider %s: %s'.format(this.title, String(e)));
}
},
getInitialResultSet: function(terms) {
@ -142,8 +193,8 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable.reset();
try {
this._proxy.GetInitialResultSetRemote(terms,
Lang.bind(this, this._getResultsFinished),
this._cancellable);
this._cancellable,
Lang.bind(this, this._getResultsFinished));
} catch(e) {
log('Error calling GetInitialResultSet for provider %s: %s'.format( this.title, e.toString()));
this.searchSystem.pushResults(this, []);
@ -155,30 +206,30 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable.reset();
try {
this._proxy.GetSubsearchResultSetRemote(previousResults, newTerms,
Lang.bind(this, this._getResultsFinished),
this._cancellable);
this._cancellable,
Lang.bind(this, this._getResultsFinished))
} catch(e) {
log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.title, e.toString()));
this.searchSystem.pushResults(this, []);
}
},
_getResultMetasFinished: function(results, error, callback) {
if (error) {
_getResultMetasFinished: function(proxy, result, callback) {
try {
let [metas] = results.GetResultMetasFinish(result);
let resultMetas = [];
for (let i = 0; i < metas.length; i++) {
for (let prop in metas[i])
metas[i][prop] = metas[i][prop].deep_unpack();
resultMetas.push({ id: metas[i]['id'],
name: metas[i]['name'],
createIcon: Lang.bind(this,
this.createIcon, metas[i]) });
}
callback(resultMetas);
} catch(e) {
callback([]);
return;
}
let metas = results[0];
let resultMetas = [];
for (let i = 0; i < metas.length; i++) {
for (let prop in metas[i])
metas[i][prop] = metas[i][prop].deep_unpack();
resultMetas.push({ id: metas[i]['id'],
name: metas[i]['name'],
createIcon: Lang.bind(this,
this.createIcon, metas[i]) });
}
callback(resultMetas);
},
getResultMetas: function(ids, callback) {
@ -186,8 +237,8 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable.reset();
try {
this._proxy.GetResultMetasRemote(ids,
Lang.bind(this, this._getResultMetasFinished, callback),
this._cancellable);
this._cancellable,
Lang.bind(this, this._getResultMetasFinished, callback));
} catch(e) {
log('Error calling GetResultMetas for provider %s: %s'.format(this.title, e.toString()));
callback([]);
@ -195,7 +246,7 @@ const RemoteSearchProvider = new Lang.Class({
},
activateResult: function(id) {
this._proxy.ActivateResultRemote(id);
this._proxy.ActivateResultRemote(id, null, null);
}
});

View File

@ -202,11 +202,12 @@ const RunDialog = new Lang.Class({
let label = new St.Label({ style_class: 'run-dialog-label',
text: _("Please enter a command:") });
text: _("Enter a Command") });
this.contentLayout.add(label, { y_align: St.Align.START });
let entry = new St.Entry({ style_class: 'run-dialog-entry' });
let entry = new St.Entry({ style_class: 'run-dialog-entry',
can_focus: true });
ShellEntry.addContextMenu(entry);
entry.label_actor = label;
@ -236,6 +237,10 @@ const RunDialog = new Lang.Class({
this._errorBox.hide();
this.setButtons([{ action: Lang.bind(this, this.close),
label: _("Close"),
key: Clutter.Escape }]);
this._pathCompleter = new Gio.FilenameCompleter();
this._commandCompleter = new CommandCompleter();
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
@ -246,20 +251,12 @@ const RunDialog = new Lang.Class({
let symbol = e.get_key_symbol();
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
this.popModal();
if (e.get_state() & Clutter.ModifierType.CONTROL_MASK)
this._run(o.get_text(), true);
else
this._run(o.get_text(), false);
if (!this._commandError)
this._run(o.get_text(),
e.get_state() & Clutter.ModifierType.CONTROL_MASK);
if (!this._commandError ||
!this.pushModal())
this.close();
else {
if (!this.pushModal())
this.close();
}
return true;
}
if (symbol == Clutter.Escape) {
this.close();
return true;
}
if (symbol == Clutter.slash) {

View File

@ -26,7 +26,7 @@ const Util = imports.misc.util;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled';
const CURTAIN_SLIDE_TIME = 0.5;
const CURTAIN_SLIDE_TIME = 0.3;
// fraction of screen height the arrow must reach before completing
// the slide up automatically
const ARROW_DRAG_THRESHOLD = 0.1;
@ -47,7 +47,7 @@ const SUMMARY_ICON_SIZE = 48;
// STANDARD_FADE_TIME is used when the session goes idle, while
// SHORT_FADE_TIME is used when requesting lock explicitly from the user menu
const STANDARD_FADE_TIME = 10;
const SHORT_FADE_TIME = 0.8;
const SHORT_FADE_TIME = 0.3;
const Clock = new Lang.Class({
Name: 'ScreenShieldClock',
@ -186,7 +186,7 @@ const NotificationsBox = new Lang.Class({
if (obj.resident) {
this._residentNotificationBox.add(item.notificationStackWidget);
item.closeButtonVisible = false;
item.closeButton.hide();
item.prepareNotificationStackForShowing();
} else {
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
@ -244,7 +244,7 @@ const NotificationsBox = new Lang.Class({
obj.resident = true;
this._residentNotificationBox.add(obj.item.notificationStackWidget);
obj.item.closeButtonVisible = false;
obj.item.closeButton.hide();
obj.item.prepareNotificationStackForShowing();
} else {
// just update the counter
@ -418,10 +418,11 @@ const ScreenShield = new Lang.Class({
this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this);
this._loginManager = LoginManager.getLoginManager();
this._loginSession = this._loginManager.getCurrentSessionProxy();
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); }));
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginSession = manager.getCurrentSessionProxy();
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); }));
}));
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
@ -526,7 +527,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup,
{ y: 0,
time: time,
transition: 'linear',
transition: 'easeInQuad',
onComplete: function() {
this._lockScreenGroup.fixed_position_set = false;
this._lockScreenState = MessageTray.State.SHOWN;
@ -580,14 +581,13 @@ const ScreenShield = new Lang.Class({
showDialog: function() {
// Ensure that the stage window is mapped, before taking a grab
// otherwise X errors out
let actorShownId = 0;
actorShownId = this.actor.connect('show', Lang.bind(this, function() {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
if (!this._isModal) {
Main.pushModal(this.actor);
this._isModal = true;
}
this.actor.disconnect(actorShownId);
return false;
}));
this.actor.show();
@ -623,7 +623,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup,
{ y: -h,
time: time,
transition: 'linear',
transition: 'easeInQuad',
onComplete: function() {
this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup.hide();
@ -684,7 +684,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup,
{ y: 0,
time: SHORT_FADE_TIME,
transition: 'linear',
transition: 'easeOutQuad',
onComplete: function() {
this._lockScreenShown();
},
@ -876,6 +876,7 @@ const ScreenShieldFallback = new Lang.Class({
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES),
});
// This is synchronous but it is the fallback case.
this._proxy.init(null);
this._proxy.connect('g-signal', Lang.bind(this, this._onSignal));

View File

@ -80,15 +80,23 @@ const PerfHelperIface = <interface name="org.gnome.Shell.PerfHelper">
<method name="DestroyWindows" />
</interface>;
var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface);
function PerfHelper() {
return new PerfHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PerfHelper', '/org/gnome/Shell/PerfHelper');
}
const PerfHelper = new Gio.DBusProxyClass({
Name: 'PerfHelperProxy',
Interface: PerfHelperIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.Shell.PerfHelper',
g_object_path: '/org/gnome/Shell/PerfHelper' });
}
});
let _perfHelper = null;
function _getPerfHelper() {
if (_perfHelper == null)
if (_perfHelper == null) {
_perfHelper = new PerfHelper();
_perfHelper.init(null);
}
return _perfHelper;
}
@ -111,7 +119,8 @@ function createTestWindow(width, height, alpha, maximized) {
let perfHelper = _getPerfHelper();
perfHelper.CreateWindowRemote(width, height, alpha, maximized,
function(result, excp) {
null,
function(proxy, result) {
if (cb)
cb();
});
@ -131,7 +140,7 @@ function waitTestWindows() {
let cb;
let perfHelper = _getPerfHelper();
perfHelper.WaitWindowsRemote(function(result, excp) {
perfHelper.WaitWindowsRemote(null, function(proxy, result) {
if (cb)
cb();
});
@ -154,7 +163,7 @@ function destroyTestWindows() {
let cb;
let perfHelper = _getPerfHelper();
perfHelper.DestroyWindowsRemote(function(result, excp) {
perfHelper.DestroyWindowsRemote(null, function(proxy, result) {
if (cb)
cb();
});

View File

@ -2,6 +2,7 @@
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
@ -75,6 +76,8 @@ const SearchProvider = new Lang.Class({
Name: 'SearchProvider',
_init: function(title) {
this.parent();
this.title = title;
this.searchSystem = null;
},

View File

@ -39,7 +39,7 @@ const _modes = {
unlockDialog: imports.gdm.loginDialog.LoginDialog,
components: ['polkitAgent'],
panel: {
left: [],
left: ['logo'],
center: ['dateMenu'],
right: ['a11y', 'display', 'keyboard',
'volume', 'battery', 'powerMenu']

View File

@ -67,14 +67,16 @@ const ScreenSaverIface = <interface name="org.gnome.ScreenSaver">
</signal>
</interface>;
const GnomeShell = new Lang.Class({
const GnomeShell = new Gio.DBusImplementerClass({
Name: 'GnomeShellDBus',
Interface: GnomeShellIface,
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
this.parent();
this._extensionsSerivce = new GnomeShellExtensions();
this.export(Gio.DBus.session, '/org/gnome/Shell');
this._extensionsService = new GnomeShellExtensions();
},
/**
@ -236,12 +238,14 @@ const GnomeShellExtensionsIface = <interface name="org.gnome.Shell.Extensions">
<property name="ShellVersion" type="s" access="read" />
</interface>;
const GnomeShellExtensions = new Lang.Class({
const GnomeShellExtensions = new Gio.DBusImplementerClass({
Name: 'GnomeShellExtensionsDBus',
Interface: GnomeShellExtensionsIface,
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
this.parent();
this.export(Gio.DBus.session, '/org/gnome/Shell');
ExtensionSystem.connect('extension-state-changed',
Lang.bind(this, this._extensionStateChanged));
},
@ -335,25 +339,23 @@ const GnomeShellExtensions = new Lang.Class({
ShellVersion: Config.PACKAGE_VERSION,
_extensionStateChanged: function(_, newState) {
this._dbusImpl.emit_signal('ExtensionStatusChanged',
GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error]));
this.emit_signal('ExtensionStatusChanged', newState.uuid, newState.state, newState.error);
}
});
const ScreenSaverDBus = new Lang.Class({
const ScreenSaverDBus = new Gio.DBusImplementerClass({
Name: 'ScreenSaverDBus',
Interface: ScreenSaverIface,
_init: function(screenShield) {
this.parent();
this._screenShield = screenShield;
screenShield.connect('lock-status-changed', Lang.bind(this, function(shield) {
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.locked]));
this.emit_signal('ActiveChanged', shield.locked);
}));
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
this.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null);
},

View File

@ -554,14 +554,16 @@ const ShellMountOperationType = {
SHOW_PROCESSES: 3
};
const GnomeShellMountOpHandler = new Lang.Class({
const GnomeShellMountOpHandler = new Gio.DBusImplementerClass({
Name: 'GnomeShellMountOpHandler',
Interface: GnomeShellMountOpIface,
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler',
Gio.BusNameOwnerFlags.REPLACE, null, null);
this.parent();
this.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
Gio.DBus.session.own_name('org.gtk.MountOperationHandler',
Gio.BusNameOwnerFlags.REPLACE, null, null);
this._dialog = null;
this._volumeMonitor = Gio.VolumeMonitor.get();

View File

@ -233,20 +233,11 @@ const NMWirelessSectionTitleMenuItem = new Lang.Class({
}
});
const NMDevice = new Lang.Class({
Name: 'NMDevice',
const NMConnectionBased = new Lang.Class({
Name: 'NMConnectionBased',
Abstract: true,
_init: function(client, device, connections) {
this.device = device;
if (device) {
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
} else
this._stateChangedId = 0;
// protected
this._client = client;
_init: function(connections) {
this._connections = [ ];
for (let i = 0; i < connections.length; i++) {
if (!connections[i].get_uuid())
@ -264,26 +255,115 @@ const NMDevice = new Lang.Class({
this._connections.push(obj);
}
this._connections.sort(this._connectionSortFunction);
},
checkConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
let exists = pos != -1;
let valid = this.connectionValid(connection);
let similar = false;
if (exists) {
let existing = this._connections[pos];
// Check if connection changed name or id
similar = existing.name == connection.get_id() &&
existing.timestamp == connection._timestamp;
}
if (exists && valid && similar) {
// Nothing to do
return;
}
if (exists)
this.removeConnection(connection);
if (valid)
this.addConnection(connection);
},
addConnection: function(connection) {
// record the connection
let obj = {
connection: connection,
name: connection.get_id(),
uuid: connection.get_uuid(),
timestamp: connection._timestamp,
item: null,
};
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
this._queueCreateSection();
},
removeConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
if (pos == -1) {
// this connection was never added, nothing to do here
return;
}
let obj = this._connections[pos];
if (obj.item)
obj.item.destroy();
this._connections.splice(pos, 1);
if (this._connections.length <= 1) {
// We need to show the automatic connection again
// (or in the case of NMDeviceWired, we want to hide
// the only explicit connection)
this._queueCreateSection();
}
},
_findConnection: function(uuid) {
for (let i = 0; i < this._connections.length; i++) {
let obj = this._connections[i];
if (obj.uuid == uuid)
return i;
}
return -1;
},
_connectionSortFunction: function(one, two) {
if (one.timestamp == two.timestamp)
return GLib.utf8_collate(one.name, two.name);
return two.timestamp - one.timestamp;
},
});
Signals.addSignalMethods(NMConnectionBased.prototype);
const NMDevice = new Lang.Class({
Name: 'NMDevice',
Abstract: true,
Extends: NMConnectionBased,
_init: function(client, device, connections) {
this.device = device;
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
// protected
this._client = client;
this.parent(connections);
this._activeConnection = null;
this._activeConnectionItem = null;
this._autoConnectionItem = null;
this._overflowItem = null;
if (this.device) {
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
let ok;
if (state)
ok = this.activate();
else
ok = this.deactivate();
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
let ok;
if (state)
ok = this.activate();
else
ok = this.deactivate();
if (!ok)
item.setToggleState(!state);
}));
if (!ok)
item.setToggleState(!state);
}));
this._updateStatusItem();
}
this._updateStatusItem();
this.section = new PopupMenu.PopupMenuSection();
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
@ -352,6 +432,10 @@ const NMDevice = new Lang.Class({
return this.device.state == NetworkManager.DeviceState.ACTIVATED;
},
clearActiveConnection: function(activeConnection) {
this.setActiveConnection(null);
},
setActiveConnection: function(activeConnection) {
if (activeConnection == this._activeConnection)
// nothing to do
@ -369,80 +453,13 @@ const NMDevice = new Lang.Class({
this._queueCreateSection();
},
checkConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
let exists = pos != -1;
let valid = this.connectionValid(connection);
let similar = false;
if (exists) {
let existing = this._connections[pos];
// Check if connection changed name or id
similar = existing.name == connection.get_id() &&
existing.timestamp == connection._timestamp;
}
if (exists && valid && similar) {
// Nothing to do
return;
}
if (exists)
this.removeConnection(connection);
if (valid)
this.addConnection(connection);
},
addConnection: function(connection) {
// record the connection
let obj = {
connection: connection,
name: connection.get_id(),
uuid: connection.get_uuid(),
timestamp: connection._timestamp,
item: null,
};
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
this._clearSection();
this._queueCreateSection();
},
removeConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
if (pos == -1) {
// this connection was never added, nothing to do here
return;
}
let obj = this._connections[pos];
if (obj.item)
obj.item.destroy();
this._connections.splice(pos, 1);
if (this._connections.length <= 1) {
// We need to show the automatic connection again
// (or in the case of NMDeviceWired, we want to hide
// the only explicit connection)
this._clearSection();
this._queueCreateSection();
}
},
connectionValid: function(connection) {
return this.device.connection_valid(connection);
},
_connectionSortFunction: function(one, two) {
if (one.timestamp == two.timestamp)
return GLib.utf8_collate(one.name, two.name);
return two.timestamp - one.timestamp;
},
setEnabled: function(enabled) {
// do nothing by default, we want to keep the conneciton list visible
// in the majority of cases (wired, wwan, vpn)
// in the majority of cases (wired, wwan)
},
getStatusLabel: function() {
@ -500,15 +517,6 @@ const NMDevice = new Lang.Class({
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
},
_findConnection: function(uuid) {
for (let i = 0; i < this._connections.length; i++) {
let obj = this._connections[i];
if (obj.uuid == uuid)
return i;
}
return -1;
},
_queueCreateSection: function() {
this._clearSection();
Main.queueDeferredWork(this._deferredWorkId);
@ -652,8 +660,6 @@ const NMDevice = new Lang.Class({
return out;
}
});
Signals.addSignalMethods(NMDevice.prototype);
const NMDeviceWired = new Lang.Class({
Name: 'NMDeviceWired',
@ -868,95 +874,6 @@ const NMDeviceBluetooth = new Lang.Class({
}
});
// Not a real device, but I save a lot code this way
const NMDeviceVPN = new Lang.Class({
Name: 'NMDeviceVPN',
Extends: NMDevice,
_init: function(client, device, connections) {
// Disable autoconnections
this._autoConnectionName = null;
this.category = NMConnectionCategory.VPN;
this.parent(client, null, connections);
},
connectionValid: function(connection) {
return connection._type == NetworkManager.SETTING_VPN_SETTING_NAME;
},
get empty() {
return this._connections.length == 0;
},
get connected() {
if (!this._activeConnection)
return false;
return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
},
setActiveConnection: function(activeConnection) {
if (this._stateChangeId)
this._activeConnection.disconnect(this._stateChangeId);
this._stateChangeId = 0;
this.parent(activeConnection);
if (this._activeConnection)
this._stateChangeId = this._activeConnection.connect('vpn-state-changed',
Lang.bind(this, this._connectionStateChanged));
this.emit('state-changed');
},
_shouldShowConnectionList: function() {
return true;
},
deactivate: function() {
if (this._activeConnection)
this._client.deactivate_connection(this._activeConnection);
},
getStatusLabel: function() {
if (!this._activeConnection) // Same as DISCONNECTED
return null;
switch(this._activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
_connectionStateChanged: function(connection, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
this.emit('activation-failed', reason);
}
// Differently from real NMDevices, there is no need to queue
// an update of the menu section, contents wouldn't change anyway
this.emit('state-changed');
}
});
const NMDeviceWireless = new Lang.Class({
Name: 'NMDeviceWireless',
Extends: NMDevice,
@ -1557,6 +1474,151 @@ const NMDeviceWireless = new Lang.Class({
},
});
const NMVPNSection = new Lang.Class({
Name: 'NMVPNSection',
Extends: NMConnectionBased,
category: NMConnectionCategory.VPN,
_init: function(client, connections) {
this.parent(connections);
this._client = client;
this.section = new PopupMenu.PopupMenuSection();
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
},
get empty() {
return this._connections.length == 0;
},
connectionValid: function(connection) {
// filtering is done by NMApplet code
return true;
},
getStatusLabel: function(activeConnection) {
switch(activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
clearActiveConnection: function(activeConnection) {
let pos = this._findConnection(activeConnection.uuid);
if (pos < 0)
return;
let obj = this._connections[pos];
obj.active.disconnect(obj.stateChangedId);
obj.active = null;
if (obj.item) {
obj.item.setToggleState(false);
obj.item.setStatus(null);
}
},
setActiveConnection: function(activeConnection) {
let pos = this._findConnection(activeConnection.uuid);
if (pos < 0)
return;
let obj = this._connections[pos];
obj.active = activeConnection;
obj.stateChangedId = obj.active.connect('vpn-state-changed',
Lang.bind(this, this._connectionStateChanged));
if (obj.item) {
obj.item.setToggleState(obj.active.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
obj.item.setStatus(this.getStatusLabel(obj.active));
}
},
_queueCreateSection: function() {
this.section.removeAll();
Main.queueDeferredWork(this._deferredWorkId);
},
_createConnectionItem: function(obj) {
let menuItem = new PopupMenu.PopupSwitchMenuItem(obj.name, false,
{ style_class: 'popup-subtitle-menu-item' });
menuItem.connect('toggled', Lang.bind(this, function(menuItem) {
if (menuItem.state) {
this._client.activate_connection(obj.connection, null, null, null);
// Immediately go back to disconnected, until NM tells us to change
menuItem.setToggleState(false);
} else if (obj.active) {
this._client.deactivate_connection(obj.active);
}
}));
if (obj.active) {
menuItem.setToggleState(obj.active.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
menuItem.setStatus(this.getStatusLabel(obj.active));
}
return menuItem;
},
_createSection: function() {
if (this._connections.length > 0) {
this.section.actor.show();
for(let j = 0; j < this._connections.length; ++j) {
let obj = this._connections[j];
obj.item = this._createConnectionItem(obj);
if (j >= NUM_VISIBLE_NETWORKS) {
if (!this._overflowItem) {
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
this.section.addMenuItem(this._overflowItem);
}
this._overflowItem.menu.addMenuItem(obj.item);
} else
this.section.addMenuItem(obj.item);
}
} else {
this.section.actor.hide()
}
},
_connectionStateChanged: function(vpnConnection, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
this.emit('activation-failed', reason);
}
let pos = this._findConnection(vpnConnection.uuid);
if (pos >= 0) {
let obj = this._connections[pos];
if (obj.item) {
obj.item.setToggleState(vpnConnection.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
obj.item.setStatus(this.getStatusLabel(vpnConnection));
}
} else {
log('Could not find connection for vpn-state-changed handler');
}
},
});
const NMApplet = new Lang.Class({
Name: 'NMApplet',
Extends: PanelMenu.SystemStatusButton,
@ -1567,7 +1629,44 @@ const NMApplet = new Lang.Class({
this.secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn-symbolic' }));
this.secondaryIcon.hide();
this._client = NMClient.Client.new();
// Device types
this._dtypes = { };
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless;
this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem;
this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth;
// TODO: WiMax support
// Connection types
this._ctypes = { };
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
NMClient.Client.new_async(null, Lang.bind(this, this._clientGot));
NMClient.RemoteSettings.new_async(null, null, Lang.bind(this, this._remoteSettingsGot));
},
_clientGot: function(obj, result) {
this._client = NMClient.Client.new_finish(result);
this._tryLateInit();
},
_remoteSettingsGot: function(obj, result) {
this._settings = NMClient.RemoteSettings.new_finish(result);
this._tryLateInit();
},
_tryLateInit: function() {
if (!this._client || !this._settings)
return;
this._statusSection = new PopupMenu.PopupMenuSection();
this._statusItem = new PopupMenu.PopupMenuItem('', { reactive: false });
@ -1622,56 +1721,23 @@ const NMApplet = new Lang.Class({
this.menu.addMenuItem(this._devices.wwan.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._devices.vpn = {
section: new PopupMenu.PopupMenuSection(),
device: this._makeWrapperDevice(NMDeviceVPN, null),
item: new NMWiredSectionTitleMenuItem(_("VPN Connections"))
};
this._devices.vpn.section.addMenuItem(this._devices.vpn.item);
this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section);
this._devices.vpn.section.actor.hide();
this.menu.addMenuItem(this._devices.vpn.section);
this._vpnSection = new NMVPNSection(this._client, this._connections);
this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
this.menu.addMenuItem(this._vpnSection.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
// Device types
this._dtypes = { };
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless;
this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem;
this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth;
// TODO: WiMax support
this._readConnections();
this._readDevices();
this._syncNMState();
// Connection types
this._ctypes = { };
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
this._settings = NMClient.RemoteSettings.new(null);
this._connectionsReadId = this._settings.connect('connections-read', Lang.bind(this, function() {
this._readConnections();
this._readDevices();
this._syncNMState();
// Connect to signals late so that early signals don't find in inconsistent state
// and connect only once (this signal handler can be called again if NetworkManager goes up and down)
if (!this._inited) {
this._inited = true;
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon));
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
}
}));
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon));
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
},
_ensureSource: function() {
@ -1699,18 +1765,6 @@ const NMApplet = new Lang.Class({
},
_syncSectionTitle: function(category) {
if (category == NMConnectionCategory.VPN) {
// Special case VPN: it's only one device (and a fake one
// actually), and we don't show it if empty
let device = this._devices.vpn.device;
let section = this._devices.vpn.section;
let item = this._devices.vpn.item;
section.actor.visible = !device.empty;
item.updateForDevice(device);
return;
}
let devices = this._devices[category].devices;
let item = this._devices[category].item;
let section = this._devices[category].section;
@ -1758,17 +1812,20 @@ const NMApplet = new Lang.Class({
this._source.notify(device._notification);
},
_onActivationFailed: function(device, reason) {
// XXX: nm-applet has no special text depending on reason
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error-symbolic',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
},
_makeWrapperDevice: function(wrapperClass, device) {
let wrapper = new wrapperClass(this._client, device, this._connections);
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
// XXX: nm-applet has no special text depending on reason
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error-symbolic',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
}));
wrapper._activationFailedId = wrapper.connect('activation-failed',
Lang.bind(this, this._onActivationFailed));
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category);
}));
@ -1851,7 +1908,7 @@ const NMApplet = new Lang.Class({
for (let i = 0; i < closedConnections.length; i++) {
let active = closedConnections[i];
if (active._primaryDevice) {
active._primaryDevice.setActiveConnection(null);
active._primaryDevice.clearActiveConnection(active);
active._primaryDevice = null;
}
if (active._inited) {
@ -1918,7 +1975,7 @@ const NMApplet = new Lang.Class({
}
}
} else
a._primaryDevice = this._devices.vpn.device
a._primaryDevice = this._vpnSection;
if (a._primaryDevice)
a._primaryDevice.setActiveConnection(a);
@ -2000,8 +2057,7 @@ const NMApplet = new Lang.Class({
let section = connection._section;
if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.removeConnection(connection);
this._syncSectionTitle(section);
this._vpnSection.removeConnection(connection);
} else if (section != NMConnectionCategory.INVALID) {
let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++)
@ -2024,8 +2080,7 @@ const NMApplet = new Lang.Class({
if (section == NMConnectionCategory.INVALID)
return;
if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.checkConnection(connection);
this._syncSectionTitle(section);
this._vpnSection.checkConnection(connection);
} else {
let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++) {
@ -2051,7 +2106,6 @@ const NMApplet = new Lang.Class({
this._syncSectionTitle(NMConnectionCategory.WIRED);
this._syncSectionTitle(NMConnectionCategory.WIRELESS);
this._syncSectionTitle(NMConnectionCategory.WWAN);
this._syncSectionTitle(NMConnectionCategory.VPN);
},
_syncNMState: function() {

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const St = imports.gi.St;
@ -45,7 +46,16 @@ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
<property name="Icon" type="s" access="read" />
</interface>;
const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface);
const PowerManagerProxy = new Gio.DBusProxyClass({
Name: 'PowerManagerProxy',
Interface: PowerManagerInterface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: BUS_NAME,
g_object_path: OBJECT_PATH });
}
});
const Indicator = new Lang.Class({
Name: 'PowerIndicator',
@ -54,7 +64,7 @@ const Indicator = new Lang.Class({
_init: function() {
this.parent('battery-missing-symbolic', _("Battery"));
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
this._proxy = new PowerManagerProxy();
this._deviceItems = [ ];
this._hasPrimary = false;
@ -73,18 +83,26 @@ const Indicator = new Lang.Class({
this._proxy.connect('g-properties-changed',
Lang.bind(this, this._devicesChanged));
this._devicesChanged();
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._devicesChanged();
}));
},
_readPrimaryDevice: function() {
this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) {
if (error) {
this._proxy.GetPrimaryDeviceRemote(null, Lang.bind(this, function(proxy, result) {
let device_id, device_type, icon, percentage, state, seconds;
try {
[[device_id, device_type, icon, percentage, state, seconds]] =
proxy.GetPrimaryDeviceFinish(result);
} catch(e) {
this._hasPrimary = false;
this._primaryDeviceId = null;
this._batteryItem.actor.hide();
return;
}
let [[device_id, device_type, icon, percentage, state, seconds]] = result;
if (device_type == UPDeviceType.BATTERY) {
this._hasPrimary = true;
let time = Math.round(seconds / 60);
@ -121,16 +139,18 @@ const Indicator = new Lang.Class({
},
_readOtherDevices: function() {
this._proxy.GetDevicesRemote(Lang.bind(this, function(result, error) {
this._proxy.GetDevicesRemote(null, Lang.bind(this, function(proxy, result) {
this._deviceItems.forEach(function(i) { i.destroy(); });
this._deviceItems = [];
if (error) {
let devices;
try {
[devices] = proxy.GetDevicesFinish(result);
} catch(e) {
return;
}
let position = 0;
let [devices] = result;
for (let i = 0; i < devices.length; i++) {
let [device_id, device_type] = devices[i];
if (device_type == UPDeviceType.AC_POWER || device_id == this._primaryDeviceId)

View File

@ -208,9 +208,13 @@ const UnlockDialog = new Lang.Class({
},
_showMessage: function(userVerifier, message, styleClass) {
this._promptMessage.text = message;
this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
if (message) {
this._promptMessage.text = message;
this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
} else {
GdmUtil.fadeOutActor(this._promptMessage);
}
},
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
@ -278,6 +282,7 @@ const UnlockDialog = new Lang.Class({
this._currentQuery = null;
this._firstQuestion = true;
this._promptEntry.text = '';
this._promptEntry.clutter_text.set_password_char('\u25cf');
this._promptEntry.menu.isPassword = true;

View File

@ -26,6 +26,7 @@ const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const LOCK_ENABLED_KEY = 'lock-enabled';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const DIALOG_ICON_SIZE = 64;
@ -187,15 +188,19 @@ const IMStatusChooserItem = new Lang.Class({
item = new IMStatusItem(_("Idle"), 'user-idle-symbolic');
this._combo.addMenuItem(item, IMStatus.IDLE);
item = new IMStatusItem(_("Unavailable"), 'user-offline-symbolic');
item = new IMStatusItem(_("Offline"), 'user-offline-symbolic');
this._combo.addMenuItem(item, IMStatus.OFFLINE);
this._combo.connect('active-item-changed',
Lang.bind(this, this._changeIMStatus));
this._presence = new GnomeSession.Presence();
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._sessionStatusChanged(status);
this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
obj.init_finish(result);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._sessionStatusChanged(status);
}));
}));
this._sessionPresenceRestored = false;
@ -479,14 +484,33 @@ const UserMenuButton = new Lang.Class({
this._userManager = AccountsService.UserManager.get_default();
this._user = this._userManager.get_user(GLib.get_user_name());
this._presence = new GnomeSession.Presence();
this._session = new GnomeSession.SessionManager();
this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._updateSwitch(this._presence.status);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) {
this._updateSwitch(status);
}));
}));
let session = new GnomeSession.SessionManager();
session.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
// This should never fail.
proxy.init_finish(result);
this._session = proxy;
this._updateHaveShutdown();
}));
this._haveShutdown = true;
this._haveSuspend = true;
this._accountMgr = Tp.AccountManager.dup();
this._loginManager = LoginManager.getLoginManager();
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
}));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._iconBox = new St.Bin();
@ -532,11 +556,6 @@ const UserMenuButton = new Lang.Class({
this._createSubMenu();
this._updateSwitch(this._presence.status);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) {
this._updateSwitch(status);
}));
this._userManager.connect('notify::is-loaded',
Lang.bind(this, this._updateMultiUser));
this._userManager.connect('notify::has-multiple-users',
@ -616,10 +635,13 @@ const UserMenuButton = new Lang.Class({
_updateLogout: function() {
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY);
let systemAccount = this._user.system_account;
let localAccount = this._user.local_account;
let multiUser = this._userManager.has_multiple_users;
let multiSession = Gdm.get_session_ids().length > 1;
this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession);
this._logoutItem.actor.visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount);
},
_updateLockScreen: function() {
@ -633,17 +655,29 @@ const UserMenuButton = new Lang.Class({
},
_updateHaveShutdown: function() {
this._session.CanShutdownRemote(Lang.bind(this,
function(result, error) {
if (!error) {
this._haveShutdown = result[0];
this._updateInstallUpdates();
this._updateSuspendOrPowerOff();
}
}));
if (!this._session) {
this._haveShutdown = false;
return;
}
this._session.CanShutdownRemote(null, Lang.bind(this, function(proxy, result) {
try {
[this._haveShutdown] = proxy.CanShutdownFinish(result);
} catch(e) {
this._haveShutdown = false;
}
this._updateInstallUpdates();
this._updateSuspendOrPowerOff();
}));
},
_updateHaveSuspend: function() {
if (!this._loginManager) {
this._haveSuspend = false;
return;
}
this._loginManager.canSuspend(Lang.bind(this,
function(result) {
this._haveSuspend = result;
@ -833,14 +867,17 @@ const UserMenuButton = new Lang.Class({
_onQuitSessionActivate: function() {
Main.overview.hide();
this._session.LogoutRemote(0);
if (this._session)
this._session.LogoutRemote(0, null, null);
},
_onInstallUpdatesActivate: function() {
Main.overview.hide();
Util.spawn(['pkexec', '/usr/libexec/pk-trigger-offline-update']);
this._session.RebootRemote();
if (this._haveShutdown)
this._session.RebootRemote(null, null);
},
_onSuspendOrPowerOffActivate: function() {
@ -848,8 +885,8 @@ const UserMenuButton = new Lang.Class({
if (this._haveShutdown &&
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
this._session.ShutdownRemote();
} else {
this._session.ShutdownRemote(null, null);
} else if (this._haveSuspend) {
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
Main.screenShield.disconnect(tmpId);

View File

@ -159,6 +159,24 @@ const WindowClone = new Lang.Class({
this._selected = false;
},
get slot() {
let x, y, w, h;
if (this.inDrag) {
x = this.dragOrigX;
y = this.dragOrigY;
w = this.actor.width * this.dragOrigScale;
h = this.actor.height * this.dragOrigScale;
} else {
x = this.actor.x;
y = this.actor.y;
w = this.actor.width * this.actor.scale_x;
h = this.actor.height * this.actor.scale_y;
}
return [x, y, w, h];
},
setStackAbove: function (actor) {
this._stackAbove = actor;
if (this.inDrag || this._zooming)
@ -435,6 +453,11 @@ const WindowOverlay = new Lang.Class({
this._updateCaptionId = metaWindow.connect('notify::title',
Lang.bind(this, function(w) {
this.title.text = w.title;
// we need this for the next call to get_preferred_width
// to return useful results
this.title.set_size(-1, -1);
this._repositionSelf();
}));
let button = new St.Button({ style_class: 'window-close' });
@ -501,6 +524,11 @@ const WindowOverlay = new Lang.Class({
this.title.height + this.title._spacing];
},
_repositionSelf: function() {
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
},
/**
* @cloneX: x position of windowClone
* @cloneY: y position of windowClone
@ -538,9 +566,8 @@ const WindowOverlay = new Lang.Class({
else
button.set_position(Math.floor(buttonX), Math.floor(buttonY));
if (!title.fullWidth)
title.fullWidth = title.width;
let titleWidth = Math.min(title.fullWidth, cloneWidth);
let [titleMinWidth, titleNatWidth] = title.get_preferred_width(-1);
let titleWidth = Math.max(titleMinWidth, Math.min(titleNatWidth, cloneWidth));
let titleX = cloneX + (cloneWidth - titleWidth) / 2;
let titleY = cloneY + cloneHeight + title._spacing;

View File

@ -708,7 +708,7 @@ msgstr "ارسال در <b>%A</b>, <b>%B %d</b>, %Y"
#: ../js/ui/components/telepathyClient.js:988
#, c-format
msgid "%s is now known as %s"
msgstr "%s با عنوان %s شناخته می‌شود"
msgstr "%s با عنوان %s شناخته می‌شود"
#. translators: argument is a room name like
#. * room@jabber.org for example.
@ -723,7 +723,7 @@ msgstr "دعوتنامه به %s"
#: ../js/ui/components/telepathyClient.js:1096
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s از شما دعوت می‌کند که به %s بپیوندید"
msgstr "%s از شما دعوت می‌کند که به %s بپیوندید"
#: ../js/ui/components/telepathyClient.js:1098
#: ../js/ui/components/telepathyClient.js:1177
@ -767,13 +767,13 @@ msgstr "پاسخگویی"
#: ../js/ui/components/telepathyClient.js:1171
#, c-format
msgid "%s is sending you %s"
msgstr "%s در حال ارسال %s به شما است"
msgstr "%s در حال ارسال %s به شما است"
#. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s اجازه دسترسی برای دیدن زمان‌هایی که شما برخط هستید را دارد"
msgstr "%s اجازه دسترسی برای دیدن زمان‌هایی که شما برخط هستید را دارد"
#: ../js/ui/components/telepathyClient.js:1298
msgid "Network error"
@ -938,8 +938,8 @@ msgstr ""
#, c-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
#: ../js/ui/endSessionDialog.js:70
#, c-format
@ -1698,7 +1698,7 @@ msgstr ""
#: ../js/ui/wanda.js:121
#, c-format
msgid "%s the Oracle says"
msgstr "%s پیشگو می‌گوید"
msgstr "%s پیشگو می‌گوید"
#: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg"
@ -1852,16 +1852,16 @@ msgstr "محاوره تایید هویت از طرف کاربر رد شد"
#~ msgstr "شبکه"
#~ msgid "%s is online."
#~ msgstr "%s بر خط است."
#~ msgstr "%s بر خط است."
#~ msgid "%s is offline."
#~ msgstr "%s برون خط است."
#~ msgstr "%s برون خط است."
#~ msgid "%s is away."
#~ msgstr "%s غایب است."
#~ msgstr "%s غایب است."
#~ msgid "%s is busy."
#~ msgstr "%s مشغول است."
#~ msgstr "%s مشغول است."
#~ msgid "Hidden"
#~ msgstr "نامرئی"

View File

@ -351,12 +351,12 @@ msgstr "הוספה למועדפים"
#: ../js/ui/appFavorites.js:87
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s נוסף למועדפים שלך."
msgstr "%s נוסף למועדפים שלך."
#: ../js/ui/appFavorites.js:118
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s הוסר מהמועדפים שלך."
msgstr "%s הוסר מהמועדפים שלך."
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
@ -751,13 +751,13 @@ msgstr "מענה"
#: ../js/ui/components/telepathyClient.js:1171
#, c-format
msgid "%s is sending you %s"
msgstr "%s שולח/ת אליך %s"
msgstr "%s שולח/ת אליך %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
#: ../js/ui/components/telepathyClient.js:1298
msgid "Network error"
@ -1017,7 +1017,7 @@ msgstr "לא מותקנות הרחבות"
#: ../js/ui/lookingGlass.js:745
#, c-format
msgid "%s has not emitted any errors."
msgstr "%s לא העלה שגיאות כלשהן."
msgstr "%s לא העלה שגיאות כלשהן."
#: ../js/ui/lookingGlass.js:751
msgid "Hide Errors"
@ -1436,7 +1436,7 @@ msgstr "חיוג אוטומטי"
#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476
#, c-format
msgid "Auto %s"
msgstr "%s אוטומטי"
msgstr "%s אוטומטי"
#: ../js/ui/status/network.js:855
msgid "Auto bluetooth"
@ -1688,7 +1688,7 @@ msgstr ""
#: ../js/ui/wanda.js:123
#, c-format
msgid "%s the Oracle says"
msgstr "%s, כה אמרה האוראקל"
msgstr "%s, כה אמרה האוראקל"
#: ../js/ui/wanda.js:164
msgid "Your favorite Easter Egg"
@ -1697,7 +1697,7 @@ msgstr "ביצת הפסחא האהובה עליך"
#: ../js/ui/windowAttentionHandler.js:19
#, c-format
msgid "'%s' is ready"
msgstr "'%s' מוכן"
msgstr "'%s' מוכן"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
@ -1845,16 +1845,16 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#~ msgstr "רשת"
#~ msgid "%s is online."
#~ msgstr "%s התחבר/ה."
#~ msgstr "%s התחבר/ה."
#~ msgid "%s is offline."
#~ msgstr "%s התנתק/ה."
#~ msgstr "%s התנתק/ה."
#~ msgid "%s is away."
#~ msgstr "'%s' מרוחק/ת."
#~ msgstr "'%s' מרוחק/ת."
#~ msgid "%s is busy."
#~ msgstr "%s עסוק/ה."
#~ msgstr "%s עסוק/ה."
#~ msgid "Hidden"
#~ msgstr "מוסתר"
@ -1887,7 +1887,7 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#~ msgstr "הצגת ססמה"
#~ msgid "%s has finished starting"
#~ msgstr "%s סיים את תהליך ההתחלה"
#~ msgstr "%s סיים את תהליך ההתחלה"
#~ msgid "Home Folder"
#~ msgstr "תיקיית הבית"

244
po/pl.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-09-25 15:12+0200\n"
"PO-Revision-Date: 2012-09-25 15:13+0200\n"
"POT-Creation-Date: 2012-10-31 19:12+0100\n"
"PO-Revision-Date: 2012-10-31 19:13+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n"
@ -142,62 +142,74 @@ msgstr ""
"użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Wyświetlanie elementu menu \"Wyloguj się\" w menu użytkownika."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"Ten klucz zastępuje automatyczne ukrywanie elementu menu \"Wyloguj się\" w "
"sytuacji, gdy istnieje tylko jeden użytkownik i jedna sesja."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show the week date in the calendar"
msgstr "Wyświetlanie dnia tygodnia w kalendarzu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar."
msgstr ""
"Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w "
"formacie ISO."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu"
msgstr "Skrót do otwarcia menu programu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the application menu."
msgstr "Skrót do otwarcia menu programu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder"
msgstr "Skrót do przełączenia nagrywania ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use"
msgstr "Której klawiatury używać"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use."
msgstr "Typ używanej klawiatury."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts."
msgstr "Liczba klatek na sekundę do nagrywania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -222,11 +234,11 @@ msgstr ""
"i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na "
"odgadniętą optymalną liczbę wątków dla komputera."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast"
msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
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 "
@ -252,11 +264,11 @@ msgstr ""
"Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola "
"wyboru."
#: ../js/gdm/loginDialog.js:528
#: ../js/gdm/loginDialog.js:529
msgid "Session..."
msgstr "Sesja..."
#: ../js/gdm/loginDialog.js:676
#: ../js/gdm/loginDialog.js:677
msgctxt "title"
msgid "Sign In"
msgstr "Proszę się zalogować"
@ -264,23 +276,23 @@ msgstr "Proszę się zalogować"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:743
#: ../js/gdm/loginDialog.js:736
msgid "Not listed?"
msgstr "Inny użytkownik?"
#: ../js/gdm/loginDialog.js:896 ../js/ui/components/networkAgent.js:137
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../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:166
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel"
msgstr "Anuluj"
#: ../js/gdm/loginDialog.js:901
#: ../js/gdm/loginDialog.js:894
msgctxt "button"
msgid "Sign In"
msgstr "Zaloguj"
#: ../js/gdm/loginDialog.js:1240
#: ../js/gdm/loginDialog.js:1215
msgid "Login Window"
msgstr "Okno logowania"
@ -289,8 +301,8 @@ msgstr "Okno logowania"
msgid "Power"
msgstr "Zasilanie"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
#: ../js/ui/userMenu.js:778
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:779
msgid "Suspend"
msgstr "Uśpij"
@ -298,8 +310,8 @@ msgstr "Uśpij"
msgid "Restart"
msgstr "Uruchom ponownie"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667
#: ../js/ui/userMenu.js:777
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:778
msgid "Power Off"
msgstr "Wyłącz komputer"
@ -350,7 +362,7 @@ msgstr "Ustawienia"
msgid "New Window"
msgstr "Nowe okno"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites"
msgstr "Usuń z ulubionych"
@ -514,16 +526,16 @@ msgstr "Ten tydzień"
msgid "Next week"
msgstr "Następny tydzień"
#: ../js/ui/components/autorunManager.js:278
#: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices"
msgstr "Urządzenia wymienne"
#: ../js/ui/components/autorunManager.js:575
#: ../js/ui/components/autorunManager.js:594
#, c-format
msgid "Open with %s"
msgstr "Otwórz za pomocą %s"
#: ../js/ui/components/autorunManager.js:601
#: ../js/ui/components/autorunManager.js:620
msgid "Eject"
msgstr "Wysuń"
@ -680,35 +692,35 @@ msgstr "Wycisz"
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/components/telepathyClient.js:948
#: ../js/ui/components/telepathyClient.js:950
#, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Wysłano w dniu <b>%e %b</b> o godzinie <b>%H:%M</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year.
#: ../js/ui/components/telepathyClient.js:954
#: ../js/ui/components/telepathyClient.js:956
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Wysłano w dniu <b>%d %B</b>, <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year.
#: ../js/ui/components/telepathyClient.js:959
#: ../js/ui/components/telepathyClient.js:961
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Wysłano w dniu <b>%d %B</b> %Y, <b>%A</b>"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/components/telepathyClient.js:988
#: ../js/ui/components/telepathyClient.js:990
#, c-format
msgid "%s is now known as %s"
msgstr "Użytkownik %s jest teraz znany jako %s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088
#: ../js/ui/components/telepathyClient.js:1090
#, c-format
msgid "Invitation to %s"
msgstr "Zaproszenie do pokoju %s"
@ -716,42 +728,42 @@ msgstr "Zaproszenie do pokoju %s"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/components/telepathyClient.js:1096
#: ../js/ui/components/telepathyClient.js:1098
#, c-format
msgid "%s is inviting you to join %s"
msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s"
#: ../js/ui/components/telepathyClient.js:1098
#: ../js/ui/components/telepathyClient.js:1177
#: ../js/ui/components/telepathyClient.js:1240
#: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1242
msgid "Decline"
msgstr "Odmów"
#: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1241
#: ../js/ui/components/telepathyClient.js:1101
#: ../js/ui/components/telepathyClient.js:1180
#: ../js/ui/components/telepathyClient.js:1243
msgid "Accept"
msgstr "Zaakceptuj"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129
#: ../js/ui/components/telepathyClient.js:1131
#, c-format
msgid "Video call from %s"
msgstr "Wideorozmowa z użytkownikiem %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132
#: ../js/ui/components/telepathyClient.js:1134
#, c-format
msgid "Call from %s"
msgstr "Rozmowa z użytkownikiem %s"
#: ../js/ui/components/telepathyClient.js:1137
#: ../js/ui/components/telepathyClient.js:1139
#: ../js/ui/status/bluetooth.js:346
msgid "Reject"
msgstr "Odrzuć"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139
#: ../js/ui/components/telepathyClient.js:1141
msgid "Answer"
msgstr "Odbierz"
@ -760,111 +772,111 @@ msgstr "Odbierz"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/components/telepathyClient.js:1171
#: ../js/ui/components/telepathyClient.js:1173
#, c-format
msgid "%s is sending you %s"
msgstr "Użytkownik %s przysyła plik %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206
#: ../js/ui/components/telepathyClient.js:1208
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu"
#: ../js/ui/components/telepathyClient.js:1298
#: ../js/ui/components/telepathyClient.js:1300
msgid "Network error"
msgstr "Błąd sieci"
#: ../js/ui/components/telepathyClient.js:1300
#: ../js/ui/components/telepathyClient.js:1302
msgid "Authentication failed"
msgstr "Uwierzytelnienie się nie powiodło"
#: ../js/ui/components/telepathyClient.js:1302
#: ../js/ui/components/telepathyClient.js:1304
msgid "Encryption error"
msgstr "Błąd szyfrowania"
#: ../js/ui/components/telepathyClient.js:1304
#: ../js/ui/components/telepathyClient.js:1306
msgid "Certificate not provided"
msgstr "Nie podano certyfikatu"
#: ../js/ui/components/telepathyClient.js:1306
#: ../js/ui/components/telepathyClient.js:1308
msgid "Certificate untrusted"
msgstr "Certyfikat jest niezaufany"
#: ../js/ui/components/telepathyClient.js:1308
#: ../js/ui/components/telepathyClient.js:1310
msgid "Certificate expired"
msgstr "Certyfikat wygasł"
#: ../js/ui/components/telepathyClient.js:1310
#: ../js/ui/components/telepathyClient.js:1312
msgid "Certificate not activated"
msgstr "Certyfikat nie został aktywowany"
#: ../js/ui/components/telepathyClient.js:1312
#: ../js/ui/components/telepathyClient.js:1314
msgid "Certificate hostname mismatch"
msgstr "Nazwa komputera certyfikatu się nie zgadza"
#: ../js/ui/components/telepathyClient.js:1314
#: ../js/ui/components/telepathyClient.js:1316
msgid "Certificate fingerprint mismatch"
msgstr "Odcisk palca certyfikatu się nie zgadza"
#: ../js/ui/components/telepathyClient.js:1316
#: ../js/ui/components/telepathyClient.js:1318
msgid "Certificate self-signed"
msgstr "Certyfikat został samodzielnie podpisany"
#: ../js/ui/components/telepathyClient.js:1318
#: ../js/ui/components/telepathyClient.js:1320
msgid "Status is set to offline"
msgstr "Stan jest ustawiony na offline"
#: ../js/ui/components/telepathyClient.js:1320
#: ../js/ui/components/telepathyClient.js:1322
msgid "Encryption is not available"
msgstr "Szyfrowanie jest niedostępne"
#: ../js/ui/components/telepathyClient.js:1322
#: ../js/ui/components/telepathyClient.js:1324
msgid "Certificate is invalid"
msgstr "Certyfikat jest nieprawidłowy"
#: ../js/ui/components/telepathyClient.js:1324
#: ../js/ui/components/telepathyClient.js:1326
msgid "Connection has been refused"
msgstr "Odrzucono połączenie"
#: ../js/ui/components/telepathyClient.js:1326
#: ../js/ui/components/telepathyClient.js:1328
msgid "Connection can't be established"
msgstr "Nie można nawiązać połączenia"
#: ../js/ui/components/telepathyClient.js:1328
#: ../js/ui/components/telepathyClient.js:1330
msgid "Connection has been lost"
msgstr "Utracono połączenie"
#: ../js/ui/components/telepathyClient.js:1330
#: ../js/ui/components/telepathyClient.js:1332
msgid "This account is already connected to the server"
msgstr "To konto jest już połączone z serwerem"
#: ../js/ui/components/telepathyClient.js:1332
#: ../js/ui/components/telepathyClient.js:1334
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr ""
"Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu"
#: ../js/ui/components/telepathyClient.js:1334
#: ../js/ui/components/telepathyClient.js:1336
msgid "The account already exists on the server"
msgstr "Konto już istnieje na serwerze"
#: ../js/ui/components/telepathyClient.js:1336
#: ../js/ui/components/telepathyClient.js:1338
msgid "Server is currently too busy to handle the connection"
msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie"
#: ../js/ui/components/telepathyClient.js:1338
#: ../js/ui/components/telepathyClient.js:1340
msgid "Certificate has been revoked"
msgstr "Certyfikat został unieważniony"
#: ../js/ui/components/telepathyClient.js:1340
#: ../js/ui/components/telepathyClient.js:1342
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest "
"kryptograficznie słaby"
#: ../js/ui/components/telepathyClient.js:1342
#: ../js/ui/components/telepathyClient.js:1344
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@ -872,30 +884,30 @@ msgstr ""
"Długość certyfikatu serwera lub głębokość jego łańcucha przekracza "
"ograniczenia nałożone przez bibliotekę kryptograficzną"
#: ../js/ui/components/telepathyClient.js:1344
#: ../js/ui/components/telepathyClient.js:1346
msgid "Internal error"
msgstr "Błąd wewnętrzny"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354
#: ../js/ui/components/telepathyClient.js:1356
#, c-format
msgid "Connection to %s failed"
msgstr "Połączenie z kontem %s się nie powiodło"
#: ../js/ui/components/telepathyClient.js:1363
#: ../js/ui/components/telepathyClient.js:1365
msgid "Reconnect"
msgstr "Połącz ponownie"
#: ../js/ui/components/telepathyClient.js:1364
#: ../js/ui/components/telepathyClient.js:1366
msgid "Edit account"
msgstr "Modyfikuj konto"
#: ../js/ui/components/telepathyClient.js:1409
#: ../js/ui/components/telepathyClient.js:1411
msgid "Unknown reason"
msgstr "Nieznana przyczyna"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273
#: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications"
msgstr "Wyświetl programy"
@ -903,14 +915,14 @@ msgstr "Wyświetl programy"
msgid "Date and Time Settings"
msgstr "Ustawienia daty i czasu"
#: ../js/ui/dateMenu.js:109
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "Otwórz kalendarz"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:175
#: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y"
@ -1075,23 +1087,23 @@ msgstr "Wyświetl źródło"
msgid "Web Page"
msgstr "Strona WWW"
#: ../js/ui/messageTray.js:1081
#: ../js/ui/messageTray.js:1084
msgid "Open"
msgstr "Otwórz"
#: ../js/ui/messageTray.js:1088
#: ../js/ui/messageTray.js:1091
msgid "Remove"
msgstr "Usuń"
#: ../js/ui/messageTray.js:2088
#: ../js/ui/messageTray.js:1543
msgid "Message Tray"
msgstr "Obszar powiadamiania"
#: ../js/ui/messageTray.js:2551
#: ../js/ui/messageTray.js:2549
msgid "System Information"
msgstr "Informacje systemowe"
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
msgctxt "program"
msgid "Unknown"
msgstr "Nieznany"
@ -1147,7 +1159,7 @@ msgstr "Proszę wprowadzić polecenie:"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:79
#: ../js/ui/screenShield.js:80
msgid "%A, %B %d"
msgstr "%A, %e %B"
@ -1199,7 +1211,7 @@ msgstr "Hasło"
msgid "Remember Password"
msgstr "Zapamiętanie hasła"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock"
msgstr "Odblokuj"
@ -1614,67 +1626,63 @@ msgstr "Głośność"
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:176
#: ../js/ui/unlockDialog.js:177
msgid "Log in as another user"
msgstr "Zaloguj jako inny użytkownik"
#: ../js/ui/userMenu.js:180
#: ../js/ui/userMenu.js:181
msgid "Available"
msgstr "Dostępny"
#: ../js/ui/userMenu.js:183
#: ../js/ui/userMenu.js:184
msgid "Busy"
msgstr "Zajęty"
#: ../js/ui/userMenu.js:186
#: ../js/ui/userMenu.js:187
msgid "Invisible"
msgstr "Niewidoczny"
#: ../js/ui/userMenu.js:189
#: ../js/ui/userMenu.js:190
msgid "Away"
msgstr "Nieobecny"
#: ../js/ui/userMenu.js:192
#: ../js/ui/userMenu.js:193
msgid "Idle"
msgstr "Bezczynny"
#: ../js/ui/userMenu.js:195
#: ../js/ui/userMenu.js:196
msgid "Unavailable"
msgstr "Niedostępny"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Przełącz sesję"
#: ../js/ui/userMenu.js:743
#: ../js/ui/userMenu.js:744
msgid "Notifications"
msgstr "Powiadomienia"
#: ../js/ui/userMenu.js:751
#: ../js/ui/userMenu.js:752
msgid "System Settings"
msgstr "Ustawienia systemu"
#: ../js/ui/userMenu.js:764
#: ../js/ui/userMenu.js:760
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/userMenu.js:765
msgid "Log Out"
msgstr "Wyloguj się"
#: ../js/ui/userMenu.js:769
#: ../js/ui/userMenu.js:770
msgid "Lock"
msgstr "Zablokuj ekran"
#: ../js/ui/userMenu.js:784
#: ../js/ui/userMenu.js:785
msgid "Install Updates & Restart"
msgstr "Zaktualizuj i uruchom ponownie"
#: ../js/ui/userMenu.js:802
#: ../js/ui/userMenu.js:803
msgid "Your chat status will be set to busy"
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
#: ../js/ui/userMenu.js:803
#: ../js/ui/userMenu.js:804
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."
@ -1696,7 +1704,7 @@ msgstr "Programy"
msgid "Search"
msgstr "Wyszukiwanie"
#: ../js/ui/wanda.js:119
#: ../js/ui/wanda.js:117
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1705,12 +1713,12 @@ msgstr ""
"Nic mądrego na dzisiaj:\n"
"%s"
#: ../js/ui/wanda.js:123
#: ../js/ui/wanda.js:121
#, c-format
msgid "%s the Oracle says"
msgstr "Wyrocznia %s przemawia"
#: ../js/ui/wanda.js:164
#: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg"
msgstr "Twój ulubiony żart"
@ -1747,23 +1755,23 @@ msgstr[2] "%u wejść"
msgid "System Sounds"
msgstr "Dźwięki systemowe"
#: ../src/main.c:330
#: ../src/main.c:332
msgid "Print version"
msgstr "Wyświetla wersję"
#: ../src/main.c:336
#: ../src/main.c:338
msgid "Mode used by GDM for login screen"
msgstr "Tryb używany przez GDM dla ekranu logowania"
#: ../src/main.c:342
#: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Używa podanego trybu, np. \"gdm\" dla ekranu logowania"
#: ../src/main.c:348
#: ../src/main.c:350
msgid "List possible modes"
msgstr "Wyświetla listę możliwych trybów"
#: ../src/shell-app.c:621
#: ../src/shell-app.c:622
#, c-format
msgid "Failed to launch '%s'"
msgstr "Uruchomienie \"%s\" się nie powiodło"

296
po/sk.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-10-18 16:51+0000\n"
"PO-Revision-Date: 2012-10-13 22:35+0100\n"
"POT-Creation-Date: 2012-10-27 16:22+0000\n"
"PO-Revision-Date: 2012-10-28 19:49+0000\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
@ -25,8 +25,6 @@ msgstr ""
msgid "Screenshots"
msgstr "Snímky obrazovky"
# PM: inde dianie na obrazovke
# DK:presne taketo nieco som chcel povedat ale nevedel som ako
#: ../data/50-gnome-shell-screenshot.xml.in.h:2
msgid "Record a screencast"
msgstr "Zaznamenať dianie na obrazovke"
@ -37,20 +35,16 @@ msgstr "Systém"
#: ../data/50-gnome-shell-system.xml.in.h:2
msgid "Show the message tray"
msgstr "Zobraz lištu správ"
msgstr "Zobrazí lištu správ"
# tooltip
#: ../data/50-gnome-shell-system.xml.in.h:3
#, fuzzy
#| msgid "Show Applications"
msgid "Show all applications"
msgstr "Zobrazí aplikácie"
msgstr "Zobrazí všetky aplikácie"
#: ../data/50-gnome-shell-system.xml.in.h:4
#, fuzzy
#| msgid "Keybinding to open the application menu"
msgid "Open the application menu"
msgstr "Klávesová skratka na otvorenie ponuky aplikácií"
msgstr "Otvorí ponuku aplikácií"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
@ -85,13 +79,9 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "Uuids of extensions to enable"
msgstr "Uuid identifikátory rozšírení určených na povolenie"
msgstr "Vlastnosť uuid rozšírení určených na povolenie"
# PM: nepáči sa mi konštrukcia viet, preklad vyznieva strojovo
# DK: uz lepsie?
# PM: lepšie ale nepáči sa mi org.gnome.Shell. mne sa vidí že to bude nejaký súbor a potom predložka na asi nebude dobre
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
#, fuzzy
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 "
@ -101,7 +91,7 @@ msgstr ""
"Rozšírenia pre GNOME Shell majú vlastnosť uuid; tento kľúč obsahuje zoznam "
"rozšírení, ktoré by mali byť načítané. Každé rozšírenie, ktoré je potrebné "
"načítať, musí byť v tomto zozname. Tento zoznam môžete upraviť aj ručne "
"pomocou metód DBus EnableExtension a DisableExtension na org.gnome.Shell."
"pomocou metód DBus EnableExtension a DisableExtension v org.gnome.Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage"
@ -176,17 +166,15 @@ msgid "Keybinding to open the application menu."
msgstr "Klávesová skratka na otvorenie ponuky aplikácií."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
#, fuzzy
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Klávesová skratka na otvorenie ponuky aplikácií"
msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#, fuzzy
#| msgid "Keybinding to open the application menu."
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Klávesová skratka na otvorenie ponuky aplikácií."
msgstr ""
"Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“ v prehľade "
"aktivít."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray"
@ -211,7 +199,7 @@ msgstr "Ktorú klávesnicu používať"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use."
msgstr "Typ klávesnice, ktorý sa má používať."
msgstr "Typ klávesnice, ktorá sa má používať."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts."
@ -273,6 +261,39 @@ msgstr ""
"základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného "
"formátu kontajneru by mala byť zmenená."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "Attach modal dialog to the parent window"
msgstr "Pripojiť modálne dialógové okno k rodičovskému oknu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "Tento kľúč preváži kľúč v org.gnome.mutter po spustení GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "Arrangement of buttons on the titlebar"
msgstr "Usporiadanie tlačidiel na titulku okna"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
msgstr ""
"Tento kľúč preváži kľúč v org.gnome.desktop.wm.preferences po spustení GNOME "
"Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Workspaces are managed dynamically"
msgstr "Pracovné priestory sú spravované dynamicky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Workspaces only on primary monitor"
msgstr "Pracovné priestory sú iba na primárnom monitore"
#: ../js/extensionPrefs/main.js:124
#, c-format
msgid "There was an error loading the preferences dialog for %s:"
@ -286,11 +307,11 @@ msgstr "Rozšírenie"
msgid "Select an extension to configure using the combobox above."
msgstr "Použitím ponuky vyberte rozšírenie na nastavenie"
#: ../js/gdm/loginDialog.js:529
#: ../js/gdm/loginDialog.js:560
msgid "Session..."
msgstr "Relácia..."
#: ../js/gdm/loginDialog.js:677
#: ../js/gdm/loginDialog.js:704
msgctxt "title"
msgid "Sign In"
msgstr "Prihlásenie"
@ -299,42 +320,42 @@ msgstr "Prihlásenie"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:736
#: ../js/gdm/loginDialog.js:763
msgid "Not listed?"
msgstr "Nie ste v zozname?"
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/gdm/loginDialog.js:901 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../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
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:168
msgid "Cancel"
msgstr "Zrušiť"
#: ../js/gdm/loginDialog.js:894
#: ../js/gdm/loginDialog.js:906
msgctxt "button"
msgid "Sign In"
msgstr "Prihlásiť sa"
#: ../js/gdm/loginDialog.js:1215
#: ../js/gdm/loginDialog.js:1217
msgid "Login Window"
msgstr "Prihlasovacie okno"
#. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:37
#: ../js/gdm/powerMenu.js:36
msgid "Power"
msgstr "Napájanie"
#: ../js/gdm/powerMenu.js:95 ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:659
#: ../js/ui/userMenu.js:770
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
#: ../js/ui/userMenu.js:778
msgid "Suspend"
msgstr "Uspať"
#: ../js/gdm/powerMenu.js:100
#: ../js/gdm/powerMenu.js:98
msgid "Restart"
msgstr "Reštartovať"
#: ../js/gdm/powerMenu.js:105 ../js/ui/userMenu.js:657
#: ../js/ui/userMenu.js:659 ../js/ui/userMenu.js:769
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:665
#: ../js/ui/userMenu.js:667 ../js/ui/userMenu.js:777
msgid "Power Off"
msgstr "Vypnúť"
@ -517,35 +538,35 @@ msgid "S"
msgstr "So"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:699
#: ../js/ui/calendar.js:700
msgid "Nothing Scheduled"
msgstr "Žiadne naplánované udalosti"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:715
#: ../js/ui/calendar.js:716
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:718
#: ../js/ui/calendar.js:719
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:728
#: ../js/ui/calendar.js:729
msgid "Today"
msgstr "Dnes"
#: ../js/ui/calendar.js:732
#: ../js/ui/calendar.js:733
msgid "Tomorrow"
msgstr "Zajtra"
#: ../js/ui/calendar.js:743
#: ../js/ui/calendar.js:744
msgid "This week"
msgstr "Tento týždeň"
#: ../js/ui/calendar.js:751
#: ../js/ui/calendar.js:752
msgid "Next week"
msgstr "Ďalší týždeň"
@ -553,10 +574,11 @@ msgstr "Ďalší týždeň"
msgid "Removable Devices"
msgstr "Vymeniteľné zariadenia"
# DK: doplnil som slovo "programu", aby to znelo prirodzenejsie. priklad:po pripojeni USB kluca bolo zobrazene "Otvoriť pomocou Súbory"
#: ../js/ui/components/autorunManager.js:591
#, c-format
msgid "Open with %s"
msgstr "Otvoriť pomocou %s"
msgstr "Otvoriť pomocou programu %s"
#: ../js/ui/components/autorunManager.js:617
msgid "Eject"
@ -623,7 +645,7 @@ msgstr ""
#: ../js/ui/components/networkAgent.js:314
msgid "Wired 802.1X authentication"
msgstr "Overenie totožnosti drôtovej 802.1X"
msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
#: ../js/ui/components/networkAgent.js:316
msgid "Network name: "
@ -631,7 +653,7 @@ msgstr "Názov siete: "
#: ../js/ui/components/networkAgent.js:321
msgid "DSL authentication"
msgstr "Overenie totožnosti DSL"
msgstr "Overenie totožnosti k DSL"
#: ../js/ui/components/networkAgent.js:328
msgid "PIN code required"
@ -639,7 +661,7 @@ msgstr "Požaduje sa kód PIN"
#: ../js/ui/components/networkAgent.js:329
msgid "PIN code is needed for the mobile broadband device"
msgstr "Pre zariadenie mobilnej siete je potrebný PIN kód"
msgstr "Pre zariadenie mobilnej siete je potrebný kód PIN"
#: ../js/ui/components/networkAgent.js:330
msgid "PIN: "
@ -647,7 +669,7 @@ msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:336
msgid "Mobile broadband network password"
msgstr "Heslo pre mobilnú sieť"
msgstr "Heslo k mobilnej sieti"
#: ../js/ui/components/networkAgent.js:337
#, c-format
@ -675,11 +697,12 @@ msgstr "Overiť totožnosť"
msgid "Sorry, that didn't work. Please try again."
msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
# %d je datum, %t je cas
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:44
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Záznam videa obrazovky z %d %t"
msgstr "Záznam videa obrazovky dňa %d o %t"
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
@ -714,44 +737,42 @@ msgid "Mute"
msgstr "Stlmiť"
#. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
#: ../js/ui/components/telepathyClient.js:941
#: ../js/ui/components/telepathyClient.js:943
#, no-c-format
msgid "<b>%H:%M</b> on Yesterday"
msgstr ""
msgstr "včera o <b>%H:%M</b>"
#. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
#: ../js/ui/components/telepathyClient.js:947
#, fuzzy, no-c-format
#| msgid "Sent at <b>%X</b> on <b>%A</b>"
#: ../js/ui/components/telepathyClient.js:949
#, no-c-format
msgid "<b>%H:%M</b> on <b>%A</b>"
msgstr "Čas odoslania: <b>%A</b>, <b>%R</b>"
msgstr "v <b>%A</b> o <b>%H:%M</b>"
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
#. shown when you get a chat message in the same year
#: ../js/ui/components/telepathyClient.js:953
#, fuzzy, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
#: ../js/ui/components/telepathyClient.js:955
#, no-c-format
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b>"
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>"
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year
#: ../js/ui/components/telepathyClient.js:958
#, fuzzy, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
#: ../js/ui/components/telepathyClient.js:960
#, no-c-format
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b> %Y"
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>, %Y"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/components/telepathyClient.js:986
#: ../js/ui/components/telepathyClient.js:988
#, c-format
msgid "%s is now known as %s"
msgstr "%s odteraz vystupuje ako %s"
msgstr "Kontakt %s odteraz vystupuje ako %s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1085
#: ../js/ui/components/telepathyClient.js:1087
#, c-format
msgid "Invitation to %s"
msgstr "Pozvánka do %s"
@ -759,42 +780,42 @@ msgstr "Pozvánka do %s"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/components/telepathyClient.js:1093
#: ../js/ui/components/telepathyClient.js:1095
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s vás pozýva aby ste sa pridali do %s"
msgstr "Kontakt %s vás pozýva aby ste sa pridali do %s"
#: ../js/ui/components/telepathyClient.js:1095
#: ../js/ui/components/telepathyClient.js:1174
#: ../js/ui/components/telepathyClient.js:1237
#: ../js/ui/components/telepathyClient.js:1097
#: ../js/ui/components/telepathyClient.js:1176
#: ../js/ui/components/telepathyClient.js:1239
msgid "Decline"
msgstr "Odmietnuť"
#: ../js/ui/components/telepathyClient.js:1096
#: ../js/ui/components/telepathyClient.js:1175
#: ../js/ui/components/telepathyClient.js:1238
#: ../js/ui/components/telepathyClient.js:1098
#: ../js/ui/components/telepathyClient.js:1177
#: ../js/ui/components/telepathyClient.js:1240
msgid "Accept"
msgstr "Prijať"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1126
#: ../js/ui/components/telepathyClient.js:1128
#, c-format
msgid "Video call from %s"
msgstr "Videohovor od používateľa %s"
msgstr "Videohovor od kontaktu %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129
#: ../js/ui/components/telepathyClient.js:1131
#, c-format
msgid "Call from %s"
msgstr "Hovor od používateľa %s"
msgstr "Hovor od kontaktu %s"
#: ../js/ui/components/telepathyClient.js:1134
#: ../js/ui/components/telepathyClient.js:1136
#: ../js/ui/status/bluetooth.js:346
msgid "Reject"
msgstr "Odmietnuť"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1136
#: ../js/ui/components/telepathyClient.js:1138
msgid "Answer"
msgstr "Prijať hovor"
@ -803,110 +824,111 @@ msgstr "Prijať hovor"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/components/telepathyClient.js:1168
#: ../js/ui/components/telepathyClient.js:1170
#, c-format
msgid "%s is sending you %s"
msgstr "%s vám posiela %s"
msgstr "Kontakt %s vám posiela %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1203
#: ../js/ui/components/telepathyClient.js:1205
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s by chcel získať oprávnenie vidieť, kedy ste pripojený"
msgstr ""
"Kontakt %s by chcel získať oprávnenie vidieť, kedy ste pripojený"
#: ../js/ui/components/telepathyClient.js:1295
#: ../js/ui/components/telepathyClient.js:1297
msgid "Network error"
msgstr "Chyba siete"
#: ../js/ui/components/telepathyClient.js:1297
#: ../js/ui/components/telepathyClient.js:1299
msgid "Authentication failed"
msgstr "Overenie totožnosti zlyhalo"
#: ../js/ui/components/telepathyClient.js:1299
#: ../js/ui/components/telepathyClient.js:1301
msgid "Encryption error"
msgstr "Chyba šifrovania"
#: ../js/ui/components/telepathyClient.js:1301
#: ../js/ui/components/telepathyClient.js:1303
msgid "Certificate not provided"
msgstr "Neposkytnutý certifikát"
#: ../js/ui/components/telepathyClient.js:1303
#: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate untrusted"
msgstr "Nedôveryhodný certifikát"
#: ../js/ui/components/telepathyClient.js:1305
#: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate expired"
msgstr "Certifikát s ukončenou platnosťou"
#: ../js/ui/components/telepathyClient.js:1307
#: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate not activated"
msgstr "Neaktivovaný certifikát"
#: ../js/ui/components/telepathyClient.js:1309
#: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate hostname mismatch"
msgstr "Certifikát s nesúhlasným názvom hostiteľa"
#: ../js/ui/components/telepathyClient.js:1311
#: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate fingerprint mismatch"
msgstr "Certifikát s nesúhlasným odtlačkom"
#: ../js/ui/components/telepathyClient.js:1313
#: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate self-signed"
msgstr "Sebou podpísaný certifikát"
#: ../js/ui/components/telepathyClient.js:1315
#: ../js/ui/components/telepathyClient.js:1317
msgid "Status is set to offline"
msgstr "Stav je nastavený na odhlásený"
#: ../js/ui/components/telepathyClient.js:1317
#: ../js/ui/components/telepathyClient.js:1319
msgid "Encryption is not available"
msgstr "Šifrovanie nie je dostupné"
#: ../js/ui/components/telepathyClient.js:1319
#: ../js/ui/components/telepathyClient.js:1321
msgid "Certificate is invalid"
msgstr "Certifikát je neplatný"
#: ../js/ui/components/telepathyClient.js:1321
#: ../js/ui/components/telepathyClient.js:1323
msgid "Connection has been refused"
msgstr "Pripojenie bolo odmietnuté"
#: ../js/ui/components/telepathyClient.js:1323
#: ../js/ui/components/telepathyClient.js:1325
msgid "Connection can't be established"
msgstr "Nedá sa nadviazať spojenie"
#: ../js/ui/components/telepathyClient.js:1325
#: ../js/ui/components/telepathyClient.js:1327
msgid "Connection has been lost"
msgstr "Spojenie sa stratilo"
#: ../js/ui/components/telepathyClient.js:1327
#: ../js/ui/components/telepathyClient.js:1329
msgid "This account is already connected to the server"
msgstr "Tento účet je už pripojený k serveru"
#: ../js/ui/components/telepathyClient.js:1329
#: ../js/ui/components/telepathyClient.js:1331
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj"
#: ../js/ui/components/telepathyClient.js:1331
#: ../js/ui/components/telepathyClient.js:1333
msgid "The account already exists on the server"
msgstr "Účet na serveri už existuje"
#: ../js/ui/components/telepathyClient.js:1333
#: ../js/ui/components/telepathyClient.js:1335
msgid "Server is currently too busy to handle the connection"
msgstr "Server je momentálne príliš zaneprázdnený na zvládnutie pripojenia"
#: ../js/ui/components/telepathyClient.js:1335
#: ../js/ui/components/telepathyClient.js:1337
msgid "Certificate has been revoked"
msgstr "Certifikát bol zrušený"
#: ../js/ui/components/telepathyClient.js:1337
#: ../js/ui/components/telepathyClient.js:1339
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je "
"kryptograficky slabý"
#: ../js/ui/components/telepathyClient.js:1339
#: ../js/ui/components/telepathyClient.js:1341
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@ -914,26 +936,26 @@ msgstr ""
"Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera presahuje "
"limit stanovený kryptografickou knižnicou."
#: ../js/ui/components/telepathyClient.js:1341
#: ../js/ui/components/telepathyClient.js:1343
msgid "Internal error"
msgstr "Vnútorná chyba"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1351
#: ../js/ui/components/telepathyClient.js:1353
#, c-format
msgid "Connection to %s failed"
msgstr "Pripojenie k %s zlyhalo"
#: ../js/ui/components/telepathyClient.js:1360
#: ../js/ui/components/telepathyClient.js:1362
msgid "Reconnect"
msgstr "Znovu sa pripojiť"
#: ../js/ui/components/telepathyClient.js:1361
#: ../js/ui/components/telepathyClient.js:1363
msgid "Edit account"
msgstr "Upraviť účet"
#: ../js/ui/components/telepathyClient.js:1406
#: ../js/ui/components/telepathyClient.js:1408
msgid "Unknown reason"
msgstr "Neznámy dôvod"
@ -992,7 +1014,7 @@ msgstr[2] "Budete automaticky odhlásený o %d sekundy."
#: ../js/ui/endSessionDialog.js:74
msgid "Logging out of the system."
msgstr "Odhlasuje sa zo systému."
msgstr "Prebieha odhlásenie zo systému."
#: ../js/ui/endSessionDialog.js:76
msgctxt "button"
@ -1120,21 +1142,21 @@ msgstr "Zobraziť zdroj"
msgid "Web Page"
msgstr "Webová stránka"
#: ../js/ui/messageTray.js:1082
#: ../js/ui/messageTray.js:1083
msgid "Open"
msgstr "Otvoriť"
#: ../js/ui/messageTray.js:1089
#: ../js/ui/messageTray.js:1090
msgid "Remove"
msgstr "Odstrániť"
# DK: zvazoval som pouzit "Panel správ"
# neviem co bude vhodnejsie ako preklad "tray"
#: ../js/ui/messageTray.js:1545
#: ../js/ui/messageTray.js:1534
msgid "Message Tray"
msgstr "Lišta správ"
#: ../js/ui/messageTray.js:2552
#: ../js/ui/messageTray.js:2557
msgid "System Information"
msgstr "Informácie o systéme"
@ -1175,7 +1197,7 @@ msgstr "Ukončiť"
msgid "Activities"
msgstr "Aktivity"
#: ../js/ui/panel.js:965
#: ../js/ui/panel.js:966
msgid "Top Bar"
msgstr "Horná lišta"
@ -1197,11 +1219,11 @@ msgstr "Prosím, zadajte príkaz:"
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:79
#: ../js/ui/screenShield.js:80
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#: ../js/ui/screenShield.js:143
#: ../js/ui/screenShield.js:144
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
@ -1209,13 +1231,13 @@ msgstr[0] "%d nových správ"
msgstr[1] "%d nová správa"
msgstr[2] "%d nové správy"
#: ../js/ui/screenShield.js:145
#: ../js/ui/screenShield.js:146
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d nových upozornení"
msgstr[1] "%d nové upozornenie"
msgstr[2] "%d nové upozornenia"
msgstr[0] "%d nových oznámení"
msgstr[1] "%d nové oznámenie"
msgstr[2] "%d nové oznámenia"
#: ../js/ui/searchDisplay.js:275
msgid "Searching..."
@ -1249,13 +1271,13 @@ msgstr "Heslo"
msgid "Remember Password"
msgstr "Zapamätať heslo"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:171
msgid "Unlock"
msgstr "Odblokovať"
#: ../js/ui/status/accessibility.js:39
msgid "Accessibility"
msgstr "Prístupnosť"
msgstr "Zjednodušenie ovládania"
#: ../js/ui/status/accessibility.js:44
msgid "Zoom"
@ -1537,7 +1559,7 @@ msgstr "Mobilné"
#: ../js/ui/status/network.js:1628
msgid "VPN Connections"
msgstr "VPN pripojenia"
msgstr "Pripojenia k VPN"
#: ../js/ui/status/network.js:1635
msgid "Network Settings"
@ -1669,7 +1691,7 @@ msgstr "Hlasitosť"
msgid "Microphone"
msgstr "Mikrofón"
#: ../js/ui/unlockDialog.js:177
#: ../js/ui/unlockDialog.js:178
msgid "Log in as another user"
msgstr "Prihlásiť ako iný používateľ"
@ -1697,35 +1719,35 @@ msgstr "Nečinný"
msgid "Unavailable"
msgstr "Nedostupný"
#: ../js/ui/userMenu.js:735
#: ../js/ui/userMenu.js:743
msgid "Notifications"
msgstr "Upozornenia"
#: ../js/ui/userMenu.js:743
#: ../js/ui/userMenu.js:751
msgid "System Settings"
msgstr "Nastavenia systému"
#: ../js/ui/userMenu.js:751
#: ../js/ui/userMenu.js:759
msgid "Switch User"
msgstr "Prepnúť používateľa"
#: ../js/ui/userMenu.js:756
#: ../js/ui/userMenu.js:764
msgid "Log Out"
msgstr "Odhlásiť sa"
#: ../js/ui/userMenu.js:761
#: ../js/ui/userMenu.js:769
msgid "Lock"
msgstr "Uzamknúť"
#: ../js/ui/userMenu.js:776
#: ../js/ui/userMenu.js:784
msgid "Install Updates & Restart"
msgstr "Nainštalovať aktualizácie a reštartovať"
#: ../js/ui/userMenu.js:794
#: ../js/ui/userMenu.js:802
msgid "Your chat status will be set to busy"
msgstr "Váš stav bude nastavený na zaneprázdnený"
#: ../js/ui/userMenu.js:795
#: ../js/ui/userMenu.js:803
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."

View File

@ -218,12 +218,12 @@ msgstr "يىغقۇچقا قوش"
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
@ -437,7 +437,7 @@ msgstr "يېقىنقى تۈرلەر"
#: ../js/ui/endSessionDialog.js:63
#, c-format
msgid "Log Out %s"
msgstr "%s تىزىمدىن چىقىش"
msgstr "%s تىزىمدىن چىقىش"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out"
@ -452,7 +452,7 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:66
#, c-format
msgid "%s will be logged out automatically in %d seconds."
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
#: ../js/ui/endSessionDialog.js:67
#, c-format
@ -566,7 +566,7 @@ msgstr "سىزىقچە"
#: ../js/ui/panel.js:533
#, c-format
msgid "Quit %s"
msgstr "%s چېكىن"
msgstr "%s چېكىن"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
@ -799,7 +799,7 @@ msgstr "رەت قىل"
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format
@ -823,7 +823,7 @@ msgstr "ماسلاشمىدى"
#: ../js/ui/status/bluetooth.js:441
#, c-format
msgid "Pairing request for %s"
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
#: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device."
@ -1074,22 +1074,22 @@ msgstr "مىكروفون"
#: ../js/ui/telepathyClient.js:335
#, c-format
msgid "%s is online."
msgstr "%s توردا."
msgstr "%s توردا."
#: ../js/ui/telepathyClient.js:340
#, c-format
msgid "%s is offline."
msgstr "%s توردا يوق."
msgstr "%s توردا يوق."
#: ../js/ui/telepathyClient.js:343
#, c-format
msgid "%s is away."
msgstr "%s يوق."
msgstr "%s يوق."
#: ../js/ui/telepathyClient.js:346
#, c-format
msgid "%s is busy."
msgstr "%s ئالدىراش."
msgstr "%s ئالدىراش."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
@ -1114,7 +1114,7 @@ msgstr "ئىزدە"
#: ../js/ui/windowAttentionHandler.js:42
#, c-format
msgid "%s has finished starting"
msgstr "%s باشلاشنى تاماملىدى"
msgstr "%s باشلاشنى تاماملىدى"
#: ../js/ui/windowAttentionHandler.js:44
#, c-format

View File

@ -31,7 +31,6 @@
#include <string.h>
#define HANDLE_LIBICAL_MEMORY
#include <libecal/libecal.h>
#include <libedataserverui/libedataserverui.h>
#undef CALENDAR_ENABLE_DEBUG
#include "calendar-debug.h"

View File

@ -34,7 +34,6 @@
#include <unistd.h>
#include <gio/gio.h>
#include <gtk/gtk.h>
#define HANDLE_LIBICAL_MEMORY
#include <libecal/libecal.h>
@ -985,9 +984,11 @@ on_name_lost (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
GMainLoop *main_loop = user_data;
g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n",
(gint) getpid ());
gtk_main_quit ();
g_main_loop_quit (main_loop);
}
static void
@ -1003,11 +1004,13 @@ stdin_channel_io_func (GIOChannel *source,
GIOCondition condition,
gpointer data)
{
GMainLoop *main_loop = data;
if (condition & G_IO_HUP)
{
g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n",
(gint) getpid ());
gtk_main_quit ();
g_main_loop_quit (main_loop);
}
else
{
@ -1022,6 +1025,7 @@ main (int argc,
{
GError *error;
GOptionContext *opt_context;
GMainLoop *main_loop;
gint ret;
guint name_owner_id;
GIOChannel *stdin_channel;
@ -1031,9 +1035,7 @@ main (int argc,
name_owner_id = 0;
stdin_channel = NULL;
/* We need to initialize GTK+ since evolution-data-server may decide to use
* GTK+ to pop up a dialog box */
gtk_init (&argc, &argv);
g_type_init ();
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
g_assert (introspection_data != NULL);
@ -1048,11 +1050,15 @@ main (int argc,
goto out;
}
main_loop = g_main_loop_new (NULL, FALSE);
stdin_channel = g_io_channel_unix_new (STDIN_FILENO);
g_io_add_watch (stdin_channel,
G_IO_HUP,
stdin_channel_io_func,
NULL);
g_io_add_watch_full (stdin_channel,
G_PRIORITY_DEFAULT,
G_IO_HUP,
stdin_channel_io_func,
g_main_loop_ref (main_loop),
(GDestroyNotify) g_main_loop_unref);
name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
BUS_NAME,
@ -1061,10 +1067,12 @@ main (int argc,
on_bus_acquired,
on_name_acquired,
on_name_lost,
NULL,
NULL);
g_main_loop_ref (main_loop),
(GDestroyNotify) g_main_loop_unref);
gtk_main ();
g_main_loop_run (main_loop);
g_main_loop_unref (main_loop);
ret = 0;

View File

@ -73,6 +73,7 @@ struct _ShellApp
char *window_id_string;
char *casefolded_name;
char *casefolded_generic_name;
char *name_collation_key;
char *casefolded_exec;
char **casefolded_keywords;
@ -1310,6 +1311,7 @@ static void
shell_app_init_search_data (ShellApp *app)
{
const char *name;
const char *generic_name;
const char *exec;
const char * const *keywords;
char *normalized_exec;
@ -1319,6 +1321,12 @@ shell_app_init_search_data (ShellApp *app)
name = g_app_info_get_name (G_APP_INFO (appinfo));
app->casefolded_name = shell_util_normalize_and_casefold (name);
generic_name = g_desktop_app_info_get_generic_name (appinfo);
if (generic_name)
app->casefolded_generic_name = shell_util_normalize_and_casefold (generic_name);
else
app->casefolded_generic_name = NULL;
exec = g_app_info_get_executable (G_APP_INFO (appinfo));
normalized_exec = shell_util_normalize_and_casefold (exec);
app->casefolded_exec = trim_exec_line (normalized_exec);
@ -1388,6 +1396,18 @@ _shell_app_match_search_terms (ShellApp *app,
current_match = MATCH_SUBSTRING;
}
if (app->casefolded_generic_name)
{
p = strstr (app->casefolded_generic_name, term);
if (p != NULL)
{
if (p == app->casefolded_generic_name || *(p - 1) == ' ')
current_match = MATCH_PREFIX;
else if (current_match < MATCH_PREFIX)
current_match = MATCH_SUBSTRING;
}
}
if (app->casefolded_exec)
{
p = strstr (app->casefolded_exec, term);
@ -1497,6 +1517,7 @@ shell_app_finalize (GObject *object)
g_free (app->window_id_string);
g_free (app->casefolded_name);
g_free (app->casefolded_generic_name);
g_free (app->name_collation_key);
g_free (app->casefolded_exec);
g_strfreev (app->casefolded_keywords);

View File

@ -1693,43 +1693,3 @@ shell_global_get_session_mode (ShellGlobal *global)
return global->session_mode;
}
/**
* shell_global_create_xrootpmap_texture:
* @global: The #ShellGlobal
*
* This returns the _XROOTPMAP_ID pixmap that gdm should have stuffed
* in the root window. The goal here is to allow a smooth fade between
* plymouth and the shell greeter. This is also a workaround for gjs not
* supporting raw xlib types.
*
* Returns: (transfer floating): A #ClutterActor that represents the
* _XROOTPMAP_ID pixmap property from the root window.
*/
ClutterActor *
shell_global_create_xrootpmap_texture (ShellGlobal *global)
{
Atom res_type;
int res_format;
unsigned long res_nitems, bytesafter;
unsigned char *data;
Pixmap root_pixmap_id = None;
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
if (XGetWindowProperty (global->xdisplay,
DefaultRootWindow (global->xdisplay),
XInternAtom (global->xdisplay, "_XROOTPMAP_ID", False),
0, G_MAXLONG, False, XA_PIXMAP,
&res_type, &res_format, &res_nitems, &bytesafter, &data) == Success)
{
if (res_type == XA_PIXMAP && res_format == 32 && res_nitems == 1)
root_pixmap_id = * (Pixmap *) data;
XFree (data);
}
if (root_pixmap_id != None)
return clutter_x11_texture_pixmap_new_with_pixmap (root_pixmap_id);
else
return NULL;
}

View File

@ -136,8 +136,6 @@ void shell_global_reexec_self (ShellGlobal *global);
const char * shell_global_get_session_mode (ShellGlobal *global);
ClutterActor * shell_global_create_xrootpmap_texture (ShellGlobal *global);
G_END_DECLS
#endif /* __SHELL_GLOBAL_H__ */

View File

@ -11,6 +11,8 @@
#define GST_USE_UNSTABLE_API
#include <gst/gst.h>
#include <gtk/gtk.h>
#include "shell-recorder-src.h"
#include "shell-recorder.h"
#include "shell-screen-grabber.h"
@ -65,7 +67,7 @@ struct _ShellRecorder {
int framerate;
char *pipeline_description;
char *filename;
char *file_template;
/* We might have multiple pipelines that are finishing encoding
* to go along with the current pipeline where we are recording.
@ -90,6 +92,7 @@ struct _RecorderPipeline
GstElement *pipeline;
GstElement *src;
int outfile;
char *filename;
};
static void recorder_set_stage (ShellRecorder *recorder,
@ -98,8 +101,8 @@ static void recorder_set_framerate (ShellRecorder *recorder,
int framerate);
static void recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline);
static void recorder_set_filename (ShellRecorder *recorder,
const char *filename);
static void recorder_set_file_template (ShellRecorder *recorder,
const char *file_template);
static void recorder_pipeline_set_caps (RecorderPipeline *pipeline);
static void recorder_pipeline_closed (RecorderPipeline *pipeline);
@ -109,7 +112,7 @@ enum {
PROP_STAGE,
PROP_FRAMERATE,
PROP_PIPELINE,
PROP_FILENAME
PROP_FILE_TEMPLATE
};
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
@ -269,18 +272,6 @@ static void
shell_recorder_finalize (GObject *object)
{
ShellRecorder *recorder = SHELL_RECORDER (object);
GSList *l;
for (l = recorder->pipelines; l; l = l->next)
{
RecorderPipeline *pipeline = l->data;
/* Remove the back-reference. The pipeline will be freed
* when it finishes. (Or when the process exits, but that's
* out of our control.)
*/
pipeline->recorder = NULL;
}
if (recorder->update_memory_used_timeout)
g_source_remove (recorder->update_memory_used_timeout);
@ -290,7 +281,7 @@ shell_recorder_finalize (GObject *object)
recorder_set_stage (recorder, NULL);
recorder_set_pipeline (recorder, NULL);
recorder_set_filename (recorder, NULL);
recorder_set_file_template (recorder, NULL);
g_object_unref (recorder->grabber);
@ -917,22 +908,22 @@ recorder_set_pipeline (ShellRecorder *recorder,
}
static void
recorder_set_filename (ShellRecorder *recorder,
const char *filename)
recorder_set_file_template (ShellRecorder *recorder,
const char *file_template)
{
if (filename == recorder->filename ||
(filename && recorder->filename && strcmp (recorder->filename, filename) == 0))
if (file_template == recorder->file_template ||
(file_template && recorder->file_template && strcmp (recorder->file_template, file_template) == 0))
return;
if (recorder->current_pipeline)
shell_recorder_close (recorder);
if (recorder->filename)
g_free (recorder->filename);
if (recorder->file_template)
g_free (recorder->file_template);
recorder->filename = g_strdup (filename);
recorder->file_template = g_strdup (file_template);
g_object_notify (G_OBJECT (recorder), "filename");
g_object_notify (G_OBJECT (recorder), "file-template");
}
static void
@ -954,8 +945,8 @@ shell_recorder_set_property (GObject *object,
case PROP_PIPELINE:
recorder_set_pipeline (recorder, g_value_get_string (value));
break;
case PROP_FILENAME:
recorder_set_filename (recorder, g_value_get_string (value));
case PROP_FILE_TEMPLATE:
recorder_set_file_template (recorder, g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -982,8 +973,8 @@ shell_recorder_get_property (GObject *object,
case PROP_PIPELINE:
g_value_set_string (value, recorder->pipeline_description);
break;
case PROP_FILENAME:
g_value_set_string (value, recorder->filename);
case PROP_FILE_TEMPLATE:
g_value_set_string (value, recorder->file_template);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1027,9 +1018,9 @@ shell_recorder_class_init (ShellRecorderClass *klass)
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_FILENAME,
g_param_spec_string ("filename",
"Filename",
PROP_FILE_TEMPLATE,
g_param_spec_string ("file-template",
"File Template",
"The filename template to use for output files",
NULL,
G_PARAM_READWRITE));
@ -1149,13 +1140,14 @@ get_absolute_path (char *maybe_relative)
* be opened.
*/
static int
recorder_open_outfile (ShellRecorder *recorder)
recorder_open_outfile (ShellRecorder *recorder,
char **outfilename)
{
const char *pattern;
int flags;
int outfile = -1;
pattern = recorder->filename;
pattern = recorder->file_template;
if (!pattern)
return -1;
@ -1230,8 +1222,12 @@ recorder_open_outfile (ShellRecorder *recorder)
{
g_printerr ("Recording to %s\n", path);
if (outfilename != NULL)
*outfilename = path;
else
g_free (path);
g_string_free (filename, TRUE);
g_free (path);
goto out;
}
@ -1269,7 +1265,8 @@ recorder_pipeline_add_sink (RecorderPipeline *pipeline)
return TRUE;
}
pipeline->outfile = recorder_open_outfile (pipeline->recorder);
pipeline->outfile = recorder_open_outfile (pipeline->recorder,
&pipeline->filename);
if (pipeline->outfile == -1)
goto out;
@ -1344,6 +1341,10 @@ recorder_pipeline_free (RecorderPipeline *pipeline)
if (pipeline->outfile != -1)
close (pipeline->outfile);
g_free (pipeline->filename);
g_clear_object (&pipeline->recorder);
g_free (pipeline);
}
@ -1393,6 +1394,10 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
if (pipeline->recorder)
{
GtkRecentManager *recent_manager;
GFile *file;
char *uri;
ShellRecorder *recorder = pipeline->recorder;
if (pipeline == recorder->current_pipeline)
{
@ -1401,6 +1406,15 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
shell_recorder_close (recorder);
}
recent_manager = gtk_recent_manager_get_default ();
file = g_file_new_for_path (pipeline->filename);
uri = g_file_get_uri (file);
gtk_recent_manager_add_item (recent_manager,
uri);
g_free (uri);
g_object_unref (file);
recorder->pipelines = g_slist_remove (recorder->pipelines, pipeline);
}
@ -1452,7 +1466,7 @@ recorder_open_pipeline (ShellRecorder *recorder)
GstBus *bus;
pipeline = g_new0(RecorderPipeline, 1);
pipeline->recorder = recorder;
pipeline->recorder = g_object_ref (recorder);
pipeline->outfile = - 1;
pipeline_description = recorder->pipeline_description;
@ -1555,10 +1569,10 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
}
/**
* shell_recorder_set_filename:
* shell_recorder_set_file_template:
* @recorder: the #ShellRecorder
* @filename: the filename template to use for output files,
* or %NULL for the defalt value.
* @file_template: the filename template to use for output files,
* or %NULL for the defalt value.
*
* Sets the filename that will be used when creating output
* files. This is only used if the configured pipeline has an
@ -1573,12 +1587,12 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
* The default value is 'shell-%d%u-%c.ogg'.
*/
void
shell_recorder_set_filename (ShellRecorder *recorder,
const char *filename)
shell_recorder_set_file_template (ShellRecorder *recorder,
const char *file_template)
{
g_return_if_fail (SHELL_IS_RECORDER (recorder));
recorder_set_filename (recorder, filename);
recorder_set_file_template (recorder, file_template);
}
@ -1593,7 +1607,7 @@ shell_recorder_set_filename (ShellRecorder *recorder,
* 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. (See shell_recorder_set_filename().) However
* output file. (See shell_recorder_set_file_template().) 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.

View File

@ -32,8 +32,8 @@ ShellRecorder *shell_recorder_new (ClutterStage *stage);
void shell_recorder_set_framerate (ShellRecorder *recorder,
int framerate);
void shell_recorder_set_filename (ShellRecorder *recorder,
const char *filename);
void shell_recorder_set_file_template (ShellRecorder *recorder,
const char *file_template);
void shell_recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline);
gboolean shell_recorder_record (ShellRecorder *recorder);

View File

@ -3,6 +3,7 @@
#define GST_USE_UNSTABLE_API
#include "shell-recorder.h"
#include <clutter/clutter.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
/* Very simple test of the ShellRecorder class; shows some text strings
@ -11,23 +12,34 @@
static ShellRecorder *recorder = NULL;
static gboolean
stop_recording_timeout (gpointer data)
stop_recording_timeout (ClutterActor *stage)
{
if (recorder)
{
shell_recorder_close (recorder);
/* quit when the recorder finishes closing
*/
g_object_weak_ref (G_OBJECT (recorder),
(GWeakNotify)
clutter_actor_destroy,
stage);
g_object_unref (recorder);
}
clutter_main_quit ();
else
{
clutter_actor_destroy (stage);
}
return FALSE;
}
static void
on_animation_completed (ClutterAnimation *animation)
on_animation_completed (ClutterAnimation *animation,
ClutterStage *stage)
{
g_timeout_add (1000, stop_recording_timeout, NULL);
g_timeout_add (1000, (GSourceFunc) stop_recording_timeout, stage);
}
static void
@ -35,7 +47,7 @@ on_stage_realized (ClutterActor *stage,
gpointer data)
{
recorder = shell_recorder_new (CLUTTER_STAGE (stage));
shell_recorder_set_filename (recorder, "test-recorder.ogg");
shell_recorder_set_file_template (recorder, "test-recorder.ogg");
shell_recorder_record (recorder);
}
@ -46,6 +58,7 @@ int main (int argc, char **argv)
ClutterAnimation *animation;
ClutterColor red, green, blue;
gtk_init (&argc, &argv);
gst_init (&argc, &argv);
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
return 1;
@ -69,7 +82,7 @@ int main (int argc, char **argv)
"y", 240.0,
NULL);
g_signal_connect (animation, "completed",
G_CALLBACK (on_animation_completed), NULL);
G_CALLBACK (on_animation_completed), stage);
text = g_object_new (CLUTTER_TYPE_TEXT,
"text", "Blue",
@ -110,7 +123,5 @@ int main (int argc, char **argv)
clutter_main ();
g_object_unref (stage);
return 0;
}

34
tests/interactive/test-title.js Executable file
View File

@ -0,0 +1,34 @@
#!/usr/bin/env gjs
const Gtk = imports.gi.Gtk;
const Mainloop = imports.mainloop;
function nextTitle() {
let length = Math.random() * 20;
let str = '';
for (let i = 0; i < length; i++) {
// 97 == 'a'
str += String.fromCharCode(97 + Math.random() * 26);
}
return str;
}
function main() {
Gtk.init(null);
let win = new Gtk.Window({ title: nextTitle() });
win.connect('destroy', Gtk.main_quit);
win.present();
Mainloop.timeout_add(5000, function() {
win.title = nextTitle();
return true;
});
Gtk.main();
}
main();