Compare commits

...

48 Commits

Author SHA1 Message Date
03f22135b5 Bump version to 3.21.4
Update NEWS.
2016-07-20 21:07:19 +02:00
5b79f657eb data: Dist portals keyfile
Whoops, forgot that in the previous commit :-(
2016-07-20 21:07:19 +02:00
4fc0c513af Provide org.freedesktop.impl.portal.access implementation
If a sandboxed app requests access to some system resource (camera,
microphone, location), the portal frontend needs to ask the user
for permission. In GNOME, we want this to be a system modal dialog,
so provide an org.freedesktop.impl.portal.access implementation
that exposes a generic system modal permission dialog on the bus.

https://bugzilla.gnome.org/show_bug.cgi?id=768669
2016-07-20 17:14:12 +02:00
f5c058a036 Use clutter_stage_capture instead of cogl's read_pixels
There is no longer any guarantee that there'll be one single
framebuffer to read pixels from. In order to still read pixels from the
stage, use the new clutter_stage_capture API.

https://bugzilla.gnome.org/show_bug.cgi?id=768979
2016-07-20 14:15:32 +08:00
0dac0ad516 build: Bump gsettings-desktop-schemas requirement
Require at least 3.21.3 for the MRU input source schema.

https://bugzilla.gnome.org/show_bug.cgi?id=768956
2016-07-19 17:18:56 +02:00
5d4d1e26fd Updated Chinese (Hong Kong) translation 2016-07-18 22:26:23 +00:00
2f0039e7dd app: Add a construct-only app-info property
This will allow us to create a ShellApp from JS code, for instance
for .desktop files that aren't known to the AppSystem.

https://bugzilla.gnome.org/show_bug.cgi?id=762206
2016-07-13 01:28:13 +02:00
9202309bed Updated Polish translation 2016-07-12 21:22:17 +02:00
7e0e224e0e calendar-server: Use the actual recurrence ID of events
Instead of querying the client for a list of objects and using
e_cal_recur_generate_instances() to get occurrences for each of
them, we can use e_cal_client_generate_instances_sync() which
combines the functionality of both functions. This doesn't only
save us some lines of code (yay!), but also gives us access to
the real recurrence ID of an event, so we can get rid of the hack
of faking one.

https://bugzilla.gnome.org/show_bug.cgi?id=748226
2016-07-08 18:05:58 +02:00
35825cf0c7 calendar-server: Get recurrence ID from occurrences
We use the triplet of source ID, UID and recurrence ID to create
an ID to unambiguously identify an event, which we use to implement
hiding dismissed events from the calendar. However we currently
try to fetch the recurrence ID from the objects returned by
e_cal_client_get_object_list_sync(), which are always the primary
events with no recurrence ID. Instead, we need a recurrence ID
associated with each occurrence.

https://bugzilla.gnome.org/show_bug.cgi?id=748226
2016-07-08 18:05:57 +02:00
b2d79b6362 calendar-server: Fetch default zone from client
We are already setting the default zone on the client, no need
to pass it around.

https://bugzilla.gnome.org/show_bug.cgi?id=748226
2016-07-08 18:05:57 +02:00
f5e1dc86cd calendar-server: Fix a memory leak
App will take ownership of the location string when the timezone
changes, but not when there was no change - free the memory in
that case.

https://bugzilla.gnome.org/show_bug.cgi?id=748226
2016-07-08 18:05:57 +02:00
8c51f0076f calendar-server: Minor optimization
We use the same query string for all sources, so no need to
allocate/free it on each loop iteration.

https://bugzilla.gnome.org/show_bug.cgi?id=748226
2016-07-08 16:11:43 +02:00
8347152730 calendar: Do not overload :active to mark selected day
We currently use the :active pseudo class to mark the selected day
in the calendar. Whenever the selected date changes, the class is
added to the corresponding button and removed from all others.
However when the selected date doesn't change (i.e. when clicking
the already selected date), the buttons are not updated and the
use of the :active class conflicts with StButton's builtin handling
of the class - the class is removed on the button up event and the
button is deselected.
Fix this by simply using a different pseudo class.

https://bugzilla.gnome.org/show_bug.cgi?id=746867
2016-07-08 16:11:43 +02:00
3d77dd8f51 calendar: Refresh calendar when ignored events changes
The last patch fixed marking days in the calendar where all
events are ignored, but it doesn't pick up the change when
an event is hidden. Emit an appropriate change notification
to fix this issue.

https://bugzilla.gnome.org/show_bug.cgi?id=768538
2016-07-08 15:01:32 +02:00
82e6935281 calendar: Move handling of ignored events to event source
Ignoring events is currently implemented in the message list's
event section, which means that the calendar does not consider
ignored events when marking days with events. In order to fix
this, move the handling of ignored events to the event source,
which is shared between both components.

https://bugzilla.gnome.org/show_bug.cgi?id=768538
2016-07-08 15:01:32 +02:00
61070e6ec0 calendar-server: Remove an unnecessary check
calendar_appointment_new() never returns %NULL, so no need to check
for it.
2016-07-07 15:54:57 +02:00
128697d6a7 osdWindow: Use a constraint to enforce ratio
Commit 9b07ce1d0d broke the code that keeps the OSD window square.
Use that opportunity to move away from the hack of setting the
min-height style property from code and adjusting the width on
allocate, and implement a proper constraint instead.

https://bugzilla.gnome.org/show_bug.cgi?id=768317
2016-07-05 20:46:57 +02:00
424fa01eca osdWindow: Fix blurry level bar
ClutterActor:width is a floating point property, so it will not be
automatically rounded to non-fractional values that properly align
to pixels. To fix the resulting blurriness, add explicit rounding.

https://bugzilla.gnome.org/show_bug.cgi?id=768317
2016-07-05 20:41:13 +02:00
775187b2e4 osdWindow: Fix level bar width
Commit 9b07ce1d0d changed the OSD window's level bar to be a regular
actor instead of a custom drawn bar. The bar actor's width depends on
both the configured level (e.g. 40%) and the available width, however
the width is currently only updated when the configured level changes.
Fix that by properly considering changes to the parent's width as well.

https://bugzilla.gnome.org/show_bug.cgi?id=768317
2016-07-05 17:47:44 +02:00
99b5e10acf overview: Move ::scroll-event signal handling (again)
Commit c39ffa111 moved the signal handling from the controls- to the
background-group to enable scrolling on non-primary monitors.
However this broke scrolling on reactive overview elements as the
workspace switcher, as they're not descendants of the background.
To fix, move scroll-event handling to the overview group itself,
which is the common ancestor of all overview elements.

https://bugzilla.gnome.org/show_bug.cgi?id=768316
2016-07-05 17:47:44 +02:00
208ed6e90d Updated Slovak translation 2016-07-05 14:53:34 +00:00
de8d4c4cd8 Update URL in a translator comment 2016-07-01 18:46:22 +02:00
3ae591434d Updated British English translation 2016-07-01 17:27:42 +01:00
61fb62f969 Restart: fix maximized windows flickering to the wrong struts
When we restart, we need to update the struts for the screen before
we enter the main loop, or maximized windows will get resized to the
size of the screen without struts, then resized back.

A workaround is needed for a Clutter bug that occurs when we get
the size of an actor before the first paint of the stage.

https://bugzilla.gnome.org/show_bug.cgi?id=761566
2016-06-30 14:17:19 -04:00
c4584c20dc run-js-test: fix running in hi-dpi mode 2016-06-30 14:17:19 -04:00
c6eb95ff3a Updated Spanish translation 2016-06-30 14:02:07 +00:00
ab68360d53 endSessionDialog: Add support for system upgrades
https://bugzilla.gnome.org/show_bug.cgi?id=763611
2016-06-30 11:42:11 +02:00
58a733dc93 endSessionDialog: Use new PackageKit DBus API
https://bugzilla.gnome.org/show_bug.cgi?id=763611
2016-06-30 11:33:07 +02:00
db8f6b4848 endSessionDialog: Rename a variable
https://bugzilla.gnome.org/show_bug.cgi?id=763611
2016-06-30 11:33:06 +02:00
e72d388a67 background: free MetaBackground explicitly when its MetaBackgroundActor is destroyed
The memory which MetaBackground resides is freed automatically, when its
wrapper object Background is freed by garbage collection. But because the
memory for MetaBackground is huge, changing the background or changing the
background mode repeatedly makes a lot of memory to be in use until garbage
collection runs.

This patch frees the MetaBackground object explicitly when its
MetaBackgroundActor is destroyed which is the moment that the memory in the
object is not used anymore.

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

Signed-off-by: Hyungwon Hwang <hyungwon.hwang7@gmail.com>
2016-06-29 13:27:10 +02:00
b5dd4d1456 screenShield: Chain up Arrow's style_changed vfunc
This makes style changes propagate to our child widget as they
should.

https://bugzilla.gnome.org/show_bug.cgi?id=739178
2016-06-28 19:53:17 +02:00
a7562b4148 screenShield: Stop using an offscreen buffer for the arrow actor
This isn't a performance critical actor and the NVIDIA driver discards
offscreen buffers in some cases which would require us to go through
extra hoops to handle here which isn't worth it.

https://bugzilla.gnome.org/show_bug.cgi?id=739178
2016-06-28 19:53:17 +02:00
358f64d66b main: Reload theme on video memory purge errors
The theme machinery uses FBOs in some cases (mainly for shadows) which
need to be reloaded if we get a video memory purged error.

https://bugzilla.gnome.org/show_bug.cgi?id=739178
2016-06-28 19:53:17 +02:00
2a7f9f70b8 shell-recorder: Avoid a crash when the cursor texture is NULL
When running as a wayland compositor, MetaCursorTracker might
legitimately not have a displayed cursor because e.g. a client unsets
the cursor surface.

Note that, under an X session, the assumption that the tracker always
has a cursor texture is true because XFixesGetCursorImage() always
returns data even if the cursor isn't visible.

https://bugzilla.gnome.org/show_bug.cgi?id=767001
2016-06-28 19:03:33 +02:00
c91085caf7 shell-recorder: Ensure we remove the redraw timeout on finalize
Otherwise we may end up using freed memory and crashing

https://bugzilla.gnome.org/show_bug.cgi?id=767001
2016-06-28 19:03:32 +02:00
21ddbf0b8f workspacesView: Consider workspaces-only-on-primary when panning
It is odd to switch workspaces on the primary monitor when panning on
a monitor without workspaces, so reject the gesture on non-primary
monitors when workspaces-only-on-primary is disabled.

https://bugzilla.gnome.org/show_bug.cgi?id=766883
2016-06-27 16:31:00 +02:00
2ad2853278 workspacesView: Consider workspaces-only-on-primary when scrolling
It is odd to switch workspaces using the scroll wheel when the pointer
is on a monitor without workspaces, so only handle scroll events on
non-primary monitors when workspaces-only-on-primary is disabled.

https://bugzilla.gnome.org/show_bug.cgi?id=766883
2016-06-27 16:31:00 +02:00
e16f63a8e4 workspacesView: Allow activating empty workspaces on any monitor
We allow activating a workspace by clicking it when we know that
the user did not try to select a window and missed (namely: the
workspace is empty). However we currently always check for an
empty workspace on the primary monitor, which doesn't make sense
when the click happened on a different monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=766883
2016-06-27 16:31:00 +02:00
c39ffa111f overview: Move overview actions and scrolling to background group
Both the Overview::scroll-event and actions added via addAction()
are meant to work anywhere in the overview, but for now only work
on the primary monitor. Move the handling to the background group
that is known to span all outputs to fix.

https://bugzilla.gnome.org/show_bug.cgi?id=766883
2016-06-27 16:31:00 +02:00
5182129196 overview: Remove stack actor
The stack was used to overlay a message indicator over the overview
group. That indicator is long gone, so there's no longer a need for
an intermediate actor in the hierarchy.

https://bugzilla.gnome.org/show_bug.cgi?id=766883
2016-06-27 16:31:00 +02:00
02bad8e92b workspacesDisplay: Cancel click when panning
When switching between workspaces via panning, we don't want to
leave the overview when we end up on an empty workspace.

https://bugzilla.gnome.org/show_bug.cgi?id=766883
2016-06-27 16:31:00 +02:00
500ea13155 workspacesView: Initialize the adjustment's upper bound
Initializing the upper bound to zero means that on panning we'd start
scrolling from the first workspace even if the current workspace when
entering the overview was different since StAdjustment clamps the
value to be inside bounds.

https://bugzilla.gnome.org/show_bug.cgi?id=766883
2016-06-27 14:43:17 +02:00
ce8e7481e7 Updated Indonesian translation 2016-06-24 10:55:24 +00:00
528f2e3cdc Updated Indonesian translation
(cherry picked from commit 23788b9e7d)
2016-06-24 10:52:54 +00:00
408211ba73 Arrow: compute a paint volume that accounts for the shadow
Otherwise the shadow gets clipped to the actor's allocation.

https://bugzilla.gnome.org/show_bug.cgi?id=767954
2016-06-23 18:57:05 +02:00
e02467eada ScreenShield: fix setting each arrow's opacity on _animateArrows()
https://bugzilla.gnome.org/show_bug.cgi?id=767954
2016-06-23 18:57:04 +02:00
3e93a1bdd6 StShadowHelper: properly use the actor's box to paint the shadow
We're using an unitialized box resulting in an undefined shadow box
size.

_st_paint_shadow_with_opacity() already computes the shadow's bounding
box from the source actor's box so we just need to pass that along.

https://bugzilla.gnome.org/show_bug.cgi?id=767954
2016-06-23 18:57:02 +02:00
32 changed files with 2980 additions and 2034 deletions

23
NEWS
View File

@ -1,3 +1,26 @@
3.21.4
======
* overview: Fix switching workspaces when scrolling on non-primary monitors
[Florian; #766883, #768316]
* Fix crash when using screen recorder under wayland [Rui; #767001]
* Update theme on video memory purge errors [Rui; #739178]
* Free old backgrounds immediately [Hyungwon; #766353]
* Add support for system upgrades to end session dialog [Kalev; #763611]
* Fix maximized windows flickering to the wrong size on restart [Owen; #761566]
* Hide ignored events in calendar as well [Florian; #768538]
* calendar: Only hide dismissed occurrence of recurring event [Florian; #748226]
* Provide org.freedesktop.impl.portal.access implementation [Florian; #768669]
* Misc. bug fixes and cleanups [Rui, Florian, Marinus, Jonas; #767954, #768317,
#746867, #762206, #768956, #768979]
Contributors:
Jonas Ådahl, Piotr Drąg, Hyungwon Hwang, Kalev Lember, Rui Matos,
Florian Müllner, Marinus Schraal, Owen W. Taylor
Translations:
Andika Triwidada [id], Daniel Mustieles [es], Bruce Cowan [en_GB],
Dušan Kazik [sk], Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK]
3.21.3
======
* Do not disable suspend action when locked [Florian; #725960]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.21.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.21.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AX_IS_RELEASE([git-directory])
AC_CONFIG_HEADERS([config.h])
@ -77,7 +77,7 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.21.5
GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4
GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.21.3
MUTTER_MIN_VERSION=3.21.4
GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.45.3
LIBECAL_MIN_VERSION=3.5.3
@ -119,7 +119,7 @@ PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
PKG_CHECK_MODULES(TRAY, mutter-clutter-1.0 gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.21.2)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.21.3)
AC_ARG_ENABLE(browser-plugin,
[AS_HELP_STRING([--enable-browser-plugin],

View File

@ -7,6 +7,9 @@ desktop_DATA = org.gnome.Shell.desktop gnome-shell-extension-prefs.desktop
if HAVE_NETWORKMANAGER
desktop_DATA += org.gnome.Shell.PortalHelper.desktop
portaldir = $(datadir)/xdg-desktop-portal/portals
portal_DATA = gnome-shell.portal
servicedir = $(datadir)/dbus-1/services
service_DATA = org.gnome.Shell.PortalHelper.service
@ -106,6 +109,7 @@ convert_DATA = gnome-shell-overrides.convert
EXTRA_DIST = \
org.gnome.Shell.desktop.in.in \
gnome-shell-extension-prefs.desktop.in.in \
$(portal_DATA) \
$(introspection_DATA) \
$(menu_DATA) \
$(convert_DATA) \

4
data/gnome-shell.portal Normal file
View File

@ -0,0 +1,4 @@
[portal]
DBusName=org.freedesktop.impl.portal.desktop.gnome
Interfaces=org.freedesktop.impl.portal.Access
UseIn=gnome

View File

@ -51,7 +51,7 @@
</key>
<key name="looking-glass-history" type="as">
<default>[]</default>
<!-- Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass -->
<!-- Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass -->
<_summary>History for the looking glass dialog</_summary>
</key>
<key name="always-show-log-out" type="b">

View File

@ -427,6 +427,29 @@ StScrollBar {
.audio-selection-device-icon {
icon-size: 64px; }
/* Access Dialog */
.access-dialog {
spacing: 30px; }
.access-dialog-main-layout {
padding: 12px 20px 0;
spacing: 12px; }
.access-dialog-content {
max-width: 28em;
spacing: 20px; }
.access-dialog-icon {
min-width: 48px;
icon-size: 48px; }
.access-dialog-title {
font-weight: bold; }
.access-dialog-subtitle {
color: #999999;
font-weight: bold; }
/* Geolocation Dialog */
.geolocation-dialog {
spacing: 30px; }
@ -769,7 +792,7 @@ StScrollBar {
border-radius: 1.4em; }
.calendar-day-base:hover, .calendar-day-base:focus {
background-color: #0d0d0d; }
.calendar-day-base:active {
.calendar-day-base:active, .calendar-day-base:selected {
color: white;
background-color: #215d9c;
border-color: transparent; }

View File

@ -427,6 +427,29 @@ StScrollBar {
.audio-selection-device-icon {
icon-size: 64px; }
/* Access Dialog */
.access-dialog {
spacing: 30px; }
.access-dialog-main-layout {
padding: 12px 20px 0;
spacing: 12px; }
.access-dialog-content {
max-width: 28em;
spacing: 20px; }
.access-dialog-icon {
min-width: 48px;
icon-size: 48px; }
.access-dialog-title {
font-weight: bold; }
.access-dialog-subtitle {
color: #8e8e80;
font-weight: bold; }
/* Geolocation Dialog */
.geolocation-dialog {
spacing: 30px; }
@ -769,7 +792,7 @@ StScrollBar {
border-radius: 1.4em; }
.calendar-day-base:hover, .calendar-day-base:focus {
background-color: #454c4c; }
.calendar-day-base:active {
.calendar-day-base:active, .calendar-day-base:selected {
color: white;
background-color: #215d9c;
border-color: transparent; }

View File

@ -31,6 +31,7 @@
<file>portalHelper/main.js</file>
<file>ui/accessDialog.js</file>
<file>ui/altTab.js</file>
<file>ui/animation.js</file>
<file>ui/appDisplay.js</file>

202
js/ui/accessDialog.js Normal file
View File

@ -0,0 +1,202 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const CheckBox = imports.ui.checkBox;
const ModalDialog = imports.ui.modalDialog;
const RequestIface = '<node> \
<interface name="org.freedesktop.impl.portal.Request"> \
<method name="Close"/> \
</interface> \
</node>';
const AccessIface = '<node> \
<interface name="org.freedesktop.impl.portal.Access"> \
<method name="AccessDialog"> \
<arg type="o" name="handle" direction="in"/> \
<arg type="s" name="app_id" direction="in"/> \
<arg type="s" name="parent_window" direction="in"/> \
<arg type="s" name="title" direction="in"/> \
<arg type="s" name="subtitle" direction="in"/> \
<arg type="s" name="body" direction="in"/> \
<arg type="a{sv}" name="options" direction="in"/> \
<arg type="u" name="response" direction="out"/> \
<arg type="a{sv}" name="results" direction="out"/> \
</method> \
</interface> \
</node>';
const DialogResponse = {
OK: 0,
CANCEL: 1,
CLOSED: 2
};
const AccessDialog = new Lang.Class({
Name: 'AccessDialog',
Extends: ModalDialog.ModalDialog,
_init: function(invocation, handle, title, subtitle, body, options) {
this.parent({ styleClass: 'access-dialog' });
this._invocation = invocation;
this._handle = handle;
this._requestExported = false;
this._request = Gio.DBusExportedObject.wrapJSObject(RequestIface, this);
for (let option in options)
options[option] = options[option].deep_unpack();
this._buildLayout(title, subtitle, body, options);
},
_buildLayout: function(title, subtitle, body, options) {
// No support for non-modal system dialogs, so ignore the option
//let modal = options['modal'] || true;
let denyLabel = options['deny_label'] || _("Deny Access");
let grantLabel = options['grant_label'] || _("Grant Access");
let iconName = options['icon'] || null;
let choices = options['choices'] || [];
let mainContentBox = new St.BoxLayout();
mainContentBox.style_class = 'access-dialog-main-layout';
this.contentLayout.add_actor(mainContentBox);
let icon = new St.Icon({ style_class: 'access-dialog-icon',
icon_name: iconName,
y_align: Clutter.ActorAlign.START });
mainContentBox.add_actor(icon);
let messageBox = new St.BoxLayout({ vertical: true });
messageBox.style_class = 'access-dialog-content',
mainContentBox.add_actor(messageBox);
let label;
label = new St.Label({ style_class: 'access-dialog-title headline',
text: title });
messageBox.add_actor(label);
label = new St.Label({ style_class: 'access-dialog-subtitle',
text: subtitle });
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
label.clutter_text.line_wrap = true;
messageBox.add_actor(label);
this._choices = new Map();
for (let i = 0; i < choices.length; i++) {
let [id, name, opts, selected] = choices[i];
if (opts.length > 0)
continue; // radio buttons, not implemented
let check = new CheckBox.CheckBox();
check.getLabelActor().text = name;
check.actor.checked = selected == "true";
messageBox.add_actor(check.actor);
this._choices.set(id, check);
}
label = new St.Label({ text: body });
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
label.clutter_text.line_wrap = true;
messageBox.add_actor(label);
this.addButton({ label: denyLabel,
action: () => {
this._sendResponse(DialogResponse.CANCEL);
},
key: Clutter.KEY_Escape });
this.addButton({ label: grantLabel,
action: () => {
this._sendResponse(DialogResponse.OK);
}});
},
open: function() {
this.parent();
let connection = this._invocation.get_connection();
this._requestExported = this._request.export(connection, this._handle);
},
CloseAsync: function(invocation, params) {
if (this._invocation.get_sender() != invocation.get_sender()) {
invocation.return_error_literal(Gio.DBusError,
Gio.DBusError.ACCESS_DENIED,
'');
return;
}
this._sendResponse(DialogResponse.CLOSED);
},
_sendResponse: function(response) {
if (this._requestExported)
this._request.unexport();
this._requestExported = false;
let results = {};
if (response == DialogResponse.OK) {
for (let [id, check] of this._choices) {
let checked = check.actor.checked ? 'true' : 'false';
results[id] = new GLib.Variant('s', checked);
}
}
// Delay actual response until the end of the close animation (if any)
this.connect('closed', () => {
this._invocation.return_value(new GLib.Variant('(ua{sv})',
[response, results]));
});
this.close();
}
});
const AccessDialogDBus = new Lang.Class({
Name: 'AccessDialogDBus',
_init: function() {
this._accessDialog = null;
this._windowTracker = Shell.WindowTracker.get_default();
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AccessIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop');
Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
AccessDialogAsync: function(params, invocation) {
if (this._accessDialog) {
invocation.return_error_literal(Gio.DBusError,
Gio.DBusError.LIMITS_EXCEEDED,
'Already showing a system access dialog');
return;
}
let [handle, appId, parentWindow, title, subtitle, body, options] = params;
// We probably want to use parentWindow and global.display.focus_window
// for this check in the future
if (appId && appId + '.desktop' != this._windowTracker.focus_app.id) {
invocation.return_error_literal(Gio.DBusError,
Gio.DBusError.ACCESS_DENIED,
'Only the focused app is allowed to show a system access dialog');
return;
}
let dialog = new AccessDialog(invocation, handle, title,
subtitle, body, options);
dialog.open();
dialog.connect('closed', () => { this._accessDialog = null; });
this._accessDialog = dialog;
}
});

View File

@ -696,6 +696,7 @@ const BackgroundManager = new Lang.Class({
time: FADE_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: function() {
oldBackgroundActor.background.run_dispose();
oldBackgroundActor.destroy();
}
});

View File

@ -120,6 +120,9 @@ const EmptyEventSource = new Lang.Class({
destroy: function() {
},
ignoreEvent: function(event) {
},
requestRange: function(begin, end) {
},
@ -184,6 +187,15 @@ const DBusEventSource = new Lang.Class({
this.isLoading = false;
this.isDummy = false;
this._ignoredEvents = new Map();
let savedState = global.get_persistent_state('as', 'ignored_events');
if (savedState)
savedState.deep_unpack().forEach(Lang.bind(this,
function(eventId) {
this._ignoredEvents.set(eventId, true);
}));
this._initialized = false;
this._dbusProxy = new CalendarServer();
this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(object, result) {
@ -298,6 +310,16 @@ const DBusEventSource = new Lang.Class({
}
},
ignoreEvent: function(event) {
if (this._ignoredEvents.get(event.id))
return;
this._ignoredEvents.set(event.id, true);
let savedState = new GLib.Variant('as', [...this._ignoredEvents.keys()]);
global.set_persistent_state('ignored_events', savedState);
this.emit('changed');
},
requestRange: function(begin, end) {
if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) {
this.isLoading = true;
@ -313,6 +335,10 @@ const DBusEventSource = new Lang.Class({
let result = [];
for(let n = 0; n < this._events.length; n++) {
let event = this._events[n];
if (this._ignoredEvents.has(event.id))
continue;
if (_dateIntervalsOverlap (event.date, event.end, begin, end)) {
result.push(event);
}
@ -660,12 +686,12 @@ const Calendar = new Lang.Class({
this._buttons.forEach(Lang.bind(this, function(button) {
if (sameDay(button._date, this._selectedDate)) {
button.add_style_pseudo_class('active');
button.add_style_pseudo_class('selected');
if (this._shouldDateGrabFocus)
button.grab_key_focus();
}
else
button.remove_style_pseudo_class('active');
button.remove_style_pseudo_class('selected');
}));
}
});
@ -785,15 +811,6 @@ const EventsSection = new Lang.Class({
this._desktopSettings.connect('changed', Lang.bind(this, this._reloadEvents));
this._eventSource = new EmptyEventSource();
this._ignoredEvents = new Map();
let savedState = global.get_persistent_state('as', 'ignored_events');
if (savedState)
savedState.deep_unpack().forEach(Lang.bind(this,
function(eventId) {
this._ignoredEvents.set(eventId, true);
}));
this.parent('');
Shell.AppSystem.get_default().connect('installed-changed',
@ -802,9 +819,7 @@ const EventsSection = new Lang.Class({
},
_ignoreEvent: function(event) {
this._ignoredEvents.set(event.id, true);
let savedState = new GLib.Variant('as', [...this._ignoredEvents.keys()]);
global.set_persistent_state('ignored_events', savedState);
this._eventSource.ignoreEvent(event);
},
setEventSource: function(eventSource) {
@ -850,9 +865,6 @@ const EventsSection = new Lang.Class({
for (let i = 0; i < events.length; i++) {
let event = events[i];
if (this._ignoredEvents.has(event.id))
continue;
let message = new EventMessage(event, this._date);
message.connect('close', Lang.bind(this, function() {
this._ignoreEvent(event);

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/*
* Copyright 2010 Red Hat, Inc
* Copyright 2010-2016 Red Hat, Inc
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -114,7 +114,7 @@ const restartDialogContent = {
showOtherSessions: true,
};
const restartInstallDialogContent = {
const restartUpdateDialogContent = {
subject: C_("title", "Restart & Install Updates"),
description: function(seconds) {
@ -132,18 +132,38 @@ const restartInstallDialogContent = {
showOtherSessions: true,
};
const restartUpgradeDialogContent = {
subject: C_("title", "Restart & Install Upgrade"),
upgradeDescription: function(distroName, distroVersion) {
/* Translators: This is the text displayed for system upgrades in the
shut down dialog. First %s gets replaced with the distro name and
second %s with the distro version to upgrade to */
return _("%s %s will be installed after restart. Upgrade installation can take a long time: ensure that you have backed up and that the computer is plugged in.").format(distroName, distroVersion);
},
disableTimer: true,
showBatteryWarning: false,
confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart &amp; Install") }],
iconName: 'view-refresh-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon',
showOtherSessions: true,
};
const DialogType = {
LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
UPDATE_RESTART: 3
UPDATE_RESTART: 3,
UPGRADE_RESTART: 4
};
const DialogContent = {
0 /* DialogType.LOGOUT */: logoutDialogContent,
1 /* DialogType.SHUTDOWN */: shutdownDialogContent,
2 /* DialogType.RESTART */: restartDialogContent,
3 /* DialogType.UPDATE_RESTART */: restartInstallDialogContent
3 /* DialogType.UPDATE_RESTART */: restartUpdateDialogContent,
4 /* DialogType.UPGRADE_RESTART */: restartUpgradeDialogContent
};
const MAX_USERS_IN_SESSION_DIALOG = 5;
@ -163,7 +183,10 @@ const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
const PkOfflineIface = '<node> \
<interface name="org.freedesktop.PackageKit.Offline"> \
<property name="UpdatePrepared" type="b" access="read"/> \
<property name="TriggerAction" type="s" access="read"/> \
<property name="UpdateTriggered" type="b" access="read"/> \
<property name="UpgradePrepared" type="b" access="read"/> \
<property name="UpgradeTriggered" type="b" access="read"/> \
<property name="PreparedUpgrade" type="a{sv}" access="read"/> \
<method name="Trigger"> \
<arg type="s" name="action" direction="in"/> \
</method> \
@ -415,11 +438,19 @@ const EndSessionDialog = new Lang.Class({
if (dialogContent.descriptionWithUser)
description = dialogContent.descriptionWithUser(realName, displayTime);
else
description = dialogContent.description(displayTime);
}
}
// Use a different description when we are installing a system upgrade
if (dialogContent.upgradeDescription) {
let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
if (name != null && version != null)
description = dialogContent.upgradeDescription(name, version);
}
// Fall back to regular description
if (!description)
description = dialogContent.description(displayTime);
@ -698,9 +729,12 @@ const EndSessionDialog = new Lang.Class({
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._type = type;
if (this._type == DialogType.RESTART &&
this._pkOfflineProxy.TriggerAction == 'reboot')
if (this._type == DialogType.RESTART) {
if (this._pkOfflineProxy.UpdateTriggered)
this._type = DialogType.UPDATE_RESTART;
else if (this._pkOfflineProxy.UpgradeTriggered)
this._type = DialogType.UPGRADE_RESTART;
}
this._applications = [];
this._applicationList.destroy_all_children();
@ -727,19 +761,19 @@ const EndSessionDialog = new Lang.Class({
if (dialogContent.showOtherSessions)
this._loadSessions();
let updateAlreadyTriggered = this._pkOfflineProxy.TriggerAction == 'power-off' || this._pkOfflineProxy.TriggerAction == 'reboot';
let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText);
this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
this._checkBox.actor.checked = (updatePrepared && updateAlreadyTriggered);
this._checkBox.actor.checked = (updatePrepared && updateTriggered);
// We show the warning either together with the checkbox, or when
// updates have already been triggered, but the user doesn't have
// enough permissions to cancel them.
this._batteryWarning.visible = (dialogContent.showBatteryWarning &&
(this._checkBox.actor.visible || updatePrepared && updateAlreadyTriggered && !updatesAllowed));
(this._checkBox.actor.visible || updatePrepared && updateTriggered && !updatesAllowed));
this._updateButtons();
@ -749,7 +783,9 @@ const EndSessionDialog = new Lang.Class({
return;
}
if (!dialogContent.disableTimer)
this._startTimer();
this._sync();
let signalId = this.connect('opened',

View File

@ -220,7 +220,8 @@ const LayoutManager = new Lang.Class({
global.stage.add_child(this.uiGroup);
this.overviewGroup = new St.Widget({ name: 'overviewGroup',
visible: false });
visible: false,
reactive: true });
this.addChrome(this.overviewGroup);
this.screenShieldGroup = new St.Widget({ name: 'screenShieldGroup',
@ -591,7 +592,10 @@ const LayoutManager = new Lang.Class({
this.addChrome(this._coverPane);
if (Meta.is_restart()) {
// On restart, we don't do an animation
// On restart, we don't do an animation. Force an update of the
// regions immediately so that maximized windows restore to the
// right size taking struts into account.
this._updateRegions();
} else if (Main.sessionMode.isGreeter) {
this.panelBox.translation_y = -this.panelBox.height;
} else {
@ -938,6 +942,11 @@ const LayoutManager = new Lang.Class({
if (Main.modalCount > 0)
return GLib.SOURCE_REMOVE;
// Bug workaround - get_transformed_position()/get_transformed_size() don't work after
// a change in stage size until the first pick or paint.
// https://bugzilla.gnome.org/show_bug.cgi?id=761565
global.stage.get_actor_at_pos(Clutter.PickMode.ALL, 0, 0);
let rects = [], struts = [], i;
let isPopupMenuVisible = global.top_window_group.get_children().some(isPopupMetaWindow);
let wantsInputRegion = !isPopupMenuVisible;

View File

@ -11,6 +11,7 @@ const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const AccessDialog = imports.ui.accessDialog;
const AudioDeviceSelection = imports.ui.audioDeviceSelection;
const Components = imports.ui.components;
const CtrlAltTab = imports.ui.ctrlAltTab;
@ -63,6 +64,7 @@ let ctrlAltTabManager = null;
let osdWindowManager = null;
let osdMonitorLabeler = null;
let sessionMode = null;
let shellAccessDialogDBusService = null;
let shellAudioSelectionDBusService = null;
let shellDBusService = null;
let shellMountOpDBusService = null;
@ -122,6 +124,7 @@ function start() {
_loadDefaultStylesheet);
_initializeUI();
shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus();
shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus();
shellDBusService = new ShellDBus.GnomeShell();
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
@ -191,6 +194,8 @@ function _initializeUI() {
return true;
});
global.display.connect('gl-video-memory-purged', loadTheme);
// Provide the bus object for gnome-session to
// initiate logouts.
EndSessionDialog.init();

View File

@ -27,6 +27,8 @@ const LevelBar = new Lang.Class({
this._bar = new St.Widget({ style_class: 'level-bar' });
this.actor.set_child(this._bar);
this.actor.connect('notify::width', () => { this.level = this.level; });
},
get level() {
@ -34,14 +36,44 @@ const LevelBar = new Lang.Class({
},
set level(value) {
let newValue = Math.max(0, Math.min(value, 100));
if (newValue == this._level)
return;
this._level = newValue;
this._level = Math.max(0, Math.min(value, 100));
let width = this.actor.width;
width *= (this._level / 100.);
this._bar.width = width;
let alloc = this.actor.get_allocation_box();
let newWidth = Math.round((alloc.x2 - alloc.x1) * this._level / 100);
if (newWidth != this._bar.width)
this._bar.width = newWidth;
}
});
const OsdWindowConstraint = new Lang.Class({
Name: 'OsdWindowConstraint',
Extends: Clutter.Constraint,
_init: function(props) {
this._minSize = 0;
this.parent(props);
},
set minSize(v) {
this._minSize = v;
if (this.actor)
this.actor.queue_relayout();
},
vfunc_update_allocation: function(actor, actorBox) {
// Clutter will adjust the allocation for margins,
// so add it to our minimum size
let minSize = this._minSize + actor.margin_top + actor.margin_bottom;
let [width, height] = actorBox.get_size();
// Enforce a ratio of 1
let size = Math.ceil(Math.max(minSize, height));
actorBox.set_size(size, size);
// Recenter
let [x, y] = actorBox.get_origin();
actorBox.set_origin(Math.floor(x + width / 2 - size / 2),
Math.floor(y + height / 2 - size / 2));
}
});
@ -49,7 +81,6 @@ const OsdWindow = new Lang.Class({
Name: 'OsdWindow',
_init: function(monitorIndex) {
this._popupSize = 0;
this.actor = new St.Widget({ x_expand: true,
y_expand: true,
x_align: Clutter.ActorAlign.CENTER,
@ -59,19 +90,12 @@ const OsdWindow = new Lang.Class({
let constraint = new Layout.MonitorConstraint({ index: monitorIndex });
this.actor.add_constraint(constraint);
this._boxConstraint = new OsdWindowConstraint();
this._box = new St.BoxLayout({ style_class: 'osd-window',
vertical: true });
this._box.add_constraint(this._boxConstraint);
this.actor.add_actor(this._box);
this._box.connect('style-changed', Lang.bind(this, this._onStyleChanged));
this._box.connect('notify::height', Lang.bind(this,
function() {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function() {
this._box.width = this._box.height;
}));
}));
this._icon = new St.Icon();
this._box.add(this._icon, { expand: true });
@ -173,30 +197,12 @@ const OsdWindow = new Lang.Class({
let scalew = monitor.width / 640.0;
let scaleh = monitor.height / 480.0;
let scale = Math.min(scalew, scaleh);
this._popupSize = 110 * Math.max(1, scale);
let popupSize = 110 * Math.max(1, scale);
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._icon.icon_size = this._popupSize / (2 * scaleFactor);
this._icon.icon_size = popupSize / (2 * scaleFactor);
this._box.translation_y = monitor.height / 4;
this._box.style_changed();
},
_onStyleChanged: function() {
let themeNode = this._box.get_theme_node();
let horizontalPadding = themeNode.get_horizontal_padding();
let verticalPadding = themeNode.get_vertical_padding();
let topBorder = themeNode.get_border_width(St.Side.TOP);
let bottomBorder = themeNode.get_border_width(St.Side.BOTTOM);
let leftBorder = themeNode.get_border_width(St.Side.LEFT);
let rightBorder = themeNode.get_border_width(St.Side.RIGHT);
let minWidth = this._popupSize - verticalPadding - leftBorder - rightBorder;
let minHeight = this._popupSize - horizontalPadding - topBorder - bottomBorder;
// minWidth/minHeight here are in real pixels,
// but the theme takes measures in unscaled dimensions
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight) / scaleFactor);
this._boxConstraint.minSize = popupSize;
}
});

View File

@ -107,18 +107,12 @@ const Overview = new Lang.Class({
this._overviewCreated = true;
let layout = new Clutter.BinLayout();
this._stack = new Clutter.Actor({ layout_manager: layout });
this._stack.add_constraint(new LayoutManager.MonitorConstraint({ primary: true }));
/* Translators: This is the main view to select
activities. See also note for "Activities" string. */
this._overview = new St.BoxLayout({ name: 'overview',
accessible_name: _("Overview"),
reactive: true,
vertical: true,
x_expand: true,
y_expand: true });
vertical: true });
this._overview.add_constraint(new LayoutManager.MonitorConstraint({ primary: true }));
this._overview._delegate = this;
// The main Background actors are inside global.window_group which are
@ -126,7 +120,7 @@ const Overview = new Lang.Class({
// one. Instances of this class share a single CoglTexture behind the
// scenes which allows us to show the background with different
// rendering options without duplicating the texture data.
this._backgroundGroup = new Meta.BackgroundGroup();
this._backgroundGroup = new Meta.BackgroundGroup({ reactive: true });
Main.layoutManager.overviewGroup.add_child(this._backgroundGroup);
this._bgManagers = [];
@ -149,8 +143,7 @@ const Overview = new Lang.Class({
Main.layoutManager.overviewGroup.add_child(this._coverPane);
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return Clutter.EVENT_STOP; }));
this._stack.add_actor(this._overview);
Main.layoutManager.overviewGroup.add_child(this._stack);
Main.layoutManager.overviewGroup.add_child(this._overview);
this._coverPane.hide();
@ -159,6 +152,9 @@ const Overview = new Lang.Class({
dragMotion: Lang.bind(this, this._onDragMotion)
};
Main.layoutManager.overviewGroup.connect('scroll-event',
Lang.bind(this, this._onScrollEvent));
Main.xdndHandler.connect('drag-begin', Lang.bind(this, this._onDragBegin));
Main.xdndHandler.connect('drag-end', Lang.bind(this, this._onDragEnd));
@ -255,7 +251,6 @@ const Overview = new Lang.Class({
// Add our same-line elements after the search entry
this._overview.add(this._controls.actor, { y_fill: true, expand: true });
this._controls.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
// TODO - recalculate everything when desktop size changes
this.dashIconSize = this._dash.iconSize;
@ -372,7 +367,7 @@ const Overview = new Lang.Class({
if (this.isDummy)
return;
this._overview.add_action(action);
this._backgroundGroup.add_action(action);
},
_getDesktopClone: function() {
@ -552,8 +547,8 @@ const Overview = new Lang.Class({
Meta.disable_unredirect_for_screen(global.screen);
this.viewSelector.show();
this._stack.opacity = 0;
Tweener.addTween(this._stack,
this._overview.opacity = 0;
Tweener.addTween(this._overview,
{ opacity: 255,
transition: 'easeOutQuad',
time: ANIMATION_TIME,
@ -618,7 +613,7 @@ const Overview = new Lang.Class({
this.viewSelector.animateFromOverview();
// Make other elements fade out.
Tweener.addTween(this._stack,
Tweener.addTween(this._overview,
{ opacity: 0,
transition: 'easeOutQuad',
time: ANIMATION_TIME,

View File

@ -421,7 +421,6 @@ const ControlsManager = new Lang.Class({
let layout = new ControlsLayout();
this.actor = new St.Widget({ layout_manager: layout,
reactive: true,
x_expand: true, y_expand: true,
clip_to_allocation: true });
this._group = new St.BoxLayout({ name: 'overview-group',

View File

@ -349,7 +349,6 @@ const Arrow = new Lang.Class({
_init: function(params) {
this.parent(params);
this.x_fill = this.y_fill = true;
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
this._drawingArea = new St.DrawingArea();
this._drawingArea.connect('repaint', Lang.bind(this, this._drawArrow));
@ -377,6 +376,22 @@ const Arrow = new Lang.Class({
cr.$dispose();
},
vfunc_get_paint_volume: function(volume) {
if (!this.parent(volume))
return false;
if (!this._shadow)
return true;
let shadow_box = new Clutter.ActorBox();
this._shadow.get_box(this._drawingArea.get_allocation_box(), shadow_box);
volume.set_width(Math.max(shadow_box.x2 - shadow_box.x1, volume.get_width()));
volume.set_height(Math.max(shadow_box.y2 - shadow_box.y1, volume.get_height()));
return true;
},
vfunc_style_changed: function() {
let node = this.get_theme_node();
this._shadow = node.get_shadow('-arrow-shadow');
@ -384,6 +399,8 @@ const Arrow = new Lang.Class({
this._shadowHelper = St.ShadowHelper.new(this._shadow);
else
this._shadowHelper = null;
this.parent();
},
vfunc_paint: function() {
@ -711,7 +728,7 @@ const ScreenShield = new Lang.Class({
let unitaryDelay = ARROW_ANIMATION_TIME / (arrows.length + 1);
let maxOpacity = 255 * ARROW_ANIMATION_PEAK_OPACITY;
for (let i = 0; i < arrows.length; i++) {
arrows.opacity = 0;
arrows[i].opacity = 0;
Tweener.addTween(arrows[i],
{ opacity: 0,
delay: unitaryDelay * (N_ARROWS - (i + 1)),

View File

@ -103,7 +103,7 @@ const WorkspacesView = new Lang.Class({
page_increment: 1,
page_size: 1,
step_increment: 0,
upper: 0 });
upper: global.screen.n_workspaces });
this.scrollAdjustment.connect('notify::value',
Lang.bind(this, this._onScroll));
@ -374,6 +374,10 @@ const ExtraWorkspaceView = new Lang.Class({
this._workspace.setActualGeometry(this._actualGeometry);
},
getActiveWorkspace: function() {
return this._workspace;
},
animateToOverview: function(animationType) {
if (animationType == AnimationType.ZOOM)
this._workspace.zoomToOverview();
@ -421,8 +425,10 @@ const WorkspacesDisplay = new Lang.Class({
// Only switch to the workspace when there's no application
// windows open. The problem is that it's too easy to miss
// an app window and get the wrong one focused.
let event = Clutter.get_current_event();
let index = this._getMonitorIndexForEvent(event);
if ((action.get_button() == 1 || action.get_button() == 0) &&
this._getPrimaryView().getActiveWorkspace().isEmpty())
this._workspacesViews[index].getActiveWorkspace().isEmpty())
Main.overview.hide();
}));
Main.overview.addAction(clickAction);
@ -431,11 +437,18 @@ const WorkspacesDisplay = new Lang.Class({
let panAction = new Clutter.PanAction({ threshold_trigger_edge: Clutter.GestureTriggerEdge.AFTER });
panAction.connect('pan', Lang.bind(this, this._onPan));
panAction.connect('gesture-begin', Lang.bind(this, function() {
if (this._workspacesOnlyOnPrimary) {
let event = Clutter.get_current_event();
if (this._getMonitorIndexForEvent(event) != this._primaryIndex)
return false;
}
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].startSwipeScroll();
return true;
}));
panAction.connect('gesture-cancel', Lang.bind(this, function() {
clickAction.release();
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].endSwipeScroll();
}));
@ -581,6 +594,12 @@ const WorkspacesDisplay = new Lang.Class({
}
},
_getMonitorIndexForEvent: function(event) {
let [x, y] = event.get_coords();
let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 });
return global.screen.get_monitor_index_for_rect(rect);
},
_getPrimaryView: function() {
if (!this._workspacesViews.length)
return null;
@ -661,6 +680,11 @@ const WorkspacesDisplay = new Lang.Class({
_onScrollEvent: function(actor, event) {
if (!this.actor.mapped)
return Clutter.EVENT_PROPAGATE;
if (this._workspacesOnlyOnPrimary &&
this._getMonitorIndexForEvent(event) != this._primaryIndex)
return Clutter.EVENT_PROPAGATE;
let activeWs = global.screen.get_active_workspace();
let ws;
switch (event.get_scroll_direction()) {

File diff suppressed because it is too large Load Diff

View File

@ -11,8 +11,8 @@ msgstr ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-05-27 14:08+0000\n"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-06-30 09:43+0000\n"
"PO-Revision-Date: 2016-06-30 15:58+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
@ -330,7 +330,7 @@ msgstr "Extensiones de GNOME Shell"
msgstr "Extensiones de GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
#: ../js/ui/components/networkAgent.js:145
#: ../js/ui/components/networkAgent.js:145
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:483
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:916
@ -551,7 +551,7 @@ msgstr "Cambiar el fondo…"
#: ../js/ui/backgroundMenu.js:21
msgid "Display Settings"
msgstr "Configuración de pantalla"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:374
msgid "Settings"
msgstr "Configuración"
@ -926,7 +926,7 @@ msgstr[1] ""
msgstr[1] ""
"El sistema se reiniciará automáticamente e instalará las actualizaciones en "
"%d segundos."
#: ../js/ui/endSessionDialog.js:127 ../js/ui/endSessionDialog.js:147
msgctxt "button"
msgid "Restart &amp; Install"
@ -941,27 +941,47 @@ msgctxt "checkbox"
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Apagar después de instalar las actualizaciones"
#: ../js/ui/endSessionDialog.js:137
#| msgctxt "title"
#| msgid "Restart & Install Updates"
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Reiniciar e instalar actualizaciones"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: ../js/ui/endSessionDialog.js:142
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
"time: ensure that you have backed up and that the computer is plugged in."
msgstr ""
"%s %s se instalará después de reiniciar. La instalación de la actualización "
"puede tardar mucho tiempo: asegúrese de que tiene una copia de respaldo y de "
"que el equipo está enchufado."
#: ../js/ui/endSessionDialog.js:361
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"Funcionando con batería: conéctese antes de instalar las actualizaciones."
#: ../js/ui/endSessionDialog.js:378
msgid "Some applications are busy or have unsaved work."
msgstr "Algunas aplicaciones están ocupadas o tienen trabajo sin guardar."
#: ../js/ui/endSessionDialog.js:385
msgid "Other users are logged in."
msgstr "Hay otros usuarios con la sesión iniciada"
#. Translators: Remote here refers to a remote session, like a ssh login
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:671
#, javascript-format
msgid "%s (remote)"
msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:674
#, javascript-format
msgid "%s (console)"
@ -975,7 +995,7 @@ msgstr "Instalar"
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Teclado"
@ -1060,7 +1080,7 @@ msgstr "Medios"
#: ../js/ui/overview.js:84
msgid "Undo"
msgstr "Deshacer"
#: ../js/ui/overview.js:113
msgid "Overview"
msgstr "Vista general"
@ -1068,7 +1088,7 @@ msgstr "Vista general"
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#. characters.
#: ../js/ui/overview.js:240
msgid "Type to search…"
msgstr "Escribir para buscar…"
@ -1132,11 +1152,11 @@ msgid_plural "%d new notifications"
msgid_plural "%d new notifications"
msgstr[0] "%d notificación nueva"
msgstr[1] "%d notificaciones nuevas"
#: ../js/ui/screenShield.js:449 ../js/ui/status/system.js:382
msgid "Lock"
msgstr "Bloquear"
#: ../js/ui/screenShield.js:704
msgid "GNOME needs to lock the screen"
msgstr "GNOME necesita bloquear la pantalla"
@ -1147,11 +1167,11 @@ msgstr "GNOME necesita bloquear la pantalla"
#. Just tell him to stop using this app
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:825 ../js/ui/screenShield.js:1291
msgid "Unable to lock"
msgstr "No se pudo bloquear"
#: ../js/ui/screenShield.js:826 ../js/ui/screenShield.js:1292
msgid "Lock was blocked by an application"
msgstr "Una aplicación impidió el bloqueo"
@ -1270,7 +1290,7 @@ msgstr "Apagar"
#: ../js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Brillo"
#: ../js/ui/status/keyboard.js:805
msgid "Show Keyboard Layout"
msgstr "Mostrar la distribución del teclado"
@ -1402,7 +1422,6 @@ msgid "%s Disabled"
msgid "%s Disabled"
msgstr "%s desactivado"
#: ../js/ui/status/network.js:632
#: ../js/ui/status/network.js:632
msgid "Connect to Internet"
msgstr "Conectar a Internet"
@ -1541,27 +1560,27 @@ msgstr "%d%%"
#: ../js/ui/status/rfkill.js:88
msgid "Airplane Mode On"
msgstr "Modo avión activado"
#: ../js/ui/status/system.js:351
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/status/system.js:356
msgid "Log Out"
msgstr "Cerrar la sesión"
#: ../js/ui/status/system.js:361
msgid "Account Settings"
msgstr "Configuración de la cuenta"
#: ../js/ui/status/system.js:378
msgid "Orientation Lock"
msgstr "Bloqueo de orientación"
#: ../js/ui/status/system.js:386
msgid "Suspend"
msgstr "Suspender"
#: ../js/ui/status/system.js:389
msgid "Power Off"
msgstr "Apagar"

310
po/id.po
View File

@ -7,12 +7,12 @@
# Wibiharto <wibinem@yahoo.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell gnome-3-18\n"
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-01-02 10:15+0000\n"
"PO-Revision-Date: 2016-01-02 19:12+0700\n"
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
"POT-Creation-Date: 2016-06-24 10:53+0000\n"
"PO-Revision-Date: 2016-06-24 17:54+0700\n"
"Last-Translator: Andika Triwidada <atriwidada@gnome.org>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Generator: Poedit 1.8.4\n"
"X-Generator: Poedit 1.6.10\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@ -46,15 +46,6 @@ msgstr "Tampilkan semua aplikasi"
msgid "Open the application menu"
msgstr "Buka menu aplikasi"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "GNOME Shell"
#: ../data/gnome-shell.desktop.in.in.h:2
#: ../data/gnome-shell-wayland.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "Manajemen jendela dan peluncuran aplikasi"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
msgid "GNOME Shell Extension Preferences"
msgstr "Preferensi Ekstensi GNOME Shell"
@ -63,9 +54,13 @@ msgstr "Preferensi Ekstensi GNOME Shell"
msgid "Configure GNOME Shell Extensions"
msgstr "Konfigurasi Ekstensi GNOME Shell"
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
msgid "GNOME Shell (wayland compositor)"
msgstr "GNOME Shell (kompositor wayland)"
#: ../data/org.gnome.Shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "GNOME Shell"
#: ../data/org.gnome.Shell.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "Manajemen jendela dan peluncuran aplikasi"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
@ -173,12 +168,23 @@ msgstr ""
"menata keadaan baku dari kontak contreng."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Show the week date in the calendar"
msgstr "Menampilkan tanggal pada kalender"
msgid ""
"Whether the default Bluetooth adapter had set up devices associated to it"
msgstr ""
"Apakah adapter Bluetooth baku telah menyiapkan perangkat yang terasosiasi "
"dengannya"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "If true, display the ISO week date in the calendar."
msgstr "Jika \"true\", menampilkan tanggal berformat ISO pada kalender."
msgid ""
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
"powered, or if there were devices set up associated with the default "
"adapter. This will be reset if the default adapter is ever seen not to have "
"devices associated to it."
msgstr ""
"Shell hanya akan menampilkan butir menu Bluetooth bila sebuah adapter "
"Bluetooth dinyalakan, atau ada perangkat yang telah disiapkan terasosiasi "
"dengan adapter baku. Ini akan di-reset bila adapter baku pernah terlihat "
"tidak punya perangkat yang terasosiasi dengannya."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu"
@ -305,33 +311,34 @@ msgstr ""
msgid "Network Login"
msgstr "Log Masuk Jaringan"
#: ../js/extensionPrefs/main.js:122
#: ../js/extensionPrefs/main.js:117
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Ada galat saat memuat dialog preferensi bagi %s:"
#: ../js/extensionPrefs/main.js:154
#: ../js/extensionPrefs/main.js:149
msgid "GNOME Shell Extensions"
msgstr "Ekstensi GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
#: ../js/ui/components/networkAgent.js:145
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:916
msgid "Cancel"
msgstr "Batal"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
#: ../js/gdm/authPrompt.js:447
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:216
#: ../js/gdm/authPrompt.js:448
msgid "Next"
msgstr "Selanjutnya"
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
#: ../js/gdm/authPrompt.js:212 ../js/ui/shellMountOperation.js:403
#: ../js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Buka Kunci"
#: ../js/gdm/authPrompt.js:213
#: ../js/gdm/authPrompt.js:214
msgctxt "button"
msgid "Sign In"
msgstr "Masuk"
@ -498,16 +505,36 @@ msgstr "Tambah ke Favorit"
msgid "Show Details"
msgstr "Tampilkan Rincian"
#: ../js/ui/appFavorites.js:132
#: ../js/ui/appFavorites.js:134
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s telah ditambahkan ke favorit Anda."
#: ../js/ui/appFavorites.js:166
#: ../js/ui/appFavorites.js:168
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s telah dihapus dari favorit Anda."
#: ../js/ui/audioDeviceSelection.js:59
msgid "Select Audio Device"
msgstr "Pilih Perangkat Audio"
#: ../js/ui/audioDeviceSelection.js:69
msgid "Sound Settings"
msgstr "Pengaturan Suara"
#: ../js/ui/audioDeviceSelection.js:78
msgid "Headphones"
msgstr "Headphone"
#: ../js/ui/audioDeviceSelection.js:80
msgid "Headset"
msgstr "Headset"
#: ../js/ui/audioDeviceSelection.js:82 ../js/ui/status/volume.js:213
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/backgroundMenu.js:19
msgid "Change Background…"
msgstr "Ubah Latar…"
@ -516,12 +543,12 @@ msgstr "Ubah Latar…"
msgid "Display Settings"
msgstr "Pengaturan Tampilan"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:374
msgid "Settings"
msgstr "Pengaturan"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: ../js/ui/calendar.js:55
#: ../js/ui/calendar.js:47
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@ -531,94 +558,96 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: ../js/ui/calendar.js:84
#: ../js/ui/calendar.js:76
msgctxt "grid sunday"
msgid "S"
msgstr "M"
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:86
#: ../js/ui/calendar.js:78
msgctxt "grid monday"
msgid "M"
msgstr "S"
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:88
#: ../js/ui/calendar.js:80
msgctxt "grid tuesday"
msgid "T"
msgstr "S"
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:90
#: ../js/ui/calendar.js:82
msgctxt "grid wednesday"
msgid "W"
msgstr "R"
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:92
#: ../js/ui/calendar.js:84
msgctxt "grid thursday"
msgid "T"
msgstr "K"
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:94
#: ../js/ui/calendar.js:86
msgctxt "grid friday"
msgid "F"
msgstr "J"
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:96
#: ../js/ui/calendar.js:88
msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: ../js/ui/calendar.js:566
#: ../js/ui/calendar.js:416
msgid "Previous month"
msgstr "Bulan sebelumnya"
#: ../js/ui/calendar.js:576
#: ../js/ui/calendar.js:426
msgid "Next month"
msgstr "Bulan selanjutnya"
#: ../js/ui/calendar.js:783
#: ../js/ui/calendar.js:579
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: ../js/ui/calendar.js:634
msgid "Week %V"
msgstr "Minggu %V"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: ../js/ui/calendar.js:1188
#: ../js/ui/calendar.js:695
msgctxt "event list time"
msgid "All Day"
msgstr "Sepanjang Hari"
#: ../js/ui/calendar.js:1295
msgid "Clear section"
msgstr "Bersihkan seksi"
#: ../js/ui/calendar.js:1522
#: ../js/ui/calendar.js:821
msgid "Events"
msgstr "Kejadian"
#: ../js/ui/calendar.js:1531
#: ../js/ui/calendar.js:830
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d %B"
#: ../js/ui/calendar.js:1535
#: ../js/ui/calendar.js:834
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d %B %Y"
#: ../js/ui/calendar.js:1620
#: ../js/ui/calendar.js:919
msgid "Notifications"
msgstr "Pemberitahuan"
#: ../js/ui/calendar.js:1771
#: ../js/ui/calendar.js:1070
msgid "No Notifications"
msgstr "Tak Ada Pemberitahuan"
#: ../js/ui/calendar.js:1774
#: ../js/ui/calendar.js:1073
msgid "No Events"
msgstr "Tak Ada Kejadian"
@ -630,7 +659,7 @@ msgstr "Drive eksternal tersambung"
msgid "External drive disconnected"
msgstr "Drive eksternal terputus"
#: ../js/ui/components/autorunManager.js:351
#: ../js/ui/components/autorunManager.js:355
#, javascript-format
msgid "Open with %s"
msgstr "Buka dengan %s"
@ -756,7 +785,7 @@ msgstr "Maaf, tidak berhasil. Silakan coba lagi."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/components/telepathyClient.js:759
#: ../js/ui/components/telepathyClient.js:760
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s sekarang dikenal sebagai %s"
@ -931,16 +960,16 @@ msgstr "Pasang"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?"
#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:713
#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Papan Ketik"
#. translators: 'Hide' is a verb
#: ../js/ui/legacyTray.js:66
#: ../js/ui/legacyTray.js:65
msgid "Hide tray"
msgstr "Sembunyikan baki"
#: ../js/ui/legacyTray.js:107
#: ../js/ui/legacyTray.js:106
msgid "Status Icons"
msgstr "Ikon Status"
@ -968,7 +997,7 @@ msgstr "Diaktifkan"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Dinonaktifkan"
@ -992,10 +1021,26 @@ msgstr "Tilik Sumber"
msgid "Web Page"
msgstr "Halaman Web"
#: ../js/ui/messageList.js:543
msgid "Clear section"
msgstr "Bersihkan seksi"
#: ../js/ui/messageTray.js:1486
msgid "System Information"
msgstr "Informasi Sistem"
#: ../js/ui/mpris.js:194
msgid "Unknown artist"
msgstr "Artis tak dikenal"
#: ../js/ui/mpris.js:195
msgid "Unknown title"
msgstr "Judul tak dikenal"
#: ../js/ui/mpris.js:217
msgid "Media"
msgstr "Media"
#: ../js/ui/overview.js:84
msgid "Undo"
msgstr "Batal"
@ -1041,15 +1086,15 @@ msgstr "Bar Atas"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:70
#: ../js/ui/runDialog.js:71
msgid "Enter a Command"
msgstr "Ketikkan Perintah"
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162
msgid "Close"
msgstr "Tutup"
#: ../js/ui/runDialog.js:281
#: ../js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Memulai ulang..."
@ -1071,11 +1116,11 @@ msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d pemberitahuan baru"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:374
#: ../js/ui/screenShield.js:448 ../js/ui/status/system.js:382
msgid "Lock"
msgstr "Kunci"
#: ../js/ui/screenShield.js:684
#: ../js/ui/screenShield.js:703
msgid "GNOME needs to lock the screen"
msgstr "GNOME perlu mengunci layar"
@ -1086,11 +1131,11 @@ msgstr "GNOME perlu mengunci layar"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271
#: ../js/ui/screenShield.js:824 ../js/ui/screenShield.js:1290
msgid "Unable to lock"
msgstr "Tak bisa mengunci"
#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272
#: ../js/ui/screenShield.js:825 ../js/ui/screenShield.js:1291
msgid "Lock was blocked by an application"
msgstr "Kunci diblokir oleh suatu aplikasi"
@ -1170,60 +1215,90 @@ msgstr "Kontras Tinggi"
msgid "Large Text"
msgstr "Teks Besar"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
#: ../js/ui/status/bluetooth.js:47
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:56 ../js/ui/status/network.js:624
msgid "Bluetooth Settings"
msgstr "Pengaturan Bluetooth"
#. Translators: this is the number of connected bluetooth devices
#: ../js/ui/status/bluetooth.js:136
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d Tersambung"
#: ../js/ui/status/bluetooth.js:138
msgid "Off"
msgstr "Mati"
#: ../js/ui/status/bluetooth.js:140
msgid "Not In Use"
msgstr "Tidak Dipakai"
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1279
msgid "Turn On"
msgstr "Nyalakan"
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:178
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
#: ../js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Matikan"
#: ../js/ui/status/bluetooth.js:54
msgid "Bluetooth Settings"
msgstr "Pengaturan Bluetooth"
#. Translators: this is the number of connected bluetooth devices
#: ../js/ui/status/bluetooth.js:105
#, javascript-format
msgid "%d Connected"
msgid_plural "%d Connected"
msgstr[0] "%d Tersambung"
#: ../js/ui/status/bluetooth.js:107
msgid "Not In Use"
msgstr "Tidak Dipakai"
#: ../js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "Kecerahan"
#: ../js/ui/status/keyboard.js:736
#: ../js/ui/status/keyboard.js:805
msgid "Show Keyboard Layout"
msgstr "Tampilkan Tata Letak Papan Tik"
#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177
#: ../js/ui/status/location.js:107 ../js/ui/status/location.js:215
msgid "Location Enabled"
msgstr "Lokasi Diaktifkan"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178
#: ../js/ui/status/location.js:108 ../js/ui/status/location.js:216
msgid "Disable"
msgstr "Nonaktifkan"
#: ../js/ui/status/location.js:73
#: ../js/ui/status/location.js:109
msgid "Privacy Settings"
msgstr "Pengaturan Privasi"
#: ../js/ui/status/location.js:176
#: ../js/ui/status/location.js:214
msgid "Location In Use"
msgstr "Lokasi Sedang Digunakan"
#: ../js/ui/status/location.js:180
#: ../js/ui/status/location.js:218
msgid "Location Disabled"
msgstr "Koneksi Dinonaktifkan"
#: ../js/ui/status/location.js:181
#: ../js/ui/status/location.js:219
msgid "Enable"
msgstr "Fungsikan"
#: ../js/ui/status/location.js:426
msgid "Deny Access"
msgstr "Tolak Akses"
#: ../js/ui/status/location.js:429
msgid "Grant Access"
msgstr "Beri Akses"
#. Translators: %s is an application name
#: ../js/ui/status/location.js:435
#, javascript-format
msgid "Give %s access to your location?"
msgstr "Beri %s akses ke lokasi Anda?"
#: ../js/ui/status/location.js:437
msgid "Location access can be changed at any time from the privacy settings."
msgstr "Akses lokasi dapat diubah setiap saat dari pengaturan privasi."
#: ../js/ui/status/network.js:101
msgid "<unknown>"
msgstr "<tak dikenal>"
@ -1290,7 +1365,7 @@ msgstr "Koneksi %s Gagal"
msgid "Wired Settings"
msgstr "Pengaturan Kabel"
#: ../js/ui/status/network.js:545 ../js/ui/status/network.js:624
#: ../js/ui/status/network.js:545
msgid "Mobile Broadband Settings"
msgstr "Pengaturan Data Seluler"
@ -1308,8 +1383,8 @@ msgid "%s Disabled"
msgstr "%s Dinonaktifkan"
#: ../js/ui/status/network.js:632
msgid "Use as Internet connection"
msgstr "Pakai sebagai koneksi Internet"
msgid "Connect to Internet"
msgstr "Sambungkan ke Internet"
#: ../js/ui/status/network.js:813
msgid "Airplane Mode is On"
@ -1359,10 +1434,6 @@ msgstr "Pilih Jaringan"
msgid "Wi-Fi Settings"
msgstr "Pengaturan Wi-Fi"
#: ../js/ui/status/network.js:1279
msgid "Turn On"
msgstr "Nyalakan"
#. Translators: %s is a network identifier
#: ../js/ui/status/network.js:1296
#, javascript-format
@ -1412,32 +1483,37 @@ msgstr "Koneksi gagal"
msgid "Activation of network connection failed"
msgstr "Aktivasi koneksi jaringan gagal"
#: ../js/ui/status/power.js:49
#: ../js/ui/status/power.js:61
msgid "Power Settings"
msgstr "Pengaturan Daya"
#: ../js/ui/status/power.js:65
#: ../js/ui/status/power.js:77
msgid "Fully Charged"
msgstr "Terisi Penuh"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
#: ../js/ui/status/power.js:84 ../js/ui/status/power.js:90
msgid "Estimating…"
msgstr "Memperkirakan…"
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: ../js/ui/status/power.js:86
#: ../js/ui/status/power.js:98
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgid "%d%02d Remaining (%d%%)"
msgstr "%d:%02d Tersisa (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: ../js/ui/status/power.js:91
#: ../js/ui/status/power.js:103
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
msgid "%d%02d Until Full (%d%%)"
msgstr "%d:%02d Sampai Penuh (%d%%)"
#: ../js/ui/status/power.js:131 ../js/ui/status/power.js:133
#, javascript-format
msgid "%d%%"
msgstr "%d%%"
#. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically
#. changing the menu contents.
@ -1445,27 +1521,27 @@ msgstr "%d:%02d Sampai Penuh (%d%%)"
msgid "Airplane Mode On"
msgstr "Mode Pesawat Terbang Aktif"
#: ../js/ui/status/system.js:343
#: ../js/ui/status/system.js:351
msgid "Switch User"
msgstr "Ganti Pengguna"
#: ../js/ui/status/system.js:348
#: ../js/ui/status/system.js:356
msgid "Log Out"
msgstr "Keluar"
#: ../js/ui/status/system.js:353
#: ../js/ui/status/system.js:361
msgid "Account Settings"
msgstr "Pengaturan Akun"
#: ../js/ui/status/system.js:370
#: ../js/ui/status/system.js:378
msgid "Orientation Lock"
msgstr "Kunci Orientasi"
#: ../js/ui/status/system.js:378
#: ../js/ui/status/system.js:386
msgid "Suspend"
msgstr "Suspensi"
#: ../js/ui/status/system.js:381
#: ../js/ui/status/system.js:389
msgid "Power Off"
msgstr "Matikan"
@ -1477,10 +1553,6 @@ msgstr "Volume diubah"
msgid "Volume"
msgstr "Volume"
#: ../js/ui/status/volume.js:213
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:67
msgid "Log in as another user"
msgstr "Masuk sebagai pengguna lain"
@ -1600,7 +1672,7 @@ msgstr "Evolution Kalender"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1835
#: ../src/gvc/gvc-mixer-control.c:1873
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -1608,13 +1680,13 @@ msgstr[0] "%u Keluaran"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1845
#: ../src/gvc/gvc-mixer-control.c:1883
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u Masukan"
#: ../src/gvc/gvc-mixer-control.c:2371
#: ../src/gvc/gvc-mixer-control.c:2738
msgid "System Sounds"
msgstr "Suara Sistem"
@ -1644,14 +1716,14 @@ msgstr "Tak dikenal"
msgid "Failed to launch “%s”"
msgstr "Gagal meluncurkan \"%s\""
#: ../src/shell-keyring-prompt.c:742
#: ../src/shell-keyring-prompt.c:730
msgid "Passwords do not match."
msgstr "Sandi tidak cocok."
#: ../src/shell-keyring-prompt.c:750
#: ../src/shell-keyring-prompt.c:738
msgid "Password cannot be blank"
msgstr "Sandi tidak boleh kosong"
#: ../src/shell-polkit-authentication-agent.c:346
#: ../src/shell-polkit-authentication-agent.c:353
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialog otentikasi ditolak oleh pengguna"

View File

@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-10 17:25+0100\n"
"PO-Revision-Date: 2016-03-10 17:27+0100\n"
"POT-Creation-Date: 2016-07-12 21:20+0200\n"
"PO-Revision-Date: 2016-07-12 21:21+0200\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n"
@ -325,13 +325,13 @@ msgstr ""
msgid "Network Login"
msgstr "Logowanie do sieci"
#: ../js/extensionPrefs/main.js:121
#: ../js/extensionPrefs/main.js:117
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr ""
"Wystąpił błąd podczas wczytywania okna preferencji dla rozszerzenia „%s”:"
#: ../js/extensionPrefs/main.js:153
#: ../js/extensionPrefs/main.js:149
msgid "GNOME Shell Extensions"
msgstr "Rozszerzenia powłoki GNOME"
@ -558,7 +558,7 @@ msgstr "Zmień tło…"
msgid "Display Settings"
msgstr "Ustawienia ekranu"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:371
msgid "Settings"
msgstr "Ustawienia"
@ -800,7 +800,7 @@ msgstr "To nie zadziałało. Proszę spróbować ponownie."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/components/telepathyClient.js:759
#: ../js/ui/components/telepathyClient.js:760
#, javascript-format
msgid "%s is now known as %s"
msgstr "Użytkownik %s jest teraz znany jako %s"
@ -1025,7 +1025,7 @@ msgstr "Włączone"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Wyłączone"
@ -1115,7 +1115,7 @@ msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:71
msgid "Enter a Command"
msgstr "Proszę wprowadzić polecenie"
msgstr "Proszę wprowadzić polecenie:"
#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162
msgid "Close"
@ -1147,7 +1147,7 @@ msgstr[0] "%d nowe powiadomienie"
msgstr[1] "%d nowe powiadomienia"
msgstr[2] "%d nowych powiadomień"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:374
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:379
msgid "Lock"
msgstr "Zablokuj ekran"
@ -1555,27 +1555,27 @@ msgstr "%d%%"
msgid "Airplane Mode On"
msgstr "Włączono tryb samolotowy"
#: ../js/ui/status/system.js:343
#: ../js/ui/status/system.js:348
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/status/system.js:348
#: ../js/ui/status/system.js:353
msgid "Log Out"
msgstr "Wyloguj się"
#: ../js/ui/status/system.js:353
#: ../js/ui/status/system.js:358
msgid "Account Settings"
msgstr "Ustawienia konta"
#: ../js/ui/status/system.js:370
#: ../js/ui/status/system.js:375
msgid "Orientation Lock"
msgstr "Blokada orientacji"
#: ../js/ui/status/system.js:378
#: ../js/ui/status/system.js:383
msgid "Suspend"
msgstr "Uśpij"
#: ../js/ui/status/system.js:381
#: ../js/ui/status/system.js:386
msgid "Power Off"
msgstr "Wyłącz komputer"
@ -1708,7 +1708,7 @@ msgstr "Kalendarz programu Evolution"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1835
#: ../src/gvc/gvc-mixer-control.c:1873
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -1718,7 +1718,7 @@ msgstr[2] "%u wyjść"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1845
#: ../src/gvc/gvc-mixer-control.c:1883
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
@ -1726,7 +1726,7 @@ msgstr[0] "%u wejście"
msgstr[1] "%u wejścia"
msgstr[2] "%u wejść"
#: ../src/gvc/gvc-mixer-control.c:2371
#: ../src/gvc/gvc-mixer-control.c:2738
msgid "System Sounds"
msgstr "Dźwięki systemowe"
@ -1767,3 +1767,16 @@ msgstr "Hasło nie może być puste"
#: ../src/shell-polkit-authentication-agent.c:353
msgid "Authentication dialog was dismissed by the user"
msgstr "Okno dialogowe uwierzytelnienia zostało odrzucone przez użytkownika"
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Ponowne uruchomienie i instalacja aktualizacji"
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a "
"long time: ensure that you have backed up and that the computer is "
"plugged in."
msgstr ""
"System %s %s zostanie zainstalowany po ponownym uruchomieniu. Instalacja "
"aktualizacji może zająć dużo czasu. Proszę się upewnić, że wykonano kopię "
"zapasową danych i podłączono komputer do prądu."

155
po/sk.po
View File

@ -9,8 +9,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: 2016-03-10 15:25+0000\n"
"PO-Revision-Date: 2016-03-10 19:20+0100\n"
"POT-Creation-Date: 2016-06-30 09:43+0000\n"
"PO-Revision-Date: 2016-07-05 16:53+0200\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
@ -19,7 +19,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-DamnedLies-Scope: partial\n"
"X-Generator: Poedit 1.8.7\n"
"X-Generator: Poedit 1.8.7.1\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@ -195,80 +195,71 @@ msgstr ""
"priradené zariadenia."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Show the week date in the calendar"
msgstr "Zobraziť čísla týždňov v kalendári"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "If true, display the ISO week date in the calendar."
msgstr ""
"Ak je true, zobrazí v kalendári poradie dní v týždni podľa štandardu ISO."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
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:23
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
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:24
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
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:26
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to open the overview"
msgstr "Klávesová skratka na otvorenie prehľadu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to open the Activities Overview."
msgstr "Klávesová skratka na otvorenie prehľadu aktivít."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the notification list"
msgstr "Klávesová skratka na prepnutie viditeľnosti zoznamu s oznámeniami"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the visibility of the notification list."
msgstr "Klávesová skratka na prepnutie viditeľnosti zoznamu s oznámeniami."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification"
msgstr "Klávesová skratka na zameranie aktívnych oznámení"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to focus the active notification."
msgstr "Klávesová skratka, s ktorou sa zamerá na aktívne oznámenia."
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Klávesová skratka, ktorá pozastaví a znovu spustí všetky animácie(tween), "
"pre ladiace účely"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "Ktorú klávesnicu používať"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "Typ klávesnice, ktorá sa má používať."
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Limit switcher to current workspace."
msgstr "Obmedziť prepínač na aktuálny pracovný priestor."
# desc
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included."
@ -276,11 +267,11 @@ msgstr ""
"Ak je true, iba aplikácie, ktoré majú okná na aktuálnom pracovnom priestore "
"budú zobrazené v prepínači. Inak budú zahrnuté všetky aplikácie."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The application icon mode."
msgstr "Režim ikonizácie aplikácií."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@ -291,7 +282,7 @@ msgstr ""
"ikonu aplikácie) alebo „both“ (zobrazí oboje)."
# desc
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
@ -299,31 +290,31 @@ msgstr ""
"Ak je true, iba okná z aktuálneho pracovného priestoru budú zobrazené v "
"prepínači. Inak budú zahrnuté všetky okná."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
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:41
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
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í Shellu prostredia "
"GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Povoliť natiahnutie k okraju pri pustení okien na okrajoch obrazovky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "Workspaces are managed dynamically"
msgstr "Pracovné priestory sú spravované dynamicky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Workspaces only on primary monitor"
msgstr "Pracovné priestory sú iba na primárnom monitore"
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr ""
"Oneskoriť pohyb zamerania v režime myši, až kým sa ukazovateľ nezastaví"
@ -332,18 +323,18 @@ msgstr ""
msgid "Network Login"
msgstr "Sieťové prihlásenie"
#: ../js/extensionPrefs/main.js:121
#: ../js/extensionPrefs/main.js:117
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Vyskytla sa chyba pri načítavaní dialógového okna nastavení pre %s:"
#: ../js/extensionPrefs/main.js:153
#: ../js/extensionPrefs/main.js:149
msgid "GNOME Shell Extensions"
msgstr "Rozšírenia pre Shell prostredia GNOME"
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
#: ../js/ui/components/networkAgent.js:145
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:483
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:916
msgid "Cancel"
@ -572,7 +563,7 @@ msgstr "Zmeniť pozadie…"
msgid "Display Settings"
msgstr "Nastavenia displeja"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:374
msgid "Settings"
msgstr "Nastavenia"
@ -819,7 +810,7 @@ msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/components/telepathyClient.js:759
#: ../js/ui/components/telepathyClient.js:760
#, javascript-format
msgid "%s is now known as %s"
msgstr "Kontakt %s odteraz vystupuje ako %s"
@ -957,7 +948,7 @@ msgstr[1] ""
msgstr[2] ""
"Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekúnd."
#: ../js/ui/endSessionDialog.js:127
#: ../js/ui/endSessionDialog.js:127 ../js/ui/endSessionDialog.js:147
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Reštartovať a inštalovať"
@ -972,28 +963,46 @@ msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Vypnúť po inštalácii aktualizácií"
#: ../js/ui/endSessionDialog.js:338
#: ../js/ui/endSessionDialog.js:137
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Reštart a inštalácia inovácie"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: ../js/ui/endSessionDialog.js:142
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
"time: ensure that you have backed up and that the computer is plugged in."
msgstr ""
"Operačný systém %s %s bude nainštalovaný po reštarte. Inštalácia inovácie "
"môže trvať dlhšiu dobu: uistite sa, že máte vytvorenú zálohu, a že počítač "
"je pripojený k zdroju napájania."
#: ../js/ui/endSessionDialog.js:361
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"Systém je napájaný z batérie. Pred inštaláciou aktualizácií pripojte "
"napájací zdroj."
#: ../js/ui/endSessionDialog.js:355
#: ../js/ui/endSessionDialog.js:378
msgid "Some applications are busy or have unsaved work."
msgstr "Niektoré aplikácie sú zaneprázdnené, alebo obsahujú neuloženú prácu."
#: ../js/ui/endSessionDialog.js:362
#: ../js/ui/endSessionDialog.js:385
msgid "Other users are logged in."
msgstr "Sú prihlásení iní používatelia."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:640
#: ../js/ui/endSessionDialog.js:671
#, javascript-format
msgid "%s (remote)"
msgstr "%s (vzdialená relácia)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:643
#: ../js/ui/endSessionDialog.js:674
#, javascript-format
msgid "%s (console)"
msgstr "%s (konzola)"
@ -1007,7 +1016,7 @@ msgstr "Inštalovať"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Prevziať a nainštalovať rozšírenie „%s“ z extensions.gnome.org?"
#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:713
#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Klávesnica"
@ -1044,7 +1053,7 @@ msgstr "Povolené"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Zakázané"
@ -1093,7 +1102,7 @@ msgstr "Médiá"
msgid "Undo"
msgstr "Vrátiť"
#: ../js/ui/overview.js:117
#: ../js/ui/overview.js:113
msgid "Overview"
msgstr "Prehľad"
@ -1102,7 +1111,7 @@ msgstr "Prehľad"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:244
#: ../js/ui/overview.js:240
msgid "Type to search…"
msgstr "Zadajte text na vyhľadanie…"
@ -1171,11 +1180,11 @@ msgstr[0] "%d nové oznámenie"
msgstr[1] "%d nové oznámenia"
msgstr[2] "%d nových oznámení"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:374
#: ../js/ui/screenShield.js:449 ../js/ui/status/system.js:382
msgid "Lock"
msgstr "Uzamknúť"
#: ../js/ui/screenShield.js:684
#: ../js/ui/screenShield.js:704
msgid "GNOME needs to lock the screen"
msgstr "Prostredie GNOME vyžaduje uzamknutie obrazovky"
@ -1186,11 +1195,11 @@ msgstr "Prostredie GNOME vyžaduje uzamknutie obrazovky"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271
#: ../js/ui/screenShield.js:825 ../js/ui/screenShield.js:1291
msgid "Unable to lock"
msgstr "Nepodarilo sa uzamknúť obrazovku"
#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272
#: ../js/ui/screenShield.js:826 ../js/ui/screenShield.js:1292
msgid "Lock was blocked by an application"
msgstr "Uzamknutie bolo zablokované aplikáciou"
@ -1277,7 +1286,7 @@ msgstr "Veľký text"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:56
#: ../js/ui/status/bluetooth.js:56 ../js/ui/status/network.js:624
msgid "Bluetooth Settings"
msgstr "Nastavenia Bluetooth"
@ -1315,7 +1324,7 @@ msgid "Brightness"
msgstr "Jas"
# menu item
#: ../js/ui/status/keyboard.js:736
#: ../js/ui/status/keyboard.js:805
msgid "Show Keyboard Layout"
msgstr "Zobraziť rozloženie klávesnice"
@ -1428,7 +1437,7 @@ msgstr "Pripojenie %s zlyhalo"
msgid "Wired Settings"
msgstr "Nastavenia drôtovej siete"
#: ../js/ui/status/network.js:545 ../js/ui/status/network.js:624
#: ../js/ui/status/network.js:545
msgid "Mobile Broadband Settings"
msgstr "Nastavenia mobilnej širokopásmovej siete"
@ -1446,8 +1455,8 @@ msgid "%s Disabled"
msgstr "%s zakázané"
#: ../js/ui/status/network.js:632
msgid "Use as Internet connection"
msgstr "Použiť na pripojenie k internetu"
msgid "Connect to Internet"
msgstr "Pripoj k internetu"
#: ../js/ui/status/network.js:813
msgid "Airplane Mode is On"
@ -1585,28 +1594,28 @@ msgstr "%d%%"
msgid "Airplane Mode On"
msgstr "Režim v lietadle zapnutý"
#: ../js/ui/status/system.js:343
#: ../js/ui/status/system.js:351
msgid "Switch User"
msgstr "Prepnúť používateľa"
#: ../js/ui/status/system.js:348
#: ../js/ui/status/system.js:356
msgid "Log Out"
msgstr "Odhlásiť sa"
#: ../js/ui/status/system.js:353
#: ../js/ui/status/system.js:361
msgid "Account Settings"
msgstr "Nastavenia účtu"
# action button
#: ../js/ui/status/system.js:370
#: ../js/ui/status/system.js:378
msgid "Orientation Lock"
msgstr "Uzamknutie orientácie"
#: ../js/ui/status/system.js:378
#: ../js/ui/status/system.js:386
msgid "Suspend"
msgstr "Uspať"
#: ../js/ui/status/system.js:381
#: ../js/ui/status/system.js:389
msgid "Power Off"
msgstr "Vypnúť"
@ -1741,7 +1750,7 @@ msgstr "Kalendár Evolution"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1835
#: ../src/gvc/gvc-mixer-control.c:1873
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -1751,7 +1760,7 @@ msgstr[2] "%u výstupov"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1845
#: ../src/gvc/gvc-mixer-control.c:1883
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
@ -1759,7 +1768,7 @@ msgstr[0] "%u vstup"
msgstr[1] "%u vstupy"
msgstr[2] "%u vstupov"
#: ../src/gvc/gvc-mixer-control.c:2371
#: ../src/gvc/gvc-mixer-control.c:2738
msgid "System Sounds"
msgstr "Systémové zvuky"
@ -1802,6 +1811,16 @@ msgstr "Heslo nemôže byť prázdne"
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgid "Show the week date in the calendar"
#~ msgstr "Zobraziť čísla týždňov v kalendári"
#~ msgid "If true, display the ISO week date in the calendar."
#~ msgstr ""
#~ "Ak je true, zobrazí v kalendári poradie dní v týždni podľa štandardu ISO."
#~ msgid "Use as Internet connection"
#~ msgstr "Použiť na pripojenie k internetu"
#~ msgid "%s is requesting access to your location."
#~ msgstr "Aplikácia %s požaduje prístup k vášmu umiestneniu."

File diff suppressed because it is too large Load Diff

View File

@ -74,15 +74,15 @@ static App *_global_app = NULL;
typedef struct
{
char *rid;
time_t start_time;
time_t end_time;
} CalendarOccurrence;
typedef struct
{
char *id;
char *uid;
char *rid;
char *source_id;
char *backend_name;
char *summary;
char *description;
@ -95,6 +95,12 @@ typedef struct
GSList *occurrences;
} CalendarAppointment;
typedef struct
{
ECalClient *client;
GHashTable *appointments;
} CollectAppointmentsData;
static time_t
get_time_from_property (icalcomponent *ical,
icalproperty_kind prop_kind,
@ -129,22 +135,6 @@ get_ical_uid (icalcomponent *ical)
return g_strdup (icalcomponent_get_uid (ical));
}
static char *
get_ical_rid (icalcomponent *ical)
{
icalproperty *prop;
struct icaltimetype ical_time;
prop = icalcomponent_get_first_property (ical, ICAL_RECURRENCEID_PROPERTY);
if (!prop)
return NULL;
ical_time = icalproperty_get_recurrenceid (prop);
return icaltime_is_valid_time (ical_time) && !icaltime_is_null_time (ical_time) ?
g_strdup (icaltime_as_ical_string (ical_time)) : NULL;
}
static char *
get_ical_summary (icalcomponent *ical)
{
@ -324,12 +314,14 @@ calendar_appointment_equal (CalendarAppointment *a,
CalendarOccurrence *ob = lb->data;
if (oa->start_time != ob->start_time ||
oa->end_time != ob->end_time)
oa->end_time != ob->end_time ||
null_safe_strcmp (oa->rid, ob->rid) != 0)
return FALSE;
}
return
null_safe_strcmp (a->uid, b->uid) == 0 &&
null_safe_strcmp (a->source_id, b->source_id) == 0 &&
null_safe_strcmp (a->backend_name, b->backend_name) == 0 &&
null_safe_strcmp (a->summary, b->summary) == 0 &&
null_safe_strcmp (a->description, b->description) == 0 &&
@ -345,18 +337,15 @@ calendar_appointment_free (CalendarAppointment *appointment)
GSList *l;
for (l = appointment->occurrences; l; l = l->next)
g_free (l->data);
g_slist_free (appointment->occurrences);
g_free (((CalendarOccurrence *)l->data)->rid);
g_slist_free_full (appointment->occurrences, g_free);
appointment->occurrences = NULL;
g_free (appointment->id);
appointment->id = NULL;
g_free (appointment->uid);
appointment->uid = NULL;
g_free (appointment->rid);
appointment->rid = NULL;
g_free (appointment->source_id);
appointment->source_id = NULL;
g_free (appointment->backend_name);
appointment->backend_name = NULL;
@ -377,13 +366,16 @@ calendar_appointment_free (CalendarAppointment *appointment)
static void
calendar_appointment_init (CalendarAppointment *appointment,
icalcomponent *ical,
ECalClient *cal,
icaltimezone *default_zone)
ECalClient *cal)
{
const char *source_uid;
icaltimezone *default_zone;
const char *source_id;
source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal)));
default_zone = e_cal_client_get_default_timezone (cal);
appointment->uid = get_ical_uid (ical);
appointment->rid = get_ical_rid (ical);
appointment->source_id = g_strdup (source_id);
appointment->backend_name = get_source_backend_name (cal);
appointment->summary = get_ical_summary (ical);
appointment->description = get_ical_description (ical);
@ -393,16 +385,6 @@ calendar_appointment_init (CalendarAppointment *appointment,
appointment->is_all_day = get_ical_is_all_day (ical,
appointment->start_time,
default_zone);
/* While the UID is usually enough to identify an event, only the triple
* of (source,UID,RID) is fully unambiguous; neither may contain '\n',
* so we can safely use it to create a unique ID from the triple
*/
source_uid = e_source_get_uid (e_client_get_source (E_CLIENT (cal)));
appointment->id = g_strdup_printf ("%s\n%s\n%s",
source_uid,
appointment->uid,
appointment->rid ? appointment->rid : "");
}
static icaltimezone *
@ -420,70 +402,50 @@ resolve_timezone_id (const char *tzid,
return retval;
}
static gboolean
calendar_appointment_collect_occurrence (ECalComponent *component,
time_t occurrence_start,
time_t occurrence_end,
gpointer data)
{
CalendarOccurrence *occurrence;
GSList **collect_loc = data;
occurrence = g_new0 (CalendarOccurrence, 1);
occurrence->start_time = occurrence_start;
occurrence->end_time = occurrence_end;
*collect_loc = g_slist_prepend (*collect_loc, occurrence);
return TRUE;
}
static void
calendar_appointment_generate_occurrences (CalendarAppointment *appointment,
icalcomponent *ical,
ECalClient *cal,
time_t start,
time_t end,
icaltimezone *default_zone)
{
ECalComponent *ecal;
g_assert (appointment->occurrences == NULL);
ecal = e_cal_component_new ();
e_cal_component_set_icalcomponent (ecal,
icalcomponent_new_clone (ical));
e_cal_recur_generate_instances (ecal,
start,
end,
calendar_appointment_collect_occurrence,
&appointment->occurrences,
(ECalRecurResolveTimezoneFn) resolve_timezone_id,
cal,
default_zone);
g_object_unref (ecal);
appointment->occurrences = g_slist_reverse (appointment->occurrences);
}
static CalendarAppointment *
calendar_appointment_new (icalcomponent *ical,
ECalClient *cal,
icaltimezone *default_zone)
ECalClient *cal)
{
CalendarAppointment *appointment;
appointment = g_new0 (CalendarAppointment, 1);
calendar_appointment_init (appointment,
ical,
cal,
default_zone);
calendar_appointment_init (appointment, ical, cal);
return appointment;
}
static gboolean
generate_instances_cb (ECalComponent *comp,
time_t start,
time_t end,
gpointer data)
{
ECalClient *cal = ((CollectAppointmentsData *)data)->client;
GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments;
CalendarAppointment *appointment;
CalendarOccurrence *occurrence;
const char *uid;
e_cal_component_get_uid (comp, &uid);
appointment = g_hash_table_lookup (appointments, uid);
if (appointment == NULL)
{
icalcomponent *ical = e_cal_component_get_icalcomponent (comp);
appointment = calendar_appointment_new (ical, cal);
g_hash_table_insert (appointments, g_strdup (uid), appointment);
}
occurrence = g_new0 (CalendarOccurrence, 1);
occurrence->start_time = start;
occurrence->end_time = end;
occurrence->rid = e_cal_component_get_recurid_as_string (comp);
appointment->occurrences = g_slist_append (appointment->occurrences, occurrence);
}
/* ---------------------------------------------------------------------------------------------------- */
struct _App
@ -526,6 +488,10 @@ app_update_timezone (App *app)
app->timezone_location = location;
print_debug ("Using timezone %s", app->timezone_location);
}
else
{
g_free (location);
}
}
static gboolean
@ -619,6 +585,7 @@ app_load_events (App *app)
GList *ll;
gchar *since_iso8601;
gchar *until_iso8601;
gchar *query;
/* out with the old */
g_hash_table_remove_all (app->appointments);
@ -645,14 +612,19 @@ app_load_events (App *app)
since_iso8601,
until_iso8601);
query = g_strdup_printf ("occur-in-time-range? (make-time \"%s\") "
"(make-time \"%s\")",
since_iso8601,
until_iso8601);
clients = calendar_sources_get_appointment_clients (app->sources);
for (l = clients; l != NULL; l = l->next)
{
ECalClient *cal = E_CAL_CLIENT (l->data);
GError *error;
gchar *query;
GSList *objects, *j;
ECalClientView *view;
CollectAppointmentsData data;
e_cal_client_set_default_timezone (cal, app->zone);
@ -666,45 +638,13 @@ app_load_events (App *app)
continue;
}
query = g_strdup_printf ("occur-in-time-range? (make-time \"%s\") "
"(make-time \"%s\")",
since_iso8601,
until_iso8601);
error = NULL;
objects = NULL;
if (!e_cal_client_get_object_list_sync (cal,
query,
&objects,
NULL, /* cancellable */
&error))
{
ESource *source = e_client_get_source (E_CLIENT (cal));
g_warning ("Error querying calendar %s: %s\n",
e_source_get_uid (source), error->message);
g_error_free (error);
g_free (query);
continue;
}
for (j = objects; j != NULL; j = j->next)
{
icalcomponent *ical = j->data;
CalendarAppointment *appointment;
appointment = calendar_appointment_new (ical, cal, app->zone);
if (appointment == NULL)
continue;
calendar_appointment_generate_occurrences (appointment,
ical,
cal,
data.client = cal;
data.appointments = app->appointments;
e_cal_client_generate_instances_sync (cal,
app->since,
app->until,
app->zone);
g_hash_table_insert (app->appointments, g_strdup (appointment->uid), appointment);
}
e_cal_client_free_icalcomp_slist (objects);
generate_instances_cb,
&data);
error = NULL;
if (!e_cal_client_get_view_sync (cal,
@ -733,12 +673,11 @@ app_load_events (App *app)
e_cal_client_view_start (view, NULL);
app->live_views = g_list_prepend (app->live_views, view);
}
g_free (query);
}
g_list_free (clients);
g_free (since_iso8601);
g_free (until_iso8601);
g_free (query);
app->cache_invalid = FALSE;
}
@ -929,16 +868,27 @@ handle_method_call (GDBusConnection *connection,
(start_time <= app->since &&
(end_time - 1) > app->since))
{
/* While the UID is usually enough to identify an event,
* only the triple of (source,UID,RID) is fully unambiguous;
* neither may contain '\n', so we can safely use it to
* create a unique ID from the triple
*/
char *id = g_strdup_printf ("%s\n%s\n%s",
a->source_id,
a->uid,
o->rid ? o->rid : "");
g_variant_builder_init (&extras_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&builder,
"(sssbxxa{sv})",
a->id,
id,
a->summary != NULL ? a->summary : "",
a->description != NULL ? a->description : "",
(gboolean) a->is_all_day,
(gint64) start_time,
(gint64) end_time,
extras_builder);
g_free (id);
}
}
}

View File

@ -59,6 +59,8 @@ main(int argc, char **argv)
gsize len;
int code;
gdk_set_allowed_backends("x11");
gtk_init (&argc, &argv);
clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
@ -66,6 +68,9 @@ main(int argc, char **argv)
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
return 1;
g_object_set (clutter_settings_get_default (), "window-scaling-factor", 1, NULL);
gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);
context = g_option_context_new (NULL);
/* pass unknown through to the JS script */

View File

@ -96,7 +96,8 @@ enum {
PROP_ID,
PROP_DBUS_ID,
PROP_ACTION_GROUP,
PROP_MENU
PROP_MENU,
PROP_APP_INFO
};
enum {
@ -138,6 +139,29 @@ shell_app_get_property (GObject *gobject,
if (app->running_state)
g_value_set_object (value, app->running_state->remote_menu);
break;
case PROP_APP_INFO:
if (app->info)
g_value_set_object (value, app->info);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
}
}
static void
shell_app_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ShellApp *app = SHELL_APP (gobject);
switch (prop_id)
{
case PROP_APP_INFO:
_shell_app_set_app_info (app, g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
@ -806,9 +830,9 @@ _shell_app_new (GDesktopAppInfo *info)
{
ShellApp *app;
app = g_object_new (SHELL_TYPE_APP, NULL);
_shell_app_set_app_info (app, info);
app = g_object_new (SHELL_TYPE_APP,
"app-info", info,
NULL);
return app;
}
@ -817,11 +841,10 @@ void
_shell_app_set_app_info (ShellApp *app,
GDesktopAppInfo *info)
{
g_clear_object (&app->info);
app->info = g_object_ref (info);
g_set_object (&app->info, info);
if (app->name_collation_key != NULL)
g_free (app->name_collation_key);
g_clear_pointer (&app->name_collation_key, g_free);
if (app->info)
app->name_collation_key = g_utf8_collate_key (shell_app_get_name (app), -1);
}
@ -1405,6 +1428,7 @@ shell_app_class_init(ShellAppClass *klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->get_property = shell_app_get_property;
gobject_class->set_property = shell_app_set_property;
gobject_class->dispose = shell_app_dispose;
gobject_class->finalize = shell_app_finalize;
@ -1483,5 +1507,17 @@ shell_app_class_init(ShellAppClass *klass)
"The primary menu exported by the remote application",
G_TYPE_MENU_MODEL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* ShellApp:app-info:
*
* The #GDesktopAppInfo associated with this ShellApp, if any.
*/
g_object_class_install_property (gobject_class,
PROP_APP_INFO,
g_param_spec_object ("app-info",
"DesktopAppInfo",
"The DesktopAppInfo associated with this app",
G_TYPE_DESKTOP_APP_INFO,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
}

View File

@ -107,6 +107,8 @@ static void recorder_set_draw_cursor (ShellRecorder *recorder,
static void recorder_pipeline_set_caps (RecorderPipeline *pipeline);
static void recorder_pipeline_closed (RecorderPipeline *pipeline);
static void recorder_remove_redraw_timeout (ShellRecorder *recorder);
enum {
PROP_0,
PROP_SCREEN,
@ -235,6 +237,8 @@ shell_recorder_finalize (GObject *object)
recorder_set_pipeline (recorder, NULL);
recorder_set_file_template (recorder, NULL);
recorder_remove_redraw_timeout (recorder);
g_clear_object (&recorder->a11y_settings);
G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
@ -317,6 +321,9 @@ recorder_fetch_cursor_image (ShellRecorder *recorder)
guint8 *data;
texture = meta_cursor_tracker_get_sprite (recorder->cursor_tracker);
if (!texture)
return;
width = cogl_texture_get_width (texture);
height = cogl_texture_get_height (texture);
stride = 4 * width;
@ -382,11 +389,17 @@ recorder_draw_cursor (ShellRecorder *recorder,
/* Retrieve a frame and feed it into the pipeline
*/
static void
recorder_record_frame (ShellRecorder *recorder)
recorder_record_frame (ShellRecorder *recorder,
gboolean paint)
{
GstBuffer *buffer;
guint8 *data;
ClutterCapture *captures;
int n_captures;
cairo_surface_t *image;
guint size;
uint8_t *data;
GstMemory *memory;
int i;
GstClock *clock;
GstClockTime now, base_time;
@ -418,21 +431,31 @@ recorder_record_frame (ShellRecorder *recorder)
return;
recorder->last_frame_time = now;
size = recorder->area.width * recorder->area.height * 4;
clutter_stage_capture (recorder->stage, paint, &recorder->area,
&captures, &n_captures);
data = g_malloc (size);
cogl_framebuffer_read_pixels (cogl_get_draw_framebuffer (),
recorder->area.x,
recorder->area.y,
recorder->area.width,
recorder->area.height,
CLUTTER_CAIRO_FORMAT_ARGB32,
data);
if (n_captures == 0)
return;
/*
* TODO: Deal with each capture region separately, instead of dropping
* anything except the first one.
*/
image = captures[0].image;
data = cairo_image_surface_get_data (image);
size = captures[0].rect.width * captures[0].rect.height * 4;
/* TODO: Capture more than the first framebuffer. */
for (i = 1; i < n_captures; i++)
cairo_surface_destroy (captures[i].image);
g_free (captures);
buffer = gst_buffer_new();
gst_buffer_insert_memory (buffer, -1,
gst_memory_new_wrapped (0, data, size, 0,
size, data, g_free));
memory = gst_memory_new_wrapped (0, data, size, 0, size,
image,
(GDestroyNotify) cairo_surface_destroy);
gst_buffer_insert_memory (buffer, -1, memory);
GST_BUFFER_PTS(buffer) = now;
@ -456,7 +479,7 @@ recorder_on_stage_paint (ClutterActor *actor,
ShellRecorder *recorder)
{
if (recorder->state == RECORDER_STATE_RECORDING)
recorder_record_frame (recorder);
recorder_record_frame (recorder, FALSE);
}
static void
@ -1554,7 +1577,7 @@ shell_recorder_close (ShellRecorder *recorder)
/* We want to record one more frame since some time may have
* elapsed since the last frame
*/
clutter_actor_paint (CLUTTER_ACTOR (recorder->stage));
recorder_record_frame (recorder, TRUE);
recorder_remove_update_pointer_timeout (recorder);
recorder_close_pipeline (recorder);

View File

@ -210,41 +210,40 @@ write_screenshot_thread (GTask *result,
static void
do_grab_screenshot (ShellScreenshot *screenshot,
ClutterStage *stage,
int x,
int y,
int width,
int height)
{
CoglBitmap *bitmap;
ClutterBackend *backend;
CoglContext *context;
int stride;
guchar *data;
ShellScreenshotPrivate *priv = screenshot->priv;
ClutterCapture *captures;
int n_captures;
int i;
backend = clutter_get_default_backend ();
context = clutter_backend_get_cogl_context (backend);
clutter_stage_capture (stage, FALSE,
&(cairo_rectangle_int_t) {
.x = x,
.y = y,
.width = width,
.height = height
},
&captures,
&n_captures);
priv->image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
width, height);
if (n_captures == 0)
return;
/*
* TODO: Deal with each capture region separately, instead of dropping
* anything except the first one.
*/
priv->image = captures[0].image;
data = cairo_image_surface_get_data (priv->image);
stride = cairo_image_surface_get_stride (priv->image);
for (i = 1; i < n_captures; i++)
cairo_surface_destroy (captures[i].image);
bitmap = cogl_bitmap_new_for_data (context,
width,
height,
CLUTTER_CAIRO_FORMAT_ARGB32,
stride,
data);
cogl_framebuffer_read_pixels_into_bitmap (cogl_get_draw_framebuffer (),
x, y,
COGL_READ_PIXELS_COLOR_BUFFER,
bitmap);
cairo_surface_mark_dirty (priv->image);
cogl_object_unref (bitmap);
g_free (captures);
}
static void
@ -312,7 +311,7 @@ grab_screenshot (ClutterActor *stage,
screen = shell_global_get_screen (priv->global);
meta_screen_get_size (screen, &width, &height);
do_grab_screenshot (screenshot, 0, 0, width, height);
do_grab_screenshot (screenshot, CLUTTER_STAGE (stage), 0, 0, width, height);
if (meta_screen_get_n_monitors (screen) > 1)
{
@ -381,6 +380,7 @@ grab_area_screenshot (ClutterActor *stage,
ShellScreenshotPrivate *priv = screenshot->priv;
do_grab_screenshot (screenshot,
CLUTTER_STAGE (stage),
priv->screenshot_area.x,
priv->screenshot_area.y,
priv->screenshot_area.width,

View File

@ -287,13 +287,8 @@ st_shadow_helper_paint (StShadowHelper *helper,
ClutterActorBox *actor_box,
guint8 paint_opacity)
{
ClutterActorBox allocation;
float width, height;
clutter_actor_box_get_size (actor_box, &width, &height);
_st_paint_shadow_with_opacity (helper->shadow,
helper->pipeline,
&allocation,
actor_box,
paint_opacity);
}