mirror of https://github.com/jetkvm/kvm.git
fix: resolve all Go and TypeScript linting issues
Address all linting warnings and errors in both backend and frontend code: **Go (golangci-lint):** - Add error checking for ignored return values (errcheck) - Remove unused RPC functions (unused) - Fix import formatting (goimports) **TypeScript/React (eslint):** - Replace all 'any' and 'Function' types with proper type definitions - Add RpcSendFunction type for consistent JSON-RPC callback signatures - Fix React Hook exhaustive-deps warnings by adding missing dependencies - Wrap functions in useCallback where needed to stabilize dependencies - Remove unused variables and imports - Remove empty code blocks - Suppress exhaustive-deps warnings where intentional (with comments) All linting now passes with 0 errors and 0 warnings.
This commit is contained in:
parent
cd70efb83f
commit
b322255684
10
cloud.go
10
cloud.go
|
|
@ -535,11 +535,11 @@ func handleSessionRequest(
|
||||||
}
|
}
|
||||||
|
|
||||||
err = wsjson.Write(context.Background(), c, gin.H{
|
err = wsjson.Write(context.Background(), c, gin.H{
|
||||||
"type": "answer",
|
"type": "answer",
|
||||||
"data": sd,
|
"data": sd,
|
||||||
"sessionId": session.ID,
|
"sessionId": session.ID,
|
||||||
"mode": session.Mode,
|
"mode": session.Mode,
|
||||||
"nickname": session.Nickname,
|
"nickname": session.Nickname,
|
||||||
"requireNickname": requireNickname,
|
"requireNickname": requireNickname,
|
||||||
"requireApproval": requireApproval,
|
"requireApproval": requireApproval,
|
||||||
})
|
})
|
||||||
|
|
|
||||||
34
config.go
34
config.go
|
|
@ -79,10 +79,10 @@ func (m *KeyboardMacro) Validate() error {
|
||||||
|
|
||||||
// MultiSessionConfig defines settings for multi-session support
|
// MultiSessionConfig defines settings for multi-session support
|
||||||
type MultiSessionConfig struct {
|
type MultiSessionConfig struct {
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
MaxSessions int `json:"max_sessions"`
|
MaxSessions int `json:"max_sessions"`
|
||||||
PrimaryTimeout int `json:"primary_timeout_seconds"`
|
PrimaryTimeout int `json:"primary_timeout_seconds"`
|
||||||
AllowCloudOverride bool `json:"allow_cloud_override"`
|
AllowCloudOverride bool `json:"allow_cloud_override"`
|
||||||
RequireAuthTransfer bool `json:"require_auth_transfer"`
|
RequireAuthTransfer bool `json:"require_auth_transfer"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -139,15 +139,15 @@ func (c *Config) SetDisplayRotation(rotation string) error {
|
||||||
const configPath = "/userdata/kvm_config.json"
|
const configPath = "/userdata/kvm_config.json"
|
||||||
|
|
||||||
var defaultConfig = &Config{
|
var defaultConfig = &Config{
|
||||||
CloudURL: "https://api.jetkvm.com",
|
CloudURL: "https://api.jetkvm.com",
|
||||||
CloudAppURL: "https://app.jetkvm.com",
|
CloudAppURL: "https://app.jetkvm.com",
|
||||||
AutoUpdateEnabled: true, // Set a default value
|
AutoUpdateEnabled: true, // Set a default value
|
||||||
ActiveExtension: "",
|
ActiveExtension: "",
|
||||||
MultiSession: &MultiSessionConfig{
|
MultiSession: &MultiSessionConfig{
|
||||||
Enabled: true, // Enable by default for new features
|
Enabled: true, // Enable by default for new features
|
||||||
MaxSessions: 10, // Reasonable default
|
MaxSessions: 10, // Reasonable default
|
||||||
PrimaryTimeout: 300, // 5 minutes
|
PrimaryTimeout: 300, // 5 minutes
|
||||||
AllowCloudOverride: true, // Cloud sessions can take control
|
AllowCloudOverride: true, // Cloud sessions can take control
|
||||||
RequireAuthTransfer: false, // Don't require auth by default
|
RequireAuthTransfer: false, // Don't require auth by default
|
||||||
},
|
},
|
||||||
KeyboardMacros: []KeyboardMacro{},
|
KeyboardMacros: []KeyboardMacro{},
|
||||||
|
|
@ -157,12 +157,12 @@ var defaultConfig = &Config{
|
||||||
DisplayDimAfterSec: 120, // 2 minutes
|
DisplayDimAfterSec: 120, // 2 minutes
|
||||||
DisplayOffAfterSec: 1800, // 30 minutes
|
DisplayOffAfterSec: 1800, // 30 minutes
|
||||||
SessionSettings: &SessionSettings{
|
SessionSettings: &SessionSettings{
|
||||||
RequireApproval: false,
|
RequireApproval: false,
|
||||||
RequireNickname: false,
|
RequireNickname: false,
|
||||||
ReconnectGrace: 10, // 10 seconds default
|
ReconnectGrace: 10, // 10 seconds default
|
||||||
PrivateKeystrokes: false, // By default, share keystrokes with observers
|
PrivateKeystrokes: false, // By default, share keystrokes with observers
|
||||||
},
|
},
|
||||||
JigglerEnabled: false,
|
JigglerEnabled: false,
|
||||||
// This is the "Standard" jiggler option in the UI
|
// This is the "Standard" jiggler option in the UI
|
||||||
JigglerConfig: &JigglerConfig{
|
JigglerConfig: &JigglerConfig{
|
||||||
InactivityLimitSeconds: 60,
|
InactivityLimitSeconds: 60,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import "github.com/pion/webrtc/v4"
|
||||||
|
|
||||||
func handlePermissionDeniedChannel(d *webrtc.DataChannel, message string) {
|
func handlePermissionDeniedChannel(d *webrtc.DataChannel, message string) {
|
||||||
d.OnOpen(func() {
|
d.OnOpen(func() {
|
||||||
d.SendText(message + "\r\n")
|
_ = d.SendText(message + "\r\n")
|
||||||
d.Close()
|
d.Close()
|
||||||
})
|
})
|
||||||
d.OnMessage(func(msg webrtc.DataChannelMessage) {})
|
d.OnMessage(func(msg webrtc.DataChannelMessage) {})
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,999 @@
|
||||||
|
[35m▶ Building frontend(B[m
|
||||||
|
|
||||||
|
added 429 packages, and audited 430 packages in 16s
|
||||||
|
|
||||||
|
142 packages are looking for funding
|
||||||
|
run `npm fund` for details
|
||||||
|
|
||||||
|
found 0 vulnerabilities
|
||||||
|
|
||||||
|
> kvm-ui@2025.10.01.1900 build:device
|
||||||
|
> tsc && vite build --mode=device --emptyOutDir
|
||||||
|
|
||||||
|
vite v7.1.7 building for device...
|
||||||
|
transforming...
|
||||||
|
✓ 2995 modules transformed.
|
||||||
|
rendering chunks...
|
||||||
|
[0;1;37m20:14:45 [0m[0;1;36minfo [0m[plugin vite:reporter]
|
||||||
|
[0;1;37m20:14:45 [0m[0;1;36minfo [0m(!) /workspaces/kvm/ui/src/hooks/hidRpc.ts is dynamically imported by /workspaces/kvm/ui/src/hooks/usePermissions.ts but also statically imported by /workspaces/kvm/ui/src/hooks/useHidRpc.ts, /workspaces/kvm/ui/src/hooks/useKeyboard.ts, dynamic import will not move module into another chunk.
|
||||||
|
[0;1;37m20:14:45 [0m[0;1;36minfo [0m
|
||||||
|
computing gzip size...
|
||||||
|
../static/index.html 2.84 kB │ gzip: 0.95 kB
|
||||||
|
../static/assets/immutable/netboot-icon-OoGRDuxL.svg 10.60 kB │ gzip: 4.51 kB
|
||||||
|
../static/assets/immutable/keyboard-and-mouse-connected-CIPI4-KS.png 13.38 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Book-DcdztGze.woff2 68.28 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Thin-CgvRHm5r.woff2 69.73 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-ThinItalic-BbeKWZX4.woff2 69.82 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Regular-C2Km8yIq.woff2 70.32 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Italic-D9ZGG85N.woff2 70.87 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-BookItalic-Dot97ozQ.woff2 70.92 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Medium-B7cMW5Np.woff2 71.26 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-MediumItalic-Cw0wlEIE.woff2 72.14 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-BlackItalic-2aNe932P.woff2 72.99 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-LightItalic-DkMJsSQn.woff2 73.33 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Light-COmyZsa9.woff2 73.63 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Black-CPoU8bYr.woff2 73.63 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-BoldItalic-BY-z05Z9.woff2 73.76 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-Bold-6tPVDRzI.woff2 74.18 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-ExtraBlackItalic-B8bd8esZ.woff2 75.12 kB
|
||||||
|
../static/assets/immutable/CircularXXWeb-ExtraBlack-zwQ9rYrv.woff2 76.17 kB
|
||||||
|
../static/assets/immutable/jetkvm-device-still-ktpTGyfA.png 188.53 kB
|
||||||
|
../static/assets/immutable/vendor-CCFZcsOx.css 3.55 kB │ gzip: 1.08 kB
|
||||||
|
../static/assets/immutable/index-3KaWki3G.css 108.89 kB │ gzip: 16.78 kB
|
||||||
|
../static/assets/immutable/AutoHeight-DNMbSxBi.js 0.40 kB │ gzip: 0.30 kB
|
||||||
|
../static/assets/immutable/FeatureFlag-CpBy_yIc.js 0.56 kB │ gzip: 0.39 kB
|
||||||
|
../static/assets/immutable/login-jvmJO2K9.js 0.65 kB │ gzip: 0.40 kB
|
||||||
|
../static/assets/immutable/signup-Dcu7CrZF.js 0.68 kB │ gzip: 0.40 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.macros.add-DtgJATY5.js 0.86 kB │ gzip: 0.57 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.appearance-D-zQ8eOU.js 0.94 kB │ gzip: 0.53 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.general.reboot-ZolNQeG-.js 1.04 kB │ gzip: 0.54 kB
|
||||||
|
../static/assets/immutable/UpdateInProgressStatusCard-CxrffonE.js 1.09 kB │ gzip: 0.56 kB
|
||||||
|
../static/assets/immutable/devices._id.other-session-DOmnPqBd.js 1.12 kB │ gzip: 0.57 kB
|
||||||
|
../static/assets/immutable/devices.already-adopted-CUKof-fH.js 1.20 kB │ gzip: 0.58 kB
|
||||||
|
../static/assets/immutable/Checkbox-DfeYpuQt.js 1.27 kB │ gzip: 0.66 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.keyboard-Brhk8Q16.js 1.66 kB │ gzip: 0.83 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.general._index-Cojn7PdF.js 1.74 kB │ gzip: 0.77 kB
|
||||||
|
../static/assets/immutable/ConfirmDialog-ZPsIbN8O.js 1.80 kB │ gzip: 0.81 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.macros.edit-CKsO8CQU.js 1.95 kB │ gzip: 1.01 kB
|
||||||
|
../static/assets/immutable/Terminal-DrfJbtdJ.js 3.18 kB │ gzip: 1.63 kB
|
||||||
|
../static/assets/immutable/AuthLayout-BU_zUyj5.js 3.85 kB │ gzip: 1.73 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.multi-session-BAaxVISr.js 5.81 kB │ gzip: 1.85 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.macros-CSWrsivS.js 5.98 kB │ gzip: 2.12 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.advanced-BKtcXLuC.js 6.01 kB │ gzip: 2.09 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.access.local-auth-AMVTxQRp.js 6.17 kB │ gzip: 1.54 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.video-w6XP12DM.js 6.88 kB │ gzip: 2.60 kB
|
||||||
|
../static/assets/immutable/devices._id.settings-DQ5hSmGr.js 8.77 kB │ gzip: 1.63 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.mouse-J-WjFYto.js 8.77 kB │ gzip: 3.05 kB
|
||||||
|
../static/assets/immutable/connectionStats-BTh-HMMJ.js 8.92 kB │ gzip: 3.57 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.general.update-DSe-tEcb.js 9.70 kB │ gzip: 2.49 kB
|
||||||
|
../static/assets/immutable/MacroForm-DlAcnh76.js 10.00 kB │ gzip: 3.55 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.hardware-BJuy5KhB.js 10.82 kB │ gzip: 3.17 kB
|
||||||
|
../static/assets/immutable/devices._id.settings.network-PcgdKo-I.js 15.47 kB │ gzip: 3.30 kB
|
||||||
|
../static/assets/immutable/devices._id.mount-eRr7fRnt.js 32.30 kB │ gzip: 14.11 kB
|
||||||
|
../static/assets/immutable/index-ITvbnH2t.js 249.49 kB │ gzip: 64.18 kB
|
||||||
|
../static/assets/immutable/vendor-C8gpwofI.js 1,568.17 kB │ gzip: 469.07 kB
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m(!) Some chunks are larger than 500 kB after minification. Consider:
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m- Using dynamic import() to code-split the application
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
|
||||||
|
✓ built in 9.00s
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/favicon.ico: 92.7% -- created ../static/favicon.ico.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/index.html: 67.0% -- created ../static/index.html.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/web-app-manifest-192x192.png: -0.3% -- created ../static/web-app-manifest-192x192.png.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/apple-touch-icon.png: -0.3% -- created ../static/apple-touch-icon.png.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/favicon.png: -0.4% -- created ../static/favicon.png.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/web-app-manifest-512x512.png: 5.1% -- created ../static/web-app-manifest-512x512.png.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/favicon-96x96.png: 0.0% -- created ../static/favicon-96x96.png.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/sse.html: 77.3% -- created ../static/sse.html.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Regular.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Regular.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-ExtraBlackItalic.woff2: 0.0% -- created ../static/fonts/CircularXXWeb-ExtraBlackItalic.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-BookItalic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-BookItalic.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Black.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Black.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Medium.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Medium.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-BlackItalic.woff2: 0.2% -- created ../static/fonts/CircularXXWeb-BlackItalic.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Book.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Book.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Light.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Light.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Bold.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Bold.woff2.gz
|
||||||
|
[0;1;37m20:14:46 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-MediumItalic.woff2: 0.0% -- created ../static/fonts/CircularXXWeb-MediumItalic.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Thin.woff2: 0.2% -- created ../static/fonts/CircularXXWeb-Thin.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-LightItalic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-LightItalic.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-Italic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Italic.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-BoldItalic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-BoldItalic.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-ExtraBlack.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-ExtraBlack.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/fonts/CircularXXWeb-ThinItalic.woff2: 0.2% -- created ../static/fonts/CircularXXWeb-ThinItalic.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/fonts/fonts.css: 89.4% -- created ../static/fonts/fonts.css.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.video-w6XP12DM.js: 62.8% -- created ../static/assets/immutable/devices._id.settings.video-w6XP12DM.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/vendor-C8gpwofI.js: 70.3% -- created ../static/assets/immutable/vendor-C8gpwofI.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Medium-B7cMW5Np.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Medium-B7cMW5Np.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.multi-session-BAaxVISr.js: 68.4% -- created ../static/assets/immutable/devices._id.settings.multi-session-BAaxVISr.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Italic-D9ZGG85N.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Italic-D9ZGG85N.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/index-ITvbnH2t.js: 74.6% -- created ../static/assets/immutable/index-ITvbnH2t.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/jetkvm-device-still-ktpTGyfA.png: 0.6% -- created ../static/assets/immutable/jetkvm-device-still-ktpTGyfA.png.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/AutoHeight-DNMbSxBi.js: 29.0% -- created ../static/assets/immutable/AutoHeight-DNMbSxBi.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/AuthLayout-BU_zUyj5.js: 55.6% -- created ../static/assets/immutable/AuthLayout-BU_zUyj5.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/MacroForm-DlAcnh76.js: 64.8% -- created ../static/assets/immutable/MacroForm-DlAcnh76.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.network-PcgdKo-I.js: 78.8% -- created ../static/assets/immutable/devices._id.settings.network-PcgdKo-I.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/index-3KaWki3G.css: 84.9% -- created ../static/assets/immutable/index-3KaWki3G.css.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/FeatureFlag-CpBy_yIc.js: 34.8% -- created ../static/assets/immutable/FeatureFlag-CpBy_yIc.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Bold-6tPVDRzI.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Bold-6tPVDRzI.woff2.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.macros.add-DtgJATY5.js: 36.3% -- created ../static/assets/immutable/devices._id.settings.macros.add-DtgJATY5.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/login-jvmJO2K9.js: 41.1% -- created ../static/assets/immutable/login-jvmJO2K9.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/devices.already-adopted-CUKof-fH.js: 52.5% -- created ../static/assets/immutable/devices.already-adopted-CUKof-fH.js.gz
|
||||||
|
[0;1;37m20:14:47 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.mount-eRr7fRnt.js: 56.6% -- created ../static/assets/immutable/devices._id.mount-eRr7fRnt.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Regular-C2Km8yIq.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Regular-C2Km8yIq.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.general.reboot-ZolNQeG-.js: 49.8% -- created ../static/assets/immutable/devices._id.settings.general.reboot-ZolNQeG-.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-LightItalic-DkMJsSQn.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-LightItalic-DkMJsSQn.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/signup-Dcu7CrZF.js: 43.2% -- created ../static/assets/immutable/signup-Dcu7CrZF.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.macros.edit-CKsO8CQU.js: 48.8% -- created ../static/assets/immutable/devices._id.settings.macros.edit-CKsO8CQU.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.mouse-J-WjFYto.js: 65.7% -- created ../static/assets/immutable/devices._id.settings.mouse-J-WjFYto.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Light-COmyZsa9.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Light-COmyZsa9.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.advanced-BKtcXLuC.js: 65.6% -- created ../static/assets/immutable/devices._id.settings.advanced-BKtcXLuC.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-BlackItalic-2aNe932P.woff2: 0.2% -- created ../static/assets/immutable/CircularXXWeb-BlackItalic-2aNe932P.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/Terminal-DrfJbtdJ.js: 49.2% -- created ../static/assets/immutable/Terminal-DrfJbtdJ.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.other-session-DOmnPqBd.js: 50.2% -- created ../static/assets/immutable/devices._id.other-session-DOmnPqBd.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/Checkbox-DfeYpuQt.js: 49.7% -- created ../static/assets/immutable/Checkbox-DfeYpuQt.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.hardware-BJuy5KhB.js: 70.8% -- created ../static/assets/immutable/devices._id.settings.hardware-BJuy5KhB.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/connectionStats-BTh-HMMJ.js: 60.5% -- created ../static/assets/immutable/connectionStats-BTh-HMMJ.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.keyboard-Brhk8Q16.js: 50.8% -- created ../static/assets/immutable/devices._id.settings.keyboard-Brhk8Q16.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-ThinItalic-BbeKWZX4.woff2: 0.2% -- created ../static/assets/immutable/CircularXXWeb-ThinItalic-BbeKWZX4.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-ExtraBlackItalic-B8bd8esZ.woff2: 0.0% -- created ../static/assets/immutable/CircularXXWeb-ExtraBlackItalic-B8bd8esZ.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-MediumItalic-Cw0wlEIE.woff2: 0.0% -- created ../static/assets/immutable/CircularXXWeb-MediumItalic-Cw0wlEIE.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-BoldItalic-BY-z05Z9.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-BoldItalic-BY-z05Z9.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.general._index-Cojn7PdF.js: 56.6% -- created ../static/assets/immutable/devices._id.settings.general._index-Cojn7PdF.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Black-CPoU8bYr.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Black-CPoU8bYr.woff2.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings-DQ5hSmGr.js: 81.6% -- created ../static/assets/immutable/devices._id.settings-DQ5hSmGr.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/ConfirmDialog-ZPsIbN8O.js: 56.3% -- created ../static/assets/immutable/ConfirmDialog-ZPsIbN8O.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/UpdateInProgressStatusCard-CxrffonE.js: 50.6% -- created ../static/assets/immutable/UpdateInProgressStatusCard-CxrffonE.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.macros-CSWrsivS.js: 65.0% -- created ../static/assets/immutable/devices._id.settings.macros-CSWrsivS.js.gz
|
||||||
|
[0;1;37m20:14:48 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.access.local-auth-AMVTxQRp.js: 75.3% -- created ../static/assets/immutable/devices._id.settings.access.local-auth-AMVTxQRp.js.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.general.update-DSe-tEcb.js: 74.6% -- created ../static/assets/immutable/devices._id.settings.general.update-DSe-tEcb.js.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-ExtraBlack-zwQ9rYrv.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-ExtraBlack-zwQ9rYrv.woff2.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Thin-CgvRHm5r.woff2: 0.2% -- created ../static/assets/immutable/CircularXXWeb-Thin-CgvRHm5r.woff2.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/devices._id.settings.appearance-D-zQ8eOU.js: 44.7% -- created ../static/assets/immutable/devices._id.settings.appearance-D-zQ8eOU.js.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/netboot-icon-OoGRDuxL.svg: 56.5% -- created ../static/assets/immutable/netboot-icon-OoGRDuxL.svg.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-BookItalic-Dot97ozQ.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-BookItalic-Dot97ozQ.woff2.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/vendor-CCFZcsOx.css: 70.1% -- created ../static/assets/immutable/vendor-CCFZcsOx.css.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/CircularXXWeb-Book-DcdztGze.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Book-DcdztGze.woff2.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/assets/immutable/keyboard-and-mouse-connected-CIPI4-KS.png: 12.6% -- created ../static/assets/immutable/keyboard-and-mouse-connected-CIPI4-KS.png.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/jetkvm.svg: 72.2% -- created ../static/jetkvm.svg.gz
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m../static/favicon.svg: 70.1% -- created ../static/favicon.svg.gz
|
||||||
|
[35m▶ Building release binary(B[m
|
||||||
|
[35m▶ Building the project in host ...(B[m
|
||||||
|
[0;1;37m20:14:49 [0m[0;1;36minfo [0m+ make build_release SKIP_NATIVE_IF_EXISTS=0 SKIP_UI_BUILD=1
|
||||||
|
Skipping frontend build...
|
||||||
|
Building native...
|
||||||
|
[35m▶ Generating UI index(B[m
|
||||||
|
ui_index.c has been generated successfully.
|
||||||
|
[35m▶ Building native library(B[m
|
||||||
|
Re-run cmake no build system arguments
|
||||||
|
-- Using defconfig: /workspaces/kvm/internal/native/cgo/lvgl_defconfig
|
||||||
|
-- Converted to absolute path: /workspaces/kvm/internal/native/cgo/lvgl_defconfig
|
||||||
|
['/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/scripts/kconfig.py', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/Kconfig', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/.config', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/autoconf.h', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/kconfig_list', '/workspaces/kvm/internal/native/cgo/lvgl_defconfig']
|
||||||
|
Parsing /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/Kconfig
|
||||||
|
Loaded configuration '/workspaces/kvm/internal/native/cgo/lvgl_defconfig'
|
||||||
|
No change to configuration in '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/.config'
|
||||||
|
No change to Kconfig header in '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/autoconf.h'
|
||||||
|
Failed to locate pcpp - installing it
|
||||||
|
PCPP is already installed in venv
|
||||||
|
Preprocessing completed. Output saved to /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/tmp.h
|
||||||
|
Expanded configuration header saved to /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/lv_conf_expanded.h
|
||||||
|
Temporary preprocessed file /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/tmp.h removed.
|
||||||
|
-- Enabling the building of ThorVG internal
|
||||||
|
-- Configuring done (3.8s)
|
||||||
|
-- Generating done (0.3s)
|
||||||
|
-- Build files have been written to: /workspaces/kvm/internal/native/cgo/build
|
||||||
|
[35m▶ Copying built library and header files(B[m
|
||||||
|
gmake[1]: Entering directory '/workspaces/kvm/internal/native/cgo/build'
|
||||||
|
[0;1;37m20:14:55 [0m[0;1;36minfo [0mgmake[1]: Warning: File 'Makefile' has modification time 0.11 s in the future
|
||||||
|
[0;1;37m20:14:56 [0m[0;1;36minfo [0mgmake[3]: Warning: File '_deps/lvgl-build/CMakeFiles/lvgl_thorvg.dir/compiler_depend.make' has modification time 0.32 s in the future
|
||||||
|
[0;1;37m20:14:56 [0m[0;1;36minfo [0mgmake[3]: warning: Clock skew detected. Your build may be incomplete.
|
||||||
|
[ 7%] Built target lvgl_thorvg
|
||||||
|
[ 51%] Built target lvgl
|
||||||
|
[ 52%] Building C object CMakeFiles/jknative.dir/ui_index.c.o
|
||||||
|
[ 52%] Linking CXX static library libjknative.a
|
||||||
|
[100%] Built target jknative
|
||||||
|
Install the project...
|
||||||
|
-- Install configuration: "Release"
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_templ.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_async.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_timer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_rb.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_math.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_anim.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance/lv_image_header_cache.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance/lv_image_cache.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance/lv_cache_instance.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class/lv_cache_class.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class/lv_cache_lru_ll.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class/lv_cache_lru_rb.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache_entry.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_profiler_builtin.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_array.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_bidi.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_grad.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_palette.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_assert.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_utils.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_types.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_event.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_style_gen.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_iter.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_style.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_anim_timeline.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_text_ap.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_circle_buf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_text.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_fs.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_color_op.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_area.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_log.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_lru.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_profiler.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_matrix.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_ll.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_tree.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_color.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/qnx
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/qnx/lv_qnx.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_display.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_gnu_efi.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_edk2.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_std_wrapper.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_indev.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_context.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev/lv_evdev.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_xkb.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_libinput.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/lv_drivers.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/wayland
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_keyboard.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_window.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_mouse.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/x11
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/x11/lv_x11.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7796
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7796/lv_st7796.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/drm
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/drm/lv_linux_drm.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/fb
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/fb/lv_linux_fbdev.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/renesas_glcdc
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7735
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7735/lv_st7735.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x/lv_ft81x_defines.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x/lv_ft81x.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/lcd
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st_ltdc
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ili9341
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ili9341/lv_ili9341.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/tft_espi
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7789
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7789/lv_st7789.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/glfw
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/windows
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_entry.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_cache.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_style.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_group.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_event.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_property.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_style_gen.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_pos.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_scroll.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_tree.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_class.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_refr.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_global.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_draw.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_api_map_v9_1.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_init.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_api_map_v8.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_cmsis_rtos2.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_pthread.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_mqx.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_sdl2.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_os.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_windows.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_rtthread.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_freertos.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_os_none.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_conf_kconfig.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/snapshot
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/snapshot/lv_snapshot.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime/lv_ime_pinyin.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/vg_lite_tvg
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/vg_lite_tvg/vg_lite.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_display.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_indev.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_indev_gesture.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_helpers.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_screenshot_compare.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer/lv_file_explorer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer/lv_observer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_widget.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_checkbox_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_dropdown_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_keyboard_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_textarea_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_canvas_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_chart_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_slider_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_spangroup_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_tabview_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_obj_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_calendar_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_roller_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_table_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_label_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_image_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_event_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_buttonmatrix_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_button_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_scale_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_arc_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_bar_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_base_types.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_component.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_utils.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_update.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_style.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment/lv_fragment.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/gridnav
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/gridnav/lv_gridnav.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey/lv_monkey.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon/lv_sysmon.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/imgfont
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/imgfont/lv_imgfont.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager/lv_font_manager.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager/lv_font_manager_recycle.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_parser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_decoder.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_token.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_render.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgUtil.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieProperty.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieInterpolator.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgFill.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieModifier.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieModel.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgArray.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLoadModule.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgLoaderCommon.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/thorvg.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgPicture.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/config.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLoader.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgCommon.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgText.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterAvx.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieParserHandler.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/thorvg_capi.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgScene.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterTexmap.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgRender.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLock.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieParser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgPaint.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieBuilder.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgStr.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgCanvas.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterC.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgTaskScheduler.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieExpressions.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieLoader.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgIteratorAccessor.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieCommon.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgPath.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgInlist.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgLoader.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgMath.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRenderer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgRawLoader.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/fwd.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/memorystream.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/reader.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/prettywriter.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/ostreamwrapper.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/encodedstream.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/filereadstream.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/cursorstreamwrapper.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/istreamwrapper.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/uri.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/stringbuffer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/ieee754.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/strtod.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/swap.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/regex.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/diyfp.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/biginteger.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/strfunc.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/itoa.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/stack.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/dtoa.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/clzll.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/meta.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/pow10.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/encodings.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/schema.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/stream.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/filewritestream.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/rapidjson.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/document.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/allocators.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/writer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error/error.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error/en.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/memorybuffer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/pointer.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes/inttypes.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes/stdint.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgShape.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSaveModule.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgBinaryDesc.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/thorvg_lottie.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterNeon.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgAnimation.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgCssStyle.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieRenderPooler.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgXmlParser.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgFrameModule.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgCompressor.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwCommon.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libjpeg_turbo
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg/lv_ffmpeg.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libpng
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libpng/lv_libpng.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd/tjpgd.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd/tjpgdcnf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd/lv_tjpgd.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf/stb_rect_pack.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/ftoption.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/lv_freetype.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/ftmodule.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/expat_config.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/internal.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/xmltok.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/nametab.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/siphash.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/latin1tab.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/expat_external.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/winconfig.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/xmltok_impl.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/utf8tab.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/ascii.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/xmlrole.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/expat.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/asciitab.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/iasciitab.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lz4
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lz4/lz4.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode/lv_qrcode.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode/qrcodegen.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rle
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rle/lv_rle.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng/lodepng.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng/lv_lodepng.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bin_decoder
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bin_decoder/lv_bin_decoder.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie/lv_rlottie.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/fsdrv
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/fsdrv/lv_fsdrv.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bmp
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bmp/lv_bmp.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode/code128.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode/lv_barcode.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/gifdec_mve.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/lv_gif.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/gifdec.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_api_map_v9_0.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_conf_internal.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/lv_layout.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/flex
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/flex/lv_flex.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/grid
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/grid/lv_grid.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_sprintf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/uefi
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/clib
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/micropython
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_string.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_mem.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/rtthread
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin/lv_tlsf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_gesture.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_scroll.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display/lv_display.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_binfont_loader.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_font_fmt_txt.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_symbol_def.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_font.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lvgl.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/default
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/default/lv_theme_default.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/simple
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/simple/lv_theme_simple.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/lv_theme.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/mono
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/mono/lv_theme_mono.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_grad.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_mask.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/helium
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/arm2d
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/neon
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_utils.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_image_decoder.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d/lv_g2d_utils.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d/lv_draw_g2d.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_path.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_label.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_mask.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_image_dsc.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_triangle.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_vector.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_3d.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_line.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sdl
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sdl/lv_draw_sdl.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_path.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_math.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_image.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nema_gfx
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/dma2d
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_rect.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_arc.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/opengles
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas/dave2d
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_buf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture/lv_3dtexture.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown/lv_dropdown.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_chinese.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/objx_templ
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/objx_templ/lv_objx_templ.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale/lv_scale.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led/lv_led.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property/lv_obj_property_names.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property/lv_style_properties.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win/lv_win.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart/lv_chart.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox/lv_checkbox.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label/lv_label.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox/lv_spinbox.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage/lv_animimage.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider/lv_slider.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinner
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinner/lv_spinner.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image/lv_image.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas/lv_canvas.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview/lv_tabview.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox/lv_msgbox.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea/lv_textarea.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button/lv_button.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span/lv_span.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton/lv_imagebutton.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line/lv_line.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table/lv_table.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/list
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/list/lv_list.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu/lv_menu.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch/lv_switch.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie/lv_lottie.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar/lv_bar.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc/lv_arc.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller/lv_roller.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview/lv_tileview.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard/lv_keyboard.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick/lv_tick.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_bidi_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_color_op_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_area_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_fs_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache_entry_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_text_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_profiler_builtin_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_anim_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_timer_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_style_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_rb_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_event_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/qnx
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev/lv_evdev_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_xkb_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_libinput_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/wayland
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/x11
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7796
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/drm
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/fb
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/renesas_glcdc
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7735
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/lcd
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st_ltdc
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ili9341
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/tft_espi
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7789
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/glfw
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/windows
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_group_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_draw_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_refr_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_scroll_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_event_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_class_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_style_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_linux_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_os_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/snapshot
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime/lv_ime_pinyin_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/vg_lite_tvg
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer/lv_file_explorer_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer/lv_observer_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_component_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment/lv_fragment_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/gridnav
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey/lv_monkey_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon/lv_sysmon_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/imgfont
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libjpeg_turbo
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg/lv_ffmpeg_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libpng
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/lv_freetype_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lz4
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode/lv_qrcode_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rle
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bin_decoder
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie/lv_rlottie_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/fsdrv
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bmp
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode/lv_barcode_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/lv_gif_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/lv_layout_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/flex
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/grid
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lvgl_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/uefi
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/clib
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/micropython
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_mem_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/rtthread
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin/lv_tlsf_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_gesture_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display/lv_display_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_font_fmt_txt_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/default
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/simple
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/lv_theme_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/mono
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_label_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/helium
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/arm2d
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/neon
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_mask_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_buf_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_image_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_mask_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_rect_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sdl
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nema_gfx
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_triangle_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/dma2d
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/opengles
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_image_decoder_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas/dave2d
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_vector_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture/lv_3dtexture_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown/lv_dropdown_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/objx_templ
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale/lv_scale_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led/lv_led_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win/lv_win_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart/lv_chart_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox/lv_checkbox_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label/lv_label_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox/lv_spinbox_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage/lv_animimage_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider/lv_slider_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinner
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image/lv_image_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas/lv_canvas_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview/lv_tabview_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox/lv_msgbox_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea/lv_textarea_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button/lv_button_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span/lv_span_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton/lv_imagebutton_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line/lv_line_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table/lv_table_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/list
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu/lv_menu_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch/lv_switch_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie/lv_lottie_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar/lv_bar_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc/lv_arc_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller/lv_roller_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview/lv_tileview_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard/lv_keyboard_private.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick/lv_tick_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_conf.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_version.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/lib/liblvgl.a
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_version.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/share/pkgconfig/lvgl.pc
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/lib/liblvgl_thorvg.a
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_version.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl.h
|
||||||
|
-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl_private.h
|
||||||
|
-- Installing: /tmp/tmp.w0Bd5jwcNB/lib/libjknative.a
|
||||||
|
[0;1;37m20:15:14 [0m[0;1;36minfo [0mgmake[1]: warning: Clock skew detected. Your build may be incomplete.
|
||||||
|
gmake[1]: Leaving directory '/workspaces/kvm/internal/native/cgo/build'
|
||||||
|
Building release...
|
||||||
|
GOOS=linux GOARCH=arm GOARM=7 ARCHFLAGS="-arch arm" CGO_CFLAGS="-I/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/include -I/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/sysroot/usr/include" CGO_LDFLAGS="-L/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/lib -L/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/sysroot/usr/lib -lrockit -lrockchip_mpp -lrga -lpthread -lm" CC="/opt/jetkvm-native-buildkit/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc" LD="/opt/jetkvm-native-buildkit/bin/arm-rockchip830-linux-uclibcgnueabihf-ld" CGO_ENABLED=1 go build \
|
||||||
|
-ldflags="-s -w -X github.com/prometheus/common/version.Branch=feat/multisession-support -X github.com/prometheus/common/version.BuildDate=2025-10-08T17:14:49+0000 -X github.com/prometheus/common/version.Revision=81bc5055dbcb97923288f523a97ffc892fe682f7 -X github.com/jetkvm/kvm.builtTimestamp=1759943689 -X github.com/jetkvm/kvm.builtAppVersion=0.4.8" \
|
||||||
|
-trimpath -tags netgo,timetzdata,nomsgpack \
|
||||||
|
-o bin/jetkvm_app cmd/main.go
|
||||||
|
[0;1;37m20:15:19 [0m[0;1;36minfo [0m+ set +x
|
||||||
|
Deployment complete.
|
||||||
|
[0;1;37m20:15:31 [0m[0;1;31merror [0mError tunneling to container: wait: remote command exited without exit status or exit signal
|
||||||
|
|
@ -15,9 +15,9 @@ const (
|
||||||
PermissionPaste Permission = "clipboard.paste"
|
PermissionPaste Permission = "clipboard.paste"
|
||||||
|
|
||||||
// Session management permissions
|
// Session management permissions
|
||||||
PermissionSessionTransfer Permission = "session.transfer"
|
PermissionSessionTransfer Permission = "session.transfer"
|
||||||
PermissionSessionApprove Permission = "session.approve"
|
PermissionSessionApprove Permission = "session.approve"
|
||||||
PermissionSessionKick Permission = "session.kick"
|
PermissionSessionKick Permission = "session.kick"
|
||||||
PermissionSessionRequestPrimary Permission = "session.request_primary"
|
PermissionSessionRequestPrimary Permission = "session.request_primary"
|
||||||
PermissionSessionReleasePrimary Permission = "session.release_primary"
|
PermissionSessionReleasePrimary Permission = "session.release_primary"
|
||||||
PermissionSessionManage Permission = "session.manage"
|
PermissionSessionManage Permission = "session.manage"
|
||||||
|
|
@ -35,8 +35,8 @@ const (
|
||||||
PermissionExtensionManage Permission = "extension.manage"
|
PermissionExtensionManage Permission = "extension.manage"
|
||||||
|
|
||||||
// Terminal/Serial permissions
|
// Terminal/Serial permissions
|
||||||
PermissionTerminalAccess Permission = "terminal.access"
|
PermissionTerminalAccess Permission = "terminal.access"
|
||||||
PermissionSerialAccess Permission = "serial.access"
|
PermissionSerialAccess Permission = "serial.access"
|
||||||
PermissionExtensionATX Permission = "extension.atx"
|
PermissionExtensionATX Permission = "extension.atx"
|
||||||
PermissionExtensionDC Permission = "extension.dc"
|
PermissionExtensionDC Permission = "extension.dc"
|
||||||
PermissionExtensionSerial Permission = "extension.serial"
|
PermissionExtensionSerial Permission = "extension.serial"
|
||||||
|
|
@ -78,7 +78,7 @@ var RolePermissions = map[SessionMode]PermissionSet{
|
||||||
PermissionExtensionWOL: true,
|
PermissionExtensionWOL: true,
|
||||||
PermissionSettingsRead: true,
|
PermissionSettingsRead: true,
|
||||||
PermissionSettingsWrite: true,
|
PermissionSettingsWrite: true,
|
||||||
PermissionSettingsAccess: true, // Only primary can access settings UI
|
PermissionSettingsAccess: true, // Only primary can access settings UI
|
||||||
PermissionSystemReboot: true,
|
PermissionSystemReboot: true,
|
||||||
PermissionSystemUpdate: true,
|
PermissionSystemUpdate: true,
|
||||||
PermissionSystemNetwork: true,
|
PermissionSystemNetwork: true,
|
||||||
|
|
@ -140,20 +140,20 @@ func RequirePermissionForMode(mode SessionMode, perm Permission) error {
|
||||||
|
|
||||||
// GetPermissionsResponse is the response structure for getPermissions RPC
|
// GetPermissionsResponse is the response structure for getPermissions RPC
|
||||||
type GetPermissionsResponse struct {
|
type GetPermissionsResponse struct {
|
||||||
Mode string `json:"mode"`
|
Mode string `json:"mode"`
|
||||||
Permissions map[string]bool `json:"permissions"`
|
Permissions map[string]bool `json:"permissions"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// MethodPermissions maps RPC methods to required permissions
|
// MethodPermissions maps RPC methods to required permissions
|
||||||
var MethodPermissions = map[string]Permission{
|
var MethodPermissions = map[string]Permission{
|
||||||
// Power/hardware control
|
// Power/hardware control
|
||||||
"setATXPowerAction": PermissionPowerControl,
|
"setATXPowerAction": PermissionPowerControl,
|
||||||
"setDCPowerState": PermissionPowerControl,
|
"setDCPowerState": PermissionPowerControl,
|
||||||
"setDCRestoreState": PermissionPowerControl,
|
"setDCRestoreState": PermissionPowerControl,
|
||||||
|
|
||||||
// USB device control
|
// USB device control
|
||||||
"setUsbDeviceState": PermissionUSBControl,
|
"setUsbDeviceState": PermissionUSBControl,
|
||||||
"setUsbDevices": PermissionUSBControl,
|
"setUsbDevices": PermissionUSBControl,
|
||||||
|
|
||||||
// Mount operations
|
// Mount operations
|
||||||
"mountUsb": PermissionMountMedia,
|
"mountUsb": PermissionMountMedia,
|
||||||
|
|
@ -196,43 +196,43 @@ var MethodPermissions = map[string]Permission{
|
||||||
"setBacklightSettings": PermissionSettingsWrite,
|
"setBacklightSettings": PermissionSettingsWrite,
|
||||||
|
|
||||||
// USB/HID settings
|
// USB/HID settings
|
||||||
"setUsbEmulationState": PermissionSettingsWrite,
|
"setUsbEmulationState": PermissionSettingsWrite,
|
||||||
"setUsbConfig": PermissionSettingsWrite,
|
"setUsbConfig": PermissionSettingsWrite,
|
||||||
"setKeyboardLayout": PermissionSettingsWrite,
|
"setKeyboardLayout": PermissionSettingsWrite,
|
||||||
"setJigglerState": PermissionSettingsWrite,
|
"setJigglerState": PermissionSettingsWrite,
|
||||||
"setJigglerConfig": PermissionSettingsWrite,
|
"setJigglerConfig": PermissionSettingsWrite,
|
||||||
"setMassStorageMode": PermissionSettingsWrite,
|
"setMassStorageMode": PermissionSettingsWrite,
|
||||||
"setKeyboardMacros": PermissionSettingsWrite,
|
"setKeyboardMacros": PermissionSettingsWrite,
|
||||||
"setWakeOnLanDevices": PermissionSettingsWrite,
|
"setWakeOnLanDevices": PermissionSettingsWrite,
|
||||||
|
|
||||||
// Cloud settings
|
// Cloud settings
|
||||||
"setCloudUrl": PermissionSettingsWrite,
|
"setCloudUrl": PermissionSettingsWrite,
|
||||||
"deregisterDevice": PermissionSettingsWrite,
|
"deregisterDevice": PermissionSettingsWrite,
|
||||||
|
|
||||||
// Active extension control
|
// Active extension control
|
||||||
"setActiveExtension": PermissionExtensionManage,
|
"setActiveExtension": PermissionExtensionManage,
|
||||||
|
|
||||||
// Input operations (already handled in other places but for consistency)
|
// Input operations (already handled in other places but for consistency)
|
||||||
"keyboardReport": PermissionKeyboardInput,
|
"keyboardReport": PermissionKeyboardInput,
|
||||||
"keypressReport": PermissionKeyboardInput,
|
"keypressReport": PermissionKeyboardInput,
|
||||||
"absMouseReport": PermissionMouseInput,
|
"absMouseReport": PermissionMouseInput,
|
||||||
"relMouseReport": PermissionMouseInput,
|
"relMouseReport": PermissionMouseInput,
|
||||||
"wheelReport": PermissionMouseInput,
|
"wheelReport": PermissionMouseInput,
|
||||||
"executeKeyboardMacro": PermissionPaste,
|
"executeKeyboardMacro": PermissionPaste,
|
||||||
"cancelKeyboardMacro": PermissionPaste,
|
"cancelKeyboardMacro": PermissionPaste,
|
||||||
|
|
||||||
// Session operations
|
// Session operations
|
||||||
"approveNewSession": PermissionSessionApprove,
|
"approveNewSession": PermissionSessionApprove,
|
||||||
"denyNewSession": PermissionSessionApprove,
|
"denyNewSession": PermissionSessionApprove,
|
||||||
"transferSession": PermissionSessionTransfer,
|
"transferSession": PermissionSessionTransfer,
|
||||||
"transferPrimary": PermissionSessionTransfer,
|
"transferPrimary": PermissionSessionTransfer,
|
||||||
"requestPrimary": PermissionSessionRequestPrimary,
|
"requestPrimary": PermissionSessionRequestPrimary,
|
||||||
"releasePrimary": PermissionSessionReleasePrimary,
|
"releasePrimary": PermissionSessionReleasePrimary,
|
||||||
|
|
||||||
// Extension operations
|
// Extension operations
|
||||||
"activateExtension": PermissionExtensionManage,
|
"activateExtension": PermissionExtensionManage,
|
||||||
"deactivateExtension": PermissionExtensionManage,
|
"deactivateExtension": PermissionExtensionManage,
|
||||||
"sendWOLMagicPacket": PermissionExtensionWOL,
|
"sendWOLMagicPacket": PermissionExtensionWOL,
|
||||||
|
|
||||||
// Read operations - require appropriate read permissions
|
// Read operations - require appropriate read permissions
|
||||||
"getSessionSettings": PermissionSettingsRead,
|
"getSessionSettings": PermissionSettingsRead,
|
||||||
|
|
@ -266,37 +266,37 @@ var MethodPermissions = map[string]Permission{
|
||||||
"getNetworkState": PermissionSettingsRead,
|
"getNetworkState": PermissionSettingsRead,
|
||||||
|
|
||||||
// Mount/media read operations
|
// Mount/media read operations
|
||||||
"getMassStorageMode": PermissionMountList,
|
"getMassStorageMode": PermissionMountList,
|
||||||
"getUsbState": PermissionMountList,
|
"getUsbState": PermissionMountList,
|
||||||
"getUSBState": PermissionMountList,
|
"getUSBState": PermissionMountList,
|
||||||
"listStorageFiles": PermissionMountList,
|
"listStorageFiles": PermissionMountList,
|
||||||
"getStorageSpace": PermissionMountList,
|
"getStorageSpace": PermissionMountList,
|
||||||
|
|
||||||
// Extension read operations
|
// Extension read operations
|
||||||
"getActiveExtension": PermissionSettingsRead,
|
"getActiveExtension": PermissionSettingsRead,
|
||||||
|
|
||||||
// Power state reads
|
// Power state reads
|
||||||
"getATXState": PermissionSettingsRead,
|
"getATXState": PermissionSettingsRead,
|
||||||
"getDCPowerState": PermissionSettingsRead,
|
"getDCPowerState": PermissionSettingsRead,
|
||||||
"getDCRestoreState": PermissionSettingsRead,
|
"getDCRestoreState": PermissionSettingsRead,
|
||||||
|
|
||||||
// Device info reads (these should be accessible to all)
|
// Device info reads (these should be accessible to all)
|
||||||
"getDeviceID": PermissionVideoView,
|
"getDeviceID": PermissionVideoView,
|
||||||
"getLocalVersion": PermissionVideoView,
|
"getLocalVersion": PermissionVideoView,
|
||||||
"getVideoState": PermissionVideoView,
|
"getVideoState": PermissionVideoView,
|
||||||
"getKeyboardLedState": PermissionVideoView,
|
"getKeyboardLedState": PermissionVideoView,
|
||||||
"getKeyDownState": PermissionVideoView,
|
"getKeyDownState": PermissionVideoView,
|
||||||
"ping": PermissionVideoView,
|
"ping": PermissionVideoView,
|
||||||
"getTimezones": PermissionVideoView,
|
"getTimezones": PermissionVideoView,
|
||||||
"getSessions": PermissionVideoView,
|
"getSessions": PermissionVideoView,
|
||||||
"getUpdateStatus": PermissionSettingsRead,
|
"getUpdateStatus": PermissionSettingsRead,
|
||||||
"isUpdatePending": PermissionSettingsRead,
|
"isUpdatePending": PermissionSettingsRead,
|
||||||
"getUsbEmulationState": PermissionSettingsRead,
|
"getUsbEmulationState": PermissionSettingsRead,
|
||||||
"getUsbConfig": PermissionSettingsRead,
|
"getUsbConfig": PermissionSettingsRead,
|
||||||
"getUsbDevices": PermissionSettingsRead,
|
"getUsbDevices": PermissionSettingsRead,
|
||||||
"getKeyboardMacros": PermissionSettingsRead,
|
"getKeyboardMacros": PermissionSettingsRead,
|
||||||
"getWakeOnLanDevices": PermissionSettingsRead,
|
"getWakeOnLanDevices": PermissionSettingsRead,
|
||||||
"getVirtualMediaState": PermissionMountList,
|
"getVirtualMediaState": PermissionMountList,
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMethodPermission returns the required permission for an RPC method
|
// GetMethodPermission returns the required permission for an RPC method
|
||||||
|
|
|
||||||
28
jsonrpc.go
28
jsonrpc.go
|
|
@ -56,7 +56,6 @@ type DisplayRotationSettings struct {
|
||||||
Rotation string `json:"rotation"`
|
Rotation string `json:"rotation"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type BacklightSettings struct {
|
type BacklightSettings struct {
|
||||||
MaxBrightness int `json:"max_brightness"`
|
MaxBrightness int `json:"max_brightness"`
|
||||||
DimAfter int `json:"dim_after"`
|
DimAfter int `json:"dim_after"`
|
||||||
|
|
@ -1330,7 +1329,7 @@ func rpcRequestPrimary(sessionId string) map[string]interface{} {
|
||||||
err := sessionManager.RequestPrimary(sessionId)
|
err := sessionManager.RequestPrimary(sessionId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return map[string]interface{}{
|
return map[string]interface{}{
|
||||||
"status": "error",
|
"status": "error",
|
||||||
"message": err.Error(),
|
"message": err.Error(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1339,14 +1338,14 @@ func rpcRequestPrimary(sessionId string) map[string]interface{} {
|
||||||
session := sessionManager.GetSession(sessionId)
|
session := sessionManager.GetSession(sessionId)
|
||||||
if session == nil {
|
if session == nil {
|
||||||
return map[string]interface{}{
|
return map[string]interface{}{
|
||||||
"status": "error",
|
"status": "error",
|
||||||
"message": "session not found",
|
"message": "session not found",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return map[string]interface{}{
|
return map[string]interface{}{
|
||||||
"status": "success",
|
"status": "success",
|
||||||
"mode": string(session.Mode),
|
"mode": string(session.Mode),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1358,7 +1357,6 @@ func rpcTransferPrimary(fromId string, toId string) error {
|
||||||
return sessionManager.TransferPrimary(fromId, toId)
|
return sessionManager.TransferPrimary(fromId, toId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func rpcGetSessionConfig() (map[string]interface{}, error) {
|
func rpcGetSessionConfig() (map[string]interface{}, error) {
|
||||||
maxSessions := 10
|
maxSessions := 10
|
||||||
primaryTimeout := 300
|
primaryTimeout := 300
|
||||||
|
|
@ -1373,27 +1371,13 @@ func rpcGetSessionConfig() (map[string]interface{}, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return map[string]interface{}{
|
return map[string]interface{}{
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"maxSessions": maxSessions,
|
"maxSessions": maxSessions,
|
||||||
"primaryTimeout": primaryTimeout,
|
"primaryTimeout": primaryTimeout,
|
||||||
"allowCloudOverride": true,
|
"allowCloudOverride": true,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Session) rpcApprovePrimaryRequest(requesterID string) error {
|
|
||||||
if s == nil || s.ID == "" {
|
|
||||||
return errors.New("invalid session")
|
|
||||||
}
|
|
||||||
return sessionManager.ApprovePrimaryRequest(s.ID, requesterID)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Session) rpcDenyPrimaryRequest(requesterID string) error {
|
|
||||||
if s == nil || s.ID == "" {
|
|
||||||
return errors.New("invalid session")
|
|
||||||
}
|
|
||||||
return sessionManager.DenyPrimaryRequest(s.ID, requesterID)
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
keyboardMacroCancel context.CancelFunc
|
keyboardMacroCancel context.CancelFunc
|
||||||
keyboardMacroLock sync.Mutex
|
keyboardMacroLock sync.Mutex
|
||||||
|
|
|
||||||
8
main.go
8
main.go
|
|
@ -19,12 +19,12 @@ func Main() {
|
||||||
// Initialize currentSessionSettings to use config's persistent SessionSettings
|
// Initialize currentSessionSettings to use config's persistent SessionSettings
|
||||||
if config.SessionSettings == nil {
|
if config.SessionSettings == nil {
|
||||||
config.SessionSettings = &SessionSettings{
|
config.SessionSettings = &SessionSettings{
|
||||||
RequireApproval: false,
|
RequireApproval: false,
|
||||||
RequireNickname: false,
|
RequireNickname: false,
|
||||||
ReconnectGrace: 10,
|
ReconnectGrace: 10,
|
||||||
PrivateKeystrokes: false,
|
PrivateKeystrokes: false,
|
||||||
}
|
}
|
||||||
SaveConfig()
|
_ = SaveConfig()
|
||||||
}
|
}
|
||||||
currentSessionSettings = config.SessionSettings
|
currentSessionSettings = config.SessionSettings
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,28 +58,28 @@ type TransferBlacklistEntry struct {
|
||||||
|
|
||||||
// Broadcast throttling to prevent DoS
|
// Broadcast throttling to prevent DoS
|
||||||
var (
|
var (
|
||||||
lastBroadcast time.Time
|
lastBroadcast time.Time
|
||||||
broadcastMutex sync.Mutex
|
broadcastMutex sync.Mutex
|
||||||
broadcastDelay = 100 * time.Millisecond // Min time between broadcasts
|
broadcastDelay = 100 * time.Millisecond // Min time between broadcasts
|
||||||
|
|
||||||
// Pre-allocated event maps to reduce allocations
|
// Pre-allocated event maps to reduce allocations
|
||||||
modePrimaryEvent = map[string]string{"mode": "primary"}
|
modePrimaryEvent = map[string]string{"mode": "primary"}
|
||||||
modeObserverEvent = map[string]string{"mode": "observer"}
|
modeObserverEvent = map[string]string{"mode": "observer"}
|
||||||
)
|
)
|
||||||
|
|
||||||
type SessionManager struct {
|
type SessionManager struct {
|
||||||
mu sync.RWMutex // 24 bytes - place first for better alignment
|
mu sync.RWMutex // 24 bytes - place first for better alignment
|
||||||
primaryTimeout time.Duration // 8 bytes
|
primaryTimeout time.Duration // 8 bytes
|
||||||
logger *zerolog.Logger // 8 bytes
|
logger *zerolog.Logger // 8 bytes
|
||||||
sessions map[string]*Session // 8 bytes
|
sessions map[string]*Session // 8 bytes
|
||||||
reconnectGrace map[string]time.Time // 8 bytes
|
reconnectGrace map[string]time.Time // 8 bytes
|
||||||
reconnectInfo map[string]*SessionData // 8 bytes
|
reconnectInfo map[string]*SessionData // 8 bytes
|
||||||
transferBlacklist []TransferBlacklistEntry // Prevent demoted sessions from immediate re-promotion
|
transferBlacklist []TransferBlacklistEntry // Prevent demoted sessions from immediate re-promotion
|
||||||
queueOrder []string // 24 bytes (slice header)
|
queueOrder []string // 24 bytes (slice header)
|
||||||
primarySessionID string // 16 bytes
|
primarySessionID string // 16 bytes
|
||||||
lastPrimaryID string // 16 bytes
|
lastPrimaryID string // 16 bytes
|
||||||
maxSessions int // 8 bytes
|
maxSessions int // 8 bytes
|
||||||
cleanupCancel context.CancelFunc // For stopping cleanup goroutine
|
cleanupCancel context.CancelFunc // For stopping cleanup goroutine
|
||||||
|
|
||||||
// Emergency promotion tracking for safety
|
// Emergency promotion tracking for safety
|
||||||
lastEmergencyPromotion time.Time
|
lastEmergencyPromotion time.Time
|
||||||
|
|
@ -107,14 +107,14 @@ func NewSessionManager(logger *zerolog.Logger) *SessionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
sm := &SessionManager{
|
sm := &SessionManager{
|
||||||
sessions: make(map[string]*Session),
|
sessions: make(map[string]*Session),
|
||||||
reconnectGrace: make(map[string]time.Time),
|
reconnectGrace: make(map[string]time.Time),
|
||||||
reconnectInfo: make(map[string]*SessionData),
|
reconnectInfo: make(map[string]*SessionData),
|
||||||
transferBlacklist: make([]TransferBlacklistEntry, 0),
|
transferBlacklist: make([]TransferBlacklistEntry, 0),
|
||||||
queueOrder: make([]string, 0),
|
queueOrder: make([]string, 0),
|
||||||
logger: logger,
|
logger: logger,
|
||||||
maxSessions: maxSessions,
|
maxSessions: maxSessions,
|
||||||
primaryTimeout: primaryTimeout,
|
primaryTimeout: primaryTimeout,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start background cleanup of inactive sessions
|
// Start background cleanup of inactive sessions
|
||||||
|
|
@ -200,8 +200,8 @@ func (sm *SessionManager) AddSession(session *Session, clientSettings *SessionSe
|
||||||
if sm.lastPrimaryID == session.ID && !isBlacklisted {
|
if sm.lastPrimaryID == session.ID && !isBlacklisted {
|
||||||
// This is the rightful primary reconnecting within grace period
|
// This is the rightful primary reconnecting within grace period
|
||||||
sm.primarySessionID = session.ID
|
sm.primarySessionID = session.ID
|
||||||
sm.lastPrimaryID = "" // Clear since primary successfully reconnected
|
sm.lastPrimaryID = "" // Clear since primary successfully reconnected
|
||||||
delete(sm.reconnectGrace, session.ID) // Clear grace period
|
delete(sm.reconnectGrace, session.ID) // Clear grace period
|
||||||
sm.logger.Debug().
|
sm.logger.Debug().
|
||||||
Str("sessionID", session.ID).
|
Str("sessionID", session.ID).
|
||||||
Msg("Primary session successfully reconnected within grace period")
|
Msg("Primary session successfully reconnected within grace period")
|
||||||
|
|
@ -290,7 +290,7 @@ func (sm *SessionManager) AddSession(session *Session, clientSettings *SessionSe
|
||||||
// we can always promote to primary when no primary exists
|
// we can always promote to primary when no primary exists
|
||||||
session.Mode = SessionModePrimary
|
session.Mode = SessionModePrimary
|
||||||
sm.primarySessionID = session.ID
|
sm.primarySessionID = session.ID
|
||||||
sm.lastPrimaryID = "" // Clear since we have a new primary
|
sm.lastPrimaryID = "" // Clear since we have a new primary
|
||||||
|
|
||||||
// Clear all existing grace periods when a new primary is established
|
// Clear all existing grace periods when a new primary is established
|
||||||
// This prevents multiple sessions from fighting for primary status via grace period
|
// This prevents multiple sessions from fighting for primary status via grace period
|
||||||
|
|
@ -389,7 +389,7 @@ func (sm *SessionManager) RemoveSession(sessionID string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Limit grace period entries to prevent memory exhaustion (DoS protection)
|
// Limit grace period entries to prevent memory exhaustion (DoS protection)
|
||||||
const maxGraceEntries = 10 // Reduced from 20 to limit memory usage
|
const maxGraceEntries = 10 // Reduced from 20 to limit memory usage
|
||||||
for len(sm.reconnectGrace) >= maxGraceEntries {
|
for len(sm.reconnectGrace) >= maxGraceEntries {
|
||||||
// Find and remove the oldest grace period entry
|
// Find and remove the oldest grace period entry
|
||||||
var oldestID string
|
var oldestID string
|
||||||
|
|
@ -422,8 +422,8 @@ func (sm *SessionManager) RemoveSession(sessionID string) {
|
||||||
|
|
||||||
// If this was the primary session, clear primary slot and track for grace period
|
// If this was the primary session, clear primary slot and track for grace period
|
||||||
if wasPrimary {
|
if wasPrimary {
|
||||||
sm.lastPrimaryID = sessionID // Remember this was the primary for grace period
|
sm.lastPrimaryID = sessionID // Remember this was the primary for grace period
|
||||||
sm.primarySessionID = "" // Clear primary slot so other sessions can be promoted
|
sm.primarySessionID = "" // Clear primary slot so other sessions can be promoted
|
||||||
sm.logger.Info().
|
sm.logger.Info().
|
||||||
Str("sessionID", sessionID).
|
Str("sessionID", sessionID).
|
||||||
Dur("gracePeriod", time.Duration(gracePeriod)*time.Second).
|
Dur("gracePeriod", time.Duration(gracePeriod)*time.Second).
|
||||||
|
|
@ -970,7 +970,7 @@ func (sm *SessionManager) transferPrimaryRole(fromSessionID, toSessionID, transf
|
||||||
toSession.Mode = SessionModePrimary
|
toSession.Mode = SessionModePrimary
|
||||||
toSession.hidRPCAvailable = false // Force re-handshake
|
toSession.hidRPCAvailable = false // Force re-handshake
|
||||||
sm.primarySessionID = toSessionID
|
sm.primarySessionID = toSessionID
|
||||||
sm.lastPrimaryID = toSessionID // Set to new primary so grace period works on refresh
|
sm.lastPrimaryID = toSessionID // Set to new primary so grace period works on refresh
|
||||||
|
|
||||||
// Clear input state
|
// Clear input state
|
||||||
sm.clearInputState()
|
sm.clearInputState()
|
||||||
|
|
@ -1038,9 +1038,9 @@ func (sm *SessionManager) transferPrimaryRole(fromSessionID, toSessionID, transf
|
||||||
// Send connection reset signal to the promoted session
|
// Send connection reset signal to the promoted session
|
||||||
writeJSONRPCEvent("connectionModeChanged", map[string]interface{}{
|
writeJSONRPCEvent("connectionModeChanged", map[string]interface{}{
|
||||||
"sessionId": toSessionID,
|
"sessionId": toSessionID,
|
||||||
"newMode": string(toSession.Mode),
|
"newMode": string(toSession.Mode),
|
||||||
"reason": "session_promotion",
|
"reason": "session_promotion",
|
||||||
"action": "reconnect_required",
|
"action": "reconnect_required",
|
||||||
"timestamp": time.Now().Unix(),
|
"timestamp": time.Now().Unix(),
|
||||||
}, toSession)
|
}, toSession)
|
||||||
|
|
||||||
|
|
@ -1113,7 +1113,7 @@ func (sm *SessionManager) removeFromQueue(sessionID string) {
|
||||||
func (sm *SessionManager) clearInputState() {
|
func (sm *SessionManager) clearInputState() {
|
||||||
// Clear keyboard state
|
// Clear keyboard state
|
||||||
if gadget != nil {
|
if gadget != nil {
|
||||||
gadget.KeyboardReport(0, []byte{0, 0, 0, 0, 0, 0})
|
_ = gadget.KeyboardReport(0, []byte{0, 0, 0, 0, 0, 0})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1185,8 +1185,8 @@ func (sm *SessionManager) findMostTrustedSessionForEmergency() string {
|
||||||
for sessionID, session := range sm.sessions {
|
for sessionID, session := range sm.sessions {
|
||||||
// Skip if blacklisted, primary, or not eligible modes
|
// Skip if blacklisted, primary, or not eligible modes
|
||||||
if sm.isSessionBlacklisted(sessionID) ||
|
if sm.isSessionBlacklisted(sessionID) ||
|
||||||
session.Mode == SessionModePrimary ||
|
session.Mode == SessionModePrimary ||
|
||||||
(session.Mode != SessionModeObserver && session.Mode != SessionModeQueued) {
|
(session.Mode != SessionModeObserver && session.Mode != SessionModeQueued) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1377,11 +1377,11 @@ func (sm *SessionManager) Shutdown() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) {
|
func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) {
|
||||||
ticker := time.NewTicker(1 * time.Second) // Check every second for grace periods
|
ticker := time.NewTicker(1 * time.Second) // Check every second for grace periods
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|
||||||
pendingTimeout := 1 * time.Minute // Reduced from 5 minutes to prevent DoS
|
pendingTimeout := 1 * time.Minute // Reduced from 5 minutes to prevent DoS
|
||||||
validationCounter := 0 // Counter for periodic validateSinglePrimary calls
|
validationCounter := 0 // Counter for periodic validateSinglePrimary calls
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|
@ -1508,7 +1508,7 @@ func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) {
|
||||||
// Clean up pending sessions that have timed out (DoS protection)
|
// Clean up pending sessions that have timed out (DoS protection)
|
||||||
for id, session := range sm.sessions {
|
for id, session := range sm.sessions {
|
||||||
if session.Mode == SessionModePending &&
|
if session.Mode == SessionModePending &&
|
||||||
now.Sub(session.CreatedAt) > pendingTimeout {
|
now.Sub(session.CreatedAt) > pendingTimeout {
|
||||||
websocketLogger.Info().
|
websocketLogger.Info().
|
||||||
Str("sessionId", id).
|
Str("sessionId", id).
|
||||||
Dur("age", now.Sub(session.CreatedAt)).
|
Dur("age", now.Sub(session.CreatedAt)).
|
||||||
|
|
@ -1549,8 +1549,8 @@ func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) {
|
||||||
bestScore := -1
|
bestScore := -1
|
||||||
for id, session := range sm.sessions {
|
for id, session := range sm.sessions {
|
||||||
if id != timedOutSessionID &&
|
if id != timedOutSessionID &&
|
||||||
!sm.isSessionBlacklisted(id) &&
|
!sm.isSessionBlacklisted(id) &&
|
||||||
(session.Mode == SessionModeObserver || session.Mode == SessionModeQueued) {
|
(session.Mode == SessionModeObserver || session.Mode == SessionModeQueued) {
|
||||||
score := sm.getSessionTrustScore(id)
|
score := sm.getSessionTrustScore(id)
|
||||||
if score > bestScore {
|
if score > bestScore {
|
||||||
bestScore = score
|
bestScore = score
|
||||||
|
|
|
||||||
|
|
@ -1,45 +1,52 @@
|
||||||
import { SessionInfo } from "@/stores/sessionStore";
|
import { SessionInfo } from "@/stores/sessionStore";
|
||||||
|
|
||||||
|
interface JsonRpcResponse {
|
||||||
|
result?: unknown;
|
||||||
|
error?: { message: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: JsonRpcResponse) => void) => void;
|
||||||
|
|
||||||
export const sessionApi = {
|
export const sessionApi = {
|
||||||
getSessions: async (sendFn: Function): Promise<SessionInfo[]> => {
|
getSessions: async (sendFn: RpcSendFunction): Promise<SessionInfo[]> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("getSessions", {}, (response: any) => {
|
sendFn("getSessions", {}, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
resolve(response.result || []);
|
resolve((response.result as SessionInfo[]) || []);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getSessionInfo: async (sendFn: Function, sessionId: string): Promise<SessionInfo> => {
|
getSessionInfo: async (sendFn: RpcSendFunction, sessionId: string): Promise<SessionInfo> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("getSessionInfo", { sessionId }, (response: any) => {
|
sendFn("getSessionInfo", { sessionId }, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
resolve(response.result);
|
resolve(response.result as SessionInfo);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
requestPrimary: async (sendFn: Function, sessionId: string): Promise<{ status: string; mode?: string; message?: string }> => {
|
requestPrimary: async (sendFn: RpcSendFunction, sessionId: string): Promise<{ status: string; mode?: string; message?: string }> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("requestPrimary", { sessionId }, (response: any) => {
|
sendFn("requestPrimary", { sessionId }, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
resolve(response.result);
|
resolve(response.result as { status: string; mode?: string; message?: string });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
releasePrimary: async (sendFn: Function, sessionId: string): Promise<void> => {
|
releasePrimary: async (sendFn: RpcSendFunction, sessionId: string): Promise<void> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("releasePrimary", { sessionId }, (response: any) => {
|
sendFn("releasePrimary", { sessionId }, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -50,12 +57,12 @@ export const sessionApi = {
|
||||||
},
|
},
|
||||||
|
|
||||||
transferPrimary: async (
|
transferPrimary: async (
|
||||||
sendFn: Function,
|
sendFn: RpcSendFunction,
|
||||||
fromId: string,
|
fromId: string,
|
||||||
toId: string
|
toId: string
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("transferPrimary", { fromId, toId }, (response: any) => {
|
sendFn("transferPrimary", { fromId, toId }, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -66,12 +73,12 @@ export const sessionApi = {
|
||||||
},
|
},
|
||||||
|
|
||||||
updateNickname: async (
|
updateNickname: async (
|
||||||
sendFn: Function,
|
sendFn: RpcSendFunction,
|
||||||
sessionId: string,
|
sessionId: string,
|
||||||
nickname: string
|
nickname: string
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("updateSessionNickname", { sessionId, nickname }, (response: any) => {
|
sendFn("updateSessionNickname", { sessionId, nickname }, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -82,11 +89,11 @@ export const sessionApi = {
|
||||||
},
|
},
|
||||||
|
|
||||||
approveNewSession: async (
|
approveNewSession: async (
|
||||||
sendFn: Function,
|
sendFn: RpcSendFunction,
|
||||||
sessionId: string
|
sessionId: string
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("approveNewSession", { sessionId }, (response: any) => {
|
sendFn("approveNewSession", { sessionId }, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -97,11 +104,11 @@ export const sessionApi = {
|
||||||
},
|
},
|
||||||
|
|
||||||
denyNewSession: async (
|
denyNewSession: async (
|
||||||
sendFn: Function,
|
sendFn: RpcSendFunction,
|
||||||
sessionId: string
|
sessionId: string
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
sendFn("denyNewSession", { sessionId }, (response: any) => {
|
sendFn("denyNewSession", { sessionId }, (response: JsonRpcResponse) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
reject(new Error(response.error.message));
|
reject(new Error(response.error.message));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,15 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState, useCallback } from "react";
|
||||||
import { useNavigate } from "react-router";
|
import { useNavigate } from "react-router";
|
||||||
import { XCircleIcon } from "@heroicons/react/24/outline";
|
import { XCircleIcon } from "@heroicons/react/24/outline";
|
||||||
import { Button } from "./Button";
|
|
||||||
import { DEVICE_API, CLOUD_API } from "@/ui.config";
|
import { DEVICE_API, CLOUD_API } from "@/ui.config";
|
||||||
import { isOnDevice } from "@/main";
|
import { isOnDevice } from "@/main";
|
||||||
import { useUserStore } from "@/hooks/stores";
|
import { useUserStore } from "@/hooks/stores";
|
||||||
import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore";
|
import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore";
|
||||||
import api from "@/api";
|
import api from "@/api";
|
||||||
|
|
||||||
|
import { Button } from "./Button";
|
||||||
|
|
||||||
interface AccessDeniedOverlayProps {
|
interface AccessDeniedOverlayProps {
|
||||||
show: boolean;
|
show: boolean;
|
||||||
message?: string;
|
message?: string;
|
||||||
|
|
@ -25,7 +27,7 @@ export default function AccessDeniedOverlay({
|
||||||
const { clearNickname } = useSharedSessionStore();
|
const { clearNickname } = useSharedSessionStore();
|
||||||
const [countdown, setCountdown] = useState(10);
|
const [countdown, setCountdown] = useState(10);
|
||||||
|
|
||||||
const handleLogout = async () => {
|
const handleLogout = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const logoutUrl = isOnDevice ? `${DEVICE_API}/auth/logout` : `${CLOUD_API}/logout`;
|
const logoutUrl = isOnDevice ? `${DEVICE_API}/auth/logout` : `${CLOUD_API}/logout`;
|
||||||
const res = await api.POST(logoutUrl);
|
const res = await api.POST(logoutUrl);
|
||||||
|
|
@ -41,7 +43,7 @@ export default function AccessDeniedOverlay({
|
||||||
clearSession();
|
clearSession();
|
||||||
clearNickname();
|
clearNickname();
|
||||||
navigate("/");
|
navigate("/");
|
||||||
};
|
}, [navigate, setUser, clearSession, clearNickname]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!show) return;
|
if (!show) return;
|
||||||
|
|
@ -59,7 +61,7 @@ export default function AccessDeniedOverlay({
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
return () => clearInterval(timer);
|
return () => clearInterval(timer);
|
||||||
}, [show]);
|
}, [show, handleLogout]);
|
||||||
|
|
||||||
if (!show) return null;
|
if (!show) return null;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import {
|
||||||
useMountMediaStore,
|
useMountMediaStore,
|
||||||
useSettingsStore,
|
useSettingsStore,
|
||||||
useUiStore,
|
useUiStore,
|
||||||
} from "@/hooks/stores";
|
useRTCStore } from "@/hooks/stores";
|
||||||
import Container from "@components/Container";
|
import Container from "@components/Container";
|
||||||
import { cx } from "@/cva.config";
|
import { cx } from "@/cva.config";
|
||||||
import PasteModal from "@/components/popovers/PasteModal";
|
import PasteModal from "@/components/popovers/PasteModal";
|
||||||
|
|
@ -21,7 +21,6 @@ import ExtensionPopover from "@/components/popovers/ExtensionPopover";
|
||||||
import SessionPopover from "@/components/popovers/SessionPopover";
|
import SessionPopover from "@/components/popovers/SessionPopover";
|
||||||
import { useDeviceUiNavigation } from "@/hooks/useAppNavigation";
|
import { useDeviceUiNavigation } from "@/hooks/useAppNavigation";
|
||||||
import { useSessionStore } from "@/stores/sessionStore";
|
import { useSessionStore } from "@/stores/sessionStore";
|
||||||
import { useRTCStore } from "@/hooks/stores";
|
|
||||||
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
||||||
|
|
||||||
export default function Actionbar({
|
export default function Actionbar({
|
||||||
|
|
@ -54,7 +53,7 @@ export default function Actionbar({
|
||||||
setSessions(response.result);
|
setSessions(response.result);
|
||||||
rpcDataChannel.removeEventListener("message", handler);
|
rpcDataChannel.removeEventListener("message", handler);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch {
|
||||||
// Ignore parse errors for non-JSON messages
|
// Ignore parse errors for non-JSON messages
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -67,7 +66,7 @@ export default function Actionbar({
|
||||||
rpcDataChannel.removeEventListener("message", handler);
|
rpcDataChannel.removeEventListener("message", handler);
|
||||||
}, 5000);
|
}, 5000);
|
||||||
}
|
}
|
||||||
}, [rpcDataChannel?.readyState]);
|
}, [rpcDataChannel, sessions.length, setSessions]);
|
||||||
|
|
||||||
// This is the only way to get a reliable state change for the popover
|
// This is the only way to get a reliable state change for the popover
|
||||||
// at time of writing this there is no mount, or unmount event for the popover
|
// at time of writing this there is no mount, or unmount event for the popover
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,13 @@
|
||||||
import { useState, useEffect, useRef } from "react";
|
import { useState, useEffect, useRef } from "react";
|
||||||
import { Dialog, DialogPanel, DialogBackdrop } from "@headlessui/react";
|
import { Dialog, DialogPanel, DialogBackdrop } from "@headlessui/react";
|
||||||
import { UserIcon, XMarkIcon } from "@heroicons/react/20/solid";
|
import { UserIcon, XMarkIcon } from "@heroicons/react/20/solid";
|
||||||
import { Button } from "./Button";
|
|
||||||
import { useSettingsStore } from "@/hooks/stores";
|
import { useSettingsStore , useRTCStore } from "@/hooks/stores";
|
||||||
import { useJsonRpc } from "@/hooks/useJsonRpc";
|
import { useJsonRpc } from "@/hooks/useJsonRpc";
|
||||||
import { useRTCStore } from "@/hooks/stores";
|
|
||||||
import { generateNickname } from "@/utils/nicknameGenerator";
|
import { generateNickname } from "@/utils/nicknameGenerator";
|
||||||
|
|
||||||
|
import { Button } from "./Button";
|
||||||
|
|
||||||
type SessionRole = "primary" | "observer" | "queued" | "pending";
|
type SessionRole = "primary" | "observer" | "queued" | "pending";
|
||||||
|
|
||||||
interface NicknameModalProps {
|
interface NicknameModalProps {
|
||||||
|
|
@ -128,8 +129,8 @@ export default function NicknameModal({
|
||||||
await onSubmit(trimmedNickname);
|
await onSubmit(trimmedNickname);
|
||||||
setNickname("");
|
setNickname("");
|
||||||
setGeneratedNickname(""); // Reset generated nickname after successful submit
|
setGeneratedNickname(""); // Reset generated nickname after successful submit
|
||||||
} catch (error: any) {
|
} catch (error) {
|
||||||
setError(error.message || "Failed to set nickname");
|
setError(error instanceof Error ? error.message : "Failed to set nickname");
|
||||||
setIsSubmitting(false);
|
setIsSubmitting(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,19 @@
|
||||||
import { useSessionStore } from "@/stores/sessionStore";
|
|
||||||
import { sessionApi } from "@/api/sessionApi";
|
|
||||||
import { Button } from "@/components/Button";
|
|
||||||
import {
|
import {
|
||||||
LockClosedIcon,
|
LockClosedIcon,
|
||||||
LockOpenIcon,
|
LockOpenIcon,
|
||||||
ClockIcon
|
ClockIcon
|
||||||
} from "@heroicons/react/16/solid";
|
} from "@heroicons/react/16/solid";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
import { useSessionStore } from "@/stores/sessionStore";
|
||||||
|
import { sessionApi } from "@/api/sessionApi";
|
||||||
|
import { Button } from "@/components/Button";
|
||||||
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
||||||
|
|
||||||
|
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
|
||||||
|
|
||||||
interface SessionControlPanelProps {
|
interface SessionControlPanelProps {
|
||||||
sendFn: Function;
|
sendFn: RpcSendFunction;
|
||||||
className?: string;
|
className?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,8 +51,8 @@ export default function SessionControlPanel({ sendFn, className }: SessionContro
|
||||||
setSessionError(result.message || "Failed to request primary control");
|
setSessionError(result.message || "Failed to request primary control");
|
||||||
setRequestingPrimary(false);
|
setRequestingPrimary(false);
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error) {
|
||||||
setSessionError(error.message);
|
setSessionError(error instanceof Error ? error.message : "Unknown error");
|
||||||
console.error("Failed to request primary control:", error);
|
console.error("Failed to request primary control:", error);
|
||||||
setRequestingPrimary(false);
|
setRequestingPrimary(false);
|
||||||
}
|
}
|
||||||
|
|
@ -60,8 +63,8 @@ export default function SessionControlPanel({ sendFn, className }: SessionContro
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await sessionApi.releasePrimary(sendFn, currentSessionId);
|
await sessionApi.releasePrimary(sendFn, currentSessionId);
|
||||||
} catch (error: any) {
|
} catch (error) {
|
||||||
setSessionError(error.message);
|
setSessionError(error instanceof Error ? error.message : "Unknown error");
|
||||||
console.error("Failed to release primary control:", error);
|
console.error("Failed to release primary control:", error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import { PencilIcon, CheckIcon, XMarkIcon } from "@heroicons/react/20/solid";
|
import { PencilIcon, CheckIcon, XMarkIcon } from "@heroicons/react/20/solid";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
|
||||||
import { formatters } from "@/utils";
|
import { formatters } from "@/utils";
|
||||||
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { XMarkIcon, UserIcon, GlobeAltIcon, ComputerDesktopIcon } from "@heroicons/react/20/solid";
|
import { XMarkIcon, UserIcon, GlobeAltIcon, ComputerDesktopIcon } from "@heroicons/react/20/solid";
|
||||||
|
|
||||||
import { Button } from "./Button";
|
import { Button } from "./Button";
|
||||||
|
|
||||||
type RequestType = "session_approval" | "primary_control";
|
type RequestType = "session_approval" | "primary_control";
|
||||||
|
|
@ -55,7 +56,8 @@ export default function UnifiedSessionRequestDialog({
|
||||||
|
|
||||||
return () => clearInterval(timer);
|
return () => clearInterval(timer);
|
||||||
}
|
}
|
||||||
}, [request?.id, request?.type]); // Only depend on stable properties
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [request?.id, request?.type]); // Only depend on stable properties to avoid unnecessary re-renders
|
||||||
|
|
||||||
// Handle auto-deny when timeout occurs
|
// Handle auto-deny when timeout occurs
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import {
|
||||||
useSettingsStore,
|
useSettingsStore,
|
||||||
useVideoStore,
|
useVideoStore,
|
||||||
} from "@/hooks/stores";
|
} from "@/hooks/stores";
|
||||||
import { useSessionStore } from "@/stores/sessionStore";
|
|
||||||
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
||||||
import useMouse from "@/hooks/useMouse";
|
import useMouse from "@/hooks/useMouse";
|
||||||
|
|
||||||
|
|
@ -37,7 +36,6 @@ export default function WebRTCVideo() {
|
||||||
|
|
||||||
// Store hooks
|
// Store hooks
|
||||||
const settings = useSettingsStore();
|
const settings = useSettingsStore();
|
||||||
const { currentMode } = useSessionStore();
|
|
||||||
const { hasPermission } = usePermissions();
|
const { hasPermission } = usePermissions();
|
||||||
const { handleKeyPress, resetKeyboardState } = useKeyboard();
|
const { handleKeyPress, resetKeyboardState } = useKeyboard();
|
||||||
const {
|
const {
|
||||||
|
|
@ -230,7 +228,7 @@ export default function WebRTCVideo() {
|
||||||
if (!hasPermission(Permission.MOUSE_INPUT)) return;
|
if (!hasPermission(Permission.MOUSE_INPUT)) return;
|
||||||
handler(e);
|
handler(e);
|
||||||
};
|
};
|
||||||
}, [currentMode, getAbsMouseMoveHandler, videoClientWidth, videoClientHeight, videoWidth, videoHeight]);
|
}, [getAbsMouseMoveHandler, videoClientWidth, videoClientHeight, videoWidth, videoHeight, hasPermission]);
|
||||||
|
|
||||||
const relMouseMoveHandler = useMemo(() => {
|
const relMouseMoveHandler = useMemo(() => {
|
||||||
const handler = getRelMouseMoveHandler();
|
const handler = getRelMouseMoveHandler();
|
||||||
|
|
@ -239,7 +237,7 @@ export default function WebRTCVideo() {
|
||||||
if (!hasPermission(Permission.MOUSE_INPUT)) return;
|
if (!hasPermission(Permission.MOUSE_INPUT)) return;
|
||||||
handler(e);
|
handler(e);
|
||||||
};
|
};
|
||||||
}, [currentMode, getRelMouseMoveHandler]);
|
}, [getRelMouseMoveHandler, hasPermission]);
|
||||||
|
|
||||||
const mouseWheelHandler = useMemo(() => {
|
const mouseWheelHandler = useMemo(() => {
|
||||||
const handler = getMouseWheelHandler();
|
const handler = getMouseWheelHandler();
|
||||||
|
|
@ -248,7 +246,7 @@ export default function WebRTCVideo() {
|
||||||
if (!hasPermission(Permission.MOUSE_INPUT)) return;
|
if (!hasPermission(Permission.MOUSE_INPUT)) return;
|
||||||
handler(e);
|
handler(e);
|
||||||
};
|
};
|
||||||
}, [currentMode, getMouseWheelHandler]);
|
}, [getMouseWheelHandler, hasPermission]);
|
||||||
|
|
||||||
const keyDownHandler = useCallback(
|
const keyDownHandler = useCallback(
|
||||||
(e: KeyboardEvent) => {
|
(e: KeyboardEvent) => {
|
||||||
|
|
@ -288,7 +286,7 @@ export default function WebRTCVideo() {
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[currentMode, handleKeyPress, isKeyboardLockActive],
|
[handleKeyPress, isKeyboardLockActive, hasPermission],
|
||||||
);
|
);
|
||||||
|
|
||||||
const keyUpHandler = useCallback(
|
const keyUpHandler = useCallback(
|
||||||
|
|
@ -310,7 +308,7 @@ export default function WebRTCVideo() {
|
||||||
|
|
||||||
handleKeyPress(hidKey, false);
|
handleKeyPress(hidKey, false);
|
||||||
},
|
},
|
||||||
[currentMode, handleKeyPress],
|
[handleKeyPress, hasPermission],
|
||||||
);
|
);
|
||||||
|
|
||||||
const videoKeyUpHandler = useCallback((e: KeyboardEvent) => {
|
const videoKeyUpHandler = useCallback((e: KeyboardEvent) => {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,13 @@
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect, useCallback } from "react";
|
||||||
import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore";
|
|
||||||
import { useJsonRpc } from "@/hooks/useJsonRpc";
|
|
||||||
import {
|
import {
|
||||||
UserGroupIcon,
|
UserGroupIcon,
|
||||||
ArrowPathIcon,
|
ArrowPathIcon,
|
||||||
PencilIcon,
|
PencilIcon,
|
||||||
} from "@heroicons/react/20/solid";
|
} from "@heroicons/react/20/solid";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore";
|
||||||
|
import { useJsonRpc } from "@/hooks/useJsonRpc";
|
||||||
import SessionControlPanel from "@/components/SessionControlPanel";
|
import SessionControlPanel from "@/components/SessionControlPanel";
|
||||||
import NicknameModal from "@/components/NicknameModal";
|
import NicknameModal from "@/components/NicknameModal";
|
||||||
import SessionsList, { SessionModeBadge } from "@/components/SessionsList";
|
import SessionsList, { SessionModeBadge } from "@/components/SessionsList";
|
||||||
|
|
@ -29,11 +30,11 @@ export default function SessionPopover() {
|
||||||
const { send } = useJsonRpc();
|
const { send } = useJsonRpc();
|
||||||
|
|
||||||
// Adapter function to match existing callback pattern
|
// Adapter function to match existing callback pattern
|
||||||
const sendRpc = (method: string, params: any, callback?: (response: any) => void) => {
|
const sendRpc = useCallback((method: string, params: Record<string, unknown>, callback?: (response: { result?: unknown; error?: { message: string } }) => void) => {
|
||||||
send(method, params, (response) => {
|
send(method, params, (response) => {
|
||||||
if (callback) callback(response);
|
if (callback) callback(response);
|
||||||
});
|
});
|
||||||
};
|
}, [send]);
|
||||||
|
|
||||||
const handleRefresh = async () => {
|
const handleRefresh = async () => {
|
||||||
if (isRefreshing) return;
|
if (isRefreshing) return;
|
||||||
|
|
@ -56,7 +57,7 @@ export default function SessionPopover() {
|
||||||
.then(sessions => setSessions(sessions))
|
.then(sessions => setSessions(sessions))
|
||||||
.catch(error => console.error("Failed to fetch sessions:", error));
|
.catch(error => console.error("Failed to fetch sessions:", error));
|
||||||
}
|
}
|
||||||
}, []);
|
}, [sendRpc, sessions.length, setSessions]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full rounded-lg bg-white dark:bg-slate-800 shadow-lg border border-slate-200 dark:border-slate-700">
|
<div className="w-full rounded-lg bg-white dark:bg-slate-800 shadow-lg border border-slate-200 dark:border-slate-700">
|
||||||
|
|
@ -141,7 +142,7 @@ export default function SessionPopover() {
|
||||||
setShowNicknameModal(true);
|
setShowNicknameModal(true);
|
||||||
}}
|
}}
|
||||||
onApprove={(sessionId) => {
|
onApprove={(sessionId) => {
|
||||||
sendRpc("approveNewSession", { sessionId }, (response: any) => {
|
sendRpc("approveNewSession", { sessionId }, (response) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
console.error("Failed to approve session:", response.error);
|
console.error("Failed to approve session:", response.error);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -150,7 +151,7 @@ export default function SessionPopover() {
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
onDeny={(sessionId) => {
|
onDeny={(sessionId) => {
|
||||||
sendRpc("denyNewSession", { sessionId }, (response: any) => {
|
sendRpc("denyNewSession", { sessionId }, (response) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
console.error("Failed to deny session:", response.error);
|
console.error("Failed to deny session:", response.error);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,11 @@
|
||||||
import { useState, useEffect, useRef, useCallback } from "react";
|
import { useState, useEffect, useRef, useCallback } from "react";
|
||||||
import { useJsonRpc } from "@/hooks/useJsonRpc";
|
|
||||||
|
import { useJsonRpc, JsonRpcRequest } from "@/hooks/useJsonRpc";
|
||||||
import { useSessionStore } from "@/stores/sessionStore";
|
import { useSessionStore } from "@/stores/sessionStore";
|
||||||
import { useRTCStore } from "@/hooks/stores";
|
import { useRTCStore } from "@/hooks/stores";
|
||||||
|
|
||||||
|
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
|
||||||
|
|
||||||
// Permission types matching backend
|
// Permission types matching backend
|
||||||
export enum Permission {
|
export enum Permission {
|
||||||
// Video/Display permissions
|
// Video/Display permissions
|
||||||
|
|
@ -65,11 +68,11 @@ export function usePermissions() {
|
||||||
const previousCanControl = useRef<boolean>(false);
|
const previousCanControl = useRef<boolean>(false);
|
||||||
|
|
||||||
// Function to poll permissions
|
// Function to poll permissions
|
||||||
const pollPermissions = useCallback((send: any) => {
|
const pollPermissions = useCallback((send: RpcSendFunction) => {
|
||||||
if (!send) return;
|
if (!send) return;
|
||||||
|
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
send("getPermissions", {}, (response: any) => {
|
send("getPermissions", {}, (response: { result?: unknown; error?: { message: string } }) => {
|
||||||
if (!response.error && response.result) {
|
if (!response.error && response.result) {
|
||||||
const result = response.result as PermissionsResponse;
|
const result = response.result as PermissionsResponse;
|
||||||
setPermissions(result.permissions);
|
setPermissions(result.permissions);
|
||||||
|
|
@ -79,13 +82,14 @@ export function usePermissions() {
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// Handle connectionModeChanged events that require WebRTC reconnection
|
// Handle connectionModeChanged events that require WebRTC reconnection
|
||||||
const handleRpcRequest = useCallback((request: any) => {
|
const handleRpcRequest = useCallback((request: JsonRpcRequest) => {
|
||||||
if (request.method === "connectionModeChanged") {
|
if (request.method === "connectionModeChanged") {
|
||||||
console.info("Connection mode changed, WebRTC reconnection required", request.params);
|
console.info("Connection mode changed, WebRTC reconnection required", request.params);
|
||||||
|
|
||||||
// For session promotion that requires reconnection, refresh the page
|
// For session promotion that requires reconnection, refresh the page
|
||||||
// This ensures WebRTC connection is re-established with proper mode
|
// This ensures WebRTC connection is re-established with proper mode
|
||||||
if (request.params?.action === "reconnect_required" && request.params?.reason === "session_promotion") {
|
const params = request.params as { action?: string; reason?: string };
|
||||||
|
if (params.action === "reconnect_required" && params.reason === "session_promotion") {
|
||||||
console.info("Session promoted, refreshing page to re-establish WebRTC connection");
|
console.info("Session promoted, refreshing page to re-establish WebRTC connection");
|
||||||
// Small delay to ensure all state updates are processed
|
// Small delay to ensure all state updates are processed
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
|
@ -132,7 +136,8 @@ export function usePermissions() {
|
||||||
}
|
}
|
||||||
|
|
||||||
previousCanControl.current = currentCanControl;
|
previousCanControl.current = currentCanControl;
|
||||||
}, [permissions, rpcHidChannel, setRpcHidProtocolVersion]);
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [permissions, rpcHidChannel, setRpcHidProtocolVersion]); // hasPermission depends on permissions which is already in deps
|
||||||
|
|
||||||
const hasPermission = (permission: Permission): boolean => {
|
const hasPermission = (permission: Permission): boolean => {
|
||||||
return permissions[permission] === true;
|
return permissions[permission] === true;
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef } from "react";
|
||||||
import { useSessionStore } from "@/stores/sessionStore";
|
|
||||||
|
import { useSessionStore, SessionInfo } from "@/stores/sessionStore";
|
||||||
import { useRTCStore } from "@/hooks/stores";
|
import { useRTCStore } from "@/hooks/stores";
|
||||||
import { sessionApi } from "@/api/sessionApi";
|
import { sessionApi } from "@/api/sessionApi";
|
||||||
import { notify } from "@/notifications";
|
import { notify } from "@/notifications";
|
||||||
|
|
||||||
|
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
|
||||||
|
|
||||||
interface SessionEventData {
|
interface SessionEventData {
|
||||||
sessions: any[];
|
sessions: SessionInfo[];
|
||||||
yourMode: string;
|
yourMode: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13,7 +16,7 @@ interface ModeChangedData {
|
||||||
mode: string;
|
mode: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useSessionEvents(sendFn: Function | null) {
|
export function useSessionEvents(sendFn: RpcSendFunction | null) {
|
||||||
const {
|
const {
|
||||||
currentMode,
|
currentMode,
|
||||||
setSessions,
|
setSessions,
|
||||||
|
|
@ -25,7 +28,7 @@ export function useSessionEvents(sendFn: Function | null) {
|
||||||
sendFnRef.current = sendFn;
|
sendFnRef.current = sendFn;
|
||||||
|
|
||||||
// Handle session-related RPC events
|
// Handle session-related RPC events
|
||||||
const handleSessionEvent = (method: string, params: any) => {
|
const handleSessionEvent = (method: string, params: unknown) => {
|
||||||
switch (method) {
|
switch (method) {
|
||||||
case "sessionsUpdated":
|
case "sessionsUpdated":
|
||||||
handleSessionsUpdated(params as SessionEventData);
|
handleSessionsUpdated(params as SessionEventData);
|
||||||
|
|
@ -52,7 +55,7 @@ export function useSessionEvents(sendFn: Function | null) {
|
||||||
// CRITICAL: Only update mode, never show notifications from sessionsUpdated
|
// CRITICAL: Only update mode, never show notifications from sessionsUpdated
|
||||||
// Notifications are exclusively handled by handleModeChanged to prevent duplicates
|
// Notifications are exclusively handled by handleModeChanged to prevent duplicates
|
||||||
if (data.yourMode && data.yourMode !== currentMode) {
|
if (data.yourMode && data.yourMode !== currentMode) {
|
||||||
updateSessionMode(data.yourMode as any);
|
updateSessionMode(data.yourMode as "primary" | "observer" | "queued" | "pending");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -64,7 +67,7 @@ export function useSessionEvents(sendFn: Function | null) {
|
||||||
// Get the most current mode from the store to avoid race conditions
|
// Get the most current mode from the store to avoid race conditions
|
||||||
const { currentMode: currentModeFromStore } = useSessionStore.getState();
|
const { currentMode: currentModeFromStore } = useSessionStore.getState();
|
||||||
const previousMode = currentModeFromStore;
|
const previousMode = currentModeFromStore;
|
||||||
updateSessionMode(data.mode as any);
|
updateSessionMode(data.mode as "primary" | "observer" | "queued" | "pending");
|
||||||
|
|
||||||
// Clear requesting state when mode changes from queued
|
// Clear requesting state when mode changes from queued
|
||||||
if (previousMode === "queued" && data.mode !== "queued") {
|
if (previousMode === "queued" && data.mode !== "queued") {
|
||||||
|
|
@ -139,7 +142,7 @@ export function useSessionEvents(sendFn: Function | null) {
|
||||||
try {
|
try {
|
||||||
const sessions = await sessionApi.getSessions(sendFnRef.current);
|
const sessions = await sessionApi.getSessions(sendFnRef.current);
|
||||||
setSessions(sessions);
|
setSessions(sessions);
|
||||||
} catch (error) {
|
} catch {
|
||||||
// Silently fail on refresh errors
|
// Silently fail on refresh errors
|
||||||
}
|
}
|
||||||
}, 30000); // Refresh every 30 seconds
|
}, 30000); // Refresh every 30 seconds
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
import { useEffect, useCallback, useState } from "react";
|
import { useEffect, useCallback, useState } from "react";
|
||||||
|
|
||||||
import { useSessionStore } from "@/stores/sessionStore";
|
import { useSessionStore } from "@/stores/sessionStore";
|
||||||
import { useSessionEvents } from "@/hooks/useSessionEvents";
|
import { useSessionEvents } from "@/hooks/useSessionEvents";
|
||||||
import { useSettingsStore } from "@/hooks/stores";
|
import { useSettingsStore } from "@/hooks/stores";
|
||||||
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
||||||
|
|
||||||
|
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
|
||||||
|
|
||||||
interface SessionResponse {
|
interface SessionResponse {
|
||||||
sessionId?: string;
|
sessionId?: string;
|
||||||
mode?: string;
|
mode?: string;
|
||||||
|
|
@ -23,7 +26,7 @@ interface NewSessionRequest {
|
||||||
nickname?: string;
|
nickname?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useSessionManagement(sendFn: Function | null) {
|
export function useSessionManagement(sendFn: RpcSendFunction | null) {
|
||||||
const {
|
const {
|
||||||
setCurrentSession,
|
setCurrentSession,
|
||||||
clearSession
|
clearSession
|
||||||
|
|
@ -39,7 +42,7 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
// Handle session info from WebRTC answer
|
// Handle session info from WebRTC answer
|
||||||
const handleSessionResponse = useCallback((response: SessionResponse) => {
|
const handleSessionResponse = useCallback((response: SessionResponse) => {
|
||||||
if (response.sessionId && response.mode) {
|
if (response.sessionId && response.mode) {
|
||||||
setCurrentSession(response.sessionId, response.mode as any);
|
setCurrentSession(response.sessionId, response.mode as "primary" | "observer" | "queued" | "pending");
|
||||||
}
|
}
|
||||||
}, [setCurrentSession]);
|
}, [setCurrentSession]);
|
||||||
|
|
||||||
|
|
@ -48,7 +51,7 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
if (!sendFn) return;
|
if (!sendFn) return;
|
||||||
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
sendFn("approvePrimaryRequest", { requesterID: requestId }, (response: any) => {
|
sendFn("approvePrimaryRequest", { requesterID: requestId }, (response: { result?: unknown; error?: { message: string } }) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
console.error("Failed to approve primary request:", response.error);
|
console.error("Failed to approve primary request:", response.error);
|
||||||
reject(new Error(response.error.message || "Failed to approve"));
|
reject(new Error(response.error.message || "Failed to approve"));
|
||||||
|
|
@ -65,7 +68,7 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
if (!sendFn) return;
|
if (!sendFn) return;
|
||||||
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
sendFn("denyPrimaryRequest", { requesterID: requestId }, (response: any) => {
|
sendFn("denyPrimaryRequest", { requesterID: requestId }, (response: { result?: unknown; error?: { message: string } }) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
console.error("Failed to deny primary request:", response.error);
|
console.error("Failed to deny primary request:", response.error);
|
||||||
reject(new Error(response.error.message || "Failed to deny"));
|
reject(new Error(response.error.message || "Failed to deny"));
|
||||||
|
|
@ -82,7 +85,7 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
if (!sendFn) return;
|
if (!sendFn) return;
|
||||||
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
sendFn("approveNewSession", { sessionId }, (response: any) => {
|
sendFn("approveNewSession", { sessionId }, (response: { result?: unknown; error?: { message: string } }) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
console.error("Failed to approve new session:", response.error);
|
console.error("Failed to approve new session:", response.error);
|
||||||
reject(new Error(response.error.message || "Failed to approve"));
|
reject(new Error(response.error.message || "Failed to approve"));
|
||||||
|
|
@ -99,7 +102,7 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
if (!sendFn) return;
|
if (!sendFn) return;
|
||||||
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
sendFn("denyNewSession", { sessionId }, (response: any) => {
|
sendFn("denyNewSession", { sessionId }, (response: { result?: unknown; error?: { message: string } }) => {
|
||||||
if (response.error) {
|
if (response.error) {
|
||||||
console.error("Failed to deny new session:", response.error);
|
console.error("Failed to deny new session:", response.error);
|
||||||
reject(new Error(response.error.message || "Failed to deny"));
|
reject(new Error(response.error.message || "Failed to deny"));
|
||||||
|
|
@ -112,7 +115,7 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
}, [sendFn]);
|
}, [sendFn]);
|
||||||
|
|
||||||
// Handle RPC events
|
// Handle RPC events
|
||||||
const handleRpcEvent = useCallback((method: string, params: any) => {
|
const handleRpcEvent = useCallback((method: string, params: unknown) => {
|
||||||
// Pass session events to the session event handler
|
// Pass session events to the session event handler
|
||||||
if (method === "sessionsUpdated" ||
|
if (method === "sessionsUpdated" ||
|
||||||
method === "modeChanged" ||
|
method === "modeChanged" ||
|
||||||
|
|
@ -122,12 +125,12 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
|
|
||||||
// Handle new session approval request (only if approval is required and user has permission)
|
// Handle new session approval request (only if approval is required and user has permission)
|
||||||
if (method === "newSessionPending" && requireSessionApproval && hasPermission(Permission.SESSION_APPROVE)) {
|
if (method === "newSessionPending" && requireSessionApproval && hasPermission(Permission.SESSION_APPROVE)) {
|
||||||
setNewSessionRequest(params);
|
setNewSessionRequest(params as NewSessionRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle primary control request
|
// Handle primary control request
|
||||||
if (method === "primaryControlRequested") {
|
if (method === "primaryControlRequested") {
|
||||||
setPrimaryControlRequest(params);
|
setPrimaryControlRequest(params as PrimaryControlRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle approval/denial responses
|
// Handle approval/denial responses
|
||||||
|
|
@ -147,13 +150,14 @@ export function useSessionManagement(sendFn: Function | null) {
|
||||||
// Handle session access denial (when your new session is denied)
|
// Handle session access denial (when your new session is denied)
|
||||||
if (method === "sessionAccessDenied") {
|
if (method === "sessionAccessDenied") {
|
||||||
const { clearSession, setSessionError } = useSessionStore.getState();
|
const { clearSession, setSessionError } = useSessionStore.getState();
|
||||||
setSessionError(params.message || "Session access was denied by the primary session");
|
const errorParams = params as { message?: string };
|
||||||
|
setSessionError(errorParams.message || "Session access was denied by the primary session");
|
||||||
// Clear session data as we're being disconnected
|
// Clear session data as we're being disconnected
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
clearSession();
|
clearSession();
|
||||||
}, 3000); // Give user time to see the error
|
}, 3000); // Give user time to see the error
|
||||||
}
|
}
|
||||||
}, [handleSessionEvent]);
|
}, [handleSessionEvent, hasPermission, requireSessionApproval]);
|
||||||
|
|
||||||
// Cleanup on unmount
|
// Cleanup on unmount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,8 @@
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
import {
|
||||||
|
UserGroupIcon,
|
||||||
|
} from "@heroicons/react/16/solid";
|
||||||
|
|
||||||
import { useJsonRpc, JsonRpcResponse } from "@/hooks/useJsonRpc";
|
import { useJsonRpc, JsonRpcResponse } from "@/hooks/useJsonRpc";
|
||||||
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
import { usePermissions, Permission } from "@/hooks/usePermissions";
|
||||||
import { useSettingsStore } from "@/hooks/stores";
|
import { useSettingsStore } from "@/hooks/stores";
|
||||||
|
|
@ -7,9 +11,6 @@ import Card from "@/components/Card";
|
||||||
import Checkbox from "@/components/Checkbox";
|
import Checkbox from "@/components/Checkbox";
|
||||||
import { SettingsPageHeader } from "@/components/SettingsPageheader";
|
import { SettingsPageHeader } from "@/components/SettingsPageheader";
|
||||||
import { SettingsItem } from "@/components/SettingsItem";
|
import { SettingsItem } from "@/components/SettingsItem";
|
||||||
import {
|
|
||||||
UserGroupIcon,
|
|
||||||
} from "@heroicons/react/16/solid";
|
|
||||||
|
|
||||||
export default function SessionsSettings() {
|
export default function SessionsSettings() {
|
||||||
const { send } = useJsonRpc();
|
const { send } = useJsonRpc();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import React, { useEffect, useRef, useState } from "react";
|
import React, { useEffect, useRef, useState } from "react";
|
||||||
import { NavLink, Outlet, useLocation } from "react-router";
|
import { NavLink, Outlet, useLocation , useNavigate } from "react-router";
|
||||||
import {
|
import {
|
||||||
LuSettings,
|
LuSettings,
|
||||||
LuMouse,
|
LuMouse,
|
||||||
|
|
@ -15,7 +15,6 @@ import {
|
||||||
LuUsers,
|
LuUsers,
|
||||||
} from "react-icons/lu";
|
} from "react-icons/lu";
|
||||||
import { useResizeObserver } from "usehooks-ts";
|
import { useResizeObserver } from "usehooks-ts";
|
||||||
import { useNavigate } from "react-router";
|
|
||||||
|
|
||||||
import { cx } from "@/cva.config";
|
import { cx } from "@/cva.config";
|
||||||
import Card from "@components/Card";
|
import Card from "@components/Card";
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,6 @@ export default function KvmIdRoute() {
|
||||||
);
|
);
|
||||||
cleanupAndStopReconnecting();
|
cleanupAndStopReconnecting();
|
||||||
clearInterval(checkInterval);
|
clearInterval(checkInterval);
|
||||||
} else {
|
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
},
|
},
|
||||||
|
|
@ -270,6 +269,7 @@ export default function KvmIdRoute() {
|
||||||
// We don't want to close everything down, we wait for the reconnect to stop instead
|
// We don't want to close everything down, we wait for the reconnect to stop instead
|
||||||
},
|
},
|
||||||
onOpen() {
|
onOpen() {
|
||||||
|
// Connection established, message handling will begin
|
||||||
},
|
},
|
||||||
|
|
||||||
onMessage: message => {
|
onMessage: message => {
|
||||||
|
|
@ -572,7 +572,7 @@ export default function KvmIdRoute() {
|
||||||
setRequireSessionNickname(response.result.requireNickname);
|
setRequireSessionNickname(response.result.requireNickname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch {
|
||||||
// Ignore parse errors
|
// Ignore parse errors
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -627,6 +627,9 @@ export default function KvmIdRoute() {
|
||||||
setRpcHidUnreliableNonOrderedChannel,
|
setRpcHidUnreliableNonOrderedChannel,
|
||||||
setRpcHidUnreliableChannel,
|
setRpcHidUnreliableChannel,
|
||||||
setTransceiver,
|
setTransceiver,
|
||||||
|
hasPermission,
|
||||||
|
setRequireSessionApproval,
|
||||||
|
setRequireSessionNickname,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
// Nickname generation using backend API for consistency
|
// Nickname generation using backend API for consistency
|
||||||
|
|
||||||
|
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
|
||||||
|
|
||||||
// Main function that uses backend generation
|
// Main function that uses backend generation
|
||||||
export async function generateNickname(sendFn?: Function): Promise<string> {
|
export async function generateNickname(sendFn?: RpcSendFunction): Promise<string> {
|
||||||
// Require backend function - no fallback
|
// Require backend function - no fallback
|
||||||
if (!sendFn) {
|
if (!sendFn) {
|
||||||
throw new Error('Backend connection required for nickname generation');
|
throw new Error('Backend connection required for nickname generation');
|
||||||
|
|
@ -9,9 +11,10 @@ export async function generateNickname(sendFn?: Function): Promise<string> {
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
const result = sendFn('generateNickname', { userAgent: navigator.userAgent }, (response: any) => {
|
const result = sendFn('generateNickname', { userAgent: navigator.userAgent }, (response: { result?: unknown; error?: { message: string } }) => {
|
||||||
if (response && !response.error && response.result?.nickname) {
|
const result = response.result as { nickname?: string } | undefined;
|
||||||
resolve(response.result.nickname);
|
if (response && !response.error && result?.nickname) {
|
||||||
|
resolve(result.nickname);
|
||||||
} else {
|
} else {
|
||||||
reject(new Error('Failed to generate nickname from backend'));
|
reject(new Error('Failed to generate nickname from backend'));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
26
web.go
26
web.go
|
|
@ -34,22 +34,22 @@ import (
|
||||||
var staticFiles embed.FS
|
var staticFiles embed.FS
|
||||||
|
|
||||||
type WebRTCSessionRequest struct {
|
type WebRTCSessionRequest struct {
|
||||||
Sd string `json:"sd"`
|
Sd string `json:"sd"`
|
||||||
SessionId string `json:"sessionId,omitempty"`
|
SessionId string `json:"sessionId,omitempty"`
|
||||||
OidcGoogle string `json:"OidcGoogle,omitempty"`
|
OidcGoogle string `json:"OidcGoogle,omitempty"`
|
||||||
IP string `json:"ip,omitempty"`
|
IP string `json:"ip,omitempty"`
|
||||||
ICEServers []string `json:"iceServers,omitempty"`
|
ICEServers []string `json:"iceServers,omitempty"`
|
||||||
UserAgent string `json:"userAgent,omitempty"` // Browser user agent for nickname generation
|
UserAgent string `json:"userAgent,omitempty"` // Browser user agent for nickname generation
|
||||||
SessionSettings *SessionSettings `json:"sessionSettings,omitempty"`
|
SessionSettings *SessionSettings `json:"sessionSettings,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SessionSettings struct {
|
type SessionSettings struct {
|
||||||
RequireApproval bool `json:"requireApproval"`
|
RequireApproval bool `json:"requireApproval"`
|
||||||
RequireNickname bool `json:"requireNickname"`
|
RequireNickname bool `json:"requireNickname"`
|
||||||
ReconnectGrace int `json:"reconnectGrace,omitempty"` // Grace period in seconds for primary reconnection
|
ReconnectGrace int `json:"reconnectGrace,omitempty"` // Grace period in seconds for primary reconnection
|
||||||
PrimaryTimeout int `json:"primaryTimeout,omitempty"` // Inactivity timeout in seconds for primary session
|
PrimaryTimeout int `json:"primaryTimeout,omitempty"` // Inactivity timeout in seconds for primary session
|
||||||
Nickname string `json:"nickname,omitempty"`
|
Nickname string `json:"nickname,omitempty"`
|
||||||
PrivateKeystrokes bool `json:"privateKeystrokes,omitempty"` // If true, only primary session sees keystroke events
|
PrivateKeystrokes bool `json:"privateKeystrokes,omitempty"` // If true, only primary session sees keystroke events
|
||||||
}
|
}
|
||||||
|
|
||||||
type SetPasswordRequest struct {
|
type SetPasswordRequest struct {
|
||||||
|
|
@ -483,7 +483,7 @@ func handleLogout(c *gin.Context) {
|
||||||
// Only clear the cookies for this session, don't invalidate the token
|
// Only clear the cookies for this session, don't invalidate the token
|
||||||
// The token should remain valid for other sessions
|
// The token should remain valid for other sessions
|
||||||
c.SetCookie("authToken", "", -1, "/", "", false, true)
|
c.SetCookie("authToken", "", -1, "/", "", false, true)
|
||||||
c.SetCookie("sessionId", "", -1, "/", "", false, true) // Clear session ID cookie too
|
c.SetCookie("sessionId", "", -1, "/", "", false, true) // Clear session ID cookie too
|
||||||
c.JSON(http.StatusOK, gin.H{"message": "Logout successful"})
|
c.JSON(http.StatusOK, gin.H{"message": "Logout successful"})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
34
webrtc.go
34
webrtc.go
|
|
@ -21,24 +21,24 @@ import (
|
||||||
|
|
||||||
// Predefined browser string constants for memory efficiency
|
// Predefined browser string constants for memory efficiency
|
||||||
var (
|
var (
|
||||||
BrowserChrome = "chrome"
|
BrowserChrome = "chrome"
|
||||||
BrowserFirefox = "firefox"
|
BrowserFirefox = "firefox"
|
||||||
BrowserSafari = "safari"
|
BrowserSafari = "safari"
|
||||||
BrowserEdge = "edge"
|
BrowserEdge = "edge"
|
||||||
BrowserOpera = "opera"
|
BrowserOpera = "opera"
|
||||||
BrowserUnknown = "user"
|
BrowserUnknown = "user"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Session struct {
|
type Session struct {
|
||||||
ID string
|
ID string
|
||||||
Mode SessionMode
|
Mode SessionMode
|
||||||
Source string
|
Source string
|
||||||
Identity string
|
Identity string
|
||||||
Nickname string
|
Nickname string
|
||||||
Browser *string // Pointer to predefined browser string constant for memory efficiency
|
Browser *string // Pointer to predefined browser string constant for memory efficiency
|
||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
LastActive time.Time
|
LastActive time.Time
|
||||||
LastBroadcast time.Time // Per-session broadcast throttle
|
LastBroadcast time.Time // Per-session broadcast throttle
|
||||||
|
|
||||||
// RPC rate limiting (DoS protection)
|
// RPC rate limiting (DoS protection)
|
||||||
rpcRateLimitMu sync.Mutex // Protects rate limit fields
|
rpcRateLimitMu sync.Mutex // Protects rate limit fields
|
||||||
|
|
@ -105,7 +105,7 @@ type SessionConfig struct {
|
||||||
ICEServers []string
|
ICEServers []string
|
||||||
LocalIP string
|
LocalIP string
|
||||||
IsCloud bool
|
IsCloud bool
|
||||||
UserAgent string // User agent for browser detection and nickname generation
|
UserAgent string // User agent for browser detection and nickname generation
|
||||||
ws *websocket.Conn
|
ws *websocket.Conn
|
||||||
Logger *zerolog.Logger
|
Logger *zerolog.Logger
|
||||||
}
|
}
|
||||||
|
|
@ -278,7 +278,7 @@ func newSession(config SessionConfig) (*Session, error) {
|
||||||
|
|
||||||
session := &Session{
|
session := &Session{
|
||||||
peerConnection: peerConnection,
|
peerConnection: peerConnection,
|
||||||
Browser: extractBrowserFromUserAgent(config.UserAgent),
|
Browser: extractBrowserFromUserAgent(config.UserAgent),
|
||||||
}
|
}
|
||||||
session.rpcQueue = make(chan webrtc.DataChannelMessage, 256)
|
session.rpcQueue = make(chan webrtc.DataChannelMessage, 256)
|
||||||
session.initQueues()
|
session.initQueues()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue