Compare commits
126 Commits
3.27.92
...
cherry-pic
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1045b35c8b | ||
![]() |
24cdcc56da | ||
![]() |
1b28cdfbf4 | ||
![]() |
a73294312f | ||
![]() |
5e7a7e31a1 | ||
![]() |
8111286463 | ||
![]() |
06c6ecc15b | ||
![]() |
36f9dcd2bd | ||
![]() |
219118e633 | ||
![]() |
1e929357e0 | ||
![]() |
e7463e38ca | ||
![]() |
420c1cbfd1 | ||
![]() |
d53bd98532 | ||
![]() |
128a501b9a | ||
![]() |
b29e243fec | ||
![]() |
fa2ddcc52f | ||
![]() |
fbf194f6a1 | ||
![]() |
5610a2435d | ||
![]() |
a5b36fc7f4 | ||
![]() |
923d80bba8 | ||
![]() |
9e196d2765 | ||
![]() |
94897492be | ||
![]() |
6baf82eb83 | ||
![]() |
65d27aaa43 | ||
![]() |
176aaa4a97 | ||
![]() |
5ae5811155 | ||
![]() |
e027af9548 | ||
![]() |
73649a0d6a | ||
![]() |
7dbcd26619 | ||
![]() |
f30ec4a4c8 | ||
![]() |
c04289853f | ||
![]() |
b72b773d87 | ||
![]() |
da7cd2807f | ||
![]() |
20373ba64e | ||
![]() |
025f6eb68e | ||
![]() |
dc5df5c4c9 | ||
![]() |
81db908339 | ||
![]() |
706a2259b8 | ||
![]() |
e94af71430 | ||
![]() |
a662e7bb87 | ||
![]() |
0b82388c49 | ||
![]() |
b359b937e9 | ||
![]() |
98fb7c33f2 | ||
![]() |
4dfc2e0fd1 | ||
![]() |
9152d3a286 | ||
![]() |
ba33a05dd2 | ||
![]() |
ddb309815c | ||
![]() |
6a796675bd | ||
![]() |
d08497414f | ||
![]() |
82886b7ee8 | ||
![]() |
dca43c7b24 | ||
![]() |
af50a7829f | ||
![]() |
67cb02d46a | ||
![]() |
721ce54037 | ||
![]() |
445eed40a7 | ||
![]() |
fddd122956 | ||
![]() |
df1b46eee2 | ||
![]() |
bf318df7f3 | ||
![]() |
2a2f3c981e | ||
![]() |
8e5eab0498 | ||
![]() |
6ed21e1ce0 | ||
![]() |
9c51c87d8c | ||
![]() |
db2245d60b | ||
![]() |
f26cc3ac23 | ||
![]() |
02c5b4b947 | ||
![]() |
df57829ea1 | ||
![]() |
da96408098 | ||
![]() |
4b2e0247af | ||
![]() |
2c617e5a3a | ||
![]() |
4ff7e84c51 | ||
![]() |
9f76b6e4a2 | ||
![]() |
0ac0f7e85b | ||
![]() |
73b00ff1a7 | ||
![]() |
a52597ac5b | ||
![]() |
9a2597f80b | ||
![]() |
e1ed4b25e1 | ||
![]() |
c70b18764b | ||
![]() |
4398516520 | ||
![]() |
220514d10e | ||
![]() |
18312d9ccd | ||
![]() |
234b1441e4 | ||
![]() |
e909db5848 | ||
![]() |
702338bc7d | ||
![]() |
7c9dbc66d9 | ||
![]() |
0d031dc20f | ||
![]() |
b476e851b7 | ||
![]() |
a27be6a540 | ||
![]() |
4b6a57fabe | ||
![]() |
92758890bb | ||
![]() |
5b10d157fe | ||
![]() |
5cc42b18b0 | ||
![]() |
cb4252e888 | ||
![]() |
09d3cdb023 | ||
![]() |
71515a8a11 | ||
![]() |
11ca8dd54f | ||
![]() |
e00f22ebe6 | ||
![]() |
13390543b0 | ||
![]() |
de95ced92c | ||
![]() |
f6a08472a0 | ||
![]() |
9f7b101437 | ||
![]() |
9c0707d4dc | ||
![]() |
78a92fb6be | ||
![]() |
01509cf1a5 | ||
![]() |
61e9f51274 | ||
![]() |
201bd9d42e | ||
![]() |
8a78f08f6c | ||
![]() |
a5e54f9712 | ||
![]() |
526834e39b | ||
![]() |
bdde2476d2 | ||
![]() |
3171f9debe | ||
![]() |
0e2aeac5f9 | ||
![]() |
788fb5547c | ||
![]() |
c4d2c0ee64 | ||
![]() |
977686a77a | ||
![]() |
44b29f210c | ||
![]() |
36c7d65ccf | ||
![]() |
b81d24fdb4 | ||
![]() |
bfdbee8115 | ||
![]() |
4a17c8f4a9 | ||
![]() |
d4f67a7d42 | ||
![]() |
d5769ae409 | ||
![]() |
f356b61e5a | ||
![]() |
398768dcbd | ||
![]() |
272d5b6e4a | ||
![]() |
a479aa2594 | ||
![]() |
f48d620ac5 |
52
NEWS
52
NEWS
@@ -1,3 +1,55 @@
|
|||||||
|
3.28.3
|
||||||
|
======
|
||||||
|
* Fix lagging pointer when zoomed [Daniel; #682013]
|
||||||
|
* Fix "Clear All" for calendar events [Florian; #325]
|
||||||
|
* Misc. bug fixes [Florian, Mario, Marco; #136, #214, #788931, #791233]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Florian Müllner, Mario Sanchez Prada, Joe Rabinoff,
|
||||||
|
Didier Roche, Marco Trevisan (Treviño), Daniel van Vugt
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Pieter Schalk Schoeman [af], Gun Chleoc [gd]
|
||||||
|
|
||||||
|
3.28.2
|
||||||
|
======
|
||||||
|
* Fix lock-up on cancelling polkit dialog [Florian; #221]
|
||||||
|
* Guard against untimely keyboard map changes [Carlos; #240]
|
||||||
|
* Fix blurriness of OSD under some resolutions [Silvère; #782011]
|
||||||
|
* Fix icons in search provider results [Florian; #249]
|
||||||
|
* Misc. bug fixes [Marco, Florian; #792687, #781471]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, Silvère Latchurié, Florian Müllner, Mario Sanchez Prada,
|
||||||
|
Ray Strode, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Stas Solovey [ru], Rafael Fontenelle [pt_BR]
|
||||||
|
|
||||||
|
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
|
3.27.92
|
||||||
=======
|
=======
|
||||||
* Misc. bug fixes [Florian; #64, #66, #72]
|
* Misc. bug fixes [Florian; #64, #66, #72]
|
||||||
|
@@ -1111,7 +1111,7 @@ StScrollBar {
|
|||||||
.aggregate-menu {
|
.aggregate-menu {
|
||||||
min-width: 21em;
|
min-width: 21em;
|
||||||
.popup-menu-icon { padding: 0 4px; }
|
.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 */
|
&:ltr { /* 12px spacing + 2*4px padding */
|
||||||
padding-left: 20px; margin-left: 1.09em; }
|
padding-left: 20px; margin-left: 1.09em; }
|
||||||
&:rtl { /* 12px spacing + 2*4px padding */
|
&:rtl { /* 12px spacing + 2*4px padding */
|
||||||
|
@@ -242,11 +242,11 @@ var AuthPrompt = new Lang.Class({
|
|||||||
this.emit('prompted');
|
this.emit('prompted');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onVerificationFailed() {
|
_onVerificationFailed(userVerifier, canRetry) {
|
||||||
this._queryingService = null;
|
this._queryingService = null;
|
||||||
this.clear();
|
this.clear();
|
||||||
|
|
||||||
this.updateSensitivity(true);
|
this.updateSensitivity(canRetry);
|
||||||
this.setActorInDefaultButtonWell(null);
|
this.setActorInDefaultButtonWell(null);
|
||||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
||||||
},
|
},
|
||||||
@@ -439,6 +439,7 @@ var AuthPrompt = new Lang.Class({
|
|||||||
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
||||||
this.cancelButton.reactive = true;
|
this.cancelButton.reactive = true;
|
||||||
this.nextButton.label = _("Next");
|
this.nextButton.label = _("Next");
|
||||||
|
this._preemptiveAnswer = null;
|
||||||
|
|
||||||
if (this._userVerifier)
|
if (this._userVerifier)
|
||||||
this._userVerifier.cancel();
|
this._userVerifier.cancel();
|
||||||
|
@@ -534,12 +534,13 @@ var ShellUserVerifier = new Lang.Class({
|
|||||||
_verificationFailed(retry) {
|
_verificationFailed(retry) {
|
||||||
// For Not Listed / enterprise logins, immediately reset
|
// For Not Listed / enterprise logins, immediately reset
|
||||||
// the dialog
|
// the dialog
|
||||||
// Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
|
// Otherwise, when in login mode we allow ALLOWED_FAILURES attempts.
|
||||||
// go back to the welcome screen.
|
// After that, we go back to the welcome screen.
|
||||||
|
|
||||||
this._failCounter++;
|
this._failCounter++;
|
||||||
let canRetry = retry && this._userName &&
|
let canRetry = retry && this._userName &&
|
||||||
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
|
(this._reauthOnly ||
|
||||||
|
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY));
|
||||||
|
|
||||||
if (canRetry) {
|
if (canRetry) {
|
||||||
if (!this.hasPendingMessages) {
|
if (!this.hasPendingMessages) {
|
||||||
@@ -562,7 +563,7 @@ var ShellUserVerifier = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emit('verification-failed');
|
this.emit('verification-failed', canRetry);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onConversationStopped(client, serviceName) {
|
_onConversationStopped(client, serviceName) {
|
||||||
|
@@ -115,6 +115,11 @@ var IBusManager = new Lang.Class({
|
|||||||
object_path: IBus.PATH_PANEL });
|
object_path: IBus.PATH_PANEL });
|
||||||
this._candidatePopup.setPanelService(this._panelService);
|
this._candidatePopup.setPanelService(this._panelService);
|
||||||
this._panelService.connect('update-property', this._updateProperty.bind(this));
|
this._panelService.connect('update-property', this._updateProperty.bind(this));
|
||||||
|
this._panelService.connect('set-cursor-location', (ps, x, y, w, h) => {
|
||||||
|
let cursorLocation = { x, y, width: w, height: h };
|
||||||
|
this.emit('set-cursor-location', cursorLocation);
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// IBus versions older than 1.5.10 have a bug which
|
// IBus versions older than 1.5.10 have a bug which
|
||||||
// causes spurious set-content-type emissions when
|
// causes spurious set-content-type emissions when
|
||||||
@@ -200,7 +205,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) {
|
||||||
|
@@ -188,8 +188,7 @@ var InputMethod = new Lang.Class({
|
|||||||
vfunc_filter_key_event(event) {
|
vfunc_filter_key_event(event) {
|
||||||
if (!this._context || !this._enabled)
|
if (!this._context || !this._enabled)
|
||||||
return false;
|
return false;
|
||||||
if (!this._currentSource ||
|
if (!this._currentSource)
|
||||||
this._currentSource.type == Keyboard.INPUT_SOURCE_TYPE_XKB)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
let state = event.get_state();
|
let state = event.get_state();
|
||||||
|
@@ -89,6 +89,8 @@ 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 = {};
|
||||||
|
|
||||||
@@ -115,6 +117,9 @@ 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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -236,11 +236,12 @@ var ObjectManager = new Lang.Class({
|
|||||||
_onNameVanished() {
|
_onNameVanished() {
|
||||||
let objectPaths = Object.keys(this._objects);
|
let objectPaths = Object.keys(this._objects);
|
||||||
for (let i = 0; i < objectPaths.length; i++) {
|
for (let i = 0; i < objectPaths.length; i++) {
|
||||||
let object = this._objects[objectPaths];
|
let objectPath = objectPaths[i];
|
||||||
|
let object = this._objects[objectPath];
|
||||||
|
|
||||||
let interfaceNames = Object.keys(object);
|
let interfaceNames = Object.keys(object);
|
||||||
for (let j = 0; i < interfaceNames.length; i++) {
|
for (let j = 0; j < interfaceNames.length; j++) {
|
||||||
let interfaceName = interfaceNames[i];
|
let interfaceName = interfaceNames[j];
|
||||||
|
|
||||||
if (object[interfaceName])
|
if (object[interfaceName])
|
||||||
this._removeInterface(objectPath, interfaceName);
|
this._removeInterface(objectPath, interfaceName);
|
||||||
|
@@ -17,7 +17,7 @@ const Params = imports.misc.params;
|
|||||||
var SCROLL_TIME = 0.1;
|
var SCROLL_TIME = 0.1;
|
||||||
|
|
||||||
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||||
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
const _balancedParens = '\\([^\\s()<>]+\\)';
|
||||||
const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
|
const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
|
||||||
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
|
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
|
||||||
|
|
||||||
|
@@ -13,6 +13,7 @@ const RENAMED_DESKTOP_IDS = {
|
|||||||
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
||||||
'empathy.desktop': 'org.gnome.Empathy.desktop',
|
'empathy.desktop': 'org.gnome.Empathy.desktop',
|
||||||
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
||||||
|
'evolution.desktop': 'org.gnome.Evolution.desktop',
|
||||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||||
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
||||||
'geary.desktop': 'org.gnome.Geary.desktop',
|
'geary.desktop': 'org.gnome.Geary.desktop',
|
||||||
@@ -34,6 +35,7 @@ const RENAMED_DESKTOP_IDS = {
|
|||||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||||
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
||||||
|
'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
|
||||||
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
||||||
'gnomine.desktop': 'gnome-mines.desktop',
|
'gnomine.desktop': 'gnome-mines.desktop',
|
||||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
||||||
|
@@ -802,6 +802,8 @@ var NotificationMessage = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
|
this.parent();
|
||||||
|
|
||||||
if (this._updatedId)
|
if (this._updatedId)
|
||||||
this.notification.disconnect(this._updatedId);
|
this.notification.disconnect(this._updatedId);
|
||||||
this._updatedId = 0;
|
this._updatedId = 0;
|
||||||
@@ -821,6 +823,8 @@ var EventsSection = new Lang.Class({
|
|||||||
this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
|
this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
|
||||||
this._eventSource = new EmptyEventSource();
|
this._eventSource = new EmptyEventSource();
|
||||||
|
|
||||||
|
this._messageById = new Map();
|
||||||
|
|
||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
this._title = new St.Button({ style_class: 'events-section-title',
|
this._title = new St.Button({ style_class: 'events-section-title',
|
||||||
@@ -875,20 +879,32 @@ var EventsSection = new Lang.Class({
|
|||||||
|
|
||||||
this._reloading = true;
|
this._reloading = true;
|
||||||
|
|
||||||
this._list.destroy_all_children();
|
|
||||||
|
|
||||||
let periodBegin = _getBeginningOfDay(this._date);
|
let periodBegin = _getBeginningOfDay(this._date);
|
||||||
let periodEnd = _getEndOfDay(this._date);
|
let periodEnd = _getEndOfDay(this._date);
|
||||||
let events = this._eventSource.getEvents(periodBegin, periodEnd);
|
let events = this._eventSource.getEvents(periodBegin, periodEnd);
|
||||||
|
|
||||||
|
let ids = events.map(e => e.id);
|
||||||
|
this._messageById.forEach((message, id) => {
|
||||||
|
if (ids.includes(id))
|
||||||
|
return;
|
||||||
|
this._messageById.delete(id);
|
||||||
|
this.removeMessage(message);
|
||||||
|
});
|
||||||
|
|
||||||
for (let i = 0; i < events.length; i++) {
|
for (let i = 0; i < events.length; i++) {
|
||||||
let event = events[i];
|
let event = events[i];
|
||||||
|
|
||||||
let message = new EventMessage(event, this._date);
|
let message = this._messageById.get(event.id);
|
||||||
message.connect('close', () => {
|
if (!message) {
|
||||||
this._ignoreEvent(event);
|
message = new EventMessage(event, this._date);
|
||||||
});
|
message.connect('close', () => {
|
||||||
this.addMessage(message, false);
|
this._ignoreEvent(event);
|
||||||
|
});
|
||||||
|
this._messageById.set(event.id, message);
|
||||||
|
this.addMessage(message, false);
|
||||||
|
} else {
|
||||||
|
this.moveMessage(message, i, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._reloading = false;
|
this._reloading = false;
|
||||||
|
@@ -210,6 +210,10 @@ var AutomountManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onVolumeRemoved(monitor, volume) {
|
_onVolumeRemoved(monitor, volume) {
|
||||||
|
if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) {
|
||||||
|
Mainloop.source_remove(volume._allowAutorunExpireId);
|
||||||
|
delete volume._allowAutorunExpireId;
|
||||||
|
}
|
||||||
this._volumeQueue =
|
this._volumeQueue =
|
||||||
this._volumeQueue.filter(element => (element != volume));
|
this._volumeQueue.filter(element => (element != volume));
|
||||||
},
|
},
|
||||||
@@ -234,8 +238,10 @@ var AutomountManager = new Lang.Class({
|
|||||||
_allowAutorunExpire(volume) {
|
_allowAutorunExpire(volume) {
|
||||||
let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => {
|
let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => {
|
||||||
volume.allowAutorun = false;
|
volume.allowAutorun = false;
|
||||||
|
delete volume._allowAutorunExpireId;
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
|
volume._allowAutorunExpireId = id;
|
||||||
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -655,7 +655,7 @@ var NetworkAgent = new Lang.Class({
|
|||||||
switch (connectionType) {
|
switch (connectionType) {
|
||||||
case '802-11-wireless':
|
case '802-11-wireless':
|
||||||
let wirelessSetting = connection.get_setting_wireless();
|
let wirelessSetting = connection.get_setting_wireless();
|
||||||
let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid());
|
let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
|
||||||
title = _("Authentication required by wireless network");
|
title = _("Authentication required by wireless network");
|
||||||
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
|
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
|
||||||
break;
|
break;
|
||||||
@@ -765,57 +765,29 @@ var NetworkAgent = new Lang.Class({
|
|||||||
this._vpnCacheBuilt = true;
|
this._vpnCacheBuilt = true;
|
||||||
this._vpnBinaries = { };
|
this._vpnBinaries = { };
|
||||||
|
|
||||||
try {
|
NM.VpnPluginInfo.list_load().forEach(plugin => {
|
||||||
let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
|
let service = plugin.get_service();
|
||||||
let info;
|
let fileName = plugin.get_auth_dialog();
|
||||||
|
let supportsHints = plugin.supports_hints();
|
||||||
|
let externalUIMode = false;
|
||||||
|
|
||||||
while ((info = fileEnum.next_file(null))) {
|
let prop = plugin.lookup_property('GNOME', 'supports-external-ui-mode');
|
||||||
let name = info.get_name();
|
if (prop) {
|
||||||
if (name.substr(-5) != '.name')
|
prop = prop.trim().toLowerCase();
|
||||||
continue;
|
externalUIMode = ['true', 'yes', 'on', '1'].includes(prop);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} 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;
|
var Component = NetworkAgent;
|
||||||
|
@@ -16,6 +16,7 @@ const PolkitAgent = imports.gi.PolkitAgent;
|
|||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
const Components = imports.ui.components;
|
const Components = imports.ui.components;
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
@@ -39,6 +40,10 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
this.userNames = userNames;
|
this.userNames = userNames;
|
||||||
this._wasDismissed = false;
|
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 icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
||||||
let title = _("Authentication Required");
|
let title = _("Authentication Required");
|
||||||
|
|
||||||
@@ -193,6 +198,14 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
this._session.initiate();
|
this._session.initiate();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
close(timestamp) {
|
||||||
|
this.parent(timestamp);
|
||||||
|
|
||||||
|
if (this._sessionUpdatedId)
|
||||||
|
Main.sessionMode.disconnect(this._sessionUpdatedId);
|
||||||
|
this._sessionUpdatedId = 0;
|
||||||
|
},
|
||||||
|
|
||||||
_ensureOpen() {
|
_ensureOpen() {
|
||||||
// NOTE: ModalDialog.open() is safe to call if the dialog is
|
// NOTE: ModalDialog.open() is safe to call if the dialog is
|
||||||
// already open - it just returns true without side-effects
|
// already open - it just returns true without side-effects
|
||||||
@@ -348,6 +361,7 @@ var AuthenticationAgent = new Lang.Class({
|
|||||||
this._native = new Shell.PolkitAuthenticationAgent();
|
this._native = new Shell.PolkitAuthenticationAgent();
|
||||||
this._native.connect('initiate', this._onInitiate.bind(this));
|
this._native.connect('initiate', this._onInitiate.bind(this));
|
||||||
this._native.connect('cancel', this._onCancel.bind(this));
|
this._native.connect('cancel', this._onCancel.bind(this));
|
||||||
|
this._sessionUpdatedId = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
enable() {
|
enable() {
|
||||||
@@ -367,6 +381,17 @@ var AuthenticationAgent = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) {
|
_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);
|
this._currentDialog = new AuthenticationDialog(actionId, message, cookie, userNames);
|
||||||
|
|
||||||
// We actually don't want to open the dialog until we know for
|
// We actually don't want to open the dialog until we know for
|
||||||
@@ -396,6 +421,10 @@ var AuthenticationAgent = new Lang.Class({
|
|||||||
this._currentDialog.destroySession();
|
this._currentDialog.destroySession();
|
||||||
this._currentDialog = null;
|
this._currentDialog = null;
|
||||||
|
|
||||||
|
if (this._sessionUpdatedId)
|
||||||
|
Main.sessionMode.disconnect(this._sessionUpdatedId);
|
||||||
|
this._sessionUpdatedId = 0;
|
||||||
|
|
||||||
this._native.complete(dismissed);
|
this._native.complete(dismissed);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@@ -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();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@@ -153,8 +153,10 @@ var WorldClocksSection = new Lang.Class({
|
|||||||
for (let i = 0; i < this._locations.length; i++) {
|
for (let i = 0; i < this._locations.length; i++) {
|
||||||
let l = this._locations[i].location;
|
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',
|
let label = new St.Label({ style_class: 'world-clocks-city',
|
||||||
text: l.get_city_name(),
|
text: name,
|
||||||
x_align: Clutter.ActorAlign.START,
|
x_align: Clutter.ActorAlign.START,
|
||||||
x_expand: true });
|
x_expand: true });
|
||||||
|
|
||||||
|
22
js/ui/dnd.js
22
js/ui/dnd.js
@@ -396,10 +396,15 @@ var _Draggable = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_pickTargetActor() {
|
||||||
|
return this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
||||||
|
this._dragX, this._dragY);
|
||||||
|
},
|
||||||
|
|
||||||
_updateDragHover() {
|
_updateDragHover() {
|
||||||
this._updateHoverId = 0;
|
this._updateHoverId = 0;
|
||||||
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
let target = this._pickTargetActor();
|
||||||
this._dragX, this._dragY);
|
|
||||||
let dragEvent = {
|
let dragEvent = {
|
||||||
x: this._dragX,
|
x: this._dragX,
|
||||||
y: this._dragY,
|
y: this._dragY,
|
||||||
@@ -407,6 +412,18 @@ var _Draggable = new Lang.Class({
|
|||||||
source: this.actor._delegate,
|
source: this.actor._delegate,
|
||||||
targetActor: target
|
targetActor: target
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let targetActorDestroyHandlerId;
|
||||||
|
let handleTargetActorDestroyClosure;
|
||||||
|
handleTargetActorDestroyClosure = () => {
|
||||||
|
target = this._pickTargetActor();
|
||||||
|
dragEvent.targetActor = target;
|
||||||
|
targetActorDestroyHandlerId =
|
||||||
|
target.connect('destroy', handleTargetActorDestroyClosure);
|
||||||
|
};
|
||||||
|
targetActorDestroyHandlerId =
|
||||||
|
target.connect('destroy', handleTargetActorDestroyClosure);
|
||||||
|
|
||||||
for (let i = 0; i < dragMonitors.length; i++) {
|
for (let i = 0; i < dragMonitors.length; i++) {
|
||||||
let motionFunc = dragMonitors[i].dragMotion;
|
let motionFunc = dragMonitors[i].dragMotion;
|
||||||
if (motionFunc) {
|
if (motionFunc) {
|
||||||
@@ -417,6 +434,7 @@ var _Draggable = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dragEvent.targetActor.disconnect(targetActorDestroyHandlerId);
|
||||||
|
|
||||||
while (target) {
|
while (target) {
|
||||||
if (target._delegate && target._delegate.handleDragOver) {
|
if (target._delegate && target._delegate.handleDragOver) {
|
||||||
|
@@ -760,7 +760,7 @@ var EndSessionDialog = new Lang.Class({
|
|||||||
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
|
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
|
||||||
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
||||||
|
|
||||||
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText);
|
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
|
||||||
this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
|
this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
|
||||||
this._checkBox.actor.checked = (updatePrepared && updateTriggered);
|
this._checkBox.actor.checked = (updatePrepared && updateTriggered);
|
||||||
|
|
||||||
|
@@ -76,6 +76,7 @@ function disableExtension(uuid) {
|
|||||||
if (extension.stylesheet) {
|
if (extension.stylesheet) {
|
||||||
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
|
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
|
||||||
theme.unload_stylesheet(extension.stylesheet);
|
theme.unload_stylesheet(extension.stylesheet);
|
||||||
|
delete extension.stylesheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -115,13 +116,18 @@ function enableExtension(uuid) {
|
|||||||
extensionOrder.push(uuid);
|
extensionOrder.push(uuid);
|
||||||
|
|
||||||
let stylesheetNames = [global.session_mode + '.css', 'stylesheet.css'];
|
let stylesheetNames = [global.session_mode + '.css', 'stylesheet.css'];
|
||||||
|
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
|
||||||
for (let i = 0; i < stylesheetNames.length; i++) {
|
for (let i = 0; i < stylesheetNames.length; i++) {
|
||||||
let stylesheetFile = extension.dir.get_child(stylesheetNames[i]);
|
try {
|
||||||
if (stylesheetFile.query_exists(null)) {
|
let stylesheetFile = extension.dir.get_child(stylesheetNames[i]);
|
||||||
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
|
|
||||||
theme.load_stylesheet(stylesheetFile);
|
theme.load_stylesheet(stylesheetFile);
|
||||||
extension.stylesheet = stylesheetFile;
|
extension.stylesheet = stylesheetFile;
|
||||||
break;
|
break;
|
||||||
|
} catch (e) {
|
||||||
|
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
|
||||||
|
continue; // not an error
|
||||||
|
log(`Failed to load stylesheet for extension ${uuid}: ${e.message}`);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,6 +137,10 @@ function enableExtension(uuid) {
|
|||||||
_signals.emit('extension-state-changed', extension);
|
_signals.emit('extension-state-changed', extension);
|
||||||
return;
|
return;
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
|
if (extension.stylesheet) {
|
||||||
|
theme.unload_stylesheet(extension.stylesheet);
|
||||||
|
delete extension.stylesheet;
|
||||||
|
}
|
||||||
logExtensionError(uuid, e);
|
logExtensionError(uuid, e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -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');
|
||||||
},
|
},
|
||||||
@@ -538,10 +543,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 +563,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 +578,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);
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const FocusCaretTracker = imports.ui.focusCaretTracker;
|
|
||||||
const Atspi = imports.gi.Atspi;
|
const Atspi = imports.gi.Atspi;
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Gdk = imports.gi.Gdk;
|
const Gdk = imports.gi.Gdk;
|
||||||
@@ -13,6 +12,7 @@ const Signals = imports.signals;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const InputSourceManager = imports.ui.status.keyboard;
|
const InputSourceManager = imports.ui.status.keyboard;
|
||||||
|
|
||||||
|
const IBusManager = imports.misc.ibusManager;
|
||||||
const BoxPointer = imports.ui.boxpointer;
|
const BoxPointer = imports.ui.boxpointer;
|
||||||
const Layout = imports.ui.layout;
|
const Layout = imports.ui.layout;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@@ -261,6 +261,7 @@ var Key = new Lang.Class({
|
|||||||
this._extended_keyboard = null;
|
this._extended_keyboard = null;
|
||||||
this._pressTimeoutId = 0;
|
this._pressTimeoutId = 0;
|
||||||
this._capturedPress = false;
|
this._capturedPress = false;
|
||||||
|
|
||||||
this._capturedEventId = 0;
|
this._capturedEventId = 0;
|
||||||
this._unmapId = 0;
|
this._unmapId = 0;
|
||||||
this._longPress = false;
|
this._longPress = false;
|
||||||
@@ -484,6 +485,79 @@ var KeyboardModel = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var FocusTracker = new Lang.Class({
|
||||||
|
Name: 'FocusTracker',
|
||||||
|
|
||||||
|
_init() {
|
||||||
|
this._currentWindow = null;
|
||||||
|
this._currentWindowPositionId = 0;
|
||||||
|
|
||||||
|
global.screen.get_display().connect('notify::focus-window', () => {
|
||||||
|
this._setCurrentWindow(global.screen.get_display().focus_window);
|
||||||
|
this.emit('window-changed', this._currentWindow);
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Valid for wayland clients */
|
||||||
|
Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
|
||||||
|
let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() };
|
||||||
|
this._setCurrentRect(newRect);
|
||||||
|
});
|
||||||
|
|
||||||
|
this._ibusManager = IBusManager.getIBusManager();
|
||||||
|
this._ibusManager.connect('set-cursor-location', (manager, rect) => {
|
||||||
|
/* Valid for X11 clients only */
|
||||||
|
if (Main.inputMethod.currentFocus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._setCurrentRect(rect);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
get currentWindow() {
|
||||||
|
return this._currentWindow;
|
||||||
|
},
|
||||||
|
|
||||||
|
_setCurrentWindow(window) {
|
||||||
|
if (this._currentWindow)
|
||||||
|
this._currentWindow.disconnect(this._currentWindowPositionId);
|
||||||
|
|
||||||
|
this._currentWindow = window;
|
||||||
|
if (window) {
|
||||||
|
this._currentWindowPositionId = this._currentWindow.connect('position-changed', () => {
|
||||||
|
if (global.display.get_grab_op() == Meta.GrabOp.NONE)
|
||||||
|
this.emit('position-changed');
|
||||||
|
else
|
||||||
|
this.emit('reset');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_setCurrentRect(rect) {
|
||||||
|
if (this._currentWindow) {
|
||||||
|
let frameRect = this._currentWindow.get_frame_rect();
|
||||||
|
rect.x -= frameRect.x;
|
||||||
|
rect.y -= frameRect.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._rect = rect;
|
||||||
|
this.emit('position-changed');
|
||||||
|
},
|
||||||
|
|
||||||
|
getCurrentRect() {
|
||||||
|
let rect = { x: this._rect.x, y: this._rect.y,
|
||||||
|
width: this._rect.width, height: this._rect.height };
|
||||||
|
|
||||||
|
if (this._currentWindow) {
|
||||||
|
let frameRect = this._currentWindow.get_frame_rect();
|
||||||
|
rect.x += frameRect.x;
|
||||||
|
rect.y += frameRect.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(FocusTracker.prototype);
|
||||||
|
|
||||||
var Keyboard = new Lang.Class({
|
var Keyboard = new Lang.Class({
|
||||||
Name: 'Keyboard',
|
Name: 'Keyboard',
|
||||||
|
|
||||||
@@ -491,15 +565,10 @@ var Keyboard = new Lang.Class({
|
|||||||
this.actor = null;
|
this.actor = null;
|
||||||
this._focusInExtendedKeys = false;
|
this._focusInExtendedKeys = false;
|
||||||
|
|
||||||
this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
|
|
||||||
this._focusCaretTracker.connect('focus-changed', this._onFocusChanged.bind(this));
|
|
||||||
this._focusCaretTracker.connect('caret-moved', this._onCaretMoved.bind(this));
|
|
||||||
this._languagePopup = null;
|
this._languagePopup = null;
|
||||||
this._currentAccessible = null;
|
|
||||||
this._caretTrackingEnabled = false;
|
|
||||||
this._updateCaretPositionId = 0;
|
|
||||||
this._currentFocusWindow = null;
|
this._currentFocusWindow = null;
|
||||||
this._originalWindowY = null;
|
this._animFocusedWindow = null;
|
||||||
|
this._delayedAnimFocusWindow = null;
|
||||||
|
|
||||||
this._enableKeyboard = false; // a11y settings value
|
this._enableKeyboard = false; // a11y settings value
|
||||||
this._enabled = false; // enabled state (by setting or device type)
|
this._enabled = false; // enabled state (by setting or device type)
|
||||||
@@ -510,6 +579,14 @@ var Keyboard = new Lang.Class({
|
|||||||
this._lastDeviceId = null;
|
this._lastDeviceId = null;
|
||||||
this._suggestions = null;
|
this._suggestions = null;
|
||||||
|
|
||||||
|
this._focusTracker = new FocusTracker();
|
||||||
|
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
|
||||||
|
this._focusTracker.connect('reset', () => {
|
||||||
|
this._delayedAnimFocusWindow = null;
|
||||||
|
this._animFocusedWindow = null;
|
||||||
|
this._oskFocusWindow = null;
|
||||||
|
});
|
||||||
|
|
||||||
Meta.get_backend().connect('last-device-changed',
|
Meta.get_backend().connect('last-device-changed',
|
||||||
(backend, deviceId) => {
|
(backend, deviceId) => {
|
||||||
let manager = Clutter.DeviceManager.get_default();
|
let manager = Clutter.DeviceManager.get_default();
|
||||||
@@ -532,102 +609,15 @@ var Keyboard = new Lang.Class({
|
|||||||
this._keyboardRestingId = 0;
|
this._keyboardRestingId = 0;
|
||||||
|
|
||||||
Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
|
Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
|
||||||
//Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
|
|
||||||
// if (this._keyboardVisible) {
|
|
||||||
// let currentWindow = global.screen.get_display().focus_window;
|
|
||||||
// this.setCursorLocation(currentWindow, rect.get_x(), rect.get_y(),
|
|
||||||
// rect.get_width(), rect.get_height());
|
|
||||||
// }
|
|
||||||
//});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
get visible() {
|
get visible() {
|
||||||
return this._keyboardVisible;
|
return this._keyboardVisible;
|
||||||
},
|
},
|
||||||
|
|
||||||
_setCaretTrackerEnabled(enabled) {
|
_onFocusPositionChanged(focusTracker) {
|
||||||
if (this._caretTrackingEnabled == enabled)
|
let rect = focusTracker.getCurrentRect();
|
||||||
return;
|
this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height);
|
||||||
|
|
||||||
this._caretTrackingEnabled = enabled;
|
|
||||||
|
|
||||||
if (enabled) {
|
|
||||||
this._focusCaretTracker.registerFocusListener();
|
|
||||||
this._focusCaretTracker.registerCaretListener();
|
|
||||||
} else {
|
|
||||||
this._focusCaretTracker.deregisterFocusListener();
|
|
||||||
this._focusCaretTracker.deregisterCaretListener();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateCaretPosition(accessible) {
|
|
||||||
if (this._updateCaretPositionId)
|
|
||||||
GLib.source_remove(this._updateCaretPositionId);
|
|
||||||
if (!this._keyboardRequested)
|
|
||||||
return;
|
|
||||||
this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
|
|
||||||
this._updateCaretPositionId = 0;
|
|
||||||
|
|
||||||
let currentWindow = global.screen.get_display().focus_window;
|
|
||||||
if (!currentWindow) {
|
|
||||||
this.setCursorLocation(null);
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
let windowRect = currentWindow.get_frame_rect();
|
|
||||||
let text = accessible.get_text_iface();
|
|
||||||
let component = accessible.get_component_iface();
|
|
||||||
|
|
||||||
try {
|
|
||||||
let caretOffset = text.get_caret_offset();
|
|
||||||
let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW);
|
|
||||||
let focusRect = component.get_extents(Atspi.CoordType.WINDOW);
|
|
||||||
|
|
||||||
if (caretRect.width == 0 && caretRect.height == 0)
|
|
||||||
caretRect = focusRect;
|
|
||||||
|
|
||||||
this.setCursorLocation(currentWindow, caretRect.x, caretRect.y, caretRect.width, caretRect.height);
|
|
||||||
} catch (e) {
|
|
||||||
log('Error updating caret position for OSK: ' + e.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
});
|
|
||||||
|
|
||||||
GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition');
|
|
||||||
},
|
|
||||||
|
|
||||||
_focusIsTextEntry(accessible) {
|
|
||||||
try {
|
|
||||||
let role = accessible.get_role();
|
|
||||||
let stateSet = accessible.get_state_set();
|
|
||||||
return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL;
|
|
||||||
} catch (e) {
|
|
||||||
log('Error determining accessible role: ' + e.message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onFocusChanged(caretTracker, event) {
|
|
||||||
let accessible = event.source;
|
|
||||||
if (!this._focusIsTextEntry(accessible))
|
|
||||||
return;
|
|
||||||
|
|
||||||
let focused = event.detail1 != 0;
|
|
||||||
if (focused) {
|
|
||||||
this._currentAccessible = accessible;
|
|
||||||
this._updateCaretPosition(accessible);
|
|
||||||
this.show(Main.layoutManager.focusIndex);
|
|
||||||
} else if (this._currentAccessible == accessible) {
|
|
||||||
this._currentAccessible = null;
|
|
||||||
this.hide();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onCaretMoved(caretTracker, event) {
|
|
||||||
let accessible = event.source;
|
|
||||||
if (this._currentAccessible == accessible)
|
|
||||||
this._updateCaretPosition(accessible);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_lastDeviceIsTouchscreen() {
|
_lastDeviceIsTouchscreen() {
|
||||||
@@ -650,8 +640,6 @@ var Keyboard = new Lang.Class({
|
|||||||
if (!this._enabled && !this._keyboardController)
|
if (!this._enabled && !this._keyboardController)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._setCaretTrackerEnabled(this._enabled);
|
|
||||||
|
|
||||||
if (this._enabled && !this._keyboardController)
|
if (this._enabled && !this._keyboardController)
|
||||||
this._setupKeyboard();
|
this._setupKeyboard();
|
||||||
else if (!this._enabled)
|
else if (!this._enabled)
|
||||||
@@ -936,9 +924,11 @@ var Keyboard = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_relayout() {
|
_relayout() {
|
||||||
if (this.actor == null)
|
|
||||||
return;
|
|
||||||
let monitor = Main.layoutManager.keyboardMonitor;
|
let monitor = Main.layoutManager.keyboardMonitor;
|
||||||
|
|
||||||
|
if (this.actor == null || monitor == null)
|
||||||
|
return;
|
||||||
|
|
||||||
let maxHeight = monitor.height / 3;
|
let maxHeight = monitor.height / 3;
|
||||||
this.actor.width = monitor.width;
|
this.actor.width = monitor.width;
|
||||||
this.actor.height = maxHeight;
|
this.actor.height = maxHeight;
|
||||||
@@ -1027,11 +1017,14 @@ var Keyboard = new Lang.Class({
|
|||||||
if (!this._keyboardRequested)
|
if (!this._keyboardRequested)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._currentAccessible)
|
|
||||||
this._updateCaretPosition(this._currentAccessible);
|
|
||||||
Main.layoutManager.keyboardIndex = monitor;
|
Main.layoutManager.keyboardIndex = monitor;
|
||||||
this._relayout();
|
this._relayout();
|
||||||
Main.layoutManager.showKeyboard();
|
Main.layoutManager.showKeyboard();
|
||||||
|
|
||||||
|
if (this._delayedAnimFocusWindow) {
|
||||||
|
this._setAnimationWindow(this._delayedAnimFocusWindow);
|
||||||
|
this._delayedAnimFocusWindow = null;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
hide() {
|
hide() {
|
||||||
@@ -1102,8 +1095,9 @@ var Keyboard = new Lang.Class({
|
|||||||
window.move_frame(true, frameRect.x, frameRect.y);
|
window.move_frame(true, frameRect.x, frameRect.y);
|
||||||
},
|
},
|
||||||
|
|
||||||
_animateWindow(window, show, deltaY) {
|
_animateWindow(window, show) {
|
||||||
let windowActor = window.get_compositor_private();
|
let windowActor = window.get_compositor_private();
|
||||||
|
let deltaY = Main.layoutManager.keyboardBox.height;
|
||||||
if (!windowActor)
|
if (!windowActor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1124,35 +1118,39 @@ var Keyboard = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setCursorLocation(window, x, y , w, h) {
|
_setAnimationWindow(window) {
|
||||||
if (window == this._oskFocusWindow)
|
if (this._animFocusedWindow == window)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._oskFocusWindow) {
|
if (this._animFocusedWindow)
|
||||||
let display = global.screen.get_display();
|
this._animateWindow(this._animFocusedWindow, false);
|
||||||
|
if (window)
|
||||||
|
this._animateWindow(window, true);
|
||||||
|
|
||||||
if (display.get_grab_op() == Meta.GrabOp.NONE ||
|
this._animFocusedWindow = window;
|
||||||
display.get_focus_window() != this._oskFocusWindow)
|
},
|
||||||
this._animateWindow(this._oskFocusWindow, false, this._oskFocusWindowDelta);
|
|
||||||
|
|
||||||
this._oskFocusWindow = null;
|
setCursorLocation(window, x, y , w, h) {
|
||||||
this._oskFocusWindowDelta = null;
|
let monitor = Main.layoutManager.keyboardMonitor;
|
||||||
}
|
|
||||||
|
|
||||||
if (window) {
|
if (window && monitor) {
|
||||||
let monitor = Main.layoutManager.keyboardMonitor;
|
|
||||||
let keyboardHeight = Main.layoutManager.keyboardBox.height;
|
let keyboardHeight = Main.layoutManager.keyboardBox.height;
|
||||||
let frameRect = window.get_frame_rect();
|
let focusObscured = false;
|
||||||
let windowActor = window.get_compositor_private();
|
|
||||||
let delta = 0;
|
|
||||||
|
|
||||||
if (frameRect.y + y + h >= monitor.height - keyboardHeight)
|
if (y + h >= monitor.y + monitor.height - keyboardHeight) {
|
||||||
delta = keyboardHeight;
|
if (this._keyboardVisible)
|
||||||
|
this._setAnimationWindow(window);
|
||||||
this._animateWindow(window, true, delta);
|
else
|
||||||
this._oskFocusWindow = window;
|
this._delayedAnimFocusWindow = window;
|
||||||
this._oskFocusWindowDelta = delta;
|
} else if (y < keyboardHeight) {
|
||||||
|
this._delayedAnimFocusWindow = null;
|
||||||
|
this._setAnimationWindow(null);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this._setAnimationWindow(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._oskFocusWindow = window;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -203,6 +203,7 @@ var LayoutManager = new Lang.Class({
|
|||||||
|
|
||||||
// Set up stage hierarchy to group all UI actors under one container.
|
// Set up stage hierarchy to group all UI actors under one container.
|
||||||
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
||||||
|
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
|
||||||
this.uiGroup.connect('allocate', (actor, box, flags) => {
|
this.uiGroup.connect('allocate', (actor, box, flags) => {
|
||||||
let children = actor.get_children();
|
let children = actor.get_children();
|
||||||
for (let i = 0; i < children.length; i++)
|
for (let i = 0; i < children.length; i++)
|
||||||
@@ -557,6 +558,8 @@ var LayoutManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
get focusMonitor() {
|
get focusMonitor() {
|
||||||
|
if (this.focusIndex < 0)
|
||||||
|
return null;
|
||||||
return this.monitors[this.focusIndex];
|
return this.monitors[this.focusIndex];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -19,7 +19,6 @@ const MagnifierDBus = imports.ui.magnifierDBus;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const PointerWatcher = imports.ui.pointerWatcher;
|
const PointerWatcher = imports.ui.pointerWatcher;
|
||||||
|
|
||||||
var MOUSE_POLL_FREQUENCY = 50;
|
|
||||||
var CROSSHAIRS_CLIP_SIZE = [100, 100];
|
var CROSSHAIRS_CLIP_SIZE = [100, 100];
|
||||||
var NO_CHANGE = 0.0;
|
var NO_CHANGE = 0.0;
|
||||||
|
|
||||||
@@ -152,8 +151,10 @@ var Magnifier = new Lang.Class({
|
|||||||
* Turn on mouse tracking, if not already doing so.
|
* Turn on mouse tracking, if not already doing so.
|
||||||
*/
|
*/
|
||||||
startTrackingMouse() {
|
startTrackingMouse() {
|
||||||
if (!this._pointerWatch)
|
if (!this._pointerWatch) {
|
||||||
this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(MOUSE_POLL_FREQUENCY, this.scrollToMousePos.bind(this));
|
let interval = 1000 / Clutter.get_default_frame_rate();
|
||||||
|
this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, this.scrollToMousePos.bind(this));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -256,6 +256,14 @@ function _getStylesheet(name) {
|
|||||||
if (stylesheet.query_exists(null))
|
if (stylesheet.query_exists(null))
|
||||||
return stylesheet;
|
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);
|
stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name);
|
||||||
if (stylesheet.query_exists(null))
|
if (stylesheet.query_exists(null))
|
||||||
return stylesheet;
|
return stylesheet;
|
||||||
@@ -335,6 +343,9 @@ function loadTheme() {
|
|||||||
let theme = new St.Theme ({ application_stylesheet: _cssStylesheet,
|
let theme = new St.Theme ({ application_stylesheet: _cssStylesheet,
|
||||||
default_stylesheet: _defaultCssStylesheet });
|
default_stylesheet: _defaultCssStylesheet });
|
||||||
|
|
||||||
|
if (theme.default_stylesheet == null)
|
||||||
|
throw new Error("No valid stylesheet found for '%s'".format(sessionMode.stylesheetName));
|
||||||
|
|
||||||
if (previousTheme) {
|
if (previousTheme) {
|
||||||
let customStylesheets = previousTheme.get_custom_stylesheets();
|
let customStylesheets = previousTheme.get_custom_stylesheets();
|
||||||
|
|
||||||
|
@@ -362,7 +362,8 @@ var Message = new Lang.Class({
|
|||||||
this.setBody(body);
|
this.setBody(body);
|
||||||
|
|
||||||
this._closeButton.connect('clicked', this.close.bind(this));
|
this._closeButton.connect('clicked', this.close.bind(this));
|
||||||
this.actor.connect('notify::hover', this._sync.bind(this));
|
let actorHoverId = this.actor.connect('notify::hover', this._sync.bind(this));
|
||||||
|
this._closeButton.connect('destroy', this.actor.disconnect.bind(this.actor, actorHoverId));
|
||||||
this.actor.connect('clicked', this._onClicked.bind(this));
|
this.actor.connect('clicked', this._onClicked.bind(this));
|
||||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||||
this._sync();
|
this._sync();
|
||||||
|
@@ -1320,6 +1320,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();
|
||||||
@@ -1457,6 +1458,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;
|
||||||
|
@@ -100,21 +100,8 @@ var ModalDialog = new Lang.Class({
|
|||||||
setButtons(buttons) {
|
setButtons(buttons) {
|
||||||
this.clearButtons();
|
this.clearButtons();
|
||||||
|
|
||||||
for (let i = 0; i < buttons.length; i++) {
|
for (let buttonInfo of buttons)
|
||||||
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;
|
|
||||||
|
|
||||||
this.addButton(buttonInfo);
|
this.addButton(buttonInfo);
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
addButton(buttonInfo) {
|
addButton(buttonInfo) {
|
||||||
|
@@ -117,10 +117,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) {
|
||||||
|
@@ -108,15 +108,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,7 +219,7 @@ var OsdWindow = new Lang.Class({
|
|||||||
|
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
this._icon.icon_size = popupSize / (2 * scaleFactor);
|
this._icon.icon_size = popupSize / (2 * scaleFactor);
|
||||||
this._box.translation_y = monitor.height / 4;
|
this._box.translation_y = Math.round(monitor.height / 4);
|
||||||
this._boxConstraint.minSize = popupSize;
|
this._boxConstraint.minSize = popupSize;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -393,10 +393,8 @@ var Overview = new Lang.Class({
|
|||||||
if (!Main.layoutManager.primaryMonitor)
|
if (!Main.layoutManager.primaryMonitor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
this._coverPane.set_position(0, 0);
|
||||||
|
this._coverPane.set_size(global.screen_width, global.screen_height);
|
||||||
this._coverPane.set_position(0, workArea.y);
|
|
||||||
this._coverPane.set_size(workArea.width, workArea.height);
|
|
||||||
|
|
||||||
this._updateBackgrounds();
|
this._updateBackgrounds();
|
||||||
},
|
},
|
||||||
@@ -488,7 +486,8 @@ var Overview = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
if (this._inItemDrag || this._inWindowDrag)
|
if (this._inItemDrag || this._inWindowDrag)
|
||||||
return false;
|
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 true;
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
@@ -547,7 +546,7 @@ var Overview = new Lang.Class({
|
|||||||
this.visible = true;
|
this.visible = true;
|
||||||
this.animationInProgress = true;
|
this.animationInProgress = true;
|
||||||
this.visibleTarget = 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);
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
this.viewSelector.show();
|
this.viewSelector.show();
|
||||||
|
@@ -284,6 +284,11 @@ var ThumbnailsSlider = new Lang.Class({
|
|||||||
return child.get_theme_node().get_length('visible-width');
|
return child.get_theme_node().get_length('visible-width');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onDragEnd() {
|
||||||
|
this.actor.sync_hover();
|
||||||
|
this.parent();
|
||||||
|
},
|
||||||
|
|
||||||
_getSlide() {
|
_getSlide() {
|
||||||
if (!this._visible)
|
if (!this._visible)
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -796,6 +796,7 @@ var Panel = new Lang.Class({
|
|||||||
this.actor.connect('get-preferred-height', this._getPreferredHeight.bind(this));
|
this.actor.connect('get-preferred-height', this._getPreferredHeight.bind(this));
|
||||||
this.actor.connect('allocate', this._allocate.bind(this));
|
this.actor.connect('allocate', this._allocate.bind(this));
|
||||||
this.actor.connect('button-press-event', this._onButtonPress.bind(this));
|
this.actor.connect('button-press-event', this._onButtonPress.bind(this));
|
||||||
|
this.actor.connect('touch-event', this._onButtonPress.bind(this));
|
||||||
this.actor.connect('key-press-event', this._onKeyPress.bind(this));
|
this.actor.connect('key-press-event', this._onKeyPress.bind(this));
|
||||||
|
|
||||||
Main.overview.connect('showing', () => {
|
Main.overview.connect('showing', () => {
|
||||||
@@ -939,8 +940,13 @@ var Panel = new Lang.Class({
|
|||||||
if (event.get_source() != actor)
|
if (event.get_source() != actor)
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
let button = event.get_button();
|
let type = event.type();
|
||||||
if (button != 1)
|
let isPress = type == Clutter.EventType.BUTTON_PRESS;
|
||||||
|
if (!isPress && type != Clutter.EventType.TOUCH_BEGIN)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
let button = isPress ? event.get_button() : -1;
|
||||||
|
if (isPress && button != 1)
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
let focusWindow = global.display.focus_window;
|
let focusWindow = global.display.focus_window;
|
||||||
@@ -1079,6 +1085,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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -141,8 +141,17 @@ var PopupBaseMenuItem = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onKeyPressEvent(actor, event) {
|
_onKeyPressEvent(actor, event) {
|
||||||
let symbol = event.get_key_symbol();
|
let state = event.get_state();
|
||||||
|
|
||||||
|
// if user has a modifier down (except capslock)
|
||||||
|
// then don't handle the key press here
|
||||||
|
state &= ~Clutter.ModifierType.LOCK_MASK;
|
||||||
|
state &= Clutter.ModifierType.MODIFIER_MASK;
|
||||||
|
|
||||||
|
if (state)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
let symbol = event.get_key_symbol();
|
||||||
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
|
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
|
||||||
this.activate(event);
|
this.activate(event);
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
@@ -394,8 +403,9 @@ var PopupImageMenuItem = new Lang.Class({
|
|||||||
_init(text, icon, params) {
|
_init(text, icon, params) {
|
||||||
this.parent(params);
|
this.parent(params);
|
||||||
|
|
||||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
this._icon = new St.Icon({ style_class: 'popup-menu-icon',
|
||||||
this.actor.add_child(this._icon, { align: St.Align.END });
|
x_align: Clutter.ActorAlign.END });
|
||||||
|
this.actor.add_child(this._icon);
|
||||||
this.label = new St.Label({ text: text });
|
this.label = new St.Label({ text: text });
|
||||||
this.actor.add_child(this.label);
|
this.actor.add_child(this.label);
|
||||||
this.actor.label_actor = this.label;
|
this.actor.label_actor = this.label;
|
||||||
|
@@ -295,7 +295,7 @@ var RemoteSearchProvider = new Lang.Class({
|
|||||||
name: metas[i]['name'],
|
name: metas[i]['name'],
|
||||||
description: metas[i]['description'],
|
description: metas[i]['description'],
|
||||||
createIcon: size => {
|
createIcon: size => {
|
||||||
this.createIcon(size, metas[i]);
|
return this.createIcon(size, metas[i]);
|
||||||
},
|
},
|
||||||
clipboardText: metas[i]['clipboardText'] });
|
clipboardText: metas[i]['clipboardText'] });
|
||||||
}
|
}
|
||||||
|
@@ -114,18 +114,16 @@ var RunDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
|
this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
|
||||||
entry: this._entryText });
|
entry: this._entryText });
|
||||||
|
this._entryText.connect('activate', (o) => {
|
||||||
|
this.popModal();
|
||||||
|
this._run(o.get_text(),
|
||||||
|
Clutter.get_current_event().get_state() & Clutter.ModifierType.CONTROL_MASK);
|
||||||
|
if (!this._commandError ||
|
||||||
|
!this.pushModal())
|
||||||
|
this.close();
|
||||||
|
});
|
||||||
this._entryText.connect('key-press-event', (o, e) => {
|
this._entryText.connect('key-press-event', (o, e) => {
|
||||||
let symbol = e.get_key_symbol();
|
let symbol = e.get_key_symbol();
|
||||||
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
|
|
||||||
this.popModal();
|
|
||||||
this._run(o.get_text(),
|
|
||||||
e.get_state() & Clutter.ModifierType.CONTROL_MASK);
|
|
||||||
if (!this._commandError ||
|
|
||||||
!this.pushModal())
|
|
||||||
this.close();
|
|
||||||
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
}
|
|
||||||
if (symbol == Clutter.Tab) {
|
if (symbol == Clutter.Tab) {
|
||||||
let text = o.get_text();
|
let text = o.get_text();
|
||||||
let prefix;
|
let prefix;
|
||||||
|
@@ -192,6 +192,7 @@ var SearchResultsBase = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
|
this._cancellable.cancel();
|
||||||
for (let resultId in this._resultDisplays)
|
for (let resultId in this._resultDisplays)
|
||||||
this._resultDisplays[resultId].actor.destroy();
|
this._resultDisplays[resultId].actor.destroy();
|
||||||
this._resultDisplays = {};
|
this._resultDisplays = {};
|
||||||
@@ -225,6 +226,12 @@ var SearchResultsBase = new Lang.Class({
|
|||||||
this._cancellable.reset();
|
this._cancellable.reset();
|
||||||
|
|
||||||
this.provider.getResultMetas(metasNeeded, metas => {
|
this.provider.getResultMetas(metasNeeded, metas => {
|
||||||
|
if (this._cancellable.is_cancelled()) {
|
||||||
|
if (metas.length > 0)
|
||||||
|
log(`Search provider ${this.provider.id} returned results after the request was canceled`);
|
||||||
|
callback(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (metas.length != metasNeeded.length) {
|
if (metas.length != metasNeeded.length) {
|
||||||
log('Wrong number of result metas returned by search provider ' + this.provider.id +
|
log('Wrong number of result metas returned by search provider ' + this.provider.id +
|
||||||
': expected ' + metasNeeded.length + ' but got ' + metas.length);
|
': expected ' + metasNeeded.length + ' but got ' + metas.length);
|
||||||
|
@@ -55,11 +55,11 @@ var EntryMenu = new Lang.Class({
|
|||||||
|
|
||||||
if (v) {
|
if (v) {
|
||||||
this._makePasswordItem();
|
this._makePasswordItem();
|
||||||
this._entry.input_purpose = Gtk.InputPurpose.PASSWORD;
|
this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD;
|
||||||
} else {
|
} else {
|
||||||
this._passwordItem.destroy();
|
this._passwordItem.destroy();
|
||||||
this._passwordItem = null;
|
this._passwordItem = null;
|
||||||
this._entry.input_purpose = Gtk.InputPurpose.FREE_FORM;
|
this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -419,12 +419,14 @@ var NMConnectionDevice = new Lang.Class({
|
|||||||
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
||||||
|
|
||||||
if (this._activeConnection == null) {
|
if (this._activeConnection == null) {
|
||||||
this._activeConnection = this._device.active_connection;
|
let activeConnection = this._device.active_connection;
|
||||||
|
if (activeConnection && activeConnection.connection) {
|
||||||
if (this._activeConnection) {
|
let item = this._connectionItems.get(activeConnection.connection.get_uuid());
|
||||||
ensureActiveConnectionProps(this._activeConnection, this._client);
|
if (item) {
|
||||||
let item = this._connectionItems.get(this._activeConnection.connection.get_uuid());
|
this._activeConnection = activeConnection;
|
||||||
item.setActiveConnection(this._activeConnection);
|
ensureActiveConnectionProps(this._activeConnection, this._client);
|
||||||
|
item.setActiveConnection(this._activeConnection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1944,6 +1946,7 @@ var NMApplet = new Lang.Class({
|
|||||||
this.indicators.visible = this._client.nm_running;
|
this.indicators.visible = this._client.nm_running;
|
||||||
this.menu.actor.visible = this._client.networking_enabled;
|
this.menu.actor.visible = this._client.networking_enabled;
|
||||||
|
|
||||||
|
this._updateIcon();
|
||||||
this._syncConnectivity();
|
this._syncConnectivity();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -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() {
|
||||||
|
@@ -311,6 +311,7 @@ var ViewSelector = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
hide() {
|
hide() {
|
||||||
|
this.reset();
|
||||||
this._workspacesDisplay.hide();
|
this._workspacesDisplay.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -459,7 +460,11 @@ var ViewSelector = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
reset() {
|
reset() {
|
||||||
global.stage.set_key_focus(null);
|
// Don't drop the key focus on Clutter's side if anything but the
|
||||||
|
// overview has pushed a modal (e.g. system modals when activated using
|
||||||
|
// the overview).
|
||||||
|
if (Main.modalCount <= 1)
|
||||||
|
global.stage.set_key_focus(null);
|
||||||
|
|
||||||
this._entry.text = '';
|
this._entry.text = '';
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ const EdgeDragAction = imports.ui.edgeDragAction;
|
|||||||
const CloseDialog = imports.ui.closeDialog;
|
const CloseDialog = imports.ui.closeDialog;
|
||||||
const SwitchMonitor = imports.ui.switchMonitor;
|
const SwitchMonitor = imports.ui.switchMonitor;
|
||||||
|
|
||||||
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
var SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
||||||
var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
|
var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
|
||||||
var SHOW_WINDOW_ANIMATION_TIME = 0.15;
|
var SHOW_WINDOW_ANIMATION_TIME = 0.15;
|
||||||
var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1;
|
var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1;
|
||||||
@@ -627,8 +627,8 @@ var AppSwitchAction = new Lang.Class({
|
|||||||
|
|
||||||
if (this.get_n_current_points() == 3) {
|
if (this.get_n_current_points() == 3) {
|
||||||
for (let i = 0; i < this.get_n_current_points(); i++) {
|
for (let i = 0; i < this.get_n_current_points(); i++) {
|
||||||
[startX, startY] = this.get_press_coords(i);
|
let [startX, startY] = this.get_press_coords(i);
|
||||||
[x, y] = this.get_motion_coords(i);
|
let [x, y] = this.get_motion_coords(i);
|
||||||
|
|
||||||
if (Math.abs(x - startX) > MOTION_THRESHOLD ||
|
if (Math.abs(x - startX) > MOTION_THRESHOLD ||
|
||||||
Math.abs(y - startY) > MOTION_THRESHOLD)
|
Math.abs(y - startY) > MOTION_THRESHOLD)
|
||||||
@@ -1173,6 +1173,10 @@ var WindowManager = new Lang.Class({
|
|||||||
yScale = geom.height / actor.height;
|
yScale = geom.height / actor.height;
|
||||||
} else {
|
} else {
|
||||||
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
|
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
|
||||||
|
if (!monitor) {
|
||||||
|
this._minimizeWindowDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
xDest = monitor.x;
|
xDest = monitor.x;
|
||||||
yDest = monitor.y;
|
yDest = monitor.y;
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||||
@@ -1248,6 +1252,11 @@ var WindowManager = new Lang.Class({
|
|||||||
geom.height / actor.height);
|
geom.height / actor.height);
|
||||||
} else {
|
} else {
|
||||||
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
|
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
|
||||||
|
if (!monitor) {
|
||||||
|
actor.show();
|
||||||
|
this._unminimizeWindowDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
actor.set_position(monitor.x, monitor.y);
|
actor.set_position(monitor.x, monitor.y);
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||||
actor.x += monitor.width;
|
actor.x += monitor.width;
|
||||||
|
@@ -128,11 +128,10 @@ var WindowMenu = new Lang.Class({
|
|||||||
|
|
||||||
let screen = global.screen;
|
let screen = global.screen;
|
||||||
let nMonitors = screen.get_n_monitors();
|
let nMonitors = screen.get_n_monitors();
|
||||||
if (nMonitors > 1) {
|
let monitorIndex = window.get_monitor();
|
||||||
|
if (nMonitors > 1 && monitorIndex >= 0) {
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
|
|
||||||
let monitorIndex = window.get_monitor();
|
|
||||||
|
|
||||||
let dir = Meta.ScreenDirection.UP;
|
let dir = Meta.ScreenDirection.UP;
|
||||||
let upMonitorIndex =
|
let upMonitorIndex =
|
||||||
screen.get_monitor_neighbor_index(monitorIndex, dir);
|
screen.get_monitor_neighbor_index(monitorIndex, dir);
|
||||||
|
@@ -137,8 +137,10 @@ var WindowClone = new Lang.Class({
|
|||||||
this._dragSlot = [0, 0, 0, 0];
|
this._dragSlot = [0, 0, 0, 0];
|
||||||
this._stackAbove = null;
|
this._stackAbove = null;
|
||||||
|
|
||||||
this._windowClone._updateId = this.metaWindow.connect('size-changed',
|
this._windowClone._sizeChangedId = this.metaWindow.connect('size-changed',
|
||||||
this._onRealWindowSizeChanged.bind(this));
|
this._onMetaWindowSizeChanged.bind(this));
|
||||||
|
this._windowClone._posChangedId = this.metaWindow.connect('position-changed',
|
||||||
|
this._computeBoundingBox.bind(this));
|
||||||
this._windowClone._destroyId =
|
this._windowClone._destroyId =
|
||||||
this.realWindow.connect('destroy', () => {
|
this.realWindow.connect('destroy', () => {
|
||||||
// First destroy the clone and then destroy everything
|
// First destroy the clone and then destroy everything
|
||||||
@@ -206,8 +208,7 @@ var WindowClone = new Lang.Class({
|
|||||||
|
|
||||||
addAttachedDialog(win) {
|
addAttachedDialog(win) {
|
||||||
this._doAddAttachedDialog(win, win.get_compositor_private());
|
this._doAddAttachedDialog(win, win.get_compositor_private());
|
||||||
this._computeBoundingBox();
|
this._onMetaWindowSizeChanged();
|
||||||
this.emit('size-changed');
|
|
||||||
},
|
},
|
||||||
|
|
||||||
hasAttachedDialogs() {
|
hasAttachedDialogs() {
|
||||||
@@ -216,15 +217,14 @@ var WindowClone = new Lang.Class({
|
|||||||
|
|
||||||
_doAddAttachedDialog(metaWin, realWin) {
|
_doAddAttachedDialog(metaWin, realWin) {
|
||||||
let clone = new Clutter.Clone({ source: realWin });
|
let clone = new Clutter.Clone({ source: realWin });
|
||||||
clone._updateId = metaWin.connect('size-changed', () => {
|
clone._sizeChangedId = metaWin.connect('size-changed',
|
||||||
this._computeBoundingBox();
|
this._onMetaWindowSizeChanged.bind(this));
|
||||||
this.emit('size-changed');
|
clone._posChangedId = metaWin.connect('position-changed',
|
||||||
});
|
this._onMetaWindowSizeChanged.bind(this));
|
||||||
clone._destroyId = realWin.connect('destroy', () => {
|
clone._destroyId = realWin.connect('destroy', () => {
|
||||||
clone.destroy();
|
clone.destroy();
|
||||||
|
|
||||||
this._computeBoundingBox();
|
this._onMetaWindowSizeChanged();
|
||||||
this.emit('size-changed');
|
|
||||||
});
|
});
|
||||||
this.actor.add_child(clone);
|
this.actor.add_child(clone);
|
||||||
},
|
},
|
||||||
@@ -321,12 +321,13 @@ var WindowClone = new Lang.Class({
|
|||||||
else
|
else
|
||||||
realWindow = child.source;
|
realWindow = child.source;
|
||||||
|
|
||||||
realWindow.meta_window.disconnect(child._updateId);
|
realWindow.meta_window.disconnect(child._sizeChangedId);
|
||||||
|
realWindow.meta_window.disconnect(child._posChangedId);
|
||||||
realWindow.disconnect(child._destroyId);
|
realWindow.disconnect(child._destroyId);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_onRealWindowSizeChanged() {
|
_onMetaWindowSizeChanged() {
|
||||||
this._computeBoundingBox();
|
this._computeBoundingBox();
|
||||||
this.emit('size-changed');
|
this.emit('size-changed');
|
||||||
},
|
},
|
||||||
@@ -469,7 +470,6 @@ var WindowOverlay = new Lang.Class({
|
|||||||
this._windowAddedId = 0;
|
this._windowAddedId = 0;
|
||||||
|
|
||||||
button.hide();
|
button.hide();
|
||||||
title.hide();
|
|
||||||
|
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.closeButton = button;
|
this.closeButton = button;
|
||||||
@@ -544,12 +544,10 @@ var WindowOverlay = new Lang.Class({
|
|||||||
let titleX = cloneX + (cloneWidth - title.width) / 2;
|
let titleX = cloneX + (cloneWidth - title.width) / 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));
|
||||||
} else {
|
else
|
||||||
title.width = title.width;
|
|
||||||
title.set_position(Math.floor(titleX), Math.floor(titleY));
|
title.set_position(Math.floor(titleX), Math.floor(titleY));
|
||||||
}
|
|
||||||
|
|
||||||
let borderX = cloneX - this.borderSize;
|
let borderX = cloneX - this.borderSize;
|
||||||
let borderY = cloneY - this.borderSize;
|
let borderY = cloneY - this.borderSize;
|
||||||
@@ -568,10 +566,12 @@ var WindowOverlay = new Lang.Class({
|
|||||||
_animateOverlayActor(actor, x, y, width, height) {
|
_animateOverlayActor(actor, x, y, width, height) {
|
||||||
let params = { x: x,
|
let params = { x: x,
|
||||||
y: y,
|
y: y,
|
||||||
width: width,
|
|
||||||
time: Overview.ANIMATION_TIME,
|
time: Overview.ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad' };
|
transition: 'easeOutQuad' };
|
||||||
|
|
||||||
|
if (width !== undefined)
|
||||||
|
params.width = width;
|
||||||
|
|
||||||
if (height !== undefined)
|
if (height !== undefined)
|
||||||
params.height = height;
|
params.height = height;
|
||||||
|
|
||||||
@@ -660,7 +660,6 @@ var WindowOverlay = new Lang.Class({
|
|||||||
if (this._hidden)
|
if (this._hidden)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._windowClone.actor.grab_key_focus();
|
|
||||||
this._animateVisible();
|
this._animateVisible();
|
||||||
this.emit('show-close-button');
|
this.emit('show-close-button');
|
||||||
},
|
},
|
||||||
@@ -1432,34 +1431,26 @@ var Workspace = new Lang.Class({
|
|||||||
_doRemoveWindow(metaWin) {
|
_doRemoveWindow(metaWin) {
|
||||||
let win = metaWin.get_compositor_private();
|
let win = metaWin.get_compositor_private();
|
||||||
|
|
||||||
// find the position of the window in our list
|
let clone = this._removeWindowClone(metaWin);
|
||||||
let index = this._lookupIndex (metaWin);
|
|
||||||
|
|
||||||
if (index == -1)
|
if (clone) {
|
||||||
return;
|
// If metaWin.get_compositor_private() returned non-NULL, that
|
||||||
|
// means the window still exists (and is just being moved to
|
||||||
let clone = this._windows[index];
|
// another workspace or something), so set its overviewHint
|
||||||
|
// accordingly. (If it returned NULL, then the window is being
|
||||||
this._windows.splice(index, 1);
|
// destroyed; we'd like to animate this, but it's too late at
|
||||||
this._windowOverlays.splice(index, 1);
|
// this point.)
|
||||||
|
if (win) {
|
||||||
// If metaWin.get_compositor_private() returned non-NULL, that
|
let [stageX, stageY] = clone.actor.get_transformed_position();
|
||||||
// means the window still exists (and is just being moved to
|
let [stageWidth, stageHeight] = clone.actor.get_transformed_size();
|
||||||
// another workspace or something), so set its overviewHint
|
win._overviewHint = {
|
||||||
// accordingly. (If it returned NULL, then the window is being
|
x: stageX,
|
||||||
// destroyed; we'd like to animate this, but it's too late at
|
y: stageY,
|
||||||
// this point.)
|
scale: stageWidth / clone.actor.width
|
||||||
if (win) {
|
};
|
||||||
let [stageX, stageY] = clone.actor.get_transformed_position();
|
}
|
||||||
let [stageWidth, stageHeight] = clone.actor.get_transformed_size();
|
clone.destroy();
|
||||||
win._overviewHint = {
|
|
||||||
x: stageX,
|
|
||||||
y: stageY,
|
|
||||||
scale: stageWidth / clone.actor.width
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
clone.destroy();
|
|
||||||
|
|
||||||
|
|
||||||
// We need to reposition the windows; to avoid shuffling windows
|
// We need to reposition the windows; to avoid shuffling windows
|
||||||
// around while the user is interacting with the workspace, we delay
|
// around while the user is interacting with the workspace, we delay
|
||||||
@@ -1515,7 +1506,7 @@ var Workspace = new Lang.Class({
|
|||||||
if (metaWin.is_attached_dialog()) {
|
if (metaWin.is_attached_dialog()) {
|
||||||
let parent = metaWin.get_transient_for();
|
let parent = metaWin.get_transient_for();
|
||||||
while (parent.is_attached_dialog())
|
while (parent.is_attached_dialog())
|
||||||
parent = metaWin.get_transient_for();
|
parent = parent.get_transient_for();
|
||||||
|
|
||||||
let idx = this._lookupIndex (parent);
|
let idx = this._lookupIndex (parent);
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
@@ -1849,10 +1840,18 @@ var Workspace = new Lang.Class({
|
|||||||
clone.connect('size-changed', () => {
|
clone.connect('size-changed', () => {
|
||||||
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
||||||
});
|
});
|
||||||
|
clone.actor.connect('destroy', () => {
|
||||||
|
this._removeWindowClone(clone.metaWindow);
|
||||||
|
});
|
||||||
|
|
||||||
this.actor.add_actor(clone.actor);
|
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)
|
if (this._windows.length == 0)
|
||||||
clone.setStackAbove(null);
|
clone.setStackAbove(null);
|
||||||
@@ -1865,6 +1864,17 @@ var Workspace = new Lang.Class({
|
|||||||
return [clone, overlay];
|
return [clone, overlay];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_removeWindowClone(metaWin) {
|
||||||
|
// find the position of the window in our list
|
||||||
|
let index = this._lookupIndex (metaWin);
|
||||||
|
|
||||||
|
if (index == -1)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
this._windowOverlays.splice(index, 1);
|
||||||
|
return this._windows.splice(index, 1).pop();
|
||||||
|
},
|
||||||
|
|
||||||
_onShowOverlayClose(windowOverlay) {
|
_onShowOverlayClose(windowOverlay) {
|
||||||
for (let i = 0; i < this._windowOverlays.length; i++) {
|
for (let i = 0; i < this._windowOverlays.length; i++) {
|
||||||
let overlay = this._windowOverlays[i];
|
let overlay = this._windowOverlays[i];
|
||||||
|
@@ -31,7 +31,7 @@ var WORKSPACE_CUT_SIZE = 10;
|
|||||||
|
|
||||||
var WORKSPACE_KEEP_ALIVE_TIME = 100;
|
var WORKSPACE_KEEP_ALIVE_TIME = 100;
|
||||||
|
|
||||||
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
|
var OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
|
||||||
|
|
||||||
/* 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 */
|
||||||
@@ -68,7 +68,7 @@ var WindowClone = new Lang.Class({
|
|||||||
this.realWindow = realWindow;
|
this.realWindow = realWindow;
|
||||||
this.metaWindow = realWindow.meta_window;
|
this.metaWindow = realWindow.meta_window;
|
||||||
|
|
||||||
this.clone._updateId = this.metaWindow.connect('position-changed',
|
this.clone._updateId = this.realWindow.connect('notify::position',
|
||||||
this._onPositionChanged.bind(this));
|
this._onPositionChanged.bind(this));
|
||||||
this.clone._destroyId = this.realWindow.connect('destroy', () => {
|
this.clone._destroyId = this.realWindow.connect('destroy', () => {
|
||||||
// First destroy the clone and then destroy everything
|
// First destroy the clone and then destroy everything
|
||||||
@@ -153,7 +153,7 @@ var WindowClone = new Lang.Class({
|
|||||||
let clone = new Clutter.Clone({ source: realDialog });
|
let clone = new Clutter.Clone({ source: realDialog });
|
||||||
this._updateDialogPosition(realDialog, clone);
|
this._updateDialogPosition(realDialog, clone);
|
||||||
|
|
||||||
clone._updateId = metaDialog.connect('position-changed', dialog => {
|
clone._updateId = realDialog.connect('notify::position', dialog => {
|
||||||
this._updateDialogPosition(dialog, clone);
|
this._updateDialogPosition(dialog, clone);
|
||||||
});
|
});
|
||||||
clone._destroyId = realDialog.connect('destroy', () => {
|
clone._destroyId = realDialog.connect('destroy', () => {
|
||||||
@@ -171,7 +171,6 @@ var WindowClone = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onPositionChanged() {
|
_onPositionChanged() {
|
||||||
let rect = this.metaWindow.get_frame_rect();
|
|
||||||
this.actor.set_position(this.realWindow.x, this.realWindow.y);
|
this.actor.set_position(this.realWindow.x, this.realWindow.y);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -179,7 +178,7 @@ var WindowClone = new Lang.Class({
|
|||||||
this.actor.get_children().forEach(child => {
|
this.actor.get_children().forEach(child => {
|
||||||
let realWindow = child.source;
|
let realWindow = child.source;
|
||||||
|
|
||||||
realWindow.meta_window.disconnect(child._updateId);
|
realWindow.disconnect(child._updateId);
|
||||||
realWindow.disconnect(child._destroyId);
|
realWindow.disconnect(child._destroyId);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -241,7 +240,7 @@ var WindowClone = new Lang.Class({
|
|||||||
Signals.addSignalMethods(WindowClone.prototype);
|
Signals.addSignalMethods(WindowClone.prototype);
|
||||||
|
|
||||||
|
|
||||||
const ThumbnailState = {
|
var ThumbnailState = {
|
||||||
NEW : 0,
|
NEW : 0,
|
||||||
ANIMATING_IN : 1,
|
ANIMATING_IN : 1,
|
||||||
NORMAL: 2,
|
NORMAL: 2,
|
||||||
@@ -275,8 +274,8 @@ var WorkspaceThumbnail = new Lang.Class({
|
|||||||
|
|
||||||
this._createBackground();
|
this._createBackground();
|
||||||
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
let workArea = Main.layoutManager.getWorkAreaForMonitor(this.monitorIndex);
|
||||||
this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height);
|
this.setPorthole(workArea.x, workArea.y, workArea.width, workArea.height);
|
||||||
|
|
||||||
let windows = global.get_window_actors().filter(actor => {
|
let windows = global.get_window_actors().filter(actor => {
|
||||||
let win = actor.meta_window;
|
let win = actor.meta_window;
|
||||||
@@ -321,8 +320,6 @@ var WorkspaceThumbnail = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
setPorthole(x, y, width, height) {
|
setPorthole(x, y, width, height) {
|
||||||
this._portholeX = x;
|
|
||||||
this._portholeY = y;
|
|
||||||
this.actor.set_size(width, height);
|
this.actor.set_size(width, height);
|
||||||
this._contents.set_position(-x, -y);
|
this._contents.set_position(-x, -y);
|
||||||
},
|
},
|
||||||
@@ -374,18 +371,9 @@ var WorkspaceThumbnail = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_doRemoveWindow(metaWin) {
|
_doRemoveWindow(metaWin) {
|
||||||
let win = metaWin.get_compositor_private();
|
let clone = this._removeWindowClone(metaWin);
|
||||||
|
if (clone)
|
||||||
// find the position of the window in our list
|
clone.destroy();
|
||||||
let index = this._lookupIndex (metaWin);
|
|
||||||
|
|
||||||
if (index == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let clone = this._windows[index];
|
|
||||||
this._windows.splice(index, 1);
|
|
||||||
|
|
||||||
clone.destroy();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_doAddWindow(metaWin) {
|
_doAddWindow(metaWin) {
|
||||||
@@ -428,7 +416,7 @@ var WorkspaceThumbnail = new Lang.Class({
|
|||||||
} else if (metaWin.is_attached_dialog()) {
|
} else if (metaWin.is_attached_dialog()) {
|
||||||
let parent = metaWin.get_transient_for();
|
let parent = metaWin.get_transient_for();
|
||||||
while (parent.is_attached_dialog())
|
while (parent.is_attached_dialog())
|
||||||
parent = metaWin.get_transient_for();
|
parent = parent.get_transient_for();
|
||||||
|
|
||||||
let idx = this._lookupIndex (parent);
|
let idx = this._lookupIndex (parent);
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
@@ -537,6 +525,9 @@ var WorkspaceThumbnail = new Lang.Class({
|
|||||||
clone.connect('drag-end', () => {
|
clone.connect('drag-end', () => {
|
||||||
Main.overview.endWindowDrag(clone.metaWindow);
|
Main.overview.endWindowDrag(clone.metaWindow);
|
||||||
});
|
});
|
||||||
|
clone.actor.connect('destroy', () => {
|
||||||
|
this._removeWindowClone(clone.metaWindow);
|
||||||
|
});
|
||||||
this._contents.add_actor(clone.actor);
|
this._contents.add_actor(clone.actor);
|
||||||
|
|
||||||
if (this._windows.length == 0)
|
if (this._windows.length == 0)
|
||||||
@@ -549,6 +540,16 @@ var WorkspaceThumbnail = new Lang.Class({
|
|||||||
return clone;
|
return clone;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_removeWindowClone(metaWin) {
|
||||||
|
// find the position of the window in our list
|
||||||
|
let index = this._lookupIndex (metaWin);
|
||||||
|
|
||||||
|
if (index == -1)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return this._windows.splice(index, 1).pop();
|
||||||
|
},
|
||||||
|
|
||||||
activate(time) {
|
activate(time) {
|
||||||
if (this.state > ThumbnailState.NORMAL)
|
if (this.state > ThumbnailState.NORMAL)
|
||||||
return;
|
return;
|
||||||
@@ -1159,7 +1160,7 @@ var ThumbnailsBox = new Lang.Class({
|
|||||||
// The "porthole" is the portion of the screen that we show in the
|
// The "porthole" is the portion of the screen that we show in the
|
||||||
// workspaces
|
// workspaces
|
||||||
_ensurePorthole() {
|
_ensurePorthole() {
|
||||||
if (!Main.layoutManager.primaryMonitor)
|
if (!Main.layoutManager.primaryMonitor || !Main.overview.visible)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!this._porthole)
|
if (!this._porthole)
|
||||||
|
@@ -470,6 +470,7 @@ var WorkspacesDisplay = new Lang.Class({
|
|||||||
this._switchWorkspaceNotifyId = 0;
|
this._switchWorkspaceNotifyId = 0;
|
||||||
|
|
||||||
this._notifyOpacityId = 0;
|
this._notifyOpacityId = 0;
|
||||||
|
this._restackedNotifyId = 0;
|
||||||
this._scrollEventId = 0;
|
this._scrollEventId = 0;
|
||||||
this._keyPressEventId = 0;
|
this._keyPressEventId = 0;
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
project('gnome-shell', 'c',
|
project('gnome-shell', 'c',
|
||||||
version: '3.27.92',
|
version: '3.28.3',
|
||||||
meson_version: '>= 0.42.0',
|
meson_version: '>= 0.42.0',
|
||||||
license: 'GPLv2+'
|
license: 'GPLv2+'
|
||||||
)
|
)
|
||||||
@@ -18,12 +18,12 @@ ecal_req = '>= 3.5.3'
|
|||||||
eds_req = '>= 3.17.2'
|
eds_req = '>= 3.17.2'
|
||||||
gcr_req = '>= 3.7.5'
|
gcr_req = '>= 3.7.5'
|
||||||
gdesktop_req = '>= 3.7.90'
|
gdesktop_req = '>= 3.7.90'
|
||||||
gio_req = '>= 2.53.0'
|
gio_req = '>= 2.56.0'
|
||||||
gi_req = '>= 1.49.1'
|
gi_req = '>= 1.49.1'
|
||||||
gjs_req = '>= 1.47.0'
|
gjs_req = '>= 1.47.0'
|
||||||
gtk_req = '>= 3.15.0'
|
gtk_req = '>= 3.15.0'
|
||||||
json_glib_req = '>= 0.13.2'
|
json_glib_req = '>= 0.13.2'
|
||||||
mutter_req = '>= 3.27.91'
|
mutter_req = '>= 3.28.0'
|
||||||
polkit_req = '>= 0.100'
|
polkit_req = '>= 0.100'
|
||||||
schemas_req = '>= 3.21.3'
|
schemas_req = '>= 3.21.3'
|
||||||
startup_req = '>= 0.11'
|
startup_req = '>= 0.11'
|
||||||
@@ -189,3 +189,5 @@ subdir('tests')
|
|||||||
if get_option('gtk_doc')
|
if get_option('gtk_doc')
|
||||||
subdir('docs/reference')
|
subdir('docs/reference')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
meson.add_install_script('meson/meson-postinstall.sh')
|
||||||
|
10
meson/meson-postinstall.sh
Executable file
10
meson/meson-postinstall.sh
Executable 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
|
2
po/cs.po
2
po/cs.po
@@ -1064,7 +1064,7 @@ msgstr "Načítá se…"
|
|||||||
#: js/ui/dateMenu.js:321
|
#: js/ui/dateMenu.js:321
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Feels like %s."
|
msgid "Feels like %s."
|
||||||
msgstr "Pocitově jako %s."
|
msgstr "Pocitová teplota %s."
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:324
|
#: js/ui/dateMenu.js:324
|
||||||
msgid "Go online for weather information"
|
msgid "Go online for weather information"
|
||||||
|
36
po/nl.po
36
po/nl.po
@@ -8,22 +8,22 @@
|
|||||||
# Wouter Bolsterlee <wbolster@gnome.org>, 2011–2014.
|
# Wouter Bolsterlee <wbolster@gnome.org>, 2011–2014.
|
||||||
# Erwin Poeze <donnut@outlook.com>, 2013.
|
# Erwin Poeze <donnut@outlook.com>, 2013.
|
||||||
# Nathan Follens <nthn@unseen.is>, 2015-2018.
|
# Nathan Follens <nthn@unseen.is>, 2015-2018.
|
||||||
# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2015, 2017.
|
# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2015, 2017, 2018.
|
||||||
# Justin van Steijn <jvs@fsfe.org>, 2016, 2018.
|
# Justin van Steijn <jvs@fsfe.org>, 2016, 2018.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||||
"POT-Creation-Date: 2018-02-21 14:13+0000\n"
|
"POT-Creation-Date: 2018-03-19 21:43+0000\n"
|
||||||
"PO-Revision-Date: 2018-02-21 22:05+0100\n"
|
"PO-Revision-Date: 2018-03-23 10:09+0100\n"
|
||||||
"Last-Translator: Justin van Steijn <jvs@fsfe.org>\n"
|
"Last-Translator: Hannie Dumoleyn <hannie@ubuntu-nl.org>\n"
|
||||||
"Language-Team: Dutch <gnome-nl-list@gnome.org>\n"
|
"Language-Team: Dutch <gnome-nl-list@gnome.org>\n"
|
||||||
"Language: nl\n"
|
"Language: nl\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Generator: Poedit 1.8.11\n"
|
"X-Generator: Lokalize 2.0\n"
|
||||||
"X-Project-Style: gnome\n"
|
"X-Project-Style: gnome\n"
|
||||||
|
|
||||||
#: data/50-gnome-shell-system.xml:6
|
#: data/50-gnome-shell-system.xml:6
|
||||||
@@ -283,7 +283,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Geeft aan hoe vensters in het overzicht getoond worden. Geldige waarden zijn "
|
"Geeft aan hoe vensters in het overzicht getoond worden. Geldige waarden zijn "
|
||||||
"‘thumbnail-only’ (alleen een miniatuur tonen), ‘app-icon-only’ (alleen het "
|
"‘thumbnail-only’ (alleen een miniatuur tonen), ‘app-icon-only’ (alleen het "
|
||||||
"pictogram van de toepassing tonen) of “both” (beide tonen)."
|
"pictogram van de toepassing tonen) of ‘both’ (beide tonen)."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:186
|
#: data/org.gnome.shell.gschema.xml.in:186
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -470,7 +470,7 @@ msgstr "Oriëntatievergrendeling"
|
|||||||
msgid "lock orientation;screen;rotation"
|
msgid "lock orientation;screen;rotation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"lock orientation;screen;rotation;oriëntatievergrendeling;scherm;draaiing;"
|
"lock orientation;screen;rotation;oriëntatievergrendeling;scherm;draaiing;"
|
||||||
"rotatie;"
|
"rotatie"
|
||||||
|
|
||||||
#: js/misc/util.js:122
|
#: js/misc/util.js:122
|
||||||
msgid "Command not found"
|
msgid "Command not found"
|
||||||
@@ -1232,11 +1232,11 @@ msgstr "‘%s’ downloaden van extensions.gnome.org en daarna installeren?"
|
|||||||
#: js/ui/inhibitShortcutsDialog.js:59
|
#: js/ui/inhibitShortcutsDialog.js:59
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "%s wants to inhibit shortcuts"
|
msgid "%s wants to inhibit shortcuts"
|
||||||
msgstr "%s wil sneltoetsen inhiberen"
|
msgstr "%s wil sneltoetsen blokkeren"
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:60
|
#: js/ui/inhibitShortcutsDialog.js:60
|
||||||
msgid "Application wants to inhibit shortcuts"
|
msgid "Application wants to inhibit shortcuts"
|
||||||
msgstr "Toepassing wil sneltoetsen inhiberen"
|
msgstr "Toepassing wil sneltoetsen blokkeren"
|
||||||
|
|
||||||
#. Translators: %s is a keyboard shortcut like "Super+x"
|
#. Translators: %s is a keyboard shortcut like "Super+x"
|
||||||
#: js/ui/inhibitShortcutsDialog.js:69
|
#: js/ui/inhibitShortcutsDialog.js:69
|
||||||
@@ -1655,7 +1655,7 @@ msgstr "Locatie ingeschakeld"
|
|||||||
|
|
||||||
#: js/ui/status/location.js:90 js/ui/status/location.js:198
|
#: js/ui/status/location.js:90 js/ui/status/location.js:198
|
||||||
msgid "Disable"
|
msgid "Disable"
|
||||||
msgstr "Uischakelen"
|
msgstr "Uitschakelen"
|
||||||
|
|
||||||
#: js/ui/status/location.js:91
|
#: js/ui/status/location.js:91
|
||||||
msgid "Privacy Settings"
|
msgid "Privacy Settings"
|
||||||
@@ -1823,7 +1823,7 @@ msgstr "Wifi-instellingen"
|
|||||||
#: js/ui/status/network.js:1298
|
#: js/ui/status/network.js:1298
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "%s Hotspot Active"
|
msgid "%s Hotspot Active"
|
||||||
msgstr "%s hotspot actief"
|
msgstr "%s-hotspot actief"
|
||||||
|
|
||||||
#. Translators: %s is a network identifier
|
#. Translators: %s is a network identifier
|
||||||
#: js/ui/status/network.js:1313
|
#: js/ui/status/network.js:1313
|
||||||
@@ -1967,16 +1967,16 @@ msgstr "Pauzestand"
|
|||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Uitschakelen"
|
msgstr "Uitschakelen"
|
||||||
|
|
||||||
#: js/ui/status/thunderbolt.js:272
|
#: js/ui/status/thunderbolt.js:294
|
||||||
msgid "Thunderbolt"
|
msgid "Thunderbolt"
|
||||||
msgstr "Thunderbolt"
|
msgstr "Thunderbolt"
|
||||||
|
|
||||||
#. we are done
|
#. we are done
|
||||||
#: js/ui/status/thunderbolt.js:328
|
#: js/ui/status/thunderbolt.js:350
|
||||||
msgid "Unknown Thunderbolt device"
|
msgid "Unknown Thunderbolt device"
|
||||||
msgstr "Onbekend Thunderbolt-apparaat"
|
msgstr "Onbekend Thunderbolt-apparaat"
|
||||||
|
|
||||||
#: js/ui/status/thunderbolt.js:329
|
#: js/ui/status/thunderbolt.js:351
|
||||||
msgid ""
|
msgid ""
|
||||||
"New device has been detected while you were away. Please disconnect and "
|
"New device has been detected while you were away. Please disconnect and "
|
||||||
"reconnect the device to start using it."
|
"reconnect the device to start using it."
|
||||||
@@ -1984,11 +1984,11 @@ msgstr ""
|
|||||||
"Terwijl u weg was is er een nieuw apparaat gedetecteerd. Koppel het apparaat "
|
"Terwijl u weg was is er een nieuw apparaat gedetecteerd. Koppel het apparaat "
|
||||||
"los en verbind het opnieuw om het te gebruiken."
|
"los en verbind het opnieuw om het te gebruiken."
|
||||||
|
|
||||||
#: js/ui/status/thunderbolt.js:334
|
#: js/ui/status/thunderbolt.js:356
|
||||||
msgid "Thunderbolt authorization error"
|
msgid "Thunderbolt authorization error"
|
||||||
msgstr "Thunderbolt-autorisatiefout"
|
msgstr "Thunderbolt-autorisatiefout"
|
||||||
|
|
||||||
#: js/ui/status/thunderbolt.js:335
|
#: js/ui/status/thunderbolt.js:357
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Could not authorize the thunderbolt device: %s"
|
msgid "Could not authorize the thunderbolt device: %s"
|
||||||
msgstr "Kon het Thunderbolt-apparaat niet autoriseren: %s"
|
msgstr "Kon het Thunderbolt-apparaat niet autoriseren: %s"
|
||||||
@@ -2162,7 +2162,7 @@ msgstr "De modus die door GDM voor het aanmeldscherm gebruikt wordt"
|
|||||||
|
|
||||||
#: src/main.c:444
|
#: src/main.c:444
|
||||||
msgid "Use a specific mode, e.g. “gdm” for login screen"
|
msgid "Use a specific mode, e.g. “gdm” for login screen"
|
||||||
msgstr "Specifieke modus gebruiken, bijv. “gdm” voor het aanmeldscherm"
|
msgstr "Specifieke modus gebruiken, bijv. ‘gdm’ voor het aanmeldscherm"
|
||||||
|
|
||||||
#: src/main.c:450
|
#: src/main.c:450
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
@@ -2176,7 +2176,7 @@ msgstr "Onbekend"
|
|||||||
#: src/shell-app.c:511
|
#: src/shell-app.c:511
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to launch “%s”"
|
msgid "Failed to launch “%s”"
|
||||||
msgstr "Kon “%s” niet starten"
|
msgstr "Kon ‘%s’ niet starten"
|
||||||
|
|
||||||
#: src/shell-keyring-prompt.c:730
|
#: src/shell-keyring-prompt.c:730
|
||||||
msgid "Passwords do not match."
|
msgid "Passwords do not match."
|
||||||
|
376
po/pt_BR.po
376
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
569
po/zh_CN.po
569
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
384
po/zh_TW.po
384
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -73,8 +73,8 @@ struct _ShellGlobal {
|
|||||||
ShellWM *wm;
|
ShellWM *wm;
|
||||||
GSettings *settings;
|
GSettings *settings;
|
||||||
const char *datadir;
|
const char *datadir;
|
||||||
const char *imagedir;
|
char *imagedir;
|
||||||
const char *userdatadir;
|
char *userdatadir;
|
||||||
GFile *userdatadir_path;
|
GFile *userdatadir_path;
|
||||||
GFile *runtime_state_path;
|
GFile *runtime_state_path;
|
||||||
|
|
||||||
@@ -337,6 +337,10 @@ shell_global_finalize (GObject *object)
|
|||||||
g_clear_object (&global->userdatadir_path);
|
g_clear_object (&global->userdatadir_path);
|
||||||
g_clear_object (&global->runtime_state_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);
|
G_OBJECT_CLASS(shell_global_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -142,7 +142,7 @@ libst_gir = gnome.generate_gir(libst,
|
|||||||
sources: st_gir_sources,
|
sources: st_gir_sources,
|
||||||
nsversion: '1.0',
|
nsversion: '1.0',
|
||||||
namespace: 'St',
|
namespace: 'St',
|
||||||
includes: ['Clutter-' + mutter_api_version, 'Gtk-3.0'],
|
includes: ['Clutter-' + mutter_api_version, 'Cally-' + mutter_api_version, 'Gtk-3.0'],
|
||||||
dependencies: [mutter_dep],
|
dependencies: [mutter_dep],
|
||||||
include_directories: include_directories('..'),
|
include_directories: include_directories('..'),
|
||||||
extra_args: ['-DST_COMPILATION', '--quiet'],
|
extra_args: ['-DST_COMPILATION', '--quiet'],
|
||||||
|
@@ -177,15 +177,15 @@ st_bin_get_preferred_height (ClutterActor *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_bin_dispose (GObject *gobject)
|
st_bin_destroy (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (gobject));
|
StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (actor));
|
||||||
|
|
||||||
if (priv->child)
|
if (priv->child)
|
||||||
clutter_actor_destroy (priv->child);
|
clutter_actor_destroy (priv->child);
|
||||||
g_assert (priv->child == NULL);
|
g_assert (priv->child == NULL);
|
||||||
|
|
||||||
G_OBJECT_CLASS (st_bin_parent_class)->dispose (gobject);
|
CLUTTER_ACTOR_CLASS (st_bin_parent_class)->destroy (actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -315,11 +315,11 @@ st_bin_class_init (StBinClass *klass)
|
|||||||
|
|
||||||
gobject_class->set_property = st_bin_set_property;
|
gobject_class->set_property = st_bin_set_property;
|
||||||
gobject_class->get_property = st_bin_get_property;
|
gobject_class->get_property = st_bin_get_property;
|
||||||
gobject_class->dispose = st_bin_dispose;
|
|
||||||
|
|
||||||
actor_class->get_preferred_width = st_bin_get_preferred_width;
|
actor_class->get_preferred_width = st_bin_get_preferred_width;
|
||||||
actor_class->get_preferred_height = st_bin_get_preferred_height;
|
actor_class->get_preferred_height = st_bin_get_preferred_height;
|
||||||
actor_class->allocate = st_bin_allocate;
|
actor_class->allocate = st_bin_allocate;
|
||||||
|
actor_class->destroy = st_bin_destroy;
|
||||||
|
|
||||||
widget_class->popup_menu = st_bin_popup_menu;
|
widget_class->popup_menu = st_bin_popup_menu;
|
||||||
widget_class->navigate_focus = st_bin_navigate_focus;
|
widget_class->navigate_focus = st_bin_navigate_focus;
|
||||||
|
@@ -90,7 +90,7 @@ adjustment_value_notify_cb (StAdjustment *adjustment,
|
|||||||
GParamSpec *pspec,
|
GParamSpec *pspec,
|
||||||
StBoxLayout *box)
|
StBoxLayout *box)
|
||||||
{
|
{
|
||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (box));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (box));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -490,7 +490,7 @@ st_box_layout_get_paint_volume (ClutterActor *actor,
|
|||||||
ClutterPaintVolume *volume)
|
ClutterPaintVolume *volume)
|
||||||
{
|
{
|
||||||
StBoxLayout *self = ST_BOX_LAYOUT (actor);
|
StBoxLayout *self = ST_BOX_LAYOUT (actor);
|
||||||
gdouble x, y;
|
gdouble x, y, lower, upper;
|
||||||
StBoxLayoutPrivate *priv = self->priv;
|
StBoxLayoutPrivate *priv = self->priv;
|
||||||
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
|
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
|
||||||
ClutterActorBox allocation_box;
|
ClutterActorBox allocation_box;
|
||||||
@@ -505,13 +505,42 @@ st_box_layout_get_paint_volume (ClutterActor *actor,
|
|||||||
* our paint volume on that. */
|
* our paint volume on that. */
|
||||||
if (priv->hadjustment || priv->vadjustment)
|
if (priv->hadjustment || priv->vadjustment)
|
||||||
{
|
{
|
||||||
|
gdouble width, height;
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (actor, &allocation_box);
|
clutter_actor_get_allocation_box (actor, &allocation_box);
|
||||||
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
|
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
|
||||||
origin.x = content_box.x1 - allocation_box.x1;
|
origin.x = content_box.x1 - allocation_box.x1;
|
||||||
origin.y = content_box.y1 - allocation_box.y2;
|
origin.y = content_box.y1 - allocation_box.y2;
|
||||||
origin.z = 0.f;
|
origin.z = 0.f;
|
||||||
clutter_paint_volume_set_width (volume, content_box.x2 - content_box.x1);
|
|
||||||
clutter_paint_volume_set_height (volume, content_box.y2 - content_box.y1);
|
if (priv->hadjustment)
|
||||||
|
{
|
||||||
|
g_object_get (priv->hadjustment,
|
||||||
|
"lower", &lower,
|
||||||
|
"upper", &upper,
|
||||||
|
NULL);
|
||||||
|
width = upper - lower;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
width = content_box.x2 - content_box.x1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priv->vadjustment)
|
||||||
|
{
|
||||||
|
g_object_get (priv->vadjustment,
|
||||||
|
"lower", &lower,
|
||||||
|
"upper", &upper,
|
||||||
|
NULL);
|
||||||
|
height = upper - lower;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
height = content_box.y2 - content_box.y1;
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_paint_volume_set_width (volume, width);
|
||||||
|
clutter_paint_volume_set_height (volume, height);
|
||||||
}
|
}
|
||||||
else if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume))
|
else if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -906,6 +906,13 @@ st_entry_unmap (ClutterActor *actor)
|
|||||||
CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor);
|
CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
st_entry_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
return clutter_paint_volume_set_from_allocation (volume, actor);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_entry_class_init (StEntryClass *klass)
|
st_entry_class_init (StEntryClass *klass)
|
||||||
{
|
{
|
||||||
@@ -923,6 +930,7 @@ st_entry_class_init (StEntryClass *klass)
|
|||||||
actor_class->allocate = st_entry_allocate;
|
actor_class->allocate = st_entry_allocate;
|
||||||
actor_class->paint = st_entry_paint;
|
actor_class->paint = st_entry_paint;
|
||||||
actor_class->unmap = st_entry_unmap;
|
actor_class->unmap = st_entry_unmap;
|
||||||
|
actor_class->get_paint_volume = st_entry_get_paint_volume;
|
||||||
|
|
||||||
actor_class->key_press_event = st_entry_key_press_event;
|
actor_class->key_press_event = st_entry_key_press_event;
|
||||||
actor_class->key_focus_in = st_entry_key_focus_in;
|
actor_class->key_focus_in = st_entry_key_focus_in;
|
||||||
@@ -1287,10 +1295,10 @@ st_entry_get_input_hints (StEntry *entry)
|
|||||||
return clutter_text_get_input_hints (CLUTTER_TEXT (priv->entry));
|
return clutter_text_get_input_hints (CLUTTER_TEXT (priv->entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
_st_entry_icon_press_cb (ClutterActor *actor,
|
_st_entry_icon_clicked_cb (ClutterClickAction *action,
|
||||||
ClutterButtonEvent *event,
|
ClutterActor *actor,
|
||||||
StEntry *entry)
|
StEntry *entry)
|
||||||
{
|
{
|
||||||
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
|
StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
|
||||||
|
|
||||||
@@ -1298,8 +1306,6 @@ _st_entry_icon_press_cb (ClutterActor *actor,
|
|||||||
g_signal_emit (entry, entry_signals[PRIMARY_ICON_CLICKED], 0);
|
g_signal_emit (entry, entry_signals[PRIMARY_ICON_CLICKED], 0);
|
||||||
else
|
else
|
||||||
g_signal_emit (entry, entry_signals[SECONDARY_ICON_CLICKED], 0);
|
g_signal_emit (entry, entry_signals[SECONDARY_ICON_CLICKED], 0);
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1309,21 +1315,24 @@ _st_entry_set_icon (StEntry *entry,
|
|||||||
{
|
{
|
||||||
if (*icon)
|
if (*icon)
|
||||||
{
|
{
|
||||||
g_signal_handlers_disconnect_by_func (*icon,
|
clutter_actor_remove_action_by_name (*icon, "entry-icon-action");
|
||||||
_st_entry_icon_press_cb,
|
|
||||||
entry);
|
|
||||||
clutter_actor_remove_child (CLUTTER_ACTOR (entry), *icon);
|
clutter_actor_remove_child (CLUTTER_ACTOR (entry), *icon);
|
||||||
*icon = NULL;
|
*icon = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_icon)
|
if (new_icon)
|
||||||
{
|
{
|
||||||
|
ClutterAction *action;
|
||||||
|
|
||||||
*icon = g_object_ref (new_icon);
|
*icon = g_object_ref (new_icon);
|
||||||
|
|
||||||
clutter_actor_set_reactive (*icon, TRUE);
|
clutter_actor_set_reactive (*icon, TRUE);
|
||||||
clutter_actor_add_child (CLUTTER_ACTOR (entry), *icon);
|
clutter_actor_add_child (CLUTTER_ACTOR (entry), *icon);
|
||||||
g_signal_connect (*icon, "button-release-event",
|
|
||||||
G_CALLBACK (_st_entry_icon_press_cb), entry);
|
action = clutter_click_action_new ();
|
||||||
|
clutter_actor_add_action_with_name (*icon, "entry-icon-action", action);
|
||||||
|
g_signal_connect (action, "clicked",
|
||||||
|
G_CALLBACK (_st_entry_icon_clicked_cb), entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (entry));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (entry));
|
||||||
|
@@ -180,6 +180,7 @@ st_label_dispose (GObject *object)
|
|||||||
{
|
{
|
||||||
StLabelPrivate *priv = ST_LABEL (object)->priv;
|
StLabelPrivate *priv = ST_LABEL (object)->priv;
|
||||||
|
|
||||||
|
priv->label = NULL;
|
||||||
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
||||||
|
|
||||||
G_OBJECT_CLASS (st_label_parent_class)->dispose (object);
|
G_OBJECT_CLASS (st_label_parent_class)->dispose (object);
|
||||||
|
@@ -414,11 +414,9 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
|
|||||||
ClutterActor *actor)
|
ClutterActor *actor)
|
||||||
{
|
{
|
||||||
CoglPipeline *shadow_pipeline = NULL;
|
CoglPipeline *shadow_pipeline = NULL;
|
||||||
ClutterActorBox box;
|
|
||||||
float width, height;
|
float width, height;
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (actor, &box);
|
clutter_actor_get_size (actor, &width, &height);
|
||||||
clutter_actor_box_get_size (&box, &width, &height);
|
|
||||||
|
|
||||||
if (width == 0 || height == 0)
|
if (width == 0 || height == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -441,6 +439,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
|
|||||||
CoglFramebuffer *fb;
|
CoglFramebuffer *fb;
|
||||||
CoglColor clear_color;
|
CoglColor clear_color;
|
||||||
CoglError *catch_error = NULL;
|
CoglError *catch_error = NULL;
|
||||||
|
float x, y;
|
||||||
|
|
||||||
buffer = cogl_texture_new_with_size (width,
|
buffer = cogl_texture_new_with_size (width,
|
||||||
height,
|
height,
|
||||||
@@ -462,6 +461,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
|
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
|
/* XXX: There's no way to render a ClutterActor to an offscreen
|
||||||
* as it uses the implicit API. */
|
* as it uses the implicit API. */
|
||||||
@@ -470,7 +470,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
|
|||||||
G_GNUC_END_IGNORE_DEPRECATIONS;
|
G_GNUC_END_IGNORE_DEPRECATIONS;
|
||||||
|
|
||||||
cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
|
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);
|
cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.0);
|
||||||
|
|
||||||
clutter_actor_set_opacity_override (actor, 255);
|
clutter_actor_set_opacity_override (actor, 255);
|
||||||
|
@@ -304,6 +304,13 @@ st_scroll_view_pick (ClutterActor *actor,
|
|||||||
clutter_actor_paint (priv->vscroll);
|
clutter_actor_paint (priv->vscroll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
st_scroll_view_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
return clutter_paint_volume_set_from_allocation (volume, actor);
|
||||||
|
}
|
||||||
|
|
||||||
static double
|
static double
|
||||||
get_scrollbar_width (StScrollView *scroll,
|
get_scrollbar_width (StScrollView *scroll,
|
||||||
gfloat for_height)
|
gfloat for_height)
|
||||||
@@ -793,6 +800,7 @@ st_scroll_view_class_init (StScrollViewClass *klass)
|
|||||||
|
|
||||||
actor_class->paint = st_scroll_view_paint;
|
actor_class->paint = st_scroll_view_paint;
|
||||||
actor_class->pick = st_scroll_view_pick;
|
actor_class->pick = st_scroll_view_pick;
|
||||||
|
actor_class->get_paint_volume = st_scroll_view_get_paint_volume;
|
||||||
actor_class->get_preferred_width = st_scroll_view_get_preferred_width;
|
actor_class->get_preferred_width = st_scroll_view_get_preferred_width;
|
||||||
actor_class->get_preferred_height = st_scroll_view_get_preferred_height;
|
actor_class->get_preferred_height = st_scroll_view_get_preferred_height;
|
||||||
actor_class->allocate = st_scroll_view_allocate;
|
actor_class->allocate = st_scroll_view_allocate;
|
||||||
|
@@ -37,6 +37,7 @@ struct _StTextureCachePrivate
|
|||||||
|
|
||||||
/* Things that were loaded with a cache policy != NONE */
|
/* Things that were loaded with a cache policy != NONE */
|
||||||
GHashTable *keyed_cache; /* char * -> CoglTexture* */
|
GHashTable *keyed_cache; /* char * -> CoglTexture* */
|
||||||
|
GHashTable *keyed_surface_cache; /* char * -> cairo_surface_t* */
|
||||||
|
|
||||||
/* Presently this is used to de-duplicate requests for GIcons and async URIs. */
|
/* Presently this is used to de-duplicate requests for GIcons and async URIs. */
|
||||||
GHashTable *outstanding_requests; /* char * -> AsyncTextureLoadData * */
|
GHashTable *outstanding_requests; /* char * -> AsyncTextureLoadData * */
|
||||||
@@ -145,6 +146,10 @@ st_texture_cache_init (StTextureCache *self)
|
|||||||
|
|
||||||
self->priv->keyed_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
|
self->priv->keyed_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
g_free, cogl_object_unref);
|
g_free, cogl_object_unref);
|
||||||
|
self->priv->keyed_surface_cache = g_hash_table_new_full (g_str_hash,
|
||||||
|
g_str_equal,
|
||||||
|
g_free,
|
||||||
|
(GDestroyNotify) cairo_surface_destroy);
|
||||||
self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal,
|
self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
g_free, NULL);
|
g_free, NULL);
|
||||||
self->priv->file_monitors = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
|
self->priv->file_monitors = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
|
||||||
@@ -166,6 +171,7 @@ st_texture_cache_dispose (GObject *object)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy);
|
g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy);
|
||||||
|
g_clear_pointer (&self->priv->keyed_surface_cache, g_hash_table_destroy);
|
||||||
g_clear_pointer (&self->priv->outstanding_requests, g_hash_table_destroy);
|
g_clear_pointer (&self->priv->outstanding_requests, g_hash_table_destroy);
|
||||||
g_clear_pointer (&self->priv->file_monitors, g_hash_table_destroy);
|
g_clear_pointer (&self->priv->file_monitors, g_hash_table_destroy);
|
||||||
|
|
||||||
@@ -520,6 +526,8 @@ finish_texture_load (AsyncTextureLoadData *data,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
texdata = pixbuf_to_cogl_texture (pixbuf);
|
texdata = pixbuf_to_cogl_texture (pixbuf);
|
||||||
|
if (!texdata)
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (data->policy != ST_TEXTURE_CACHE_POLICY_NONE)
|
if (data->policy != ST_TEXTURE_CACHE_POLICY_NONE)
|
||||||
{
|
{
|
||||||
@@ -772,13 +780,13 @@ st_texture_cache_load (StTextureCache *cache,
|
|||||||
if (!texture)
|
if (!texture)
|
||||||
{
|
{
|
||||||
texture = load (cache, key, data, error);
|
texture = load (cache, key, data, error);
|
||||||
if (texture)
|
if (texture && policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
|
||||||
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texture);
|
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texture);
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_object_ref (texture);
|
if (texture && policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
|
||||||
|
cogl_object_ref (texture);
|
||||||
|
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -976,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);
|
||||||
@@ -986,7 +994,7 @@ file_changed_cb (GFileMonitor *monitor,
|
|||||||
g_free (key);
|
g_free (key);
|
||||||
|
|
||||||
key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", file_hash);
|
key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", file_hash);
|
||||||
g_hash_table_remove (cache->priv->keyed_cache, key);
|
g_hash_table_remove (cache->priv->keyed_surface_cache, key);
|
||||||
g_free (key);
|
g_free (key);
|
||||||
|
|
||||||
g_signal_emit (cache, signals[TEXTURE_FILE_CHANGED], 0, file);
|
g_signal_emit (cache, signals[TEXTURE_FILE_CHANGED], 0, file);
|
||||||
@@ -1273,6 +1281,9 @@ st_texture_cache_load_file_sync_to_cogl_texture (StTextureCache *cache,
|
|||||||
texdata = pixbuf_to_cogl_texture (pixbuf);
|
texdata = pixbuf_to_cogl_texture (pixbuf);
|
||||||
g_object_unref (pixbuf);
|
g_object_unref (pixbuf);
|
||||||
|
|
||||||
|
if (!texdata)
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
|
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
|
||||||
{
|
{
|
||||||
cogl_object_ref (texdata);
|
cogl_object_ref (texdata);
|
||||||
@@ -1304,7 +1315,7 @@ st_texture_cache_load_file_sync_to_cairo_surface (StTextureCache *cache,
|
|||||||
|
|
||||||
key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", g_file_hash (file));
|
key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", g_file_hash (file));
|
||||||
|
|
||||||
surface = g_hash_table_lookup (cache->priv->keyed_cache, key);
|
surface = g_hash_table_lookup (cache->priv->keyed_surface_cache, key);
|
||||||
|
|
||||||
if (surface == NULL)
|
if (surface == NULL)
|
||||||
{
|
{
|
||||||
@@ -1318,7 +1329,8 @@ st_texture_cache_load_file_sync_to_cairo_surface (StTextureCache *cache,
|
|||||||
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
|
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
|
||||||
{
|
{
|
||||||
cairo_surface_reference (surface);
|
cairo_surface_reference (surface);
|
||||||
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), surface);
|
g_hash_table_insert (cache->priv->keyed_surface_cache,
|
||||||
|
g_strdup (key), surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -229,9 +229,9 @@ unpremultiply (ClutterColor *color)
|
|||||||
{
|
{
|
||||||
if (color->alpha != 0)
|
if (color->alpha != 0)
|
||||||
{
|
{
|
||||||
color->red = (color->red * 255 + 127) / color->alpha;
|
color->red = MIN((color->red * 255 + 127) / color->alpha, 255);
|
||||||
color->green = (color->green * 255 + 127) / color->alpha;
|
color->green = MIN((color->green * 255 + 127) / color->alpha, 255);
|
||||||
color->blue = (color->blue * 255 + 127) / color->alpha;
|
color->blue = MIN((color->blue * 255 + 127) / color->alpha, 255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -402,7 +402,7 @@ st_theme_node_lookup_corner (StThemeNode *node,
|
|||||||
return COGL_INVALID_HANDLE;
|
return COGL_INVALID_HANDLE;
|
||||||
|
|
||||||
key = corner_to_string (&corner);
|
key = corner_to_string (&corner);
|
||||||
texture = st_texture_cache_load (cache, key, ST_TEXTURE_CACHE_POLICY_NONE, load_corner, &corner, NULL);
|
texture = st_texture_cache_load (cache, key, ST_TEXTURE_CACHE_POLICY_FOREVER, load_corner, &corner, NULL);
|
||||||
|
|
||||||
if (texture)
|
if (texture)
|
||||||
{
|
{
|
||||||
@@ -1414,6 +1414,32 @@ st_theme_node_load_background_image (StThemeNode *node)
|
|||||||
return node->background_texture != COGL_INVALID_HANDLE;
|
return node->background_texture != COGL_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
st_theme_node_invalidate_resources_for_file (StThemeNode *node,
|
||||||
|
GFile *file)
|
||||||
|
{
|
||||||
|
StBorderImage *border_image;
|
||||||
|
gboolean changed = FALSE;
|
||||||
|
GFile *theme_file;
|
||||||
|
|
||||||
|
theme_file = st_theme_node_get_background_image (node);
|
||||||
|
if ((theme_file != NULL) && g_file_equal (theme_file, file))
|
||||||
|
{
|
||||||
|
st_theme_node_invalidate_background_image (node);
|
||||||
|
changed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
border_image = st_theme_node_get_border_image (node);
|
||||||
|
theme_file = border_image ? st_border_image_get_file (border_image) : NULL;
|
||||||
|
if ((theme_file != NULL) && g_file_equal (theme_file, file))
|
||||||
|
{
|
||||||
|
st_theme_node_invalidate_border_image (node);
|
||||||
|
changed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
static void st_theme_node_prerender_shadow (StThemeNodePaintState *state);
|
static void st_theme_node_prerender_shadow (StThemeNodePaintState *state);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -2751,3 +2777,17 @@ st_theme_node_paint_state_invalidate (StThemeNodePaintState *state)
|
|||||||
state->alloc_width = 0;
|
state->alloc_width = 0;
|
||||||
state->alloc_height = 0;
|
state->alloc_height = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
st_theme_node_paint_state_invalidate_for_file (StThemeNodePaintState *state,
|
||||||
|
GFile *file)
|
||||||
|
{
|
||||||
|
if (state->node != NULL &&
|
||||||
|
st_theme_node_invalidate_resources_for_file (state->node, file))
|
||||||
|
{
|
||||||
|
st_theme_node_paint_state_invalidate (state);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
@@ -287,6 +287,9 @@ void st_theme_node_paint_state_free (StThemeNodePaintState *state);
|
|||||||
void st_theme_node_paint_state_copy (StThemeNodePaintState *state,
|
void st_theme_node_paint_state_copy (StThemeNodePaintState *state,
|
||||||
StThemeNodePaintState *other);
|
StThemeNodePaintState *other);
|
||||||
void st_theme_node_paint_state_invalidate (StThemeNodePaintState *state);
|
void st_theme_node_paint_state_invalidate (StThemeNodePaintState *state);
|
||||||
|
gboolean st_theme_node_paint_state_invalidate_for_file (StThemeNodePaintState *state,
|
||||||
|
GFile *file);
|
||||||
|
|
||||||
void st_theme_node_paint_state_set_node (StThemeNodePaintState *state,
|
void st_theme_node_paint_state_set_node (StThemeNodePaintState *state,
|
||||||
StThemeNode *node);
|
StThemeNode *node);
|
||||||
|
|
||||||
|
@@ -289,44 +289,17 @@ st_widget_texture_cache_changed (StTextureCache *cache,
|
|||||||
{
|
{
|
||||||
StWidget *actor = ST_WIDGET (user_data);
|
StWidget *actor = ST_WIDGET (user_data);
|
||||||
StWidgetPrivate *priv = st_widget_get_instance_private (actor);
|
StWidgetPrivate *priv = st_widget_get_instance_private (actor);
|
||||||
StThemeNode *node = priv->theme_node;
|
|
||||||
StBorderImage *border_image;
|
|
||||||
gboolean changed = FALSE;
|
gboolean changed = FALSE;
|
||||||
GFile *theme_file;
|
int i;
|
||||||
|
|
||||||
if (node == NULL)
|
for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++)
|
||||||
return;
|
|
||||||
|
|
||||||
theme_file = st_theme_node_get_background_image (node);
|
|
||||||
if ((theme_file != NULL) && g_file_equal (theme_file, file))
|
|
||||||
{
|
{
|
||||||
st_theme_node_invalidate_background_image (node);
|
StThemeNodePaintState *paint_state = &priv->paint_states[i];
|
||||||
changed = TRUE;
|
changed |= st_theme_node_paint_state_invalidate_for_file (paint_state, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
border_image = st_theme_node_get_border_image (node);
|
if (changed && clutter_actor_is_mapped (CLUTTER_ACTOR (actor)))
|
||||||
theme_file = border_image ? st_border_image_get_file (border_image) : NULL;
|
clutter_actor_queue_redraw (CLUTTER_ACTOR (actor));
|
||||||
if ((theme_file != NULL) && g_file_equal (theme_file, file))
|
|
||||||
{
|
|
||||||
st_theme_node_invalidate_border_image (node);
|
|
||||||
changed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (changed)
|
|
||||||
{
|
|
||||||
/* If we prerender the background / border, we need to update
|
|
||||||
* the paint state. We should probably implement a method to
|
|
||||||
* the theme node to determine this, but for now, just wipe
|
|
||||||
* the entire paint state.
|
|
||||||
*
|
|
||||||
* Use the existing state instead of a new one because it's
|
|
||||||
* assumed the rest of the state will stay the same.
|
|
||||||
*/
|
|
||||||
st_theme_node_paint_state_invalidate (current_paint_state (actor));
|
|
||||||
|
|
||||||
if (clutter_actor_is_mapped (CLUTTER_ACTOR (actor)))
|
|
||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (actor));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -38,6 +38,10 @@ const tests = [
|
|||||||
output: [ { url: 'http://www.gnome.org:99/port', pos: 10 } ] },
|
output: [ { url: 'http://www.gnome.org:99/port', pos: 10 } ] },
|
||||||
{ input: 'This is an ftp://www.gnome.org/ test.',
|
{ input: 'This is an ftp://www.gnome.org/ test.',
|
||||||
output: [ { url: 'ftp://www.gnome.org/', pos: 11 } ] },
|
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',
|
{ input: 'Visit http://www.gnome.org/ and http://developer.gnome.org',
|
||||||
output: [ { url: 'http://www.gnome.org/', pos: 6 },
|
output: [ { url: 'http://www.gnome.org/', pos: 6 },
|
||||||
|
Reference in New Issue
Block a user