Compare commits

...

47 Commits

Author SHA1 Message Date
Danial Behzadi
81309b8eb8 Update Persian translation 2019-08-21 11:38:25 +00:00
Marco Trevisan (Treviño)
d416691896 boxpointer: Unset the sourceActor on destruction
A boxpointer sourceActor could be destroyed before the boxpointer itself.
In such case, unset the sourceActor reference, connecting to 'destroy' signal.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1295
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/576

(cherry picked from commit 2fd120162f)
2019-06-26 17:02:36 +02:00
Florian Müllner
7a6ed76a20 osk-layouts: Fix French layout
The script to convert XML keyboard layouts to json has a small bug
that causes the French-Canadian layout to end up as French.

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


(cherry picked from commit 859aef78c4)
2019-06-14 16:49:17 +00:00
Marco Trevisan (Treviño)
a8f6f01d67 dialog: Really set ellipsize mode in subtitle and body
Dialog's subtitle or body could not be properly wrapped, while it's ellipsized
when the text's width doesn't exceed the container size.

Clutter text has an `ellipsize` property, however in dialog's subtitle and body
we have been setting the `ellipsize-mode` property to Pango.EllipsizeMode.NONE
that is not present in the underlying GObject.

Not being an error in javascript, gjs didn't warn us about this, while at the
same time the St.Label's default Pango.EllipsizeMode.END was used.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/922

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/531


(cherry picked from commit 3121c9aa29)
2019-05-03 21:31:46 +00:00
Xiang Fan
1f03c94d31 windowManager: Don't animate touch/touchpad gesture in overview
The window group is hidden while in overview, so the stick-to-content
animation isn't visible either. Worse, the gestures messes up the
position of window actors in that case.

Fix that by skipping the (invisible) animations in the overview.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/644
2019-03-22 16:53:35 +08:00
Andrea Azzarone
843ed09b09 dnd: Only handle touch events in wayland
There are serveral issues around touch passive grab and touch/pointer doubly
handling to use these on X11, so we stick to single-touch/pointer there.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1015
2019-03-13 18:14:42 +00:00
Florian Müllner
51b04134db messageTray: Re-enable unredirection when banner is destroyed
The intention of commit 4dc20398 was to disable unredirection while
banners are shown, but the ::done-displaying signal currently used for
re-enabling unredirection is only emitted under some circumstances, so
it's possible that unredirection is left disabled indefinitely, whoops.

Fix this by tying disabling unredirection explicitly to the lifetime
of the banner actor.

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


(cherry picked from commit e5ce3d541e)
2019-03-03 09:33:15 +00:00
Sveinn í Felli
bfcfa64456 Update Icelandic translation 2019-02-21 11:19:54 +00:00
Gun Chleoc
ea3d897439 Update Scottish Gaelic translation 2019-02-16 09:34:08 +00:00
Gun Chleoc
5979f87295 Update Scottish Gaelic translation 2019-02-14 09:03:50 +00:00
Carlos Garnacho
1cda659732 inputMethod: Keep track of preedit string visibility
So we can silence update-preedit-text signals that keep the
preedit string invisible.

Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1447

(cherry-picked from 6f5a099184)
2019-02-08 17:58:06 +01:00
Carlos Garnacho
4010628001 inputMethod: Avoid calling set_preedit_text() if unnecessary
This is easier down on clients.

(cherry-picked from 8c3811a866)
2019-02-08 17:55:50 +01:00
Ray Strode
e23f4d6c7c shellActionModes: disable POPUP keybindings in unlock screen
Certain keybindings should continue to work even when a popup
menu is on screen. For instance, the keybinding for showing
the app menu and the keyinding for showing the calendar are
examples.

This is achieved by putting in place a special "POPUP" action
mode, whenever a popup menu is active.  This mode replaces
the (e.g., "NORMAL" or "OVERVIEW") action mode that was in place
for as long as the popup menu is active.

But those keybindings should not work when the user is at the
unlock dialog (which uses an action mode of "UNLOCK").

Unfortunately, since commit c79d24b6 they do.

This commit addresses the problem by forcing the action mode
to NONE at the unlock screen when popups are visible.

CVE-2019-3820

Closes https://gitlab.gnome.org/GNOME/gnome-shell/issues/851
2019-02-05 11:14:01 -05:00
Florian Müllner
511e8c6584 panel: Don't allow opening hidden menus via keybindings
We shouldn't allow toggling menus that aren't supported by the
current session mode, but as indicators are hidden rather than
destroyed on mode switches, it is not enough to check for an
indicator's existence.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/851
2019-02-05 11:13:59 -05:00
Charles Monzat
ee97f73521 Update French translation 2019-01-17 16:58:26 +00:00
Takao Fujiwara
ca54b55c01 keyboard: Do not call KeyboardManager.holdKeyboard() with set-content-type
When gnome-shell receives the signal of 'set-content-type' from ibus,
gnome-shell calls KeyboardManager.holdKeyboard() and
KeyboardManager.releaseKeyboard() and the functions change the current
input focus in GNOME Xorg and it could result in closing a popup window
which has a password entry by focusing on the entry.
The solution is to stop to call the APIs on 'set-content-type' signal.

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


(cherry picked from commit 551e827841)
2018-12-05 12:19:51 +00:00
Dušan Kazik
999cc1214e Update Slovak translation 2018-12-02 20:02:10 +00:00
Carmen Bianca BAKKER
cf5d496e01 Update Esperanto translation 2018-11-28 09:04:40 +00:00
Marco Trevisan (Treviño)
5246da5837 st-button: Ignore pointer emulated touch events
In X11, pointer emulated touch events are replicated with normal PRESS, RELEASE
pair events which are generated by the server. Thus for a single tap we get:
 - TOUCH_BEGIN -> TOUCH_END, PRESS -> RELEASE

This will cause st-button to send two "clicked" signals, instead of just one,
breaking extensions (like dash-to-dock) that show buttons in the main stage
which will be checked two times or that will receive the same signal two times.


(cherry picked from commit 4c11d15a07)
2018-11-26 21:23:22 +00:00
Iñaki Larrañaga Murgoitio
f645368c66 Update Basque translation 2018-11-25 12:46:47 +00:00
Andrea Azzarone
45b4495886 dash: destroy items's child before tooltip
Destroy the DashItemContainer's child from the same handler as the tooltip. This
will prevent invalid reads when the item is destroyed while its quicklist is
still open.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/781


(cherry picked from commit ff2fbf5ae4)
2018-11-19 15:57:58 +00:00
Florian Müllner
ae0461fd60 altSwitcher: Fix error when all alternatives are disabled
While we do consider the case that we don't have a child to show for the
visibility, we are still trying to move the click action unconditionally.

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


(cherry picked from commit e77463b875)
2018-11-17 12:20:06 +00:00
Florian Müllner
4e1747e6ec ibusManager: Don't pass undefined callback to ibus
Since commit 551e827841, we don't always pass a callback parameter.
However passing it on as undefined to ibus doesn't work, as gjs doesn't
accept that as a valid callback value and throw an error. As a result,
we can end up with no layout selected in the keyboard menu and an "empty"
indicator. Fix this by explicitly passing null if no callback has been
provided.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/293


(cherry picked from commit 74bb9e6249)
2018-11-17 12:19:49 +00:00
Florian Müllner
2a36bf52cb Bump version to 3.30.2
Update NEWS.
2018-11-13 23:43:15 +01:00
Florian Müllner
3dffdab1ad workspace: Confine caption width to workspace area
When we started to only show a single caption at a time, we allowed
title captions to be wider than their corresponding window preview.
But while overlapping neighboring previews is fine, we shouldn't
allow the captions to leak outside the workspace area itself and
overlap unrelated elements like workspace switcher or dash.

This partly reverts commit b3b30f239d.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/214


(cherry picked from commit 6099e92df5)
2018-11-13 18:19:22 +00:00
Marco Trevisan (Treviño)
fd75921f13 notificationDaemon: support file:// or icon theme names for image-path
While this sounds counter-intuitive, the image-path hint value might also
be used with URIs or icon names.

As per freedesktop standard:
  The "app_icon" parameter and "image-path" hint should be either an URI
  (file:// is the only URI schema supported right now) or a name in a
  freedesktop.org-compliant icon theme (not a GTK+ stock ID).

Thus the image-path hint should also be parsed as it happens for the
app_icon.

Reuse same logic, by falling back on _iconForNotificationData with the
hint value.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/285


(cherry picked from commit 33b8537bf5)
2018-11-13 15:27:16 +00:00
Erik Duxstad
9b9599515a windowManager: make TouchpadWorkspaceSwitchAction respect natural-scroll
Instead of defaulting to a natural scroll behavior,
have the workspace switch action use the natural-scroll setting
in org.gnome.peripherals.touchpad to determine the correct
direction of travel when swiping. 4 finger swipes will then
match the behavior of the rest of the UI.

Reference: https://gitlab.gnome.org/GNOME/gnome-shell/issues/516


(cherry picked from commit 118cab1766)
2018-11-13 15:26:48 +00:00
Cosimo Cecchi
609c81698e StTextureCache: use right event to detect file changes
StTextureCache installs file monitors that invalidate caches when
contents of the underlying file change.
At the moment, the cache uses the Gio.FileMonitorEvent.CHANGED event
type to make that determination.

However, that is suboptimal for at least two reasons:
- while a file is being written to disk, many CHANGED events will be
  emitted in sequence. That will cause needless cache invalidations,
  and we will risk loading the file before it's fully loaded.
- if an existing file is replaced, e.g. with g_file_replace(), we may
  not get a CHANGED event but a CREATED one instead, so the cache ends
  up never getting invalidated.

The good news is that in both of those cases GFileMonitor will send a
CHANGES_DONE_HINT event after changes have settled, or after the file
is replaced.

This commit fixes both cases by switching from the CHANGED event to
CHANGES_DONE_HINT to determine that a file has in fact changed.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/286


(cherry picked from commit ca3f4cfb41)
2018-11-10 01:09:01 +00:00
Florian Müllner
62c2dbbc9d messageTray: Disable unredirection while showing banners
We don't usually show notification banners while the monitor is in
fullscreen, but when we do - the notification is urgent - we should
actually show the banner, even if the top-most window is unredirected.
To achieve that, disable unredirection while the banner is showing.

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


(cherry picked from commit 4dc2039859)
2018-11-08 12:56:42 +00:00
Florian Müllner
a1a7ba7cc7 workspaces: Use correct schema for workspace settings
The custom overrides system is gone, we need to use the original
mutter schema.

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


(cherry picked from commit f1195ecb01)
2018-11-08 12:44:33 +00:00
Daniel Mustieles
be35dec71e Update Spanish translation 2018-11-06 11:05:06 +00:00
Rafael Fontenelle
e55bdb0fbb Update Brazilian Portuguese translation 2018-11-05 19:58:30 +00:00
Daniel van Vugt
bacdd1c12d iconGrid: Keep icons reactive during pulse animation
The `reactive` property of icon actors was being restored multiple times
over the course of the pulse animation, all at slightly different times
as each icon finished animating at different times.

The problem is that toggling `reactive` on an `StWidget` incurs a style
change of the `insensitive` pseudo class, and style changes would quickly
queue relayouts incurring full stage reallocation. This occurred many times
during a pulse animation, limiting its smoothness and performance.

The solution is to not toggle the `reactive` property in the pulse
animation at all, which avoids incurring multiple full stage relayouts.

As a bonus, this means the icon under the cursor pulses with the correct
selection highlight, appearing more seamless and responsive.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/261


(cherry picked from commit 1acdff822a)
2018-10-30 19:32:28 +00:00
Daniel van Vugt
78f6a409aa iconGrid: Defer and group animation cleanup
The `reactive` property of icon actors was being restored 24 times over
the course of the spring animation, all at slightly different times as
each icon finished animating at different times.

The problem is that toggling `reactive` on an `StWidget` incurs a style
change of the `insensitive` pseudo class, and style changes would quickly
queue relayouts incurring full stage reallocation. This occurred many times
during a spring animation hogging the CPU and limiting the frame rate.

The solution is defer and batch the cleanup for all icons until after the
last icon has finished animating. This way the CPU impact of the style
change and stage relayout isn't felt during the animation so the frame
rate remains higher and smoother. The overall CPU usage of the animation
is also reduced as the remaining relayouts are much more likely to be
grouped into a single frame.

Icon spring animation performance on an i7-7700:
Before: 83% CPU and 47 FPS
After : 78% CPU and 54 FPS
which is about a 22% increase in performance per clock (FPS/CPU).

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/253


(cherry picked from commit a5e6dd52d2)
2018-10-30 18:09:04 +00:00
Anish Sheela
d7ee164f0f Update Malayalam translation 2018-10-28 14:06:12 +00:00
gogo
0820b9cbef Update Croatian translation 2018-10-24 19:25:32 +00:00
Dušan Kazik
89a720c050 Update Slovak translation 2018-10-24 06:26:23 +00:00
verdre
d2393395ff build: Include params.js in portal-helper gresources
Fix a regression causing the portal helper to crash.
In 94423151b2 we moved the dbus interface
descriptions into seperate files which is why we had to include the
fileUtils js module. This module imports the params js module, so add
params.js to the gresources file for the portal helper.


(cherry picked from commit ceed3e07e4)
2018-10-23 15:41:58 +00:00
Florian Müllner
d21b276c07 panel: Also ignore hidden windows for proximity
We currently only ignore minimized windows, not windows that are
hidden for other reasons - namely on wayland windows are initially
hidden until they are placed.

This fixes a flicker in the transparent top bar on wayland when the
"position" of an unplaced window wrongly suggests the window is
overlapping the top bar.

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


(cherry picked from commit a0dc8dc7ef)
2018-10-23 15:32:13 +00:00
Carlos Garnacho
ccc5967382 keyboardManager: Avoid idempotent calls to meta_backend_set_keymap()
But still try to apply the keymap whenever the input sources changed. This
is a different approach to gnome-shell#240 that still avoid redundant
changes to the current keymap, but actually trigger one when input sources
are added.

https://bugzilla.redhat.com/show_bug.cgi?id=1637418

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/691


(cherry picked from commit b405ed6442)
2018-10-23 09:47:46 +00:00
Florian Müllner
5ee0f743de osdWindow: Disconnect signals on destroy
Since we started to show OSD windows on all monitors, OSD windows are
destroyed when the corresponding monitor is disconnected. We shouldn't
leave any signal handlers around in that case - they prevent the object
from being garbage collected, and trigger warnings for accessing proper-
ties of invalidated GObjects.

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


(cherry picked from commit 8566ec2ee5)
2018-10-22 18:10:15 +00:00
Didier Roche
ec5db74101 osdWindow: Ensure we setMaxLevel before setting Level itself
When maxLevel is > 100%, first OSD appearance was capping the current
level to 100%. Consecutives key press were then OK.
Ensure we setMaxLevel before setting Level itself, so that correct cap
value is applied.


(cherry picked from commit ae7dd5e2db)
2018-10-19 14:24:22 +00:00
Milo Casagrande
24d8066197 Update Italian translation 2018-10-19 07:21:01 +00:00
Kristjan SCHMIDT
c77c47cf29 Update Esperanto translation 2018-10-16 21:01:38 +00:00
Rūdolfs Mazurs
620bd037d2 Update Latvian translation 2018-10-14 16:44:37 +00:00
Florian Müllner
54f8232a93 appFolder: Don't block all shortcuts
App folder popups take a grab when opened, and as we don't pass any
particular pushModal() parameters, all keybindings are blocked. While
this makes sense for most keybindings that would interfere with the
popup interaction, others like volume/brightness keys or screenshots
can be allowed safely.

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


(cherry picked from commit 76117fd306)
2018-10-13 12:30:37 +00:00
Andrea Azzarone
c17ba90209 popupMenu: Handle keypress if numlock is enabled
Add exception to handle a keypress if numlock is enabled as we already do for
capslock. This uses Clutter.ModifierType.MOD2_MASK because at the moment there
is not a more explicit way to refer to the numlock mask.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/550


(cherry picked from commit 8855622666)
2018-10-11 07:46:53 +00:00
44 changed files with 7147 additions and 4897 deletions

21
NEWS
View File

@ -1,3 +1,24 @@
3.30.2
======
* popupMenu: Fix keyboard activation when numlock is active [Andrea; #550]
* Do not block all shortcuts while app folders are expanded [Florian; #648]
* Fix regression in handling new input sources [Carlos; #691]
* Improve performance of app icon animations [Daniel; !253, !261]
* Respect natural-scroll setting for workspace swipe gesture [Erik; #516]
* notifications: Support icon theme names in 'image-path' hint [Marco; !285]
* Confine window preview titles to workspace area [Florian; !214]
* Misc. bug fixes [Florian, Cosimo; #602, #693, #768, #430, !286]
Contributors:
Andrea Azzarone, Cosimo Cecchi, Erik Duxstad, Carlos Garnacho,
Florian Müllner, Didier Roche, Marco Trevisan (Treviño), verdre,
Daniel van Vugt
Translators:
Rūdolfs Mazurs [lv], Kristjan SCHMIDT [eo], Milo Casagrande [it],
Dušan Kazik [sk], gogo [hr], Anish Sheela [ml], Rafael Fontenelle [pt_BR],
Daniel Mustieles [es]
3.30.1 3.30.1
====== ======
* Cancel search on overview hiding [Marco; !205] * Cancel search on overview hiding [Marco; !205]

View File

@ -6,6 +6,7 @@
<file>be.json</file> <file>be.json</file>
<file>bg.json</file> <file>bg.json</file>
<file>by.json</file> <file>by.json</file>
<file>ca.json</file>
<file>cz.json</file> <file>cz.json</file>
<file>de.json</file> <file>de.json</file>
<file>dk.json</file> <file>dk.json</file>

599
data/osk-layouts/ca.json Normal file
View File

@ -0,0 +1,599 @@
{
"levels": [
{
"level": "",
"mode": "default",
"rows": [
[
[
"q"
],
[
"w"
],
[
"e",
"é",
"è",
"ê",
"ë",
"%",
"ę",
"ė",
"ē"
],
[
"r"
],
[
"t"
],
[
"y",
"%",
"ÿ"
],
[
"u",
"ù",
"û",
"%",
"ü",
"ú",
"ū"
],
[
"i",
"î",
"%",
"ï",
"ì",
"í",
"į",
"ī"
],
[
"o",
"ô",
"œ",
"%",
"ö",
"ò",
"ó",
"õ",
"ø",
"ō",
"º"
],
[
"p"
]
],
[
[
"a",
"à",
"â",
"%",
"æ",
"á",
"ä",
"ã",
"å",
"ā",
"ª"
],
[
"s"
],
[
"d"
],
[
"f"
],
[
"g"
],
[
"h"
],
[
"j"
],
[
"k"
],
[
"l"
]
],
[
[
"z"
],
[
"x"
],
[
"c",
"ç",
"ć",
"č"
],
[
"v"
],
[
"b"
],
[
"n"
],
[
"m"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "shift",
"mode": "latched",
"rows": [
[
[
"Q"
],
[
"W"
],
[
"E",
"É",
"È",
"Ê",
"Ë",
"%",
"Ę",
"Ė",
"Ē"
],
[
"R"
],
[
"T"
],
[
"Y",
"%",
"Ÿ"
],
[
"U",
"Ù",
"Û",
"%",
"Ü",
"Ú",
"Ū"
],
[
"I",
"Î",
"%",
"Ï",
"Ì",
"Í",
"Į",
"Ī"
],
[
"O",
"Ô",
"Œ",
"%",
"Ö",
"Ò",
"Ó",
"Õ",
"Ø",
"Ō",
"º"
],
[
"P"
]
],
[
[
"A",
"À",
"Â",
"%",
"Æ",
"Á",
"Ä",
"Ã",
"Å",
"Ā",
"ª"
],
[
"S"
],
[
"D"
],
[
"F"
],
[
"G"
],
[
"H"
],
[
"J"
],
[
"K"
],
[
"L"
]
],
[
[
"Z"
],
[
"X"
],
[
"C",
"Ç",
"Ć",
"Č"
],
[
"V"
],
[
"B"
],
[
"N"
],
[
"M"
]
],
[
[
","
],
[
" "
],
[
".",
"#",
"!",
",",
"?",
"-",
":",
"'",
"@"
]
]
]
},
{
"level": "opt",
"mode": "locked",
"rows": [
[
[
"1",
"¹",
"½",
"⅓",
"¼",
"⅛"
],
[
"2",
"²",
"⅔"
],
[
"3",
"³",
"¾",
"⅜"
],
[
"4",
"⁴"
],
[
"5",
"⅝"
],
[
"6"
],
[
"7",
"⅞"
],
[
"8"
],
[
"9"
],
[
"0",
"ⁿ",
"∅"
]
],
[
[
"@"
],
[
"#"
],
[
"$",
"¢",
"£",
"€",
"¥",
"₱"
],
[
"%",
"‰"
],
[
"&"
],
[
"-",
"_",
"",
"—",
"·"
],
[
"+",
"±"
],
[
"(",
"<",
"{",
"["
],
[
")",
">",
"}",
"]"
]
],
[
[
"*",
"†",
"‡",
"★"
],
[
"\"",
"“",
"”",
"«",
"»"
],
[
"'",
"",
"",
"",
""
],
[
":"
],
[
";"
],
[
"!",
"¡"
],
[
"?",
"¿"
]
],
[
[
"_"
],
[
"/"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
},
{
"level": "opt+shift",
"mode": "locked",
"rows": [
[
[
"~"
],
[
"`"
],
[
"|"
],
[
"•",
"♪",
"♥",
"♠",
"♦",
"♣"
],
[
"√"
],
[
"Π",
"π"
],
[
"÷"
],
[
"×"
],
[
"¶",
"§"
],
[
"∆"
]
],
[
[
"£"
],
[
"¢"
],
[
"€"
],
[
"¥"
],
[
"^",
"↑",
"↓",
"←",
"→"
],
[
"°",
"",
"″"
],
[
"=",
"≠",
"≈",
"∞"
],
[
"{"
],
[
"}"
]
],
[
[
"\\"
],
[
"©"
],
[
"®"
],
[
"™"
],
[
"℅"
],
[
"["
],
[
"]"
]
],
[
[
"<",
"",
"≤",
"«"
],
[
">",
"",
"≥",
"»"
],
[
" "
],
[
","
],
[
".",
"…"
]
]
]
}
],
"locale": "fr-CA",
"name": "French Canada"
}

View File

@ -6,10 +6,20 @@
"rows": [ "rows": [
[ [
[ [
"q" "a",
"à",
"â",
"%",
"æ",
"á",
"ä",
"ã",
"å",
"ā",
"ª"
], ],
[ [
"w" "z"
], ],
[ [
"e", "e",
@ -71,17 +81,7 @@
], ],
[ [
[ [
"a", "q"
"à",
"â",
"%",
"æ",
"á",
"ä",
"ã",
"å",
"ā",
"ª"
], ],
[ [
"s" "s"
@ -106,11 +106,14 @@
], ],
[ [
"l" "l"
],
[
"m"
] ]
], ],
[ [
[ [
"z" "w"
], ],
[ [
"x" "x"
@ -131,7 +134,11 @@
"n" "n"
], ],
[ [
"m" "'",
"",
"",
"",
""
] ]
], ],
[ [
@ -161,10 +168,20 @@
"rows": [ "rows": [
[ [
[ [
"Q" "A",
"À",
"Â",
"%",
"Æ",
"Á",
"Ä",
"Ã",
"Å",
"Ā",
"ª"
], ],
[ [
"W" "Z"
], ],
[ [
"E", "E",
@ -226,17 +243,7 @@
], ],
[ [
[ [
"A", "Q"
"À",
"Â",
"%",
"Æ",
"Á",
"Ä",
"Ã",
"Å",
"Ā",
"ª"
], ],
[ [
"S" "S"
@ -261,11 +268,14 @@
], ],
[ [
"L" "L"
],
[
"M"
] ]
], ],
[ [
[ [
"Z" "W"
], ],
[ [
"X" "X"
@ -286,7 +296,11 @@
"N" "N"
], ],
[ [
"M" "'",
"",
"",
"",
""
] ]
], ],
[ [
@ -369,10 +383,10 @@
"#" "#"
], ],
[ [
"$", "",
"¢", "¢",
"£", "£",
"", "$",
"¥", "¥",
"₱" "₱"
], ],
@ -511,13 +525,14 @@
"£" "£"
], ],
[ [
"¥"
],
[
"$",
"¢" "¢"
], ],
[ [
"€" "¢"
],
[
"¥"
], ],
[ [
"^", "^",
@ -594,6 +609,6 @@
] ]
} }
], ],
"locale": "fr-CA", "locale": "fr",
"name": "French Canada" "name": "French"
} }

View File

@ -11,6 +11,7 @@ const Animation = imports.ui.animation;
const Batch = imports.gdm.batch; const Batch = imports.gdm.batch;
const GdmUtil = imports.gdm.util; const GdmUtil = imports.gdm.util;
const Params = imports.misc.params; const Params = imports.misc.params;
const Shell = imports.gi.Shell;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserWidget = imports.ui.userWidget; const UserWidget = imports.ui.userWidget;
@ -99,7 +100,7 @@ var AuthPrompt = new Lang.Class({
x_align: St.Align.START }); x_align: St.Align.START });
this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry', this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
can_focus: true }); can_focus: true });
ShellEntry.addContextMenu(this._entry, { isPassword: true }); ShellEntry.addContextMenu(this._entry, { isPassword: true, actionMode: Shell.ActionMode.NONE });
this.actor.add(this._entry, this.actor.add(this._entry,
{ expand: true, { expand: true,

View File

@ -342,7 +342,8 @@ var SessionMenuButton = new Lang.Class({
this._button.remove_style_pseudo_class('active'); this._button.remove_style_pseudo_class('active');
}); });
this._manager = new PopupMenu.PopupMenuManager({ actor: this._button }); this._manager = new PopupMenu.PopupMenuManager({ actor: this._button },
{ actionMode: Shell.ActionMode.NONE });
this._manager.addMenu(this._menu); this._manager.addMenu(this._menu);
this._button.connect('clicked', () => { this._menu.toggle(); }); this._button.connect('clicked', () => { this._menu.toggle(); });

View File

@ -210,7 +210,7 @@ var IBusManager = new Lang.Class({
} }
this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME, this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
null, callback); null, callback || null);
}, },
preloadEngines(ids) { preloadEngines(ids) {

View File

@ -17,6 +17,7 @@ var InputMethod = new Lang.Class({
this._currentFocus = null; this._currentFocus = null;
this._preeditStr = ''; this._preeditStr = '';
this._preeditPos = 0; this._preeditPos = 0;
this._preeditVisible = false;
this._ibus = IBus.Bus.new_async(); this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', this._onConnected.bind(this)); this._ibus.connect('connected', this._onConnected.bind(this));
this._ibus.connect('disconnected', this._clear.bind(this)); this._ibus.connect('disconnected', this._clear.bind(this));
@ -80,6 +81,7 @@ var InputMethod = new Lang.Class({
this._enabled = false; this._enabled = false;
this._preeditStr = '' this._preeditStr = ''
this._preeditPos = 0; this._preeditPos = 0;
this._preeditVisible = false;
}, },
_emitRequestSurrounding() { _emitRequestSurrounding() {
@ -98,20 +100,27 @@ var InputMethod = new Lang.Class({
_onUpdatePreeditText(context, text, pos, visible) { _onUpdatePreeditText(context, text, pos, visible) {
if (text == null) if (text == null)
return; return;
this._preeditStr = text.get_text();
this._preeditPos = pos; let preedit = text.get_text();
if (visible) if (visible)
this.set_preedit_text(this._preeditStr, pos); this.set_preedit_text(preedit, pos);
else else if (this._preeditVisible)
this.set_preedit_text(null, pos); this.set_preedit_text(null, pos);
this._preeditStr = preedit;
this._preeditPos = pos;
this._preeditVisible = visible;
}, },
_onShowPreeditText(context) { _onShowPreeditText(context) {
this._preeditVisible = true;
this.set_preedit_text(this._preeditStr, this._preeditPos); this.set_preedit_text(this._preeditStr, this._preeditPos);
}, },
_onHidePreeditText(context) { _onHidePreeditText(context) {
this.set_preedit_text(null, this._preeditPos); this.set_preedit_text(null, this._preeditPos);
this._preeditVisible = false;
}, },
_onForwardKeyEvent(context, keyval, keycode, state) { _onForwardKeyEvent(context, keyval, keycode, state) {
@ -144,8 +153,11 @@ var InputMethod = new Lang.Class({
this._updateCapabilities(); this._updateCapabilities();
} }
// Unset any preedit text if (this._preeditStr) {
this.set_preedit_text(null, 0); // Unset any preedit text
this.set_preedit_text(null, 0);
this._preeditStr = null;
}
}, },
vfunc_reset() { vfunc_reset() {
@ -154,8 +166,11 @@ var InputMethod = new Lang.Class({
this._emitRequestSurrounding(); this._emitRequestSurrounding();
} }
// Unset any preedit text if (this._preeditStr) {
this.set_preedit_text(null, 0); // Unset any preedit text
this.set_preedit_text(null, 0);
this._preeditStr = null;
}
}, },
vfunc_set_cursor_location(rect) { vfunc_set_cursor_location(rect) {

View File

@ -52,11 +52,20 @@ var KeyboardManager = new Lang.Class({
this._current = null; this._current = null;
this._localeLayoutInfo = this._getLocaleLayout(); this._localeLayoutInfo = this._getLocaleLayout();
this._layoutInfos = {}; this._layoutInfos = {};
this._currentKeymap = null;
}, },
_applyLayoutGroup(group) { _applyLayoutGroup(group) {
let options = this._buildOptionsString(); let options = this._buildOptionsString();
let [layouts, variants] = this._buildGroupStrings(group); let [layouts, variants] = this._buildGroupStrings(group);
if (this._currentKeymap &&
this._currentKeymap.layouts == layouts &&
this._currentKeymap.variants == variants &&
this._currentKeymap.options == options)
return;
this._currentKeymap = {layouts, variants, options};
Meta.get_backend().set_keymap(layouts, variants, options); Meta.get_backend().set_keymap(layouts, variants, options);
}, },
@ -89,8 +98,6 @@ var KeyboardManager = new Lang.Class({
}, },
setUserLayouts(ids) { setUserLayouts(ids) {
let currentId = this._current ? this._current.id : null;
let currentGroupIndex = this._current ? this._current.groupIndex : null;
this._current = null; this._current = null;
this._layoutInfos = {}; this._layoutInfos = {};
@ -117,9 +124,6 @@ var KeyboardManager = new Lang.Class({
info.group = group; info.group = group;
info.groupIndex = groupIndex; info.groupIndex = groupIndex;
if (currentId == id && currentGroupIndex == groupIndex)
this._current = info;
i += 1; i += 1;
} }
}, },

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<gresources> <gresources>
<gresource prefix="/org/gnome/shell"> <gresource prefix="/org/gnome/shell">
<file>portalHelper/main.js</file>
<file>misc/config.js</file> <file>misc/config.js</file>
<file>misc/fileUtils.js</file> <file>misc/fileUtils.js</file>
<file>portalHelper/main.js</file> <file>misc/params.js</file>
</gresource> </gresource>
</gresources> </gresources>

View File

@ -1462,7 +1462,9 @@ var AppFolderPopup = new Lang.Class({
global.focus_manager.add_group(this.actor); global.focus_manager.add_group(this.actor);
source.actor.connect('destroy', () => { this.actor.destroy(); }); source.actor.connect('destroy', () => { this.actor.destroy(); });
this._grabHelper = new GrabHelper.GrabHelper(this.actor); this._grabHelper = new GrabHelper.GrabHelper(this.actor, {
actionMode: Shell.ActionMode.POPUP
});
this._grabHelper.addActor(Main.layoutManager.overviewGroup); this._grabHelper.addActor(Main.layoutManager.overviewGroup);
this.actor.connect('key-press-event', this._onKeyPress.bind(this)); this.actor.connect('key-press-event', this._onKeyPress.bind(this));
}, },

View File

@ -61,6 +61,15 @@ var BoxPointer = new Lang.Class({
this._sourceAlignment = 0.5; this._sourceAlignment = 0.5;
this._capturedEventId = 0; this._capturedEventId = 0;
this._muteInput(); this._muteInput();
this.actor.connect('destroy', this._onDestroy.bind(this));
},
_onDestroy() {
if (this._sourceActorDestroyId) {
this._sourceActor.disconnect(this._sourceActorDestroyId);
delete this._sourceActorDestroyId;
}
}, },
get arrowSide() { get arrowSide() {
@ -424,9 +433,26 @@ var BoxPointer = new Lang.Class({
// so that we can query the correct size. // so that we can query the correct size.
this.actor.show(); this.actor.show();
this._sourceActor = sourceActor; if (!this._sourceActor || sourceActor != this._sourceActor) {
if (this._sourceActorDestroyId) {
this._sourceActor.disconnect(this._sourceActorDestroyId);
delete this._sourceActorDestroyId;
}
this._sourceActor = sourceActor;
if (this._sourceActor) {
this._sourceActorDestroyId = this._sourceActor.connect('destroy', () => {
this._sourceActor = null;
delete this._sourceActorDestroyId;
})
}
}
this._arrowAlignment = alignment; this._arrowAlignment = alignment;
if (!this._sourceActor)
return;
this._reposition(); this._reposition();
this._updateFlip(); this._updateFlip();
}, },

View File

@ -52,6 +52,8 @@ var DashItemContainer = new Lang.Class({
this.animatingOut = false; this.animatingOut = false;
this.connect('destroy', () => { this.connect('destroy', () => {
if (this.child != null)
this.child.destroy();
this.label.destroy(); this.label.destroy();
}); });
}, },

View File

@ -184,7 +184,7 @@ var MessageDialogContent = new Lang.Class({
this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`); this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
}); });
let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE, let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
line_wrap: true }; line_wrap: true };
Object.assign(this._subtitle.clutter_text, textProps); Object.assign(this._subtitle.clutter_text, textProps);
Object.assign(this._body.clutter_text, textProps); Object.assign(this._body.clutter_text, textProps);

View File

@ -132,6 +132,16 @@ var _Draggable = new Lang.Class({
}, },
_onTouchEvent(actor, event) { _onTouchEvent(actor, event) {
// We only handle touch events here on wayland. On X11
// we do get emulated pointer events, which already works
// for single-touch cases. Besides, the X11 passive touch grab
// set up by Mutter will make us see first the touch events
// and later the pointer events, so it will look like two
// unrelated series of events, we want to avoid double handling
// in these cases.
if (!Meta.is_wayland_compositor())
return Clutter.EVENT_PROPAGATE;
if (event.type() != Clutter.EventType.TOUCH_BEGIN || if (event.type() != Clutter.EventType.TOUCH_BEGIN ||
!global.display.is_pointer_emulating_sequence(event.get_event_sequence())) !global.display.is_pointer_emulating_sequence(event.get_event_sequence()))
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;

View File

@ -418,6 +418,11 @@ var IconGrid = new Lang.Class({
}, },
_animationDone() { _animationDone() {
this._clonesAnimating.forEach(clone => {
clone.source.reactive = true;
clone.source.opacity = 255;
clone.destroy();
});
this._clonesAnimating = []; this._clonesAnimating = [];
this.emit('animation-done'); this.emit('animation-done');
}, },
@ -443,7 +448,6 @@ var IconGrid = new Lang.Class({
for (let index = 0; index < actors.length; index++) { for (let index = 0; index < actors.length; index++) {
let actor = actors[index]; let actor = actors[index];
actor.reactive = false;
actor.set_scale(0, 0); actor.set_scale(0, 0);
actor.set_pivot_point(0.5, 0.5); actor.set_pivot_point(0.5, 0.5);
@ -465,7 +469,6 @@ var IconGrid = new Lang.Class({
onComplete: () => { onComplete: () => {
if (isLastItem) if (isLastItem)
this._animationDone(); this._animationDone();
actor.reactive = true;
} }
}); });
} }
@ -538,10 +541,6 @@ var IconGrid = new Lang.Class({
onComplete: () => { onComplete: () => {
if (isLastItem) if (isLastItem)
this._animationDone(); this._animationDone();
actor.opacity = 255;
actor.reactive = true;
actorClone.destroy();
}}; }};
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
transition: 'easeInOutQuad', transition: 'easeInOutQuad',
@ -562,12 +561,8 @@ var IconGrid = new Lang.Class({
scale_x: scaleX, scale_x: scaleX,
scale_y: scaleY, scale_y: scaleY,
onComplete: () => { onComplete: () => {
if (isLastItem) { if (isLastItem)
this._animationDone(); this._animationDone();
this._restoreItemsOpacity();
}
actor.reactive = true;
actorClone.destroy();
}}; }};
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
transition: 'easeInOutQuad', transition: 'easeInOutQuad',
@ -581,12 +576,6 @@ var IconGrid = new Lang.Class({
} }
}, },
_restoreItemsOpacity() {
for (let index = 0; index < this._items.length; index++) {
this._items[index].actor.opacity = 255;
}
},
_getAllocatedChildSizeAndSpacing(child) { _getAllocatedChildSizeAndSpacing(child) {
let [,, natWidth, natHeight] = child.get_preferred_size(); let [,, natWidth, natHeight] = child.get_preferred_size();
let width = Math.min(this._getHItemSize(), natWidth); let width = Math.min(this._getHItemSize(), natWidth);

View File

@ -1322,6 +1322,7 @@ var MessageTray = new Lang.Class({
this._bannerBin.y = -this._banner.actor.height; this._bannerBin.y = -this._banner.actor.height;
this.actor.show(); this.actor.show();
Meta.disable_unredirect_for_display(global.display);
this._updateShowingNotification(); this._updateShowingNotification();
let [x, y, mods] = global.get_pointer(); let [x, y, mods] = global.get_pointer();
@ -1459,6 +1460,7 @@ var MessageTray = new Lang.Class({
this._pointerInNotification = false; this._pointerInNotification = false;
this._notificationRemoved = false; this._notificationRemoved = false;
Meta.enable_unredirect_for_display(global.display);
this._banner.actor.destroy(); this._banner.actor.destroy();
this._banner = null; this._banner = null;

View File

@ -77,10 +77,8 @@ var FdoNotificationDaemon = new Lang.Class({
bitsPerSample, nChannels, data] = hints['image-data']; bitsPerSample, nChannels, data] = hints['image-data'];
return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha, return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha,
bitsPerSample, width, height, rowStride); bitsPerSample, width, height, rowStride);
} else if (hints['image-path']) {
return new Gio.FileIcon({ file: Gio.File.new_for_path(hints['image-path']) });
} }
return null; return this._iconForNotificationData(hints['image-path']);
}, },
_fallbackIconForNotificationData(hints) { _fallbackIconForNotificationData(hints) {

View File

@ -118,15 +118,30 @@ var OsdWindow = new Lang.Class({
this._hideTimeoutId = 0; this._hideTimeoutId = 0;
this._reset(); this._reset();
Main.layoutManager.connect('monitors-changed', this.actor.connect('destroy', this._onDestroy.bind(this));
this._relayout.bind(this));
this._monitorsChangedId =
Main.layoutManager.connect('monitors-changed',
this._relayout.bind(this));
let themeContext = St.ThemeContext.get_for_stage(global.stage); let themeContext = St.ThemeContext.get_for_stage(global.stage);
themeContext.connect('notify::scale-factor', this._scaleChangedId =
this._relayout.bind(this)); themeContext.connect('notify::scale-factor',
this._relayout.bind(this));
this._relayout(); this._relayout();
Main.uiGroup.add_child(this.actor); Main.uiGroup.add_child(this.actor);
}, },
_onDestroy() {
if (this._monitorsChangedId)
Main.layoutManager.disconnect(this._monitorsChangedId);
this._monitorsChangedId = 0;
let themeContext = St.ThemeContext.get_for_stage(global.stage);
if (this._scaleChangedId)
themeContext.disconnect(this._scaleChangedId);
this._scaleChangedId = 0;
},
setIcon(icon) { setIcon(icon) {
this._icon.gicon = icon; this._icon.gicon = icon;
}, },
@ -204,8 +219,8 @@ var OsdWindow = new Lang.Class({
_reset() { _reset() {
this.actor.hide(); this.actor.hide();
this.setLabel(null); this.setLabel(null);
this.setLevel(null);
this.setMaxLevel(null); this.setMaxLevel(null);
this.setLevel(null);
}, },
_relayout() { _relayout() {
@ -253,8 +268,8 @@ var OsdWindowManager = new Lang.Class({
_showOsdWindow(monitorIndex, icon, label, level, maxLevel) { _showOsdWindow(monitorIndex, icon, label, level, maxLevel) {
this._osdWindows[monitorIndex].setIcon(icon); this._osdWindows[monitorIndex].setIcon(icon);
this._osdWindows[monitorIndex].setLabel(label); this._osdWindows[monitorIndex].setLabel(label);
this._osdWindows[monitorIndex].setLevel(level);
this._osdWindows[monitorIndex].setMaxLevel(maxLevel); this._osdWindows[monitorIndex].setMaxLevel(maxLevel);
this._osdWindows[monitorIndex].setLevel(level);
this._osdWindows[monitorIndex].show(); this._osdWindows[monitorIndex].show();
}, },

View File

@ -998,8 +998,8 @@ var Panel = new Lang.Class({
}, },
_toggleMenu(indicator) { _toggleMenu(indicator) {
if (!indicator) // menu not supported by current session mode if (!indicator || !indicator.container.visible)
return; return; // menu not supported by current session mode
let menu = indicator.menu; let menu = indicator.menu;
if (!indicator.actor.reactive) if (!indicator.actor.reactive)
@ -1093,6 +1093,7 @@ var Panel = new Lang.Class({
let windows = activeWorkspace.list_windows().filter(metaWindow => { let windows = activeWorkspace.list_windows().filter(metaWindow => {
return metaWindow.is_on_primary_monitor() && return metaWindow.is_on_primary_monitor() &&
metaWindow.showing_on_its_workspace() && metaWindow.showing_on_its_workspace() &&
!metaWindow.is_hidden() &&
metaWindow.get_window_type() != Meta.WindowType.DESKTOP; metaWindow.get_window_type() != Meta.WindowType.DESKTOP;
}); });

View File

@ -143,9 +143,10 @@ var PopupBaseMenuItem = new Lang.Class({
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
let state = event.get_state(); let state = event.get_state();
// if user has a modifier down (except capslock) // if user has a modifier down (except capslock and numlock)
// then don't handle the key press here // then don't handle the key press here
state &= ~Clutter.ModifierType.LOCK_MASK; state &= ~Clutter.ModifierType.LOCK_MASK;
state &= ~Clutter.ModifierType.MOD2_MASK;
state &= Clutter.ModifierType.MODIFIER_MASK; state &= Clutter.ModifierType.MODIFIER_MASK;
if (state) if (state)

View File

@ -9,6 +9,7 @@ const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Shell = imports.gi.Shell;
var EntryMenu = new Lang.Class({ var EntryMenu = new Lang.Class({
Name: 'ShellEntryMenu', Name: 'ShellEntryMenu',
@ -150,11 +151,12 @@ function addContextMenu(entry, params) {
if (entry.menu) if (entry.menu)
return; return;
params = Params.parse (params, { isPassword: false }); params = Params.parse (params, { isPassword: false, actionMode: Shell.ActionMode.POPUP });
entry.menu = new EntryMenu(entry); entry.menu = new EntryMenu(entry);
entry.menu.isPassword = params.isPassword; entry.menu.isPassword = params.isPassword;
entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry }); entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry },
{ actionMode: params.actionMode });
entry._menuManager.addMenu(entry.menu); entry._menuManager.addMenu(entry.menu);
// Add an event handler to both the entry and its clutter_text; the former // Add an event handler to both the entry and its clutter_text; the former

View File

@ -360,11 +360,14 @@ var InputSourceManager = new Lang.Class({
this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this)); this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this));
this._sourcesPerWindowChanged(); this._sourcesPerWindowChanged();
this._disableIBus = false; this._disableIBus = false;
this._reloading = false;
}, },
reload() { reload() {
this._reloading = true;
this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions); this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
this._inputSourcesChanged(); this._inputSourcesChanged();
this._reloading = false;
}, },
_ibusReadyCallback(im, ready) { _ibusReadyCallback(im, ready) {
@ -458,7 +461,15 @@ var InputSourceManager = new Lang.Class({
}, },
activateInputSource(is, interactive) { activateInputSource(is, interactive) {
KeyboardManager.holdKeyboard(); // The focus changes during holdKeyboard/releaseKeyboard may trick
// the client into hiding UI containing the currently focused entry.
// So holdKeyboard/releaseKeyboard are not called when
// 'set-content-type' signal is received.
// E.g. Focusing on a password entry in a popup in Xorg Firefox
// will emit 'set-content-type' signal.
// https://gitlab.gnome.org/GNOME/gnome-shell/issues/391
if (!this._reloading)
KeyboardManager.holdKeyboard();
this._keyboardManager.apply(is.xkbId); this._keyboardManager.apply(is.xkbId);
// All the "xkb:..." IBus engines simply "echo" back symbols, // All the "xkb:..." IBus engines simply "echo" back symbols,
@ -473,7 +484,10 @@ var InputSourceManager = new Lang.Class({
else else
engine = 'xkb:us::eng'; engine = 'xkb:us::eng';
this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); if (!this._reloading)
this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard);
else
this._ibusManager.setEngine(engine);
this._currentInputSourceChanged(is); this._currentInputSourceChanged(is);
if (interactive) if (interactive)

View File

@ -58,6 +58,9 @@ var AltSwitcher = new Lang.Class({
childToShow = this._standard; childToShow = this._standard;
} else if (this._alternate.visible) { } else if (this._alternate.visible) {
childToShow = this._alternate; childToShow = this._alternate;
} else {
this.actor.hide();
return;
} }
let childShown = this.actor.get_child(); let childShown = this.actor.get_child();
@ -79,7 +82,7 @@ var AltSwitcher = new Lang.Class({
global.sync_pointer(); global.sync_pointer();
} }
this.actor.visible = (childToShow != null); this.actor.show();
}, },
_onDestroy() { _onDestroy() {

View File

@ -478,6 +478,7 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({
this._dx = 0; this._dx = 0;
this._dy = 0; this._dy = 0;
actor.connect('captured-event', this._handleEvent.bind(this)); actor.connect('captured-event', this._handleEvent.bind(this));
this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
}, },
_checkActivated() { _checkActivated() {
@ -515,7 +516,11 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({
// Scale deltas up a bit to make it feel snappier // Scale deltas up a bit to make it feel snappier
this._dx += dx * 2; this._dx += dx * 2;
this._dy += dy * 2; if(!(this._touchpadSettings.get_boolean('natural-scroll')))
this._dy -= dy * 2;
else
this._dy += dy * 2;
this.emit('motion', this._dx, this._dy); this.emit('motion', this._dx, this._dy);
} else { } else {
if ((event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END && ! this._checkActivated()) || if ((event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END && ! this._checkActivated()) ||
@ -1044,6 +1049,10 @@ var WindowManager = new Lang.Class({
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace(); let activeWorkspace = workspaceManager.get_active_workspace();
// If overview is visible, we would mess up the positioning of windows.
if (Main.overview.visible)
return;
if (!this._switchData) if (!this._switchData)
this._prepareWorkspaceSwitch(activeWorkspace.index(), -1); this._prepareWorkspaceSwitch(activeWorkspace.index(), -1);
@ -1083,7 +1092,8 @@ var WindowManager = new Lang.Class({
if (newWs == activeWorkspace) { if (newWs == activeWorkspace) {
this._switchWorkspaceCancel(); this._switchWorkspaceCancel();
} else { } else {
this._switchData.gestureActivated = true; if (this._switchData)
this._switchData.gestureActivated = true;
this.actionMoveWorkspace(newWs); this.actionMoveWorkspace(newWs);
} }
}, },

View File

@ -465,6 +465,8 @@ var WindowOverlay = new Lang.Class({
title.clutter_text.ellipsize = Pango.EllipsizeMode.END; title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
windowClone.actor.label_actor = title; windowClone.actor.label_actor = title;
this._maxTitleWidth = -1;
this._updateCaptionId = metaWindow.connect('notify::title', w => { this._updateCaptionId = metaWindow.connect('notify::title', w => {
this.title.text = w.title; this.title.text = w.title;
this.title.text = this._getCaption(); this.title.text = this._getCaption();
@ -528,6 +530,13 @@ var WindowOverlay = new Lang.Class({
Math.max(this.borderSize, this.closeButton.width - this.closeButton._overlap)]; Math.max(this.borderSize, this.closeButton.width - this.closeButton._overlap)];
}, },
setMaxChromeWidth(max) {
if (this._maxTitleWidth == max)
return;
this._maxTitleWidth = max;
},
relayout(animate) { relayout(animate) {
let button = this.closeButton; let button = this.closeButton;
let title = this.title; let title = this.title;
@ -554,13 +563,26 @@ var WindowOverlay = new Lang.Class({
else else
button.set_position(Math.floor(buttonX), Math.floor(buttonY)); button.set_position(Math.floor(buttonX), Math.floor(buttonY));
let titleX = cloneX + (cloneWidth - title.width) / 2; // Clutter.Actor.get_preferred_width() will return the fixed width if
// one is set, so we need to reset the width by calling set_width(-1),
// to forward the call down to StLabel.
// We also need to save and restore the current width, otherwise the
// animation starts from the wrong point.
let prevTitleWidth = title.width;
title.set_width(-1);
let [titleMinWidth, titleNatWidth] = title.get_preferred_width(-1);
let titleWidth = Math.max(titleMinWidth,
Math.min(titleNatWidth, this._maxTitleWidth));
title.width = prevTitleWidth;
let titleX = cloneX + (cloneWidth - titleWidth) / 2;
let titleY = cloneY + cloneHeight - (title.height - this.borderSize) / 2; let titleY = cloneY + cloneHeight - (title.height - this.borderSize) / 2;
if (animate) { if (animate) {
this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY), title.width); this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY), titleWidth);
} else { } else {
title.width = title.width; title.width = titleWidth;
title.set_position(Math.floor(titleX), Math.floor(titleY)); title.set_position(Math.floor(titleX), Math.floor(titleY));
} }
@ -1306,6 +1328,12 @@ var Workspace = new Lang.Class({
let cloneHeight = clone.actor.height * scale; let cloneHeight = clone.actor.height * scale;
clone.slot = [x, y, cloneWidth, cloneHeight]; clone.slot = [x, y, cloneWidth, cloneHeight];
let cloneCenter = x + cloneWidth / 2;
let maxChromeWidth = 2 * Math.min(
cloneCenter - area.x,
area.x + area.width - cloneCenter);
overlay.setMaxChromeWidth(Math.round(maxChromeWidth));
if (overlay && (initialPositioning || !clone.positioned)) if (overlay && (initialPositioning || !clone.positioned))
overlay.hide(); overlay.hide();

View File

@ -31,7 +31,7 @@ var WORKSPACE_CUT_SIZE = 10;
var WORKSPACE_KEEP_ALIVE_TIME = 100; var WORKSPACE_KEEP_ALIVE_TIME = 100;
var OVERRIDE_SCHEMA = 'org.gnome.shell.overrides'; var MUTTER_SCHEMA = 'org.gnome.mutter';
/* A layout manager that requests size only for primary_actor, but then allocates /* A layout manager that requests size only for primary_actor, but then allocates
all using a fixed layout */ all using a fixed layout */
@ -674,7 +674,7 @@ var ThumbnailsBox = new Lang.Class({
Main.overview.connect('window-drag-cancelled', Main.overview.connect('window-drag-cancelled',
this._onDragCancelled.bind(this)); this._onDragCancelled.bind(this));
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA }); this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
this._settings.connect('changed::dynamic-workspaces', this._settings.connect('changed::dynamic-workspaces',
this._updateSwitcherVisibility.bind(this)); this._updateSwitcherVisibility.bind(this));

View File

@ -24,7 +24,7 @@ var AnimationType = {
FADE: 1 FADE: 1
}; };
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides'; const MUTTER_SCHEMA = 'org.gnome.mutter';
var WorkspacesViewBase = new Lang.Class({ var WorkspacesViewBase = new Lang.Class({
Name: 'WorkspacesViewBase', Name: 'WorkspacesViewBase',
@ -473,7 +473,7 @@ var WorkspacesDisplay = new Lang.Class({
this._workspacesViews = []; this._workspacesViews = [];
this._primaryScrollAdjustment = null; this._primaryScrollAdjustment = null;
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA }); this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
this._settings.connect('changed::workspaces-only-on-primary', this._settings.connect('changed::workspaces-only-on-primary',
this._workspacesOnlyOnPrimaryChanged.bind(this)); this._workspacesOnlyOnPrimaryChanged.bind(this));
this._workspacesOnlyOnPrimaryChanged(); this._workspacesOnlyOnPrimaryChanged();

View File

@ -1,5 +1,5 @@
project('gnome-shell', 'c', project('gnome-shell', 'c',
version: '3.30.1', version: '3.30.2',
meson_version: '>= 0.47.0', meson_version: '>= 0.47.0',
license: 'GPLv2+' license: 'GPLv2+'
) )

1767
po/eo.po

File diff suppressed because it is too large Load Diff

View File

@ -1635,7 +1635,7 @@ msgstr "Desconectado"
#: js/ui/status/bluetooth.js:141 #: js/ui/status/bluetooth.js:141
msgid "On" msgid "On"
msgstr "Encender" msgstr "Encendido"
#: js/ui/status/brightness.js:44 #: js/ui/status/brightness.js:44
msgid "Brightness" msgid "Brightness"

812
po/eu.po

File diff suppressed because it is too large Load Diff

810
po/fa.po

File diff suppressed because it is too large Load Diff

460
po/fr.po

File diff suppressed because it is too large Load Diff

763
po/gd.po

File diff suppressed because it is too large Load Diff

921
po/hr.po

File diff suppressed because it is too large Load Diff

789
po/is.po

File diff suppressed because it is too large Load Diff

936
po/it.po

File diff suppressed because it is too large Load Diff

940
po/lv.po

File diff suppressed because it is too large Load Diff

1002
po/ml.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

937
po/sk.po

File diff suppressed because it is too large Load Diff

View File

@ -248,14 +248,17 @@ st_button_touch_event (ClutterActor *actor,
if (event->type == CLUTTER_TOUCH_BEGIN && !priv->press_sequence) if (event->type == CLUTTER_TOUCH_BEGIN && !priv->press_sequence)
{ {
clutter_input_device_sequence_grab (device, sequence, actor); clutter_input_device_sequence_grab (device, sequence, actor);
st_button_press (button, device, 0, sequence); if (!clutter_event_is_pointer_emulated ((ClutterEvent*) event))
st_button_press (button, device, 0, sequence);
return CLUTTER_EVENT_STOP; return CLUTTER_EVENT_STOP;
} }
else if (event->type == CLUTTER_TOUCH_END && else if (event->type == CLUTTER_TOUCH_END &&
priv->device == device && priv->device == device &&
priv->press_sequence == sequence) priv->press_sequence == sequence)
{ {
st_button_release (button, device, mask, 0, sequence); if (!clutter_event_is_pointer_emulated ((ClutterEvent*) event))
st_button_release (button, device, mask, 0, sequence);
clutter_input_device_sequence_ungrab (device, sequence); clutter_input_device_sequence_ungrab (device, sequence);
return CLUTTER_EVENT_STOP; return CLUTTER_EVENT_STOP;
} }

View File

@ -984,7 +984,7 @@ file_changed_cb (GFileMonitor *monitor,
char *key; char *key;
guint file_hash; guint file_hash;
if (event_type != G_FILE_MONITOR_EVENT_CHANGED) if (event_type != G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT)
return; return;
file_hash = g_file_hash (file); file_hash = g_file_hash (file);