1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
// SPDX-FileCopyrightText: 2023 Deminder <tremminder@gmail.com>
// SPDX-License-Identifier: GPL-3.0-or-later
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
/**
* Add an external indicator after an existing indicator and above an existing indicator item.
*/
export function addExternalIndicator(
tracker,
indicator,
after = '_system',
above = '_backgroundApps',
colSpan
) {
const qs = Main.panel.statusArea.quickSettings;
const indicatorItems = indicator.quickSettingsItems;
const aboveIndicator = qs[above];
if (aboveIndicator === undefined) {
if ('_addItems' in qs) {
// 45.beta.1: _setupIndicators is not done
const injection = tracker.injectProperty(
qs,
'_addItems',
(items, col) => {
if (Object.is(items, qs[above].quickSettingsItems)) {
injection.clear();
// Insert after: insert_child_above(a,b): inserts 'a' after 'b'
qs._indicators.insert_child_above(indicator, qs[after]);
// Insert above
injection.original.call(qs, indicatorItems, colSpan);
}
injection.previous.call(qs, items, col);
}
);
} else {
// 45.rc: _setupIndicators is not done
const qsm = qs.menu;
const injection = tracker.injectProperty(
qsm,
'_completeAddItem',
(item, col) => {
const firstAboveItem = qs[above]?.quickSettingsItems.at(-1);
if (Object.is(firstAboveItem, item)) {
injection.clear();
// Insert after: insert_child_above(a,b): inserts 'a' after 'b'
qs._indicators.insert_child_above(indicator, qs[after]);
// Insert above
indicatorItems.forEach(newItem =>
qsm.insertItemBefore(newItem, item, colSpan)
);
}
injection.previous.call(qsm, item, col);
}
);
}
} else if ('_addItems' in qs) {
// 45.beta.1: _setupIndicators is done
// Insert after: insert_child_above(a,b): inserts 'a' after 'b'
qs._indicators.insert_child_above(indicator, qs[after]);
// Insert above
qs._addItems(indicatorItems, colSpan);
const firstAboveItem = aboveIndicator.quickSettingsItems.at(-1);
indicatorItems.forEach(item => {
qs.menu._grid.remove_child(item);
qs.menu._grid.insert_child_below(item, firstAboveItem);
});
} else {
// 45.rc: _setupIndicators is done
// Insert after
qs._indicators.insert_child_above(indicator, qs[after]);
// Insert above
const firstAboveItem = aboveIndicator.quickSettingsItems.at(-1);
qs._addItemsBefore(indicatorItems, firstAboveItem, colSpan);
}
}
|