Compare commits

...

106 Commits

Author SHA1 Message Date
de814752d6 search.js: Vertically center the provider icon 2017-07-05 01:00:49 +03:00
c36f006b88 update sass 2017-07-05 00:56:41 +03:00
bf884ae9ea search.js: Apply the bold style in real time 2017-07-05 00:32:16 +03:00
7bbff9d0c0 search.js: Propagate searchResultsView down the hierarchy 2017-07-05 00:32:09 +03:00
04ad2b24d8 util: Wrap g_regex_escape_string() 2017-07-04 22:34:18 +03:00
4ffbec5b75 search.js: Increase maximum number of visible list search results 2017-07-04 22:34:18 +03:00
d35f2d375b gnome-shell.css: Make search result description semitransparent 2017-07-04 22:34:18 +03:00
235d4b244d gnome-shell.css: Use standard font size for the search-result-title class 2017-07-04 22:34:18 +03:00
9a007058ae search.js: Replace the gradient separator with a simple line 2017-07-04 22:34:18 +03:00
985e53a04e search.js: Tweak the sizes of search results icons
Just a small tweak of icon sizes. This patch could be easily
included in any of the two bigger patches.
2017-07-04 22:34:18 +03:00
aed6d466cb search.js: Refactor providerIcon into providerInfo
In order to match the current mockups, the providerIcon
class needed to include both the name of the provider
and the label that informs the user about how many more
search results are available for that specific provider.
The latter replaces the plus sign icon that has been
used so far.

https://bugzilla.gnome.org/show_bug.cgi?id=749957
2017-07-04 22:34:14 +03:00
c62e3614d5 search.js: Make the results take more horizontal space
In order to make gnome-shell search functionality fit on
smaller screens, like those of devices, search results
need to take advantage of more horizontal space so that
any extra space can be used efficiently.

In order to do so, change the layout of the ListSearchResult
class from a vertical one, to a horizontal one and also
decrease the padding of the list-search-result-content css
class.

https://bugzilla.gnome.org/show_bug.cgi?id=749957
2017-07-01 02:53:25 +03:00
8dae0b5767 update sass 2017-07-01 02:24:57 +03:00
a00a186772 authPrompt: Remove stray tab character 2017-06-29 18:16:32 -05:00
e3330b638a Revert "gdmUtil: Fix auth prompt drawing over user list"
This reverts commit 875a1d6159.

(this was pushed accidentally, isn't the right patch, and lacks
 a bug reference)
2017-06-28 13:16:22 -04:00
bdc15d680a Revert "data: install process-working.svg to filesystem"
This reverts commit 0e922eee36.

(this was pushed accidentally, and is meant to be a downstream
 only patch)
2017-06-28 13:16:02 -04:00
82e20f94f4 authPrompt: Reorder import
5b339c8371 put this in the wrong place.
2017-06-28 02:35:46 -05:00
5221744d1d workspace: Reset source IDs to zero after removing them
There were some source IDs that were not being reset to zero when
removing the associated sources, resulting on some critical errors
being dumped when _realRecalculateWindowPositions() got called
after that point, via _delayedWindowRepositioning().
2017-06-27 10:10:40 +01:00
293d1697fe Fix a typo 2017-06-26 13:47:19 -05:00
9c8a470934 objectManager: handle proxies coming and going
Ever since commit b8e29ae8c7
(I think), start up is littered with this message:

 Gjs-WARNING **: JS ERROR: could not get remote objects for service
 org.gnome.SettingsDaemon.Smartcard path

since gnome-shell is now started before gnome-settings-daemon.

This commit addresses the problem by making the object manager code
not try to autostart its proxy, and instead wait for it to appear.

https://bugzilla.gnome.org/show_bug.cgi?id=772589
2017-06-22 14:31:19 -04:00
9c4e875de4 objectManager: handle object manager sending empty array
If the service implementing the object manager returns
a 0 length array we currently throw an exception.

This commit fixes that.

https://bugzilla.gnome.org/show_bug.cgi?id=780403
2017-06-22 14:31:19 -04:00
0e922eee36 data: install process-working.svg to filesystem
This helps prevent unlock failure on inplace upgrades between
7.3 and 7.4
2017-06-22 14:31:19 -04:00
875a1d6159 gdmUtil: Fix auth prompt drawing over user list
If the user fails to enter their password then hits escape, we
jump back to the user list, then ask again for a password in a
garbled screen. this commit fixes that by guarding against the retry
if the fail counter is reset.
2017-06-22 14:31:19 -04:00
e995730a4d style: Fix nesting of elements
.login-dialog-user-selection-box is the enclosing element, not between
.login-dialog-not-listed-button and .login-dialog-not-listed-label.

https://bugzilla.gnome.org/show_bug.cgi?id=784040
2017-06-22 02:06:34 +02:00
3d209838a1 Bump version to 3.25.3
Update NEWS.
2017-06-21 21:58:31 +02:00
69396bbc1f build: Drop obsolete dist file
We no longer use ruby-sass.
2017-06-21 21:58:31 +02:00
a0140fb2c7 calendar-server: Specify the timezone for the view query
Otherwise UTC is used which results in a different interpretation of
floating time events. This then could lead to a mismatch with events
generated e_cal_client_generate_instances_sync() which always uses the
default timezone. Such a mismatch would then cause constant invalidation
and reloading.

https://bugzilla.gnome.org/show_bug.cgi?id=781950
2017-06-16 17:13:50 +02:00
d8e7fc403b appDisplay: Add a null-check for the scrollview's fade ClutterEffect
This effect will only be created when the StScrollView actor has either
a non-zero vertical or horizontal fade offset defined, so we need to
add a null-check in these two cases before assuming it's there.

https://bugzilla.gnome.org/show_bug.cgi?id=783823
2017-06-15 15:01:51 +01:00
3d6fdc8ae2 sessionMode: Drop unused import 2017-06-15 15:52:37 +02:00
47b109d25b tests/entry: add interactive tests for entry hints
https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 14:00:57 -07:00
6ed7034a6b st-entry: Add support for a "hint actor"
This allows a full ClutterActor to be used as hint in the entry, instead
of a simple string.

The string case has been now re-implemented on top of the hint actor.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 14:00:57 -07:00
4e07d0b073 st-entry: don't possibly allocate actors a negative size
Clutter will complain about this, so protect the code against such edge
case.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 14:00:57 -07:00
708f65e388 tests/entry: add text-shadow
Also make the text larger and add an example string, since event
delivery does not seem to work properly under tests.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 14:00:57 -07:00
8783654b38 st-entry: Add support for the text-shadow CSS property
It's supported everywhere else, we should also support it here.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 14:00:57 -07:00
4c72244c2e tests/entry: remove unused import
This is actually harmful, since it will drag a depepdency chain that
we're not able to satisfy from the tests.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 13:59:15 -07:00
9e0e7a4067 st-im-text: don't require st_im_text_set_event_window() to be called
Tests like tests/interactive/entry.js don't call it; make sure we still
display an entry in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 13:59:09 -07:00
a256a35779 st-entry: don't assume a cursor func has been set
That won't be the case when called from tests.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 13:59:04 -07:00
d5cac6559d st: initialize static variables to NULL
https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-14 13:58:58 -07:00
ce262b36d4 autorunManager: Remove unused import 2017-06-09 16:58:15 +02:00
02a72b12bb st-entry: remove unused variable 2017-06-06 14:52:33 -07:00
7f7d18749e st-entry: Add primary-icon and secondary-icon read-write properties
Instead of simply providing a setter, we now provide real properties.

https://bugzilla.gnome.org/show_bug.cgi?id=783484
2017-06-06 14:51:49 -07:00
2e1e00c3de st: fix "text-shadow: none" to correctly draw no shadow
We would incorrectly create a solid black st-shadow with no blur when
parsing in a "none" value from css.

https://bugzilla.gnome.org/show_bug.cgi?id=783485
2017-06-06 12:40:48 -07:00
e2838a7e06 Remove an explicit destroy to the ClutterText actor
This is the same as the previous commit, but for StEntry.
We don't have any need to explicitly destroy this actor in our dispose
implementation, and doing so breaks the assumption that we can access
the clutter_text from within destroy.

https://bugzilla.gnome.org/show_bug.cgi?id=783483
2017-06-06 08:38:45 -07:00
ad2cb22785 Remove dangerous explicit destroy
There's no need to explicitly destroy the ClutterText actor inside the
label; doing so is actually harmful, as it will break the normal
reference cycle between container and children.
As StLabel doesn't hold any extra reference to the ClutterText actor and
just uses clutter_actor_add_actor() to add it to itself, let the normal
container dispose cycle run to dispose of the reference.

https://bugzilla.gnome.org/show_bug.cgi?id=783483
2017-06-06 08:38:45 -07:00
7ad6bd95f7 docs: Remove reference to libgnome-shell-base
https://bugzilla.gnome.org/show_bug.cgi?id=783439
2017-06-05 23:11:02 +08:00
50d37e74a3 portalHelper: Fix auth URI not being passed to window
Gjs-Message: JS WARNING: [resource:///org/gnome/shell/portalHelper/main.js 360]: reference to undefined property top.uri
is caused by the URI variable actually being called "url".

https://bugzilla.gnome.org/show_bug.cgi?id=783286
2017-05-31 16:51:05 +02:00
c22287b517 portalHelper: Don't go through proxies for captive portals
When using an SSH tunnel (through a SOCKS proxy) to funnel all
the outgoing traffic, we need the captive portal to not go through that
proxy, otherwise we can't go through the proxy because we're not
connected to the Internet and we can't go through the portal because
we're not connected through the proxy.

This fixes a blank captive portal window and no error reporting in that
particular configuration.

https://bugzilla.gnome.org/show_bug.cgi?id=769692
2017-05-31 16:03:11 +02:00
73cffb3c7f tests: Adjust test runner
The script currently assumes that srcdir is relative to builddir,
which is not the case for build directories outside the source tree
like the one used by jhbuild.
While we could get fancy and prepend the builddir if srcdir is relative,
there's nothing wrong with a relative path as we cd into the builddir
before evaluating srcdir.

https://bugzilla.gnome.org/show_bug.cgi?id=783206
2017-05-30 12:41:16 +02:00
4bada06917 build: Drop obsolete pkg-config check
The check belongs to the test-recorder executable that was dropped
in commit d52c95a15f.

https://bugzilla.gnome.org/show_bug.cgi?id=783206
2017-05-30 12:41:16 +02:00
31a4705789 build: Stop building a separate libgnome-shell-base
The static library was split out to avoid duplicate compilation
of mutter-independent libgnome-shell sources when we had a
wayland/non-wayland split. With the separate libmutter-wayland
library long gone, there's no reason to make the build more
complicated than it needs to be, so fold libgnome-shell-base
back into the regular libgnome-shell.

https://bugzilla.gnome.org/show_bug.cgi?id=783206
2017-05-30 12:41:16 +02:00
60c00f0472 build: Always install xdg-desktop-portal metadata
The build target accidentally ended up in a network manager conditional,
though the portal doesn't depend on NM in any way.

https://bugzilla.gnome.org/show_bug.cgi?id=783206
2017-05-30 12:41:16 +02:00
e7bf23890b build: Drop check for gjs-console
Nowadays all javascript code is run via small C-wrappers ...

https://bugzilla.gnome.org/show_bug.cgi?id=783206
2017-05-30 12:41:16 +02:00
15d387df5f build: Switch to sassc for generating style
GTK+ switched from ruby-based sass to c-based sassc for performance
reasons. It makes sense to follow suit, if not to not require two
tools for the same job ...

https://bugzilla.gnome.org/show_bug.cgi?id=783210
2017-05-30 12:41:16 +02:00
e02d6e5285 panel: Update .solid style on session mode changes
The .solid style isn't supposed to apply for modes that don't support
windows, but for this to work we have to update the style on session
mode changes.

https://bugzilla.gnome.org/show_bug.cgi?id=783202
2017-05-30 11:41:35 +02:00
19d0169de4 shell-global: Use MetaSettings for settings
Scale settings were moved from MetaBackend to a new MetaSettings.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
2017-05-26 15:27:25 +08:00
7a2d4959f2 Bump version to 3.25.2
Update NEWS.
2017-05-24 23:51:43 +02:00
6b3c9539f6 st: Fix doc comment
The trailing colon breaks recent versions of gtk-doc, so drop it.
2017-05-24 23:39:51 +02:00
7e7e3ec016 lookingGlass: Use standard icon names for GC icon
Commit b929320d4 added a toolbar item to force garbage collection,
however it won't be visible for most users, as it uses a non-standard
legacy icon name (the default icon theme dropped it as far back as 2009).

https://bugzilla.gnome.org/show_bug.cgi?id=782982
2017-05-24 23:39:51 +02:00
83fb34608c windowManager: Add animations for maximize and unmaximize
The fullscreen animation code is now generic enough to handle any
size change animations, so stop limiting it to (un)fullscreen to
get animations on (un)maximize as well.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
a72f0604dc windowManager: Rename functions and variables
Stop using the word 'fullscreen' since the code is also
going to be used for maximize and tile actions.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
4dfad536a3 windowManager: Use sourceRect for consistency
Now that we always pass the old frame rect, we can use that
instead of picking up the dimensions of the clone actor.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
0dca5e513b windowManager: Generalize translation values
Currently, the translation values are set with the assumption that
one of the actors represents a fullscreen window. In order to
generalize it for any size change transition, we can simply swap
the monitor rect with the source or target rect as appropriate,
and translate the actor from the target to the source position by
subtracting the former and adding the latter.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
7090592477 windowManager: Rename variable
Since there is already targetRect that represents where the
window is going to move, rename oldRect to sourceRect to
represent from where the window is moving.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
63f2fdd1a4 build: Use #!/bin/sh instead of #!/bin/bash
There is no bashism in autogen.sh now.

https://bugzilla.gnome.org/show_bug.cgi?id=780215
2017-05-24 22:08:33 +08:00
e94de67bd2 switcherPopup: Ignore implicit enter events when the popup is mapped
If the popup happens to be mapped beneath the pointer, mutter will now
emit an implicit enter notify event (i.e. not caused by pointer motion).
In this case the switcherPopup still goes and selects the item, which
results in too sensitive alt-tab menus if the pointer happens to be in
the wrong place.

Make highlighting rely on motion events instead, so it always involves
user interaction when triggered by the pointer.

https://bugzilla.gnome.org/show_bug.cgi?id=755164
2017-05-23 18:38:35 +02:00
817ff52414 util: Always use 12h format if requested
Whether we show times in 12h format currently depends on:
 - the 'clock-format' desktop setting
 - the locale support for AM/PM

This was consist with other GNOME components, however both the
WallClock[0] and the Date+Time Settings panel[1] dropped the
second check after GDateTime started supporting AM/PM independently
from the locale, so we should follow suite.

[0] https://git.gnome.org/browse/gnome-desktop/commit?id=226fe725ef2cb2
[1] https://git.gnome.org/browse/gnome-control-center/commit?id=85cd910af

https://bugzilla.gnome.org/show_bug.cgi?id=782930
2017-05-22 15:41:29 +02:00
a55599a239 Switch to stable libsecret API
Most of the libsecret API was declared stable in 0.18 and the stable API
now provides everything we need, so switch from libsecret-unstable to
libsecret-1.

https://bugzilla.gnome.org/show_bug.cgi?id=782637
2017-05-21 04:49:11 +02:00
94114d82ff Update Turkish translation
(cherry picked from commit e7ad9d7217)
2017-05-20 03:52:11 +00:00
7cc88f96c4 theme: Update sass submodule 2017-05-19 19:02:32 +02:00
447bf55e45 panel: Add transparency when free-floating
The solid black top bar we currently use works well for maximized
or tiled windows, as it puts focus on the application content by
blending into the monitor bezel. However it also visually reduces
the screen space, which is particularly noticeable when no window
is located nearby. Having the top bar blend with the background is
a better option in that case, so track window positions and add
some transparency when the top bar is free-floating.

https://bugzilla.gnome.org/show_bug.cgi?id=747163
2017-05-19 18:58:40 +02:00
9d53a7700a tests: Update markup test for function moved to messageList
https://bugzilla.gnome.org/show_bug.cgi?id=782802
2017-05-19 08:30:04 -04:00
51145a3d41 Update Serbian Latin translation
(cherry picked from commit 4c1467196e)
2017-05-18 21:56:33 +00:00
1297315cc2 Update Serbian translation 2017-05-18 21:54:51 +00:00
b859a7f763 Update German translation
(cherry picked from commit 946ff3b380)
2017-05-18 18:55:55 +00:00
41baf0fc74 keyboard: Drop dbus naming semantics from Set[Entry|Cursor]Location
Those functions don't proxy dbus method calls anymore, so just drop the
uppercase 'S'.

https://bugzilla.gnome.org/show_bug.cgi?id=777342
2017-05-15 14:50:02 +02:00
c324395ee6 keyboard: Remove Show/Hide calls
And merge with the "internal" show/hide() ones. Those functions don't
proxy dbus method calls anymore, so it makes no sense to expose these.
Also, the timestamp is no longer needed as there is a single source for
these events.

https://bugzilla.gnome.org/show_bug.cgi?id=777342
2017-05-15 14:50:02 +02:00
aecd1c126a keyboard: Avoid runtime dependency on the Caribou daemon
The caribou daemon only gives us focus tracking, which is almost 1:1 with
our own FocusCaretTracker implementation. This means we can entirely
replace the Caribou daemon inside gnome-shell, reducing the Caribou
dependency to just libcaribou, and more specifically the
CaribouKeyboardModel we pull the keyboard models from.

As we still need underneath a CaribouDisplayAdapter to drive the keyboard,
reuse the wayland one, which has been renamed to make it look generic, plus
it will use the virtual input device API from mutter/clutter.

https://bugzilla.gnome.org/show_bug.cgi?id=777342
2017-05-15 14:50:02 +02:00
9b7304488e Fix bashism in autogen.sh
https://bugzilla.gnome.org/show_bug.cgi?id=780215
2017-05-11 15:54:16 +02:00
6362b3d057 dateMenu: Fix a runtime warning
GJS now warns about excess parameters, so wrap the queue_relayout()
into an anonymous function instead of using it directly as signal
handler.
2017-05-11 15:20:10 +02:00
0142fae742 search: copy result to clipboard if requested
Some search providers such as GNOME Characters want to copy search
results to clipboard.  However, on Wayland, clipboards are only
accessible from applications that have a visible surface on display.

This patch allows a search provider to request the shell to copy a
search result to clipboard when 'clipboardText' is included in the meta
of the result.

https://bugzilla.gnome.org/show_bug.cgi?id=775099
2017-05-11 11:11:22 +02:00
73680e2433 popupMenu: Change the position of the icon in PopupImageMenuItem
We are moving the icon to be added before the text instead of after,
which is consistent with other menu items in other popup menus, such
as the ones in the system indicator's popup menu.

https://bugzilla.gnome.org/show_bug.cgi?id=782166
2017-05-09 18:32:23 +01:00
e38c26894b popupMenu: Allow specifying an icon on PopupMenuBase.addAction()
This allows passing an optional icon parameter to addAction()
so that a PopupImageMenuItem instance is created instead of a
PopupMenuItem if an icon is specified.

https://bugzilla.gnome.org/show_bug.cgi?id=782166
2017-05-09 18:32:23 +01:00
28ca96064b popupMenu: Accept either an icon name or a GIcon on PopupImageMenuItem
Add an extra check to setIcon() so that either a GIcon or an string
with the icon's name is handlded, so that we can create menu items
in different ways (e.g. by passing a GIcon created from a resource).

https://bugzilla.gnome.org/show_bug.cgi?id=782166
2017-05-09 18:32:23 +01:00
be95a63a03 Update Catalan translation 2017-05-07 21:31:02 +02:00
2a3a5dfc0b theme: Use font-relative width for prompts
The usual expectation when selecting large fonts is for content to
be bigger, not that less content is displayed. While not always
possible, there's no reason not to scale modal dialogues with the
font size.

https://bugzilla.gnome.org/show_bug.cgi?id=782000
2017-05-05 11:27:29 +02:00
94a0ae1ec3 entry: Fix *-icon-clicked handler
Commit ffe4eaf00d broke the handler by fetching the instance private
from the wrong actor - as we don't use the ::primary-icon-clicked signal,
and the ::secondary-icon-clicked signal still works by accident, nobody
noticed until now ...

https://bugzilla.gnome.org/show_bug.cgi?id=782190
2017-05-05 00:38:54 +02:00
44fb014a0d Bump version to 3.25.1
Update NEWS.
2017-04-27 18:30:05 +02:00
8007f4dda3 docs: Fix typo 2017-04-27 18:30:05 +02:00
ff425d1db7 extensionSystem: handle reloading broken extensions
Some extensions out there may fail to reload. When that happens,
we need to catch any exceptions so that we don't leave things in
a broken state that could lead to leaving extensions enabled in
the screen shield.

https://bugzilla.gnome.org/show_bug.cgi?id=781728
2017-04-25 17:47:08 +02:00
9a65f20d91 Update Arabic translation 2017-04-24 16:40:38 +02:00
0770383f78 Fix to Catalan translation 2017-04-22 22:07:28 +02:00
06fdf2fdc8 extensionPrefs: Avoid a runtime warning
Since 5b3fb024be, the main window is only shown when not launched
with a valid UUID. As GtkDialog isn't meant to be used standalone,
we currently trigger a (harmless but annoying) warning in case
the main window isn't shown; we can avoid the warning by setting
up the preference dialog manually instead of using the GtkDialog
convenience class.

https://bugzilla.gnome.org/show_bug.cgi?id=781545
2017-04-20 19:18:23 +02:00
7a20683728 extensionPrefs: Fix enum member name 2017-04-20 17:35:35 +02:00
8e443a2aff WeatherClient: set enabled providers after setting a valid location
So far, the GWeatherInfo was given the enabled weather providers
as a parameter, at construction time. Because of the way in
which libgweather was designed, setting the providers right from
the beginning enabled libgweather to use them internally in order
to update its state. Updating the internal state is only relevant
when there is a valid location set, which is not guaranteed at the
time when the GWeatherInfo object is constructed.

In order to fix this, enable no providers at construction time and
only set valid providers after setting a valid location.

https://bugzilla.gnome.org/show_bug.cgi?id=780404
2017-04-19 20:41:35 +03:00
fcbb942e24 loginDialog: Fix session button can be clicked
When session menu button is hidden, button can be clicked and show popup
menu.

https://bugzilla.gnome.org/show_bug.cgi?id=781482
2017-04-19 10:27:41 -04:00
1508d76d32 build: Require bash for pushd
If using sh, there's no pushd. Make autogen.sh execute with bash instead.
2017-04-15 00:00:54 -07:00
ef9dee2a05 Update Serbian translation 2017-04-13 00:09:44 +00:00
2714d8d0ce Update Italian translation
(cherry picked from commit 635bdea284)
2017-04-11 06:41:37 +00:00
243dae14ea background: Fix file check
The _animationFile property was removed in commit 8a4c862633 ...
2017-04-11 02:43:07 +02:00
2cce1b9ea0 appFavorites: Rename gnome-music.desktop
Recently Music gained a flatpak manifest inside the repo in bug 779905.
However that requires the desktop file to be properly named like
DBUS addresses are.

This patch renames the old Music desktop file to the new one.

https://bugzilla.gnome.org/show_bug.cgi?id=780157
2017-04-09 11:04:40 +02:00
89f4e983d6 Update Croatian translation
(cherry picked from commit c526413119)
2017-04-08 15:16:44 +00:00
f680cf6050 Update Greek translation 2017-04-08 15:07:01 +00:00
4cd4678194 Add ShowMonitorLabels2 D-Bus API
Add a new D-Bus method for setting the monitor labels. This new method
takes connector names instead of output ids for associating with actual
monitors.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
2017-04-07 22:30:35 +08:00
082bc20bb9 shell-global: Get UI scaling factor from mutter
Let mutter determine the UI scale, while taking things like monitor
layout mode into consideration.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
2017-04-07 22:30:35 +08:00
32ea7d763a Don't set clutters 'window-scaling-factor' property
It doesn't exist anymore.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
2017-04-07 22:30:35 +08:00
44e80f4c46 st-texture-cache: Plug some pixbuf refcount leaks on async operations
When extracting the sliced image, the GTask grants data ownership on
g_task_propagate_*, so the pixbuf list must be properly freed. On async
load, we just left a dangling reference when returning on the async
task.

https://bugzilla.gnome.org/show_bug.cgi?id=642652
2017-04-07 14:17:59 +02:00
63 changed files with 3686 additions and 2389 deletions

62
NEWS
View File

@ -1,3 +1,65 @@
3.25.3
======
* Bypass proxies for captive portal [Bastien; #769692]
* Correctly handle "text-shadow: none;" [Matt; #783485]
* Add StEntry:hint-actor property [Mario; #783484]
* Support text-shadow CSS property in StEntry [Mario; #783484]
* Misc. bug fixes [Jonas, Florian, Bastien, Ting-Wei, Cosimo, Mario, Sebastian;
#777732, #783202, #783210, #783206, #783286, #783439, #783483, #783823,
#781950]
Contributors:
Jonas Ådahl, Cosimo Cecchi, Sebastian Keller, Ting-Wei Lan, Florian Müllner,
Bastien Nocera, Mario Sanchez Prada, Matt Watson
3.25.2
======
* Fix StEntry::primary-icon-clicked emission [Florian; #782190]
* Add an optional icon parameter to PopupMenu.addAction() [Mario; #782166]
* Allow search providers to include clipboard text with results [Daiki; #775099]
* Reduce dependency on Caribou [Carlos; #777342]
* Add transparency to top bar when free floating [Alessandro; #747163]
* Animate maximize/unmaximize operations [Alessandro; #766685]
* Misc. bug fixes [Florian, Matthias, Jeremy, Michael, Carlos, Lan; #782000,
#780215, #782802, #782637, #782930, #755164, #780215, #782982]
Contributors:
Jeremy Bicha, Michael Biebl, Alessandro Bono, Carlos Garnacho, Ting-Wei Lan,
Matthias Liertzer, Florian Müllner, Mario Sanchez Prada, Daiki Ueno
Translations:
Jordi Mas [ca], Christian Stadelmann [de], Милош Поповић [sr],
Милош Поповић [sr@latin], Furkan Ahmet Kara [tr]
3.25.1
======
* Close Wifi selection dialog on lock [Florian; #780054]
* Fix DND over window previews in overview [Florian; #737166]
* Do not lock the screen when disabled by lockdown settings [Florian; #780212]
* Follow GNOME Weather's location permissions [Florian; #780252]
* Fix portals that require a new window to be loaded [Catalin; #759044]
* Fix restricting menus to screen height on HiDPI displays [Cosimo; #753305]
* Misc. bug fixes and cleanups [Florian, Cosimo, Bastien, Catalin, Carlos G.,
Jonas, Carlos S., Xiaoguang, Rares, Emilio; #780063, #780321, #780381,
#780453, #758873, #780606, #642652, #777732, #780157, #781482, #780404,
#781545, #781728]
Contributors:
Jonas Ådahl, Cosimo Cecchi, Philip Chimento, Carlos Garnacho, Catalin Iacob,
Florian Müllner, Bastien Nocera, Emilio Pozuelo Monfort, Carlos Soriano,
Rares Visalom, Xiaoguang Wang
Translations:
Marek Cernocky [cs], Piotr Drąg [pl], Anders Jonsson [sv], Stas Solovey [ru],
Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Daniel Korostil [uk],
Kukuh Syafaat [id], Milo Casagrande [it], Jiri Grönroos [fi],
Daniel Mustieles [es], Balázs Úr [hu], Guillaume Bernard [fr],
Changwoo Ryu [ko], Mario Blättermann [de], Fran Dieguez [gl],
Dušan Kazik [sk], Yuras Shumovich [be], Fabio Tomat [fur],
Kjartan Maraas [nb], Aurimas Černius [lt], Trần Ngọc Quân [vi],
Rūdolfs Mazurs [lv], Γιάννης Κουτσούκος [el], gogo [hr], Марко Костић [sr],
Jordi Mas [ca], Khaled Hosny [ar]
3.24.0
======

View File

@ -4,7 +4,9 @@
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
pushd $srcdir
olddir="$(pwd)"
cd "${srcdir}"
(test -f configure.ac \
&& test -d src) || {
@ -26,8 +28,8 @@ gtkdocize --copy || exit 1
intltoolize --force --copy --automake || exit 1
autoreconf --verbose --force --install || exit 1
popd
cd "${olddir}"
if [ "$NOCONFIGURE" = "" ]; then
$srcdir/configure "$@" || exit 1
"${srcdir}/configure" "$@" || exit 1
fi

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.24.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.25.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AX_IS_RELEASE([git-directory])
AC_CONFIG_HEADERS([config.h])
@ -61,7 +61,6 @@ if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
AC_MSG_RESULT(yes)
build_recorder=true
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules $LIBMUTTER_CLUTTER)
else
AC_MSG_RESULT(no)
fi
@ -85,9 +84,9 @@ AC_MSG_RESULT($enable_systemd)
GOBJECT_INTROSPECTION_MIN_VERSION=1.49.1
GJS_MIN_VERSION=1.47.0
MUTTER_MIN_VERSION=3.24.0
MUTTER_MIN_VERSION=3.25.3
GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.45.3
GIO_MIN_VERSION=2.53.0
LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.17.2
POLKIT_MIN_VERSION=0.100
@ -159,9 +158,6 @@ AC_SUBST(MUTTER_GIR_DIR)
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir $LIBMUTTER`
AC_SUBST(MUTTER_TYPELIB_DIR)
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
AC_SUBST(GJS_CONSOLE)
GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable glib_compile_resources gio-2.0`
AC_SUBST(GLIB_COMPILE_RESOURCES)
@ -190,7 +186,7 @@ if test "x$enable_networkmanager" != "xno"; then
[libnm-glib
libnm-util >= $NETWORKMANAGER_MIN_VERSION
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
libsecret-unstable],
libsecret-1 >= 0.18],
[have_networkmanager=yes],
[have_networkmanager=no])
@ -250,7 +246,7 @@ if test -z "$GDBUS_CODEGEN"; then
AC_MSG_ERROR([gdbus-codegen not found])
fi
AC_PATH_PROG([SASS],[sass],[])
AC_PATH_PROG([SASSC],[sassc],[])
AC_CONFIG_FILES([
Makefile

View File

@ -1,15 +1,15 @@
CLEANFILES =
NULL =
portaldir = $(datadir)/xdg-desktop-portal/portals
portal_DATA = gnome-shell.portal
desktopdir=$(datadir)/applications
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
@ -56,7 +56,6 @@ theme_sources = \
dist_theme_files = \
$(theme_sources) \
theme/Gemfile \
theme/HACKING \
theme/README \
theme/gnome-shell-sass/COPYING \
@ -64,14 +63,14 @@ dist_theme_files = \
theme/gnome-shell-sass/NEWS \
theme/gnome-shell-sass/README \
theme/gnome-shell-sass/gnome-shell-sass.doap \
theme/pad-osd.css \
theme/pad-osd.css \
theme/parse-sass.sh \
$(NULL)
%.css: %.scss $(theme_sources)
@if test -n "$(SASS)"; then \
@if test -n "$(SASSC)"; then \
if $(AM_V_P); then PS4= set -x; else echo " GEN $@"; fi; \
$(SASS) --sourcemap=none -f -q --update $<; \
$(SASSC) -a $< $@; \
fi
resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/theme --generate-dependencies $(srcdir)/gnome-shell-theme.gresource.xml)

View File

@ -1 +0,0 @@
gem "sass", "~> 3.4.0"

View File

@ -3,10 +3,10 @@ Summary
* Do not edit the CSS directly, edit the source SCSS files and process them with SASS (running
`make` should do that when you have the required software installed, as described below;
run `/.parse-sass.sh` manually if it doesn't)
* To be able to use the lates/adequate version of sass, install ruby, gem, sass & bundle.
On Fedora F20, this is done with `sudo dnf install rubygems && gem install bundle && bundle install`
from the same directory this README resides in.
run `./parse-sass.sh` manually if it doesn't)
* Most SASS preprocessors should produce similar results, however the build system
integration and 'parse-sass.sh' script use sassc. You should be able to install
it with `pkcon install sassc` or your distribution's package manager.
How to tweak the theme
----------------------
@ -31,6 +31,4 @@ _common.scss - actual definitions of style for each widget. This is where
your changes.
You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the
_common.scss file, you can either run the ./parse-sass.sh script or keep SASS watching for changes as you
edit. This is done by running `bundle exec sass --watch --sourcemap=none .` If sass is out of date, or is
missing, you can install it with `bundle install`.
_common.scss file, you can either run make or the ./parse-sass.sh script.

View File

@ -118,6 +118,7 @@ StEntry {
/* Scrollbars */
StScrollView.vfade {
-st-vfade-offset: 68px; }
StScrollView.hfade {
-st-hfade-offset: 68px; }
@ -152,14 +153,18 @@ StScrollBar {
/* Check Boxes */
.check-box StBoxLayout {
spacing: .8em; }
.check-box StBin {
width: 24px;
height: 22px;
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
.check-box:focus StBin {
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
.check-box:checked StBin {
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
.check-box:focus:checked StBin {
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
@ -300,7 +305,7 @@ StScrollBar {
padding-bottom: 6px; }
.mount-question-dialog-subject {
max-width: 500px; }
max-width: 34em; }
.show-processes-dialog-subject:rtl,
.mount-question-dialog-subject:rtl {
@ -337,6 +342,7 @@ StScrollBar {
.show-processes-dialog-app-list-item-icon:ltr {
padding-right: 17px; }
.show-processes-dialog-app-list-item-icon:rtl {
padding-left: 17px; }
@ -345,7 +351,7 @@ StScrollBar {
/* Password or Authentication Dialog */
.prompt-dialog {
width: 500px;
width: 34em;
border: 3px solid rgba(238, 238, 236, 0.2); }
.prompt-dialog-main-layout {
@ -669,7 +675,9 @@ StScrollBar {
/* TOP BAR */
#panel {
background-color: black;
background-color: rgba(0, 0, 0, 0.2);
/* transition from solid to transparent */
transition-duration: 500ms;
font-weight: bold;
height: 1.86em; }
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
@ -678,7 +686,7 @@ StScrollBar {
spacing: 4px; }
#panel .panel-corner {
-panel-corner-radius: 6px;
-panel-corner-background-color: black;
-panel-corner-background-color: rgba(0, 0, 0, 0.2);
-panel-corner-border-width: 2px;
-panel-corner-border-color: transparent; }
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
@ -691,14 +699,24 @@ StScrollBar {
-natural-hpadding: 12px;
-minimum-hpadding: 6px;
font-weight: bold;
color: #ccc;
color: #eee;
text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9);
transition-duration: 100ms; }
#panel .panel-button .app-menu-icon {
-st-icon-style: symbolic;
margin-left: 4px;
margin-right: 4px; }
#panel .panel-button .system-status-icon,
#panel .panel-button .app-menu-icon > StIcon,
#panel .panel-button .popup-menu-arrow {
icon-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9); }
#panel .panel-button:hover {
color: white; }
color: white;
text-shadow: 0px 0px 8px black; }
#panel .panel-button:hover .system-status-icon,
#panel .panel-button:hover .app-menu-icon > StIcon,
#panel .panel-button:hover .popup-menu-arrow {
icon-shadow: 0px 0px 8px black; }
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
background-color: rgba(0, 0, 0, 0.01);
box-shadow: inset 0 -2px 0px #256ab1;
@ -708,9 +726,17 @@ StScrollBar {
#panel .panel-button .system-status-icon {
icon-size: 1.09em;
padding: 0 5px; }
.unlock-screen #panel .panel-button, .login-screen #panel .panel-button, .lock-screen #panel .panel-button {
.unlock-screen #panel .panel-button,
.login-screen #panel .panel-button,
.lock-screen #panel .panel-button {
color: white; }
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active, .login-screen #panel .panel-button:focus, .login-screen #panel .panel-button:hover, .login-screen #panel .panel-button:active, .lock-screen #panel .panel-button:focus, .lock-screen #panel .panel-button:hover, .lock-screen #panel .panel-button:active {
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active,
.login-screen #panel .panel-button:focus,
.login-screen #panel .panel-button:hover,
.login-screen #panel .panel-button:active,
.lock-screen #panel .panel-button:focus,
.lock-screen #panel .panel-button:hover,
.lock-screen #panel .panel-button:active {
color: white; }
#panel .panel-status-indicators-box,
#panel .panel-status-menu-box {
@ -719,6 +745,21 @@ StScrollBar {
spacing: 0; }
#panel .screencast-indicator {
color: #f57900; }
#panel.solid {
background-color: black;
/* transition from transparent to solid */
transition-duration: 300ms; }
#panel.solid .panel-corner {
-panel-corner-background-color: black; }
#panel.solid .panel-button {
color: #ccc;
text-shadow: none; }
#panel.solid .panel-button:hover {
color: white; }
#panel.solid .system-status-icon,
#panel.solid .app-menu-icon > StIcon,
#panel.solid .popup-menu-arrow {
icon-shadow: none; }
#calendarArea {
padding: 0.75em 1.0em; }
@ -769,6 +810,7 @@ StScrollBar {
.events-section-title:hover,
.events-section-title:focus {
background-color: #0d0d0d; }
.datemenu-today-button:active,
.world-clocks-button:active,
.weather-button:active,
@ -910,7 +952,7 @@ StScrollBar {
color: #999999;
font-size: 0.7em;
/* HACK: the label should be baseline-aligned with a 1em label,
fake this with some bottom padding */
fake this with some bottom padding */
padding-bottom: 0.13em; }
.message-secondary-bin > StIcon {
@ -1010,9 +1052,9 @@ StScrollBar {
/* NETWORK DIALOGS */
.nm-dialog {
max-height: 500px;
min-height: 450px;
min-width: 470px; }
max-height: 34em;
min-height: 31em;
min-width: 32em; }
.nm-dialog-content {
spacing: 20px;
@ -1138,14 +1180,19 @@ StScrollBar {
.list-search-result-content {
spacing: 12px;
padding: 12px; }
padding: 2px; }
.list-search-result-title {
font-size: 1.5em;
color: #e2e2df; }
.list-search-result-provider {
color: #e2e2df;
margin-top: 0.24em; }
.list-search-result-description {
color: #cacac4; }
color: #cacac4;
margin-left: 30px; }
.search-provider-icon {
padding: 15px; }
@ -1215,6 +1262,7 @@ StScrollBar {
.list-search-result:active,
.list-search-result:checked {
background-color: rgba(23, 25, 26, 0.9); }
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
.list-search-result:focus,
.list-search-result:selected,
@ -1222,7 +1270,8 @@ StScrollBar {
background-color: rgba(238, 238, 236, 0.1);
transition-duration: 200ms; }
.app-well-app:active .overview-icon, .app-well-app:checked .overview-icon,
.app-well-app:active .overview-icon,
.app-well-app:checked .overview-icon,
.app-well-app.app-folder:active .overview-icon,
.app-well-app.app-folder:checked .overview-icon,
.show-apps:active .overview-icon,
@ -1231,7 +1280,10 @@ StScrollBar {
.grid-search-result:checked .overview-icon {
background-color: rgba(23, 25, 26, 0.9);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
.app-well-app:hover .overview-icon, .app-well-app:focus .overview-icon, .app-well-app:selected .overview-icon,
.app-well-app:hover .overview-icon,
.app-well-app:focus .overview-icon,
.app-well-app:selected .overview-icon,
.app-well-app.app-folder:hover .overview-icon,
.app-well-app.app-folder:focus .overview-icon,
.app-well-app.app-folder:selected .overview-icon,
@ -1657,10 +1709,12 @@ StScrollBar {
.login-dialog-user-selection-box {
padding: 100px 0px; }
.login-dialog-user-selection-box .login-dialog-not-listed-label {
padding-left: 2px; }
.login-dialog-not-listed-button:focus .login-dialog-user-selection-box .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-user-selection-box .login-dialog-not-listed-label {
color: #eeeeec; }
.login-dialog-not-listed-label {
padding-left: 2px; }
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
.login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
color: #eeeeec; }
.login-dialog-not-listed-label {
font-size: 90%;
@ -1709,6 +1763,7 @@ StScrollBar {
.user-widget-label:ltr {
padding-left: 18px; }
.user-widget-label:rtl {
padding-right: 18px; }
@ -1836,6 +1891,7 @@ StScrollBar {
.lg-dialog StEntry {
selection-background-color: #bbbbbb;
selected-color: #333333; }
.lg-dialog .shell-link {
color: #999999; }
.lg-dialog .shell-link:hover {

View File

@ -118,6 +118,7 @@ StEntry {
/* Scrollbars */
StScrollView.vfade {
-st-vfade-offset: 68px; }
StScrollView.hfade {
-st-hfade-offset: 68px; }
@ -152,14 +153,18 @@ StScrollBar {
/* Check Boxes */
.check-box StBoxLayout {
spacing: .8em; }
.check-box StBin {
width: 24px;
height: 22px;
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
.check-box:focus StBin {
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
.check-box:checked StBin {
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
.check-box:focus:checked StBin {
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
@ -300,7 +305,7 @@ StScrollBar {
padding-bottom: 6px; }
.mount-question-dialog-subject {
max-width: 500px; }
max-width: 34em; }
.show-processes-dialog-subject:rtl,
.mount-question-dialog-subject:rtl {
@ -337,6 +342,7 @@ StScrollBar {
.show-processes-dialog-app-list-item-icon:ltr {
padding-right: 17px; }
.show-processes-dialog-app-list-item-icon:rtl {
padding-left: 17px; }
@ -345,7 +351,7 @@ StScrollBar {
/* Password or Authentication Dialog */
.prompt-dialog {
width: 500px;
width: 34em;
border: 3px solid rgba(238, 238, 236, 0.2); }
.prompt-dialog-main-layout {
@ -669,7 +675,9 @@ StScrollBar {
/* TOP BAR */
#panel {
background-color: black;
background-color: rgba(0, 0, 0, 0.2);
/* transition from solid to transparent */
transition-duration: 500ms;
font-weight: bold;
height: 1.86em; }
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
@ -678,7 +686,7 @@ StScrollBar {
spacing: 4px; }
#panel .panel-corner {
-panel-corner-radius: 6px;
-panel-corner-background-color: black;
-panel-corner-background-color: rgba(0, 0, 0, 0.2);
-panel-corner-border-width: 2px;
-panel-corner-border-color: transparent; }
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
@ -691,14 +699,24 @@ StScrollBar {
-natural-hpadding: 12px;
-minimum-hpadding: 6px;
font-weight: bold;
color: #ccc;
color: #eee;
text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9);
transition-duration: 100ms; }
#panel .panel-button .app-menu-icon {
-st-icon-style: symbolic;
margin-left: 4px;
margin-right: 4px; }
#panel .panel-button .system-status-icon,
#panel .panel-button .app-menu-icon > StIcon,
#panel .panel-button .popup-menu-arrow {
icon-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9); }
#panel .panel-button:hover {
color: white; }
color: white;
text-shadow: 0px 0px 8px black; }
#panel .panel-button:hover .system-status-icon,
#panel .panel-button:hover .app-menu-icon > StIcon,
#panel .panel-button:hover .popup-menu-arrow {
icon-shadow: 0px 0px 8px black; }
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
background-color: rgba(0, 0, 0, 0.01);
box-shadow: inset 0 -2px 0px #256ab1;
@ -708,9 +726,17 @@ StScrollBar {
#panel .panel-button .system-status-icon {
icon-size: 1.09em;
padding: 0 5px; }
.unlock-screen #panel .panel-button, .login-screen #panel .panel-button, .lock-screen #panel .panel-button {
.unlock-screen #panel .panel-button,
.login-screen #panel .panel-button,
.lock-screen #panel .panel-button {
color: white; }
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active, .login-screen #panel .panel-button:focus, .login-screen #panel .panel-button:hover, .login-screen #panel .panel-button:active, .lock-screen #panel .panel-button:focus, .lock-screen #panel .panel-button:hover, .lock-screen #panel .panel-button:active {
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active,
.login-screen #panel .panel-button:focus,
.login-screen #panel .panel-button:hover,
.login-screen #panel .panel-button:active,
.lock-screen #panel .panel-button:focus,
.lock-screen #panel .panel-button:hover,
.lock-screen #panel .panel-button:active {
color: white; }
#panel .panel-status-indicators-box,
#panel .panel-status-menu-box {
@ -719,6 +745,21 @@ StScrollBar {
spacing: 0; }
#panel .screencast-indicator {
color: #f57900; }
#panel.solid {
background-color: black;
/* transition from transparent to solid */
transition-duration: 300ms; }
#panel.solid .panel-corner {
-panel-corner-background-color: black; }
#panel.solid .panel-button {
color: #ccc;
text-shadow: none; }
#panel.solid .panel-button:hover {
color: white; }
#panel.solid .system-status-icon,
#panel.solid .app-menu-icon > StIcon,
#panel.solid .popup-menu-arrow {
icon-shadow: none; }
#calendarArea {
padding: 0.75em 1.0em; }
@ -769,6 +810,7 @@ StScrollBar {
.events-section-title:hover,
.events-section-title:focus {
background-color: #454c4c; }
.datemenu-today-button:active,
.world-clocks-button:active,
.weather-button:active,
@ -910,7 +952,7 @@ StScrollBar {
color: #8e8e80;
font-size: 0.7em;
/* HACK: the label should be baseline-aligned with a 1em label,
fake this with some bottom padding */
fake this with some bottom padding */
padding-bottom: 0.13em; }
.message-secondary-bin > StIcon {
@ -1010,9 +1052,9 @@ StScrollBar {
/* NETWORK DIALOGS */
.nm-dialog {
max-height: 500px;
min-height: 450px;
min-width: 470px; }
max-height: 34em;
min-height: 31em;
min-width: 32em; }
.nm-dialog-content {
spacing: 20px;
@ -1129,23 +1171,30 @@ StScrollBar {
.list-search-results {
spacing: 3px; }
.list-search-provider-details {
spacing: 3px;
width: 150px;
margin-left: 30px; }
.search-section-separator {
-gradient-height: 1px;
-gradient-start: rgba(255, 255, 255, 0);
-gradient-end: rgba(255, 255, 255, 0.1);
-margin-horizontal: 1.5em;
height: 1px; }
height: 2px;
background-color: rgba(255, 255, 255, 0.2); }
.list-search-result-content {
spacing: 12px;
padding: 12px; }
padding: 2px; }
.list-search-result-title {
font-size: 1.5em;
color: #e2e2df; }
.list-search-result-provider {
color: #e2e2df;
margin-top: 0.24em;
}
.list-search-result-description {
color: #cacac4; }
color: rgba(202, 202, 196, 0.5);
margin-left: 30px; }
.search-provider-icon {
padding: 15px; }
@ -1215,6 +1264,7 @@ StScrollBar {
.list-search-result:active,
.list-search-result:checked {
background-color: rgba(23, 25, 26, 0.9); }
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
.list-search-result:focus,
.list-search-result:selected,
@ -1222,7 +1272,8 @@ StScrollBar {
background-color: rgba(238, 238, 236, 0.1);
transition-duration: 200ms; }
.app-well-app:active .overview-icon, .app-well-app:checked .overview-icon,
.app-well-app:active .overview-icon,
.app-well-app:checked .overview-icon,
.app-well-app.app-folder:active .overview-icon,
.app-well-app.app-folder:checked .overview-icon,
.show-apps:active .overview-icon,
@ -1231,7 +1282,10 @@ StScrollBar {
.grid-search-result:checked .overview-icon {
background-color: rgba(23, 25, 26, 0.9);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
.app-well-app:hover .overview-icon, .app-well-app:focus .overview-icon, .app-well-app:selected .overview-icon,
.app-well-app:hover .overview-icon,
.app-well-app:focus .overview-icon,
.app-well-app:selected .overview-icon,
.app-well-app.app-folder:hover .overview-icon,
.app-well-app.app-folder:focus .overview-icon,
.app-well-app.app-folder:selected .overview-icon,
@ -1657,10 +1711,12 @@ StScrollBar {
.login-dialog-user-selection-box {
padding: 100px 0px; }
.login-dialog-user-selection-box .login-dialog-not-listed-label {
padding-left: 2px; }
.login-dialog-not-listed-button:focus .login-dialog-user-selection-box .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-user-selection-box .login-dialog-not-listed-label {
color: #eeeeec; }
.login-dialog-not-listed-label {
padding-left: 2px; }
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
.login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
color: #eeeeec; }
.login-dialog-not-listed-label {
font-size: 90%;
@ -1709,6 +1765,7 @@ StScrollBar {
.user-widget-label:ltr {
padding-left: 18px; }
.user-widget-label:rtl {
padding-right: 18px; }
@ -1836,6 +1893,7 @@ StScrollBar {
.lg-dialog StEntry {
selection-background-color: #bbbbbb;
selected-color: #333333; }
.lg-dialog .shell-link {
color: #999999; }
.lg-dialog .shell-link:hover {

View File

@ -1,3 +1,7 @@
#!/usr/bin/bash
#!/usr/bin/sh
bundle exec sass --update --sourcemap=none .
srcdir=`dirname $0`
for scss in $srcdir/*.scss
do
sassc -a $scss ${scss%%.scss}.css
done

View File

@ -113,7 +113,7 @@ expand_content_files=
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
GTKDOC_CFLAGS=$(GNOME_SHELL_CFLAGS)
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(top_builddir)/src/libgnome-shell-menu.la $(top_builddir)/src/libgnome-shell-base.la $(top_builddir)/src/libgnome-shell.la -rpath $(MUTTER_TYPELIB_DIR)
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(top_builddir)/src/libgnome-shell-menu.la $(top_builddir)/src/libgnome-shell.la -rpath $(MUTTER_TYPELIB_DIR)
# This includes the standard gtk-doc make rules, copied by gtkdocize.
include $(top_srcdir)/gtk-doc.make
@ -125,7 +125,7 @@ EXTRA_DIST +=
# Files not to distribute
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
DISTCLEANFILES = $(DOC_MODULES).types
DISTCLEANFILES = $(DOC_MODULE).types
# Comment this out if you want 'make check' to test you doc status
# and run some sanity checks

View File

@ -5,6 +5,7 @@ const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Gdk = imports.gi.Gdk;
const Pango = imports.gi.Pango;
const Format = imports.format;
@ -92,9 +93,11 @@ const Application = new Lang.Class({
widget = this._buildErrorUI(extension, e);
}
let dialog = new Gtk.Dialog({ use_header_bar: true,
modal: true,
title: extension.metadata.name });
let dialog = new Gtk.Window({ modal: !this._skipMainWindow,
type_hint: Gdk.WindowTypeHint.DIALOG });
dialog.set_titlebar(new Gtk.HeaderBar({ show_close_button: true,
title: extension.metadata.name,
visible: true }));
if (this._skipMainWindow) {
this.application.add_window(dialog);
@ -107,7 +110,7 @@ const Application = new Lang.Class({
}
dialog.set_default_size(600, 400);
dialog.get_content_area().add(widget);
dialog.add(widget);
dialog.show();
},
@ -154,7 +157,7 @@ const Application = new Lang.Class({
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this._settings.bind('disable-user-extensions', killSwitch, 'active',
Gio.SettingsBindFlags.BIND_DEFAULT |
Gio.SettingsBindFlags.DEFAULT |
Gio.SettingsBindFlags.INVERT_BOOLEAN);
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });

View File

@ -3,6 +3,7 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Pango = imports.gi.Pango;
const Signals = imports.signals;
const St = imports.gi.St;
@ -13,7 +14,6 @@ const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
const UserWidget = imports.ui.userWidget;
const Pango = imports.gi.Pango;
const DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
@ -263,7 +263,7 @@ const AuthPrompt = new Lang.Class({
_onVerificationComplete: function() {
this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
this.cancelButton.reactive = false;
this.cancelButton.reactive = false;
},
_onReset: function() {

View File

@ -775,10 +775,12 @@ const LoginDialog = new Lang.Class({
},
_onPrompted: function() {
this._sessionMenuButton.updateSensitivity(true);
if (this._shouldShowSessionMenuButton())
if (this._shouldShowSessionMenuButton()) {
this._sessionMenuButton.updateSensitivity(true);
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
} else {
this._sessionMenuButton.updateSensitivity(false);
}
this._showPrompt();
},
@ -881,6 +883,7 @@ const LoginDialog = new Lang.Class({
}));
this._updateCancelButton();
this._sessionMenuButton.updateSensitivity(false);
this._authPrompt.updateSensitivity(true);
this._showPrompt();
},

View File

@ -138,7 +138,7 @@ const ShellUserVerifier = new Lang.Class({
// We check for smartcards right away, since an inserted smartcard
// at startup should result in immediately initiating authentication.
// This is different than fingeprint readers, where we only check them
// This is different than fingerprint readers, where we only check them
// after a user has been picked.
this._checkForSmartcard();

View File

@ -46,7 +46,7 @@ const ObjectManager = new Lang.Class({
g_interface_info: ObjectManagerInfo,
g_name: this._serviceName,
g_object_path: this._managerPath,
g_flags: Gio.DBusProxyFlags.NONE });
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
this._interfaceInfos = {};
this._objects = {};
@ -65,6 +65,9 @@ const ObjectManager = new Lang.Class({
},
_tryToCompleteLoad: function() {
if (this._numLoadInhibitors == 0)
return;
this._numLoadInhibitors--;
if (this._numLoadInhibitors == 0) {
if (this._onLoaded)
@ -86,7 +89,7 @@ const ObjectManager = new Lang.Class({
g_object_path: objectPath,
g_interface_name: interfaceName,
g_interface_info: info,
g_flags: Gio.DBusProxyFlags.NONE });
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
proxy.init_async(GLib.PRIORITY_DEFAULT,
this._cancellable,
@ -181,6 +184,18 @@ const ObjectManager = new Lang.Class({
return;
}
this._managerProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
if (this._managerProxy.g_name_owner)
this._onNameAppeared();
else
this._onNameVanished();
}));
if (this._managerProxy.g_name_owner)
this._onNameAppeared();
},
_onNameAppeared: function() {
this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
if (!result) {
if (error) {
@ -193,6 +208,11 @@ const ObjectManager = new Lang.Class({
let [objects] = result;
if (!objects) {
this._tryToCompleteLoad();
return;
}
let objectPaths = Object.keys(objects);
for (let i = 0; i < objectPaths.length; i++) {
let objectPath = objectPaths[i];
@ -213,6 +233,21 @@ const ObjectManager = new Lang.Class({
}));
},
_onNameVanished: function() {
let objectPaths = Object.keys(this._objects);
for (let i = 0; i < objectPaths.length; i++) {
let object = this._objects[objectPaths];
let interfaceNames = Object.keys(object);
for (let j = 0; i < interfaceNames.length; i++) {
let interfaceName = interfaceNames[i];
if (object[interfaceName])
this._removeInterface(objectPath, interfaceName);
}
}
},
_registerInterfaces: function(interfaces) {
for (let i = 0; i < interfaces.length; i++) {
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);

View File

@ -218,11 +218,10 @@ function formatTime(time, params) {
if (_desktopSettings == null)
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
let clockFormat = _desktopSettings.get_string('clock-format');
let hasAmPm = date.format('%p') != '';
params = Params.parse(params, { timeOnly: false });
if (clockFormat == '24h' || !hasAmPm) {
if (clockFormat == '24h') {
// Show only the time if date is on today
if (daysAgo < 1 || params.timeOnly)
/* Translators: Time in 24h format */

View File

@ -54,10 +54,11 @@ const WeatherClient = new Lang.Class({
this._world = GWeather.Location.get_world();
let providers = GWeather.Provider.METAR |
GWeather.Provider.YR_NO |
GWeather.Provider.OWM;
this._weatherInfo = new GWeather.Info({ enabled_providers: providers });
this._providers = GWeather.Provider.METAR |
GWeather.Provider.YR_NO |
GWeather.Provider.OWM;
this._weatherInfo = new GWeather.Info({ enabled_providers: 0 });
this._weatherInfo.connect_after('updated', () => {
this._lastUpdate = GLib.DateTime.new_now_local();
this.emit('changed');
@ -141,6 +142,8 @@ const WeatherClient = new Lang.Class({
this._weatherInfo.set_location(location);
this._locationValid = (location != null);
this._weatherInfo.set_enabled_providers(location ? this._providers : 0);
if (location)
this._loadInfo();
else

View File

@ -143,6 +143,7 @@ const PortalWindow = new Lang.Class({
this._webContext = WebKit.WebContext.new_ephemeral();
this._webContext.set_cache_model(WebKit.CacheModel.DOCUMENT_VIEWER);
this._webContext.set_network_proxy_settings(WebKit.NetworkProxyMode.NO_PROXY, null);
this._webView = WebKit.WebView.new_with_context(this._webContext);
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
@ -356,7 +357,7 @@ const WebPortalHelper = new Lang.Class({
if (top.window != null)
return;
top.window = new PortalWindow(this, top.uri, top.timestamp, Lang.bind(this, function(result) {
top.window = new PortalWindow(this, top.url, top.timestamp, Lang.bind(this, function(result) {
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
}));
},

View File

@ -447,7 +447,10 @@ const AllView = new Lang.Class({
}));
this._grid.connect('space-opened', Lang.bind(this,
function() {
this._scrollView.get_effect('fade').enabled = false;
let fadeEffect = this._scrollView.get_effect('fade');
if (fadeEffect)
fadeEffect.enabled = false;
this.emit('space-ready');
}));
this._grid.connect('space-closed', Lang.bind(this,
@ -658,7 +661,11 @@ const AllView = new Lang.Class({
_closeSpaceForPopup: function() {
this._updateIconOpacities(false);
this._scrollView.get_effect('fade').enabled = true;
let fadeEffect = this._scrollView.get_effect('fade');
if (fadeEffect)
fadeEffect.enabled = true;
this._grid.closeExtraSpace();
},
@ -1124,7 +1131,7 @@ const AppSearchProvider = new Lang.Class({
this.getInitialResultSet(terms, callback, cancellable);
},
createResultObject: function (resultMeta) {
createResultObject: function (resultMeta, searchResultsView) {
let app = this._appSys.lookup_app(resultMeta['id']);
return new AppIcon(app);
}

View File

@ -6,6 +6,7 @@ const Signals = imports.signals;
const Main = imports.ui.main;
// In alphabetical order
const RENAMED_DESKTOP_IDS = {
'baobab.desktop': 'org.gnome.baobab.desktop',
'cheese.desktop': 'org.gnome.Cheese.desktop',
@ -27,6 +28,7 @@ const RENAMED_DESKTOP_IDS = {
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
'gnome-music.desktop': 'org.gnome.Music.desktop',
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
'gnome-software.desktop': 'org.gnome.Software.desktop',

View File

@ -166,7 +166,8 @@ const BackgroundCache = new Lang.Class({
settingsSchema: null,
onLoaded: null });
if (this._animations[params.settingsSchema] && _fileEqual0(this._animationFile, params.file)) {
let animation = this._animations[params.settingsSchema];
if (animation && _fileEqual0(animation.file, params.file)) {
if (params.onLoaded) {
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
params.onLoaded(this._animations[params.settingsSchema]);
@ -177,7 +178,7 @@ const BackgroundCache = new Lang.Class({
return;
}
let animation = new Animation({ file: params.file });
animation = new Animation({ file: params.file });
animation.load(Lang.bind(this, function() {
this._animations[params.settingsSchema] = animation;

View File

@ -7,7 +7,6 @@ const St = imports.gi.St;
const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const ShellMountOperation = imports.ui.shellMountOperation;
// GSettings keys
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';

View File

@ -370,8 +370,7 @@ const IndicatorPad = new Lang.Class({
_init: function(actor) {
this._source = actor;
this._source.connect('notify::visible',
Lang.bind(this, this.queue_relayout));
this._source.connect('notify::visible', () => { this.queue_relayout(); });
this.parent();
},

View File

@ -282,12 +282,20 @@ function _onVersionValidationChanged() {
// temporarily disable them all
enabledExtensions = [];
for (let uuid in ExtensionUtils.extensions)
reloadExtension(ExtensionUtils.extensions[uuid]);
try {
reloadExtension(ExtensionUtils.extensions[uuid]);
} catch(e) {
logExtensionError(uuid, e);
}
enabledExtensions = getEnabledExtensions();
if (Main.sessionMode.allowExtensions) {
enabledExtensions.forEach(function(uuid) {
enableExtension(uuid);
try {
enableExtension(uuid);
} catch(e) {
logExtensionError(uuid, e);
}
});
}
}

View File

@ -1,5 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const FocusCaretTracker = imports.ui.focusCaretTracker;
const Atspi = imports.gi.Atspi;
const Caribou = imports.gi.Caribou;
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
@ -25,42 +27,6 @@ const KEYBOARD_TYPE = 'keyboard-type';
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEYBOARD = 'screen-keyboard-enabled';
const CARIBOU_BUS_NAME = 'org.gnome.Caribou.Daemon';
const CARIBOU_OBJECT_PATH = '/org/gnome/Caribou/Daemon';
const CaribouKeyboardIface = '<node> \
<interface name="org.gnome.Caribou.Keyboard"> \
<method name="Show"> \
<arg type="u" direction="in" /> \
</method> \
<method name="Hide"> \
<arg type="u" direction="in" /> \
</method> \
<method name="SetCursorLocation"> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
</method> \
<method name="SetEntryLocation"> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
</method> \
<property name="Name" access="read" type="s" /> \
</interface> \
</node>';
const CaribouDaemonIface = '<node> \
<interface name="org.gnome.Caribou.Daemon"> \
<method name="Run" /> \
<method name="Quit" /> \
</interface> \
</node>';
const CaribouDaemonProxy = Gio.DBusProxy.makeProxyWrapper(CaribouDaemonIface);
const Key = new Lang.Class({
Name: 'Key',
@ -188,18 +154,19 @@ const Key = new Lang.Class({
Signals.addSignalMethods(Key.prototype);
const Keyboard = new Lang.Class({
// HACK: we can't set Name, because it collides with Name dbus property
// Name: 'Keyboard',
Name: 'Keyboard',
_init: function () {
this._impl = Gio.DBusExportedObject.wrapJSObject(CaribouKeyboardIface, this);
this._impl.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
this.actor = null;
this._focusInTray = false;
this._focusInExtendedKeys = false;
this._timestamp = global.display.get_current_time_roundtrip();
this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
this._focusCaretTracker.connect('focus-changed', Lang.bind(this, this._onFocusChanged));
this._focusCaretTracker.connect('caret-moved', Lang.bind(this, this._onCaretMoved));
this._currentAccessible = null;
this._caretTrackingEnabled = false;
this._updateCaretPositionId = 0;
this._keyboardSettings = new Gio.Settings({ schema_id: KEYBOARD_SCHEMA });
this._keyboardSettings.connect('changed', Lang.bind(this, this._sync));
@ -208,9 +175,7 @@ const Keyboard = new Lang.Class({
this._daemonProxy = null;
this._lastDeviceId = null;
if (Meta.is_wayland_compositor() &&
Caribou.DisplayAdapter.set_default)
Caribou.DisplayAdapter.set_default(new ShellWaylandAdapter());
Caribou.DisplayAdapter.set_default(new LocalAdapter());
Meta.get_backend().connect('last-device-changed', Lang.bind(this,
function (backend, deviceId) {
@ -240,6 +205,93 @@ const Keyboard = new Lang.Class({
this._redraw();
},
_setCaretTrackerEnabled: function (enabled) {
if (this._caretTrackingEnabled == enabled)
return;
this._caretTrackingEnabled = enabled;
if (enabled) {
this._focusCaretTracker.registerFocusListener();
this._focusCaretTracker.registerCaretListener();
} else {
this._focusCaretTracker.deregisterFocusListener();
this._focusCaretTracker.deregisterCaretListener();
}
},
_updateCaretPosition: function (accessible) {
if (this._updateCaretPositionId)
GLib.source_remove(this._updateCaretPositionId);
this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, Lang.bind(this, function() {
this._updateCaretPositionId = 0;
let currentWindow = global.screen.get_display().focus_window;
if (!currentWindow)
return GLib.SOURCE_REMOVE;
let windowRect = currentWindow.get_frame_rect();
let text = accessible.get_text_iface();
let component = accessible.get_component_iface();
try {
let caretOffset = text.get_caret_offset();
let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW);
let focusRect = component.get_extents(Atspi.CoordType.WINDOW);
caretRect.x += windowRect.x;
caretRect.y += windowRect.y;
focusRect.x += windowRect.x;
focusRect.y += windowRect.y;
if (caretRect.width == 0 && caretRect.height == 0)
caretRect = focusRect;
this.setEntryLocation(focusRect.x, focusRect.y, focusRect.width, focusRect.height);
this.setCursorLocation(caretRect.x, caretRect.y, caretRect.width, caretRect.height);
} catch (e) {
log('Error updating caret position for OSK: ' + e.message);
}
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition');
},
_focusIsTextEntry: function (accessible) {
try {
let role = accessible.get_role();
let stateSet = accessible.get_state_set();
return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL;
} catch (e) {
log('Error determining accessible role: ' + e.message);
return false;
}
},
_onFocusChanged: function (caretTracker, event) {
let accessible = event.source;
if (!this._focusIsTextEntry(accessible))
return;
let focused = event.detail1 != 0;
if (focused) {
this._currentAccessible = accessible;
this._updateCaretPosition(accessible);
this.show(Main.layoutManager.focusIndex);
} else if (this._currentAccessible == accessible) {
this._currentAccessible = null;
this.hide();
}
},
_onCaretMoved: function (caretTracker, event) {
let accessible = event.source;
if (this._currentAccessible == accessible)
this._updateCaretPosition(accessible);
},
_lastDeviceIsTouchscreen: function () {
if (!this._lastDeviceId)
return false;
@ -262,6 +314,8 @@ const Keyboard = new Lang.Class({
this._keyboard.keyboard_type == this._keyboardSettings.get_string(KEYBOARD_TYPE))
return;
this._setCaretTrackerEnabled(this._enableKeyboard);
if (this._keyboard)
this._destroyKeyboard();
@ -297,23 +351,6 @@ const Keyboard = new Lang.Class({
},
_setupKeyboard: function() {
if (!this._daemonProxy) {
this._daemonProxy = new CaribouDaemonProxy(Gio.DBus.session, CARIBOU_BUS_NAME,
CARIBOU_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
}));
}
this._daemonProxy.RunRemote(function (result, error) {
if (error) {
log(error.message);
return;
}
});
this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
Main.layoutManager.keyboardBox.add_actor(this.actor);
Main.layoutManager.trackChrome(this.actor);
@ -359,17 +396,17 @@ const Keyboard = new Lang.Class({
let time = global.get_current_time();
if (!(focus instanceof Clutter.Text)) {
this.Hide(time);
this.hide();
return;
}
if (!this._showIdleId) {
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
Lang.bind(this, function() {
this.Show(time);
this.show(Main.layoutManager.focusIndex);
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.Show');
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
}
},
@ -581,6 +618,10 @@ const Keyboard = new Lang.Class({
},
show: function (monitor) {
if (!this._enableKeyboard)
return;
this._clearShowIdle();
this._keyboardRequested = true;
if (this._keyboardVisible) {
@ -613,6 +654,10 @@ const Keyboard = new Lang.Class({
},
hide: function () {
if (!this._enableKeyboard)
return;
this._clearShowIdle();
this._keyboardRequested = false;
if (!this._keyboardVisible)
@ -664,20 +709,6 @@ const Keyboard = new Lang.Class({
this._moveTemporarily();
},
// _compareTimestamp:
//
// Compare two timestamps taking into account
// CURRENT_TIME (0)
_compareTimestamp: function(one, two) {
if (one == two)
return 0;
if (one == Clutter.CURRENT_TIME)
return 1;
if (two == Clutter.CURRENT_TIME)
return -1;
return one - two;
},
_clearShowIdle: function() {
if (!this._showIdleId)
return;
@ -685,52 +716,19 @@ const Keyboard = new Lang.Class({
this._showIdleId = 0;
},
// D-Bus methods
Show: function(timestamp) {
if (!this._enableKeyboard)
return;
if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp;
this.show(Main.layoutManager.focusIndex);
},
Hide: function(timestamp) {
if (!this._enableKeyboard)
return;
if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp;
this.hide();
},
SetCursorLocation: function(x, y, w, h) {
setCursorLocation: function(x, y, w, h) {
if (!this._enableKeyboard)
return;
// this._setLocation(x, y);
},
SetEntryLocation: function(x, y, w, h) {
setEntryLocation: function(x, y, w, h) {
if (!this._enableKeyboard)
return;
// this._setLocation(x, y);
},
get Name() {
return 'gnome-shell';
}
});
const KeyboardSource = new Lang.Class({
@ -754,8 +752,8 @@ const KeyboardSource = new Lang.Class({
}
});
const ShellWaylandAdapter = new Lang.Class({
Name: 'ShellWaylandAdapter',
const LocalAdapter = new Lang.Class({
Name: 'LocalAdapter',
Extends: Caribou.XAdapter,
_init: function () {

View File

@ -833,19 +833,19 @@ const LookingGlass = new Lang.Class({
return Clutter.EVENT_STOP;
}));
let gcIcon = new St.Icon({ icon_name: 'gnome-fs-trash-full',
let gcIcon = new St.Icon({ icon_name: 'user-trash-full',
icon_size: 24 });
toolbar.add_actor(gcIcon);
gcIcon.reactive = true;
gcIcon.connect('button-press-event', Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-empty';
gcIcon.icon_name = 'user-trash';
System.gc();
this._timeoutId = Mainloop.timeout_add(500, Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-full';
gcIcon.icon_name = 'user-trash-full';
this._timeoutId = 0;
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'gnome-fs-trash-full\'');
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\'');
return Clutter.EVENT_PROPAGATE;
}));

View File

@ -120,6 +120,25 @@ const OsdMonitorLabeler = new Lang.Class({
}
},
show2: function(client, params) {
if (!this._trackClient(client))
return;
this._reset();
for (let connector in params) {
let monitor = this._monitorManager.get_monitor_for_connector(connector);
if (monitor == -1)
continue;
this._monitorLabels.get(monitor).push(params[connector].deep_unpack());
}
for (let [monitor, labels] of this._monitorLabels.entries()) {
labels.sort();
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
}
},
hide: function(client) {
if (!this._untrackClient(client))
return;

View File

@ -801,9 +801,11 @@ const Panel = new Lang.Class({
Main.overview.connect('showing', Lang.bind(this, function () {
this.actor.add_style_pseudo_class('overview');
this._updateSolidStyle();
}));
Main.overview.connect('hiding', Lang.bind(this, function () {
this.actor.remove_style_pseudo_class('overview');
this._updateSolidStyle();
}));
Main.layoutManager.panelBox.add(this.actor);
@ -811,9 +813,26 @@ const Panel = new Lang.Class({
{ sortGroup: CtrlAltTab.SortGroup.TOP });
Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel));
this._trackedWindows = new Map();
global.window_group.connect('actor-added', Lang.bind(this, this._onWindowActorAdded));
global.window_group.connect('actor-removed', Lang.bind(this, this._onWindowActorRemoved));
global.window_manager.connect('switch-workspace', Lang.bind(this, this._updateSolidStyle));
this._updatePanel();
},
_onWindowActorAdded: function(container, metaWindowActor) {
let signalId = metaWindowActor.connect('allocation-changed', Lang.bind(this, this._updateSolidStyle));
this._trackedWindows.set(metaWindowActor, signalId);
},
_onWindowActorRemoved: function(container, metaWindowActor) {
metaWindowActor.disconnect(this._trackedWindows.get(metaWindowActor));
this._trackedWindows.delete(metaWindowActor);
this._updateSolidStyle();
},
_getPreferredWidth: function(actor, forHeight, alloc) {
alloc.min_size = -1;
alloc.natural_size = Main.layoutManager.primaryMonitor.width;
@ -996,6 +1015,8 @@ const Panel = new Lang.Class({
else
Main.messageTray.bannerAlignment = Clutter.ActorAlign.CENTER;
this._updateSolidStyle();
if (this._sessionStyle)
this._removeStyleClassName(this._sessionStyle);
@ -1012,6 +1033,36 @@ const Panel = new Lang.Class({
}
},
_updateSolidStyle: function() {
if (this.actor.has_style_pseudo_class('overview') || !Main.sessionMode.hasWindows) {
this._removeStyleClassName('solid');
return;
}
/* Get all the windows in the active workspace that are in the primary monitor and visible */
let activeWorkspace = global.screen.get_active_workspace();
let windows = activeWorkspace.list_windows().filter(function(metaWindow) {
return metaWindow.is_on_primary_monitor() &&
metaWindow.showing_on_its_workspace() &&
metaWindow.get_window_type() != Meta.WindowType.DESKTOP;
});
/* Check if at least one window is near enough to the panel */
let [, panelTop] = this.actor.get_transformed_position();
let panelBottom = panelTop + this.actor.get_height();
let scale = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let isNearEnough = windows.some(Lang.bind(this, function(metaWindow) {
let verticalPosition = metaWindow.get_frame_rect().y;
return verticalPosition < panelBottom + 5 * scale;
}));
if (isNearEnough)
this._addStyleClassName('solid');
else
this._removeStyleClassName('solid');
},
_hideIndicators: function() {
for (let role in PANEL_ITEM_IMPLEMENTATIONS) {
let indicator = this.statusArea[role];

View File

@ -2,6 +2,8 @@
const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
@ -389,20 +391,24 @@ const PopupImageMenuItem = new Lang.Class({
Name: 'PopupImageMenuItem',
Extends: PopupBaseMenuItem,
_init: function (text, iconName, params) {
_init: function (text, icon, params) {
this.parent(params);
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.actor.add_child(this._icon, { align: St.Align.END });
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this.actor.label_actor = this.label;
this.setIcon(iconName);
this.setIcon(icon);
},
setIcon: function(name) {
this._icon.icon_name = name;
setIcon: function(icon) {
// The 'icon' parameter can be either a Gio.Icon or a string.
if (GObject.type_is_a(icon, Gio.Icon))
this._icon.gicon = icon;
else
this._icon.icon_name = icon;
}
});
@ -461,8 +467,13 @@ const PopupMenuBase = new Lang.Class({
this._setSettingsVisibility(Main.sessionMode.allowSettings);
},
addAction: function(title, callback) {
let menuItem = new PopupMenuItem(title);
addAction: function(title, callback, icon) {
let menuItem;
if (icon != undefined)
menuItem = new PopupImageMenuItem(title, icon);
else
menuItem = new PopupMenuItem(title);
this.addMenuItem(menuItem);
menuItem.connect('activate', Lang.bind(this, function (menuItem, event) {
callback(event);

View File

@ -278,7 +278,8 @@ const RemoteSearchProvider = new Lang.Class({
name: metas[i]['name'],
description: metas[i]['description'],
createIcon: Lang.bind(this,
this.createIcon, metas[i]) });
this.createIcon, metas[i]),
clipboardText: metas[i]['clipboardText'] });
}
callback(resultMetas);
},

View File

@ -22,7 +22,7 @@ const Util = imports.misc.util;
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
const MAX_LIST_SEARCH_RESULTS_ROWS = 5;
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
const MaxWidthBin = new Lang.Class({
@ -48,9 +48,10 @@ const MaxWidthBin = new Lang.Class({
const SearchResult = new Lang.Class({
Name: 'SearchResult',
_init: function(provider, metaInfo) {
_init: function(provider, metaInfo, searchResultsView) {
this.provider = provider;
this.metaInfo = metaInfo;
this._searchResultsView = searchResultsView;
this.actor = new St.Button({ reactive: true,
can_focus: true,
@ -72,10 +73,10 @@ const ListSearchResult = new Lang.Class({
Name: 'ListSearchResult',
Extends: SearchResult,
ICON_SIZE: 64,
ICON_SIZE: 24,
_init: function(provider, metaInfo) {
this.parent(provider, metaInfo);
_init: function(provider, metaInfo, searchResultsView) {
this.parent(provider, metaInfo, searchResultsView);
this.actor.style_class = 'list-search-result';
this.actor.x_fill = true;
@ -90,7 +91,7 @@ const ListSearchResult = new Lang.Class({
content.add(icon);
}
let details = new St.BoxLayout({ vertical: true });
let details = new St.BoxLayout({ vertical: false });
content.add(details, { x_fill: true,
y_fill: false,
x_align: St.Align.START,
@ -101,17 +102,38 @@ const ListSearchResult = new Lang.Class({
details.add(title, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
y_align: St.Align.MIDDLE });
this.actor.label_actor = title;
this._descriptionLabel =
new St.Label({
style_class: 'list-search-result-description' });
if (this.metaInfo['description']) {
let description = new St.Label({ style_class: 'list-search-result-description' });
description.clutter_text.set_markup(this.metaInfo['description']);
details.add(description, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.END });
this._highlightTerms();
details.add(this._descriptionLabel, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
}
this._termsChangedSignal =
this._searchResultsView.connect(
'terms-changed',
Lang.bind(this, this._highlightTerms));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
},
_highlightTerms: function() {
if (!this.metaInfo['description'] || !this._descriptionLabel || !this._searchResultsView)
return;
this._descriptionLabel.clutter_text.set_markup(this._searchResultsView.highlightTerms(this.metaInfo['description']));
},
_onDestroy: function() {
this._searchResultsView.disconnect(this._termsChangedSignal);
}
});
@ -119,8 +141,8 @@ const GridSearchResult = new Lang.Class({
Name: 'GridSearchResult',
Extends: SearchResult,
_init: function(provider, metaInfo) {
this.parent(provider, metaInfo);
_init: function(provider, metaInfo, searchResultsView) {
this.parent(provider, metaInfo, searchResultsView);
this.actor.style_class = 'grid-search-result';
@ -135,8 +157,9 @@ const GridSearchResult = new Lang.Class({
const SearchResultsBase = new Lang.Class({
Name: 'SearchResultsBase',
_init: function(provider) {
_init: function(provider, searchResultsView) {
this.provider = provider;
this._searchResultsView = searchResultsView;
this._terms = [];
@ -147,11 +170,13 @@ const SearchResultsBase = new Lang.Class({
y_fill: true });
this.actor.add(this._resultDisplayBin, { expand: true });
let separator = new Separator.HorizontalSeparator({ style_class: 'search-section-separator' });
this.actor.add(separator.actor);
let separator = new St.DrawingArea({ style_class: 'search-section-separator' });
this.actor.add(separator);
this._resultDisplays = {};
this._clipboard = St.Clipboard.get_default();
this._cancellable = new Gio.Cancellable();
},
@ -162,7 +187,8 @@ const SearchResultsBase = new Lang.Class({
_createResultDisplay: function(meta) {
if (this.provider.createResultObject)
return this.provider.createResultObject(meta);
return this.provider.createResultObject(meta,
this._searchResultsView);
return null;
},
@ -181,10 +207,12 @@ const SearchResultsBase = new Lang.Class({
_activateResult: function(result, id) {
this.provider.activateResult(id, this._terms);
if (result.metaInfo.clipboardText)
this._clipboard.set_text(St.ClipboardType.CLIPBOARD, result.metaInfo.clipboardText);
Main.overview.toggle();
},
_setMoreIconVisible: function(visible) {
_setMoreLabelVisible: function(visible, moreNumber) {
},
_ensureResultActors: function(results, callback) {
@ -227,7 +255,6 @@ const SearchResultsBase = new Lang.Class({
updateSearch: function(providerResults, terms, callback) {
this._terms = terms;
if (providerResults.length == 0) {
this._clearResultDisplay();
this.actor.hide();
@ -252,7 +279,8 @@ const SearchResultsBase = new Lang.Class({
results.forEach(Lang.bind(this, function(resultId) {
this._addItem(this._resultDisplays[resultId]);
}));
this._setMoreIconVisible(hasMoreResults && this.provider.canLaunchSearch);
this._setMoreLabelVisible(hasMoreResults && this.provider.canLaunchSearch,
providerResults.length - results.length);
this.actor.show();
callback();
}));
@ -264,20 +292,20 @@ const ListSearchResults = new Lang.Class({
Name: 'ListSearchResults',
Extends: SearchResultsBase,
_init: function(provider) {
this.parent(provider);
_init: function(provider, searchResultsView) {
this.parent(provider, searchResultsView);
this._container = new St.BoxLayout({ style_class: 'search-section-content' });
this.providerIcon = new ProviderIcon(provider);
this.providerIcon.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this.providerIcon.connect('clicked', Lang.bind(this,
this.providerInfo = new ProviderInfo(provider);
this.providerInfo.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this.providerInfo.connect('clicked', Lang.bind(this,
function() {
this.providerIcon.animateLaunch();
this.providerInfo.animateLaunch();
provider.launchSearch(this._terms);
Main.overview.toggle();
}));
this._container.add(this.providerIcon, { x_fill: false,
this._container.add(this.providerInfo, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
@ -289,8 +317,8 @@ const ListSearchResults = new Lang.Class({
this._resultDisplayBin.set_child(this._container);
},
_setMoreIconVisible: function(visible) {
this.providerIcon.moreIcon.visible = visible;
_setMoreLabelVisible: function(visible, moreNumber) {
this.providerInfo.setMoreVisible(visible, moreNumber);
},
_getMaxDisplayedResults: function() {
@ -302,7 +330,8 @@ const ListSearchResults = new Lang.Class({
},
_createResultDisplay: function(meta) {
return this.parent(meta) || new ListSearchResult(this.provider, meta);
return this.parent(meta, this._searchResultsView) ||
new ListSearchResult(this.provider, meta, this._searchResultsView);
},
_addItem: function(display) {
@ -322,14 +351,14 @@ const GridSearchResults = new Lang.Class({
Name: 'GridSearchResults',
Extends: SearchResultsBase,
_init: function(provider, parentContainer) {
this.parent(provider);
_init: function(provider, searchResultsView) {
this.parent(provider, searchResultsView);
// We need to use the parent container to know how much results we can show.
// None of the actors in this class can be used for that, since the main actor
// goes hidden when no results are displayed, and then it lost its allocation.
// Then on the next use of _getMaxDisplayedResults allocation is 0, en therefore
// it doesn't show any result although we have some.
this._parentContainer = parentContainer;
this._parentContainer = searchResultsView.actor;
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START });
@ -350,7 +379,8 @@ const GridSearchResults = new Lang.Class({
},
_createResultDisplay: function(meta) {
return this.parent(meta) || new GridSearchResult(this.provider, meta);
return this.parent(meta, this._searchResultsView) ||
new GridSearchResult(this.provider, meta, this._searchResultsView);
},
_addItem: function(display) {
@ -414,6 +444,8 @@ const SearchResults = new Lang.Class({
this._providers = [];
this._searchTermRegex = null;
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::enabled', Lang.bind(this, this._reloadRemoteProviders));
@ -533,6 +565,14 @@ const SearchResults = new Lang.Class({
if (this._searchTimeoutId == 0)
this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, Lang.bind(this, this._onSearchTimeout));
let escapedSearchTerms = this._terms.map(
(currentTerm, index, array) =>
{ return Shell.util_regex_escape(currentTerm) });
this._searchTermRegex =
new RegExp(`(${escapedSearchTerms.join('|')})`, 'gi');
this.emit('terms-changed');
},
_onPan: function(action) {
@ -552,9 +592,9 @@ const SearchResults = new Lang.Class({
let providerDisplay;
if (provider.appInfo)
providerDisplay = new ListSearchResults(provider);
providerDisplay = new ListSearchResults(provider, this);
else
providerDisplay = new GridSearchResults(provider, this.actor);
providerDisplay = new GridSearchResults(provider, this);
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
providerDisplay.actor.hide();
@ -671,14 +711,22 @@ const SearchResults = new Lang.Class({
} else {
result.actor.remove_style_pseudo_class('selected');
}
},
highlightTerms: function(description) {
if (!description)
return '';
return description.replace(this._searchTermRegex, '<b>$1</b>');
}
});
Signals.addSignalMethods(SearchResults.prototype);
const ProviderIcon = new Lang.Class({
Name: 'ProviderIcon',
const ProviderInfo = new Lang.Class({
Name: 'ProviderInfo',
Extends: St.Button,
PROVIDER_ICON_SIZE: 48,
PROVIDER_ICON_SIZE: 32,
_init: function(provider) {
this.provider = provider;
@ -688,22 +736,45 @@ const ProviderIcon = new Lang.Class({
accessible_name: provider.appInfo.get_name(),
track_hover: true });
this._content = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._content = new St.BoxLayout({ vertical: false });
this.set_child(this._content);
let rtl = (this.get_text_direction() == Clutter.TextDirection.RTL);
this.moreIcon = new St.Widget({ style_class: 'search-provider-icon-more',
visible: false,
x_align: rtl ? Clutter.ActorAlign.START : Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.END,
x_expand: true,
y_expand: true });
let icon = new St.Icon({ icon_size: this.PROVIDER_ICON_SIZE,
gicon: provider.appInfo.get_icon() });
this._content.add_actor(icon);
this._content.add_actor(this.moreIcon);
this._providerDetails = new St.BoxLayout({
style_class: 'list-search-provider-details',
vertical: true });
let providerNameLabel = new St.Label({
style_class: 'list-search-result-provider',
text: provider.appInfo.get_name() });
this._remainingResultsLabel = new St.Label({
style_class: 'list-search-result-title' });
this._providerDetails.add(providerNameLabel,
{ x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
this._providerDetails.add(this._remainingResultsLabel,
{ x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
this._content.add(icon, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
this._content.add(this._providerDetails, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
},
animateLaunch: function() {
@ -711,5 +782,11 @@ const ProviderIcon = new Lang.Class({
let app = appSys.lookup_app(this.provider.appInfo.get_id());
if (app.state == Shell.AppState.STOPPED)
IconGrid.zoomOutActor(this._content);
},
setMoreVisible: function(visible, resultsCount) {
this._remainingResultsLabel.visible = visible;
this._remainingResultsLabel.clutter_text.set_markup(
_("%d more").format(resultsCount));
}
});

View File

@ -7,7 +7,6 @@ const Mainloop = imports.mainloop;
const Signals = imports.signals;
const FileUtils = imports.misc.fileUtils;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Config = imports.misc.config;

View File

@ -28,6 +28,9 @@ const GnomeShellIface = '<node> \
<method name="ShowMonitorLabels"> \
<arg type="a{uv}" direction="in" name="params" /> \
</method> \
<method name="ShowMonitorLabels2"> \
<arg type="a{sv}" direction="in" name="params" /> \
</method> \
<method name="HideMonitorLabels" /> \
<method name="FocusApp"> \
<arg type="s" direction="in" name="id"/> \
@ -250,6 +253,12 @@ const GnomeShell = new Lang.Class({
Main.osdMonitorLabeler.show(sender, dict);
},
ShowMonitorLabels2Async: function(params, invocation) {
let sender = invocation.get_sender();
let [dict] = params;
Main.osdMonitorLabeler.show2(sender, dict);
},
HideMonitorLabelsAsync: function(params, invocation) {
let sender = invocation.get_sender();
Main.osdMonitorLabeler.hide(sender);

View File

@ -385,7 +385,7 @@ const SwitcherList = new Lang.Class({
let n = this._items.length;
bbox.connect('clicked', Lang.bind(this, function() { this._onItemClicked(n); }));
bbox.connect('enter-event', Lang.bind(this, function() { this._onItemEnter(n); }));
bbox.connect('motion-event', Lang.bind(this, function() { return this._onItemEnter(n); }));
bbox.label_actor = label;
@ -399,7 +399,11 @@ const SwitcherList = new Lang.Class({
},
_onItemEnter: function (index) {
this._itemEntered(index);
// Avoid reentrancy
if (index != this._currentItemEntered) {
this._currentItemEntered = index;
this._itemEntered(index);
}
return Clutter.EVENT_PROPAGATE;
},

View File

@ -1313,15 +1313,13 @@ const WindowManager = new Lang.Class({
return;
}
if ((whichChange == Meta.SizeChange.FULLSCREEN ||
whichChange == Meta.SizeChange.UNFULLSCREEN) &&
oldFrameRect.width > 0 && oldFrameRect.height > 0)
this._fullscreenAnimation(shellwm, actor, oldFrameRect, whichChange);
if (oldFrameRect.width > 0 && oldFrameRect.height > 0)
this._prepareAnimationInfo(shellwm, actor, oldFrameRect, whichChange);
else
shellwm.completed_size_change(actor);
},
_fullscreenAnimation: function(shellwm, actor, oldFrameRect, change) {
_prepareAnimationInfo: function(shellwm, actor, oldFrameRect, change) {
// Position a clone of the window on top of the old position,
// while actor updates are frozen.
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
@ -1331,26 +1329,25 @@ const WindowManager = new Lang.Class({
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
Main.uiGroup.add_actor(actorClone);
let rect = change == Meta.SizeChange.FULLSCREEN ? oldFrameRect : null;
if (this._clearFullscreenInfo(actor))
if (this._clearAnimationInfo(actor))
this._shellwm.completed_size_change(actor);
actor.__fullscreenInfo = { clone: actorClone,
oldRect: rect };
actor.__animationInfo = { clone: actorClone,
oldRect: oldFrameRect };
},
_sizeChangedWindow: function(shellwm, actor) {
if (!actor.__fullscreenInfo)
if (!actor.__animationInfo)
return;
if (this._resizing.indexOf(actor) != -1)
return;
let actorClone = actor.__fullscreenInfo.clone;
let actorClone = actor.__animationInfo.clone;
let targetRect = actor.meta_window.get_frame_rect();
let sourceRect = actor.__animationInfo.oldRect;
let scaleX = targetRect.width / actorClone.width;
let scaleY = targetRect.height / actorClone.height;
let scaleX = targetRect.width / sourceRect.width;
let scaleY = targetRect.height / sourceRect.height;
this._resizing.push(actor);
@ -1365,15 +1362,8 @@ const WindowManager = new Lang.Class({
transition: 'easeOutQuad'
});
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
let oldRect = actor.__fullscreenInfo.oldRect;
if (oldRect) {
actor.translation_x = oldRect.x - monitor.x;
actor.translation_y = oldRect.y - monitor.y;
} else {
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
}
actor.translation_x = -targetRect.x + sourceRect.x;
actor.translation_y = -targetRect.y + sourceRect.y;
// Now set scale the actor to size it as the clone.
actor.scale_x = 1 / scaleX;
@ -1401,10 +1391,10 @@ const WindowManager = new Lang.Class({
shellwm.completed_size_change(actor);
},
_clearFullscreenInfo: function(actor) {
if (actor.__fullscreenInfo) {
actor.__fullscreenInfo.clone.destroy();
delete actor.__fullscreenInfo;
_clearAnimationInfo: function(actor) {
if (actor.__animationInfo) {
actor.__animationInfo.clone.destroy();
delete actor.__animationInfo;
return true;
}
return false;
@ -1417,13 +1407,13 @@ const WindowManager = new Lang.Class({
actor.scale_y = 1.0;
actor.translation_x = 0;
actor.translation_y = 0;
this._clearFullscreenInfo(actor);
this._clearAnimationInfo(actor);
}
},
_sizeChangeWindowOverwritten: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor))
this._clearFullscreenInfo(actor);
this._clearAnimationInfo(actor);
},
_hasAttachedDialogs: function(window, ignoreWindow) {

View File

@ -1793,14 +1793,20 @@ const Workspace = new Lang.Class({
global.screen.disconnect(this._windowEnteredMonitorId);
global.screen.disconnect(this._windowLeftMonitorId);
if (this._repositionWindowsId > 0)
if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId);
this._repositionWindowsId = 0;
}
if (this._positionWindowsId > 0)
if (this._positionWindowsId > 0) {
Meta.later_remove(this._positionWindowsId);
this._positionWindowsId = 0;
}
if (this._actualGeometryLater > 0)
if (this._actualGeometryLater > 0) {
Meta.later_remove(this._actualGeometryLater);
this._actualGeometryLater = 0;
}
this._windows = [];
},

1301
po/ar.po

File diff suppressed because it is too large Load Diff

489
po/ca.po

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,7 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-03-20 18:14+0000\n"
"POT-Creation-Date: 2017-05-04 22:42+0000\n"
"PO-Revision-Date: 2017-03-21 19:33+0100\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
@ -58,7 +58,7 @@ msgid "Open the application menu"
msgstr "Das Anwendungsmenü öffnen"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:149
#: js/extensionPrefs/main.js:152
msgid "Shell Extensions"
msgstr "Shell-Erweiterungen"
@ -347,7 +347,7 @@ msgstr "Netzwerkanmeldung"
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:117
#: js/extensionPrefs/main.js:120
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:"
@ -433,7 +433,7 @@ msgstr "Ausführung von »%s« ist gescheitert:"
#: js/misc/util.js:180
msgid "Just now"
msgstr "Genau jetzt"
msgstr "Gerade eben"
#: js/misc/util.js:182
#, javascript-format
@ -553,11 +553,11 @@ msgid "%B %d %Y, %l%M %p"
msgstr "%e. %B %Y, %H:%M"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:67
#: js/portalHelper/main.js:66
msgid "Hotspot Login"
msgstr "Hotspot-Anmeldung"
#: js/portalHelper/main.js:113
#: js/portalHelper/main.js:112
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
@ -847,7 +847,7 @@ msgstr "Passwort der mobilen Breitbandverbindung"
msgid "A password is required to connect to “%s”."
msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1755
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1759
msgid "Network Manager"
msgstr "Netzwerk-Verwaltung"
@ -879,7 +879,7 @@ msgstr ""
msgid "%s is now known as %s"
msgstr "%s heißt jetzt %s"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:179
msgid "Windows"
msgstr "Fenster"
@ -1459,7 +1459,7 @@ msgstr "Einschalten"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:367 js/ui/status/network.js:1310
#: js/ui/status/network.js:1425 js/ui/status/nightLight.js:47
#: js/ui/status/network.js:1429 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Ausschalten"
@ -1662,62 +1662,62 @@ msgstr "Hotspot %s eingeschaltet"
msgid "%s Not Connected"
msgstr "%s nicht verbunden"
#: js/ui/status/network.js:1442
#: js/ui/status/network.js:1446
msgid "connecting…"
msgstr "Verbindungsaufbau …"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1445
#: js/ui/status/network.js:1449
msgid "authentication required"
msgstr "Anmeldung erforderlich"
#: js/ui/status/network.js:1447
#: js/ui/status/network.js:1451
msgid "connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1513 js/ui/status/network.js:1608
#: js/ui/status/network.js:1517 js/ui/status/network.js:1612
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Netzwerkeinstellungen"
#: js/ui/status/network.js:1515
#: js/ui/status/network.js:1519
msgid "VPN Settings"
msgstr "VPN-Einstellungen"
#: js/ui/status/network.js:1534
#: js/ui/status/network.js:1538
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1544
#: js/ui/status/network.js:1548
msgid "VPN Off"
msgstr "VPN ausgeschaltet"
#: js/ui/status/network.js:1639
#: js/ui/status/network.js:1643
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s Kabelverbindung"
msgstr[1] "%s Kabelverbindungen"
#: js/ui/status/network.js:1643
#: js/ui/status/network.js:1647
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Funknetzwerkverbindung"
msgstr[1] "%s Funknetzwerkverbindungen"
#: js/ui/status/network.js:1647
#: js/ui/status/network.js:1651
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s Modem-Verbindung"
msgstr[1] "%s Modem-Verbindungen"
#: js/ui/status/network.js:1794
#: js/ui/status/network.js:1798
msgid "Connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1795
#: js/ui/status/network.js:1799
msgid "Activation of network connection failed"
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
@ -1815,11 +1815,11 @@ msgstr "Als anderer Benutzer anmelden"
msgid "Unlock Window"
msgstr "Fenster entsperren"
#: js/ui/viewSelector.js:182
#: js/ui/viewSelector.js:183
msgid "Applications"
msgstr "Anwendungen"
#: js/ui/viewSelector.js:186
#: js/ui/viewSelector.js:187
msgid "Search"
msgstr "Suchen"

830
po/el.po

File diff suppressed because it is too large Load Diff

777
po/hr.po

File diff suppressed because it is too large Load Diff

View File

@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-03-20 18:14+0000\n"
"PO-Revision-Date: 2017-03-21 08:58+0100\n"
"POT-Creation-Date: 2017-04-07 12:28+0000\n"
"PO-Revision-Date: 2017-04-11 08:40+0200\n"
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
"Language-Team: Italiano <gnome-it-list@gnome.org>\n"
"Language: it\n"
@ -63,12 +63,12 @@ msgstr "GNOME Shell"
#: data/org.gnome.Shell.desktop.in.in:5
msgid "Window management and application launching"
msgstr "Gestisce finestre e avvia applicazioni"
msgstr "Gestione finestre e avvio applicazioni"
#: data/org.gnome.shell.gschema.xml.in:6
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Abilita gli strumenti interni utili a sviluppatori e beta-tester attraverso "
"Abilita gli strumenti interni utili a sviluppatori e collaudatori attraverso "
"Alt-F2"
#: data/org.gnome.shell.gschema.xml.in:9
@ -110,7 +110,8 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:34
msgid "Disables the validation of extension version compatibility"
msgstr "Disabilità convalida compatibilità versione estesioni"
msgstr ""
"Disabilita la convalida della compatibilità con le versioni delle estensioni"
#: data/org.gnome.shell.gschema.xml.in:35
msgid ""
@ -550,11 +551,11 @@ msgid "%B %d %Y, %l%M %p"
msgstr "%d %B %Y, %I%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:67
#: js/portalHelper/main.js:66
msgid "Hotspot Login"
msgstr "Accesso hotspot"
#: js/portalHelper/main.js:113
#: js/portalHelper/main.js:112
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
@ -845,7 +846,7 @@ msgstr "Password rete mobile"
msgid "A password is required to connect to “%s”."
msgstr "È richiesta una password per connettersi a «%s»."
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1755
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1759
msgid "Network Manager"
msgstr "Gestore reti"
@ -876,7 +877,7 @@ msgstr "Errore nell'autenticazione. Provare di nuovo."
msgid "%s is now known as %s"
msgstr "%s ha cambiato nome in %s"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:179
msgid "Windows"
msgstr "Finestre"
@ -1094,8 +1095,8 @@ msgstr ""
#: js/ui/endSessionDialog.js:361
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"In funzione con batteria: collegare l'alimentazione prima di installare gli "
"aggiornamenti."
"Alimentazione da batteria: collegare alla rete elettrica prima di installare "
"gli aggiornamenti."
#: js/ui/endSessionDialog.js:378
msgid "Some applications are busy or have unsaved work."
@ -1453,11 +1454,11 @@ msgstr "On"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1310
msgid "Turn On"
msgstr "Attiva"
msgstr "Accendi"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:367 js/ui/status/network.js:1310
#: js/ui/status/network.js:1425 js/ui/status/nightLight.js:47
#: js/ui/status/network.js:1429 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Spegni"
@ -1599,15 +1600,15 @@ msgstr "Connetti a Internet"
#: js/ui/status/network.js:844
msgid "Airplane Mode is On"
msgstr "La modalità aereo è attiva"
msgstr "La modalità aereo è accesa"
#: js/ui/status/network.js:845
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Il Wi-Fi è disabilitato quando la modalità aereo è attiva"
msgstr "Il Wi-Fi è disabilitato quando la modalità aereo è accesa."
#: js/ui/status/network.js:846
msgid "Turn Off Airplane Mode"
msgstr "Disattiva modalità aereo"
msgstr "Spegni modalità aereo"
#: js/ui/status/network.js:855
msgid "Wi-Fi is Off"
@ -1615,11 +1616,11 @@ msgstr "Il Wi-Fi è spento"
#: js/ui/status/network.js:856
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "È necessario attivare il Wi-Fi per potersi connettere a una rete."
msgstr "È necessario accendere il Wi-Fi per potersi connettere a una rete."
#: js/ui/status/network.js:857
msgid "Turn On Wi-Fi"
msgstr "Attiva Wi-Fi"
msgstr "Accendi Wi-Fi"
#: js/ui/status/network.js:882
msgid "Wi-Fi Networks"
@ -1635,7 +1636,7 @@ msgstr "Nessuna rete"
#: js/ui/status/network.js:935 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Usare l'interruttore hardware per disattivare"
msgstr "Usare l'interruttore hardware per spegnere"
#: js/ui/status/network.js:1202
msgid "Select Network"
@ -1657,62 +1658,62 @@ msgstr "Hotspot %s attivo"
msgid "%s Not Connected"
msgstr "%s non collegato"
#: js/ui/status/network.js:1442
#: js/ui/status/network.js:1446
msgid "connecting…"
msgstr "connessione…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1445
#: js/ui/status/network.js:1449
msgid "authentication required"
msgstr "richiesta autenticazione"
#: js/ui/status/network.js:1447
#: js/ui/status/network.js:1451
msgid "connection failed"
msgstr "connessione non riuscita"
#: js/ui/status/network.js:1513 js/ui/status/network.js:1608
#: js/ui/status/network.js:1517 js/ui/status/network.js:1612
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Impostazioni rete"
#: js/ui/status/network.js:1515
#: js/ui/status/network.js:1519
msgid "VPN Settings"
msgstr "Impostazioni VPN"
#: js/ui/status/network.js:1534
#: js/ui/status/network.js:1538
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1544
#: js/ui/status/network.js:1548
msgid "VPN Off"
msgstr "VPN spento"
msgstr "VPN spenta"
#: js/ui/status/network.js:1639
#: js/ui/status/network.js:1643
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s connessione via cavo"
msgstr[1] "%s connessioni via cavo"
#: js/ui/status/network.js:1643
#: js/ui/status/network.js:1647
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s connessione Wi-Fi"
msgstr[1] "%s connessioni Wi-Fi"
#: js/ui/status/network.js:1647
#: js/ui/status/network.js:1651
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s connessione modem"
msgstr[1] "%s connessioni modem"
#: js/ui/status/network.js:1794
#: js/ui/status/network.js:1798
msgid "Connection failed"
msgstr "Connessione non riuscita"
#: js/ui/status/network.js:1795
#: js/ui/status/network.js:1799
msgid "Activation of network connection failed"
msgstr "Attivazione della connessione di rete non riuscita"
@ -1769,7 +1770,7 @@ msgstr "%d%%"
#. changing the menu contents.
#: js/ui/status/rfkill.js:88
msgid "Airplane Mode On"
msgstr "Modalità aereo attiva"
msgstr "Modalità aereo accesa"
#: js/ui/status/system.js:378
msgid "Switch User"
@ -1811,11 +1812,11 @@ msgstr "Accedi come altro utente"
msgid "Unlock Window"
msgstr "Sblocca finestra"
#: js/ui/viewSelector.js:182
#: js/ui/viewSelector.js:183
msgid "Applications"
msgstr "Applicazioni"
#: js/ui/viewSelector.js:186
#: js/ui/viewSelector.js:187
msgid "Search"
msgstr "Cerca"
@ -1959,7 +1960,7 @@ msgstr "Modalità usata da GDM per la schermata d'accesso"
#: src/main.c:384
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Usa una modalità specifica, p.e. \"gdm\" per la schermata di accesso"
msgstr "Usa una modalità specifica, p.e. «gdm» per la schermata di accesso"
#: src/main.c:390
msgid "List possible modes"

234
po/sr.po
View File

@ -11,17 +11,19 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-03-03 11:37+0000\n"
"PO-Revision-Date: 2017-03-05 05:41+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"POT-Creation-Date: 2017-05-18 18:56+0000\n"
"PO-Revision-Date: 2017-05-18 22:42+0200\n"
"Last-Translator: Марко М. Костић <marko.m.kostic@gmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n"
"X-Generator: Poedit 2.0.2\n"
"X-Poedit-Bookmarks: -1,167,-1,-1,-1,-1,-1,-1,-1,-1\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@ -48,7 +50,7 @@ msgid "Open the application menu"
msgstr "Отворите изборник програма"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:149
#: js/extensionPrefs/main.js:152
msgid "Shell Extensions"
msgstr "Проширења шкољке"
@ -326,7 +328,7 @@ msgstr "Мрежна пријава"
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:117
#: js/extensionPrefs/main.js:120
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Дошло је до грешке при учитавању прозорчета поставки за „%s“:"
@ -334,7 +336,7 @@ msgstr "Дошло је до грешке при учитавању прозор
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:939
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:947
msgid "Cancel"
msgstr "Откажи"
@ -382,7 +384,7 @@ msgstr "Корисник: "
msgid "Login Window"
msgstr "Прозор за пријављивање"
#: js/gdm/util.js:341
#: js/gdm/util.js:342
msgid "Authentication error"
msgstr "Грешка потврђивања идентитета"
@ -391,7 +393,7 @@ msgstr "Грешка потврђивања идентитета"
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: js/gdm/util.js:473
#: js/gdm/util.js:474
msgid "(or swipe finger)"
msgstr "(или превуците прст)"
@ -433,7 +435,6 @@ msgstr[2] "Пре %d сати"
msgstr[3] "Пре један сат"
#: js/misc/util.js:188
#| msgid "Yesterday, %H%M"
msgid "Yesterday"
msgstr "Јуче"
@ -544,11 +545,11 @@ msgid "%B %d %Y, %l%M %p"
msgstr "%d .%B %Y., %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:67
#: js/portalHelper/main.js:66
msgid "Hotspot Login"
msgstr "Пријава на врућу тачку"
#: js/portalHelper/main.js:113
#: js/portalHelper/main.js:112
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
@ -558,11 +559,11 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:62 js/ui/status/location.js:427
#: js/ui/accessDialog.js:62 js/ui/status/location.js:405
msgid "Deny Access"
msgstr "Забрани приступ"
#: js/ui/accessDialog.js:63 js/ui/status/location.js:430
#: js/ui/accessDialog.js:63 js/ui/status/location.js:408
msgid "Grant Access"
msgstr "Дозволи приступ"
@ -762,7 +763,7 @@ msgid "Type again:"
msgstr "Упишите поново:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:366 js/ui/status/network.js:942
#: js/ui/status/network.js:366 js/ui/status/network.js:950
msgid "Connect"
msgstr "Повежи се"
@ -836,7 +837,7 @@ msgstr "Лозинка мобилне широкопојасне мреже"
msgid "A password is required to connect to “%s”."
msgstr "Потребна је лозинка за повезивање на „%s“."
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1747
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1759
msgid "Network Manager"
msgstr "Управник мреже"
@ -862,12 +863,12 @@ msgstr "Погрешили сте! Покушајте поново."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:767
#: js/ui/components/telepathyClient.js:799
#, javascript-format
msgid "%s is now known as %s"
msgstr "„%s“ је сада познат као „%s“"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:179
msgid "Windows"
msgstr "Прозори"
@ -933,24 +934,27 @@ msgstr "%s, затим %s касније."
#: js/ui/dateMenu.js:293
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, затим %s, касније праћено %s."
msgstr "%s, затим %s, а касније %s."
#: js/ui/dateMenu.js:300
#| msgid "Searching…"
msgid "Select a location…"
msgstr "Изаберите место…"
#: js/ui/dateMenu.js:303
msgid "Loading…"
msgstr "Учитавам…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:306
#: js/ui/dateMenu.js:309
#, javascript-format
msgid "Feels like %s."
msgstr "Осећа се као %s."
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:312
msgid "Go online for weather information"
msgstr "Идите на мрежу за податке о временској прогнози."
#: js/ui/dateMenu.js:311
#: js/ui/dateMenu.js:314
msgid "Weather information is currently unavailable"
msgstr "Подаци о временској прогнози тренутно нису доступни."
@ -1135,51 +1139,51 @@ msgstr "Сакриј касету"
msgid "Status Icons"
msgstr "Иконице стања"
#: js/ui/lookingGlass.js:643
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
msgstr "Нису инсталирана проширења"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:697
#: js/ui/lookingGlass.js:696
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s није објавио никакве грешке."
#: js/ui/lookingGlass.js:703
#: js/ui/lookingGlass.js:702
msgid "Hide Errors"
msgstr "Сакриј грешке"
#: js/ui/lookingGlass.js:707 js/ui/lookingGlass.js:767
#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766
msgid "Show Errors"
msgstr "Прикажите грешке"
#: js/ui/lookingGlass.js:716
#: js/ui/lookingGlass.js:715
msgid "Enabled"
msgstr "Укључено"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:719 src/gvc/gvc-mixer-control.c:1866
#: js/ui/lookingGlass.js:718 src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Искључено"
#: js/ui/lookingGlass.js:721
#: js/ui/lookingGlass.js:720
msgid "Error"
msgstr "Грешка"
#: js/ui/lookingGlass.js:723
#: js/ui/lookingGlass.js:722
msgid "Out of date"
msgstr "Изван датума"
#: js/ui/lookingGlass.js:725
#: js/ui/lookingGlass.js:724
msgid "Downloading"
msgstr "Преузимам"
#: js/ui/lookingGlass.js:749
#: js/ui/lookingGlass.js:748
msgid "View Source"
msgstr "Прикажи код"
#: js/ui/lookingGlass.js:758
#: js/ui/lookingGlass.js:757
msgid "Web Page"
msgstr "Веб страница"
@ -1213,47 +1217,47 @@ msgstr "Преглед"
msgid "Type to search…"
msgstr "Упишите текст за претрагу…"
#: js/ui/padOsd.js:37
#: js/ui/padOsd.js:103
msgid "New shortcut…"
msgstr "Нова пречица…"
#: js/ui/padOsd.js:86
#: js/ui/padOsd.js:152
msgid "Application defined"
msgstr "Дефинисани програм"
#: js/ui/padOsd.js:87
#: js/ui/padOsd.js:153
msgid "Show on-screen help"
msgstr "Прикажи помоћ на екрану"
#: js/ui/padOsd.js:88
#: js/ui/padOsd.js:154
msgid "Switch monitor"
msgstr "Промени монитор"
#: js/ui/padOsd.js:89
#: js/ui/padOsd.js:155
msgid "Assign keystroke"
msgstr "Додели тастер"
#: js/ui/padOsd.js:143
#: js/ui/padOsd.js:209
msgid "Done"
msgstr "Готово"
#: js/ui/padOsd.js:597
#: js/ui/padOsd.js:698
msgid "Edit…"
msgstr "Уреди…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
#: js/ui/padOsd.js:738 js/ui/padOsd.js:800
msgid "None"
msgstr "Ништа"
#: js/ui/padOsd.js:648
#: js/ui/padOsd.js:783
msgid "Press a button to configure"
msgstr "Притисните дугме да подесите"
#: js/ui/padOsd.js:649
#: js/ui/padOsd.js:784
msgid "Press Esc to exit"
msgstr "Притисните „Есц“ да изађете"
#: js/ui/padOsd.js:652
#: js/ui/padOsd.js:787
msgid "Press any key to exit"
msgstr "Притисните неки тастер да изађете"
@ -1289,7 +1293,7 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command"
msgstr "Унесите наредбу"
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:162
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160
msgid "Close"
msgstr "Затвори"
@ -1303,11 +1307,11 @@ msgstr "Поновно покрећем…"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/screenShield.js:85
#: js/ui/screenShield.js:88
msgid "%A, %B %d"
msgstr "%A, %d. %B"
#: js/ui/screenShield.js:144
#: js/ui/screenShield.js:147
#, javascript-format
msgid "%d new message"
msgid_plural "%d new messages"
@ -1316,7 +1320,7 @@ msgstr[1] "%d нове поруке"
msgstr[2] "%d нових порука"
msgstr[3] "%d нова порука"
#: js/ui/screenShield.js:146
#: js/ui/screenShield.js:149
#, javascript-format
msgid "%d new notification"
msgid_plural "%d new notifications"
@ -1325,11 +1329,11 @@ msgstr[1] "%d нова обавештења"
msgstr[2] "%d нових обавештења"
msgstr[3] "%d ново обавештење"
#: js/ui/screenShield.js:449 js/ui/status/system.js:409
#: js/ui/screenShield.js:452 js/ui/status/system.js:409
msgid "Lock"
msgstr "Закључај"
#: js/ui/screenShield.js:707
#: js/ui/screenShield.js:715
msgid "GNOME needs to lock the screen"
msgstr "Гном мора да закључа екран"
@ -1340,19 +1344,19 @@ msgstr "Гном мора да закључа екран"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1308
msgid "Unable to lock"
msgstr "Не могу да закључам"
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309
msgid "Lock was blocked by an application"
msgstr "Неки програм је блокирао закључавање"
#: js/ui/search.js:617
#: js/ui/search.js:621
msgid "Searching…"
msgstr "Тражим…"
#: js/ui/search.js:619
#: js/ui/search.js:623
msgid "No results."
msgstr "Нема одговарајућих резултата."
@ -1450,13 +1454,13 @@ msgstr "Искљ."
msgid "On"
msgstr "Укљ."
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1302
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1310
msgid "Turn On"
msgstr "Укључи"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:367 js/ui/status/network.js:1302
#: js/ui/status/network.js:1417 js/ui/status/nightLight.js:47
#: js/ui/status/network.js:367 js/ui/status/network.js:1310
#: js/ui/status/network.js:1429 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Искључи"
@ -1469,37 +1473,37 @@ msgstr "Осветљеност"
msgid "Show Keyboard Layout"
msgstr "Покажи распоред тастатуре"
#: js/ui/status/location.js:107 js/ui/status/location.js:215
#: js/ui/status/location.js:88 js/ui/status/location.js:196
msgid "Location Enabled"
msgstr "Одређивање места укључено"
#: js/ui/status/location.js:108 js/ui/status/location.js:216
#: js/ui/status/location.js:89 js/ui/status/location.js:197
msgid "Disable"
msgstr "Искључи"
#: js/ui/status/location.js:109
#: js/ui/status/location.js:90
msgid "Privacy Settings"
msgstr "Подешавања приватности"
#: js/ui/status/location.js:214
#: js/ui/status/location.js:195
msgid "Location In Use"
msgstr "Одређивање места се користи"
#: js/ui/status/location.js:218
#: js/ui/status/location.js:199
msgid "Location Disabled"
msgstr "Одређивање места искључено"
#: js/ui/status/location.js:219
#: js/ui/status/location.js:200
msgid "Enable"
msgstr "Укључи"
#. Translators: %s is an application name
#: js/ui/status/location.js:436
#: js/ui/status/location.js:414
#, javascript-format
msgid "Give %s access to your location?"
msgstr "Да ли да „%s“ дам приступ вашем месту?"
#: js/ui/status/location.js:438
#: js/ui/status/location.js:416
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Приступ месту можете да измените у било које време у подешавањима "
@ -1510,7 +1514,7 @@ msgid "<unknown>"
msgstr "<непознато>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465 js/ui/status/network.js:1331
#: js/ui/status/network.js:465 js/ui/status/network.js:1339
#, javascript-format
msgid "%s Off"
msgstr "%s искључено"
@ -1536,7 +1540,7 @@ msgid "%s Disconnecting"
msgstr "%s прекидање везе у току"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:483 js/ui/status/network.js:1323
#: js/ui/status/network.js:483 js/ui/status/network.js:1331
#, javascript-format
msgid "%s Connecting"
msgstr "%s повезивање у току"
@ -1576,7 +1580,7 @@ msgid "Mobile Broadband Settings"
msgstr "Подешавања мобилне широкопојасне везе"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:602 js/ui/status/network.js:1328
#: js/ui/status/network.js:602 js/ui/status/network.js:1336
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s уређај искључен"
@ -1592,97 +1596,97 @@ msgstr "%s искључено"
msgid "Connect to Internet"
msgstr "Повежи се на Интернет"
#: js/ui/status/network.js:836
#: js/ui/status/network.js:844
msgid "Airplane Mode is On"
msgstr "Авионски режим рада је укључен"
#: js/ui/status/network.js:837
#: js/ui/status/network.js:845
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Бежична веза је искључена када је укључен авионски режим рада."
#: js/ui/status/network.js:838
#: js/ui/status/network.js:846
msgid "Turn Off Airplane Mode"
msgstr "Искључи авионски режим рада"
#: js/ui/status/network.js:847
#: js/ui/status/network.js:855
msgid "Wi-Fi is Off"
msgstr "Бежична веза је искључена"
#: js/ui/status/network.js:848
#: js/ui/status/network.js:856
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Бежична веза треба бити укључена да бисте се повезали на мрежу."
#: js/ui/status/network.js:849
#: js/ui/status/network.js:857
msgid "Turn On Wi-Fi"
msgstr "Укључи бежичну везу"
#: js/ui/status/network.js:874
#: js/ui/status/network.js:882
msgid "Wi-Fi Networks"
msgstr "Бежичне мреже"
#: js/ui/status/network.js:876
#: js/ui/status/network.js:884
msgid "Select a network"
msgstr "Изаберите мрежу"
#: js/ui/status/network.js:906
#: js/ui/status/network.js:914
msgid "No Networks"
msgstr "Нема мрежа"
#: js/ui/status/network.js:927 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:935 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Користи физички прекидач за искључивање"
#: js/ui/status/network.js:1194
#: js/ui/status/network.js:1202
msgid "Select Network"
msgstr "Изабери мрежу"
#: js/ui/status/network.js:1200
#: js/ui/status/network.js:1208
msgid "Wi-Fi Settings"
msgstr "Подешавања бежичне везе"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1319
#: js/ui/status/network.js:1327
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s хотспот укључен"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1334
#: js/ui/status/network.js:1342
#, javascript-format
msgid "%s Not Connected"
msgstr "%s неповезано"
#: js/ui/status/network.js:1434
#: js/ui/status/network.js:1446
msgid "connecting…"
msgstr "повезујем се…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1437
#: js/ui/status/network.js:1449
msgid "authentication required"
msgstr "потребна је пријава"
#: js/ui/status/network.js:1439
#: js/ui/status/network.js:1451
msgid "connection failed"
msgstr "повезивање није успело"
#: js/ui/status/network.js:1505 js/ui/status/network.js:1600
#: js/ui/status/network.js:1517 js/ui/status/network.js:1612
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Подешавања мреже"
#: js/ui/status/network.js:1507
#: js/ui/status/network.js:1519
msgid "VPN Settings"
msgstr "ВПН подешавања"
#: js/ui/status/network.js:1526
#: js/ui/status/network.js:1538
msgid "VPN"
msgstr "ВПН"
#: js/ui/status/network.js:1536
#: js/ui/status/network.js:1548
msgid "VPN Off"
msgstr "Искључи ВПН"
#: js/ui/status/network.js:1631
#: js/ui/status/network.js:1643
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
@ -1691,7 +1695,7 @@ msgstr[1] "%s жичане везе"
msgstr[2] "%s жичаних веза"
msgstr[3] "%s жичана веза"
#: js/ui/status/network.js:1635
#: js/ui/status/network.js:1647
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
@ -1700,7 +1704,7 @@ msgstr[1] "%s бежичне везе"
msgstr[2] "%s бежичних веза"
msgstr[3] "%s бежична веза"
#: js/ui/status/network.js:1639
#: js/ui/status/network.js:1651
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
@ -1709,11 +1713,11 @@ msgstr[1] "%s модемске везе"
msgstr[2] "%s модемских веза"
msgstr[3] "%s модемска веза"
#: js/ui/status/network.js:1786
#: js/ui/status/network.js:1798
msgid "Connection failed"
msgstr "Повезивање није успело"
#: js/ui/status/network.js:1787
#: js/ui/status/network.js:1799
msgid "Activation of network connection failed"
msgstr "Активирање мрежне везе није успело"
@ -1811,11 +1815,11 @@ msgstr "Пријавите се као други корисник"
msgid "Unlock Window"
msgstr "Откључај прозор"
#: js/ui/viewSelector.js:182
#: js/ui/viewSelector.js:183
msgid "Applications"
msgstr "Програми"
#: js/ui/viewSelector.js:186
#: js/ui/viewSelector.js:187
msgid "Search"
msgstr "Тражи"
@ -1824,22 +1828,22 @@ msgstr "Тражи"
msgid "“%s” is ready"
msgstr "„%s“ је спреман"
#: js/ui/windowManager.js:83
#: js/ui/windowManager.js:84
msgid "Do you want to keep these display settings?"
msgstr "Да ли желите да задржите ова подешавања екрана?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:102
#: js/ui/windowManager.js:103
msgid "Revert Settings"
msgstr "Врати подешавања"
#: js/ui/windowManager.js:105
#: js/ui/windowManager.js:106
msgid "Keep Changes"
msgstr "Задржи измене"
#: js/ui/windowManager.js:123
#: js/ui/windowManager.js:124
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1850,7 +1854,7 @@ msgstr[3] "Измене подешавања ће бити враћене за %
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:678
#: js/ui/windowManager.js:679
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -1887,35 +1891,35 @@ msgstr "Увек на врху"
msgid "Always on Visible Workspace"
msgstr "Увек на приказаном радном простору"
#: js/ui/windowMenu.js:105
#: js/ui/windowMenu.js:103
msgid "Move to Workspace Left"
msgstr "Премести на леви радни простор"
#: js/ui/windowMenu.js:110
#: js/ui/windowMenu.js:108
msgid "Move to Workspace Right"
msgstr "Премести на десни радни простор"
#: js/ui/windowMenu.js:115
#: js/ui/windowMenu.js:113
msgid "Move to Workspace Up"
msgstr "Премести на радни простор горе"
#: js/ui/windowMenu.js:120
#: js/ui/windowMenu.js:118
msgid "Move to Workspace Down"
msgstr "Премести на радни простор доле"
#: js/ui/windowMenu.js:136
#: js/ui/windowMenu.js:134
msgid "Move to Monitor Up"
msgstr "Премести на горњи радни простор"
#: js/ui/windowMenu.js:142
#: js/ui/windowMenu.js:140
msgid "Move to Monitor Down"
msgstr "Премести на доњи радни простор"
#: js/ui/windowMenu.js:148
#: js/ui/windowMenu.js:146
msgid "Move to Monitor Left"
msgstr "Премести екран улево"
#: js/ui/windowMenu.js:154
#: js/ui/windowMenu.js:152
msgid "Move to Monitor Right"
msgstr "Премести екран удесно"
@ -1954,19 +1958,19 @@ msgstr[3] "%u улаз"
msgid "System Sounds"
msgstr "Системски звуци"
#: src/main.c:381
#: src/main.c:372
msgid "Print version"
msgstr "Исписује издање"
#: src/main.c:387
#: src/main.c:378
msgid "Mode used by GDM for login screen"
msgstr "Који режим користи ГДМ за екран пријављивања"
#: src/main.c:393
#: src/main.c:384
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Користи нарочит режим, нпр. „gdm“ за екран пријављивања"
#: src/main.c:399
#: src/main.c:390
msgid "List possible modes"
msgstr "Исписује могуће режиме"

View File

@ -11,17 +11,19 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-03-03 11:37+0000\n"
"PO-Revision-Date: 2017-03-05 05:41+0200\n"
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
"POT-Creation-Date: 2017-05-18 18:56+0000\n"
"PO-Revision-Date: 2017-05-18 22:42+0200\n"
"Last-Translator: Marko M. Kostić <marko.m.kostic@gmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n"
"X-Generator: Poedit 2.0.2\n"
"X-Poedit-Bookmarks: -1,167,-1,-1,-1,-1,-1,-1,-1,-1\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@ -48,7 +50,7 @@ msgid "Open the application menu"
msgstr "Otvorite izbornik programa"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:149
#: js/extensionPrefs/main.js:152
msgid "Shell Extensions"
msgstr "Proširenja školjke"
@ -326,7 +328,7 @@ msgstr "Mrežna prijava"
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:117
#: js/extensionPrefs/main.js:120
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Došlo je do greške pri učitavanju prozorčeta postavki za „%s“:"
@ -334,7 +336,7 @@ msgstr "Došlo je do greške pri učitavanju prozorčeta postavki za „%s“:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:939
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:947
msgid "Cancel"
msgstr "Otkaži"
@ -382,7 +384,7 @@ msgstr "Korisnik: "
msgid "Login Window"
msgstr "Prozor za prijavljivanje"
#: js/gdm/util.js:341
#: js/gdm/util.js:342
msgid "Authentication error"
msgstr "Greška potvrđivanja identiteta"
@ -391,7 +393,7 @@ msgstr "Greška potvrđivanja identiteta"
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: js/gdm/util.js:473
#: js/gdm/util.js:474
msgid "(or swipe finger)"
msgstr "(ili prevucite prst)"
@ -433,7 +435,6 @@ msgstr[2] "Pre %d sati"
msgstr[3] "Pre jedan sat"
#: js/misc/util.js:188
#| msgid "Yesterday, %H%M"
msgid "Yesterday"
msgstr "Juče"
@ -544,11 +545,11 @@ msgid "%B %d %Y, %l%M %p"
msgstr "%d .%B %Y., %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:67
#: js/portalHelper/main.js:66
msgid "Hotspot Login"
msgstr "Prijava na vruću tačku"
#: js/portalHelper/main.js:113
#: js/portalHelper/main.js:112
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
@ -558,11 +559,11 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:62 js/ui/status/location.js:427
#: js/ui/accessDialog.js:62 js/ui/status/location.js:405
msgid "Deny Access"
msgstr "Zabrani pristup"
#: js/ui/accessDialog.js:63 js/ui/status/location.js:430
#: js/ui/accessDialog.js:63 js/ui/status/location.js:408
msgid "Grant Access"
msgstr "Dozvoli pristup"
@ -762,7 +763,7 @@ msgid "Type again:"
msgstr "Upišite ponovo:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:366 js/ui/status/network.js:942
#: js/ui/status/network.js:366 js/ui/status/network.js:950
msgid "Connect"
msgstr "Poveži se"
@ -836,7 +837,7 @@ msgstr "Lozinka mobilne širokopojasne mreže"
msgid "A password is required to connect to “%s”."
msgstr "Potrebna je lozinka za povezivanje na „%s“."
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1747
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1759
msgid "Network Manager"
msgstr "Upravnik mreže"
@ -862,12 +863,12 @@ msgstr "Pogrešili ste! Pokušajte ponovo."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:767
#: js/ui/components/telepathyClient.js:799
#, javascript-format
msgid "%s is now known as %s"
msgstr "„%s“ je sada poznat kao „%s“"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:179
msgid "Windows"
msgstr "Prozori"
@ -933,24 +934,27 @@ msgstr "%s, zatim %s kasnije."
#: js/ui/dateMenu.js:293
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, zatim %s, kasnije praćeno %s."
msgstr "%s, zatim %s, a kasnije %s."
#: js/ui/dateMenu.js:300
#| msgid "Searching…"
msgid "Select a location…"
msgstr "Izaberite mesto…"
#: js/ui/dateMenu.js:303
msgid "Loading…"
msgstr "Učitavam…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:306
#: js/ui/dateMenu.js:309
#, javascript-format
msgid "Feels like %s."
msgstr "Oseća se kao %s."
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:312
msgid "Go online for weather information"
msgstr "Idite na mrežu za podatke o vremenskoj prognozi."
#: js/ui/dateMenu.js:311
#: js/ui/dateMenu.js:314
msgid "Weather information is currently unavailable"
msgstr "Podaci o vremenskoj prognozi trenutno nisu dostupni."
@ -1135,51 +1139,51 @@ msgstr "Sakrij kasetu"
msgid "Status Icons"
msgstr "Ikonice stanja"
#: js/ui/lookingGlass.js:643
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
msgstr "Nisu instalirana proširenja"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:697
#: js/ui/lookingGlass.js:696
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s nije objavio nikakve greške."
#: js/ui/lookingGlass.js:703
#: js/ui/lookingGlass.js:702
msgid "Hide Errors"
msgstr "Sakrij greške"
#: js/ui/lookingGlass.js:707 js/ui/lookingGlass.js:767
#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766
msgid "Show Errors"
msgstr "Prikažite greške"
#: js/ui/lookingGlass.js:716
#: js/ui/lookingGlass.js:715
msgid "Enabled"
msgstr "Uključeno"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:719 src/gvc/gvc-mixer-control.c:1866
#: js/ui/lookingGlass.js:718 src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Isključeno"
#: js/ui/lookingGlass.js:721
#: js/ui/lookingGlass.js:720
msgid "Error"
msgstr "Greška"
#: js/ui/lookingGlass.js:723
#: js/ui/lookingGlass.js:722
msgid "Out of date"
msgstr "Izvan datuma"
#: js/ui/lookingGlass.js:725
#: js/ui/lookingGlass.js:724
msgid "Downloading"
msgstr "Preuzimam"
#: js/ui/lookingGlass.js:749
#: js/ui/lookingGlass.js:748
msgid "View Source"
msgstr "Prikaži kod"
#: js/ui/lookingGlass.js:758
#: js/ui/lookingGlass.js:757
msgid "Web Page"
msgstr "Veb stranica"
@ -1213,47 +1217,47 @@ msgstr "Pregled"
msgid "Type to search…"
msgstr "Upišite tekst za pretragu…"
#: js/ui/padOsd.js:37
#: js/ui/padOsd.js:103
msgid "New shortcut…"
msgstr "Nova prečica…"
#: js/ui/padOsd.js:86
#: js/ui/padOsd.js:152
msgid "Application defined"
msgstr "Definisani program"
#: js/ui/padOsd.js:87
#: js/ui/padOsd.js:153
msgid "Show on-screen help"
msgstr "Prikaži pomoć na ekranu"
#: js/ui/padOsd.js:88
#: js/ui/padOsd.js:154
msgid "Switch monitor"
msgstr "Promeni monitor"
#: js/ui/padOsd.js:89
#: js/ui/padOsd.js:155
msgid "Assign keystroke"
msgstr "Dodeli taster"
#: js/ui/padOsd.js:143
#: js/ui/padOsd.js:209
msgid "Done"
msgstr "Gotovo"
#: js/ui/padOsd.js:597
#: js/ui/padOsd.js:698
msgid "Edit…"
msgstr "Uredi…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
#: js/ui/padOsd.js:738 js/ui/padOsd.js:800
msgid "None"
msgstr "Ništa"
#: js/ui/padOsd.js:648
#: js/ui/padOsd.js:783
msgid "Press a button to configure"
msgstr "Pritisnite dugme da podesite"
#: js/ui/padOsd.js:649
#: js/ui/padOsd.js:784
msgid "Press Esc to exit"
msgstr "Pritisnite „Esc“ da izađete"
#: js/ui/padOsd.js:652
#: js/ui/padOsd.js:787
msgid "Press any key to exit"
msgstr "Pritisnite neki taster da izađete"
@ -1289,7 +1293,7 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command"
msgstr "Unesite naredbu"
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:162
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160
msgid "Close"
msgstr "Zatvori"
@ -1303,11 +1307,11 @@ msgstr "Ponovno pokrećem…"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/screenShield.js:85
#: js/ui/screenShield.js:88
msgid "%A, %B %d"
msgstr "%A, %d. %B"
#: js/ui/screenShield.js:144
#: js/ui/screenShield.js:147
#, javascript-format
msgid "%d new message"
msgid_plural "%d new messages"
@ -1316,7 +1320,7 @@ msgstr[1] "%d nove poruke"
msgstr[2] "%d novih poruka"
msgstr[3] "%d nova poruka"
#: js/ui/screenShield.js:146
#: js/ui/screenShield.js:149
#, javascript-format
msgid "%d new notification"
msgid_plural "%d new notifications"
@ -1325,11 +1329,11 @@ msgstr[1] "%d nova obaveštenja"
msgstr[2] "%d novih obaveštenja"
msgstr[3] "%d novo obaveštenje"
#: js/ui/screenShield.js:449 js/ui/status/system.js:409
#: js/ui/screenShield.js:452 js/ui/status/system.js:409
msgid "Lock"
msgstr "Zaključaj"
#: js/ui/screenShield.js:707
#: js/ui/screenShield.js:715
msgid "GNOME needs to lock the screen"
msgstr "Gnom mora da zaključa ekran"
@ -1340,19 +1344,19 @@ msgstr "Gnom mora da zaključa ekran"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1308
msgid "Unable to lock"
msgstr "Ne mogu da zaključam"
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309
msgid "Lock was blocked by an application"
msgstr "Neki program je blokirao zaključavanje"
#: js/ui/search.js:617
#: js/ui/search.js:621
msgid "Searching…"
msgstr "Tražim…"
#: js/ui/search.js:619
#: js/ui/search.js:623
msgid "No results."
msgstr "Nema odgovarajućih rezultata."
@ -1450,13 +1454,13 @@ msgstr "Isklj."
msgid "On"
msgstr "Uklj."
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1302
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1310
msgid "Turn On"
msgstr "Uključi"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:367 js/ui/status/network.js:1302
#: js/ui/status/network.js:1417 js/ui/status/nightLight.js:47
#: js/ui/status/network.js:367 js/ui/status/network.js:1310
#: js/ui/status/network.js:1429 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Isključi"
@ -1469,37 +1473,37 @@ msgstr "Osvetljenost"
msgid "Show Keyboard Layout"
msgstr "Pokaži raspored tastature"
#: js/ui/status/location.js:107 js/ui/status/location.js:215
#: js/ui/status/location.js:88 js/ui/status/location.js:196
msgid "Location Enabled"
msgstr "Određivanje mesta uključeno"
#: js/ui/status/location.js:108 js/ui/status/location.js:216
#: js/ui/status/location.js:89 js/ui/status/location.js:197
msgid "Disable"
msgstr "Isključi"
#: js/ui/status/location.js:109
#: js/ui/status/location.js:90
msgid "Privacy Settings"
msgstr "Podešavanja privatnosti"
#: js/ui/status/location.js:214
#: js/ui/status/location.js:195
msgid "Location In Use"
msgstr "Određivanje mesta se koristi"
#: js/ui/status/location.js:218
#: js/ui/status/location.js:199
msgid "Location Disabled"
msgstr "Određivanje mesta isključeno"
#: js/ui/status/location.js:219
#: js/ui/status/location.js:200
msgid "Enable"
msgstr "Uključi"
#. Translators: %s is an application name
#: js/ui/status/location.js:436
#: js/ui/status/location.js:414
#, javascript-format
msgid "Give %s access to your location?"
msgstr "Da li da „%s“ dam pristup vašem mestu?"
#: js/ui/status/location.js:438
#: js/ui/status/location.js:416
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Pristup mestu možete da izmenite u bilo koje vreme u podešavanjima "
@ -1510,7 +1514,7 @@ msgid "<unknown>"
msgstr "<nepoznato>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465 js/ui/status/network.js:1331
#: js/ui/status/network.js:465 js/ui/status/network.js:1339
#, javascript-format
msgid "%s Off"
msgstr "%s isključeno"
@ -1536,7 +1540,7 @@ msgid "%s Disconnecting"
msgstr "%s prekidanje veze u toku"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:483 js/ui/status/network.js:1323
#: js/ui/status/network.js:483 js/ui/status/network.js:1331
#, javascript-format
msgid "%s Connecting"
msgstr "%s povezivanje u toku"
@ -1576,7 +1580,7 @@ msgid "Mobile Broadband Settings"
msgstr "Podešavanja mobilne širokopojasne veze"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:602 js/ui/status/network.js:1328
#: js/ui/status/network.js:602 js/ui/status/network.js:1336
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s uređaj isključen"
@ -1592,97 +1596,97 @@ msgstr "%s isključeno"
msgid "Connect to Internet"
msgstr "Poveži se na Internet"
#: js/ui/status/network.js:836
#: js/ui/status/network.js:844
msgid "Airplane Mode is On"
msgstr "Avionski režim rada je uključen"
#: js/ui/status/network.js:837
#: js/ui/status/network.js:845
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Bežična veza je isključena kada je uključen avionski režim rada."
#: js/ui/status/network.js:838
#: js/ui/status/network.js:846
msgid "Turn Off Airplane Mode"
msgstr "Isključi avionski režim rada"
#: js/ui/status/network.js:847
#: js/ui/status/network.js:855
msgid "Wi-Fi is Off"
msgstr "Bežična veza je isključena"
#: js/ui/status/network.js:848
#: js/ui/status/network.js:856
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Bežična veza treba biti uključena da biste se povezali na mrežu."
#: js/ui/status/network.js:849
#: js/ui/status/network.js:857
msgid "Turn On Wi-Fi"
msgstr "Uključi bežičnu vezu"
#: js/ui/status/network.js:874
#: js/ui/status/network.js:882
msgid "Wi-Fi Networks"
msgstr "Bežične mreže"
#: js/ui/status/network.js:876
#: js/ui/status/network.js:884
msgid "Select a network"
msgstr "Izaberite mrežu"
#: js/ui/status/network.js:906
#: js/ui/status/network.js:914
msgid "No Networks"
msgstr "Nema mreža"
#: js/ui/status/network.js:927 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:935 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Koristi fizički prekidač za isključivanje"
#: js/ui/status/network.js:1194
#: js/ui/status/network.js:1202
msgid "Select Network"
msgstr "Izaberi mrežu"
#: js/ui/status/network.js:1200
#: js/ui/status/network.js:1208
msgid "Wi-Fi Settings"
msgstr "Podešavanja bežične veze"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1319
#: js/ui/status/network.js:1327
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s hotspot uključen"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1334
#: js/ui/status/network.js:1342
#, javascript-format
msgid "%s Not Connected"
msgstr "%s nepovezano"
#: js/ui/status/network.js:1434
#: js/ui/status/network.js:1446
msgid "connecting…"
msgstr "povezujem se…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1437
#: js/ui/status/network.js:1449
msgid "authentication required"
msgstr "potrebna je prijava"
#: js/ui/status/network.js:1439
#: js/ui/status/network.js:1451
msgid "connection failed"
msgstr "povezivanje nije uspelo"
#: js/ui/status/network.js:1505 js/ui/status/network.js:1600
#: js/ui/status/network.js:1517 js/ui/status/network.js:1612
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Podešavanja mreže"
#: js/ui/status/network.js:1507
#: js/ui/status/network.js:1519
msgid "VPN Settings"
msgstr "VPN podešavanja"
#: js/ui/status/network.js:1526
#: js/ui/status/network.js:1538
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1536
#: js/ui/status/network.js:1548
msgid "VPN Off"
msgstr "Isključi VPN"
#: js/ui/status/network.js:1631
#: js/ui/status/network.js:1643
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
@ -1691,7 +1695,7 @@ msgstr[1] "%s žičane veze"
msgstr[2] "%s žičanih veza"
msgstr[3] "%s žičana veza"
#: js/ui/status/network.js:1635
#: js/ui/status/network.js:1647
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
@ -1700,7 +1704,7 @@ msgstr[1] "%s bežične veze"
msgstr[2] "%s bežičnih veza"
msgstr[3] "%s bežična veza"
#: js/ui/status/network.js:1639
#: js/ui/status/network.js:1651
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
@ -1709,11 +1713,11 @@ msgstr[1] "%s modemske veze"
msgstr[2] "%s modemskih veza"
msgstr[3] "%s modemska veza"
#: js/ui/status/network.js:1786
#: js/ui/status/network.js:1798
msgid "Connection failed"
msgstr "Povezivanje nije uspelo"
#: js/ui/status/network.js:1787
#: js/ui/status/network.js:1799
msgid "Activation of network connection failed"
msgstr "Aktiviranje mrežne veze nije uspelo"
@ -1811,11 +1815,11 @@ msgstr "Prijavite se kao drugi korisnik"
msgid "Unlock Window"
msgstr "Otključaj prozor"
#: js/ui/viewSelector.js:182
#: js/ui/viewSelector.js:183
msgid "Applications"
msgstr "Programi"
#: js/ui/viewSelector.js:186
#: js/ui/viewSelector.js:187
msgid "Search"
msgstr "Traži"
@ -1824,22 +1828,22 @@ msgstr "Traži"
msgid "“%s” is ready"
msgstr "„%s“ je spreman"
#: js/ui/windowManager.js:83
#: js/ui/windowManager.js:84
msgid "Do you want to keep these display settings?"
msgstr "Da li želite da zadržite ova podešavanja ekrana?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:102
#: js/ui/windowManager.js:103
msgid "Revert Settings"
msgstr "Vrati podešavanja"
#: js/ui/windowManager.js:105
#: js/ui/windowManager.js:106
msgid "Keep Changes"
msgstr "Zadrži izmene"
#: js/ui/windowManager.js:123
#: js/ui/windowManager.js:124
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1850,7 +1854,7 @@ msgstr[3] "Izmene podešavanja će biti vraćene za %d sekundu"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:678
#: js/ui/windowManager.js:679
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -1887,35 +1891,35 @@ msgstr "Uvek na vrhu"
msgid "Always on Visible Workspace"
msgstr "Uvek na prikazanom radnom prostoru"
#: js/ui/windowMenu.js:105
#: js/ui/windowMenu.js:103
msgid "Move to Workspace Left"
msgstr "Premesti na levi radni prostor"
#: js/ui/windowMenu.js:110
#: js/ui/windowMenu.js:108
msgid "Move to Workspace Right"
msgstr "Premesti na desni radni prostor"
#: js/ui/windowMenu.js:115
#: js/ui/windowMenu.js:113
msgid "Move to Workspace Up"
msgstr "Premesti na radni prostor gore"
#: js/ui/windowMenu.js:120
#: js/ui/windowMenu.js:118
msgid "Move to Workspace Down"
msgstr "Premesti na radni prostor dole"
#: js/ui/windowMenu.js:136
#: js/ui/windowMenu.js:134
msgid "Move to Monitor Up"
msgstr "Premesti na gornji radni prostor"
#: js/ui/windowMenu.js:142
#: js/ui/windowMenu.js:140
msgid "Move to Monitor Down"
msgstr "Premesti na donji radni prostor"
#: js/ui/windowMenu.js:148
#: js/ui/windowMenu.js:146
msgid "Move to Monitor Left"
msgstr "Premesti ekran ulevo"
#: js/ui/windowMenu.js:154
#: js/ui/windowMenu.js:152
msgid "Move to Monitor Right"
msgstr "Premesti ekran udesno"
@ -1954,19 +1958,19 @@ msgstr[3] "%u ulaz"
msgid "System Sounds"
msgstr "Sistemski zvuci"
#: src/main.c:381
#: src/main.c:372
msgid "Print version"
msgstr "Ispisuje izdanje"
#: src/main.c:387
#: src/main.c:378
msgid "Mode used by GDM for login screen"
msgstr "Koji režim koristi GDM za ekran prijavljivanja"
#: src/main.c:393
#: src/main.c:384
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Koristi naročit režim, npr. „gdm“ za ekran prijavljivanja"
#: src/main.c:399
#: src/main.c:390
msgid "List possible modes"
msgstr "Ispisuje moguće režime"

397
po/tr.po
View File

@ -9,22 +9,23 @@
# Gökhan Gurbetoğlu <ggurbet@gmail.com>, 2014.
# Muhammet Kara <muhammetk@gmail.com>, 2011, 2012, 2013, 2014, 2015, 2016.
# Emin Tufan Çetin <etcetin@gmail.com>, 2017.
# Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-02-27 19:03+0000\n"
"PO-Revision-Date: 2017-02-28 10:06+0300\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"POT-Creation-Date: 2017-05-11 09:41+0000\n"
"PO-Revision-Date: 2017-05-16 03:31+0300\n"
"Last-Translator: Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>\n"
"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.8.9\n"
"X-Generator: Gtranslator 2.91.7\n"
"X-Project-Style: gnome\n"
#: data/50-gnome-shell-system.xml:6
@ -52,7 +53,7 @@ msgid "Open the application menu"
msgstr "Uygulama menüsünü aç"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:149
#: js/extensionPrefs/main.js:152
msgid "Shell Extensions"
msgstr "Kabuk Uzantıları"
@ -339,7 +340,7 @@ msgstr "Ağ Girişi"
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:117
#: js/extensionPrefs/main.js:120
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "%s için tercihler iletişim penceresi yüklenirken hata oluştu:"
@ -347,7 +348,7 @@ msgstr "%s için tercihler iletişim penceresi yüklenirken hata oluştu:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:939
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:947
msgid "Cancel"
msgstr "İptal"
@ -395,7 +396,7 @@ msgstr "Kullanıcı Adı: "
msgid "Login Window"
msgstr "Oturum Açma Penceresi"
#: js/gdm/util.js:341
#: js/gdm/util.js:342
msgid "Authentication error"
msgstr "Kimlik doğrulama hatası"
@ -404,40 +405,85 @@ msgstr "Kimlik doğrulama hatası"
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: js/gdm/util.js:473
#: js/gdm/util.js:474
msgid "(or swipe finger)"
msgstr "(ya da parmak izi okutun)"
#: js/misc/util.js:121
#: js/misc/util.js:122
msgid "Command not found"
msgstr "Komut bulunamadı"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: js/misc/util.js:154
#: js/misc/util.js:155
msgid "Could not parse command:"
msgstr "Komut işlenemedi:"
#: js/misc/util.js:162
#: js/misc/util.js:163
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "“%s” çalıştırılması başarısız:"
#. Translators: Time in 24h format
#: js/misc/util.js:180
msgid "Just now"
msgstr "Şimdi"
#: js/misc/util.js:182
#, javascript-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d dakika önce"
#: js/misc/util.js:185
#, javascript-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d saat önce"
#: js/misc/util.js:188
#| msgid "Yesterday, %H%M"
msgid "Yesterday"
msgstr "Dün"
#: js/misc/util.js:190
#, javascript-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d gün önce"
#: js/misc/util.js:193
#, javascript-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d hafta önce"
#: js/misc/util.js:196
#, javascript-format
msgid "%d month ago"
msgid_plural "%d months ago"
msgstr[0] "%d ay önce"
#: js/misc/util.js:198
#, javascript-format
msgid "%d year ago"
msgid_plural "%d years ago"
msgstr[0] "%d yıl önce"
#. Translators: Time in 24h format
#: js/misc/util.js:229
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30"
#: js/misc/util.js:199
#: js/misc/util.js:235
#, no-c-format
msgid "Yesterday, %H%M"
msgstr "Dün, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30"
#: js/misc/util.js:205
#: js/misc/util.js:241
#, no-c-format
msgid "%A, %H%M"
msgstr "%A, %H%M"
@ -445,7 +491,7 @@ msgstr "%A, %H%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30"
#: js/misc/util.js:211
#: js/misc/util.js:247
#, no-c-format
msgid "%B %d, %H%M"
msgstr "%d %B, %H%M"
@ -453,26 +499,26 @@ msgstr "%d %B, %H%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30"
#: js/misc/util.js:217
#: js/misc/util.js:253
#, no-c-format
msgid "%B %d %Y, %H%M"
msgstr "%d %B %Y, %H%M"
#. Translators: Time in 12h format
#: js/misc/util.js:222
#: js/misc/util.js:258
msgid "%l%M %p"
msgstr "%l%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm"
#: js/misc/util.js:228
#: js/misc/util.js:264
#, no-c-format
msgid "Yesterday, %l%M %p"
msgstr "Dün, %l%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm"
#: js/misc/util.js:234
#: js/misc/util.js:270
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@ -480,7 +526,7 @@ msgstr "%A, %l%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm"
#: js/misc/util.js:240
#: js/misc/util.js:276
#, no-c-format
msgid "%B %d, %l%M %p"
msgstr "%d %B, %l%M %p"
@ -488,17 +534,17 @@ msgstr "%d %B, %l%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"
#: js/misc/util.js:246
#: js/misc/util.js:282
#, no-c-format
msgid "%B %d %Y, %l%M %p"
msgstr "%d %B %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:67
#: js/portalHelper/main.js:66
msgid "Hotspot Login"
msgstr "Erişim Noktası Girişi"
#: js/portalHelper/main.js:113
#: js/portalHelper/main.js:112
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
@ -509,11 +555,11 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:62 js/ui/status/location.js:427
#: js/ui/accessDialog.js:62 js/ui/status/location.js:405
msgid "Deny Access"
msgstr "Erişimi Reddet"
#: js/ui/accessDialog.js:63 js/ui/status/location.js:430
#: js/ui/accessDialog.js:63 js/ui/status/location.js:408
msgid "Grant Access"
msgstr "Erişime İzin Ver"
@ -664,37 +710,33 @@ msgstr "%V. Hafta"
#. 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:721
#: js/ui/calendar.js:729
msgctxt "event list time"
msgid "All Day"
msgstr "Tüm Gün"
#: js/ui/calendar.js:836
msgid "Events"
msgstr "Olaylar"
#: js/ui/calendar.js:845
#: js/ui/calendar.js:862
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d %B"
#: js/ui/calendar.js:849
#: js/ui/calendar.js:866
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d %B, %Y"
#: js/ui/calendar.js:931
msgid "Notifications"
msgstr "Bildirimler"
#: js/ui/calendar.js:1082
#: js/ui/calendar.js:1086
msgid "No Notifications"
msgstr "Bildirim Yok"
#: js/ui/calendar.js:1085
#: js/ui/calendar.js:1089
msgid "No Events"
msgstr "Olay Yok"
#: js/ui/calendar.js:1117
msgid "Clear All"
msgstr "Tümünü Temizle"
#: js/ui/components/automountManager.js:91
msgid "External drive connected"
msgstr "Harici sürücü bağlandı"
@ -717,7 +759,7 @@ msgid "Type again:"
msgstr "Terkar yazın:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:366 js/ui/status/network.js:942
#: js/ui/status/network.js:366 js/ui/status/network.js:950
msgid "Connect"
msgstr "Bağlan"
@ -792,7 +834,7 @@ msgstr "Mobil geniş bant ağ parolası"
msgid "A password is required to connect to “%s”."
msgstr "“%s”e bağlanmak için parola gerekli."
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1747
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1759
msgid "Network Manager"
msgstr "Ağ Yöneticisi"
@ -818,12 +860,12 @@ msgstr "Üzgünüm ama işe yaramadı. Lütfen yeniden deneyin."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:765
#: js/ui/components/telepathyClient.js:799
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s, şimdi %s olarak biliniyor"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:179
msgid "Windows"
msgstr "Pencereler"
@ -840,7 +882,7 @@ msgstr "Konsol"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: js/ui/dateMenu.js:73
#: js/ui/dateMenu.js:75
msgid "%B %e %Y"
msgstr "%e %B %Y"
@ -848,18 +890,71 @@ msgstr "%e %B %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:80
#: js/ui/dateMenu.js:82
msgid "%A %B %e %Y"
msgstr "%e %B %Y %A"
#: js/ui/dateMenu.js:142
#: js/ui/dateMenu.js:144
msgid "Add world clocks…"
msgstr "Dünya saatlerini ekle…"
#: js/ui/dateMenu.js:143
#: js/ui/dateMenu.js:145
msgid "World Clocks"
msgstr "Dünya Saatleri"
#: js/ui/dateMenu.js:224
msgid "Weather"
msgstr "Hava Durumu"
#. Translators: %s is a weather condition like "Clear sky"; see
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:281
#, javascript-format
msgid "%s all day."
msgstr "Gün boyu %s."
#. Translators: %s is a weather condition like "Clear sky"; see
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:287
#, javascript-format
msgid "%s, then %s later."
msgstr "%s, daha sonra %s."
#. Translators: %s is a weather condition like "Clear sky"; see
#. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions.
#: js/ui/dateMenu.js:293
#, javascript-format
msgid "%s, then %s, followed by %s later."
msgstr "%s, daha sonra %s, ardından %s."
#: js/ui/dateMenu.js:300
msgid "Select a location…"
msgstr "Bir konum seç…"
#: js/ui/dateMenu.js:303
msgid "Loading…"
msgstr "Yükleniyor…"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:309
#, javascript-format
msgid "Feels like %s."
msgstr "Hissedilen %s."
#: js/ui/dateMenu.js:312
msgid "Go online for weather information"
msgstr "Hava durumu bilgisi için çevrim içi olun"
#: js/ui/dateMenu.js:314
msgid "Weather information is currently unavailable"
msgstr "Hava durumu bilgisi şu anda kullanılabilir değil\t"
#: js/ui/endSessionDialog.js:64
#, javascript-format
msgctxt "title"
@ -1024,74 +1119,66 @@ msgstr "Tepsiyi gizle"
msgid "Status Icons"
msgstr "Durum Simgeleri"
#: js/ui/lookingGlass.js:643
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
msgstr "Herhangi bir uzantı kurulu değil"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:697
#: js/ui/lookingGlass.js:696
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s, herhangi bir hata vermedi."
#: js/ui/lookingGlass.js:703
#: js/ui/lookingGlass.js:702
msgid "Hide Errors"
msgstr "Hataları Gizle"
#: js/ui/lookingGlass.js:707 js/ui/lookingGlass.js:767
#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766
msgid "Show Errors"
msgstr "Hataları Göster"
#: js/ui/lookingGlass.js:716
#: js/ui/lookingGlass.js:715
msgid "Enabled"
msgstr "Etkin"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:719 src/gvc/gvc-mixer-control.c:1866
#: js/ui/lookingGlass.js:718 src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Devre dışı"
#: js/ui/lookingGlass.js:721
#: js/ui/lookingGlass.js:720
msgid "Error"
msgstr "Hata"
#: js/ui/lookingGlass.js:723
#: js/ui/lookingGlass.js:722
msgid "Out of date"
msgstr "Güncel değil"
#: js/ui/lookingGlass.js:725
#: js/ui/lookingGlass.js:724
msgid "Downloading"
msgstr "İndiriliyor"
#: js/ui/lookingGlass.js:749
#: js/ui/lookingGlass.js:748
msgid "View Source"
msgstr "Kaynağı Görüntüle"
#: js/ui/lookingGlass.js:758
#: js/ui/lookingGlass.js:757
msgid "Web Page"
msgstr "Web Sayfası"
#: js/ui/messageList.js:543
msgid "Clear section"
msgstr "Bölümü temizle"
#: js/ui/messageTray.js:1486
#: js/ui/messageTray.js:1493
msgid "System Information"
msgstr "Sistem Bilgisi"
#: js/ui/mpris.js:194
#: js/ui/mpris.js:211
msgid "Unknown artist"
msgstr "Bilinmeyen sanatçı"
#: js/ui/mpris.js:195
#: js/ui/mpris.js:212
msgid "Unknown title"
msgstr "Bilinmeyen başlık"
#: js/ui/mpris.js:217
msgid "Media"
msgstr "Ortam"
#: js/ui/overview.js:84
msgid "Undo"
msgstr "Geri Al"
@ -1110,47 +1197,47 @@ msgstr "Genel Görünüm"
msgid "Type to search…"
msgstr "Aramak için buraya yazın..."
#: js/ui/padOsd.js:37
#: js/ui/padOsd.js:103
msgid "New shortcut…"
msgstr "Yeni kısayol…"
#: js/ui/padOsd.js:86
#: js/ui/padOsd.js:152
msgid "Application defined"
msgstr "Uygulama tanımlı"
#: js/ui/padOsd.js:87
#: js/ui/padOsd.js:153
msgid "Show on-screen help"
msgstr "Ekranda yardımı göster"
#: js/ui/padOsd.js:88
#: js/ui/padOsd.js:154
msgid "Switch monitor"
msgstr "Monitör değiştir"
#: js/ui/padOsd.js:89
#: js/ui/padOsd.js:155
msgid "Assign keystroke"
msgstr "Tuş vuruşu ata"
#: js/ui/padOsd.js:143
#: js/ui/padOsd.js:209
msgid "Done"
msgstr "Bitti"
#: js/ui/padOsd.js:597
#: js/ui/padOsd.js:698
msgid "Edit…"
msgstr "Düzenle…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
#: js/ui/padOsd.js:738 js/ui/padOsd.js:800
msgid "None"
msgstr "Yok"
#: js/ui/padOsd.js:648
#: js/ui/padOsd.js:783
msgid "Press a button to configure"
msgstr "Yapılandırmak için bir düğmeye basın"
#: js/ui/padOsd.js:649
#: js/ui/padOsd.js:784
msgid "Press Esc to exit"
msgstr "Çıkmak için Esc'ye basın"
#: js/ui/padOsd.js:652
#: js/ui/padOsd.js:787
msgid "Press any key to exit"
msgstr "Çıkmak için herhangi bir tuşa basın"
@ -1186,7 +1273,7 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command"
msgstr "Komut Gir"
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:162
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160
msgid "Close"
msgstr "Kapat"
@ -1200,27 +1287,27 @@ msgstr "Yeniden başlatılıyor..."
#. Translators: This is a time format for a date in
#. long format
#: js/ui/screenShield.js:85
#: js/ui/screenShield.js:88
msgid "%A, %B %d"
msgstr "%d %B %A"
#: js/ui/screenShield.js:144
#: js/ui/screenShield.js:147
#, javascript-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d yeni ileti"
#: js/ui/screenShield.js:146
#: js/ui/screenShield.js:149
#, javascript-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d yeni bildirim"
#: js/ui/screenShield.js:449 js/ui/status/system.js:409
#: js/ui/screenShield.js:452 js/ui/status/system.js:409
msgid "Lock"
msgstr "Kilitle"
#: js/ui/screenShield.js:707
#: js/ui/screenShield.js:715
msgid "GNOME needs to lock the screen"
msgstr "GNOME'un ekranı kilitlemesi gerekiyor"
@ -1231,19 +1318,19 @@ msgstr "GNOME'un ekranı kilitlemesi gerekiyor"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1308
msgid "Unable to lock"
msgstr "Kilitlenemedi"
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309
msgid "Lock was blocked by an application"
msgstr "Kilitleme bir uygulama tarafından engellendi"
#: js/ui/search.js:617
#: js/ui/search.js:621
msgid "Searching…"
msgstr "Aranıyor…"
#: js/ui/search.js:619
#: js/ui/search.js:623
msgid "No results."
msgstr "Sonuç yok."
@ -1338,13 +1425,13 @@ msgstr "Kapalı"
msgid "On"
msgstr "Açık"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1302
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1310
msgid "Turn On"
msgstr "Aç"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:367 js/ui/status/network.js:1302
#: js/ui/status/network.js:1417 js/ui/status/nightLight.js:47
#: js/ui/status/network.js:367 js/ui/status/network.js:1310
#: js/ui/status/network.js:1429 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Kapat"
@ -1357,37 +1444,37 @@ msgstr "Parlaklık"
msgid "Show Keyboard Layout"
msgstr "Klavye Düzenini Göster"
#: js/ui/status/location.js:107 js/ui/status/location.js:215
#: js/ui/status/location.js:88 js/ui/status/location.js:196
msgid "Location Enabled"
msgstr "Konum Etkinleştirildi"
#: js/ui/status/location.js:108 js/ui/status/location.js:216
#: js/ui/status/location.js:89 js/ui/status/location.js:197
msgid "Disable"
msgstr "Devre Dışı Bırak"
#: js/ui/status/location.js:109
#: js/ui/status/location.js:90
msgid "Privacy Settings"
msgstr "Gizlilik Ayarları"
#: js/ui/status/location.js:214
#: js/ui/status/location.js:195
msgid "Location In Use"
msgstr "Konum Kullanımda"
#: js/ui/status/location.js:218
#: js/ui/status/location.js:199
msgid "Location Disabled"
msgstr "Konum Devre Dışı"
#: js/ui/status/location.js:219
#: js/ui/status/location.js:200
msgid "Enable"
msgstr "Etkinleştir"
#. Translators: %s is an application name
#: js/ui/status/location.js:436
#: js/ui/status/location.js:414
#, javascript-format
msgid "Give %s access to your location?"
msgstr "%s uygulaması konumunuza erişebilsin mi?"
#: js/ui/status/location.js:438
#: js/ui/status/location.js:416
msgid "Location access can be changed at any time from the privacy settings."
msgstr "Konum erişimi, gizlilik ayarlarından her zaman değiştirilebilir."
@ -1396,7 +1483,7 @@ msgid "<unknown>"
msgstr "<bilinmeyen>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465 js/ui/status/network.js:1331
#: js/ui/status/network.js:465 js/ui/status/network.js:1339
#, javascript-format
msgid "%s Off"
msgstr "%s Kapalı"
@ -1422,7 +1509,7 @@ msgid "%s Disconnecting"
msgstr "%s Bağlantısı Kesiliyor"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:483 js/ui/status/network.js:1323
#: js/ui/status/network.js:483 js/ui/status/network.js:1331
#, javascript-format
msgid "%s Connecting"
msgstr "%s Bağlanıyor"
@ -1462,7 +1549,7 @@ msgid "Mobile Broadband Settings"
msgstr "Mobil Geniş Bant Ayarları"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:602 js/ui/status/network.js:1328
#: js/ui/status/network.js:602 js/ui/status/network.js:1336
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s Donanımı Devre Dışı"
@ -1478,119 +1565,119 @@ msgstr "%s Devre Dışı"
msgid "Connect to Internet"
msgstr "İnternet'e Bağlan"
#: js/ui/status/network.js:836
#: js/ui/status/network.js:844
msgid "Airplane Mode is On"
msgstr "Uçak Kipi Açık"
#: js/ui/status/network.js:837
#: js/ui/status/network.js:845
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Uçak kipi açıldığında kablosuz ağ devre dışı kalır."
#: js/ui/status/network.js:838
#: js/ui/status/network.js:846
msgid "Turn Off Airplane Mode"
msgstr "Uçak Kipini Kapat"
#: js/ui/status/network.js:847
#: js/ui/status/network.js:855
msgid "Wi-Fi is Off"
msgstr "Kablosuz Ağ Kapalı"
#: js/ui/status/network.js:848
#: js/ui/status/network.js:856
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Bir ağa bağlanmak için kablosuz ağın açık olması gerekir."
#: js/ui/status/network.js:849
#: js/ui/status/network.js:857
msgid "Turn On Wi-Fi"
msgstr "Kablosuz Ağı Aç"
#: js/ui/status/network.js:874
#: js/ui/status/network.js:882
msgid "Wi-Fi Networks"
msgstr "Kablosuz Ağlar"
#: js/ui/status/network.js:876
#: js/ui/status/network.js:884
msgid "Select a network"
msgstr "Bir ağ seçin"
#: js/ui/status/network.js:906
#: js/ui/status/network.js:914
msgid "No Networks"
msgstr "Ağ Yok"
#: js/ui/status/network.js:927 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:935 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Kapatmak için donanım anahtarını kullanın."
#: js/ui/status/network.js:1194
#: js/ui/status/network.js:1202
msgid "Select Network"
msgstr "Ağ Seç"
#: js/ui/status/network.js:1200
#: js/ui/status/network.js:1208
msgid "Wi-Fi Settings"
msgstr "Kablosuz Ağ Ayarları"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1319
#: js/ui/status/network.js:1327
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s Erişim Noktası Etkin"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1334
#: js/ui/status/network.js:1342
#, javascript-format
msgid "%s Not Connected"
msgstr "%s Bağlı Değil"
#: js/ui/status/network.js:1434
#: js/ui/status/network.js:1446
msgid "connecting…"
msgstr "bağlanıyor…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1437
#: js/ui/status/network.js:1449
msgid "authentication required"
msgstr "kimlik doğrulaması gerekli"
#: js/ui/status/network.js:1439
#: js/ui/status/network.js:1451
msgid "connection failed"
msgstr "bağlantı başarısız"
#: js/ui/status/network.js:1505 js/ui/status/network.js:1600
#: js/ui/status/network.js:1517 js/ui/status/network.js:1612
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Ağ Ayarları"
#: js/ui/status/network.js:1507
#: js/ui/status/network.js:1519
msgid "VPN Settings"
msgstr "VPN Ayarları"
#: js/ui/status/network.js:1526
#: js/ui/status/network.js:1538
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1536
#: js/ui/status/network.js:1548
msgid "VPN Off"
msgstr "VPN Kapalı"
#: js/ui/status/network.js:1631
#: js/ui/status/network.js:1643
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s Kablolu Bağlantı"
#: js/ui/status/network.js:1635
#: js/ui/status/network.js:1647
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Kablosuz Ağ Bağlantısı"
#: js/ui/status/network.js:1639
#: js/ui/status/network.js:1651
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s Modem Bağlantısı"
#: js/ui/status/network.js:1786
#: js/ui/status/network.js:1798
msgid "Connection failed"
msgstr "Bağlantı başarısız oldu"
#: js/ui/status/network.js:1787
#: js/ui/status/network.js:1799
msgid "Activation of network connection failed"
msgstr "Ağ bağlantısının etkinleştirilmesi başarısız oldu"
@ -1688,11 +1775,11 @@ msgstr "Başka kullanıcı olarak oturum aç"
msgid "Unlock Window"
msgstr "Kilit Açma Penceresi"
#: js/ui/viewSelector.js:182
#: js/ui/viewSelector.js:183
msgid "Applications"
msgstr "Uygulamalar"
#: js/ui/viewSelector.js:186
#: js/ui/viewSelector.js:187
msgid "Search"
msgstr "Ara"
@ -1701,22 +1788,22 @@ msgstr "Ara"
msgid "“%s” is ready"
msgstr "“%s” hazır"
#: js/ui/windowManager.js:83
#: js/ui/windowManager.js:84
msgid "Do you want to keep these display settings?"
msgstr "Bu görüntü ayarlarını saklamak istiyor musunuz?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:102
#: js/ui/windowManager.js:103
msgid "Revert Settings"
msgstr "Ayarları Eski Haline Getir"
#: js/ui/windowManager.js:105
#: js/ui/windowManager.js:106
msgid "Keep Changes"
msgstr "Değişiklikleri Sakla"
#: js/ui/windowManager.js:123
#: js/ui/windowManager.js:124
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1724,7 +1811,7 @@ msgstr[0] "Ayarlardaki değişiklikler %d saniye içinde eski haline döndürül
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:678
#: js/ui/windowManager.js:679
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -1761,35 +1848,35 @@ msgstr "Her Zaman Üstte"
msgid "Always on Visible Workspace"
msgstr "Her Zaman Görünür Çalışma Alanında"
#: js/ui/windowMenu.js:105
#: js/ui/windowMenu.js:103
msgid "Move to Workspace Left"
msgstr "Soldaki Çalışma Alanına Taşı"
#: js/ui/windowMenu.js:110
#: js/ui/windowMenu.js:108
msgid "Move to Workspace Right"
msgstr "Sağdaki Çalışma Alanına Taşı"
#: js/ui/windowMenu.js:115
#: js/ui/windowMenu.js:113
msgid "Move to Workspace Up"
msgstr "Üstteki Çalışma Alanına Taşı"
#: js/ui/windowMenu.js:120
#: js/ui/windowMenu.js:118
msgid "Move to Workspace Down"
msgstr "Alttaki Çalışma Alanına Taşı"
#: js/ui/windowMenu.js:136
#: js/ui/windowMenu.js:134
msgid "Move to Monitor Up"
msgstr "Üstteki Monitöre Taşı"
#: js/ui/windowMenu.js:142
#: js/ui/windowMenu.js:140
msgid "Move to Monitor Down"
msgstr "Alttaki Monitöre Taşı"
#: js/ui/windowMenu.js:148
#: js/ui/windowMenu.js:146
msgid "Move to Monitor Left"
msgstr "Soldaki Monitöre Taşı"
#: js/ui/windowMenu.js:154
#: js/ui/windowMenu.js:152
msgid "Move to Monitor Right"
msgstr "Sağdaki Monitöre Taşı"
@ -1822,19 +1909,19 @@ msgstr[0] "%u Girdi"
msgid "System Sounds"
msgstr "Sistem Sesleri"
#: src/main.c:381
#: src/main.c:372
msgid "Print version"
msgstr "Sürümü yazdır"
#: src/main.c:387
#: src/main.c:378
msgid "Mode used by GDM for login screen"
msgstr "Oturum açma ekranında GDM tarafından kullanılan kip"
#: src/main.c:393
#: src/main.c:384
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Oturum açma ekranı için -“gdm” gibi- özel bir kip kullan"
#: src/main.c:399
#: src/main.c:390
msgid "List possible modes"
msgstr "Mevcut kipleri listele"
@ -1860,6 +1947,18 @@ msgstr "Parola boş bırakılamaz"
msgid "Authentication dialog was dismissed by the user"
msgstr "Kimlik doğrulama penceresi kullanıcı tarafından kapatıldı"
#~ msgid "Events"
#~ msgstr "Olaylar"
#~ msgid "Notifications"
#~ msgstr "Bildirimler"
#~ msgid "Clear section"
#~ msgstr "Bölümü temizle"
#~ msgid "Media"
#~ msgstr "Ortam"
#~ msgid "GNOME Shell Extension Preferences"
#~ msgstr "GNOME Kabuğu Eklenti Tercihleri"

View File

@ -42,8 +42,7 @@ generated_script_substitutions = \
-e "s|@pkgdatadir[@]|$(pkgdatadir)|g" \
-e "s|@PYTHON[@]|$(PYTHON)|g" \
-e "s|@VERSION[@]|$(VERSION)|g" \
-e "s|@sysconfdir[@]|$(sysconfdir)|g" \
-e "s|@GJS_CONSOLE[@]|$(GJS_CONSOLE)|g"
-e "s|@sysconfdir[@]|$(sysconfdir)|g"
gnome-shell-extension-tool: gnome-shell-extension-tool.in Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
@ -79,7 +78,6 @@ gnome_shell_cflags = \
privlibdir = $(pkglibdir)
privlib_LTLIBRARIES = libgnome-shell-menu.la libgnome-shell.la
noinst_LTLIBRARIES += libgnome-shell-base.la
shell_built_sources = \
org-gtk-application.h \
@ -128,13 +126,22 @@ libgnome_shell_menu_la_SOURCES = \
gtkmenutracker.h \
$(NULL)
libgnome_shell_base_la_SOURCES = \
libgnome_shell_sources = \
$(shell_public_headers_h) \
$(shell_private_sources) \
gnome-shell-plugin.c \
shell-app.c \
shell-app-private.h \
shell-app-system.c \
shell-app-system-private.h \
shell-app-usage.c \
shell-embedded-window-private.h \
shell-embedded-window.c \
shell-generic-container.c \
shell-global.c \
shell-global-private.h \
shell-glsl-quad.c \
shell-gtk-embed.c \
shell-invert-lightness-effect.c \
shell-keyring-prompt.h \
shell-keyring-prompt.c \
@ -144,36 +151,24 @@ libgnome_shell_base_la_SOURCES = \
shell-perf-log.c \
shell-polkit-authentication-agent.h \
shell-polkit-authentication-agent.c \
shell-screenshot.c \
shell-secure-text-buffer.c \
shell-secure-text-buffer.h \
shell-stack.c \
$(NULL)
if HAVE_NETWORKMANAGER
libgnome_shell_base_la_SOURCES += shell-network-agent.c
endif
libgnome_shell_sources = \
$(shell_public_headers_h) \
shell-app-private.h \
shell-app-system-private.h \
shell-global-private.h \
shell-window-tracker-private.h \
shell-wm-private.h \
gnome-shell-plugin.c \
shell-app.c \
shell-app-system.c \
shell-app-usage.c \
shell-global.c \
shell-gtk-embed.c \
shell-screenshot.c \
shell-tray-icon.c \
shell-tray-manager.c \
shell-util.c \
shell-window-tracker.c \
shell-window-tracker-private.h \
shell-wm.c \
shell-wm-private.h \
$(NULL)
if HAVE_NETWORKMANAGER
libgnome_shell_sources += shell-network-agent.c
endif
libgnome_shell_built_sources = \
$(shell_built_sources) \
$(top_builddir)/js/js-resources.c \
@ -188,7 +183,7 @@ shell_no_gir_sources = \
org-gtk-application.c
libgnome_shell_la_gir_sources = \
$(filter-out %-private.h $(shell_private_sources) $(shell_no_gir_sources), $(shell_public_headers_h) $(libgnome_shell_base_la_SOURCES) $(libgnome_shell_sources) $(libgnome_shell_built_sources))
$(filter-out %-private.h $(shell_private_sources) $(shell_no_gir_sources), $(shell_public_headers_h) $(libgnome_shell_sources) $(libgnome_shell_built_sources))
gnome_shell_SOURCES = main.c
gnome_shell_CPPFLAGS = \
@ -306,11 +301,8 @@ libgnome_shell_menu_la_LDFLAGS = $(libgnome_shell_ldflags)
libgnome_shell_menu_la_LIBADD = $(GNOME_SHELL_LIBS)
libgnome_shell_menu_la_CPPFLAGS = $(GNOME_SHELL_CFLAGS)
libgnome_shell_base_la_LIBADD = $(libgnome_shell_libadd)
libgnome_shell_base_la_CPPFLAGS = $(gnome_shell_cflags)
libgnome_shell_la_LDFLAGS = $(libgnome_shell_ldflags)
libgnome_shell_la_LIBADD = $(GNOME_SHELL_LIBS) $(MUTTER_LIBS) libgnome-shell-base.la
libgnome_shell_la_LIBADD = $(GNOME_SHELL_LIBS) $(MUTTER_LIBS) $(libgnome_shell_libadd)
libgnome_shell_la_CPPFLAGS = $(MUTTER_CFLAGS) $(gnome_shell_cflags)
ShellMenu-0.1.gir: libgnome-shell-menu.la

View File

@ -573,6 +573,7 @@ app_load_events (App *app)
gchar *since_iso8601;
gchar *until_iso8601;
gchar *query;
const char *tz_location;
/* out with the old */
g_hash_table_remove_all (app->appointments);
@ -594,15 +595,17 @@ app_load_events (App *app)
since_iso8601 = isodate_from_time_t (app->since);
until_iso8601 = isodate_from_time_t (app->until);
tz_location = icaltimezone_get_location (app->zone);
print_debug ("Loading events since %s until %s",
since_iso8601,
until_iso8601);
query = g_strdup_printf ("occur-in-time-range? (make-time \"%s\") "
"(make-time \"%s\")",
"(make-time \"%s\") \"%s\"",
since_iso8601,
until_iso8601);
until_iso8601,
tz_location);
clients = calendar_sources_get_appointment_clients (app->sources);
for (l = clients; l != NULL; l = l->next)

View File

@ -68,7 +68,6 @@ 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);

View File

@ -22,10 +22,12 @@
#include <gdk/gdkx.h>
#include <gio/gio.h>
#include <girepository.h>
#include <meta/meta-backend.h>
#include <meta/display.h>
#include <meta/util.h>
#include <meta/meta-shaped-texture.h>
#include <meta/meta-cursor-tracker.h>
#include <meta/meta-settings.h>
#ifdef HAVE_SYSTEMD
#include <systemd/sd-journal.h>
@ -833,35 +835,37 @@ global_stage_after_swap (gpointer data)
return TRUE;
}
static void
update_scale_factor (GtkSettings *settings,
GParamSpec *pspec,
gpointer data)
update_scaling_factor (ShellGlobal *global,
MetaSettings *settings)
{
ShellGlobal *global = SHELL_GLOBAL (data);
ClutterStage *stage = CLUTTER_STAGE (global->stage);
StThemeContext *context = st_theme_context_get_for_stage (stage);
GValue value = G_VALUE_INIT;
int scaling_factor;
g_value_init (&value, G_TYPE_INT);
if (gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value))
scaling_factor = meta_settings_get_ui_scaling_factor (settings);
g_object_set (context, "scale-factor", scaling_factor, NULL);
if (meta_is_wayland_compositor ())
{
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
if (meta_is_wayland_compositor ())
{
int xft_dpi;
g_object_get (settings, "gtk-xft-dpi", &xft_dpi, NULL);
GtkSettings *gtk_settings = gtk_settings_get_default ();
int xft_dpi;
g_object_set (clutter_settings_get_default (), "font-dpi", xft_dpi, NULL);
}
g_object_get (gtk_settings, "gtk-xft-dpi", &xft_dpi, NULL);
g_object_set (clutter_settings_get_default (), "font-dpi", xft_dpi, NULL);
}
/* Make sure clutter and gdk scaling stays disabled */
g_object_set (clutter_settings_get_default (), "window-scaling-factor", 1, NULL);
gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);
}
static void
ui_scaling_factor_changed (MetaSettings *settings,
ShellGlobal *global)
{
update_scaling_factor (global, settings);
}
/* This is an IBus workaround. The flow of events with IBus is that every time
* it gets gets a key event, it:
*
@ -965,6 +969,9 @@ void
_shell_global_set_plugin (ShellGlobal *global,
MetaPlugin *plugin)
{
MetaBackend *backend;
MetaSettings *settings;
g_return_if_fail (SHELL_IS_GLOBAL (global));
g_return_if_fail (global->plugin == NULL);
@ -1045,18 +1052,16 @@ _shell_global_set_plugin (ShellGlobal *global,
g_signal_connect (global->meta_display, "notify::focus-window",
G_CALLBACK (focus_window_changed), global);
/* gdk-window-scaling-factor is not exported to gtk-settings
* because it is handled inside gdk, so we use gtk-xft-dpi instead
* which also changes when the scale factor changes.
*/
g_signal_connect (gtk_settings_get_default (), "notify::gtk-xft-dpi",
G_CALLBACK (update_scale_factor), global);
backend = meta_get_backend ();
settings = meta_backend_get_settings (backend);
g_signal_connect (settings, "ui-scaling-factor-changed",
G_CALLBACK (ui_scaling_factor_changed), global);
gdk_event_handler_set (gnome_shell_gdk_event_handler, global, NULL);
global->focus_manager = st_focus_manager_get_for_stage (global->stage);
update_scale_factor (gtk_settings_get_default (), NULL, global);
update_scaling_factor (global, settings);
}
GjsContext *

View File

@ -23,8 +23,6 @@
#include <string.h>
#include <dbus/dbus-glib.h>
/* For use of unstable features in libsecret, until they stabilize */
#define SECRET_API_SUBJECT_TO_CHANGE
#include <libsecret/secret.h>
#include "shell-network-agent.h"

View File

@ -240,6 +240,21 @@ shell_util_translate_time_string (const char *str)
return res;
}
/**
* shell_util_regex_escape:
* @str: a UTF-8 string to escape
*
* A wrapper around g_regex_escape_string() that takes its argument as
* \0-terminated string rather than a byte-array the confuses gjs.
*
* Returns: @str with all regex-special characters escaped
*/
char *
shell_util_regex_escape (const char *str)
{
return g_regex_escape_string (str, -1);
}
/**
* shell_write_string_to_stream:
* @stream: a #GOutputStream

View File

@ -24,6 +24,8 @@ char *shell_util_format_date (const char *format,
gint64 time_ms);
const char *shell_util_translate_time_string (const char *str);
char *shell_util_regex_escape (const char *str);
gboolean shell_write_string_to_stream (GOutputStream *stream,
const char *str,
GError **error);

View File

@ -34,7 +34,7 @@
* <para>focus: the widget has focus</para>
* </listitem>
* <listitem>
* <para>indeterminate: the widget is showing the hint text</para>
* <para>indeterminate: the widget is showing the hint text or actor</para>
* </listitem>
* </itemizedlist>
*/
@ -56,6 +56,7 @@
#include "st-im-text.h"
#include "st-icon.h"
#include "st-label.h"
#include "st-widget.h"
#include "st-texture-cache.h"
#include "st-clipboard.h"
@ -72,7 +73,10 @@ enum
PROP_0,
PROP_CLUTTER_TEXT,
PROP_PRIMARY_ICON,
PROP_SECONDARY_ICON,
PROP_HINT_TEXT,
PROP_HINT_ACTOR,
PROP_TEXT,
PROP_INPUT_PURPOSE,
PROP_INPUT_HINTS,
@ -94,16 +98,20 @@ typedef struct _StEntryPrivate StEntryPrivate;
struct _StEntryPrivate
{
ClutterActor *entry;
gchar *hint;
ClutterActor *primary_icon;
ClutterActor *secondary_icon;
ClutterActor *hint_actor;
gfloat spacing;
gboolean hint_visible;
gboolean capslock_warning_shown;
gboolean has_ibeam;
CoglHandle text_shadow_material;
gfloat shadow_width;
gfloat shadow_height;
};
static guint entry_signals[LAST_SIGNAL] = { 0, };
@ -122,10 +130,22 @@ st_entry_set_property (GObject *gobject,
switch (prop_id)
{
case PROP_PRIMARY_ICON:
st_entry_set_primary_icon (entry, g_value_get_object (value));
break;
case PROP_SECONDARY_ICON:
st_entry_set_secondary_icon (entry, g_value_get_object (value));
break;
case PROP_HINT_TEXT:
st_entry_set_hint_text (entry, g_value_get_string (value));
break;
case PROP_HINT_ACTOR:
st_entry_set_hint_actor (entry, g_value_get_object (value));
break;
case PROP_TEXT:
st_entry_set_text (entry, g_value_get_string (value));
break;
@ -158,8 +178,20 @@ st_entry_get_property (GObject *gobject,
g_value_set_object (value, priv->entry);
break;
case PROP_PRIMARY_ICON:
g_value_set_object (value, priv->primary_icon);
break;
case PROP_SECONDARY_ICON:
g_value_set_object (value, priv->secondary_icon);
break;
case PROP_HINT_TEXT:
g_value_set_string (value, priv->hint);
g_value_set_string (value, st_entry_get_hint_text (ST_ENTRY (gobject)));
break;
case PROP_HINT_ACTOR:
g_value_set_object (value, priv->hint_actor);
break;
case PROP_TEXT:
@ -230,10 +262,10 @@ st_entry_dispose (GObject *object)
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
GdkKeymap *keymap;
if (priv->entry)
if (priv->text_shadow_material != COGL_INVALID_HANDLE)
{
clutter_actor_destroy (priv->entry);
priv->entry = NULL;
cogl_handle_unref (priv->text_shadow_material);
priv->text_shadow_material = COGL_INVALID_HANDLE;
}
keymap = gdk_keymap_get_for_display (gdk_display_get_default ());
@ -243,14 +275,21 @@ st_entry_dispose (GObject *object)
}
static void
st_entry_finalize (GObject *object)
st_entry_update_hint_visibility (StEntry *self)
{
StEntryPrivate *priv = ST_ENTRY_PRIV (object);
StEntryPrivate *priv = ST_ENTRY_PRIV (self);
gboolean hint_visible =
priv->hint_actor != NULL &&
strcmp (clutter_text_get_text (CLUTTER_TEXT (priv->entry)), "") == 0 &&
!HAS_FOCUS (priv->entry);
g_free (priv->hint);
priv->hint = NULL;
if (priv->hint_actor)
g_object_set (priv->hint_actor, "visible", hint_visible, NULL);
G_OBJECT_CLASS (st_entry_parent_class)->finalize (object);
if (hint_visible)
st_widget_add_style_pseudo_class (ST_WIDGET (self), "indeterminate");
else
st_widget_remove_style_pseudo_class (ST_WIDGET (self), "indeterminate");
}
static void
@ -263,6 +302,12 @@ st_entry_style_changed (StWidget *self)
gchar *font_string, *font_name;
gdouble size;
if (priv->text_shadow_material != COGL_INVALID_HANDLE)
{
cogl_handle_unref (priv->text_shadow_material);
priv->text_shadow_material = COGL_INVALID_HANDLE;
}
theme_node = st_widget_get_theme_node (self);
st_theme_node_get_foreground_color (theme_node, &color);
@ -324,7 +369,7 @@ st_entry_get_preferred_width (ClutterActor *actor,
{
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
gfloat icon_w;
gfloat hint_w, icon_w;
st_theme_node_adjust_for_height (theme_node, &for_height);
@ -332,6 +377,17 @@ st_entry_get_preferred_width (ClutterActor *actor,
min_width_p,
natural_width_p);
if (priv->hint_actor)
{
clutter_actor_get_preferred_width (priv->hint_actor, -1, NULL, &hint_w);
if (min_width_p && hint_w > *min_width_p)
*min_width_p = hint_w;
if (natural_width_p && hint_w > *natural_width_p)
*natural_width_p = hint_w;
}
if (priv->primary_icon)
{
clutter_actor_get_preferred_width (priv->primary_icon, -1, NULL, &icon_w);
@ -366,7 +422,7 @@ st_entry_get_preferred_height (ClutterActor *actor,
{
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
gfloat icon_h;
gfloat hint_h, icon_h;
st_theme_node_adjust_for_width (theme_node, &for_width);
@ -374,6 +430,17 @@ st_entry_get_preferred_height (ClutterActor *actor,
min_height_p,
natural_height_p);
if (priv->hint_actor)
{
clutter_actor_get_preferred_height (priv->hint_actor, -1, NULL, &hint_h);
if (min_height_p && hint_h > *min_height_p)
*min_height_p = hint_h;
if (natural_height_p && hint_h > *natural_height_p)
*natural_height_p = hint_h;
}
if (priv->primary_icon)
{
clutter_actor_get_preferred_height (priv->primary_icon,
@ -408,12 +475,16 @@ st_entry_allocate (ClutterActor *actor,
{
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterActorBox content_box, child_box, icon_box;
ClutterActorBox content_box, child_box, icon_box, hint_box;
gfloat icon_w, icon_h;
gfloat hint_w, hint_h;
gfloat entry_h, min_h, pref_h, avail_h;
ClutterActor *left_icon, *right_icon;
gboolean is_rtl;
if (clutter_actor_get_text_direction (actor) == CLUTTER_TEXT_DIRECTION_RTL)
is_rtl = clutter_actor_get_text_direction (actor) == CLUTTER_TEXT_DIRECTION_RTL;
if (is_rtl)
{
right_icon = priv->primary_icon;
left_icon = priv->secondary_icon;
@ -447,7 +518,7 @@ st_entry_allocate (ClutterActor *actor,
clutter_actor_allocate (left_icon, &icon_box, flags);
/* reduce the size for the entry */
child_box.x1 += icon_w + priv->spacing;
child_box.x1 = MIN (child_box.x2, child_box.x1 + icon_w + priv->spacing);
}
if (right_icon)
@ -464,7 +535,26 @@ st_entry_allocate (ClutterActor *actor,
clutter_actor_allocate (right_icon, &icon_box, flags);
/* reduce the size for the entry */
child_box.x2 -= icon_w + priv->spacing;
child_box.x2 = MAX (child_box.x1, child_box.x2 - icon_w - priv->spacing);
}
if (priv->hint_actor)
{
/* now allocate the hint actor */
hint_box = child_box;
clutter_actor_get_preferred_width (priv->hint_actor, -1, NULL, &hint_w);
clutter_actor_get_preferred_height (priv->hint_actor, -1, NULL, &hint_h);
if (is_rtl)
hint_box.x1 = hint_box.x2 - hint_w;
else
hint_box.x2 = hint_box.x1 + hint_w;
hint_box.y1 = ceil (content_box.y1 + avail_h / 2 - hint_h / 2);
hint_box.y2 = hint_box.y1 + hint_h;
clutter_actor_allocate (priv->hint_actor, &hint_box, flags);
}
clutter_actor_get_preferred_height (priv->entry, child_box.x2 - child_box.x1,
@ -483,23 +573,15 @@ clutter_text_focus_in_cb (ClutterText *text,
ClutterActor *actor)
{
StEntry *entry = ST_ENTRY (actor);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
GdkKeymap *keymap;
/* remove the hint if visible */
if (priv->hint && priv->hint_visible)
{
priv->hint_visible = FALSE;
clutter_text_set_text (text, "");
}
st_entry_update_hint_visibility (entry);
keymap = gdk_keymap_get_for_display (gdk_display_get_default ());
keymap_state_changed (keymap, entry);
g_signal_connect (keymap, "state-changed",
G_CALLBACK (keymap_state_changed), entry);
st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "indeterminate");
st_widget_add_style_pseudo_class (ST_WIDGET (actor), "focus");
clutter_text_set_cursor_visible (text, TRUE);
}
@ -509,19 +591,12 @@ clutter_text_focus_out_cb (ClutterText *text,
ClutterActor *actor)
{
StEntry *entry = ST_ENTRY (actor);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
GdkKeymap *keymap;
st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "focus");
/* add a hint if the entry is empty */
if (priv->hint && !strcmp (clutter_text_get_text (text), ""))
{
priv->hint_visible = TRUE;
st_entry_update_hint_visibility (entry);
clutter_text_set_text (text, priv->hint);
st_widget_add_style_pseudo_class (ST_WIDGET (actor), "indeterminate");
}
clutter_text_set_cursor_visible (text, FALSE);
remove_capslock_feedback (entry);
@ -541,6 +616,22 @@ clutter_text_password_char_cb (GObject *object,
remove_capslock_feedback (entry);
}
static void
clutter_text_changed_cb (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
StEntry *entry = ST_ENTRY (user_data);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
/* Since the text changed, force a regen of the shadow texture */
if (priv->text_shadow_material != COGL_INVALID_HANDLE)
{
cogl_handle_unref (priv->text_shadow_material);
priv->text_shadow_material = COGL_INVALID_HANDLE;
}
}
static void
st_entry_clipboard_callback (StClipboard *clipboard,
const gchar *text,
@ -707,8 +798,8 @@ st_entry_key_focus_in (ClutterActor *actor)
clutter_actor_grab_key_focus (priv->entry);
}
static StEntryCursorFunc cursor_func;
static gpointer cursor_func_data;
static StEntryCursorFunc cursor_func = NULL;
static gpointer cursor_func_data = NULL;
/**
* st_entry_set_cursor_func: (skip)
@ -728,7 +819,8 @@ static void
st_entry_set_cursor (StEntry *entry,
gboolean use_ibeam)
{
cursor_func (entry, use_ibeam, cursor_func_data);
if (cursor_func)
cursor_func (entry, use_ibeam, cursor_func_data);
((StEntryPrivate *)ST_ENTRY_PRIV (entry))->has_ibeam = use_ibeam;
}
@ -755,6 +847,56 @@ st_entry_leave_event (ClutterActor *actor,
return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->leave_event (actor, event);
}
static void
st_entry_paint (ClutterActor *actor)
{
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
StShadow *shadow_spec = st_theme_node_get_text_shadow (theme_node);
ClutterActorClass *parent_class;
st_widget_paint_background (ST_WIDGET (actor));
if (shadow_spec)
{
ClutterActorBox allocation;
float width, height;
clutter_actor_get_allocation_box (priv->entry, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height);
if (priv->text_shadow_material == COGL_INVALID_HANDLE ||
width != priv->shadow_width ||
height != priv->shadow_height)
{
CoglHandle material;
if (priv->text_shadow_material != COGL_INVALID_HANDLE)
cogl_handle_unref (priv->text_shadow_material);
material = _st_create_shadow_pipeline_from_actor (shadow_spec,
priv->entry);
priv->shadow_width = width;
priv->shadow_height = height;
priv->text_shadow_material = material;
}
if (priv->text_shadow_material != COGL_INVALID_HANDLE)
_st_paint_shadow_with_opacity (shadow_spec,
priv->text_shadow_material,
&allocation,
clutter_actor_get_paint_opacity (priv->entry));
}
/* Since we paint the background ourselves, chain to the parent class
* of StWidget, to avoid painting it twice.
* This is needed as we still want to paint children.
*/
parent_class = g_type_class_peek_parent (st_entry_parent_class);
parent_class->paint (actor);
}
static void
st_entry_unmap (ClutterActor *actor)
{
@ -775,12 +917,12 @@ st_entry_class_init (StEntryClass *klass)
gobject_class->set_property = st_entry_set_property;
gobject_class->get_property = st_entry_get_property;
gobject_class->finalize = st_entry_finalize;
gobject_class->dispose = st_entry_dispose;
actor_class->get_preferred_width = st_entry_get_preferred_width;
actor_class->get_preferred_height = st_entry_get_preferred_height;
actor_class->allocate = st_entry_allocate;
actor_class->paint = st_entry_paint;
actor_class->unmap = st_entry_unmap;
actor_class->key_press_event = st_entry_key_press_event;
@ -800,6 +942,20 @@ st_entry_class_init (StEntryClass *klass)
G_PARAM_READABLE);
g_object_class_install_property (gobject_class, PROP_CLUTTER_TEXT, pspec);
pspec = g_param_spec_object ("primary-icon",
"Primary Icon",
"Primary Icon actor",
CLUTTER_TYPE_ACTOR,
G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_PRIMARY_ICON, pspec);
pspec = g_param_spec_object ("secondary-icon",
"Secondary Icon",
"Secondary Icon actor",
CLUTTER_TYPE_ACTOR,
G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_SECONDARY_ICON, pspec);
pspec = g_param_spec_string ("hint-text",
"Hint Text",
"Text to display when the entry is not focused "
@ -807,6 +963,14 @@ st_entry_class_init (StEntryClass *klass)
NULL, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_HINT_TEXT, pspec);
pspec = g_param_spec_object ("hint-actor",
"Hint Actor",
"An actor to display when the entry is not focused "
"and the text property is empty",
CLUTTER_TYPE_ACTOR,
G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_HINT_ACTOR, pspec);
pspec = g_param_spec_string ("text",
"Text",
"Text of the entry",
@ -889,8 +1053,15 @@ st_entry_init (StEntry *entry)
g_signal_connect (priv->entry, "button-press-event",
G_CALLBACK (clutter_text_button_press_event), entry);
g_signal_connect (priv->entry, "notify::text",
G_CALLBACK (clutter_text_changed_cb), entry);
priv->spacing = 6.0f;
priv->text_shadow_material = COGL_INVALID_HANDLE;
priv->shadow_width = -1.;
priv->shadow_height = -1.;
clutter_actor_add_child (CLUTTER_ACTOR (entry), priv->entry);
clutter_actor_set_reactive ((ClutterActor *) entry, TRUE);
@ -935,7 +1106,7 @@ st_entry_get_text (StEntry *entry)
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
priv = st_entry_get_instance_private (entry);
if (priv->hint_visible)
if (clutter_actor_is_visible (priv->hint_actor))
return "";
else
return clutter_text_get_text (CLUTTER_TEXT (priv->entry));
@ -958,24 +1129,10 @@ st_entry_set_text (StEntry *entry,
priv = st_entry_get_instance_private (entry);
/* set a hint if we are blanking the entry */
if (priv->hint
&& text && !strcmp ("", text)
&& !HAS_FOCUS (priv->entry))
{
text = priv->hint;
priv->hint_visible = TRUE;
st_widget_add_style_pseudo_class (ST_WIDGET (entry), "indeterminate");
}
else
{
st_widget_remove_style_pseudo_class (ST_WIDGET (entry), "indeterminate");
priv->hint_visible = FALSE;
}
clutter_text_set_text (CLUTTER_TEXT (priv->entry), text);
st_entry_update_hint_visibility (entry);
g_object_notify (G_OBJECT (entry), "text");
}
@ -1009,24 +1166,12 @@ void
st_entry_set_hint_text (StEntry *entry,
const gchar *text)
{
StEntryPrivate *priv;
StWidget *label;
g_return_if_fail (ST_IS_ENTRY (entry));
priv = st_entry_get_instance_private (entry);
g_free (priv->hint);
priv->hint = g_strdup (text);
if (!strcmp (clutter_text_get_text (CLUTTER_TEXT (priv->entry)), "")
&& !HAS_FOCUS (priv->entry))
{
priv->hint_visible = TRUE;
clutter_text_set_text (CLUTTER_TEXT (priv->entry), priv->hint);
st_widget_add_style_pseudo_class (ST_WIDGET (entry), "indeterminate");
}
label = st_label_new (text);
st_entry_set_hint_actor (ST_ENTRY (entry), CLUTTER_ACTOR (label));
}
/**
@ -1041,9 +1186,16 @@ st_entry_set_hint_text (StEntry *entry,
const gchar *
st_entry_get_hint_text (StEntry *entry)
{
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
return ((StEntryPrivate *)ST_ENTRY_PRIV (entry))->hint;
priv = ST_ENTRY_PRIV (entry);
if (priv->hint_actor != NULL && ST_IS_LABEL (priv->hint_actor))
return st_label_get_text (ST_LABEL (priv->hint_actor));
return NULL;
}
/**
@ -1142,7 +1294,7 @@ _st_entry_icon_press_cb (ClutterActor *actor,
ClutterButtonEvent *event,
StEntry *entry)
{
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
if (actor == priv->primary_icon)
g_signal_emit (entry, entry_signals[PRIMARY_ICON_CLICKED], 0);
@ -1199,6 +1351,23 @@ st_entry_set_primary_icon (StEntry *entry,
_st_entry_set_icon (entry, &priv->primary_icon, icon);
}
/**
* st_entry_get_primary_icon:
* @entry: a #StEntry
*
* Returns: (transfer none): a #ClutterActor
*/
ClutterActor *
st_entry_get_primary_icon (StEntry *entry)
{
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
priv = ST_ENTRY_PRIV (entry);
return priv->primary_icon;
}
/**
* st_entry_set_secondary_icon:
* @entry: a #StEntry
@ -1219,6 +1388,74 @@ st_entry_set_secondary_icon (StEntry *entry,
_st_entry_set_icon (entry, &priv->secondary_icon, icon);
}
/**
* st_entry_get_secondary_icon:
* @entry: a #StEntry
*
* Returns: (transfer none): a #ClutterActor
*/
ClutterActor *
st_entry_get_secondary_icon (StEntry *entry)
{
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
priv = ST_ENTRY_PRIV (entry);
return priv->secondary_icon;
}
/**
* st_entry_set_hint_actor:
* @entry: a #StEntry
* @hint_actor: (allow-none): a #ClutterActor
*
* Set the hint actor of the entry to @hint_actor
*/
void
st_entry_set_hint_actor (StEntry *entry,
ClutterActor *hint_actor)
{
StEntryPrivate *priv;
g_return_if_fail (ST_IS_ENTRY (entry));
priv = ST_ENTRY_PRIV (entry);
if (priv->hint_actor != NULL)
{
clutter_actor_remove_child (CLUTTER_ACTOR (entry), priv->hint_actor);
priv->hint_actor = NULL;
}
if (hint_actor != NULL)
{
priv->hint_actor = hint_actor;
clutter_actor_add_child (CLUTTER_ACTOR (entry), priv->hint_actor);
}
st_entry_update_hint_visibility (entry);
clutter_actor_queue_relayout (CLUTTER_ACTOR (entry));
}
/**
* st_entry_get_hint_actor:
* @entry: a #StEntry
*
* Returns: (transfer none): a #ClutterActor
*/
ClutterActor *
st_entry_get_hint_actor (StEntry *entry)
{
StEntryPrivate *priv;
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
priv = ST_ENTRY_PRIV (entry);
return priv->hint_actor;
}
/******************************************************************************/
/*************************** ACCESSIBILITY SUPPORT ****************************/
/******************************************************************************/

View File

@ -57,10 +57,17 @@ void st_entry_set_input_hints (StEntry *entry,
GtkInputHints hints);
GtkInputHints st_entry_get_input_hints (StEntry *entry);
void st_entry_set_primary_icon (StEntry *entry,
ClutterActor *icon);
void st_entry_set_secondary_icon (StEntry *entry,
ClutterActor *icon);
void st_entry_set_primary_icon (StEntry *entry,
ClutterActor *icon);
ClutterActor * st_entry_get_primary_icon (StEntry *entry);
void st_entry_set_secondary_icon (StEntry *entry,
ClutterActor *icon);
ClutterActor * st_entry_get_secondary_icon (StEntry *entry);
void st_entry_set_hint_actor (StEntry *entry,
ClutterActor *hint_actor);
ClutterActor * st_entry_get_hint_actor (StEntry *entry);
typedef void (*StEntryCursorFunc) (StEntry *entry, gboolean use_ibeam, gpointer data);
void st_entry_set_cursor_func (StEntryCursorFunc func,

View File

@ -202,7 +202,7 @@ st_im_text_get_paint_volume (ClutterActor *self,
return clutter_paint_volume_set_from_allocation (volume, self);
}
static GdkWindow *event_window;
static GdkWindow *event_window = NULL;
void
st_im_text_set_event_window (GdkWindow *window)
@ -217,9 +217,11 @@ st_im_text_realize (ClutterActor *actor)
{
StIMTextPrivate *priv = ST_IM_TEXT (actor)->priv;
g_assert (event_window != NULL);
priv->window = g_object_ref (event_window);
gtk_im_context_set_client_window (priv->im_context, priv->window);
if (event_window != NULL)
{
priv->window = g_object_ref (event_window);
gtk_im_context_set_client_window (priv->im_context, priv->window);
}
}
static void
@ -230,8 +232,12 @@ st_im_text_unrealize (ClutterActor *actor)
reset_im_context (self);
gtk_im_context_set_client_window (priv->im_context, NULL);
g_object_unref (priv->window);
priv->window = NULL;
if (priv->window != NULL)
{
g_object_unref (priv->window);
priv->window = NULL;
}
}
static gboolean
@ -277,10 +283,12 @@ static GdkEventKey *
key_event_to_gdk (ClutterKeyEvent *event_clutter)
{
GdkEventKey *event_gdk;
if (event_window == NULL)
return NULL;
event_gdk = (GdkEventKey *)gdk_event_new ((event_clutter->type == CLUTTER_KEY_PRESS) ?
GDK_KEY_PRESS : GDK_KEY_RELEASE);
g_assert (event_window != NULL);
event_gdk->window = g_object_ref (event_window);
event_gdk->send_event = FALSE;
event_gdk->time = event_clutter->time;
@ -348,13 +356,14 @@ st_im_text_captured_event (ClutterActor *actor,
{
GdkEventKey *event_gdk = key_event_to_gdk ((ClutterKeyEvent *)event);
if (gtk_im_context_filter_keypress (priv->im_context, event_gdk))
if (event_gdk && gtk_im_context_filter_keypress (priv->im_context, event_gdk))
{
priv->need_im_reset = TRUE;
result = TRUE;
}
gdk_event_free ((GdkEvent *)event_gdk);
if (event_gdk)
gdk_event_free ((GdkEvent *)event_gdk);
}
old_position = clutter_text_get_cursor_position (clutter_text);

View File

@ -180,12 +180,6 @@ st_label_dispose (GObject *object)
{
StLabelPrivate *priv = ST_LABEL (object)->priv;
if (priv->label)
{
clutter_actor_destroy (priv->label);
priv->label = NULL;
}
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
G_OBJECT_CLASS (st_label_parent_class)->dispose (object);

View File

@ -180,7 +180,7 @@ st_shadow_get_box (StShadow *shadow,
}
/**
* SECTION:st-shadow-helper:
* SECTION: st-shadow-helper
*
* An helper for implementing a drop shadow on a actor.
* The actor is expected to recreate the helper whenever its contents

View File

@ -448,6 +448,8 @@ load_pixbuf_thread (GTask *result,
g_task_return_error (result, error);
else if (pixbuf)
g_task_return_pointer (result, g_object_ref (pixbuf), g_object_unref);
g_clear_object (&pixbuf);
}
static GdkPixbuf *
@ -1038,18 +1040,22 @@ on_sliced_image_loaded (GObject *source_object,
GObject *cache = source_object;
AsyncImageData *data = (AsyncImageData *)user_data;
GTask *task = G_TASK (res);
GList *list;
GList *list, *pixbufs;
if (g_task_had_error (task))
return;
for (list = g_task_propagate_pointer (task, NULL); list; list = list->next)
pixbufs = g_task_propagate_pointer (task, NULL);
for (list = pixbufs; list; list = list->next)
{
ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data));
clutter_actor_hide (actor);
clutter_actor_add_child (data->actor, actor);
}
g_list_free_full (pixbufs, g_object_unref);
if (data->load_callback != NULL)
data->load_callback (cache, data->load_callback_data);
}
@ -1057,12 +1063,7 @@ on_sliced_image_loaded (GObject *source_object,
static void
free_glist_unref_gobjects (gpointer p)
{
GList *list = p;
GList *iter;
for (iter = list; iter; iter = iter->next)
g_object_unref (iter->data);
g_list_free (list);
g_list_free_full (p, g_object_unref);
}
static void

View File

@ -3198,11 +3198,13 @@ parse_shadow_property (StThemeNode *node,
gdouble *yoffset,
gdouble *blur,
gdouble *spread,
gboolean *inset)
gboolean *inset,
gboolean *is_none)
{
GetFromTermResult result;
CRTerm *term;
int n_offsets = 0;
*is_none = FALSE;
/* default values */
color->red = 0x0; color->green = 0x0; color->blue = 0x0; color->alpha = 0xff;
@ -3224,8 +3226,10 @@ parse_shadow_property (StThemeNode *node,
for (term = decl->value; term; term = term->next)
{
/* if we found "none", we're all set with the default values */
if (term_is_none (term))
if (term_is_none (term)) {
*is_none = TRUE;
return VALUE_FOUND;
}
if (term->type == TERM_NUMBER)
{
@ -3324,7 +3328,8 @@ parse_shadow_property (StThemeNode *node,
* See also st_theme_node_get_shadow(), which provides a simpler API.
*
* Return value: %TRUE if the property was found in the properties for this
* theme node (or in the properties of parent nodes when inheriting.)
* theme node (or in the properties of parent nodes when inheriting.), %FALSE
* if the property was not found, or was explicitly set to 'none'.
*/
gboolean
st_theme_node_lookup_shadow (StThemeNode *node,
@ -3338,6 +3343,7 @@ st_theme_node_lookup_shadow (StThemeNode *node,
gdouble blur = 0.;
gdouble spread = 0.;
gboolean inset = FALSE;
gboolean is_none = FALSE;
int i;
@ -3356,9 +3362,13 @@ st_theme_node_lookup_shadow (StThemeNode *node,
&yoffset,
&blur,
&spread,
&inset);
&inset,
&is_none);
if (result == VALUE_FOUND)
{
if (is_none)
return FALSE;
*shadow = st_shadow_new (&color,
xoffset, yoffset,
blur, spread,

View File

@ -4,10 +4,9 @@ const UI = imports.testcommon.ui;
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const St = imports.gi.St;
const Calendar = imports.ui.calendar;
function test() {
let stage = new Clutter.Stage({ width: 400, height: 400 });
UI.init(stage);
@ -15,15 +14,47 @@ function test() {
let vbox = new St.BoxLayout({ vertical: true,
width: stage.width,
height: stage.height,
style: 'padding: 10px; spacing: 10px; font: 15px sans-serif;' });
style: 'padding: 10px; spacing: 10px; font: 32px sans-serif;' });
stage.add_actor(vbox);
let entry = new St.Entry({ style: 'border: 1px solid black;' });
let entry = new St.Entry({ style: 'border: 1px solid black; text-shadow: 0 2px red;',
text: 'Example text' });
vbox.add(entry,
{ expand: true,
y_fill: false, y_align: St.Align.MIDDLE });
entry.grab_key_focus();
let entryTextHint = new St.Entry({ style: 'border: 1px solid black; text-shadow: 0 2px red;',
hint_text: 'Hint text' });
vbox.add(entryTextHint,
{ expand: true,
y_fill: false, y_align: St.Align.MIDDLE });
let hintActor = new St.Label({ text: 'Hint actor' });
let entryHintActor = new St.Entry({ style: 'border: 1px solid black; text-shadow: 0 2px red;',
hint_actor: hintActor });
vbox.add(entryHintActor,
{ expand: true,
y_fill: false, y_align: St.Align.MIDDLE });
let hintActor2 = new St.Label({ text: 'Hint both (actor)' });
let entryHintBoth = new St.Entry({ style: 'border: 1px solid black; text-shadow: 0 2px red;',
hint_actor: hintActor2 });
let idx = 0;
Mainloop.timeout_add_seconds(1, function() {
idx++;
if (idx % 2 == 0)
entryHintBoth.hint_actor = hintActor2;
else
entryHintBoth.hint_text = 'Hint both (text)';
return true;
});
vbox.add(entryHintBoth,
{ expand: true,
y_fill: false, y_align: St.Align.MIDDLE });
UI.main(stage);
}
test();

View File

@ -27,11 +27,11 @@ done
builddir=`dirname $0`
builddir=`cd $builddir && pwd`
srcdir=$builddir/@srcdir@
srcdir=@srcdir@
srcdir=`cd $srcdir && pwd`
GI_TYPELIB_PATH="$GI_TYPELIB_PATH${GI_TYPELIB_PATH:+:}@MUTTER_TYPELIB_DIR@:$builddir/../src:$builddir/../src/gvc"
GJS_PATH="$srcdir:$srcdir/../js"
GJS_PATH="$srcdir:$srcdir/../js:$builddir/../js"
GJS_DEBUG_OUTPUT=stderr
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
GNOME_SHELL_TESTSDIR="$srcdir/"

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
// Test cases for Calendar markup parsing
// Test cases for MessageList markup parsing
const JsUnit = imports.jsUnit;
const Pango = imports.gi.Pango;
@ -8,7 +8,7 @@ const Pango = imports.gi.Pango;
const Environment = imports.ui.environment;
Environment.init();
const Calendar = imports.ui.calendar;
const MessageList = imports.ui.messageList;
// Assert that @input, assumed to be markup, gets "fixed" to @output,
// which is valid markup. If @output is null, @input is expected to
@ -16,7 +16,7 @@ const Calendar = imports.ui.calendar;
function assertConverts(input, output) {
if (!output)
output = input;
let fixed = Calendar._fixMarkup(input, true);
let fixed = MessageList._fixMarkup(input, true);
JsUnit.assertEquals(output, fixed);
let parsed = false;
@ -30,7 +30,7 @@ function assertConverts(input, output) {
// Assert that @input, assumed to be plain text, gets escaped to @output,
// which is valid markup.
function assertEscapes(input, output) {
let fixed = Calendar._fixMarkup(input, false);
let fixed = MessageList._fixMarkup(input, false);
JsUnit.assertEquals(output, fixed);
let parsed = false;