Compare commits

...

90 Commits

Author SHA1 Message Date
Mario Sanchez Prada
1b7577298a window-tracker: check WM_CLASS for sandboxed apps before the app's ID
For sandboxed apps, the shell needs to consider the app's ID when
matching its windows against the right .desktop file, but that
check can't be done before having attempted to match using the
WM_CLASS property of the app's window, otherwise apps installing
multiple desktop files (e.g. LibreOffice) will always match every
single window against the same .desktop file, ignoring hints such
as the StartupWMClass key.

This commit moves the call to get_app_from_sandboxed_app_id() after
get_app_from_window_wmclass() and before get_app_from_window_pid(),
so that we only rely on the sandboxed app's ID when no match has
succeed using the WM_CLASS property, but before checking by PID to
prevent wrong groups that could be created when the PID of the app
inside the sandbox matches the one from a process outside of it.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/219
2018-04-20 14:09:28 +01:00
Stas Solovey
c4e0f6df08 Update Russian translation
(cherry picked from commit 0d031dc20f)
2018-04-19 20:33:21 +00:00
verdre
58aafe9520 theme: Improve look of login user-list
* Remove tiny padding of user-list
* Less space between avatar and username
* Apply the 1em padding only to the user-widget, not the timed-login-indicator
2018-04-19 17:26:14 +02:00
verdre
a46df7f8ec theme: Use a padding of 6px on the user-list items according to HIG 2018-04-19 17:26:14 +02:00
verdre
1dd16618d1 loginDialog: Don't display timed login indicator if unused
This fixes the slightly bigger padding underneath the login item compared to the padding above
2018-04-19 17:26:14 +02:00
verdre
a4190f83ac loginDialog: Correct source name for timed login idle timeout
The _blockTimedLoginUntilIdle method sets a timeout to be called after
the user is idle for 5 seconds.  That timeout is erroneously given the
source name "[gnome-shell] this._timedLoginAnimationTime" which looks
like a copy-and-paste mistake.  The original intention was probably to
use a source name of "[gnome-shell] this._timedLoginIdleTimeOutId" which
more closely matches existing convention for source names.

This commit fixes that.
2018-04-19 17:26:14 +02:00
verdre
a8e17f73ec loginDialog: Use more function scope variables inside _startTimedLogin
Using function scope variables increases readability and prevents
unwanted changes from outside while the batch is running.
2018-04-19 17:26:13 +02:00
verdre
86a741c1ee loginDialog: Make sure timed login indicator is shown after idle timeout
If the idle timeout is done, always show the user list to make sure the
timed login indicator is visible.
2018-04-19 17:25:02 +02:00
verdre
5cc6fef689 loginDialog: Restrict grabbing of focus while timed login is running
Make sure the focus isn't grabbed right after user interaction starts a
new timed login. Only grab it after the idle timeout is done and on the
first run instead.
2018-04-19 09:08:45 +02:00
verdre
522a5fe480 loginDialog: Ensure old timed login timeout is removed before starting a new one
Normally, we give the user a 5 second grace period of inactivity before
starting a timed login operation. Unfortunately, that grace period
timeout isn't properly removed if the timed login operation is restarted
during the grace period. That means the timeout handler can
inadvertently get called multiple times leading to the grace period
duration getting subtracted from the total animation time more than
once.

This commit ensures we only ever have one grace period timeout scheduled
at a time.
2018-04-19 09:08:45 +02:00
verdre
b1239b1257 loginDialog: Use GLib instead of Mainloop for timeout
imports.mainloop is deprecated
2018-04-19 09:08:45 +02:00
verdre
58063d9ee1 loginDialog: Move reset of timed login into _startTimedLogin
This way we can make sure that already running timed logins are
always reset when starting a new one.
2018-04-19 09:08:45 +02:00
verdre
d7aba2dece loginDialog: Ensure timed login indicator is hidden on key presses
The timed login feature currently cancels the timed login operation when
a user presses a key but, oddly, only hides the indicator when the user
releases the key. This means that if a user holds down a key that
doesn't key repeat, the timed login indicator will continue to run after
the timed login operation is cancelled.

This commit address the problem by ensuring the timed login indicator is
hidden on any key press event, at the same time the timed login
operation is canceled.
2018-04-19 09:08:45 +02:00
Takao Fujiwara
35fced27df ibusCandidatePopup: Fix candidate-clicked signal 2018-04-18 13:37:53 +09:00
Mario Sanchez Prada
be76b19300 st-entry: Set text-related CSS properties on the internal ClutterText
Call _st_set_text_from_style() when updating the entry's style, so
that CSS style properties such as text-decoration or letter-spacing
are applied over the internal ClutterText instance.
2018-04-18 00:14:05 +00:00
Mario Sanchez Prada
376d696b8b st-private: Add support for letter-spacing in ClutterText based StWidgets
Add support in _st_set_text_from_style(), so that this CSS property can
be used from any StWidget holding an internal ClutterText.
2018-04-18 00:14:05 +00:00
Mario Sanchez Prada
695d61968d st-theme-node: Add new getter st_theme_node_get_letter_spacing
This will be used by ClutterText-backed StWidgets to update their
list of PangoAttributes according to the letter-spacing property.
2018-04-18 00:14:04 +00:00
Didier Roche
d6d09fd3c8 ui: Theme lookup should respect XDG_DATA_DIRS
Modes, extensions and other GNOME Shell assets are searched in appropriate
subdirectories of each directory in XDG_DATA_DIRS, falling back
to global.datadir.
However, this isn't the case for themes, which are currently always expected
in global.datadir, even when referenced by a mode in a different XDG_DATA_DIR.

The fix is to have the theme finding pattern follow the same logic as other
elements.
Fixes #167.
2018-04-16 19:09:14 +02:00
gogo
f1b1501f9b Update Croatian translation 2018-04-16 12:31:09 +00:00
Mario Sanchez Prada
cdbc99e992 popupMenu: Fix wrong call to clutter_actor_add_child()
Specify the horizontal alignment via the x_align property when creating
the StIcon, since this function expects one argument, not two.
2018-04-16 11:40:04 +00:00
Florian Müllner
69afe7785d remoteMenu: Support icons in app-menu
The HIG discourages the use of icons in menus except for "noun" items
(files, bookmarks, ...). While those should be rarely used in the
application menu, it still makes sense to support them in the few
cases where they are used.

https://bugzilla.gnome.org/show_bug.cgi?id=760985
2018-04-14 09:02:20 +00:00
Marco Trevisan (Treviño)
b99e304f1e workspaceThumbnail: initialize porthole based on workArea
https://bugzilla.gnome.org/show_bug.cgi?id=792687
2018-04-13 16:59:51 -05:00
Marco Trevisan (Treviño)
c29bd46e7a workspaceThumbnail: rebuild thumbnails if workareas size changed
https://bugzilla.gnome.org/show_bug.cgi?id=792687
2018-04-13 16:58:28 -05:00
Marco Trevisan (Treviño)
5fcf40b973 workspaceThumbnail: only update _porthole if the overview is visible
Otherwise it happens that porthole is computed again after that the
overlay is hidden (triggered by a layout reallocation) and thus not
regenerated again afterwards.

https://bugzilla.gnome.org/show_bug.cgi?id=792687
2018-04-13 16:53:18 -05:00
Piotr Drąg
a198dfe3d8 thunderbolt: capitalize Thunderbolt in a translatable string 2018-04-13 21:52:32 +02:00
Florian Müllner
5b10d157fe Bump version to 3.28.1
Update NEWS.
2018-04-13 20:18:05 +02:00
Florian Müllner
5cc42b18b0 utils: Simplify URL regex to only support one layer of parentheses
The author of the original URL-matching regex warns[0] that the pattern may
cause certain regex engines to lock up with certain input, namely patterns
that contain parentheses. It turns out SpiderMonkey is affected, but rather
than switching to the author's improved version (that is still crazy), sim-
plify the pattern a bit by removing support for nested parentheses in URLs.
Even a single pair of parentheses is extremely rare, so this is unlikely to
make a noticeable difference (other than not locking up SpiderMonkey of
course) ...

[0] http://daringfireball.net/2010/07/improved_regex_for_matching_urls
2018-04-13 18:15:44 +00:00
Florian Müllner
cb4252e888 polkitAgent: Hide authentication dialogs while locked
Since commit 78a92fb6be we no longer pop up authentication dialogs
on the lock screen, however any dialog that is already open at that
time remains open. This is unexpected, so hide the dialog until
the screen is unlocked again.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/166
2018-04-13 19:35:31 +02:00
Florian Müllner
09d3cdb023 workspace: Don't move focus unconditionally
Since commit 1939e22c22, we move the keyboard focus with the hover
highlight. However while this makes sense when interacting with
the window picker, it interferes with keyboard navigation of other
components like dash or top bar. Address this by only moving the
focus when the previous focus was already inside the window picker
or unset.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/50
2018-04-13 14:13:35 +00:00
Florian Müllner
71515a8a11 networkAgent: Use libnm for plugin loading
After the networking code has been ported to libnm, we can use its
API for loading VPN plugins instead of rolling our own ...

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/39
2018-04-13 14:04:55 +00:00
Florian Müllner
11ca8dd54f worldClock: Handle named timezones
The original UTC support in GWeather piggy-backed on the existing API, but
as "country" or "city" don't make sense in the context of UTC or AoE, the
concept of "named timezones" was introduced. Handle those explicitly to get
back labels for those locations.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/150
2018-04-13 09:15:48 +00:00
Florian Müllner
e00f22ebe6 overview: Use monotonic time to check for consecutive activations
We don't toggle the overview if the request happens too close to the
last activation, to filter out double-clicks or activation by both
the hot corner and a click. However as the check is based on the
real time, the check breaks if the system clock moves backwards and
the last activations appears to be in the future. Fix this by using
monotonic time which is guaranteed to only move forward.

https://bugzilla.gnome.org/show_bug.cgi?id=763886
2018-04-13 09:13:45 +00:00
Stas Solovey
13390543b0 Update Russian translation 2018-04-12 13:58:31 +00:00
Stas Solovey
de95ced92c Update Russian translation 2018-04-12 11:47:00 +00:00
Florian Müllner
f6a08472a0 st: Do not force allocation updates during shadow creation
If an actor is pending a relayout when get_allocation_box() is called,
the method forces an allocation update. In case of StWidget, this might
then result in a style update and a consecutive invalidation of the
shadow spec.

A helper method that invalidates one of its parameters as a side effect
(and by extension its return value as well) is most unexpected, so cur-
rently _st_create_shadow_pipeline_from_actor() poses an easy trap to
callers to run into.

Remove that trap by calling get_size()/get_position() instead, which
don't have the unintended side effect - it is still a good idea to fix
callers who were running into this to not waste resources on creating
shadows that are invalidated before the next paint, but throwing un-
defined behavior at them is harsh ...

https://bugzilla.gnome.org/show_bug.cgi?id=788908
2018-04-11 19:29:25 +00:00
Bastien Nocera
9f7b101437 appFavorites: Add evolution to rename list
Evolution 3.28 changed the desktop filename. Without this patch,
evolution will disappear from the dock.
2018-04-10 14:38:26 +00:00
Florian Müllner
9c0707d4dc build: Run postinstall script where necessary
Package managers usually take care of compiling GSettings schemas and
updating the .desktop database on installation, but when building
manually from source, we should perform the aforementioned actions
ourselves.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/127
2018-04-09 19:19:33 +00:00
Florian Müllner
78a92fb6be polkitAgent: Queue authentication requests while locked
While polkit requests *should* be the result of a user action, that's
not always the case in practice and authentication dialogs can pop up
out of nowhere at any time. That's always annoying, but particularly
bad on the lock screen. If we disabled the polkit component altogether,
the fallback GTK-based agent would kick in, so instead handle the case
explicitly and postpone showing the dialog until the session is unlocked.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/179
2018-04-06 20:08:29 +02:00
Jeremy Bicha
01509cf1a5 appFavorites: Rename gnome-tweaks.desktop 2018-04-05 22:06:15 -04:00
Andy Holmes
61e9f51274 system: Align submenu labels with parent - adjust for deeper hierarchies
Adjust the previous commit which applied the alignment to :first-child
descendants, instead of only immediate children. This fixes alignment
issues for a number of Shell extensions by making it easier to override
with a .popup-menu-item style-subclass.
2018-04-02 14:54:43 -07:00
Guillaume Bernard
201bd9d42e Update French translation 2018-03-27 12:26:10 +00:00
Khaled Hosny
8a78f08f6c Update Arabic translation 2018-03-25 22:22:06 +02:00
Hannie Dumoleyn
a5e54f9712 Update Dutch translation 2018-03-23 09:12:25 +00:00
Florian Müllner
526834e39b modalDialog: Remove some unused code
No need to figure out an x_alignment variable that hasn't been used
since commit 0722c06275 ...
2018-03-21 16:48:56 +00:00
Matej Urbančič
bdde2476d2 Added Slovenian translation 2018-03-20 22:37:08 +01:00
Dz Chen
3171f9debe Update zh_CN translation 2018-03-20 17:03:11 +08:00
Jeremy Bicha
0e2aeac5f9 build: Bump required glib version
Required by 723c49a8

Thanks Marcus Lundblad for identifying this issue.
2018-03-19 16:49:47 -04:00
Nathan Follens
788fb5547c Update Dutch translation 2018-03-18 10:35:18 +00:00
Rafael Fontenelle
c4d2c0ee64 Update Brazilian Portuguese translation 2018-03-16 22:42:50 +00:00
Dušan Kazik
977686a77a Update Slovak translation 2018-03-16 21:34:03 +00:00
Daniel Șerbănescu
44b29f210c Update Romanian translation 2018-03-15 18:37:20 +00:00
Carlos Garnacho
36c7d65ccf inputMethod: Pass all key events through the current IM method
Even though we are using an "xkb" source, it still makes sense to
pass the event through the IBus simple engine, in order to let it
handle compose keys and ctrl+shift+[u|e].

https://gitlab.gnome.org/GNOME/gnome-shell/issues/115

Closes: #115
2018-03-15 16:09:38 +01:00
Stas Solovey
b81d24fdb4 Update Russian translation 2018-03-14 19:59:53 +00:00
Carlos Garnacho
bfdbee8115 shellEntry: Use correct enum for input purpose hints
This was mistakenly left using the GTK+ counterparts. Luckily the enums
are binary compatible, but oops.
2018-03-14 13:30:47 +00:00
Carlos Garnacho
4a17c8f4a9 shell-global: Do not deal with allocated strings as const char
The imagedir and userdatadir variables are not fetched from
constants/environment but created with g_strdup*/g_build*. Acknowledge that
and also free the strings in finalize.
2018-03-14 13:30:47 +00:00
Florian Müllner
d4f67a7d42 Bump version to 3.28.0
Update NEWS.
2018-03-12 12:17:03 +01:00
Balázs Úr
d5769ae409 Update Hungarian translation 2018-03-12 06:02:34 +00:00
Anders Jonsson
f356b61e5a Update Swedish translation 2018-03-11 20:36:26 +00:00
Jordi Mas
398768dcbd Update Catalan translation 2018-03-10 21:30:17 +01:00
Chao-Hsiung Liao
272d5b6e4a Update Chinese (Taiwan) translation 2018-03-10 12:31:16 +00:00
gogo
a479aa2594 Update Croatian translation 2018-03-07 21:47:09 +00:00
A S Alam
f48d620ac5 Update Punjabi translation 2018-03-07 11:57:04 +00:00
Florian Müllner
0684b42f67 Bump version to 3.27.92
Update NEWS.
2018-03-05 23:29:38 +01:00
Christian Kellner
190a31dd5f thunderbolt: honor boltd's AuthMode property
boltd 0.2 gained a property that indicates if it is authorizing
devices or not. If it indeed is not authorizing then we wont
try to enroll new devices because that would otherwise lead to
and error.
2018-03-05 22:03:28 +01:00
Christian Kellner
cccfc7faca thunderbolt: adapt to bolt 0.2 interface changes
All enums are now strings on the bus. Also the Device.Security
property is gnome. Some new properties got added instead.
2018-03-05 22:03:11 +01:00
Florian Müllner
5e9e4f8c73 viewSelector: Don't mark synth event as in capture phase
When we move keyboard focus to the search entry, we replay the key press
that triggered the move to the entry using ClutterActor's event() method.
Since commit 3b293e91e we specify that the event is in the capture phase
to make it work with StIMText, but now that commit 83accce24 removed it,
we have to return to the expected non-capture flag that matches the orig-
inal event to unbreak find-as-you-type functionality.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/72
2018-03-05 19:12:59 +00:00
Florian Müllner
b28e48094b viewSelector: Don't duplicate find-as-you-type in captured-event
Find-as-you type was never automatically handled by StIMText, but
by the existing stage key-press handler. The functionality broke
for a different reason, we will fix it after reverting the recent
captured-event changes.

This reverts commits bc4462cd0c and e4ee944d8d.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/72
2018-03-05 19:12:58 +00:00
Alan Mortensen
01bad21704 Updated Danish translation 2018-03-05 15:55:14 +01:00
Stas Solovey
aab9a20b6a Update Russian translation 2018-03-05 12:46:50 +00:00
Rūdolfs Mazurs
201c5b23f3 Update Latvian translation 2018-03-04 18:09:02 +00:00
Alain Lojewski
b79e11bef8 Update French translation 2018-03-03 10:21:59 +00:00
Florian Müllner
81dfcb85ca messageList: Fix invisible close buttons still working
Since commit c4f2bb5f, close buttons are hidden by making them fully
transparent rather than setting their visibility to false to keep
the overall message layout stable. As a result, the buttons now work
even when invisible, which is clearly unexpected - fix this by updating
the reactive property appropriately.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/66
2018-03-02 19:59:48 +00:00
Florian Müllner
c8e69a2154 menutracker: Fix a small memory leak
https://gitlab.gnome.org/GNOME/gnome-shell/issues/64
2018-03-02 19:43:45 +00:00
Aurimas Černius
3ee50adad9 Updated Lithuanian translation 2018-02-28 23:40:44 +02:00
GNOME Translation Robot
d1386ee8e4 Update Dutch translation 2018-02-26 21:31:44 +00:00
Marek Cernocky
6b994602d5 Updated Czech translation 2018-02-26 18:05:31 +01:00
Marek Cernocky
00039bbb47 Updated Czech translation 2018-02-26 18:00:00 +01:00
GNOME Translation Robot
0195b2f7c0 Update Scottish Gaelic translation
(cherry picked from commit 4d598b3294)
2018-02-26 12:56:36 +00:00
GNOME Translation Robot
adc60f3212 Update Scottish Gaelic translation
(cherry picked from commit e1b9babac5)
2018-02-26 12:50:19 +00:00
Milo Casagrande
579f59816f Update Italian translation 2018-02-26 08:09:42 +00:00
Trần Ngọc Quân
9e0df3c5c6 Updated Vietnamese translation
Signed-off-by: Trần Ngọc Quân <vnwildman@gmail.com>
2018-02-26 07:30:59 +07:00
Balázs Úr
c6b14ef97e Update Hungarian translation 2018-02-25 19:54:54 +00:00
Furkan Ahmet Kara
59e535244f Update Turkish translation 2018-02-25 15:49:46 +00:00
Changwoo Ryu
720b9dd3d2 Update Korean translation 2018-02-25 14:48:41 +00:00
Dušan Kazik
60df5b4381 Update Slovak translation 2018-02-24 17:09:59 +00:00
Cheng-Chia Tseng
94a4dc4576 Update Chinese (Taiwan) translation 2018-02-24 13:18:53 +00:00
Wolfgang Stöggl
dbda223858 Update German translation 2018-02-23 15:06:44 +00:00
Daniel Mustieles
822875d5c3 Update Spanish translation 2018-02-23 07:27:14 +00:00
Daniel Mustieles
b11b28b83b Updated Spanish translation 2018-02-22 10:19:35 +01:00
Jonas Ådahl
ea0770ae22 build: Bump mutter API version
The API number was updated, let's keep up.
2018-02-21 19:05:49 +01:00
57 changed files with 8668 additions and 5749 deletions

38
NEWS
View File

@@ -1,3 +1,41 @@
3.28.1
======
* Fix compose characters in shell entries [Carlos; #115]
* Don't show authentication dialogs on lock screen [Florian; #179, #166]
* Fix handling of UTC timezone in world clock [Florian; #150]
* Fix keyboard navigation in overview when hovering windows [Florian; #50]
* Misc. bug fixes [Florian; #127, #788908, #763886, !39]
Contributors:
Jeremy Bicha, Carlos Garnacho, Andy Holmes, Florian Müllner, Bastien Nocera
Translators:
Stas Solovey [ru], Daniel Șerbănescu [ro], Dušan Kazik [sk],
Rafael Fontenelle [pt_BR], Nathan Follens [nl], Dz Chen [zh_CN],
Matej Urbančič [sl], Hannie Dumoleyn [nl], Khaled Hosny [ar],
Guillaume Bernard [fr]
3.28.0
======
Translators:
A S Alam [pa], gogo [hr], Chao-Hsiung Liao [zh_TW], Jordi Mas [ca],
Anders Jonsson [sv], Balázs Úr [hu]
3.27.92
=======
* Misc. bug fixes [Florian; #64, #66, #72]
Contributors:
Jonas Ådahl, Christian Kellner, Florian Müllner
Translators:
Daniel Mustieles [es], Wolfgang Stöggl [de], Cheng-Chia Tseng [zh_TW],
Dušan Kazik [sk], Changwoo Ryu [ko], Furkan Ahmet Kara [tr], Balázs Úr [hu],
Trần Ngọc Quân [vi], Milo Casagrande [it], GNOME Translation Robot [gd, nl],
Marek Cernocky [cs], Aurimas Černius [lt], Alain Lojewski [fr],
Rūdolfs Mazurs [lv], Stas Solovey [ru], Alan Mortensen [da]
3.27.91
=======
* Fix wrong bluetooth state when disabled by HW airplane mode [Mario; #789110]

View File

@@ -1111,7 +1111,7 @@ StScrollBar {
.aggregate-menu {
min-width: 21em;
.popup-menu-icon { padding: 0 4px; }
.popup-sub-menu .popup-menu-item :first-child {
.popup-sub-menu .popup-menu-item > :first-child {
&:ltr { /* 12px spacing + 2*4px padding */
padding-left: 20px; margin-left: 1.09em; }
&:rtl { /* 12px spacing + 2*4px padding */
@@ -1788,20 +1788,19 @@ StScrollBar {
.login-dialog-user-list-view { -st-vfade-offset: 1em; }
.login-dialog-user-list {
spacing: 12px;
padding: .2em;
width: 23em;
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
&:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
}
.login-dialog-user-list-item {
border-radius: 5px;
padding: .2em;
padding: 6px;
color: darken($osd_fg_color,30%);
&:ltr { padding-right: 1em; }
&:rtl { padding-left: 1em; }
&:ltr .user-widget { padding-right: 1em; }
&:rtl .user-widget { padding-left: 1em; }
.login-dialog-timed-login-indicator {
height: 2px;
margin: 2px 0 0 0;
margin-top: 6px;
background-color: $osd_fg_color;
}
&:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
@@ -1816,8 +1815,8 @@ StScrollBar {
padding-left: 15px;
}
.user-widget-label {
&:ltr { padding-left: 18px; }
&:rtl { padding-right: 18px; }
&:ltr { padding-left: 14px; }
&:rtl { padding-right: 14px; }
}
.login-dialog-prompt-layout {

View File

@@ -25,7 +25,6 @@ const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell;
@@ -86,7 +85,8 @@ var UserListItem = new Lang.Class({
GObject.BindingFlags.SYNC_CREATE);
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
scale_x: 0 });
scale_x: 0,
visible: false });
layout.add(this._timedLoginIndicator);
this.actor.connect('clicked', this._onClicked.bind(this));
@@ -126,6 +126,8 @@ var UserListItem = new Lang.Class({
this.hideTimedLoginIndicator();
this._timedLoginIndicator.visible = true;
let startTime = GLib.get_monotonic_time();
this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33,
@@ -152,6 +154,8 @@ var UserListItem = new Lang.Class({
GLib.source_remove(this._timedLoginTimeoutId);
this._timedLoginTimeoutId = 0;
}
this._timedLoginIndicator.visible = false;
this._timedLoginIndicator.scale_x = 0.;
}
});
@@ -991,59 +995,81 @@ var LoginDialog = new Lang.Class({
return hold;
},
_showTimedLoginAnimation() {
this._timedLoginItem.actor.grab_key_focus();
return this._timedLoginItem.showTimedLoginIndicator(this._timedLoginAnimationTime);
},
_blockTimedLoginUntilIdle() {
// This blocks timed login from starting until a few
// seconds after the user stops interacting with the
// login screen.
//
// We skip this step if the timed login delay is very
// short.
if ((this._timedLoginDelay - _TIMED_LOGIN_IDLE_THRESHOLD) <= 0)
return null;
let hold = new Batch.Hold();
this._timedLoginIdleTimeOutId = Mainloop.timeout_add_seconds(_TIMED_LOGIN_IDLE_THRESHOLD,
this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD,
() => {
this._timedLoginAnimationTime -= _TIMED_LOGIN_IDLE_THRESHOLD;
this._timedLoginIdleTimeOutId = 0;
hold.release();
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime');
GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId');
return hold;
},
_startTimedLogin(userName, delay) {
this._timedLoginItem = null;
this._timedLoginDelay = delay;
this._timedLoginAnimationTime = delay;
let firstRun = true;
// Cancel execution of old batch
if (this._timedLoginBatch) {
this._timedLoginBatch.cancel();
this._timedLoginBatch = null;
firstRun = false;
}
// Reset previous idle-timeout
if (this._timedLoginIdleTimeOutId) {
GLib.source_remove(this._timedLoginIdleTimeOutId);
this._timedLoginIdleTimeOutId = 0;
}
let loginItem = null;
let animationTime;
let tasks = [() => this._waitForItemForUser(userName),
() => {
this._timedLoginItem = this._userList.getItemFromUserName(userName);
loginItem = this._userList.getItemFromUserName(userName);
// If there is an animation running on the item, reset it.
loginItem.hideTimedLoginIndicator();
},
() => {
// If we're just starting out, start on the right
// item.
// If we're just starting out, start on the right item.
if (!this._userManager.is_loaded) {
this._userList.jumpToItem(this._timedLoginItem);
this._userList.jumpToItem(loginItem);
}
},
this._blockTimedLoginUntilIdle,
() => {
this._userList.scrollToItem(this._timedLoginItem);
// This blocks the timed login animation until a few
// seconds after the user stops interacting with the
// login screen.
// We skip this step if the timed login delay is very short.
if (delay > _TIMED_LOGIN_IDLE_THRESHOLD) {
animationTime = delay - _TIMED_LOGIN_IDLE_THRESHOLD;
return this._blockTimedLoginUntilIdle();
} else {
animationTime = delay;
}
},
this._showTimedLoginAnimation,
() => {
// If idle timeout is done, make sure the timed login indicator is shown
if (delay > _TIMED_LOGIN_IDLE_THRESHOLD &&
this._authPrompt.actor.visible)
this._authPrompt.cancel();
if (delay > _TIMED_LOGIN_IDLE_THRESHOLD || firstRun) {
this._userList.scrollToItem(loginItem);
loginItem.actor.grab_key_focus();
}
},
() => loginItem.showTimedLoginIndicator(animationTime),
() => {
this._timedLoginBatch = null;
@@ -1055,37 +1081,17 @@ var LoginDialog = new Lang.Class({
return this._timedLoginBatch.run();
},
_resetTimedLogin() {
if (this._timedLoginBatch) {
this._timedLoginBatch.cancel();
this._timedLoginBatch = null;
}
if (this._timedLoginItem)
this._timedLoginItem.hideTimedLoginIndicator();
let userName = this._timedLoginItem.user.get_user_name();
if (userName)
this._startTimedLogin(userName, this._timedLoginDelay);
},
_onTimedLoginRequested(client, userName, seconds) {
if (this._timedLoginBatch)
return;
this._startTimedLogin(userName, seconds);
// Restart timed login on user interaction
global.stage.connect('captured-event', (actor, event) => {
if (this._timedLoginDelay == undefined)
return Clutter.EVENT_PROPAGATE;
if (event.type() == Clutter.EventType.KEY_PRESS ||
event.type() == Clutter.EventType.BUTTON_PRESS) {
if (this._timedLoginBatch) {
this._timedLoginBatch.cancel();
this._timedLoginBatch = null;
}
} else if (event.type() == Clutter.EventType.KEY_RELEASE ||
event.type() == Clutter.EventType.BUTTON_RELEASE) {
this._resetTimedLogin();
this._startTimedLogin(userName, seconds);
}
return Clutter.EVENT_PROPAGATE;

View File

@@ -188,8 +188,7 @@ var InputMethod = new Lang.Class({
vfunc_filter_key_event(event) {
if (!this._context || !this._enabled)
return false;
if (!this._currentSource ||
this._currentSource.type == Keyboard.INPUT_SOURCE_TYPE_XKB)
if (!this._currentSource)
return false;
let state = event.get_state();

View File

@@ -17,7 +17,7 @@ const Params = imports.misc.params;
var SCROLL_TIME = 0.1;
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
const _balancedParens = '\\([^\\s()<>]+\\)';
const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';

View File

@@ -13,6 +13,7 @@ const RENAMED_DESKTOP_IDS = {
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
'empathy.desktop': 'org.gnome.Empathy.desktop',
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
'evolution.desktop': 'org.gnome.Evolution.desktop',
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
'geary.desktop': 'org.gnome.Geary.desktop',
@@ -34,6 +35,7 @@ const RENAMED_DESKTOP_IDS = {
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
'gnome-software.desktop': 'org.gnome.Software.desktop',
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
'gnomine.desktop': 'gnome-mines.desktop',
'gnotravex.desktop': 'gnome-tetravex.desktop',

View File

@@ -765,57 +765,29 @@ var NetworkAgent = new Lang.Class({
this._vpnCacheBuilt = true;
this._vpnBinaries = { };
try {
let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
let info;
NM.VpnPluginInfo.list_load().forEach(plugin => {
let service = plugin.get_service();
let fileName = plugin.get_auth_dialog();
let supportsHints = plugin.supports_hints();
let externalUIMode = false;
while ((info = fileEnum.next_file(null))) {
let name = info.get_name();
if (name.substr(-5) != '.name')
continue;
try {
let keyfile = new GLib.KeyFile();
keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
let service = keyfile.get_string('VPN Connection', 'service');
let binary = keyfile.get_string('GNOME', 'auth-dialog');
let externalUIMode = false;
let hints = false;
try {
externalUIMode = keyfile.get_boolean('GNOME', 'supports-external-ui-mode');
} catch(e) { } // ignore errors if key does not exist
try {
hints = keyfile.get_boolean('GNOME', 'supports-hints');
} catch(e) { } // ignore errors if key does not exist
let path = binary;
if (!GLib.path_is_absolute(path)) {
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
}
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE)) {
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
try {
let aliases = keyfile.get_string_list('VPN Connection', 'aliases');
for (let alias of aliases) {
this._vpnBinaries[alias] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
}
} catch(e) { } // ignore errors if key does not exist
} else {
throw new Error('VPN plugin at %s is not executable'.format(path));
}
} catch(e) {
log('Error \'%s\' while processing VPN keyfile \'%s\''.
format(e.message, this._pluginDir.get_child(name).get_path()));
continue;
}
let prop = plugin.lookup_property('GNOME', 'supports-external-ui-mode');
if (prop) {
prop = prop.trim().toLowerCase();
externalUIMode = ['true', 'yes', 'on', '1'].includes(prop);
}
} catch(e) {
logError(e, 'error while enumerating VPN auth helpers');
}
if (GLib.file_test(fileName, GLib.FileTest.IS_EXECUTABLE)) {
let binary = { fileName, externalUIMode, supportsHints };
this._vpnBinaries[service] = binary;
plugin.get_aliases().forEach(alias => {
this._vpnBinaries[alias] = binary;
});
} else {
log('VPN plugin at %s is not executable'.format(fileName));
}
});
}
});
var Component = NetworkAgent;

View File

@@ -16,6 +16,7 @@ const PolkitAgent = imports.gi.PolkitAgent;
const Animation = imports.ui.animation;
const Components = imports.ui.components;
const Dialog = imports.ui.dialog;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry;
const UserWidget = imports.ui.userWidget;
@@ -39,6 +40,10 @@ var AuthenticationDialog = new Lang.Class({
this.userNames = userNames;
this._wasDismissed = false;
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
this._group.visible = !Main.sessionMode.isLocked;
});
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
let title = _("Authentication Required");
@@ -193,6 +198,12 @@ var AuthenticationDialog = new Lang.Class({
this._session.initiate();
},
close(timestamp) {
this.parent(timestamp);
Main.sessionMode.disconnect(this._sessionUpdatedId);
},
_ensureOpen() {
// NOTE: ModalDialog.open() is safe to call if the dialog is
// already open - it just returns true without side-effects
@@ -348,6 +359,7 @@ var AuthenticationAgent = new Lang.Class({
this._native = new Shell.PolkitAuthenticationAgent();
this._native.connect('initiate', this._onInitiate.bind(this));
this._native.connect('cancel', this._onCancel.bind(this));
this._sessionUpdatedId = 0;
},
enable() {
@@ -367,6 +379,17 @@ var AuthenticationAgent = new Lang.Class({
},
_onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) {
// Don't pop up a dialog while locked
if (Main.sessionMode.isLocked) {
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
Main.sessionMode.disconnect(this._sessionUpdatedId);
this._sessionUpdatedId = 0;
this._onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames);
});
return;
}
this._currentDialog = new AuthenticationDialog(actionId, message, cookie, userNames);
// We actually don't want to open the dialog until we know for
@@ -396,6 +419,10 @@ var AuthenticationAgent = new Lang.Class({
this._currentDialog.destroySession();
this._currentDialog = null;
if (this._sessionUpdatedId)
Main.sessionMode.disconnect(this._sessionUpdatedId);
this._sessionUpdatedId = 0;
this._native.complete(dismissed);
},
});

View File

@@ -153,8 +153,10 @@ var WorldClocksSection = new Lang.Class({
for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i].location;
let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name()
: l.get_city_name();
let label = new St.Label({ style_class: 'world-clocks-city',
text: l.get_city_name(),
text: name,
x_align: Clutter.ActorAlign.START,
x_expand: true });

View File

@@ -166,7 +166,7 @@ var CandidatePopup = new Lang.Class({
this._panelService.cursor_down();
});
this._candidateArea.connect('candidate-clicked', () => {
this._candidateArea.connect('candidate-clicked', (area, index, button, state) => {
this._panelService.candidate_clicked(index, button, state);
});

View File

@@ -256,6 +256,14 @@ function _getStylesheet(name) {
if (stylesheet.query_exists(null))
return stylesheet;
let dataDirs = GLib.get_system_data_dirs();
for (let i = 0; i < dataDirs.length; i++) {
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]);
let stylesheet = Gio.file_new_for_path(path);
if (stylesheet.query_exists(null))
return stylesheet;
}
stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name);
if (stylesheet.query_exists(null))
return stylesheet;

View File

@@ -502,6 +502,7 @@ var Message = new Lang.Class({
_sync() {
let visible = this.actor.hover && this.canClose();
this._closeButton.opacity = visible ? 255 : 0;
this._closeButton.reactive = visible;
},
_onClicked() {

View File

@@ -100,21 +100,8 @@ var ModalDialog = new Lang.Class({
setButtons(buttons) {
this.clearButtons();
for (let i = 0; i < buttons.length; i++) {
let buttonInfo = buttons[i];
let x_alignment;
if (buttons.length == 1)
x_alignment = St.Align.END;
else if (i == 0)
x_alignment = St.Align.START;
else if (i == buttons.length - 1)
x_alignment = St.Align.END;
else
x_alignment = St.Align.MIDDLE;
for (let buttonInfo of buttons)
this.addButton(buttonInfo);
}
},
addButton(buttonInfo) {

View File

@@ -488,7 +488,8 @@ var Overview = new Lang.Class({
return false;
if (this._inItemDrag || this._inWindowDrag)
return false;
if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT)
if (this._activationTime == 0 ||
GLib.get_monotonic_time() / GLib.USEC_PER_SEC - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT)
return true;
return false;
},
@@ -547,7 +548,7 @@ var Overview = new Lang.Class({
this.visible = true;
this.animationInProgress = true;
this.visibleTarget = true;
this._activationTime = Date.now() / 1000;
this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
Meta.disable_unredirect_for_screen(global.screen);
this.viewSelector.show();

View File

@@ -394,8 +394,9 @@ var PopupImageMenuItem = new Lang.Class({
_init(text, icon, params) {
this.parent(params);
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.actor.add_child(this._icon, { align: St.Align.END });
this._icon = new St.Icon({ style_class: 'popup-menu-icon',
x_align: Clutter.ActorAlign.END });
this.actor.add_child(this._icon);
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this.actor.label_actor = this.label;

View File

@@ -119,6 +119,9 @@ var RemoteMenuItemMapper = new Lang.Class({
this._trackerItem = trackerItem;
this.menuItem = new PopupMenu.PopupBaseMenuItem();
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.menuItem.actor.add_child(this._icon);
this._label = new St.Label();
this.menuItem.actor.add_child(this._label);
this.menuItem.actor.label_actor = this._label;
@@ -129,11 +132,13 @@ var RemoteMenuItemMapper = new Lang.Class({
this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
this._trackerItem.connect('notify::icon', this._updateIcon.bind(this));
this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this));
this._trackerItem.connect('notify::role', this._updateRole.bind(this));
this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this));
this._updateIcon();
this._updateLabel();
this._updateSensitivity();
this._updateRole();
@@ -143,6 +148,11 @@ var RemoteMenuItemMapper = new Lang.Class({
});
},
_updateIcon() {
this._icon.gicon = this._trackerItem.icon;
this._icon.visible = (this._icon.gicon != null);
},
_updateLabel() {
this._label.text = stripMnemonics(this._trackerItem.label);
},

View File

@@ -55,11 +55,11 @@ var EntryMenu = new Lang.Class({
if (v) {
this._makePasswordItem();
this._entry.input_purpose = Gtk.InputPurpose.PASSWORD;
this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD;
} else {
this._passwordItem.destroy();
this._passwordItem = null;
this._entry.input_purpose = Gtk.InputPurpose.FREE_FORM;
this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
}
},

View File

@@ -17,10 +17,11 @@ const PanelMenu = imports.ui.panelMenu;
const BoltClientInterface = '<node> \
<interface name="org.freedesktop.bolt1.Manager"> \
<property name="Probing" type="b" access="read"></property> \
<property name="AuthMode" type="s" access="readwrite"></property> \
<method name="EnrollDevice"> \
<arg type="s" name="uid" direction="in"> </arg> \
<arg type="u" name="policy" direction="in"> </arg> \
<arg type="u" name="flags" direction="in"> </arg> \
<arg type="s" name="policy" direction="in"> </arg> \
<arg type="s" name="flags" direction="in"> </arg> \
<arg name="device" direction="out" type="o"> </arg> \
</method> \
<signal name="DeviceAdded"> \
@@ -34,13 +35,17 @@ const BoltDeviceInterface = '<node> \
<property name="Uid" type="s" access="read"></property> \
<property name="Name" type="s" access="read"></property> \
<property name="Vendor" type="s" access="read"></property> \
<property name="Status" type="u" access="read"></property> \
<property name="SysfsPath" type="s" access="read"></property> \
<property name="Security" type="u" access="read"></property> \
<property name="Type" type="s" access="read"></property> \
<property name="Status" type="s" access="read"></property> \
<property name="Parent" type="s" access="read"></property> \
<property name="SysfsPath" type="s" access="read"></property> \
<property name="Stored" type="b" access="read"></property> \
<property name="Policy" type="u" access="read"></property> \
<property name="Key" type="u" access="read"></property> \
<property name="Policy" type="s" access="read"></property> \
<property name="Key" type="s" access="read"></property> \
<property name="Label" type="s" access="read"></property> \
<property name="ConnectTime" type="t" access="read"></property> \
<property name="AuthorizeTime" type="t" access="read"></property> \
<property name="StoreTime" type="t" access="read"></property> \
</interface> \
</node>';
@@ -50,23 +55,28 @@ const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface);
/* */
var Status = {
DISCONNECTED: 0,
CONNECTED: 1,
AUTHORIZING: 2,
AUTH_ERROR: 3,
AUTHORIZED: 4,
AUTHORIZED_SECURE: 5,
AUTHORIZED_NEWKY: 6
DISCONNECTED: 'disconnected',
CONNECTED: 'connected',
AUTHORIZING: 'authorizing',
AUTH_ERROR: 'auth-error',
AUTHORIZED: 'authorized',
AUTHORIZED_SECURE: 'authorized-secure',
AUTHORIZED_NEWKEY: 'authorized-newkey'
};
var Policy = {
DEFAULT: 0,
MANUAL: 1,
AUTO:2
DEFAULT: 'default',
MANUAL: 'manual',
AUTO: 'auto'
};
var AuthFlags = {
NONE: 0,
NONE: 'none',
};
var AuthMode = {
DISABLED: 'disabled',
ENABLED: 'enabled'
};
const BOLT_DBUS_NAME = 'org.freedesktop.bolt';
@@ -144,6 +154,10 @@ var Client = new Lang.Class({
path);
callback(device, null);
});
},
get authMode () {
return this._proxy.AuthMode;
}
});
@@ -177,6 +191,14 @@ var AuthRobot = new Lang.Class({
if (dev.Status !== Status.CONNECTED)
return;
/* check if authorization is enabled in the daemon. if not
* we won't even bother authorizing, because we will only
* get an error back. The exact contents of AuthMode might
* change in the future, but must contain AuthMode.ENABLED
* if it is enabled. */
if (!cli.authMode.split('|').includes(AuthMode.ENABLED))
return;
/* check if we should enroll the device */
let res = [false];
this.emit('enroll-device', dev, res);
@@ -332,7 +354,7 @@ var Indicator = new Lang.Class({
_onEnrollFailed(obj, device, error) {
const title = _('Thunderbolt authorization error');
const body = _('Could not authorize the thunderbolt device: %s'.format(error.message));
const body = _('Could not authorize the Thunderbolt device: %s'.format(error.message));
this._notify(title, body);
}

View File

@@ -517,7 +517,7 @@ var ViewSelector = new Lang.Class({
let synthEvent = event.copy();
synthEvent.set_source(this._text);
this._text.event(synthEvent, true);
this._text.event(synthEvent, false);
},
// the entry does not show the hint
@@ -601,15 +601,6 @@ var ViewSelector = new Lang.Class({
// - cancel the search
this.reset();
}
} else if (!(global.stage.get_key_focus() instanceof Clutter.Text) &&
(event.type() == Clutter.EventType.KEY_PRESS ||
event.type() == Clutter.EventType.KEY_RELEASE)) {
let unichar = event.get_key_unicode();
if (GLib.unichar_isprint(unichar)) {
this._text.grab_key_focus();
return this._text.event(event, false);
}
}
return Clutter.EVENT_PROPAGATE;

View File

@@ -660,7 +660,6 @@ var WindowOverlay = new Lang.Class({
if (this._hidden)
return;
this._windowClone.actor.grab_key_focus();
this._animateVisible();
this.emit('show-close-button');
},
@@ -1852,7 +1851,12 @@ var Workspace = new Lang.Class({
this.actor.add_actor(clone.actor);
overlay.connect('show-close-button', this._onShowOverlayClose.bind(this));
overlay.connect('show-close-button', () => {
let focus = global.stage.key_focus;
if (focus == null || this.actor.contains(focus))
clone.actor.grab_key_focus();
this._onShowOverlayClose(overlay);
});
if (this._windows.length == 0)
clone.setStackAbove(null);

View File

@@ -275,8 +275,8 @@ var WorkspaceThumbnail = new Lang.Class({
this._createBackground();
let monitor = Main.layoutManager.primaryMonitor;
this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height);
let workArea = Main.layoutManager.getWorkAreaForMonitor(this.monitorIndex);
this.setPorthole(workArea.x, workArea.y, workArea.width, workArea.height);
let windows = global.get_window_actors().filter(actor => {
let win = actor.meta_window;
@@ -321,8 +321,6 @@ var WorkspaceThumbnail = new Lang.Class({
},
setPorthole(x, y, width, height) {
this._portholeX = x;
this._portholeY = y;
this.actor.set_size(width, height);
this._contents.set_position(-x, -y);
},
@@ -675,11 +673,7 @@ var ThumbnailsBox = new Lang.Class({
this._settings.connect('changed::dynamic-workspaces',
this._updateSwitcherVisibility.bind(this));
Main.layoutManager.connect('monitors-changed', () => {
this._destroyThumbnails();
if (Main.overview.visible)
this._createThumbnails();
});
Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this));
},
_updateSwitcherVisibility() {
@@ -872,6 +866,9 @@ var ThumbnailsBox = new Lang.Class({
Main.overview.connect('windows-restacked',
this._syncStacking.bind(this));
this._workareasChangedId =
global.screen.connect('workareas-changed', this._rebuildThumbnails.bind(this));
this._targetScale = 0;
this._scale = 0;
this._pendingScaleUpdate = false;
@@ -901,12 +898,24 @@ var ThumbnailsBox = new Lang.Class({
this._syncStackingId = 0;
}
if (this._workareasChangedId > 0) {
global.screen.disconnect(this._workareasChangedId);
this._workareasChangedId = 0;
}
for (let w = 0; w < this._thumbnails.length; w++)
this._thumbnails[w].destroy();
this._thumbnails = [];
this._porthole = null;
},
_rebuildThumbnails() {
this._destroyThumbnails();
if (Main.overview.visible)
this._createThumbnails();
},
_workspacesChanged() {
let validThumbnails =
this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL);
@@ -1159,7 +1168,7 @@ var ThumbnailsBox = new Lang.Class({
// The "porthole" is the portion of the screen that we show in the
// workspaces
_ensurePorthole() {
if (!Main.layoutManager.primaryMonitor)
if (!Main.layoutManager.primaryMonitor || !Main.overview.visible)
return false;
if (!this._porthole)

View File

@@ -1,12 +1,12 @@
project('gnome-shell', 'c',
version: '3.27.91',
version: '3.28.1',
meson_version: '>= 0.42.0',
license: 'GPLv2+'
)
# We depend on a specific version of the libmutter API. The mutter variants of
# the Cogl and Clutter libraries also use this API version.
mutter_api_version = '1'
mutter_api_version = '2'
clutter_pc = 'mutter-clutter-' + mutter_api_version
cogl_pc = 'mutter-cogl-' + mutter_api_version
@@ -18,12 +18,12 @@ ecal_req = '>= 3.5.3'
eds_req = '>= 3.17.2'
gcr_req = '>= 3.7.5'
gdesktop_req = '>= 3.7.90'
gio_req = '>= 2.53.0'
gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1'
gjs_req = '>= 1.47.0'
gtk_req = '>= 3.15.0'
json_glib_req = '>= 0.13.2'
mutter_req = '>= 3.27.91'
mutter_req = '>= 3.28.0'
polkit_req = '>= 0.100'
schemas_req = '>= 3.21.3'
startup_req = '>= 0.11'
@@ -189,3 +189,5 @@ subdir('tests')
if get_option('gtk_doc')
subdir('docs/reference')
endif
meson.add_install_script('meson/meson-postinstall.sh')

10
meson/meson-postinstall.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/sh
# Package managers set this so we don't need to run
if [ -z "$DESTDIR" ]; then
echo Compiling GSettings schemas...
glib-compile-schemas ${MESON_INSTALL_PREFIX}/share/glib-2.0/schemas
echo Updating desktop database...
update-desktop-database -q ${MESON_INSTALL_PREFIX}/share/applications
fi

512
po/ar.po

File diff suppressed because it is too large Load Diff

371
po/ca.po

File diff suppressed because it is too large Load Diff

498
po/cs.po

File diff suppressed because it is too large Load Diff

428
po/da.po

File diff suppressed because it is too large Load Diff

124
po/de.po
View File

@@ -10,7 +10,7 @@
# Mario Klug <mario@klug.me>, 2010.
# Jakob Kramer <jakob.kramer@gmx.de>, 2010.
# Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2010-2011.
# Wolfgang Stöggl <c72578@yahoo.de>, 2012, 2014, 2017.
# Wolfgang Stöggl <c72578@yahoo.de>, 2012, 2014, 2017-2018.
# Christian Kirbach <christian.kirbach@gmail.com>, 2009-2013.
# Tobias Endrigkeit <tobiasendrigkeit@outlook.com>, 2012-2013.
# Benjamin Steinwender <b@stbe.at>, 2013-2014.
@@ -21,18 +21,17 @@
msgid ""
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: 2018-01-17 18:05+0000\n"
"PO-Revision-Date: 2018-01-19 22:18+0100\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-02-20 23:03+0000\n"
"PO-Revision-Date: 2018-02-23 15:54+0100\n"
"Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.0.5\n"
"X-Generator: Poedit 2.0.6\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@@ -374,20 +373,20 @@ msgctxt "button"
msgid "Sign In"
msgstr "Anmelden"
#: js/gdm/loginDialog.js:308
#: js/gdm/loginDialog.js:322
msgid "Choose Session"
msgstr "Sitzung wählen"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: js/gdm/loginDialog.js:458
#: js/gdm/loginDialog.js:468
msgid "Not listed?"
msgstr "Nicht aufgeführt?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:888
#: js/gdm/loginDialog.js:898
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(z.B. Benutzer oder %s)"
@@ -395,12 +394,12 @@ msgstr "(z.B. Benutzer oder %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243
#: js/gdm/loginDialog.js:903 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:261
msgid "Username: "
msgstr "Benutzername: "
#: js/gdm/loginDialog.js:1236
#: js/gdm/loginDialog.js:1246
msgid "Login Window"
msgstr "Anmeldefenster"
@@ -413,7 +412,7 @@ msgstr "Anmeldung fehlgeschlagen"
#. 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:478
#: js/gdm/util.js:483
msgid "(or swipe finger)"
msgstr "(oder wischen Sie mit einem Finger)"
@@ -655,23 +654,23 @@ msgstr "Häufig"
msgid "All"
msgstr "Alle"
#: js/ui/appDisplay.js:1918
#: js/ui/appDisplay.js:1919
msgid "New Window"
msgstr "Neues Fenster"
#: js/ui/appDisplay.js:1932
#: js/ui/appDisplay.js:1933
msgid "Launch using Dedicated Graphics Card"
msgstr "Mit dedizierter Grafikkarte starten"
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
#: js/ui/appDisplay.js:1960 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen"
#: js/ui/appDisplay.js:1965
#: js/ui/appDisplay.js:1966
msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen"
#: js/ui/appDisplay.js:1975
#: js/ui/appDisplay.js:1976
msgid "Show Details"
msgstr "Details anzeigen"
@@ -718,7 +717,7 @@ msgid "Settings"
msgstr "Einstellungen"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:47
#: js/ui/calendar.js:44
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@@ -728,47 +727,70 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:76
#: js/ui/calendar.js:73
msgctxt "grid sunday"
msgid "S"
msgstr "S"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:75
msgctxt "grid monday"
msgid "M"
msgstr "M"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:77
msgctxt "grid tuesday"
msgid "T"
msgstr "D"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:79
msgctxt "grid wednesday"
msgid "W"
msgstr "M"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:84
#: js/ui/calendar.js:81
msgctxt "grid thursday"
msgid "T"
msgstr "D"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:86
#: js/ui/calendar.js:83
msgctxt "grid friday"
msgid "F"
msgstr "F"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:88
#: js/ui/calendar.js:85
msgctxt "grid saturday"
msgid "S"
msgstr "S"
#. *
#. * Translators: The header displaying just the month name
#. * standalone, when this is a month of the current year.
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:382
msgid "%OB"
msgstr "%OB"
#. *
#. * Translators: The header displaying the month name and the year
#. * number, when this is a month of a different year. You can
#. * reorder the format specifiers or add other modifications
#. * according to the requirements of your language.
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:392
msgid "%OB %Y"
msgstr "%OB %Y"
#: js/ui/calendar.js:449
msgid "Previous month"
msgstr "Vorheriger Monat"
@@ -1306,9 +1328,9 @@ msgstr "Ausschalten"
msgid "Leave Off"
msgstr "Ausgeschaltet lassen"
#: js/ui/keyboard.js:739 js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Tastatur"
#: js/ui/keyboard.js:198
msgid "Region & Language Settings"
msgstr "Regions- und Spracheinstellungen"
#: js/ui/lookingGlass.js:642
msgid "No extensions installed"
@@ -1447,7 +1469,7 @@ msgctxt "System menu in the top bar"
msgid "System"
msgstr "System"
#: js/ui/panel.js:812
#: js/ui/panel.js:814
msgid "Top Bar"
msgstr "Oberes Panel"
@@ -1514,11 +1536,11 @@ msgstr "GNOME muss den Bildschirm sperren"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1308
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1311
msgid "Unable to lock"
msgstr "Sperrung fehlgeschlagen"
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1312
msgid "Lock was blocked by an application"
msgstr "Sperrung wurde von einer Anwendung blockiert"
@@ -1633,6 +1655,10 @@ msgstr "An"
msgid "Brightness"
msgstr "Helligkeit"
#: js/ui/status/keyboard.js:783
msgid "Keyboard"
msgstr "Tastatur"
#: js/ui/status/keyboard.js:806
msgid "Show Keyboard Layout"
msgstr "Tastaturbelegung anzeigen"
@@ -1963,6 +1989,32 @@ msgstr "In Bereitschaft versetzen"
msgid "Power Off"
msgstr "Ausschalten"
#: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt"
msgstr "Thunderbolt"
#. we are done
#: js/ui/status/thunderbolt.js:330
msgid "Unknown Thunderbolt device"
msgstr "Unbekanntes Thunderbolt-Gerät"
#: js/ui/status/thunderbolt.js:331
msgid ""
"New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it."
msgstr ""
"Ein neues Gerät ist in der Zwischenzeit erkannt worden. Bitte trennen Sie "
"die Verbindung des Gerätes und schließen es wieder an, um es zu verwenden."
#: js/ui/status/thunderbolt.js:336
msgid "Thunderbolt authorization error"
msgstr "Thunderbolt-Legitimierungsfehler"
#: js/ui/status/thunderbolt.js:337
#, javascript-format
msgid "Could not authorize the thunderbolt device: %s"
msgstr "Das Thunderbolt-Gerät %s konnte nicht legitimiert werden"
#: js/ui/status/volume.js:128
msgid "Volume changed"
msgstr "Lautstärke geändert"
@@ -2123,21 +2175,21 @@ msgstr "Evolution-Kalender"
msgid "evolution"
msgstr "evolution"
#: src/main.c:437
#: src/main.c:432
msgid "Print version"
msgstr "Version ausgeben"
#: src/main.c:443
#: src/main.c:438
msgid "Mode used by GDM for login screen"
msgstr "Der durch GDM im Anmeldefenster verwendete Modus"
#: src/main.c:449
#: src/main.c:444
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr ""
"Verwenden Sie einen spezifischen Modus wie z.B. »gdm« für den "
"Anmeldebildschirm"
#: src/main.c:455
#: src/main.c:450
msgid "List possible modes"
msgstr "Die möglichen Modi auflisten"

385
po/es.po

File diff suppressed because it is too large Load Diff

550
po/fr.po

File diff suppressed because it is too large Load Diff

1190
po/gd.po

File diff suppressed because it is too large Load Diff

384
po/hr.po

File diff suppressed because it is too large Load Diff

464
po/hu.po

File diff suppressed because it is too large Load Diff

552
po/it.po

File diff suppressed because it is too large Load Diff

545
po/ko.po

File diff suppressed because it is too large Load Diff

511
po/lt.po

File diff suppressed because it is too large Load Diff

601
po/lv.po

File diff suppressed because it is too large Load Diff

552
po/nl.po

File diff suppressed because it is too large Load Diff

501
po/pa.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1613
po/ro.po

File diff suppressed because it is too large Load Diff

606
po/ru.po

File diff suppressed because it is too large Load Diff

449
po/sk.po

File diff suppressed because it is too large Load Diff

519
po/sl.po

File diff suppressed because it is too large Load Diff

405
po/sv.po

File diff suppressed because it is too large Load Diff

View File

@@ -7,17 +7,17 @@
# Bayram Güçlü <byrmgcl@yandex.com.tr>, 2014.
# sabri ünal <yakushabb@gmail.com>, 2014.
# Gökhan Gurbetoğlu <ggurbet@gmail.com>, 2014.
# Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017.
# Muhammet Kara <muhammetk@gmail.com>, 2011, 2012, 2013, 2014, 2015, 2016, 2017.
# Emin Tufan Çetin <etcetin@gmail.com>, 2017, 2018.
# Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-02-06 01:15+0000\n"
"PO-Revision-Date: 2018-02-07 13:19+0300\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"POT-Creation-Date: 2018-02-20 23:03+0000\n"
"PO-Revision-Date: 2018-02-24 16:57+0200\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"
@@ -365,20 +365,20 @@ msgctxt "button"
msgid "Sign In"
msgstr "Giriş"
#: js/gdm/loginDialog.js:308
#: js/gdm/loginDialog.js:322
msgid "Choose Session"
msgstr "Oturum Seç"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: js/gdm/loginDialog.js:458
#: js/gdm/loginDialog.js:468
msgid "Not listed?"
msgstr "Listede yok mu?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:888
#: js/gdm/loginDialog.js:898
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(örneğin, kullanıcı veya %s)"
@@ -386,12 +386,12 @@ msgstr "(örneğin, kullanıcı veya %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243
#: js/gdm/loginDialog.js:903 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:261
msgid "Username: "
msgstr "Kullanıcı Adı: "
#: js/gdm/loginDialog.js:1236
#: js/gdm/loginDialog.js:1246
msgid "Login Window"
msgstr "Oturum Açma Penceresi"
@@ -404,7 +404,7 @@ 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:478
#: js/gdm/util.js:483
msgid "(or swipe finger)"
msgstr "(ya da parmak izi okut)"
@@ -639,23 +639,23 @@ msgstr "Sık Sık"
msgid "All"
msgstr "Tümü"
#: js/ui/appDisplay.js:1918
#: js/ui/appDisplay.js:1919
msgid "New Window"
msgstr "Yeni Pencere"
#: js/ui/appDisplay.js:1932
#: js/ui/appDisplay.js:1933
msgid "Launch using Dedicated Graphics Card"
msgstr "Adanmış Ekran Kartıyla Başlat"
#: js/ui/appDisplay.js:1959 js/ui/dash.js:285
#: js/ui/appDisplay.js:1960 js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Sık Kullanılanlardan Çıkar"
#: js/ui/appDisplay.js:1965
#: js/ui/appDisplay.js:1966
msgid "Add to Favorites"
msgstr "Sık Kullanılanlara Ekle"
#: js/ui/appDisplay.js:1975
#: js/ui/appDisplay.js:1976
msgid "Show Details"
msgstr "Ayrıntıları Göster"
@@ -702,7 +702,7 @@ msgid "Settings"
msgstr "Ayarlar"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:47
#: js/ui/calendar.js:44
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@@ -712,47 +712,70 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:76
#: js/ui/calendar.js:73
msgctxt "grid sunday"
msgid "S"
msgstr "P"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:75
msgctxt "grid monday"
msgid "M"
msgstr "P"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:77
msgctxt "grid tuesday"
msgid "T"
msgstr "S"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:79
msgctxt "grid wednesday"
msgid "W"
msgstr "Ç"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:84
#: js/ui/calendar.js:81
msgctxt "grid thursday"
msgid "T"
msgstr "P"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:86
#: js/ui/calendar.js:83
msgctxt "grid friday"
msgid "F"
msgstr "C"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:88
#: js/ui/calendar.js:85
msgctxt "grid saturday"
msgid "S"
msgstr "C"
#. *
#. * Translators: The header displaying just the month name
#. * standalone, when this is a month of the current year.
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:382
msgid "%OB"
msgstr "%OB"
#. *
#. * Translators: The header displaying the month name and the year
#. * number, when this is a month of a different year. You can
#. * reorder the format specifiers or add other modifications
#. * according to the requirements of your language.
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:392
msgid "%OB %Y"
msgstr "%OB %Y"
#: js/ui/calendar.js:449
msgid "Previous month"
msgstr "Önceki ay"
@@ -1217,12 +1240,10 @@ msgid "Allow"
msgstr "İzin ver"
#: js/ui/kbdA11yDialog.js:33
#| msgid "Slow Keys"
msgid "Slow Keys Turned On"
msgstr "Yavaş Tuşlar Açık"
#: js/ui/kbdA11yDialog.js:34
#| msgid "Slow Keys"
msgid "Slow Keys Turned Off"
msgstr "Yavaş Tuşlar Kapalı"
@@ -1235,12 +1256,10 @@ msgstr ""
"etkileyen Yavaş Tuşlar özelliğinin kısayoludur."
#: js/ui/kbdA11yDialog.js:42
#| msgid "Sticky Keys"
msgid "Sticky Keys Turned On"
msgstr "Yapışkan Tuşlar Açık"
#: js/ui/kbdA11yDialog.js:43
#| msgid "Sticky Keys"
msgid "Sticky Keys Turned Off"
msgstr "Yapışkan Tuşlar Kapalı"
@@ -1283,7 +1302,6 @@ msgid "Leave Off"
msgstr "Kapalı Bırak"
#: js/ui/keyboard.js:198
#| msgid "Date & Time Settings"
msgid "Region & Language Settings"
msgstr "Bölge ve Dil Ayarları"
@@ -1486,11 +1504,11 @@ msgstr "GNOMEun 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:836 js/ui/screenShield.js:1308
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1311
msgid "Unable to lock"
msgstr "Kilitlenemedi"
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1312
msgid "Lock was blocked by an application"
msgstr "Kilitleme bir uygulama tarafından engellendi"

567
po/vi.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -200,6 +200,7 @@ gtk_menu_tracker_item_finalize (GObject *object)
GtkMenuTrackerItem *self = GTK_MENU_TRACKER_ITEM (object);
g_free (self->action_namespace);
g_free (self->action_and_target);
if (self->observable)
g_object_unref (self->observable);

View File

@@ -73,8 +73,8 @@ struct _ShellGlobal {
ShellWM *wm;
GSettings *settings;
const char *datadir;
const char *imagedir;
const char *userdatadir;
char *imagedir;
char *userdatadir;
GFile *userdatadir_path;
GFile *runtime_state_path;
@@ -337,6 +337,10 @@ shell_global_finalize (GObject *object)
g_clear_object (&global->userdatadir_path);
g_clear_object (&global->runtime_state_path);
g_free (global->session_mode);
g_free (global->imagedir);
g_free (global->userdatadir);
G_OBJECT_CLASS(shell_global_parent_class)->finalize (object);
}

View File

@@ -395,13 +395,6 @@ get_app_for_window (ShellWindowTracker *tracker,
if (meta_window_is_remote (window))
return _shell_app_new_for_window (window);
/* Check if the window was opened from within a sandbox; if this
* is the case, a corresponding .desktop file is guaranteed to match;
*/
result = get_app_from_sandboxed_app_id (window);
if (result != NULL)
return result;
/* Check if the window has a GApplication ID attached; this is
* canonical if it does
*/
@@ -416,6 +409,15 @@ get_app_for_window (ShellWindowTracker *tracker,
if (result != NULL)
return result;
/* Check if the window was opened from within a sandbox; if this
* is the case, a corresponding .desktop file is guaranteed to match;
* Do this after having checked by WM_CLASS so that sandboxed apps
* installing multiple .desktop files can properly match their windows.
*/
result = get_app_from_sandboxed_app_id (window);
if (result != NULL)
return result;
result = get_app_from_window_pid (tracker, window);
if (result != NULL)
return result;

View File

@@ -308,9 +308,8 @@ st_entry_style_changed (StWidget *self)
}
theme_node = st_widget_get_theme_node (self);
st_theme_node_get_foreground_color (theme_node, &color);
clutter_text_set_color (CLUTTER_TEXT (priv->entry), &color);
_st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node);
if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size))
clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size));

View File

@@ -116,6 +116,7 @@ _st_set_text_from_style (ClutterText *text,
PangoAttrList *attribs = NULL;
const PangoFontDescription *font;
StTextAlign align;
gdouble spacing;
st_theme_node_get_foreground_color (theme_node, &color);
clutter_text_set_color (text, &color);
@@ -123,11 +124,11 @@ _st_set_text_from_style (ClutterText *text,
font = st_theme_node_get_font (theme_node);
clutter_text_set_font_description (text, (PangoFontDescription *) font);
attribs = pango_attr_list_new ();
decoration = st_theme_node_get_text_decoration (theme_node);
if (decoration)
{
attribs = pango_attr_list_new ();
if (decoration & ST_TEXT_DECORATION_UNDERLINE)
{
PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
@@ -143,6 +144,13 @@ _st_set_text_from_style (ClutterText *text,
*/
}
spacing = st_theme_node_get_letter_spacing (theme_node);
if (spacing)
{
PangoAttribute *letter_spacing = pango_attr_letter_spacing_new ((int)(.5 + spacing) * PANGO_SCALE);
pango_attr_list_insert (attribs, letter_spacing);
}
clutter_text_set_attributes (text, attribs);
if (attribs)
@@ -414,11 +422,9 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
ClutterActor *actor)
{
CoglPipeline *shadow_pipeline = NULL;
ClutterActorBox box;
float width, height;
clutter_actor_get_allocation_box (actor, &box);
clutter_actor_box_get_size (&box, &width, &height);
clutter_actor_get_size (actor, &width, &height);
if (width == 0 || height == 0)
return NULL;
@@ -441,6 +447,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
CoglFramebuffer *fb;
CoglColor clear_color;
CoglError *catch_error = NULL;
float x, y;
buffer = cogl_texture_new_with_size (width,
height,
@@ -462,6 +469,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
}
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
clutter_actor_get_position (actor, &x, &y);
/* XXX: There's no way to render a ClutterActor to an offscreen
* as it uses the implicit API. */
@@ -470,7 +478,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
G_GNUC_END_IGNORE_DEPRECATIONS;
cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
cogl_framebuffer_translate (fb, -box.x1, -box.y1, 0);
cogl_framebuffer_translate (fb, -x, -y, 0);
cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.0);
clutter_actor_set_opacity_override (actor, 255);

View File

@@ -2545,6 +2545,28 @@ st_theme_node_get_text_align(StThemeNode *node)
return ST_TEXT_ALIGN_LEFT;
}
/**
* st_theme_node_get_letter_spacing:
* @node: a #StThemeNode
*
* Gets the value for the letter-spacing style property, in pixels.
*
* Return value: the value of the letter-spacing property, if
* found, or zero if such property has not been found.
*/
gdouble
st_theme_node_get_letter_spacing (StThemeNode *node)
{
gdouble spacing = 0.;
g_return_val_if_fail (ST_IS_THEME_NODE (node), spacing);
ensure_properties (node);
st_theme_node_lookup_length (node, "letter-spacing", FALSE, &spacing);
return spacing;
}
static gboolean
font_family_from_terms (CRTerm *term,
char **family)

View File

@@ -223,6 +223,8 @@ StTextDecoration st_theme_node_get_text_decoration (StThemeNode *node);
StTextAlign st_theme_node_get_text_align (StThemeNode *node);
double st_theme_node_get_letter_spacing (StThemeNode *node);
/* Font rule processing is pretty complicated, so we just hardcode it
* under the standard font/font-family/font-size/etc names. This means
* you can't have multiple separate styled fonts for a single item,

View File

@@ -38,6 +38,10 @@ const tests = [
output: [ { url: 'http://www.gnome.org:99/port', pos: 10 } ] },
{ input: 'This is an ftp://www.gnome.org/ test.',
output: [ { url: 'ftp://www.gnome.org/', pos: 11 } ] },
{ input: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)',
output: [ { url: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)', pos: 0 } ] },
{ input: 'https://www.gnome.org/(some_url_with_unbalanced_parenthesis',
output: [ { url: 'https://www.gnome.org/', pos: 0 } ] },
{ input: 'Visit http://www.gnome.org/ and http://developer.gnome.org',
output: [ { url: 'http://www.gnome.org/', pos: 6 },
@@ -68,4 +72,4 @@ for (let i = 0; i < tests.length; i++) {
JsUnit.assertEquals('Test ' + i + ', match ' + j + ' position',
match[j].pos, tests[i].output[j].pos);
}
}
}