summaryrefslogtreecommitdiff
path: root/raveos-theme/gnome/theme-data/extensions/installed/ShutdownTimer@deminder/modules/quicksettings.js
blob: dd7b161bff9ca0963cf51757c273abf0faa0eda3 (plain)
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);
  }
}