Skip to content

Commit fb77f35

Browse files
authored
Merge pull request #196 from kdroidFilter/feat/scheduler
feat(scheduler): OS-level background task scheduling with constraints, typed input data, and testing utilities
2 parents c5cf8ef + 2a1bd7a commit fb77f35

110 files changed

Lines changed: 11816 additions & 840 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-natives.yaml

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,27 @@ jobs:
250250
path: system-info/src/main/resources/nucleus/native/win32-*/
251251
retention-days: 1
252252

253+
- name: Build scheduler Windows native DLLs
254+
shell: cmd
255+
run: call scheduler\src\main\native\windows\build.bat
256+
257+
- name: Verify scheduler Windows natives
258+
shell: bash
259+
run: |
260+
for f in \
261+
scheduler/src/main/resources/nucleus/native/win32-x64/nucleus_scheduler.dll \
262+
scheduler/src/main/resources/nucleus/native/win32-aarch64/nucleus_scheduler.dll; do
263+
if [ ! -f "$f" ]; then echo "MISSING: $f" >&2; exit 1; fi
264+
echo "OK: $f ($(wc -c < "$f") bytes)"
265+
done
266+
267+
- name: Upload scheduler Windows DLLs
268+
uses: actions/upload-artifact@v4
269+
with:
270+
name: scheduler-windows
271+
path: scheduler/src/main/resources/nucleus/native/win32-*/
272+
retention-days: 1
273+
253274
macos:
254275
runs-on: macos-latest
255276
steps:
@@ -414,6 +435,44 @@ jobs:
414435
path: notification-macos/src/main/resources/nucleus/native/darwin-*/
415436
retention-days: 1
416437

438+
- name: Build service-management-macos macOS dylibs
439+
run: bash service-management-macos/src/main/native/macos/build.sh
440+
441+
- name: Verify service-management-macos macOS natives
442+
run: |
443+
for f in \
444+
service-management-macos/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_service_management.dylib \
445+
service-management-macos/src/main/resources/nucleus/native/darwin-x64/libnucleus_service_management.dylib; do
446+
if [ ! -f "$f" ]; then echo "MISSING: $f" >&2; exit 1; fi
447+
echo "OK: $f ($(wc -c < "$f") bytes)"
448+
done
449+
450+
- name: Upload service-management-macos macOS dylibs
451+
uses: actions/upload-artifact@v4
452+
with:
453+
name: service-management-macos
454+
path: service-management-macos/src/main/resources/nucleus/native/darwin-*/
455+
retention-days: 1
456+
457+
- name: Build scheduler macOS dylibs
458+
run: bash scheduler/src/main/native/macos/build.sh
459+
460+
- name: Verify scheduler macOS natives
461+
run: |
462+
for f in \
463+
scheduler/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_scheduler.dylib \
464+
scheduler/src/main/resources/nucleus/native/darwin-x64/libnucleus_scheduler.dylib; do
465+
if [ ! -f "$f" ]; then echo "MISSING: $f" >&2; exit 1; fi
466+
echo "OK: $f ($(wc -c < "$f") bytes)"
467+
done
468+
469+
- name: Upload scheduler macOS dylibs
470+
uses: actions/upload-artifact@v4
471+
with:
472+
name: scheduler-macos
473+
path: scheduler/src/main/resources/nucleus/native/darwin-*/
474+
retention-days: 1
475+
417476
- name: Build launcher-macos macOS dylibs
418477
run: bash launcher-macos/src/main/native/macos/build.sh
419478

@@ -691,3 +750,19 @@ jobs:
691750
name: global-hotkey-linux-${{ matrix.arch }}
692751
path: global-hotkey/src/main/resources/nucleus/native/linux-*/
693752
retention-days: 1
753+
754+
- name: Build scheduler Linux native shared library
755+
run: bash scheduler/src/main/native/linux/build.sh
756+
757+
- name: Verify scheduler Linux native
758+
run: |
759+
f="scheduler/src/main/resources/nucleus/native/linux-${{ matrix.arch }}/libnucleus_scheduler_linux.so"
760+
if [ ! -f "$f" ]; then echo "MISSING: $f" >&2; exit 1; fi
761+
echo "OK: $f ($(wc -c < "$f") bytes)"
762+
763+
- name: Upload scheduler Linux shared library
764+
uses: actions/upload-artifact@v4
765+
with:
766+
name: scheduler-linux-${{ matrix.arch }}
767+
path: scheduler/src/main/resources/nucleus/native/linux-*/
768+
retention-days: 1

.github/workflows/pre-merge.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ jobs:
9292
pattern: 'notification-macos*'
9393
merge-multiple: true
9494

95+
- name: Download service-management-macos artifacts
96+
uses: actions/download-artifact@v4
97+
with:
98+
path: service-management-macos/src/main/resources/nucleus/native/
99+
pattern: 'service-management-macos*'
100+
merge-multiple: true
101+
95102
- name: Download notification-linux artifacts
96103
uses: actions/download-artifact@v4
97104
with:
@@ -148,6 +155,13 @@ jobs:
148155
pattern: 'system-info-*'
149156
merge-multiple: true
150157

158+
- name: Download scheduler artifacts
159+
uses: actions/download-artifact@v4
160+
with:
161+
path: scheduler/src/main/resources/nucleus/native/
162+
pattern: 'scheduler-*'
163+
merge-multiple: true
164+
151165
- name: Verify all natives present
152166
run: |
153167
EXPECTED=(
@@ -189,6 +203,8 @@ jobs:
189203
"taskbar-progress/src/main/resources/nucleus/native/darwin-x64/libnucleus_taskbar_progress.dylib"
190204
"notification-macos/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_notification.dylib"
191205
"notification-macos/src/main/resources/nucleus/native/darwin-x64/libnucleus_notification.dylib"
206+
"service-management-macos/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_service_management.dylib"
207+
"service-management-macos/src/main/resources/nucleus/native/darwin-x64/libnucleus_service_management.dylib"
192208
"notification-linux/src/main/resources/nucleus/native/linux-x64/libnucleus_notification_linux.so"
193209
"notification-linux/src/main/resources/nucleus/native/linux-aarch64/libnucleus_notification_linux.so"
194210
"notification-windows/src/main/resources/nucleus/native/win32-x64/nucleus_notification_windows.dll"
@@ -219,6 +235,12 @@ jobs:
219235
"system-info/src/main/resources/nucleus/native/darwin-x64/libnucleus_system_info.dylib"
220236
"system-info/src/main/resources/nucleus/native/linux-x64/libnucleus_system_info.so"
221237
"system-info/src/main/resources/nucleus/native/linux-aarch64/libnucleus_system_info.so"
238+
"scheduler/src/main/resources/nucleus/native/win32-x64/nucleus_scheduler.dll"
239+
"scheduler/src/main/resources/nucleus/native/win32-aarch64/nucleus_scheduler.dll"
240+
"scheduler/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_scheduler.dylib"
241+
"scheduler/src/main/resources/nucleus/native/darwin-x64/libnucleus_scheduler.dylib"
242+
"scheduler/src/main/resources/nucleus/native/linux-x64/libnucleus_scheduler_linux.so"
243+
"scheduler/src/main/resources/nucleus/native/linux-aarch64/libnucleus_scheduler_linux.so"
222244
)
223245
MISSING=0
224246
for f in "${EXPECTED[@]}"; do

.github/workflows/publish-maven.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ jobs:
8787
pattern: 'notification-macos*'
8888
merge-multiple: true
8989

90+
- name: Download service-management-macos artifacts
91+
uses: actions/download-artifact@v4
92+
with:
93+
path: service-management-macos/src/main/resources/nucleus/native/
94+
pattern: 'service-management-macos*'
95+
merge-multiple: true
96+
9097
- name: Download notification-linux artifacts
9198
uses: actions/download-artifact@v4
9299
with:
@@ -143,6 +150,13 @@ jobs:
143150
pattern: 'system-info-*'
144151
merge-multiple: true
145152

153+
- name: Download scheduler artifacts
154+
uses: actions/download-artifact@v4
155+
with:
156+
path: scheduler/src/main/resources/nucleus/native/
157+
pattern: 'scheduler-*'
158+
merge-multiple: true
159+
146160
- name: Verify all natives present
147161
run: |
148162
EXPECTED=(
@@ -184,6 +198,8 @@ jobs:
184198
"taskbar-progress/src/main/resources/nucleus/native/darwin-x64/libnucleus_taskbar_progress.dylib"
185199
"notification-macos/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_notification.dylib"
186200
"notification-macos/src/main/resources/nucleus/native/darwin-x64/libnucleus_notification.dylib"
201+
"service-management-macos/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_service_management.dylib"
202+
"service-management-macos/src/main/resources/nucleus/native/darwin-x64/libnucleus_service_management.dylib"
187203
"notification-linux/src/main/resources/nucleus/native/linux-x64/libnucleus_notification_linux.so"
188204
"notification-linux/src/main/resources/nucleus/native/linux-aarch64/libnucleus_notification_linux.so"
189205
"launcher-linux/src/main/resources/nucleus/native/linux-x64/libnucleus_launcher_linux.so"
@@ -214,6 +230,12 @@ jobs:
214230
"system-info/src/main/resources/nucleus/native/darwin-x64/libnucleus_system_info.dylib"
215231
"system-info/src/main/resources/nucleus/native/linux-x64/libnucleus_system_info.so"
216232
"system-info/src/main/resources/nucleus/native/linux-aarch64/libnucleus_system_info.so"
233+
"scheduler/src/main/resources/nucleus/native/win32-x64/nucleus_scheduler.dll"
234+
"scheduler/src/main/resources/nucleus/native/win32-aarch64/nucleus_scheduler.dll"
235+
"scheduler/src/main/resources/nucleus/native/darwin-aarch64/libnucleus_scheduler.dylib"
236+
"scheduler/src/main/resources/nucleus/native/darwin-x64/libnucleus_scheduler.dylib"
237+
"scheduler/src/main/resources/nucleus/native/linux-x64/libnucleus_scheduler_linux.so"
238+
"scheduler/src/main/resources/nucleus/native/linux-aarch64/libnucleus_scheduler_linux.so"
217239
)
218240
MISSING=0
219241
for f in "${EXPECTED[@]}"; do

.github/workflows/publish-plugin.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ jobs:
9393
pattern: 'notification-macos*'
9494
merge-multiple: true
9595

96+
- name: Download service-management-macos artifacts
97+
uses: actions/download-artifact@v4
98+
with:
99+
path: service-management-macos/src/main/resources/nucleus/native/
100+
pattern: 'service-management-macos*'
101+
merge-multiple: true
102+
96103
- name: Download notification-linux artifacts
97104
uses: actions/download-artifact@v4
98105
with:
@@ -149,6 +156,13 @@ jobs:
149156
pattern: 'system-info-*'
150157
merge-multiple: true
151158

159+
- name: Download scheduler artifacts
160+
uses: actions/download-artifact@v4
161+
with:
162+
path: scheduler/src/main/resources/nucleus/native/
163+
pattern: 'scheduler-*'
164+
merge-multiple: true
165+
152166
- name: Cache Gradle Caches
153167
uses: gradle/actions/setup-gradle@v5
154168

.github/workflows/release-graalvm.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ jobs:
118118
pattern: 'notification-macos*'
119119
merge-multiple: true
120120

121+
- name: Download service-management-macos artifacts
122+
uses: actions/download-artifact@v4
123+
with:
124+
path: service-management-macos/src/main/resources/nucleus/native/
125+
pattern: 'service-management-macos*'
126+
merge-multiple: true
127+
121128
- name: Download notification-linux artifacts
122129
uses: actions/download-artifact@v4
123130
with:
@@ -174,6 +181,13 @@ jobs:
174181
pattern: 'system-info-*'
175182
merge-multiple: true
176183

184+
- name: Download scheduler artifacts
185+
uses: actions/download-artifact@v4
186+
with:
187+
path: scheduler/src/main/resources/nucleus/native/
188+
pattern: 'scheduler-*'
189+
merge-multiple: true
190+
177191
- name: Setup Nucleus (GraalVM)
178192
uses: ./.github/actions/setup-nucleus
179193
with:

.github/workflows/test-graalvm.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ jobs:
103103
pattern: 'notification-macos*'
104104
merge-multiple: true
105105

106+
- name: Download service-management-macos artifacts
107+
uses: actions/download-artifact@v4
108+
with:
109+
path: service-management-macos/src/main/resources/nucleus/native/
110+
pattern: 'service-management-macos*'
111+
merge-multiple: true
112+
106113
- name: Download notification-linux artifacts
107114
uses: actions/download-artifact@v4
108115
with:
@@ -159,6 +166,13 @@ jobs:
159166
pattern: 'system-info-*'
160167
merge-multiple: true
161168

169+
- name: Download scheduler artifacts
170+
uses: actions/download-artifact@v4
171+
with:
172+
path: scheduler/src/main/resources/nucleus/native/
173+
pattern: 'scheduler-*'
174+
merge-multiple: true
175+
162176
- name: Setup Nucleus (GraalVM)
163177
uses: ./.github/actions/setup-nucleus
164178
with:

.github/workflows/test-packaging.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ jobs:
130130
pattern: 'notification-macos*'
131131
merge-multiple: true
132132

133+
- name: Download service-management-macos artifacts
134+
uses: actions/download-artifact@v4
135+
with:
136+
path: service-management-macos/src/main/resources/nucleus/native/
137+
pattern: 'service-management-macos*'
138+
merge-multiple: true
139+
133140
- name: Download notification-linux artifacts
134141
uses: actions/download-artifact@v4
135142
with:
@@ -186,6 +193,13 @@ jobs:
186193
pattern: 'system-info-*'
187194
merge-multiple: true
188195

196+
- name: Download scheduler artifacts
197+
uses: actions/download-artifact@v4
198+
with:
199+
path: scheduler/src/main/resources/nucleus/native/
200+
pattern: 'scheduler-*'
201+
merge-multiple: true
202+
189203
- name: Build packages
190204
shell: bash
191205
run: ./gradlew :example:packageReleaseDistributionForCurrentOS --stacktrace --no-daemon

build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ plugins {
1212
alias(libs.plugins.versionCheck)
1313
}
1414

15-
val demoProjects = setOf("example", "jewel-sample", "system-info-demo", "sample-cmp")
15+
val demoProjects =
16+
setOf("example", "jewel-sample", "system-info-demo", "sample-cmp", "scheduler-demo", "service-management-demo")
1617

1718
subprojects {
1819
if (name !in demoProjects) {
@@ -109,6 +110,7 @@ tasks.register("preMerge") {
109110
dependsOn(":notification-linux:check")
110111
dependsOn(":notification-macos:check")
111112
dependsOn(":launcher-linux:check")
113+
dependsOn(":scheduler:check")
112114
dependsOn(":example:check")
113115
dependsOn(gradle.includedBuild("plugin-build").task(":plugin:check"))
114116
dependsOn(gradle.includedBuild("plugin-build").task(":plugin:validatePlugins"))

decorated-window-core/src/main/kotlin/io/github/kdroidfilter/nucleus/window/DecoratedWindowCore.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.kdroidfilter.nucleus.window
22

3+
import androidx.compose.foundation.background
34
import androidx.compose.foundation.shape.RoundedCornerShape
45
import androidx.compose.runtime.Composable
56
import androidx.compose.runtime.CompositionLocalProvider
@@ -405,7 +406,7 @@ fun FrameWindowScope.DecoratedWindowBody(
405406
}
406407
scope.content()
407408
},
408-
modifier = undecoratedWindowBorder,
409+
modifier = Modifier.background(titleBarBackground).then(undecoratedWindowBorder),
409410
measurePolicy = DecoratedWindowMeasurePolicy,
410411
)
411412
}

decorated-window-jewel/src/main/kotlin/io/github/kdroidfilter/nucleus/window/jewel/JewelColorMapping.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package io.github.kdroidfilter.nucleus.window.jewel
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.remember
5-
import androidx.compose.ui.graphics.Color
65
import androidx.compose.ui.unit.DpSize
76
import androidx.compose.ui.unit.dp
87
import io.github.kdroidfilter.nucleus.core.runtime.LinuxDesktopEnvironment
@@ -22,16 +21,11 @@ private val isLinux = Platform.Current == Platform.Linux
2221
private val isKde =
2322
isLinux && LinuxDesktopEnvironment.Current == LinuxDesktopEnvironment.KDE
2423

25-
@Suppress("MagicNumber")
26-
private val linuxWindowBorderColor = Color(0x12FFFFFF)
27-
2824
@Composable
2925
internal fun rememberJewelWindowStyle(): DecoratedWindowStyle {
3026
val isDark = JewelTheme.isDark
31-
// On Linux, blend the Jewel border color with a semi-transparent overlay so the
32-
// window frame adapts to both light and dark themes without a jarring white outline.
3327
val borderColor =
34-
if (isLinux) {
28+
if (isLinux && isDark) {
3529
JewelTheme.globalColors.borders.normal
3630
.copy(alpha = 0.6f)
3731
} else {

0 commit comments

Comments
 (0)