something-x-dev 1.8.0.dev21__tar.gz → 1.8.0.dev23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/PKG-INFO +1 -1
  2. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/ROADMAP.md +2 -2
  3. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/_version.py +2 -2
  4. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/application.py +0 -2
  5. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/pages/device.py +2 -5
  6. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/profiles.py +2 -2
  7. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/protocol.py +22 -18
  8. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/something_x_dev.egg-info/PKG-INFO +1 -1
  9. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/something_x_dev.egg-info/SOURCES.txt +0 -3
  10. something_x_dev-1.8.0.dev23/somethingx +3 -0
  11. something_x_dev-1.8.0.dev21/data/style.css +0 -355
  12. something_x_dev-1.8.0.dev21/main.py +0 -10
  13. something_x_dev-1.8.0.dev21/requirements.txt +0 -3
  14. something_x_dev-1.8.0.dev21/somethingx +0 -3
  15. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/.github/CODEOWNERS +0 -0
  16. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/.github/workflows/ci.yml +0 -0
  17. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/.github/workflows/release-dev.yml +0 -0
  18. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/.github/workflows/release.yml +0 -0
  19. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/.gitignore +0 -0
  20. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/DEVICES.md +0 -0
  21. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/LICENSE +0 -0
  22. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/PKGBUILD +0 -0
  23. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/README.md +0 -0
  24. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/cliff.toml +0 -0
  25. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/docs/RELEASING.md +0 -0
  26. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/docs/docs.html +0 -0
  27. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/docs/index.html +0 -0
  28. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/flake.nix +0 -0
  29. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/__init__.py +0 -0
  30. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/bluetooth.py +0 -0
  31. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/data/__init__.py +0 -0
  32. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/data/com.something.x.omarchy.desktop +0 -0
  33. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/data/style.css +0 -0
  34. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/pages/__init__.py +0 -0
  35. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/pages/home.py +0 -0
  36. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/splash.py +0 -0
  37. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/tray.py +0 -0
  38. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/nothing_app/window.py +0 -0
  39. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/pyproject.toml +0 -0
  40. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/setup.cfg +0 -0
  41. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/something_x_dev.egg-info/dependency_links.txt +0 -0
  42. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/something_x_dev.egg-info/entry_points.txt +0 -0
  43. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/something_x_dev.egg-info/requires.txt +0 -0
  44. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/something_x_dev.egg-info/top_level.txt +0 -0
  45. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/tests/__init__.py +0 -0
  46. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/tests/conftest.py +0 -0
  47. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/tests/test_bluetooth.py +0 -0
  48. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/tests/test_crc.py +0 -0
  49. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/tests/test_profiles.py +0 -0
  50. {something_x_dev-1.8.0.dev21 → something_x_dev-1.8.0.dev23}/tests/test_protocol.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: something-x-dev
3
- Version: 1.8.0.dev21
3
+ Version: 1.8.0.dev23
4
4
  Summary: Something X device manager for Omarchy / Linux
5
5
  Author: Raphael
6
6
  License: MIT
@@ -46,8 +46,8 @@
46
46
  - [ ] **Firmware update check** — compare device firmware against latest known version, show badge
47
47
 
48
48
  ### Tech
49
- - [ ] **Async BlueZ** — replace `dbus-python` with `dbus-fast` for non-blocking I/O
50
- - [ ] **Unit tests** — protocol encode/decode, CRC, ANC mode mapping
49
+ - [x] **Async BlueZ** — replaced `dbus-python` with native `Gio` async D-Bus (non-blocking, no extra dependency)
50
+ - [x] **Unit tests** — 65 tests covering CRC, protocol parsing, battery dedup, profiles, and BluetoothManager
51
51
 
52
52
  ---
53
53
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.8.0.dev21'
22
- __version_tuple__ = version_tuple = (1, 8, 0, 'dev21')
21
+ __version__ = version = '1.8.0.dev23'
22
+ __version_tuple__ = version_tuple = (1, 8, 0, 'dev23')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -37,8 +37,6 @@ def _css_path() -> str:
37
37
  ref = importlib.resources.files("nothing_app.data").joinpath("style.css")
38
38
  return str(ref)
39
39
  except Exception:
40
- import os
41
-
42
40
  return os.path.join(os.path.dirname(__file__), "data", "style.css")
43
41
 
44
42
 
@@ -11,6 +11,7 @@ gi.require_version("PangoCairo", "1.0")
11
11
  from gi.repository import Gtk, GLib, PangoCairo
12
12
 
13
13
  from ..bluetooth import BluetoothDevice, BluetoothManager
14
+ from ..protocol import NothingDevice, ANCMode, EQ_PRESETS
14
15
 
15
16
 
16
17
  def _mono_font() -> str:
@@ -22,7 +23,6 @@ def _mono_font() -> str:
22
23
 
23
24
 
24
25
  _MONO = _mono_font()
25
- from ..protocol import NothingDevice, ANCMode, EQ_PRESETS
26
26
 
27
27
 
28
28
  def _find_bt_sink(address: str) -> str | None:
@@ -303,8 +303,6 @@ class DevicePage(Gtk.Box):
303
303
  self._vol_handler: int | None = None
304
304
  self._bt_conn_handler = bt_manager.connect("device-connected", self._on_bt_device_connected)
305
305
  self._bt_disc_handler = bt_manager.connect("device-disconnected", self._on_bt_device_disconnected)
306
- self._connect_retries = 0
307
- self._connect_retry_id: int | None = None
308
306
  self._build()
309
307
  if bt_device.is_nothing:
310
308
  self._connect_nothing(nothing_dev)
@@ -546,11 +544,10 @@ class DevicePage(Gtk.Box):
546
544
  self._sn_label.set_label(state.serial_number or "—")
547
545
 
548
546
  def _on_rfcomm_connected(self, _dev):
549
- print(f"[device page] RFCOMM connected to {self._bt_device.name}")
550
547
  GLib.timeout_add(800, self._query_volume)
551
548
 
552
549
  def _on_rfcomm_disconnected(self, _dev):
553
- print(f"[device page] RFCOMM disconnected from {self._bt_device.name}")
550
+ pass
554
551
 
555
552
  def _query_volume(self):
556
553
  def _run():
@@ -29,8 +29,8 @@ def save(address: str, anc_mode: int, eq_preset: str):
29
29
 
30
30
  def get_last_device() -> str | None:
31
31
  try:
32
- addr = open(_LAST_DEV_FILE).read().strip()
33
- return addr or None
32
+ with open(_LAST_DEV_FILE) as f:
33
+ return f.read().strip() or None
34
34
  except FileNotFoundError:
35
35
  return None
36
36
 
@@ -136,6 +136,7 @@ class NothingDevice(GObject.Object):
136
136
  "connected": (GObject.SignalFlags.RUN_FIRST, None, ()),
137
137
  "disconnected": (GObject.SignalFlags.RUN_FIRST, None, ()),
138
138
  }
139
+ _LOW_BAT_THRESHOLDS = (20, 15, 10, 5)
139
140
 
140
141
  def __init__(self, address: str):
141
142
  super().__init__()
@@ -150,6 +151,7 @@ class NothingDevice(GObject.Object):
150
151
  self._last_anc_level: int = _ANC_STRONG
151
152
  self._thread: threading.Thread | None = None
152
153
  self._low_bat_notified: dict[str, set[int]] = {}
154
+ self._low_bat_seen: set[str] = set()
153
155
 
154
156
  # ── Public API ────────────────────────────────────────────────────────────
155
157
 
@@ -644,34 +646,36 @@ class NothingDevice(GObject.Object):
644
646
  eq_val = EQ_PRESETS.get(p["eq"], 0)
645
647
  self._x55_send(_CMD_SET_EQ, bytes([eq_val]), label=f"restore EQ={p['eq']}")
646
648
 
647
- _LOW_BAT_THRESHOLDS = (20, 15, 10, 5)
648
-
649
649
  def _check_low_battery(self, slot: str, pct: int, label: str):
650
650
  if pct < 0:
651
651
  return
652
652
  if pct > 25:
653
653
  self._low_bat_notified.pop(slot, None)
654
+ self._low_bat_seen.add(slot)
654
655
  return
656
+ first_reading = slot not in self._low_bat_seen
657
+ self._low_bat_seen.add(slot)
655
658
  notified = self._low_bat_notified.setdefault(slot, set())
656
659
  for threshold in self._LOW_BAT_THRESHOLDS:
657
660
  if pct <= threshold and threshold not in notified:
658
661
  notified.add(threshold)
659
- threading.Thread(
660
- target=subprocess.run,
661
- args=(
662
- [
663
- "notify-send",
664
- "-u",
665
- "critical",
666
- "-i",
667
- "battery-caution",
668
- "Something X",
669
- f"{label}: {pct}% battery remaining",
670
- ],
671
- ),
672
- kwargs={"capture_output": True},
673
- daemon=True,
674
- ).start()
662
+ if not first_reading:
663
+ threading.Thread(
664
+ target=subprocess.run,
665
+ args=(
666
+ [
667
+ "notify-send",
668
+ "-u",
669
+ "critical",
670
+ "-i",
671
+ "battery-caution",
672
+ "Something X",
673
+ f"{label}: {pct}% battery remaining",
674
+ ],
675
+ ),
676
+ kwargs={"capture_output": True},
677
+ daemon=True,
678
+ ).start()
675
679
  break
676
680
 
677
681
  def _poll_earphone_status(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: something-x-dev
3
- Version: 1.8.0.dev21
3
+ Version: 1.8.0.dev23
4
4
  Summary: Something X device manager for Omarchy / Linux
5
5
  Author: Raphael
6
6
  License: MIT
@@ -6,15 +6,12 @@ README.md
6
6
  ROADMAP.md
7
7
  cliff.toml
8
8
  flake.nix
9
- main.py
10
9
  pyproject.toml
11
- requirements.txt
12
10
  somethingx
13
11
  .github/CODEOWNERS
14
12
  .github/workflows/ci.yml
15
13
  .github/workflows/release-dev.yml
16
14
  .github/workflows/release.yml
17
- data/style.css
18
15
  docs/RELEASING.md
19
16
  docs/docs.html
20
17
  docs/index.html
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+ cd "$(dirname "$(realpath "$0")")"
3
+ exec python3 -c "from nothing_app.application import main; main()" "$@"
@@ -1,355 +0,0 @@
1
- @define-color window_bg_color #0a0a0a;
2
- @define-color window_fg_color #ffffff;
3
- @define-color view_bg_color #0a0a0a;
4
- @define-color view_fg_color #ffffff;
5
- @define-color headerbar_bg_color #0a0a0a;
6
- @define-color headerbar_fg_color #ffffff;
7
- @define-color headerbar_border_color #1f1f1f;
8
- @define-color headerbar_backdrop_color #0a0a0a;
9
- @define-color card_bg_color #141414;
10
- @define-color card_fg_color #ffffff;
11
- @define-color accent_bg_color #ffffff;
12
- @define-color accent_fg_color #0a0a0a;
13
- @define-color accent_color #ffffff;
14
- @define-color destructive_bg_color #e85252;
15
- @define-color destructive_fg_color #0a0a0a;
16
- @define-color success_bg_color #8fdf72;
17
- @define-color success_fg_color #0a0a0a;
18
-
19
- window,
20
- .background {
21
- background-color: #0a0a0a;
22
- color: #ffffff;
23
- }
24
-
25
- scrolledwindow,
26
- viewport {
27
- background-color: #0a0a0a;
28
- }
29
-
30
- scrollbar trough {
31
- background-color: #141414;
32
- border-radius: 4px;
33
- min-width: 4px;
34
- }
35
- scrollbar slider {
36
- background-color: #2e2e2e;
37
- border-radius: 4px;
38
- min-width: 4px;
39
- min-height: 40px;
40
- }
41
- scrollbar slider:hover { background-color: #3e3e3e; }
42
-
43
- headerbar,
44
- .nothing-header {
45
- background-color: #0a0a0a;
46
- border-bottom: 1px solid #181818;
47
- color: #ffffff;
48
- min-height: 54px;
49
- box-shadow: none;
50
- padding: 0 8px;
51
- }
52
-
53
- headerbar .title {
54
- font-family: "JetBrains Mono", "Courier New", monospace;
55
- font-weight: 700;
56
- font-size: 13px;
57
- letter-spacing: 4px;
58
- text-transform: uppercase;
59
- color: #ffffff;
60
- }
61
-
62
- headerbar button:not(.close):not(.minimize):not(.maximize),
63
- headerbar button.flat:not(.close):not(.minimize):not(.maximize) {
64
- background: none;
65
- border: none;
66
- box-shadow: none;
67
- color: #ffffff;
68
- border-radius: 8px;
69
- min-width: 36px;
70
- min-height: 36px;
71
- padding: 4px 8px;
72
- transition: background 150ms ease;
73
- }
74
- headerbar button:not(.close):not(.minimize):not(.maximize):hover { background-color: #1e1e1e; }
75
- headerbar button:not(.close):not(.minimize):not(.maximize):active { background-color: #2a2a2a; }
76
-
77
- .nothing-page {
78
- background-color: #0a0a0a;
79
- padding: 0 16px 24px;
80
- }
81
-
82
- .section-label {
83
- font-family: "JetBrains Mono", monospace;
84
- font-size: 10px;
85
- font-weight: 700;
86
- letter-spacing: 3px;
87
- text-transform: uppercase;
88
- color: #3e3e3e;
89
- padding: 0 4px;
90
- margin-top: 28px;
91
- margin-bottom: 10px;
92
- }
93
-
94
- .device-card {
95
- background-color: #141414;
96
- border-radius: 20px;
97
- border: 1px solid #1e1e1e;
98
- padding: 20px;
99
- margin-bottom: 10px;
100
- transition: background 150ms ease, border-color 150ms ease;
101
- }
102
- .device-card:hover {
103
- background-color: #191919;
104
- border-color: #2a2a2a;
105
- }
106
-
107
- .device-card-name {
108
- font-family: "JetBrains Mono", monospace;
109
- font-size: 17px;
110
- font-weight: 700;
111
- color: #ffffff;
112
- letter-spacing: 0.5px;
113
- }
114
-
115
- .device-card-address {
116
- font-family: "JetBrains Mono", monospace;
117
- font-size: 11px;
118
- color: #3a3a3a;
119
- letter-spacing: 1px;
120
- margin-top: 2px;
121
- }
122
-
123
- .status-connected {
124
- font-size: 12px;
125
- font-weight: 600;
126
- color: #8fdf72;
127
- letter-spacing: 1px;
128
- }
129
- .status-disconnected {
130
- font-size: 12px;
131
- color: #3e3e3e;
132
- letter-spacing: 1px;
133
- }
134
- .status-nothing {
135
- font-family: "JetBrains Mono", monospace;
136
- font-size: 10px;
137
- font-weight: 700;
138
- letter-spacing: 2px;
139
- text-transform: uppercase;
140
- color: #ffffff;
141
- background-color: #1e1e1e;
142
- border: 1px solid #2a2a2a;
143
- border-radius: 6px;
144
- padding: 3px 8px;
145
- }
146
-
147
- progressbar,
148
- progressbar trough {
149
- background-color: #1e1e1e;
150
- border-radius: 4px;
151
- min-height: 5px;
152
- border: none;
153
- }
154
- progressbar progress {
155
- background-color: #ffffff;
156
- border-radius: 4px;
157
- min-height: 5px;
158
- }
159
- progressbar.battery-high progress { background-color: #8fdf72; }
160
- progressbar.battery-mid progress { background-color: #f0c040; }
161
- progressbar.battery-low progress { background-color: #e85252; }
162
-
163
- .battery-pct {
164
- font-family: "JetBrains Mono", monospace;
165
- font-size: 13px;
166
- font-weight: 700;
167
- color: #ffffff;
168
- min-width: 38px;
169
- }
170
- .battery-label-small {
171
- font-family: "JetBrains Mono", monospace;
172
- font-size: 10px;
173
- letter-spacing: 2px;
174
- color: #3a3a3a;
175
- text-transform: uppercase;
176
- }
177
-
178
- .battery-pct-big {
179
- font-family: "JetBrains Mono", monospace;
180
- font-size: 52px;
181
- font-weight: 700;
182
- color: #ffffff;
183
- letter-spacing: -2px;
184
- }
185
- .battery-unit {
186
- font-family: "JetBrains Mono", monospace;
187
- font-size: 18px;
188
- color: #5e5e5e;
189
- letter-spacing: 0;
190
- margin-bottom: 8px;
191
- }
192
-
193
- .anc-container {
194
- background-color: #141414;
195
- border-radius: 16px;
196
- border: 1px solid #1e1e1e;
197
- padding: 4px;
198
- }
199
-
200
- .anc-button {
201
- background: none;
202
- border: none;
203
- box-shadow: none;
204
- border-radius: 12px;
205
- color: #4a4a4a;
206
- font-size: 13px;
207
- font-weight: 600;
208
- padding: 10px 16px;
209
- transition: all 180ms ease;
210
- letter-spacing: 0.3px;
211
- }
212
- .anc-button:hover { background-color: #1e1e1e; color: #888888; }
213
- .anc-button.active,
214
- .anc-button:checked {
215
- background-color: #ffffff;
216
- color: #0a0a0a;
217
- font-weight: 700;
218
- }
219
-
220
- .eq-button {
221
- background-color: #141414;
222
- border: 1px solid #1e1e1e;
223
- box-shadow: none;
224
- border-radius: 24px;
225
- color: #4a4a4a;
226
- font-size: 13px;
227
- font-weight: 600;
228
- padding: 9px 18px;
229
- transition: all 180ms ease;
230
- letter-spacing: 0.3px;
231
- }
232
- .eq-button:hover { background-color: #1e1e1e; border-color: #2a2a2a; color: #aaaaaa; }
233
- .eq-button.active,
234
- .eq-button:checked {
235
- background-color: #ffffff;
236
- border-color: #ffffff;
237
- color: #0a0a0a;
238
- font-weight: 700;
239
- }
240
-
241
- .settings-group {
242
- background-color: #141414;
243
- border-radius: 18px;
244
- border: 1px solid #1e1e1e;
245
- }
246
-
247
- .settings-row {
248
- background-color: transparent;
249
- padding: 16px 20px;
250
- border-bottom: 1px solid #1a1a1a;
251
- }
252
- .settings-row:last-child { border-bottom: none; }
253
-
254
- .settings-row-title {
255
- font-size: 15px;
256
- font-weight: 500;
257
- color: #ffffff;
258
- }
259
- .settings-row-subtitle {
260
- font-size: 12px;
261
- color: #4a4a4a;
262
- margin-top: 3px;
263
- }
264
-
265
- switch {
266
- background-color: #2a2a2a;
267
- border-radius: 20px;
268
- min-width: 48px;
269
- min-height: 26px;
270
- border: none;
271
- box-shadow: none;
272
- transition: background 200ms ease;
273
- }
274
- switch:checked { background-color: #ffffff; }
275
- switch slider {
276
- background-color: #666666;
277
- border-radius: 50%;
278
- min-width: 20px;
279
- min-height: 20px;
280
- margin: 3px;
281
- box-shadow: none;
282
- }
283
- switch:checked slider { background-color: #0a0a0a; }
284
-
285
- .info-key {
286
- font-family: "JetBrains Mono", monospace;
287
- font-size: 11px;
288
- letter-spacing: 2px;
289
- text-transform: uppercase;
290
- color: #3e3e3e;
291
- }
292
- .info-value {
293
- font-family: "JetBrains Mono", monospace;
294
- font-size: 13px;
295
- font-weight: 600;
296
- color: #aaaaaa;
297
- letter-spacing: 0.5px;
298
- }
299
-
300
- .scan-button {
301
- background-color: #ffffff;
302
- border-radius: 16px;
303
- color: #0a0a0a;
304
- font-weight: 700;
305
- font-size: 14px;
306
- padding: 14px 32px;
307
- border: none;
308
- box-shadow: none;
309
- letter-spacing: 1px;
310
- transition: background 150ms ease;
311
- }
312
- .scan-button:hover { background-color: #e0e0e0; }
313
- .scan-button:active { background-color: #c8c8c8; }
314
-
315
- .disconnect-button {
316
- background-color: transparent;
317
- border-radius: 16px;
318
- color: #e85252;
319
- font-weight: 700;
320
- font-size: 14px;
321
- padding: 14px 32px;
322
- border: 1px solid #3a1e1e;
323
- box-shadow: none;
324
- letter-spacing: 1px;
325
- transition: all 150ms ease;
326
- }
327
- .disconnect-button:hover {
328
- background-color: #1a0e0e;
329
- border-color: #5a2020;
330
- }
331
-
332
- .empty-title {
333
- font-family: "JetBrains Mono", monospace;
334
- font-size: 15px;
335
- font-weight: 700;
336
- letter-spacing: 2px;
337
- text-transform: uppercase;
338
- color: #2a2a2a;
339
- }
340
- .empty-subtitle {
341
- font-size: 13px;
342
- color: #2a2a2a;
343
- margin-top: 6px;
344
- }
345
-
346
- .nothing-dot {
347
- background-color: #ffffff;
348
- border-radius: 50%;
349
- min-width: 8px;
350
- min-height: 8px;
351
- }
352
-
353
- separator { background-color: #181818; }
354
-
355
- label { color: #ffffff; }
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env python3
2
- import sys
3
- import os
4
-
5
- sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
6
-
7
- from nothing_app.application import main
8
-
9
- if __name__ == "__main__":
10
- main()
@@ -1,3 +0,0 @@
1
- PyGObject>=3.42.0
2
- dbus-python>=1.3.0
3
- pycairo>=1.20.0
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env bash
2
- cd "$(dirname "$(realpath "$0")")"
3
- exec python3 main.py "$@"