mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-06-23 03:25:19 -04:00
Compare commits
75 Commits
cd672c341f
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| bed6622530 | |||
| c5e08a6f2c | |||
| ad32af6eeb | |||
| 02ced4b87b | |||
| 5b28a63f75 | |||
| b5e2e68a22 | |||
| 556c0819c4 | |||
| b0edccb80e | |||
| 4e1c921ffb | |||
| fdbbcafb6c | |||
| a043d477fb | |||
| 4cbe766cbd | |||
| 8610b915ec | |||
| 59fd6db83e | |||
| 465cf7355b | |||
| de91b78943 | |||
| 4203148cab | |||
| 5adc0c464a | |||
| 097290f7da | |||
| 475ef5d1ca | |||
| 2f37019782 | |||
| 9f4123cc3c | |||
| 482a87a80d | |||
| b925010cb3 | |||
| 085ce01da6 | |||
| 7af530de8f | |||
| 9a4cff4e49 | |||
| 480ffa4ac2 | |||
| d5ac0c9aa0 | |||
| 29f19b07a9 | |||
| 39301c534c | |||
| 58b9e4bda7 | |||
| 820a9ce983 | |||
| 68410e882d | |||
| f26c0af39a | |||
| 0ca451483f | |||
| 2849dd0ba2 | |||
| df41ae4acb | |||
| 2692777707 | |||
| ca1a45ccf8 | |||
| 2f39f248fc | |||
| 90f8ce5035 | |||
| cb29125580 | |||
| 988b54515e | |||
| 2fd9de5062 | |||
| fd5aabcb17 | |||
| 85b63219b9 | |||
| ddf943846f | |||
| e7221ec623 | |||
| 78daaf0cb4 | |||
| a6ab3bab4c | |||
| 53cea7023f | |||
| a098088f03 | |||
| 59998e9fd2 | |||
| 1df7e478df | |||
| 1fc4890857 | |||
| f5d52f1506 | |||
| 2026ba5bd2 | |||
| db56c8d74d | |||
| 9d1a81c93c | |||
| 3701b3d7a3 | |||
| bae98daa5c | |||
| b34a04f723 | |||
| 1c0245f2db | |||
| 7777e87dc8 | |||
| 820fa07846 | |||
| 66794582c9 | |||
| 73eb471ae3 | |||
| 0f2f4b96c4 | |||
| d53809cf2b | |||
| 08fd6e26d8 | |||
| 29e8470f2e | |||
| 573785d4ce | |||
| 5483303714 | |||
| 5a5cc4f4e9 |
@@ -235,7 +235,7 @@ Conditionally show/hide the bar pill:
|
|||||||
```qml
|
```qml
|
||||||
PluginComponent {
|
PluginComponent {
|
||||||
visibilityCommand: "pgrep -x myapp"
|
visibilityCommand: "pgrep -x myapp"
|
||||||
visibilityInterval: 5000 // check every 5 seconds
|
visibilityInterval: 5 // seconds between checks; polling pauses while the bar is hidden
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -115,3 +115,11 @@ core.*
|
|||||||
.direnv/
|
.direnv/
|
||||||
quickshell/dms-plugins
|
quickshell/dms-plugins
|
||||||
__pycache__
|
__pycache__
|
||||||
|
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
# Void (xbps) build artifacts
|
||||||
|
*.xbps
|
||||||
|
distro/void/temp/
|
||||||
|
distro/void/hostdir/
|
||||||
|
distro/void/masterdir*/
|
||||||
|
|||||||
@@ -20,6 +20,14 @@ repos:
|
|||||||
language: system
|
language: system
|
||||||
files: ^core/.*\.(go|mod|sum)$
|
files: ^core/.*\.(go|mod|sum)$
|
||||||
pass_filenames: false
|
pass_filenames: false
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: settings-search-index
|
||||||
|
name: settings search index is up to date
|
||||||
|
entry: bash -c 'python3 quickshell/translations/extract_settings_index.py >/dev/null || exit 1; if ! git diff --exit-code -- quickshell/translations/settings_search_index.json; then echo "settings_search_index.json is out of date; run quickshell/translations/extract_settings_index.py and stage the result" >&2; exit 1; fi'
|
||||||
|
language: system
|
||||||
|
files: ^quickshell/(Modules/Settings/.*\.qml|Modals/Settings/SettingsSidebar\.qml|translations/extract_settings_index\.py)$
|
||||||
|
pass_filenames: false
|
||||||
- repo: local
|
- repo: local
|
||||||
hooks:
|
hooks:
|
||||||
- id: no-console-in-qml
|
- id: no-console-in-qml
|
||||||
|
|||||||
+65
-62
@@ -1,82 +1,85 @@
|
|||||||
with-expecter: true
|
dir: internal/mocks/{{.InterfaceDirRelative}}
|
||||||
dir: "internal/mocks/{{.InterfaceDirRelative}}"
|
structname: Mock{{.InterfaceName}}
|
||||||
mockname: "Mock{{.InterfaceName}}"
|
pkgname: '{{.SrcPackageName}}'
|
||||||
outpkg: "{{.PackageName}}"
|
filename: 'mock_{{.InterfaceName}}.go'
|
||||||
|
template: testify
|
||||||
|
template-data:
|
||||||
|
unroll-variadic: true
|
||||||
packages:
|
packages:
|
||||||
github.com/Wifx/gonetworkmanager/v2:
|
|
||||||
interfaces:
|
|
||||||
NetworkManager:
|
|
||||||
Device:
|
|
||||||
DeviceWireless:
|
|
||||||
AccessPoint:
|
|
||||||
Connection:
|
|
||||||
Settings:
|
|
||||||
ActiveConnection:
|
|
||||||
IP4Config:
|
|
||||||
net:
|
|
||||||
interfaces:
|
|
||||||
Conn:
|
|
||||||
github.com/AvengeMedia/danklinux/internal/plugins:
|
|
||||||
interfaces:
|
|
||||||
GitClient:
|
|
||||||
github.com/godbus/dbus/v5:
|
|
||||||
interfaces:
|
|
||||||
BusObject:
|
|
||||||
github.com/AvengeMedia/danklinux/internal/server/brightness:
|
|
||||||
config:
|
|
||||||
dir: "internal/mocks/brightness"
|
|
||||||
outpkg: mocks_brightness
|
|
||||||
interfaces:
|
|
||||||
DBusConn:
|
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation:
|
github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation:
|
||||||
config:
|
config:
|
||||||
dir: "internal/mocks/geolocation"
|
dir: internal/mocks/geolocation
|
||||||
outpkg: mocks_geolocation
|
pkgname: mocks_geolocation
|
||||||
interfaces:
|
interfaces:
|
||||||
Client:
|
Client: {}
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/internal/server/network:
|
|
||||||
config:
|
|
||||||
dir: "internal/mocks/network"
|
|
||||||
outpkg: mocks_network
|
|
||||||
interfaces:
|
|
||||||
Backend:
|
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/internal/server/cups:
|
github.com/AvengeMedia/DankMaterialShell/core/internal/server/cups:
|
||||||
config:
|
config:
|
||||||
dir: "internal/mocks/cups"
|
dir: internal/mocks/cups
|
||||||
outpkg: mocks_cups
|
pkgname: mocks_cups
|
||||||
interfaces:
|
interfaces:
|
||||||
CUPSClientInterface:
|
CUPSClientInterface: {}
|
||||||
PkHelper:
|
PkHelper:
|
||||||
config:
|
config:
|
||||||
dir: "internal/mocks/cups_pkhelper"
|
dir: internal/mocks/cups_pkhelper
|
||||||
outpkg: mocks_cups_pkhelper
|
pkgname: mocks_cups_pkhelper
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/internal/server/evdev:
|
github.com/AvengeMedia/DankMaterialShell/core/internal/server/evdev:
|
||||||
config:
|
config:
|
||||||
dir: "internal/mocks/evdev"
|
dir: internal/mocks/evdev
|
||||||
outpkg: mocks_evdev
|
pkgname: mocks_evdev
|
||||||
interfaces:
|
interfaces:
|
||||||
EvdevDevice:
|
EvdevDevice: {}
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/internal/version:
|
github.com/AvengeMedia/DankMaterialShell/core/internal/server/network:
|
||||||
config:
|
config:
|
||||||
dir: "internal/mocks/version"
|
dir: internal/mocks/network
|
||||||
outpkg: mocks_version
|
pkgname: mocks_network
|
||||||
interfaces:
|
interfaces:
|
||||||
VersionFetcher:
|
Backend: {}
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/internal/server/wlcontext:
|
github.com/AvengeMedia/DankMaterialShell/core/internal/server/wlcontext:
|
||||||
config:
|
config:
|
||||||
dir: "internal/mocks/wlcontext"
|
dir: internal/mocks/wlcontext
|
||||||
outpkg: mocks_wlcontext
|
pkgname: mocks_wlcontext
|
||||||
interfaces:
|
interfaces:
|
||||||
WaylandContext:
|
WaylandContext: {}
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client:
|
|
||||||
config:
|
|
||||||
dir: "internal/mocks/wlclient"
|
|
||||||
outpkg: mocks_wlclient
|
|
||||||
interfaces:
|
|
||||||
WaylandDisplay:
|
|
||||||
github.com/AvengeMedia/DankMaterialShell/core/internal/utils:
|
github.com/AvengeMedia/DankMaterialShell/core/internal/utils:
|
||||||
config:
|
config:
|
||||||
dir: "internal/mocks/utils"
|
dir: internal/mocks/utils
|
||||||
outpkg: mocks_utils
|
pkgname: mocks_utils
|
||||||
interfaces:
|
interfaces:
|
||||||
AppChecker:
|
AppChecker: {}
|
||||||
|
github.com/AvengeMedia/DankMaterialShell/core/internal/version:
|
||||||
|
config:
|
||||||
|
dir: internal/mocks/version
|
||||||
|
pkgname: mocks_version
|
||||||
|
interfaces:
|
||||||
|
VersionFetcher: {}
|
||||||
|
github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client:
|
||||||
|
config:
|
||||||
|
dir: internal/mocks/wlclient
|
||||||
|
pkgname: mocks_wlclient
|
||||||
|
interfaces:
|
||||||
|
WaylandDisplay: {}
|
||||||
|
github.com/AvengeMedia/DankMaterialShell/core/internal/plugins:
|
||||||
|
interfaces:
|
||||||
|
GitClient: {}
|
||||||
|
github.com/AvengeMedia/DankMaterialShell/core/internal/server/brightness:
|
||||||
|
config:
|
||||||
|
dir: internal/mocks/brightness
|
||||||
|
pkgname: mocks_brightness
|
||||||
|
interfaces:
|
||||||
|
DBusConn: {}
|
||||||
|
github.com/Wifx/gonetworkmanager/v2:
|
||||||
|
interfaces:
|
||||||
|
AccessPoint: {}
|
||||||
|
ActiveConnection: {}
|
||||||
|
Connection: {}
|
||||||
|
Device: {}
|
||||||
|
DeviceWireless: {}
|
||||||
|
IP4Config: {}
|
||||||
|
NetworkManager: {}
|
||||||
|
Settings: {}
|
||||||
|
github.com/godbus/dbus/v5:
|
||||||
|
interfaces:
|
||||||
|
BusObject: {}
|
||||||
|
net:
|
||||||
|
interfaces:
|
||||||
|
Conn: {}
|
||||||
|
|||||||
@@ -19,7 +19,12 @@ var (
|
|||||||
var colorCmd = &cobra.Command{
|
var colorCmd = &cobra.Command{
|
||||||
Use: "color",
|
Use: "color",
|
||||||
Short: "Color utilities",
|
Short: "Color utilities",
|
||||||
Long: "Color utilities including picking colors from the screen",
|
Long: `Color utilities including picking colors from the screen.
|
||||||
|
|
||||||
|
This is the screen eyedropper CLI. To open the in-shell color modal, use:
|
||||||
|
dms ipc call color-picker toggle
|
||||||
|
|
||||||
|
See: https://danklinux.com/docs/dankmaterialshell/keybinds-ipc`,
|
||||||
}
|
}
|
||||||
|
|
||||||
var colorPickCmd = &cobra.Command{
|
var colorPickCmd = &cobra.Command{
|
||||||
@@ -29,6 +34,9 @@ var colorPickCmd = &cobra.Command{
|
|||||||
|
|
||||||
Click on any pixel to capture its color, or press Escape to cancel.
|
Click on any pixel to capture its color, or press Escape to cancel.
|
||||||
|
|
||||||
|
This is the screen eyedropper CLI. To open the in-shell color modal, use:
|
||||||
|
dms ipc call color-picker toggle
|
||||||
|
|
||||||
Output format flags (mutually exclusive, default: --hex):
|
Output format flags (mutually exclusive, default: --hex):
|
||||||
--hex - Hexadecimal (#RRGGBB)
|
--hex - Hexadecimal (#RRGGBB)
|
||||||
--rgb - RGB values (R G B)
|
--rgb - RGB values (R G B)
|
||||||
|
|||||||
@@ -77,10 +77,15 @@ var killCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
var ipcCmd = &cobra.Command{
|
var ipcCmd = &cobra.Command{
|
||||||
Use: "ipc [target] [function] [args...]",
|
Use: "ipc",
|
||||||
Short: "Send IPC commands to running DMS shell",
|
Short: "Send IPC commands to running DMS shell",
|
||||||
|
Long: `Send IPC commands to the running DMS shell.
|
||||||
|
|
||||||
|
dms ipc call <target> <function> [args...] invoke a command
|
||||||
|
dms ipc list list all targets and functions
|
||||||
|
|
||||||
|
Full reference: https://danklinux.com/docs/dankmaterialshell/keybinds-ipc`,
|
||||||
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||||
_ = findConfig(cmd, args)
|
|
||||||
return getShellIPCCompletions(args, toComplete), cobra.ShellCompDirectiveNoFileComp
|
return getShellIPCCompletions(args, toComplete), cobra.ShellCompDirectiveNoFileComp
|
||||||
},
|
},
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
@@ -88,9 +93,17 @@ var ipcCmd = &cobra.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ipcListCmd = &cobra.Command{
|
||||||
|
Use: "list",
|
||||||
|
Short: "List all IPC targets and functions",
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
printIPCHelp()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
ipcCmd.AddCommand(ipcListCmd)
|
||||||
ipcCmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
|
ipcCmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
|
||||||
_ = findConfig(cmd, args)
|
|
||||||
printIPCHelp()
|
printIPCHelp()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,6 +95,35 @@ var greeterSyncCmd = &cobra.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var greeterLaunchSessionCmd = &cobra.Command{
|
||||||
|
Use: "launch-session",
|
||||||
|
Short: "Launch a remembered greeter session",
|
||||||
|
Hidden: true,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
sessionID, _ := cmd.Flags().GetString("session-id")
|
||||||
|
fromMemory, _ := cmd.Flags().GetBool("from-memory")
|
||||||
|
cacheDir, _ := cmd.Flags().GetString("cache-dir")
|
||||||
|
|
||||||
|
if fromMemory {
|
||||||
|
homeDir, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("failed to get user home directory: %v", err)
|
||||||
|
}
|
||||||
|
if err := greeter.LaunchSessionFromMemory(cacheDir, homeDir); err != nil {
|
||||||
|
log.Fatalf("failed to launch remembered greeter session: %v", err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if sessionID == "" {
|
||||||
|
log.Fatal("missing --session-id or --from-memory")
|
||||||
|
}
|
||||||
|
if err := greeter.LaunchSessionByID(sessionID); err != nil {
|
||||||
|
log.Fatalf("failed to launch greeter session %q: %v", sessionID, err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
greeterSyncCmd.Flags().BoolP("yes", "y", false, "Non-interactive mode: skip prompts, use defaults (for UI)")
|
greeterSyncCmd.Flags().BoolP("yes", "y", false, "Non-interactive mode: skip prompts, use defaults (for UI)")
|
||||||
greeterSyncCmd.Flags().BoolP("terminal", "t", false, "Run sync in a new terminal (for entering sudo password); terminal auto-closes when done")
|
greeterSyncCmd.Flags().BoolP("terminal", "t", false, "Run sync in a new terminal (for entering sudo password); terminal auto-closes when done")
|
||||||
@@ -102,6 +131,9 @@ func init() {
|
|||||||
greeterSyncCmd.Flags().BoolP("local", "l", false, "Developer mode: force greetd config to use a local DMS checkout path")
|
greeterSyncCmd.Flags().BoolP("local", "l", false, "Developer mode: force greetd config to use a local DMS checkout path")
|
||||||
greeterSyncCmd.Flags().BoolP("profile", "p", false, "Sync only your per-user greeter slot (no sudo; for secondary accounts)")
|
greeterSyncCmd.Flags().BoolP("profile", "p", false, "Sync only your per-user greeter slot (no sudo; for secondary accounts)")
|
||||||
greeterSyncCmd.Flags().Bool("autologin", false, "Apply only greeter auto-login on startup settings to greetd (no theme or auth sync)")
|
greeterSyncCmd.Flags().Bool("autologin", false, "Apply only greeter auto-login on startup settings to greetd (no theme or auth sync)")
|
||||||
|
greeterLaunchSessionCmd.Flags().String("session-id", "", "Desktop session id to launch")
|
||||||
|
greeterLaunchSessionCmd.Flags().Bool("from-memory", false, "Resolve the session id from greeter memory")
|
||||||
|
greeterLaunchSessionCmd.Flags().String("cache-dir", greeter.GreeterCacheDir, "Greeter cache directory")
|
||||||
}
|
}
|
||||||
|
|
||||||
var greeterEnableCmd = &cobra.Command{
|
var greeterEnableCmd = &cobra.Command{
|
||||||
@@ -299,7 +331,7 @@ func installGreeter(nonInteractive bool) error {
|
|||||||
|
|
||||||
fmt.Println("\n=== Installation Complete ===")
|
fmt.Println("\n=== Installation Complete ===")
|
||||||
fmt.Println("\nTo start the greeter now, run:")
|
fmt.Println("\nTo start the greeter now, run:")
|
||||||
fmt.Println(" sudo systemctl start greetd")
|
fmt.Println(startGreeterHint())
|
||||||
fmt.Println("\nOr reboot to see the greeter at next boot.")
|
fmt.Println("\nOr reboot to see the greeter at next boot.")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -326,7 +358,13 @@ func uninstallGreeter(nonInteractive bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("\nDisabling greetd...")
|
fmt.Println("\nDisabling greetd...")
|
||||||
if err := privesc.Run(context.Background(), "", "systemctl", "disable", "greetd"); err != nil {
|
if isRunit() {
|
||||||
|
if err := disableRunitService("greetd"); err != nil {
|
||||||
|
fmt.Printf(" ⚠ Could not disable greetd: %v\n", err)
|
||||||
|
} else {
|
||||||
|
fmt.Println(" ✓ greetd disabled")
|
||||||
|
}
|
||||||
|
} else if err := privesc.Run(context.Background(), "", "systemctl", "disable", "greetd"); err != nil {
|
||||||
fmt.Printf(" ⚠ Could not disable greetd: %v\n", err)
|
fmt.Printf(" ⚠ Could not disable greetd: %v\n", err)
|
||||||
} else {
|
} else {
|
||||||
fmt.Println(" ✓ greetd disabled")
|
fmt.Println(" ✓ greetd disabled")
|
||||||
@@ -449,6 +487,14 @@ func suggestDisplayManagerRestore(nonInteractive bool) {
|
|||||||
|
|
||||||
enableDM := func(dm string) {
|
enableDM := func(dm string) {
|
||||||
fmt.Printf(" Enabling %s...\n", dm)
|
fmt.Printf(" Enabling %s...\n", dm)
|
||||||
|
if isRunit() {
|
||||||
|
if err := enableRunitService(dm); err != nil {
|
||||||
|
fmt.Printf(" ⚠ Failed to enable %s: %v\n", dm, err)
|
||||||
|
} else {
|
||||||
|
fmt.Printf(" ✓ %s enabled (linked into %s).\n", dm, runitServiceDir)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
if err := privesc.Run(context.Background(), "", "systemctl", "enable", "--force", dm); err != nil {
|
if err := privesc.Run(context.Background(), "", "systemctl", "enable", "--force", dm); err != nil {
|
||||||
fmt.Printf(" ⚠ Failed to enable %s: %v\n", dm, err)
|
fmt.Printf(" ⚠ Failed to enable %s: %v\n", dm, err)
|
||||||
} else {
|
} else {
|
||||||
@@ -495,6 +541,9 @@ func suggestDisplayManagerRestore(nonInteractive bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isSystemdUnitInstalled(unit string) bool {
|
func isSystemdUnitInstalled(unit string) bool {
|
||||||
|
if isRunit() {
|
||||||
|
return runitServiceInstalled(unit)
|
||||||
|
}
|
||||||
cmd := exec.Command("systemctl", "list-unit-files", unit+".service", "--no-legend", "--no-pager")
|
cmd := exec.Command("systemctl", "list-unit-files", unit+".service", "--no-legend", "--no-pager")
|
||||||
out, err := cmd.Output()
|
out, err := cmd.Output()
|
||||||
return err == nil && strings.Contains(string(out), unit)
|
return err == nil && strings.Contains(string(out), unit)
|
||||||
@@ -943,6 +992,18 @@ func resolveLocalDMSPath() (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func disableDisplayManager(dmName string) (bool, error) {
|
func disableDisplayManager(dmName string) (bool, error) {
|
||||||
|
if isRunit() {
|
||||||
|
if !runitServiceEnabled(dmName) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
fmt.Printf("\nDisabling %s (runit)...\n", dmName)
|
||||||
|
if err := disableRunitService(dmName); err != nil {
|
||||||
|
return false, fmt.Errorf("failed to disable %s: %w", dmName, err)
|
||||||
|
}
|
||||||
|
fmt.Printf(" ✓ %s disabled (removed from %s)\n", dmName, runitServiceDir)
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
state, err := getSystemdServiceState(dmName)
|
state, err := getSystemdServiceState(dmName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to check %s state: %w", dmName, err)
|
return false, fmt.Errorf("failed to check %s state: %w", dmName, err)
|
||||||
@@ -996,6 +1057,21 @@ func disableDisplayManager(dmName string) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ensureGreetdEnabled() error {
|
func ensureGreetdEnabled() error {
|
||||||
|
if isRunit() {
|
||||||
|
fmt.Println("\nEnabling greetd service (runit)...")
|
||||||
|
if !runitServiceInstalled("greetd") {
|
||||||
|
return fmt.Errorf("greetd service not found in %s. Please install greetd first", runitSvDir)
|
||||||
|
}
|
||||||
|
// Seat + runtime-dir setup that logind handles automatically on systemd.
|
||||||
|
ensureRunitSeat("_greeter")
|
||||||
|
ensureGreetdPamRundir()
|
||||||
|
if err := enableRunitService("greetd"); err != nil {
|
||||||
|
return fmt.Errorf("failed to enable greetd: %w", err)
|
||||||
|
}
|
||||||
|
fmt.Printf(" ✓ greetd enabled (%s)\n", runitServiceDir)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Println("\nChecking greetd service status...")
|
fmt.Println("\nChecking greetd service status...")
|
||||||
|
|
||||||
state, err := getSystemdServiceState("greetd")
|
state, err := getSystemdServiceState("greetd")
|
||||||
@@ -1043,6 +1119,12 @@ func ensureGreetdEnabled() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ensureGraphicalTarget() error {
|
func ensureGraphicalTarget() error {
|
||||||
|
if isRunit() {
|
||||||
|
// runit has no targets; a supervised greetd service is the graphical
|
||||||
|
// login, so there is nothing to set here.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
getDefaultCmd := exec.Command("systemctl", "get-default")
|
getDefaultCmd := exec.Command("systemctl", "get-default")
|
||||||
currentTarget, err := getDefaultCmd.Output()
|
currentTarget, err := getDefaultCmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1176,7 +1258,7 @@ func enableGreeter(nonInteractive bool) error {
|
|||||||
fmt.Println("\n=== Enable Complete ===")
|
fmt.Println("\n=== Enable Complete ===")
|
||||||
fmt.Println("\nGreeter configuration verified and system state corrected.")
|
fmt.Println("\nGreeter configuration verified and system state corrected.")
|
||||||
fmt.Println("To start the greeter now, run:")
|
fmt.Println("To start the greeter now, run:")
|
||||||
fmt.Println(" sudo systemctl start greetd")
|
fmt.Println(startGreeterHint())
|
||||||
fmt.Println("\nOr reboot to see the greeter at boot time.")
|
fmt.Println("\nOr reboot to see the greeter at boot time.")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -1257,7 +1339,7 @@ func enableGreeter(nonInteractive bool) error {
|
|||||||
|
|
||||||
fmt.Println("\n=== Enable Complete ===")
|
fmt.Println("\n=== Enable Complete ===")
|
||||||
fmt.Println("\nTo start the greeter now, run:")
|
fmt.Println("\nTo start the greeter now, run:")
|
||||||
fmt.Println(" sudo systemctl start greetd")
|
fmt.Println(startGreeterHint())
|
||||||
fmt.Println("\nOr reboot to see the greeter at boot time.")
|
fmt.Println("\nOr reboot to see the greeter at boot time.")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/privesc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// runit (Void Linux) service helpers. Services live in /etc/sv and are "enabled"
|
||||||
|
// by symlinking them into the /var/service supervision dir, so the greeter
|
||||||
|
// commands branch on isRunit() instead of shelling systemctl.
|
||||||
|
|
||||||
|
const (
|
||||||
|
runitSvDir = "/etc/sv"
|
||||||
|
runitServiceDir = "/var/service"
|
||||||
|
)
|
||||||
|
|
||||||
|
// isRunit reports whether this system is supervised by runit (Void Linux).
|
||||||
|
func isRunit() bool {
|
||||||
|
if fi, err := os.Stat("/run/runit"); err == nil && fi.IsDir() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if _, err := os.Stat("/run/systemd/system"); err == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if fi, err := os.Stat(runitServiceDir); err == nil && fi.IsDir() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func runitServiceInstalled(name string) bool {
|
||||||
|
fi, err := os.Stat(runitSvDir + "/" + name)
|
||||||
|
return err == nil && fi.IsDir()
|
||||||
|
}
|
||||||
|
|
||||||
|
func runitServiceEnabled(name string) bool {
|
||||||
|
_, err := os.Lstat(runitServiceDir + "/" + name)
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// enableRunitService links a service into /var/service (idempotent).
|
||||||
|
func enableRunitService(name string) error {
|
||||||
|
if !runitServiceInstalled(name) {
|
||||||
|
return fmt.Errorf("runit service %q not found in %s", name, runitSvDir)
|
||||||
|
}
|
||||||
|
if runitServiceEnabled(name) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return privesc.Run(context.Background(), "", "ln", "-sf",
|
||||||
|
runitSvDir+"/"+name, runitServiceDir+"/"+name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// disableRunitService removes a service's supervision symlink.
|
||||||
|
func disableRunitService(name string) error {
|
||||||
|
if !runitServiceEnabled(name) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return privesc.Run(context.Background(), "", "rm", "-f",
|
||||||
|
runitServiceDir+"/"+name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensureRunitSeat sets up the seat access a Wayland greeter needs on runit (the
|
||||||
|
// equivalent of logind on systemd): enables seatd and adds the greeter user to
|
||||||
|
// the seat/video/input groups. Failures are reported but non-fatal.
|
||||||
|
func ensureRunitSeat(greeterUser string) {
|
||||||
|
if runitServiceInstalled("seatd") {
|
||||||
|
if err := enableRunitService("seatd"); err != nil {
|
||||||
|
fmt.Printf(" ⚠ could not enable seatd: %v\n", err)
|
||||||
|
} else {
|
||||||
|
fmt.Println(" ✓ seatd enabled")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Println(" ⚠ seatd not installed — the greeter compositor needs it for GPU/seat access")
|
||||||
|
}
|
||||||
|
if err := privesc.Run(context.Background(), "", "usermod", "-aG", "_seatd,video,input", greeterUser); err != nil {
|
||||||
|
fmt.Printf(" ⚠ could not add %s to seat groups: %v\n", greeterUser, err)
|
||||||
|
} else {
|
||||||
|
fmt.Printf(" ✓ %s added to seat groups (_seatd, video, input)\n", greeterUser)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensureGreetdPamRundir adds pam_rundir to the greetd PAM stack so the post-login
|
||||||
|
// session gets an XDG_RUNTIME_DIR on systems without logind (Void with seatd).
|
||||||
|
// Appended outside DMS's managed auth block so it survives `dms greeter sync`.
|
||||||
|
func ensureGreetdPamRundir() {
|
||||||
|
const pamPath = "/etc/pam.d/greetd"
|
||||||
|
data, err := os.ReadFile(pamPath)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf(" ⚠ could not read %s: %v\n", pamPath, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if strings.Contains(string(data), "pam_rundir") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
line := "session optional pam_rundir.so"
|
||||||
|
if err := privesc.Run(context.Background(), "", "sh", "-c",
|
||||||
|
fmt.Sprintf("printf '%%s\\n' %q >> %s", line, pamPath)); err != nil {
|
||||||
|
fmt.Printf(" ⚠ could not add pam_rundir to %s: %v\n", pamPath, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(" ✓ pam_rundir added to greetd PAM (provides XDG_RUNTIME_DIR for the session)")
|
||||||
|
}
|
||||||
|
|
||||||
|
// startGreeterHint returns the init-appropriate "start greetd now" command.
|
||||||
|
func startGreeterHint() string {
|
||||||
|
if isRunit() {
|
||||||
|
return " sudo sv up greetd"
|
||||||
|
}
|
||||||
|
return " sudo systemctl start greetd"
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@ func init() {
|
|||||||
runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)")
|
runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)")
|
||||||
runCmd.Flags().MarkHidden("daemon-child")
|
runCmd.Flags().MarkHidden("daemon-child")
|
||||||
|
|
||||||
greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd)
|
greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd, greeterLaunchSessionCmd)
|
||||||
authCmd.AddCommand(authSyncCmd)
|
authCmd.AddCommand(authSyncCmd)
|
||||||
setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd)
|
setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd)
|
||||||
updateCmd.AddCommand(updateCheckCmd)
|
updateCmd.AddCommand(updateCheckCmd)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func init() {
|
|||||||
runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)")
|
runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)")
|
||||||
runCmd.Flags().MarkHidden("daemon-child")
|
runCmd.Flags().MarkHidden("daemon-child")
|
||||||
|
|
||||||
greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd)
|
greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd, greeterLaunchSessionCmd)
|
||||||
authCmd.AddCommand(authSyncCmd)
|
authCmd.AddCommand(authSyncCmd)
|
||||||
setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd)
|
setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd)
|
||||||
pluginsCmd.AddCommand(pluginsBrowseCmd, pluginsListCmd, pluginsInstallCmd, pluginsUninstallCmd, pluginsUpdateCmd)
|
pluginsCmd.AddCommand(pluginsBrowseCmd, pluginsListCmd, pluginsInstallCmd, pluginsUninstallCmd, pluginsUpdateCmd)
|
||||||
|
|||||||
+41
-24
@@ -601,12 +601,30 @@ func parseTargetsFromIPCShowOutput(output string) ipcTargets {
|
|||||||
return targets
|
return targets
|
||||||
}
|
}
|
||||||
|
|
||||||
func getShellIPCCompletions(args []string, _ string) []string {
|
func buildQsIPCBaseArgs() ([]string, error) {
|
||||||
cmdArgs := []string{"ipc"}
|
cmdArgs := []string{"ipc"}
|
||||||
|
switch pid, ok := getFirstDMSPID(); {
|
||||||
|
case ok:
|
||||||
|
cmdArgs = append(cmdArgs, "--pid", strconv.Itoa(pid))
|
||||||
|
default:
|
||||||
|
if err := findConfig(nil, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
if qsHasAnyDisplay() {
|
if qsHasAnyDisplay() {
|
||||||
cmdArgs = append(cmdArgs, "--any-display")
|
cmdArgs = append(cmdArgs, "--any-display")
|
||||||
}
|
}
|
||||||
cmdArgs = append(cmdArgs, "-p", configPath, "show")
|
cmdArgs = append(cmdArgs, "-p", configPath)
|
||||||
|
}
|
||||||
|
return cmdArgs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getShellIPCCompletions(args []string, _ string) []string {
|
||||||
|
baseArgs, err := buildQsIPCBaseArgs()
|
||||||
|
if err != nil {
|
||||||
|
log.Debugf("Error building IPC args for completions: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
cmdArgs := append(baseArgs, "show")
|
||||||
cmd := exec.Command("qs", cmdArgs...)
|
cmd := exec.Command("qs", cmdArgs...)
|
||||||
var targets ipcTargets
|
var targets ipcTargets
|
||||||
|
|
||||||
@@ -623,7 +641,7 @@ func getShellIPCCompletions(args []string, _ string) []string {
|
|||||||
|
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
targetNames := make([]string, 0)
|
targetNames := make([]string, 0)
|
||||||
targetNames = append(targetNames, "call")
|
targetNames = append(targetNames, "call", "list")
|
||||||
for k := range targets {
|
for k := range targets {
|
||||||
targetNames = append(targetNames, k)
|
targetNames = append(targetNames, k)
|
||||||
}
|
}
|
||||||
@@ -696,23 +714,11 @@ func runShellIPCCommand(args []string) {
|
|||||||
args = append([]string{"call"}, args...)
|
args = append([]string{"call"}, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdArgs := []string{"ipc"}
|
baseArgs, err := buildQsIPCBaseArgs()
|
||||||
|
if err != nil {
|
||||||
switch pid, ok := getFirstDMSPID(); {
|
|
||||||
case ok:
|
|
||||||
cmdArgs = append(cmdArgs, "--pid", strconv.Itoa(pid))
|
|
||||||
default:
|
|
||||||
if err := findConfig(nil, nil); err != nil {
|
|
||||||
log.Fatalf("Error finding config: %v", err)
|
log.Fatalf("Error finding config: %v", err)
|
||||||
}
|
}
|
||||||
// ! TODO - remove check when QS 0.3 is released
|
cmdArgs := append(baseArgs, args...)
|
||||||
if qsHasAnyDisplay() {
|
|
||||||
cmdArgs = append(cmdArgs, "--any-display")
|
|
||||||
}
|
|
||||||
cmdArgs = append(cmdArgs, "-p", configPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
cmdArgs = append(cmdArgs, args...)
|
|
||||||
cmd := exec.Command("qs", cmdArgs...)
|
cmd := exec.Command("qs", cmdArgs...)
|
||||||
cmd.Stdin = os.Stdin
|
cmd.Stdin = os.Stdin
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
@@ -724,19 +730,20 @@ func runShellIPCCommand(args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func printIPCHelp() {
|
func printIPCHelp() {
|
||||||
fmt.Println("Usage: dms ipc <target> <function> [args...]")
|
fmt.Println("Usage: dms ipc call <target> <function> [args...]")
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
|
|
||||||
cmdArgs := []string{"ipc"}
|
baseArgs, err := buildQsIPCBaseArgs()
|
||||||
if qsHasAnyDisplay() {
|
if err != nil {
|
||||||
cmdArgs = append(cmdArgs, "--any-display")
|
printIPCHelpFailure(err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
cmdArgs = append(cmdArgs, "-p", configPath, "show")
|
cmdArgs := append(baseArgs, "show")
|
||||||
cmd := exec.Command("qs", cmdArgs...)
|
cmd := exec.Command("qs", cmdArgs...)
|
||||||
|
|
||||||
output, err := cmd.Output()
|
output, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Could not retrieve available IPC targets (is DMS running?)")
|
printIPCHelpFailure(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -765,6 +772,16 @@ func printIPCHelp() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func printIPCHelpFailure(err error) {
|
||||||
|
fmt.Println("Could not retrieve IPC targets.")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf(" %v\n", err)
|
||||||
|
}
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println(" Full docs: https://danklinux.com/docs/dankmaterialshell/keybinds-ipc")
|
||||||
|
fmt.Println(" Try: dms ipc call <target> <function>")
|
||||||
|
}
|
||||||
|
|
||||||
// ensureFontCache rebuilds the fontconfig cache if user-configured fonts are missing while skipping defaults
|
// ensureFontCache rebuilds the fontconfig cache if user-configured fonts are missing while skipping defaults
|
||||||
func ensureFontCache() {
|
func ensureFontCache() {
|
||||||
if _, err := exec.LookPath("fc-list"); err != nil {
|
if _, err := exec.LookPath("fc-list"); err != nil {
|
||||||
|
|||||||
@@ -233,24 +233,39 @@ func stripDesktopExecCodes(execLine string) string {
|
|||||||
return strings.Join(cleaned, " ")
|
return strings.Join(cleaned, " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatInitialSessionCommand(sessionExec string) string {
|
func shellQuote(value string) string {
|
||||||
execLine := strings.TrimSpace(stripDesktopExecCodes(sessionExec))
|
return "'" + strings.ReplaceAll(value, "'", "'\\''") + "'"
|
||||||
if execLine == "" {
|
}
|
||||||
|
|
||||||
|
func stableDMSCommand() string {
|
||||||
|
for _, candidate := range []string{"/usr/bin/dms", "/usr/local/bin/dms"} {
|
||||||
|
info, err := os.Stat(candidate)
|
||||||
|
if err == nil && !info.IsDir() && info.Mode()&0o111 != 0 {
|
||||||
|
return candidate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "dms"
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatInitialSessionCommand(cacheDir string) string {
|
||||||
|
cacheDir = strings.TrimSpace(cacheDir)
|
||||||
|
if cacheDir == "" {
|
||||||
return `command = ""`
|
return `command = ""`
|
||||||
}
|
}
|
||||||
escaped := strings.ReplaceAll(execLine, `'`, `'\''`)
|
launcher := fmt.Sprintf("%s greeter launch-session --from-memory --cache-dir %s", stableDMSCommand(), shellQuote(cacheDir))
|
||||||
|
escaped := strings.ReplaceAll(launcher, `'`, `'\''`)
|
||||||
inner := fmt.Sprintf("env XDG_SESSION_TYPE=wayland sh -c 'exec %s'", escaped)
|
inner := fmt.Sprintf("env XDG_SESSION_TYPE=wayland sh -c 'exec %s'", escaped)
|
||||||
tomlEscaped := strings.ReplaceAll(inner, `\`, `\\`)
|
tomlEscaped := strings.ReplaceAll(inner, `\`, `\\`)
|
||||||
tomlEscaped = strings.ReplaceAll(tomlEscaped, `"`, `\"`)
|
tomlEscaped = strings.ReplaceAll(tomlEscaped, `"`, `\"`)
|
||||||
return fmt.Sprintf(`command = "%s"`, tomlEscaped)
|
return fmt.Sprintf(`command = "%s"`, tomlEscaped)
|
||||||
}
|
}
|
||||||
|
|
||||||
func upsertInitialSession(configContent, loginUser, sessionExec string, enabled bool) string {
|
func upsertInitialSession(configContent, loginUser, cacheDir string, enabled bool) string {
|
||||||
if !enabled {
|
if !enabled {
|
||||||
return removeTomlSection(configContent, "initial_session")
|
return removeTomlSection(configContent, "initial_session")
|
||||||
}
|
}
|
||||||
|
|
||||||
commandLine := formatInitialSessionCommand(sessionExec)
|
commandLine := formatInitialSessionCommand(cacheDir)
|
||||||
lines := strings.Split(configContent, "\n")
|
lines := strings.Split(configContent, "\n")
|
||||||
var out []string
|
var out []string
|
||||||
|
|
||||||
@@ -330,6 +345,7 @@ type greeterAutoLoginConfig struct {
|
|||||||
type greeterAutoLoginMemory struct {
|
type greeterAutoLoginMemory struct {
|
||||||
LastSuccessfulUser string `json:"lastSuccessfulUser"`
|
LastSuccessfulUser string `json:"lastSuccessfulUser"`
|
||||||
LastSessionID string `json:"lastSessionId"`
|
LastSessionID string `json:"lastSessionId"`
|
||||||
|
LastSessionDesktopID string `json:"lastSessionDesktopId"`
|
||||||
LastSessionExec string `json:"lastSessionExec"`
|
LastSessionExec string `json:"lastSessionExec"`
|
||||||
AutoLoginEnabled bool `json:"autoLoginEnabled"`
|
AutoLoginEnabled bool `json:"autoLoginEnabled"`
|
||||||
}
|
}
|
||||||
@@ -381,7 +397,7 @@ func execFromDesktopFile(path string) (string, error) {
|
|||||||
return "", fmt.Errorf("no Exec= line found in %s", path)
|
return "", fmt.Errorf("no Exec= line found in %s", path)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolveGreeterAutoLoginState(cacheDir, homeDir string) (enabled bool, loginUser string, sessionExec string, err error) {
|
func resolveGreeterAutoLoginState(cacheDir, homeDir string) (enabled bool, loginUser string, sessionID string, err error) {
|
||||||
settingsPath := filepath.Join(cacheDir, "settings.json")
|
settingsPath := filepath.Join(cacheDir, "settings.json")
|
||||||
if _, statErr := os.Stat(settingsPath); statErr != nil {
|
if _, statErr := os.Stat(settingsPath); statErr != nil {
|
||||||
settingsPath = filepath.Join(homeDir, ".config", "DankMaterialShell", "settings.json")
|
settingsPath = filepath.Join(homeDir, ".config", "DankMaterialShell", "settings.json")
|
||||||
@@ -416,15 +432,9 @@ func resolveGreeterAutoLoginState(cacheDir, homeDir string) (enabled bool, login
|
|||||||
loginUser = current.Username
|
loginUser = current.Username
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionExec = mem.LastSessionExec
|
sessionID = sessionDesktopIDFromMemory(mem)
|
||||||
if sessionExec == "" && mem.LastSessionID != "" {
|
|
||||||
sessionExec, err = execFromDesktopFile(mem.LastSessionID)
|
|
||||||
if err != nil {
|
|
||||||
sessionExec = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, loginUser, sessionExec, nil
|
return true, loginUser, sessionID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeGreetdConfig(configPath, content string, logFunc func(string), sudoPassword, successMsg string) error {
|
func writeGreetdConfig(configPath, content string, logFunc func(string), sudoPassword, successMsg string) error {
|
||||||
@@ -540,7 +550,7 @@ func readGreeterMemoryFile(memoryPath, sudoPassword string) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPassword string) error {
|
func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPassword string) error {
|
||||||
enabled, loginUser, sessionExec, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -568,7 +578,7 @@ func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPas
|
|||||||
return writeGreetdConfig(configPath, newConfig, logFunc, sudoPassword, "✓ Disabled greeter auto-login")
|
return writeGreetdConfig(configPath, newConfig, logFunc, sudoPassword, "✓ Disabled greeter auto-login")
|
||||||
}
|
}
|
||||||
|
|
||||||
if loginUser == "" || sessionExec == "" {
|
if loginUser == "" || sessionID == "" {
|
||||||
if logFunc != nil {
|
if logFunc != nil {
|
||||||
logFunc("⚠ Greeter auto-login is enabled but user or session is not configured yet. Log in manually once, then run sync.")
|
logFunc("⚠ Greeter auto-login is enabled but user or session is not configured yet. Log in manually once, then run sync.")
|
||||||
}
|
}
|
||||||
@@ -579,7 +589,7 @@ func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPas
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
newConfig := upsertInitialSession(configContent, loginUser, sessionExec, true)
|
newConfig := upsertInitialSession(configContent, loginUser, cacheDir, true)
|
||||||
if newConfig == configContent {
|
if newConfig == configContent {
|
||||||
if logFunc != nil {
|
if logFunc != nil {
|
||||||
logFunc(fmt.Sprintf("✓ Greeter auto-login already configured for %s", loginUser))
|
logFunc(fmt.Sprintf("✓ Greeter auto-login already configured for %s", loginUser))
|
||||||
|
|||||||
@@ -111,15 +111,18 @@ command = "/usr/bin/dms-greeter --command niri"
|
|||||||
|
|
||||||
t.Run("inserts initial session", func(t *testing.T) {
|
t.Run("inserts initial session", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
got := upsertInitialSession(baseConfig, "alice", "niri", true)
|
got := upsertInitialSession(baseConfig, "alice", "/var/cache/dms-greeter", true)
|
||||||
if !strings.Contains(got, "[initial_session]") {
|
if !strings.Contains(got, "[initial_session]") {
|
||||||
t.Fatalf("expected [initial_session] section, got:\n%s", got)
|
t.Fatalf("expected [initial_session] section, got:\n%s", got)
|
||||||
}
|
}
|
||||||
if !strings.Contains(got, `user = "alice"`) {
|
if !strings.Contains(got, `user = "alice"`) {
|
||||||
t.Fatalf("expected alice user in initial session, got:\n%s", got)
|
t.Fatalf("expected alice user in initial session, got:\n%s", got)
|
||||||
}
|
}
|
||||||
if !strings.Contains(got, `env XDG_SESSION_TYPE=wayland sh -c 'exec niri'`) {
|
if !strings.Contains(got, `dms greeter launch-session --from-memory --cache-dir`) {
|
||||||
t.Fatalf("expected wrapped session command, got:\n%s", got)
|
t.Fatalf("expected stable launch-session command, got:\n%s", got)
|
||||||
|
}
|
||||||
|
if strings.Contains(got, `exec niri`) {
|
||||||
|
t.Fatalf("initial session must not bake the desktop Exec command, got:\n%s", got)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -130,12 +133,12 @@ command = "/usr/bin/dms-greeter --command niri"
|
|||||||
user = "bob"
|
user = "bob"
|
||||||
command = "old-command"
|
command = "old-command"
|
||||||
`
|
`
|
||||||
got := upsertInitialSession(existing, "alice", "Hyprland", true)
|
got := upsertInitialSession(existing, "alice", "/var/cache/dms-greeter", true)
|
||||||
if strings.Contains(got, `user = "bob"`) {
|
if strings.Contains(got, `user = "bob"`) {
|
||||||
t.Fatalf("expected bob to be replaced, got:\n%s", got)
|
t.Fatalf("expected bob to be replaced, got:\n%s", got)
|
||||||
}
|
}
|
||||||
if !strings.Contains(got, `exec Hyprland`) {
|
if !strings.Contains(got, `dms greeter launch-session --from-memory`) {
|
||||||
t.Fatalf("expected Hyprland command, got:\n%s", got)
|
t.Fatalf("expected launch-session command, got:\n%s", got)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -179,15 +182,46 @@ func TestResolveGreeterAutoLoginState(t *testing.T) {
|
|||||||
}`)
|
}`)
|
||||||
writeTestFile(t, filepath.Join(cacheDir, ".local/state/memory.json"), `{
|
writeTestFile(t, filepath.Join(cacheDir, ".local/state/memory.json"), `{
|
||||||
"lastSuccessfulUser": "alice",
|
"lastSuccessfulUser": "alice",
|
||||||
"lastSessionExec": "niri"
|
"lastSessionDesktopId": "niri.desktop"
|
||||||
}`)
|
}`)
|
||||||
|
|
||||||
enabled, loginUser, sessionExec, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
|
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
|
||||||
}
|
}
|
||||||
if !enabled || loginUser != "alice" || sessionExec != "niri" {
|
if !enabled || loginUser != "alice" || sessionID != "niri.desktop" {
|
||||||
t.Fatalf("got enabled=%v user=%q exec=%q", enabled, loginUser, sessionExec)
|
t.Fatalf("got enabled=%v user=%q session=%q", enabled, loginUser, sessionID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResolveGreeterAutoLoginStateIgnoresStaleSessionExec(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
cacheDir := t.TempDir()
|
||||||
|
homeDir := t.TempDir()
|
||||||
|
|
||||||
|
writeTestFile(t, filepath.Join(cacheDir, "settings.json"), `{
|
||||||
|
"greeterAutoLogin": true,
|
||||||
|
"greeterRememberLastUser": true,
|
||||||
|
"greeterRememberLastSession": true
|
||||||
|
}`)
|
||||||
|
writeTestFile(t, filepath.Join(cacheDir, ".local/state/memory.json"), `{
|
||||||
|
"lastSuccessfulUser": "alice",
|
||||||
|
"lastSessionId": "/nix/store/old-session/share/wayland-sessions/example.desktop",
|
||||||
|
"lastSessionExec": "/nix/store/old-session/bin/start-example-session"
|
||||||
|
}`)
|
||||||
|
|
||||||
|
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
|
||||||
|
}
|
||||||
|
if !enabled || loginUser != "alice" || sessionID != "example.desktop" {
|
||||||
|
t.Fatalf("got enabled=%v user=%q session=%q", enabled, loginUser, sessionID)
|
||||||
|
}
|
||||||
|
|
||||||
|
got := upsertInitialSession("", loginUser, cacheDir, true)
|
||||||
|
if strings.Contains(got, "/nix/store/old-session") {
|
||||||
|
t.Fatalf("initial session must not include stale store path, got:\n%s", got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,12 +242,35 @@ func TestResolveGreeterAutoLoginStateIgnoresMemoryFlag(t *testing.T) {
|
|||||||
"lastSessionExec": "niri"
|
"lastSessionExec": "niri"
|
||||||
}`)
|
}`)
|
||||||
|
|
||||||
enabled, loginUser, sessionExec, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
|
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
|
||||||
}
|
}
|
||||||
if enabled || loginUser != "" || sessionExec != "" {
|
if enabled || loginUser != "" || sessionID != "" {
|
||||||
t.Fatalf("expected disabled with empty user/exec, got enabled=%v user=%q exec=%q", enabled, loginUser, sessionExec)
|
t.Fatalf("expected disabled with empty user/session, got enabled=%v user=%q session=%q", enabled, loginUser, sessionID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResolveSessionExecInDirs(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
oldDir := filepath.Join(t.TempDir(), "wayland-sessions")
|
||||||
|
newDir := filepath.Join(t.TempDir(), "wayland-sessions")
|
||||||
|
writeTestFile(t, filepath.Join(oldDir, "example.desktop"), `[Desktop Entry]
|
||||||
|
Name=Example Session
|
||||||
|
Exec=/nix/store/old-session/bin/start-example-session
|
||||||
|
`)
|
||||||
|
writeTestFile(t, filepath.Join(newDir, "example.desktop"), `[Desktop Entry]
|
||||||
|
Name=Example Session
|
||||||
|
Exec=/run/current-system/sw/bin/start-example-session
|
||||||
|
`)
|
||||||
|
|
||||||
|
got, err := resolveSessionExecInDirs("example.desktop", []string{newDir, oldDir})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("resolveSessionExecInDirs returned error: %v", err)
|
||||||
|
}
|
||||||
|
if got != "/run/current-system/sw/bin/start-example-session" {
|
||||||
|
t.Fatalf("resolveSessionExecInDirs = %q", got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,122 @@
|
|||||||
|
package greeter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func sessionDesktopIDFromPath(path string) string {
|
||||||
|
id := strings.TrimSpace(path)
|
||||||
|
if id == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if strings.ContainsAny(id, "/\\") {
|
||||||
|
id = filepath.Base(id)
|
||||||
|
}
|
||||||
|
if id == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if !strings.HasSuffix(id, ".desktop") {
|
||||||
|
id += ".desktop"
|
||||||
|
}
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
func sessionDesktopIDFromMemory(mem greeterAutoLoginMemory) string {
|
||||||
|
if id := sessionDesktopIDFromPath(mem.LastSessionDesktopID); id != "" {
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
return sessionDesktopIDFromPath(mem.LastSessionID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sessionDesktopDirs() []string {
|
||||||
|
seen := make(map[string]bool)
|
||||||
|
dirs := make([]string, 0, 8)
|
||||||
|
|
||||||
|
addBase := func(base string) {
|
||||||
|
base = strings.TrimSpace(base)
|
||||||
|
if base == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, sub := range []string{"wayland-sessions", "xsessions"} {
|
||||||
|
dir := filepath.Join(base, sub)
|
||||||
|
if seen[dir] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
seen[dir] = true
|
||||||
|
dirs = append(dirs, dir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if dataHome := os.Getenv("XDG_DATA_HOME"); dataHome != "" {
|
||||||
|
addBase(dataHome)
|
||||||
|
} else if home, err := os.UserHomeDir(); err == nil && home != "" {
|
||||||
|
addBase(filepath.Join(home, ".local", "share"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if dataDirs := os.Getenv("XDG_DATA_DIRS"); dataDirs != "" {
|
||||||
|
for _, dir := range strings.Split(dataDirs, ":") {
|
||||||
|
addBase(dir)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
addBase("/usr/local/share")
|
||||||
|
addBase("/usr/share")
|
||||||
|
}
|
||||||
|
|
||||||
|
return dirs
|
||||||
|
}
|
||||||
|
|
||||||
|
func ResolveSessionExec(sessionID string) (string, error) {
|
||||||
|
return resolveSessionExecInDirs(sessionID, sessionDesktopDirs())
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveSessionExecInDirs(sessionID string, dirs []string) (string, error) {
|
||||||
|
id := sessionDesktopIDFromPath(sessionID)
|
||||||
|
if id == "" {
|
||||||
|
return "", fmt.Errorf("session id is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, dir := range dirs {
|
||||||
|
path := filepath.Join(dir, id)
|
||||||
|
execLine, err := execFromDesktopFile(path)
|
||||||
|
if err == nil {
|
||||||
|
return execLine, nil
|
||||||
|
}
|
||||||
|
if !os.IsNotExist(err) {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("session desktop file %q was not found", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func LaunchSessionByID(sessionID string) error {
|
||||||
|
execLine, err := ResolveSessionExec(sessionID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
execLine = strings.TrimSpace(stripDesktopExecCodes(execLine))
|
||||||
|
if execLine == "" {
|
||||||
|
return fmt.Errorf("session %q has an empty Exec command", sessionID)
|
||||||
|
}
|
||||||
|
|
||||||
|
env := append(os.Environ(), "XDG_SESSION_TYPE=wayland")
|
||||||
|
return syscall.Exec("/bin/sh", []string{"sh", "-c", "exec " + execLine}, env)
|
||||||
|
}
|
||||||
|
|
||||||
|
func LaunchSessionFromMemory(cacheDir, homeDir string) error {
|
||||||
|
enabled, _, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !enabled {
|
||||||
|
return fmt.Errorf("greeter auto-login is disabled")
|
||||||
|
}
|
||||||
|
if sessionID == "" {
|
||||||
|
return fmt.Errorf("greeter auto-login has no remembered session")
|
||||||
|
}
|
||||||
|
return LaunchSessionByID(sessionID)
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ type NiriParser struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseKDL(data []byte) (*document.Document, error) {
|
func parseKDL(data []byte) (*document.Document, error) {
|
||||||
return kdl.Parse(strings.NewReader(normalizeKDLBraces(string(data))))
|
return kdl.Parse(strings.NewReader(normalizeKDLBraces(quoteLeadingUnderscoreIdents(string(data)))))
|
||||||
}
|
}
|
||||||
|
|
||||||
func normalizeKDLBraces(input string) string {
|
func normalizeKDLBraces(input string) string {
|
||||||
@@ -94,6 +94,93 @@ func normalizeKDLBraces(input string) string {
|
|||||||
return sb.String()
|
return sb.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// quoteLeadingUnderscoreIdents wraps bare KDL identifiers that begin with '_'
|
||||||
|
// in double quotes. kdl-go rejects '_' as the first character of a bare
|
||||||
|
// identifier (e.g. the common `_JAVA_AWT_WM_NONREPARENTING "1"` environment
|
||||||
|
// node), even though niri's own parser and the KDL spec accept it — so without
|
||||||
|
// this the whole config fails to parse and no keybinds load. Quoting lets
|
||||||
|
// kdl-go parse it; this is safe because the niri parser only dispatches on
|
||||||
|
// fixed node/section names (binds, recent-windows, include, ...) that never
|
||||||
|
// start with '_', so re-quoting such a name cannot change what DMS reads.
|
||||||
|
// Underscores elsewhere in an identifier (XDG_CURRENT_DESKTOP) are left
|
||||||
|
// untouched, and underscores inside strings or comments are skipped. Only a
|
||||||
|
// leading '_' is handled; other start characters kdl-go over-rejects (e.g. '.'
|
||||||
|
// or '?') do not occur in niri configs.
|
||||||
|
func quoteLeadingUnderscoreIdents(input string) string {
|
||||||
|
var sb strings.Builder
|
||||||
|
sb.Grow(len(input))
|
||||||
|
|
||||||
|
var prev byte
|
||||||
|
n := len(input)
|
||||||
|
for i := 0; i < n; {
|
||||||
|
c := input[i]
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case c == '"':
|
||||||
|
end := findStringEnd(input, i)
|
||||||
|
sb.WriteString(input[i:end])
|
||||||
|
prev = '"'
|
||||||
|
i = end
|
||||||
|
case c == '/' && i+1 < n && input[i+1] == '/':
|
||||||
|
end := findLineCommentEnd(input, i)
|
||||||
|
sb.WriteString(input[i:end])
|
||||||
|
prev = '\n'
|
||||||
|
i = end
|
||||||
|
case c == '/' && i+1 < n && input[i+1] == '*':
|
||||||
|
end := findBlockCommentEnd(input, i)
|
||||||
|
sb.WriteString(input[i:end])
|
||||||
|
prev = ' '
|
||||||
|
i = end
|
||||||
|
case c == '/' && i+1 < n && input[i+1] == '-':
|
||||||
|
// KDL slashdash: /- comments out the next node/value. Keep the
|
||||||
|
// marker but treat what follows as a fresh token start, so a
|
||||||
|
// slashdashed leading-underscore node (e.g. `/-_FOO "1"`) still
|
||||||
|
// gets quoted instead of crashing kdl-go.
|
||||||
|
sb.WriteByte('/')
|
||||||
|
sb.WriteByte('-')
|
||||||
|
prev = ' '
|
||||||
|
i += 2
|
||||||
|
case c == '_' && isIdentBoundary(prev):
|
||||||
|
end := scanBareIdent(input, i)
|
||||||
|
sb.WriteByte('"')
|
||||||
|
sb.WriteString(input[i:end])
|
||||||
|
sb.WriteByte('"')
|
||||||
|
prev = '"'
|
||||||
|
i = end
|
||||||
|
default:
|
||||||
|
sb.WriteByte(c)
|
||||||
|
prev = c
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// isIdentBoundary reports whether the previously emitted byte ends a token, so
|
||||||
|
// that a following '_' starts a fresh bare identifier rather than sitting in
|
||||||
|
// the middle of one.
|
||||||
|
func isIdentBoundary(prev byte) bool {
|
||||||
|
switch prev {
|
||||||
|
case 0, ' ', '\t', '\n', '\r', '{', '}', ';', '=', '(', ')', ',':
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// scanBareIdent returns the index just past the bare identifier starting at
|
||||||
|
// start, stopping at whitespace or any KDL delimiter.
|
||||||
|
func scanBareIdent(s string, start int) int {
|
||||||
|
n := len(s)
|
||||||
|
for i := start; i < n; i++ {
|
||||||
|
switch s[i] {
|
||||||
|
case ' ', '\t', '\n', '\r', '"', '{', '}', '(', ')', ';', '=', ',', '/', '\\', '<', '>', '[', ']':
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
func findStringEnd(s string, start int) int {
|
func findStringEnd(s string, start int) int {
|
||||||
n := len(s)
|
n := len(s)
|
||||||
for i := start + 1; i < n; {
|
for i := start + 1; i < n; {
|
||||||
|
|||||||
@@ -71,6 +71,101 @@ func TestNormalizeKDLBraces(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestQuoteLeadingUnderscoreIdents(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
in string
|
||||||
|
out string
|
||||||
|
}{
|
||||||
|
{"leading underscore node", `_JAVA_AWT_WM_NONREPARENTING "1"`, `"_JAVA_AWT_WM_NONREPARENTING" "1"`},
|
||||||
|
{"mid underscore untouched", `XDG_CURRENT_DESKTOP "niri"`, `XDG_CURRENT_DESKTOP "niri"`},
|
||||||
|
{"indented node", "environment {\n _FOO \"1\"\n}", "environment {\n \"_FOO\" \"1\"\n}"},
|
||||||
|
{"underscore in string", `spawn "_not_a_node"`, `spawn "_not_a_node"`},
|
||||||
|
{"underscore in line comment", "// _comment\n_FOO \"1\"", "// _comment\n\"_FOO\" \"1\""},
|
||||||
|
{"underscore in block comment", "/* _x */ _FOO \"1\"", "/* _x */ \"_FOO\" \"1\""},
|
||||||
|
{"block comment abuts node", `/* x */_FOO "1"`, `/* x */"_FOO" "1"`},
|
||||||
|
{"slashdash before node", `/-_FOO "1"`, `/-"_FOO" "1"`},
|
||||||
|
{"node after closing paren", "node (u8)_v", `node (u8)"_v"`},
|
||||||
|
{"node before brace without space", "_FOO{ }", `"_FOO"{ }`},
|
||||||
|
{"lone underscore", `_ "x"`, `"_" "x"`},
|
||||||
|
{"property value", "node key=_val", `node key="_val"`},
|
||||||
|
{"no underscores", "node child", "node child"},
|
||||||
|
}
|
||||||
|
for _, tc := range tests {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
got := quoteLeadingUnderscoreIdents(tc.in)
|
||||||
|
if got != tc.out {
|
||||||
|
t.Errorf("quoteLeadingUnderscoreIdents(%q) = %q, want %q", tc.in, got, tc.out)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNiriParseLeadingUnderscoreEnvironment(t *testing.T) {
|
||||||
|
tmpDir := t.TempDir()
|
||||||
|
configFile := filepath.Join(tmpDir, "config.kdl")
|
||||||
|
|
||||||
|
// A leading-underscore environment node (a common Java/tiling-WM fix) must
|
||||||
|
// not abort parsing of the rest of the config — keybinds still have to load.
|
||||||
|
content := `environment {
|
||||||
|
XDG_CURRENT_DESKTOP "niri"
|
||||||
|
_JAVA_AWT_WM_NONREPARENTING "1"
|
||||||
|
}
|
||||||
|
binds {
|
||||||
|
Mod+Q { close-window; }
|
||||||
|
Mod+KP_Home { focus-workspace 1; }
|
||||||
|
}
|
||||||
|
`
|
||||||
|
if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil {
|
||||||
|
t.Fatalf("Failed to write test config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := ParseNiriKeys(tmpDir)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ParseNiriKeys failed on config with leading-underscore env node: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(result.Section.Keybinds) != 2 {
|
||||||
|
t.Errorf("Expected 2 keybinds, got %d", len(result.Section.Keybinds))
|
||||||
|
}
|
||||||
|
|
||||||
|
foundClose := false
|
||||||
|
for _, kb := range result.Section.Keybinds {
|
||||||
|
if kb.Action == "close-window" {
|
||||||
|
foundClose = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !foundClose {
|
||||||
|
t.Error("close-window keybind not found — leading-underscore env node broke parsing")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNiriParseSlashdashLeadingUnderscore(t *testing.T) {
|
||||||
|
tmpDir := t.TempDir()
|
||||||
|
configFile := filepath.Join(tmpDir, "config.kdl")
|
||||||
|
|
||||||
|
// A slashdashed leading-underscore node must not abort parsing either.
|
||||||
|
content := `environment {
|
||||||
|
/-_JAVA_AWT_WM_NONREPARENTING "1"
|
||||||
|
}
|
||||||
|
binds {
|
||||||
|
Mod+Q { close-window; }
|
||||||
|
}
|
||||||
|
`
|
||||||
|
if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil {
|
||||||
|
t.Fatalf("Failed to write test config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := ParseNiriKeys(tmpDir)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ParseNiriKeys failed on config with slashdashed leading-underscore node: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(result.Section.Keybinds) != 1 {
|
||||||
|
t.Errorf("Expected 1 keybind, got %d", len(result.Section.Keybinds))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestNiriParseKeyCombo(t *testing.T) {
|
func TestNiriParseKeyCombo(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
combo string
|
combo string
|
||||||
|
|||||||
@@ -1,12 +1,28 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package mocks_brightness
|
package mocks_brightness
|
||||||
|
|
||||||
import (
|
import (
|
||||||
dbus "github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockDBusConn creates a new instance of MockDBusConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockDBusConn(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockDBusConn {
|
||||||
|
mock := &MockDBusConn{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockDBusConn is an autogenerated mock type for the DBusConn type
|
// MockDBusConn is an autogenerated mock type for the DBusConn type
|
||||||
type MockDBusConn struct {
|
type MockDBusConn struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -20,21 +36,20 @@ func (_m *MockDBusConn) EXPECT() *MockDBusConn_Expecter {
|
|||||||
return &MockDBusConn_Expecter{mock: &_m.Mock}
|
return &MockDBusConn_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close provides a mock function with no fields
|
// Close provides a mock function for the type MockDBusConn
|
||||||
func (_m *MockDBusConn) Close() error {
|
func (_mock *MockDBusConn) Close() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Close")
|
panic("no return value specified for Close")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,8 +70,8 @@ func (_c *MockDBusConn_Close_Call) Run(run func()) *MockDBusConn_Close_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockDBusConn_Close_Call) Return(_a0 error) *MockDBusConn_Close_Call {
|
func (_c *MockDBusConn_Close_Call) Return(err error) *MockDBusConn_Close_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,23 +80,22 @@ func (_c *MockDBusConn_Close_Call) RunAndReturn(run func() error) *MockDBusConn_
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Object provides a mock function with given fields: dest, path
|
// Object provides a mock function for the type MockDBusConn
|
||||||
func (_m *MockDBusConn) Object(dest string, path dbus.ObjectPath) dbus.BusObject {
|
func (_mock *MockDBusConn) Object(dest string, path dbus.ObjectPath) dbus.BusObject {
|
||||||
ret := _m.Called(dest, path)
|
ret := _mock.Called(dest, path)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Object")
|
panic("no return value specified for Object")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 dbus.BusObject
|
var r0 dbus.BusObject
|
||||||
if rf, ok := ret.Get(0).(func(string, dbus.ObjectPath) dbus.BusObject); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, dbus.ObjectPath) dbus.BusObject); ok {
|
||||||
r0 = rf(dest, path)
|
r0 = returnFunc(dest, path)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(dbus.BusObject)
|
r0 = ret.Get(0).(dbus.BusObject)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,32 +113,28 @@ func (_e *MockDBusConn_Expecter) Object(dest any, path any) *MockDBusConn_Object
|
|||||||
|
|
||||||
func (_c *MockDBusConn_Object_Call) Run(run func(dest string, path dbus.ObjectPath)) *MockDBusConn_Object_Call {
|
func (_c *MockDBusConn_Object_Call) Run(run func(dest string, path dbus.ObjectPath)) *MockDBusConn_Object_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string), args[1].(dbus.ObjectPath))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 dbus.ObjectPath
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(dbus.ObjectPath)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockDBusConn_Object_Call) Return(_a0 dbus.BusObject) *MockDBusConn_Object_Call {
|
func (_c *MockDBusConn_Object_Call) Return(busObject dbus.BusObject) *MockDBusConn_Object_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(busObject)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockDBusConn_Object_Call) RunAndReturn(run func(string, dbus.ObjectPath) dbus.BusObject) *MockDBusConn_Object_Call {
|
func (_c *MockDBusConn_Object_Call) RunAndReturn(run func(dest string, path dbus.ObjectPath) dbus.BusObject) *MockDBusConn_Object_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockDBusConn creates a new instance of MockDBusConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockDBusConn(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
},
|
|
||||||
) *MockDBusConn {
|
|
||||||
mock := &MockDBusConn{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,28 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package mocks_evdev
|
package mocks_evdev
|
||||||
|
|
||||||
import (
|
import (
|
||||||
go_evdev "github.com/holoplot/go-evdev"
|
"github.com/holoplot/go-evdev"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockEvdevDevice creates a new instance of MockEvdevDevice. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockEvdevDevice(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockEvdevDevice {
|
||||||
|
mock := &MockEvdevDevice{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockEvdevDevice is an autogenerated mock type for the EvdevDevice type
|
// MockEvdevDevice is an autogenerated mock type for the EvdevDevice type
|
||||||
type MockEvdevDevice struct {
|
type MockEvdevDevice struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -20,21 +36,20 @@ func (_m *MockEvdevDevice) EXPECT() *MockEvdevDevice_Expecter {
|
|||||||
return &MockEvdevDevice_Expecter{mock: &_m.Mock}
|
return &MockEvdevDevice_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close provides a mock function with no fields
|
// Close provides a mock function for the type MockEvdevDevice
|
||||||
func (_m *MockEvdevDevice) Close() error {
|
func (_mock *MockEvdevDevice) Close() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Close")
|
panic("no return value specified for Close")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,8 +70,8 @@ func (_c *MockEvdevDevice_Close_Call) Run(run func()) *MockEvdevDevice_Close_Cal
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_Close_Call) Return(_a0 error) *MockEvdevDevice_Close_Call {
|
func (_c *MockEvdevDevice_Close_Call) Return(err error) *MockEvdevDevice_Close_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,9 +80,9 @@ func (_c *MockEvdevDevice_Close_Call) RunAndReturn(run func() error) *MockEvdevD
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name provides a mock function with no fields
|
// Name provides a mock function for the type MockEvdevDevice
|
||||||
func (_m *MockEvdevDevice) Name() (string, error) {
|
func (_mock *MockEvdevDevice) Name() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Name")
|
panic("no return value specified for Name")
|
||||||
@@ -75,21 +90,19 @@ func (_m *MockEvdevDevice) Name() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +123,8 @@ func (_c *MockEvdevDevice_Name_Call) Run(run func()) *MockEvdevDevice_Name_Call
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_Name_Call) Return(_a0 string, _a1 error) *MockEvdevDevice_Name_Call {
|
func (_c *MockEvdevDevice_Name_Call) Return(s string, err error) *MockEvdevDevice_Name_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,21 +133,20 @@ func (_c *MockEvdevDevice_Name_Call) RunAndReturn(run func() (string, error)) *M
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path provides a mock function with no fields
|
// Path provides a mock function for the type MockEvdevDevice
|
||||||
func (_m *MockEvdevDevice) Path() string {
|
func (_mock *MockEvdevDevice) Path() string {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Path")
|
panic("no return value specified for Path")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,8 +167,8 @@ func (_c *MockEvdevDevice_Path_Call) Run(run func()) *MockEvdevDevice_Path_Call
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_Path_Call) Return(_a0 string) *MockEvdevDevice_Path_Call {
|
func (_c *MockEvdevDevice_Path_Call) Return(s string) *MockEvdevDevice_Path_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(s)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,33 +177,31 @@ func (_c *MockEvdevDevice_Path_Call) RunAndReturn(run func() string) *MockEvdevD
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadOne provides a mock function with no fields
|
// ReadOne provides a mock function for the type MockEvdevDevice
|
||||||
func (_m *MockEvdevDevice) ReadOne() (*go_evdev.InputEvent, error) {
|
func (_mock *MockEvdevDevice) ReadOne() (*evdev.InputEvent, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for ReadOne")
|
panic("no return value specified for ReadOne")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *go_evdev.InputEvent
|
var r0 *evdev.InputEvent
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (*go_evdev.InputEvent, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (*evdev.InputEvent, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() *go_evdev.InputEvent); ok {
|
if returnFunc, ok := ret.Get(0).(func() *evdev.InputEvent); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*go_evdev.InputEvent)
|
r0 = ret.Get(0).(*evdev.InputEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,43 +222,41 @@ func (_c *MockEvdevDevice_ReadOne_Call) Run(run func()) *MockEvdevDevice_ReadOne
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_ReadOne_Call) Return(_a0 *go_evdev.InputEvent, _a1 error) *MockEvdevDevice_ReadOne_Call {
|
func (_c *MockEvdevDevice_ReadOne_Call) Return(inputEvent *evdev.InputEvent, err error) *MockEvdevDevice_ReadOne_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(inputEvent, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_ReadOne_Call) RunAndReturn(run func() (*go_evdev.InputEvent, error)) *MockEvdevDevice_ReadOne_Call {
|
func (_c *MockEvdevDevice_ReadOne_Call) RunAndReturn(run func() (*evdev.InputEvent, error)) *MockEvdevDevice_ReadOne_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// State provides a mock function with given fields: t
|
// State provides a mock function for the type MockEvdevDevice
|
||||||
func (_m *MockEvdevDevice) State(t go_evdev.EvType) (go_evdev.StateMap, error) {
|
func (_mock *MockEvdevDevice) State(t evdev.EvType) (evdev.StateMap, error) {
|
||||||
ret := _m.Called(t)
|
ret := _mock.Called(t)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for State")
|
panic("no return value specified for State")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 go_evdev.StateMap
|
var r0 evdev.StateMap
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(go_evdev.EvType) (go_evdev.StateMap, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func(evdev.EvType) (evdev.StateMap, error)); ok {
|
||||||
return rf(t)
|
return returnFunc(t)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(go_evdev.EvType) go_evdev.StateMap); ok {
|
if returnFunc, ok := ret.Get(0).(func(evdev.EvType) evdev.StateMap); ok {
|
||||||
r0 = rf(t)
|
r0 = returnFunc(t)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(go_evdev.StateMap)
|
r0 = ret.Get(0).(evdev.StateMap)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(evdev.EvType) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func(go_evdev.EvType) error); ok {
|
r1 = returnFunc(t)
|
||||||
r1 = rf(t)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,38 +266,30 @@ type MockEvdevDevice_State_Call struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// State is a helper method to define mock.On call
|
// State is a helper method to define mock.On call
|
||||||
// - t go_evdev.EvType
|
// - t evdev.EvType
|
||||||
func (_e *MockEvdevDevice_Expecter) State(t interface{}) *MockEvdevDevice_State_Call {
|
func (_e *MockEvdevDevice_Expecter) State(t any) *MockEvdevDevice_State_Call {
|
||||||
return &MockEvdevDevice_State_Call{Call: _e.mock.On("State", t)}
|
return &MockEvdevDevice_State_Call{Call: _e.mock.On("State", t)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_State_Call) Run(run func(t go_evdev.EvType)) *MockEvdevDevice_State_Call {
|
func (_c *MockEvdevDevice_State_Call) Run(run func(t evdev.EvType)) *MockEvdevDevice_State_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(go_evdev.EvType))
|
var arg0 evdev.EvType
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(evdev.EvType)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_State_Call) Return(_a0 go_evdev.StateMap, _a1 error) *MockEvdevDevice_State_Call {
|
func (_c *MockEvdevDevice_State_Call) Return(stateMap evdev.StateMap, err error) *MockEvdevDevice_State_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(stateMap, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockEvdevDevice_State_Call) RunAndReturn(run func(go_evdev.EvType) (go_evdev.StateMap, error)) *MockEvdevDevice_State_Call {
|
func (_c *MockEvdevDevice_State_Call) RunAndReturn(run func(t evdev.EvType) (evdev.StateMap, error)) *MockEvdevDevice_State_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockEvdevDevice creates a new instance of MockEvdevDevice. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockEvdevDevice(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockEvdevDevice {
|
|
||||||
mock := &MockEvdevDevice{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,12 +1,28 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package mocks_geolocation
|
package mocks_geolocation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
geolocation "github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation"
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockClient creates a new instance of MockClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockClient(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockClient {
|
||||||
|
mock := &MockClient{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockClient is an autogenerated mock type for the Client type
|
// MockClient is an autogenerated mock type for the Client type
|
||||||
type MockClient struct {
|
type MockClient struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -20,9 +36,10 @@ func (_m *MockClient) EXPECT() *MockClient_Expecter {
|
|||||||
return &MockClient_Expecter{mock: &_m.Mock}
|
return &MockClient_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close provides a mock function with no fields
|
// Close provides a mock function for the type MockClient
|
||||||
func (_m *MockClient) Close() {
|
func (_mock *MockClient) Close() {
|
||||||
_m.Called()
|
_mock.Called()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockClient_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
|
// MockClient_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
|
||||||
@@ -52,9 +69,9 @@ func (_c *MockClient_Close_Call) RunAndReturn(run func()) *MockClient_Close_Call
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLocation provides a mock function with no fields
|
// GetLocation provides a mock function for the type MockClient
|
||||||
func (_m *MockClient) GetLocation() (geolocation.Location, error) {
|
func (_mock *MockClient) GetLocation() (geolocation.Location, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetLocation")
|
panic("no return value specified for GetLocation")
|
||||||
@@ -62,21 +79,19 @@ func (_m *MockClient) GetLocation() (geolocation.Location, error) {
|
|||||||
|
|
||||||
var r0 geolocation.Location
|
var r0 geolocation.Location
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (geolocation.Location, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (geolocation.Location, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() geolocation.Location); ok {
|
if returnFunc, ok := ret.Get(0).(func() geolocation.Location); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(geolocation.Location)
|
r0 = ret.Get(0).(geolocation.Location)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,8 +112,8 @@ func (_c *MockClient_GetLocation_Call) Run(run func()) *MockClient_GetLocation_C
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockClient_GetLocation_Call) Return(_a0 geolocation.Location, _a1 error) *MockClient_GetLocation_Call {
|
func (_c *MockClient_GetLocation_Call) Return(location geolocation.Location, err error) *MockClient_GetLocation_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(location, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,23 +122,22 @@ func (_c *MockClient_GetLocation_Call) RunAndReturn(run func() (geolocation.Loca
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subscribe provides a mock function with given fields: id
|
// Subscribe provides a mock function for the type MockClient
|
||||||
func (_m *MockClient) Subscribe(id string) chan geolocation.Location {
|
func (_mock *MockClient) Subscribe(id string) chan geolocation.Location {
|
||||||
ret := _m.Called(id)
|
ret := _mock.Called(id)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Subscribe")
|
panic("no return value specified for Subscribe")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 chan geolocation.Location
|
var r0 chan geolocation.Location
|
||||||
if rf, ok := ret.Get(0).(func(string) chan geolocation.Location); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) chan geolocation.Location); ok {
|
||||||
r0 = rf(id)
|
r0 = returnFunc(id)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(chan geolocation.Location)
|
r0 = ret.Get(0).(chan geolocation.Location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,30 +148,37 @@ type MockClient_Subscribe_Call struct {
|
|||||||
|
|
||||||
// Subscribe is a helper method to define mock.On call
|
// Subscribe is a helper method to define mock.On call
|
||||||
// - id string
|
// - id string
|
||||||
func (_e *MockClient_Expecter) Subscribe(id interface{}) *MockClient_Subscribe_Call {
|
func (_e *MockClient_Expecter) Subscribe(id any) *MockClient_Subscribe_Call {
|
||||||
return &MockClient_Subscribe_Call{Call: _e.mock.On("Subscribe", id)}
|
return &MockClient_Subscribe_Call{Call: _e.mock.On("Subscribe", id)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockClient_Subscribe_Call) Run(run func(id string)) *MockClient_Subscribe_Call {
|
func (_c *MockClient_Subscribe_Call) Run(run func(id string)) *MockClient_Subscribe_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockClient_Subscribe_Call) Return(_a0 chan geolocation.Location) *MockClient_Subscribe_Call {
|
func (_c *MockClient_Subscribe_Call) Return(locationCh chan geolocation.Location) *MockClient_Subscribe_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(locationCh)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockClient_Subscribe_Call) RunAndReturn(run func(string) chan geolocation.Location) *MockClient_Subscribe_Call {
|
func (_c *MockClient_Subscribe_Call) RunAndReturn(run func(id string) chan geolocation.Location) *MockClient_Subscribe_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unsubscribe provides a mock function with given fields: id
|
// Unsubscribe provides a mock function for the type MockClient
|
||||||
func (_m *MockClient) Unsubscribe(id string) {
|
func (_mock *MockClient) Unsubscribe(id string) {
|
||||||
_m.Called(id)
|
_mock.Called(id)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockClient_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe'
|
// MockClient_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe'
|
||||||
@@ -167,13 +188,19 @@ type MockClient_Unsubscribe_Call struct {
|
|||||||
|
|
||||||
// Unsubscribe is a helper method to define mock.On call
|
// Unsubscribe is a helper method to define mock.On call
|
||||||
// - id string
|
// - id string
|
||||||
func (_e *MockClient_Expecter) Unsubscribe(id interface{}) *MockClient_Unsubscribe_Call {
|
func (_e *MockClient_Expecter) Unsubscribe(id any) *MockClient_Unsubscribe_Call {
|
||||||
return &MockClient_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe", id)}
|
return &MockClient_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe", id)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockClient_Unsubscribe_Call) Run(run func(id string)) *MockClient_Unsubscribe_Call {
|
func (_c *MockClient_Unsubscribe_Call) Run(run func(id string)) *MockClient_Unsubscribe_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
@@ -183,21 +210,7 @@ func (_c *MockClient_Unsubscribe_Call) Return() *MockClient_Unsubscribe_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockClient_Unsubscribe_Call) RunAndReturn(run func(string)) *MockClient_Unsubscribe_Call {
|
func (_c *MockClient_Unsubscribe_Call) RunAndReturn(run func(id string)) *MockClient_Unsubscribe_Call {
|
||||||
_c.Run(run)
|
_c.Run(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockClient creates a new instance of MockClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockClient(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockClient {
|
|
||||||
mock := &MockClient{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,14 +1,29 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package gonetworkmanager
|
package gonetworkmanager
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
|
"github.com/Wifx/gonetworkmanager/v2"
|
||||||
dbus "github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
|
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockAccessPoint creates a new instance of MockAccessPoint. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockAccessPoint(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockAccessPoint {
|
||||||
|
mock := &MockAccessPoint{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockAccessPoint is an autogenerated mock type for the AccessPoint type
|
// MockAccessPoint is an autogenerated mock type for the AccessPoint type
|
||||||
type MockAccessPoint struct {
|
type MockAccessPoint struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -22,21 +37,20 @@ func (_m *MockAccessPoint) EXPECT() *MockAccessPoint_Expecter {
|
|||||||
return &MockAccessPoint_Expecter{mock: &_m.Mock}
|
return &MockAccessPoint_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPath provides a mock function with no fields
|
// GetPath provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPath() dbus.ObjectPath {
|
func (_mock *MockAccessPoint) GetPath() dbus.ObjectPath {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPath")
|
panic("no return value specified for GetPath")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 dbus.ObjectPath
|
var r0 dbus.ObjectPath
|
||||||
if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(dbus.ObjectPath)
|
r0 = ret.Get(0).(dbus.ObjectPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,8 +71,8 @@ func (_c *MockAccessPoint_GetPath_Call) Run(run func()) *MockAccessPoint_GetPath
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPath_Call) Return(_a0 dbus.ObjectPath) *MockAccessPoint_GetPath_Call {
|
func (_c *MockAccessPoint_GetPath_Call) Return(objectPath dbus.ObjectPath) *MockAccessPoint_GetPath_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(objectPath)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,9 +81,9 @@ func (_c *MockAccessPoint_GetPath_Call) RunAndReturn(run func() dbus.ObjectPath)
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyFlags provides a mock function with no fields
|
// GetPropertyFlags provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyFlags() (uint32, error) {
|
func (_mock *MockAccessPoint) GetPropertyFlags() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyFlags")
|
panic("no return value specified for GetPropertyFlags")
|
||||||
@@ -77,21 +91,19 @@ func (_m *MockAccessPoint) GetPropertyFlags() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,8 +124,8 @@ func (_c *MockAccessPoint_GetPropertyFlags_Call) Run(run func()) *MockAccessPoin
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyFlags_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyFlags_Call {
|
func (_c *MockAccessPoint_GetPropertyFlags_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyFlags_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,9 +134,9 @@ func (_c *MockAccessPoint_GetPropertyFlags_Call) RunAndReturn(run func() (uint32
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyFrequency provides a mock function with no fields
|
// GetPropertyFrequency provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyFrequency() (uint32, error) {
|
func (_mock *MockAccessPoint) GetPropertyFrequency() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyFrequency")
|
panic("no return value specified for GetPropertyFrequency")
|
||||||
@@ -132,21 +144,19 @@ func (_m *MockAccessPoint) GetPropertyFrequency() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,8 +177,8 @@ func (_c *MockAccessPoint_GetPropertyFrequency_Call) Run(run func()) *MockAccess
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyFrequency_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyFrequency_Call {
|
func (_c *MockAccessPoint_GetPropertyFrequency_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyFrequency_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,9 +187,9 @@ func (_c *MockAccessPoint_GetPropertyFrequency_Call) RunAndReturn(run func() (ui
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyHWAddress provides a mock function with no fields
|
// GetPropertyHWAddress provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyHWAddress() (string, error) {
|
func (_mock *MockAccessPoint) GetPropertyHWAddress() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyHWAddress")
|
panic("no return value specified for GetPropertyHWAddress")
|
||||||
@@ -187,21 +197,19 @@ func (_m *MockAccessPoint) GetPropertyHWAddress() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,8 +230,8 @@ func (_c *MockAccessPoint_GetPropertyHWAddress_Call) Run(run func()) *MockAccess
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyHWAddress_Call) Return(_a0 string, _a1 error) *MockAccessPoint_GetPropertyHWAddress_Call {
|
func (_c *MockAccessPoint_GetPropertyHWAddress_Call) Return(s string, err error) *MockAccessPoint_GetPropertyHWAddress_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,9 +240,9 @@ func (_c *MockAccessPoint_GetPropertyHWAddress_Call) RunAndReturn(run func() (st
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyLastSeen provides a mock function with no fields
|
// GetPropertyLastSeen provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyLastSeen() (int32, error) {
|
func (_mock *MockAccessPoint) GetPropertyLastSeen() (int32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyLastSeen")
|
panic("no return value specified for GetPropertyLastSeen")
|
||||||
@@ -242,21 +250,19 @@ func (_m *MockAccessPoint) GetPropertyLastSeen() (int32, error) {
|
|||||||
|
|
||||||
var r0 int32
|
var r0 int32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (int32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (int32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() int32); ok {
|
if returnFunc, ok := ret.Get(0).(func() int32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(int32)
|
r0 = ret.Get(0).(int32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,8 +283,8 @@ func (_c *MockAccessPoint_GetPropertyLastSeen_Call) Run(run func()) *MockAccessP
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyLastSeen_Call) Return(_a0 int32, _a1 error) *MockAccessPoint_GetPropertyLastSeen_Call {
|
func (_c *MockAccessPoint_GetPropertyLastSeen_Call) Return(n int32, err error) *MockAccessPoint_GetPropertyLastSeen_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(n, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,9 +293,9 @@ func (_c *MockAccessPoint_GetPropertyLastSeen_Call) RunAndReturn(run func() (int
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyMaxBitrate provides a mock function with no fields
|
// GetPropertyMaxBitrate provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyMaxBitrate() (uint32, error) {
|
func (_mock *MockAccessPoint) GetPropertyMaxBitrate() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyMaxBitrate")
|
panic("no return value specified for GetPropertyMaxBitrate")
|
||||||
@@ -297,21 +303,19 @@ func (_m *MockAccessPoint) GetPropertyMaxBitrate() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,8 +336,8 @@ func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) Run(run func()) *MockAcces
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyMaxBitrate_Call {
|
func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyMaxBitrate_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,9 +346,9 @@ func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) RunAndReturn(run func() (u
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyMode provides a mock function with no fields
|
// GetPropertyMode provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyMode() (gonetworkmanager.Nm80211Mode, error) {
|
func (_mock *MockAccessPoint) GetPropertyMode() (gonetworkmanager.Nm80211Mode, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyMode")
|
panic("no return value specified for GetPropertyMode")
|
||||||
@@ -352,21 +356,19 @@ func (_m *MockAccessPoint) GetPropertyMode() (gonetworkmanager.Nm80211Mode, erro
|
|||||||
|
|
||||||
var r0 gonetworkmanager.Nm80211Mode
|
var r0 gonetworkmanager.Nm80211Mode
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.Nm80211Mode, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.Nm80211Mode, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.Nm80211Mode); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.Nm80211Mode); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.Nm80211Mode)
|
r0 = ret.Get(0).(gonetworkmanager.Nm80211Mode)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,8 +389,8 @@ func (_c *MockAccessPoint_GetPropertyMode_Call) Run(run func()) *MockAccessPoint
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyMode_Call) Return(_a0 gonetworkmanager.Nm80211Mode, _a1 error) *MockAccessPoint_GetPropertyMode_Call {
|
func (_c *MockAccessPoint_GetPropertyMode_Call) Return(nm80211Mode gonetworkmanager.Nm80211Mode, err error) *MockAccessPoint_GetPropertyMode_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(nm80211Mode, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,9 +399,9 @@ func (_c *MockAccessPoint_GetPropertyMode_Call) RunAndReturn(run func() (gonetwo
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyRSNFlags provides a mock function with no fields
|
// GetPropertyRSNFlags provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyRSNFlags() (uint32, error) {
|
func (_mock *MockAccessPoint) GetPropertyRSNFlags() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyRSNFlags")
|
panic("no return value specified for GetPropertyRSNFlags")
|
||||||
@@ -407,21 +409,19 @@ func (_m *MockAccessPoint) GetPropertyRSNFlags() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,8 +442,8 @@ func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) Run(run func()) *MockAccessP
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyRSNFlags_Call {
|
func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyRSNFlags_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,9 +452,9 @@ func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) RunAndReturn(run func() (uin
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertySSID provides a mock function with no fields
|
// GetPropertySSID provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertySSID() (string, error) {
|
func (_mock *MockAccessPoint) GetPropertySSID() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertySSID")
|
panic("no return value specified for GetPropertySSID")
|
||||||
@@ -462,21 +462,19 @@ func (_m *MockAccessPoint) GetPropertySSID() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -497,8 +495,8 @@ func (_c *MockAccessPoint_GetPropertySSID_Call) Run(run func()) *MockAccessPoint
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertySSID_Call) Return(_a0 string, _a1 error) *MockAccessPoint_GetPropertySSID_Call {
|
func (_c *MockAccessPoint_GetPropertySSID_Call) Return(s string, err error) *MockAccessPoint_GetPropertySSID_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,9 +505,9 @@ func (_c *MockAccessPoint_GetPropertySSID_Call) RunAndReturn(run func() (string,
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyStrength provides a mock function with no fields
|
// GetPropertyStrength provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyStrength() (uint8, error) {
|
func (_mock *MockAccessPoint) GetPropertyStrength() (uint8, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyStrength")
|
panic("no return value specified for GetPropertyStrength")
|
||||||
@@ -517,21 +515,19 @@ func (_m *MockAccessPoint) GetPropertyStrength() (uint8, error) {
|
|||||||
|
|
||||||
var r0 uint8
|
var r0 uint8
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint8, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint8, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint8); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint8); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint8)
|
r0 = ret.Get(0).(uint8)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -552,8 +548,8 @@ func (_c *MockAccessPoint_GetPropertyStrength_Call) Run(run func()) *MockAccessP
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyStrength_Call) Return(_a0 uint8, _a1 error) *MockAccessPoint_GetPropertyStrength_Call {
|
func (_c *MockAccessPoint_GetPropertyStrength_Call) Return(v uint8, err error) *MockAccessPoint_GetPropertyStrength_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -562,9 +558,9 @@ func (_c *MockAccessPoint_GetPropertyStrength_Call) RunAndReturn(run func() (uin
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyWPAFlags provides a mock function with no fields
|
// GetPropertyWPAFlags provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) GetPropertyWPAFlags() (uint32, error) {
|
func (_mock *MockAccessPoint) GetPropertyWPAFlags() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyWPAFlags")
|
panic("no return value specified for GetPropertyWPAFlags")
|
||||||
@@ -572,21 +568,19 @@ func (_m *MockAccessPoint) GetPropertyWPAFlags() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -607,8 +601,8 @@ func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) Run(run func()) *MockAccessP
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyWPAFlags_Call {
|
func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyWPAFlags_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,9 +611,9 @@ func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) RunAndReturn(run func() (uin
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON provides a mock function with no fields
|
// MarshalJSON provides a mock function for the type MockAccessPoint
|
||||||
func (_m *MockAccessPoint) MarshalJSON() ([]byte, error) {
|
func (_mock *MockAccessPoint) MarshalJSON() ([]byte, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for MarshalJSON")
|
panic("no return value specified for MarshalJSON")
|
||||||
@@ -627,23 +621,21 @@ func (_m *MockAccessPoint) MarshalJSON() ([]byte, error) {
|
|||||||
|
|
||||||
var r0 []byte
|
var r0 []byte
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]byte, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]byte, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []byte); ok {
|
if returnFunc, ok := ret.Get(0).(func() []byte); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]byte)
|
r0 = ret.Get(0).([]byte)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -664,8 +656,8 @@ func (_c *MockAccessPoint_MarshalJSON_Call) Run(run func()) *MockAccessPoint_Mar
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockAccessPoint_MarshalJSON_Call) Return(_a0 []byte, _a1 error) *MockAccessPoint_MarshalJSON_Call {
|
func (_c *MockAccessPoint_MarshalJSON_Call) Return(bytes []byte, err error) *MockAccessPoint_MarshalJSON_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(bytes, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -673,17 +665,3 @@ func (_c *MockAccessPoint_MarshalJSON_Call) RunAndReturn(run func() ([]byte, err
|
|||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockAccessPoint creates a new instance of MockAccessPoint. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockAccessPoint(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockAccessPoint {
|
|
||||||
mock := &MockAccessPoint{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
+221
-243
@@ -1,14 +1,29 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package gonetworkmanager
|
package gonetworkmanager
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
|
"github.com/Wifx/gonetworkmanager/v2"
|
||||||
dbus "github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
|
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockActiveConnection creates a new instance of MockActiveConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockActiveConnection(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockActiveConnection {
|
||||||
|
mock := &MockActiveConnection{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockActiveConnection is an autogenerated mock type for the ActiveConnection type
|
// MockActiveConnection is an autogenerated mock type for the ActiveConnection type
|
||||||
type MockActiveConnection struct {
|
type MockActiveConnection struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -22,21 +37,20 @@ func (_m *MockActiveConnection) EXPECT() *MockActiveConnection_Expecter {
|
|||||||
return &MockActiveConnection_Expecter{mock: &_m.Mock}
|
return &MockActiveConnection_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPath provides a mock function with no fields
|
// GetPath provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPath() dbus.ObjectPath {
|
func (_mock *MockActiveConnection) GetPath() dbus.ObjectPath {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPath")
|
panic("no return value specified for GetPath")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 dbus.ObjectPath
|
var r0 dbus.ObjectPath
|
||||||
if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(dbus.ObjectPath)
|
r0 = ret.Get(0).(dbus.ObjectPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,8 +71,8 @@ func (_c *MockActiveConnection_GetPath_Call) Run(run func()) *MockActiveConnecti
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPath_Call) Return(_a0 dbus.ObjectPath) *MockActiveConnection_GetPath_Call {
|
func (_c *MockActiveConnection_GetPath_Call) Return(objectPath dbus.ObjectPath) *MockActiveConnection_GetPath_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(objectPath)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,9 +81,9 @@ func (_c *MockActiveConnection_GetPath_Call) RunAndReturn(run func() dbus.Object
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyConnection provides a mock function with no fields
|
// GetPropertyConnection provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyConnection() (gonetworkmanager.Connection, error) {
|
func (_mock *MockActiveConnection) GetPropertyConnection() (gonetworkmanager.Connection, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyConnection")
|
panic("no return value specified for GetPropertyConnection")
|
||||||
@@ -77,23 +91,21 @@ func (_m *MockActiveConnection) GetPropertyConnection() (gonetworkmanager.Connec
|
|||||||
|
|
||||||
var r0 gonetworkmanager.Connection
|
var r0 gonetworkmanager.Connection
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.Connection, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.Connection, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.Connection); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.Connection); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,8 +126,8 @@ func (_c *MockActiveConnection_GetPropertyConnection_Call) Run(run func()) *Mock
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyConnection_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockActiveConnection_GetPropertyConnection_Call {
|
func (_c *MockActiveConnection_GetPropertyConnection_Call) Return(connection gonetworkmanager.Connection, err error) *MockActiveConnection_GetPropertyConnection_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(connection, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,9 +136,9 @@ func (_c *MockActiveConnection_GetPropertyConnection_Call) RunAndReturn(run func
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDHCP4Config provides a mock function with no fields
|
// GetPropertyDHCP4Config provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyDHCP4Config() (gonetworkmanager.DHCP4Config, error) {
|
func (_mock *MockActiveConnection) GetPropertyDHCP4Config() (gonetworkmanager.DHCP4Config, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDHCP4Config")
|
panic("no return value specified for GetPropertyDHCP4Config")
|
||||||
@@ -134,23 +146,21 @@ func (_m *MockActiveConnection) GetPropertyDHCP4Config() (gonetworkmanager.DHCP4
|
|||||||
|
|
||||||
var r0 gonetworkmanager.DHCP4Config
|
var r0 gonetworkmanager.DHCP4Config
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.DHCP4Config, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.DHCP4Config, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.DHCP4Config); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.DHCP4Config); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.DHCP4Config)
|
r0 = ret.Get(0).(gonetworkmanager.DHCP4Config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,8 +181,8 @@ func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) Run(run func()) *Moc
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) Return(_a0 gonetworkmanager.DHCP4Config, _a1 error) *MockActiveConnection_GetPropertyDHCP4Config_Call {
|
func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) Return(dHCP4Config gonetworkmanager.DHCP4Config, err error) *MockActiveConnection_GetPropertyDHCP4Config_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(dHCP4Config, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,9 +191,9 @@ func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) RunAndReturn(run fun
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDHCP6Config provides a mock function with no fields
|
// GetPropertyDHCP6Config provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyDHCP6Config() (gonetworkmanager.DHCP6Config, error) {
|
func (_mock *MockActiveConnection) GetPropertyDHCP6Config() (gonetworkmanager.DHCP6Config, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDHCP6Config")
|
panic("no return value specified for GetPropertyDHCP6Config")
|
||||||
@@ -191,23 +201,21 @@ func (_m *MockActiveConnection) GetPropertyDHCP6Config() (gonetworkmanager.DHCP6
|
|||||||
|
|
||||||
var r0 gonetworkmanager.DHCP6Config
|
var r0 gonetworkmanager.DHCP6Config
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.DHCP6Config, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.DHCP6Config, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.DHCP6Config); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.DHCP6Config); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.DHCP6Config)
|
r0 = ret.Get(0).(gonetworkmanager.DHCP6Config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,8 +236,8 @@ func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) Run(run func()) *Moc
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) Return(_a0 gonetworkmanager.DHCP6Config, _a1 error) *MockActiveConnection_GetPropertyDHCP6Config_Call {
|
func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) Return(dHCP6Config gonetworkmanager.DHCP6Config, err error) *MockActiveConnection_GetPropertyDHCP6Config_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(dHCP6Config, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,9 +246,9 @@ func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) RunAndReturn(run fun
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDefault provides a mock function with no fields
|
// GetPropertyDefault provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyDefault() (bool, error) {
|
func (_mock *MockActiveConnection) GetPropertyDefault() (bool, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDefault")
|
panic("no return value specified for GetPropertyDefault")
|
||||||
@@ -248,21 +256,19 @@ func (_m *MockActiveConnection) GetPropertyDefault() (bool, error) {
|
|||||||
|
|
||||||
var r0 bool
|
var r0 bool
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (bool, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() bool); ok {
|
if returnFunc, ok := ret.Get(0).(func() bool); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(bool)
|
r0 = ret.Get(0).(bool)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,8 +289,8 @@ func (_c *MockActiveConnection_GetPropertyDefault_Call) Run(run func()) *MockAct
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyDefault_Call) Return(_a0 bool, _a1 error) *MockActiveConnection_GetPropertyDefault_Call {
|
func (_c *MockActiveConnection_GetPropertyDefault_Call) Return(b bool, err error) *MockActiveConnection_GetPropertyDefault_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(b, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,9 +299,9 @@ func (_c *MockActiveConnection_GetPropertyDefault_Call) RunAndReturn(run func()
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDefault6 provides a mock function with no fields
|
// GetPropertyDefault6 provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyDefault6() (bool, error) {
|
func (_mock *MockActiveConnection) GetPropertyDefault6() (bool, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDefault6")
|
panic("no return value specified for GetPropertyDefault6")
|
||||||
@@ -303,21 +309,19 @@ func (_m *MockActiveConnection) GetPropertyDefault6() (bool, error) {
|
|||||||
|
|
||||||
var r0 bool
|
var r0 bool
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (bool, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() bool); ok {
|
if returnFunc, ok := ret.Get(0).(func() bool); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(bool)
|
r0 = ret.Get(0).(bool)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,8 +342,8 @@ func (_c *MockActiveConnection_GetPropertyDefault6_Call) Run(run func()) *MockAc
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyDefault6_Call) Return(_a0 bool, _a1 error) *MockActiveConnection_GetPropertyDefault6_Call {
|
func (_c *MockActiveConnection_GetPropertyDefault6_Call) Return(b bool, err error) *MockActiveConnection_GetPropertyDefault6_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(b, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,9 +352,9 @@ func (_c *MockActiveConnection_GetPropertyDefault6_Call) RunAndReturn(run func()
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDevices provides a mock function with no fields
|
// GetPropertyDevices provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyDevices() ([]gonetworkmanager.Device, error) {
|
func (_mock *MockActiveConnection) GetPropertyDevices() ([]gonetworkmanager.Device, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDevices")
|
panic("no return value specified for GetPropertyDevices")
|
||||||
@@ -358,23 +362,21 @@ func (_m *MockActiveConnection) GetPropertyDevices() ([]gonetworkmanager.Device,
|
|||||||
|
|
||||||
var r0 []gonetworkmanager.Device
|
var r0 []gonetworkmanager.Device
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.Device, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.Device, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []gonetworkmanager.Device); ok {
|
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.Device); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]gonetworkmanager.Device)
|
r0 = ret.Get(0).([]gonetworkmanager.Device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,8 +397,8 @@ func (_c *MockActiveConnection_GetPropertyDevices_Call) Run(run func()) *MockAct
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyDevices_Call) Return(_a0 []gonetworkmanager.Device, _a1 error) *MockActiveConnection_GetPropertyDevices_Call {
|
func (_c *MockActiveConnection_GetPropertyDevices_Call) Return(devices []gonetworkmanager.Device, err error) *MockActiveConnection_GetPropertyDevices_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(devices, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,9 +407,9 @@ func (_c *MockActiveConnection_GetPropertyDevices_Call) RunAndReturn(run func()
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyID provides a mock function with no fields
|
// GetPropertyID provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyID() (string, error) {
|
func (_mock *MockActiveConnection) GetPropertyID() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyID")
|
panic("no return value specified for GetPropertyID")
|
||||||
@@ -415,21 +417,19 @@ func (_m *MockActiveConnection) GetPropertyID() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,8 +450,8 @@ func (_c *MockActiveConnection_GetPropertyID_Call) Run(run func()) *MockActiveCo
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyID_Call) Return(_a0 string, _a1 error) *MockActiveConnection_GetPropertyID_Call {
|
func (_c *MockActiveConnection_GetPropertyID_Call) Return(s string, err error) *MockActiveConnection_GetPropertyID_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -460,9 +460,9 @@ func (_c *MockActiveConnection_GetPropertyID_Call) RunAndReturn(run func() (stri
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyIP4Config provides a mock function with no fields
|
// GetPropertyIP4Config provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyIP4Config() (gonetworkmanager.IP4Config, error) {
|
func (_mock *MockActiveConnection) GetPropertyIP4Config() (gonetworkmanager.IP4Config, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyIP4Config")
|
panic("no return value specified for GetPropertyIP4Config")
|
||||||
@@ -470,23 +470,21 @@ func (_m *MockActiveConnection) GetPropertyIP4Config() (gonetworkmanager.IP4Conf
|
|||||||
|
|
||||||
var r0 gonetworkmanager.IP4Config
|
var r0 gonetworkmanager.IP4Config
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.IP4Config, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.IP4Config, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.IP4Config); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.IP4Config); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.IP4Config)
|
r0 = ret.Get(0).(gonetworkmanager.IP4Config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,8 +505,8 @@ func (_c *MockActiveConnection_GetPropertyIP4Config_Call) Run(run func()) *MockA
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyIP4Config_Call) Return(_a0 gonetworkmanager.IP4Config, _a1 error) *MockActiveConnection_GetPropertyIP4Config_Call {
|
func (_c *MockActiveConnection_GetPropertyIP4Config_Call) Return(iP4Config gonetworkmanager.IP4Config, err error) *MockActiveConnection_GetPropertyIP4Config_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(iP4Config, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -517,9 +515,9 @@ func (_c *MockActiveConnection_GetPropertyIP4Config_Call) RunAndReturn(run func(
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyIP6Config provides a mock function with no fields
|
// GetPropertyIP6Config provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyIP6Config() (gonetworkmanager.IP6Config, error) {
|
func (_mock *MockActiveConnection) GetPropertyIP6Config() (gonetworkmanager.IP6Config, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyIP6Config")
|
panic("no return value specified for GetPropertyIP6Config")
|
||||||
@@ -527,23 +525,21 @@ func (_m *MockActiveConnection) GetPropertyIP6Config() (gonetworkmanager.IP6Conf
|
|||||||
|
|
||||||
var r0 gonetworkmanager.IP6Config
|
var r0 gonetworkmanager.IP6Config
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.IP6Config, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.IP6Config, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.IP6Config); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.IP6Config); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.IP6Config)
|
r0 = ret.Get(0).(gonetworkmanager.IP6Config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,8 +560,8 @@ func (_c *MockActiveConnection_GetPropertyIP6Config_Call) Run(run func()) *MockA
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyIP6Config_Call) Return(_a0 gonetworkmanager.IP6Config, _a1 error) *MockActiveConnection_GetPropertyIP6Config_Call {
|
func (_c *MockActiveConnection_GetPropertyIP6Config_Call) Return(iP6Config gonetworkmanager.IP6Config, err error) *MockActiveConnection_GetPropertyIP6Config_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(iP6Config, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,9 +570,9 @@ func (_c *MockActiveConnection_GetPropertyIP6Config_Call) RunAndReturn(run func(
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyMaster provides a mock function with no fields
|
// GetPropertyMaster provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyMaster() (gonetworkmanager.Device, error) {
|
func (_mock *MockActiveConnection) GetPropertyMaster() (gonetworkmanager.Device, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyMaster")
|
panic("no return value specified for GetPropertyMaster")
|
||||||
@@ -584,23 +580,21 @@ func (_m *MockActiveConnection) GetPropertyMaster() (gonetworkmanager.Device, er
|
|||||||
|
|
||||||
var r0 gonetworkmanager.Device
|
var r0 gonetworkmanager.Device
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.Device, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.Device, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.Device); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.Device); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.Device)
|
r0 = ret.Get(0).(gonetworkmanager.Device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,8 +615,8 @@ func (_c *MockActiveConnection_GetPropertyMaster_Call) Run(run func()) *MockActi
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyMaster_Call) Return(_a0 gonetworkmanager.Device, _a1 error) *MockActiveConnection_GetPropertyMaster_Call {
|
func (_c *MockActiveConnection_GetPropertyMaster_Call) Return(device gonetworkmanager.Device, err error) *MockActiveConnection_GetPropertyMaster_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(device, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -631,9 +625,9 @@ func (_c *MockActiveConnection_GetPropertyMaster_Call) RunAndReturn(run func() (
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertySpecificObject provides a mock function with no fields
|
// GetPropertySpecificObject provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertySpecificObject() (gonetworkmanager.AccessPoint, error) {
|
func (_mock *MockActiveConnection) GetPropertySpecificObject() (gonetworkmanager.AccessPoint, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertySpecificObject")
|
panic("no return value specified for GetPropertySpecificObject")
|
||||||
@@ -641,23 +635,21 @@ func (_m *MockActiveConnection) GetPropertySpecificObject() (gonetworkmanager.Ac
|
|||||||
|
|
||||||
var r0 gonetworkmanager.AccessPoint
|
var r0 gonetworkmanager.AccessPoint
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.AccessPoint, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.AccessPoint, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.AccessPoint); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.AccessPoint); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.AccessPoint)
|
r0 = ret.Get(0).(gonetworkmanager.AccessPoint)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -678,8 +670,8 @@ func (_c *MockActiveConnection_GetPropertySpecificObject_Call) Run(run func()) *
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertySpecificObject_Call) Return(_a0 gonetworkmanager.AccessPoint, _a1 error) *MockActiveConnection_GetPropertySpecificObject_Call {
|
func (_c *MockActiveConnection_GetPropertySpecificObject_Call) Return(accessPoint gonetworkmanager.AccessPoint, err error) *MockActiveConnection_GetPropertySpecificObject_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(accessPoint, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -688,9 +680,9 @@ func (_c *MockActiveConnection_GetPropertySpecificObject_Call) RunAndReturn(run
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyState provides a mock function with no fields
|
// GetPropertyState provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyState() (gonetworkmanager.NmActiveConnectionState, error) {
|
func (_mock *MockActiveConnection) GetPropertyState() (gonetworkmanager.NmActiveConnectionState, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyState")
|
panic("no return value specified for GetPropertyState")
|
||||||
@@ -698,21 +690,19 @@ func (_m *MockActiveConnection) GetPropertyState() (gonetworkmanager.NmActiveCon
|
|||||||
|
|
||||||
var r0 gonetworkmanager.NmActiveConnectionState
|
var r0 gonetworkmanager.NmActiveConnectionState
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.NmActiveConnectionState, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.NmActiveConnectionState, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.NmActiveConnectionState); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.NmActiveConnectionState); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.NmActiveConnectionState)
|
r0 = ret.Get(0).(gonetworkmanager.NmActiveConnectionState)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -733,8 +723,8 @@ func (_c *MockActiveConnection_GetPropertyState_Call) Run(run func()) *MockActiv
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyState_Call) Return(_a0 gonetworkmanager.NmActiveConnectionState, _a1 error) *MockActiveConnection_GetPropertyState_Call {
|
func (_c *MockActiveConnection_GetPropertyState_Call) Return(nmActiveConnectionState gonetworkmanager.NmActiveConnectionState, err error) *MockActiveConnection_GetPropertyState_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(nmActiveConnectionState, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -743,9 +733,9 @@ func (_c *MockActiveConnection_GetPropertyState_Call) RunAndReturn(run func() (g
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyStateFlags provides a mock function with no fields
|
// GetPropertyStateFlags provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyStateFlags() (uint32, error) {
|
func (_mock *MockActiveConnection) GetPropertyStateFlags() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyStateFlags")
|
panic("no return value specified for GetPropertyStateFlags")
|
||||||
@@ -753,21 +743,19 @@ func (_m *MockActiveConnection) GetPropertyStateFlags() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -788,8 +776,8 @@ func (_c *MockActiveConnection_GetPropertyStateFlags_Call) Run(run func()) *Mock
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyStateFlags_Call) Return(_a0 uint32, _a1 error) *MockActiveConnection_GetPropertyStateFlags_Call {
|
func (_c *MockActiveConnection_GetPropertyStateFlags_Call) Return(v uint32, err error) *MockActiveConnection_GetPropertyStateFlags_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -798,9 +786,9 @@ func (_c *MockActiveConnection_GetPropertyStateFlags_Call) RunAndReturn(run func
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyType provides a mock function with no fields
|
// GetPropertyType provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyType() (string, error) {
|
func (_mock *MockActiveConnection) GetPropertyType() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyType")
|
panic("no return value specified for GetPropertyType")
|
||||||
@@ -808,21 +796,19 @@ func (_m *MockActiveConnection) GetPropertyType() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -843,8 +829,8 @@ func (_c *MockActiveConnection_GetPropertyType_Call) Run(run func()) *MockActive
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyType_Call) Return(_a0 string, _a1 error) *MockActiveConnection_GetPropertyType_Call {
|
func (_c *MockActiveConnection_GetPropertyType_Call) Return(s string, err error) *MockActiveConnection_GetPropertyType_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -853,9 +839,9 @@ func (_c *MockActiveConnection_GetPropertyType_Call) RunAndReturn(run func() (st
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyUUID provides a mock function with no fields
|
// GetPropertyUUID provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyUUID() (string, error) {
|
func (_mock *MockActiveConnection) GetPropertyUUID() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyUUID")
|
panic("no return value specified for GetPropertyUUID")
|
||||||
@@ -863,21 +849,19 @@ func (_m *MockActiveConnection) GetPropertyUUID() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -898,8 +882,8 @@ func (_c *MockActiveConnection_GetPropertyUUID_Call) Run(run func()) *MockActive
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyUUID_Call) Return(_a0 string, _a1 error) *MockActiveConnection_GetPropertyUUID_Call {
|
func (_c *MockActiveConnection_GetPropertyUUID_Call) Return(s string, err error) *MockActiveConnection_GetPropertyUUID_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -908,9 +892,9 @@ func (_c *MockActiveConnection_GetPropertyUUID_Call) RunAndReturn(run func() (st
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyVPN provides a mock function with no fields
|
// GetPropertyVPN provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) GetPropertyVPN() (bool, error) {
|
func (_mock *MockActiveConnection) GetPropertyVPN() (bool, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyVPN")
|
panic("no return value specified for GetPropertyVPN")
|
||||||
@@ -918,21 +902,19 @@ func (_m *MockActiveConnection) GetPropertyVPN() (bool, error) {
|
|||||||
|
|
||||||
var r0 bool
|
var r0 bool
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (bool, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() bool); ok {
|
if returnFunc, ok := ret.Get(0).(func() bool); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(bool)
|
r0 = ret.Get(0).(bool)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -953,8 +935,8 @@ func (_c *MockActiveConnection_GetPropertyVPN_Call) Run(run func()) *MockActiveC
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_GetPropertyVPN_Call) Return(_a0 bool, _a1 error) *MockActiveConnection_GetPropertyVPN_Call {
|
func (_c *MockActiveConnection_GetPropertyVPN_Call) Return(b bool, err error) *MockActiveConnection_GetPropertyVPN_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(b, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -963,21 +945,20 @@ func (_c *MockActiveConnection_GetPropertyVPN_Call) RunAndReturn(run func() (boo
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SubscribeState provides a mock function with given fields: receiver, exit
|
// SubscribeState provides a mock function for the type MockActiveConnection
|
||||||
func (_m *MockActiveConnection) SubscribeState(receiver chan gonetworkmanager.StateChange, exit chan struct{}) error {
|
func (_mock *MockActiveConnection) SubscribeState(receiver chan gonetworkmanager.StateChange, exit chan struct{}) error {
|
||||||
ret := _m.Called(receiver, exit)
|
ret := _mock.Called(receiver, exit)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for SubscribeState")
|
panic("no return value specified for SubscribeState")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(chan gonetworkmanager.StateChange, chan struct{}) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(chan gonetworkmanager.StateChange, chan struct{}) error); ok {
|
||||||
r0 = rf(receiver, exit)
|
r0 = returnFunc(receiver, exit)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -989,13 +970,24 @@ type MockActiveConnection_SubscribeState_Call struct {
|
|||||||
// SubscribeState is a helper method to define mock.On call
|
// SubscribeState is a helper method to define mock.On call
|
||||||
// - receiver chan gonetworkmanager.StateChange
|
// - receiver chan gonetworkmanager.StateChange
|
||||||
// - exit chan struct{}
|
// - exit chan struct{}
|
||||||
func (_e *MockActiveConnection_Expecter) SubscribeState(receiver interface{}, exit interface{}) *MockActiveConnection_SubscribeState_Call {
|
func (_e *MockActiveConnection_Expecter) SubscribeState(receiver any, exit any) *MockActiveConnection_SubscribeState_Call {
|
||||||
return &MockActiveConnection_SubscribeState_Call{Call: _e.mock.On("SubscribeState", receiver, exit)}
|
return &MockActiveConnection_SubscribeState_Call{Call: _e.mock.On("SubscribeState", receiver, exit)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_SubscribeState_Call) Run(run func(receiver chan gonetworkmanager.StateChange, exit chan struct{})) *MockActiveConnection_SubscribeState_Call {
|
func (_c *MockActiveConnection_SubscribeState_Call) Run(run func(receiver chan gonetworkmanager.StateChange, exit chan struct{})) *MockActiveConnection_SubscribeState_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(chan gonetworkmanager.StateChange), args[1].(chan struct{}))
|
var arg0 chan gonetworkmanager.StateChange
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(chan gonetworkmanager.StateChange)
|
||||||
|
}
|
||||||
|
var arg1 chan struct{}
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(chan struct{})
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
@@ -1005,21 +997,7 @@ func (_c *MockActiveConnection_SubscribeState_Call) Return(err error) *MockActiv
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockActiveConnection_SubscribeState_Call) RunAndReturn(run func(chan gonetworkmanager.StateChange, chan struct{}) error) *MockActiveConnection_SubscribeState_Call {
|
func (_c *MockActiveConnection_SubscribeState_Call) RunAndReturn(run func(receiver chan gonetworkmanager.StateChange, exit chan struct{}) error) *MockActiveConnection_SubscribeState_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockActiveConnection creates a new instance of MockActiveConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockActiveConnection(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockActiveConnection {
|
|
||||||
mock := &MockActiveConnection{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,14 +1,29 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package gonetworkmanager
|
package gonetworkmanager
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
|
"github.com/Wifx/gonetworkmanager/v2"
|
||||||
dbus "github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
|
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockConnection creates a new instance of MockConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockConnection(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockConnection {
|
||||||
|
mock := &MockConnection{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockConnection is an autogenerated mock type for the Connection type
|
// MockConnection is an autogenerated mock type for the Connection type
|
||||||
type MockConnection struct {
|
type MockConnection struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -22,21 +37,20 @@ func (_m *MockConnection) EXPECT() *MockConnection_Expecter {
|
|||||||
return &MockConnection_Expecter{mock: &_m.Mock}
|
return &MockConnection_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearSecrets provides a mock function with no fields
|
// ClearSecrets provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) ClearSecrets() error {
|
func (_mock *MockConnection) ClearSecrets() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for ClearSecrets")
|
panic("no return value specified for ClearSecrets")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,8 +71,8 @@ func (_c *MockConnection_ClearSecrets_Call) Run(run func()) *MockConnection_Clea
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_ClearSecrets_Call) Return(_a0 error) *MockConnection_ClearSecrets_Call {
|
func (_c *MockConnection_ClearSecrets_Call) Return(err error) *MockConnection_ClearSecrets_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,21 +81,20 @@ func (_c *MockConnection_ClearSecrets_Call) RunAndReturn(run func() error) *Mock
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete provides a mock function with no fields
|
// Delete provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) Delete() error {
|
func (_mock *MockConnection) Delete() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Delete")
|
panic("no return value specified for Delete")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,8 +115,8 @@ func (_c *MockConnection_Delete_Call) Run(run func()) *MockConnection_Delete_Cal
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_Delete_Call) Return(_a0 error) *MockConnection_Delete_Call {
|
func (_c *MockConnection_Delete_Call) Return(err error) *MockConnection_Delete_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,21 +125,20 @@ func (_c *MockConnection_Delete_Call) RunAndReturn(run func() error) *MockConnec
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPath provides a mock function with no fields
|
// GetPath provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) GetPath() dbus.ObjectPath {
|
func (_mock *MockConnection) GetPath() dbus.ObjectPath {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPath")
|
panic("no return value specified for GetPath")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 dbus.ObjectPath
|
var r0 dbus.ObjectPath
|
||||||
if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(dbus.ObjectPath)
|
r0 = ret.Get(0).(dbus.ObjectPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,8 +159,8 @@ func (_c *MockConnection_GetPath_Call) Run(run func()) *MockConnection_GetPath_C
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetPath_Call) Return(_a0 dbus.ObjectPath) *MockConnection_GetPath_Call {
|
func (_c *MockConnection_GetPath_Call) Return(objectPath dbus.ObjectPath) *MockConnection_GetPath_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(objectPath)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,9 +169,9 @@ func (_c *MockConnection_GetPath_Call) RunAndReturn(run func() dbus.ObjectPath)
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyFilename provides a mock function with no fields
|
// GetPropertyFilename provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) GetPropertyFilename() (string, error) {
|
func (_mock *MockConnection) GetPropertyFilename() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyFilename")
|
panic("no return value specified for GetPropertyFilename")
|
||||||
@@ -167,21 +179,19 @@ func (_m *MockConnection) GetPropertyFilename() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,8 +212,8 @@ func (_c *MockConnection_GetPropertyFilename_Call) Run(run func()) *MockConnecti
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetPropertyFilename_Call) Return(_a0 string, _a1 error) *MockConnection_GetPropertyFilename_Call {
|
func (_c *MockConnection_GetPropertyFilename_Call) Return(s string, err error) *MockConnection_GetPropertyFilename_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,9 +222,9 @@ func (_c *MockConnection_GetPropertyFilename_Call) RunAndReturn(run func() (stri
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyFlags provides a mock function with no fields
|
// GetPropertyFlags provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) GetPropertyFlags() (uint32, error) {
|
func (_mock *MockConnection) GetPropertyFlags() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyFlags")
|
panic("no return value specified for GetPropertyFlags")
|
||||||
@@ -222,21 +232,19 @@ func (_m *MockConnection) GetPropertyFlags() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,8 +265,8 @@ func (_c *MockConnection_GetPropertyFlags_Call) Run(run func()) *MockConnection_
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetPropertyFlags_Call) Return(_a0 uint32, _a1 error) *MockConnection_GetPropertyFlags_Call {
|
func (_c *MockConnection_GetPropertyFlags_Call) Return(v uint32, err error) *MockConnection_GetPropertyFlags_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,9 +275,9 @@ func (_c *MockConnection_GetPropertyFlags_Call) RunAndReturn(run func() (uint32,
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyUnsaved provides a mock function with no fields
|
// GetPropertyUnsaved provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) GetPropertyUnsaved() (bool, error) {
|
func (_mock *MockConnection) GetPropertyUnsaved() (bool, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyUnsaved")
|
panic("no return value specified for GetPropertyUnsaved")
|
||||||
@@ -277,21 +285,19 @@ func (_m *MockConnection) GetPropertyUnsaved() (bool, error) {
|
|||||||
|
|
||||||
var r0 bool
|
var r0 bool
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (bool, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() bool); ok {
|
if returnFunc, ok := ret.Get(0).(func() bool); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(bool)
|
r0 = ret.Get(0).(bool)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,8 +318,8 @@ func (_c *MockConnection_GetPropertyUnsaved_Call) Run(run func()) *MockConnectio
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetPropertyUnsaved_Call) Return(_a0 bool, _a1 error) *MockConnection_GetPropertyUnsaved_Call {
|
func (_c *MockConnection_GetPropertyUnsaved_Call) Return(b bool, err error) *MockConnection_GetPropertyUnsaved_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(b, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,9 +328,9 @@ func (_c *MockConnection_GetPropertyUnsaved_Call) RunAndReturn(run func() (bool,
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSecrets provides a mock function with given fields: settingName
|
// GetSecrets provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) GetSecrets(settingName string) (gonetworkmanager.ConnectionSettings, error) {
|
func (_mock *MockConnection) GetSecrets(settingName string) (gonetworkmanager.ConnectionSettings, error) {
|
||||||
ret := _m.Called(settingName)
|
ret := _mock.Called(settingName)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetSecrets")
|
panic("no return value specified for GetSecrets")
|
||||||
@@ -332,23 +338,21 @@ func (_m *MockConnection) GetSecrets(settingName string) (gonetworkmanager.Conne
|
|||||||
|
|
||||||
var r0 gonetworkmanager.ConnectionSettings
|
var r0 gonetworkmanager.ConnectionSettings
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(string) (gonetworkmanager.ConnectionSettings, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) (gonetworkmanager.ConnectionSettings, error)); ok {
|
||||||
return rf(settingName)
|
return returnFunc(settingName)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(string) gonetworkmanager.ConnectionSettings); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) gonetworkmanager.ConnectionSettings); ok {
|
||||||
r0 = rf(settingName)
|
r0 = returnFunc(settingName)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings)
|
r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
r1 = returnFunc(settingName)
|
||||||
r1 = rf(settingName)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,30 +363,36 @@ type MockConnection_GetSecrets_Call struct {
|
|||||||
|
|
||||||
// GetSecrets is a helper method to define mock.On call
|
// GetSecrets is a helper method to define mock.On call
|
||||||
// - settingName string
|
// - settingName string
|
||||||
func (_e *MockConnection_Expecter) GetSecrets(settingName interface{}) *MockConnection_GetSecrets_Call {
|
func (_e *MockConnection_Expecter) GetSecrets(settingName any) *MockConnection_GetSecrets_Call {
|
||||||
return &MockConnection_GetSecrets_Call{Call: _e.mock.On("GetSecrets", settingName)}
|
return &MockConnection_GetSecrets_Call{Call: _e.mock.On("GetSecrets", settingName)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetSecrets_Call) Run(run func(settingName string)) *MockConnection_GetSecrets_Call {
|
func (_c *MockConnection_GetSecrets_Call) Run(run func(settingName string)) *MockConnection_GetSecrets_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetSecrets_Call) Return(_a0 gonetworkmanager.ConnectionSettings, _a1 error) *MockConnection_GetSecrets_Call {
|
func (_c *MockConnection_GetSecrets_Call) Return(connectionSettings gonetworkmanager.ConnectionSettings, err error) *MockConnection_GetSecrets_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(connectionSettings, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetSecrets_Call) RunAndReturn(run func(string) (gonetworkmanager.ConnectionSettings, error)) *MockConnection_GetSecrets_Call {
|
func (_c *MockConnection_GetSecrets_Call) RunAndReturn(run func(settingName string) (gonetworkmanager.ConnectionSettings, error)) *MockConnection_GetSecrets_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSettings provides a mock function with no fields
|
// GetSettings provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) GetSettings() (gonetworkmanager.ConnectionSettings, error) {
|
func (_mock *MockConnection) GetSettings() (gonetworkmanager.ConnectionSettings, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetSettings")
|
panic("no return value specified for GetSettings")
|
||||||
@@ -390,23 +400,21 @@ func (_m *MockConnection) GetSettings() (gonetworkmanager.ConnectionSettings, er
|
|||||||
|
|
||||||
var r0 gonetworkmanager.ConnectionSettings
|
var r0 gonetworkmanager.ConnectionSettings
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (gonetworkmanager.ConnectionSettings, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.ConnectionSettings, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() gonetworkmanager.ConnectionSettings); ok {
|
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.ConnectionSettings); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings)
|
r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -427,8 +435,8 @@ func (_c *MockConnection_GetSettings_Call) Run(run func()) *MockConnection_GetSe
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_GetSettings_Call) Return(_a0 gonetworkmanager.ConnectionSettings, _a1 error) *MockConnection_GetSettings_Call {
|
func (_c *MockConnection_GetSettings_Call) Return(connectionSettings gonetworkmanager.ConnectionSettings, err error) *MockConnection_GetSettings_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(connectionSettings, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,9 +445,9 @@ func (_c *MockConnection_GetSettings_Call) RunAndReturn(run func() (gonetworkman
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON provides a mock function with no fields
|
// MarshalJSON provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) MarshalJSON() ([]byte, error) {
|
func (_mock *MockConnection) MarshalJSON() ([]byte, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for MarshalJSON")
|
panic("no return value specified for MarshalJSON")
|
||||||
@@ -447,23 +455,21 @@ func (_m *MockConnection) MarshalJSON() ([]byte, error) {
|
|||||||
|
|
||||||
var r0 []byte
|
var r0 []byte
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]byte, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]byte, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []byte); ok {
|
if returnFunc, ok := ret.Get(0).(func() []byte); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]byte)
|
r0 = ret.Get(0).([]byte)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,8 +490,8 @@ func (_c *MockConnection_MarshalJSON_Call) Run(run func()) *MockConnection_Marsh
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_MarshalJSON_Call) Return(_a0 []byte, _a1 error) *MockConnection_MarshalJSON_Call {
|
func (_c *MockConnection_MarshalJSON_Call) Return(bytes []byte, err error) *MockConnection_MarshalJSON_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(bytes, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,21 +500,20 @@ func (_c *MockConnection_MarshalJSON_Call) RunAndReturn(run func() ([]byte, erro
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save provides a mock function with no fields
|
// Save provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) Save() error {
|
func (_mock *MockConnection) Save() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Save")
|
panic("no return value specified for Save")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -529,8 +534,8 @@ func (_c *MockConnection_Save_Call) Run(run func()) *MockConnection_Save_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_Save_Call) Return(_a0 error) *MockConnection_Save_Call {
|
func (_c *MockConnection_Save_Call) Return(err error) *MockConnection_Save_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -539,21 +544,20 @@ func (_c *MockConnection_Save_Call) RunAndReturn(run func() error) *MockConnecti
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update provides a mock function with given fields: settings
|
// Update provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) Update(settings gonetworkmanager.ConnectionSettings) error {
|
func (_mock *MockConnection) Update(settings gonetworkmanager.ConnectionSettings) error {
|
||||||
ret := _m.Called(settings)
|
ret := _mock.Called(settings)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Update")
|
panic("no return value specified for Update")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
||||||
r0 = rf(settings)
|
r0 = returnFunc(settings)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,42 +568,47 @@ type MockConnection_Update_Call struct {
|
|||||||
|
|
||||||
// Update is a helper method to define mock.On call
|
// Update is a helper method to define mock.On call
|
||||||
// - settings gonetworkmanager.ConnectionSettings
|
// - settings gonetworkmanager.ConnectionSettings
|
||||||
func (_e *MockConnection_Expecter) Update(settings interface{}) *MockConnection_Update_Call {
|
func (_e *MockConnection_Expecter) Update(settings any) *MockConnection_Update_Call {
|
||||||
return &MockConnection_Update_Call{Call: _e.mock.On("Update", settings)}
|
return &MockConnection_Update_Call{Call: _e.mock.On("Update", settings)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_Update_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_Update_Call {
|
func (_c *MockConnection_Update_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_Update_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(gonetworkmanager.ConnectionSettings))
|
var arg0 gonetworkmanager.ConnectionSettings
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_Update_Call) Return(_a0 error) *MockConnection_Update_Call {
|
func (_c *MockConnection_Update_Call) Return(err error) *MockConnection_Update_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_Update_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) error) *MockConnection_Update_Call {
|
func (_c *MockConnection_Update_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) error) *MockConnection_Update_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateUnsaved provides a mock function with given fields: settings
|
// UpdateUnsaved provides a mock function for the type MockConnection
|
||||||
func (_m *MockConnection) UpdateUnsaved(settings gonetworkmanager.ConnectionSettings) error {
|
func (_mock *MockConnection) UpdateUnsaved(settings gonetworkmanager.ConnectionSettings) error {
|
||||||
ret := _m.Called(settings)
|
ret := _mock.Called(settings)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for UpdateUnsaved")
|
panic("no return value specified for UpdateUnsaved")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
||||||
r0 = rf(settings)
|
r0 = returnFunc(settings)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -610,37 +619,29 @@ type MockConnection_UpdateUnsaved_Call struct {
|
|||||||
|
|
||||||
// UpdateUnsaved is a helper method to define mock.On call
|
// UpdateUnsaved is a helper method to define mock.On call
|
||||||
// - settings gonetworkmanager.ConnectionSettings
|
// - settings gonetworkmanager.ConnectionSettings
|
||||||
func (_e *MockConnection_Expecter) UpdateUnsaved(settings interface{}) *MockConnection_UpdateUnsaved_Call {
|
func (_e *MockConnection_Expecter) UpdateUnsaved(settings any) *MockConnection_UpdateUnsaved_Call {
|
||||||
return &MockConnection_UpdateUnsaved_Call{Call: _e.mock.On("UpdateUnsaved", settings)}
|
return &MockConnection_UpdateUnsaved_Call{Call: _e.mock.On("UpdateUnsaved", settings)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_UpdateUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_UpdateUnsaved_Call {
|
func (_c *MockConnection_UpdateUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_UpdateUnsaved_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(gonetworkmanager.ConnectionSettings))
|
var arg0 gonetworkmanager.ConnectionSettings
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_UpdateUnsaved_Call) Return(_a0 error) *MockConnection_UpdateUnsaved_Call {
|
func (_c *MockConnection_UpdateUnsaved_Call) Return(err error) *MockConnection_UpdateUnsaved_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConnection_UpdateUnsaved_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) error) *MockConnection_UpdateUnsaved_Call {
|
func (_c *MockConnection_UpdateUnsaved_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) error) *MockConnection_UpdateUnsaved_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockConnection creates a new instance of MockConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockConnection(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockConnection {
|
|
||||||
mock := &MockConnection{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,28 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package gonetworkmanager
|
package gonetworkmanager
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
|
"github.com/Wifx/gonetworkmanager/v2"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockIP4Config creates a new instance of MockIP4Config. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockIP4Config(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockIP4Config {
|
||||||
|
mock := &MockIP4Config{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockIP4Config is an autogenerated mock type for the IP4Config type
|
// MockIP4Config is an autogenerated mock type for the IP4Config type
|
||||||
type MockIP4Config struct {
|
type MockIP4Config struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -20,9 +36,9 @@ func (_m *MockIP4Config) EXPECT() *MockIP4Config_Expecter {
|
|||||||
return &MockIP4Config_Expecter{mock: &_m.Mock}
|
return &MockIP4Config_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyAddressData provides a mock function with no fields
|
// GetPropertyAddressData provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyAddressData() ([]gonetworkmanager.IP4AddressData, error) {
|
func (_mock *MockIP4Config) GetPropertyAddressData() ([]gonetworkmanager.IP4AddressData, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyAddressData")
|
panic("no return value specified for GetPropertyAddressData")
|
||||||
@@ -30,23 +46,21 @@ func (_m *MockIP4Config) GetPropertyAddressData() ([]gonetworkmanager.IP4Address
|
|||||||
|
|
||||||
var r0 []gonetworkmanager.IP4AddressData
|
var r0 []gonetworkmanager.IP4AddressData
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4AddressData, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4AddressData, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4AddressData); ok {
|
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4AddressData); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]gonetworkmanager.IP4AddressData)
|
r0 = ret.Get(0).([]gonetworkmanager.IP4AddressData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,8 +81,8 @@ func (_c *MockIP4Config_GetPropertyAddressData_Call) Run(run func()) *MockIP4Con
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyAddressData_Call) Return(_a0 []gonetworkmanager.IP4AddressData, _a1 error) *MockIP4Config_GetPropertyAddressData_Call {
|
func (_c *MockIP4Config_GetPropertyAddressData_Call) Return(iP4AddressDatas []gonetworkmanager.IP4AddressData, err error) *MockIP4Config_GetPropertyAddressData_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(iP4AddressDatas, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,9 +91,9 @@ func (_c *MockIP4Config_GetPropertyAddressData_Call) RunAndReturn(run func() ([]
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyAddresses provides a mock function with no fields
|
// GetPropertyAddresses provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyAddresses() ([]gonetworkmanager.IP4Address, error) {
|
func (_mock *MockIP4Config) GetPropertyAddresses() ([]gonetworkmanager.IP4Address, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyAddresses")
|
panic("no return value specified for GetPropertyAddresses")
|
||||||
@@ -87,23 +101,21 @@ func (_m *MockIP4Config) GetPropertyAddresses() ([]gonetworkmanager.IP4Address,
|
|||||||
|
|
||||||
var r0 []gonetworkmanager.IP4Address
|
var r0 []gonetworkmanager.IP4Address
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Address, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Address, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4Address); ok {
|
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4Address); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]gonetworkmanager.IP4Address)
|
r0 = ret.Get(0).([]gonetworkmanager.IP4Address)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,8 +136,8 @@ func (_c *MockIP4Config_GetPropertyAddresses_Call) Run(run func()) *MockIP4Confi
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyAddresses_Call) Return(_a0 []gonetworkmanager.IP4Address, _a1 error) *MockIP4Config_GetPropertyAddresses_Call {
|
func (_c *MockIP4Config_GetPropertyAddresses_Call) Return(iP4Addresss []gonetworkmanager.IP4Address, err error) *MockIP4Config_GetPropertyAddresses_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(iP4Addresss, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,9 +146,9 @@ func (_c *MockIP4Config_GetPropertyAddresses_Call) RunAndReturn(run func() ([]go
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDnsOptions provides a mock function with no fields
|
// GetPropertyDnsOptions provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyDnsOptions() ([]string, error) {
|
func (_mock *MockIP4Config) GetPropertyDnsOptions() ([]string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDnsOptions")
|
panic("no return value specified for GetPropertyDnsOptions")
|
||||||
@@ -144,23 +156,21 @@ func (_m *MockIP4Config) GetPropertyDnsOptions() ([]string, error) {
|
|||||||
|
|
||||||
var r0 []string
|
var r0 []string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []string); ok {
|
if returnFunc, ok := ret.Get(0).(func() []string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]string)
|
r0 = ret.Get(0).([]string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,8 +191,8 @@ func (_c *MockIP4Config_GetPropertyDnsOptions_Call) Run(run func()) *MockIP4Conf
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyDnsOptions_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyDnsOptions_Call {
|
func (_c *MockIP4Config_GetPropertyDnsOptions_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyDnsOptions_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(strings, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,9 +201,9 @@ func (_c *MockIP4Config_GetPropertyDnsOptions_Call) RunAndReturn(run func() ([]s
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDnsPriority provides a mock function with no fields
|
// GetPropertyDnsPriority provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyDnsPriority() (uint32, error) {
|
func (_mock *MockIP4Config) GetPropertyDnsPriority() (uint32, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDnsPriority")
|
panic("no return value specified for GetPropertyDnsPriority")
|
||||||
@@ -201,21 +211,19 @@ func (_m *MockIP4Config) GetPropertyDnsPriority() (uint32, error) {
|
|||||||
|
|
||||||
var r0 uint32
|
var r0 uint32
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() uint32); ok {
|
if returnFunc, ok := ret.Get(0).(func() uint32); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(uint32)
|
r0 = ret.Get(0).(uint32)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,8 +244,8 @@ func (_c *MockIP4Config_GetPropertyDnsPriority_Call) Run(run func()) *MockIP4Con
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyDnsPriority_Call) Return(_a0 uint32, _a1 error) *MockIP4Config_GetPropertyDnsPriority_Call {
|
func (_c *MockIP4Config_GetPropertyDnsPriority_Call) Return(v uint32, err error) *MockIP4Config_GetPropertyDnsPriority_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(v, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,9 +254,9 @@ func (_c *MockIP4Config_GetPropertyDnsPriority_Call) RunAndReturn(run func() (ui
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyDomains provides a mock function with no fields
|
// GetPropertyDomains provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyDomains() ([]string, error) {
|
func (_mock *MockIP4Config) GetPropertyDomains() ([]string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyDomains")
|
panic("no return value specified for GetPropertyDomains")
|
||||||
@@ -256,23 +264,21 @@ func (_m *MockIP4Config) GetPropertyDomains() ([]string, error) {
|
|||||||
|
|
||||||
var r0 []string
|
var r0 []string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []string); ok {
|
if returnFunc, ok := ret.Get(0).(func() []string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]string)
|
r0 = ret.Get(0).([]string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,8 +299,8 @@ func (_c *MockIP4Config_GetPropertyDomains_Call) Run(run func()) *MockIP4Config_
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyDomains_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyDomains_Call {
|
func (_c *MockIP4Config_GetPropertyDomains_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyDomains_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(strings, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,9 +309,9 @@ func (_c *MockIP4Config_GetPropertyDomains_Call) RunAndReturn(run func() ([]stri
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyGateway provides a mock function with no fields
|
// GetPropertyGateway provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyGateway() (string, error) {
|
func (_mock *MockIP4Config) GetPropertyGateway() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyGateway")
|
panic("no return value specified for GetPropertyGateway")
|
||||||
@@ -313,21 +319,19 @@ func (_m *MockIP4Config) GetPropertyGateway() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,8 +352,8 @@ func (_c *MockIP4Config_GetPropertyGateway_Call) Run(run func()) *MockIP4Config_
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyGateway_Call) Return(_a0 string, _a1 error) *MockIP4Config_GetPropertyGateway_Call {
|
func (_c *MockIP4Config_GetPropertyGateway_Call) Return(s string, err error) *MockIP4Config_GetPropertyGateway_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,9 +362,9 @@ func (_c *MockIP4Config_GetPropertyGateway_Call) RunAndReturn(run func() (string
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyNameserverData provides a mock function with no fields
|
// GetPropertyNameserverData provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyNameserverData() ([]gonetworkmanager.IP4NameserverData, error) {
|
func (_mock *MockIP4Config) GetPropertyNameserverData() ([]gonetworkmanager.IP4NameserverData, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyNameserverData")
|
panic("no return value specified for GetPropertyNameserverData")
|
||||||
@@ -368,23 +372,21 @@ func (_m *MockIP4Config) GetPropertyNameserverData() ([]gonetworkmanager.IP4Name
|
|||||||
|
|
||||||
var r0 []gonetworkmanager.IP4NameserverData
|
var r0 []gonetworkmanager.IP4NameserverData
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4NameserverData, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4NameserverData, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4NameserverData); ok {
|
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4NameserverData); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]gonetworkmanager.IP4NameserverData)
|
r0 = ret.Get(0).([]gonetworkmanager.IP4NameserverData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,8 +407,8 @@ func (_c *MockIP4Config_GetPropertyNameserverData_Call) Run(run func()) *MockIP4
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyNameserverData_Call) Return(_a0 []gonetworkmanager.IP4NameserverData, _a1 error) *MockIP4Config_GetPropertyNameserverData_Call {
|
func (_c *MockIP4Config_GetPropertyNameserverData_Call) Return(iP4NameserverDatas []gonetworkmanager.IP4NameserverData, err error) *MockIP4Config_GetPropertyNameserverData_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(iP4NameserverDatas, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,9 +417,9 @@ func (_c *MockIP4Config_GetPropertyNameserverData_Call) RunAndReturn(run func()
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyNameservers provides a mock function with no fields
|
// GetPropertyNameservers provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyNameservers() ([]string, error) {
|
func (_mock *MockIP4Config) GetPropertyNameservers() ([]string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyNameservers")
|
panic("no return value specified for GetPropertyNameservers")
|
||||||
@@ -425,23 +427,21 @@ func (_m *MockIP4Config) GetPropertyNameservers() ([]string, error) {
|
|||||||
|
|
||||||
var r0 []string
|
var r0 []string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []string); ok {
|
if returnFunc, ok := ret.Get(0).(func() []string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]string)
|
r0 = ret.Get(0).([]string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,8 +462,8 @@ func (_c *MockIP4Config_GetPropertyNameservers_Call) Run(run func()) *MockIP4Con
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyNameservers_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyNameservers_Call {
|
func (_c *MockIP4Config_GetPropertyNameservers_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyNameservers_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(strings, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -472,9 +472,9 @@ func (_c *MockIP4Config_GetPropertyNameservers_Call) RunAndReturn(run func() ([]
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyRouteData provides a mock function with no fields
|
// GetPropertyRouteData provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyRouteData() ([]gonetworkmanager.IP4RouteData, error) {
|
func (_mock *MockIP4Config) GetPropertyRouteData() ([]gonetworkmanager.IP4RouteData, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyRouteData")
|
panic("no return value specified for GetPropertyRouteData")
|
||||||
@@ -482,23 +482,21 @@ func (_m *MockIP4Config) GetPropertyRouteData() ([]gonetworkmanager.IP4RouteData
|
|||||||
|
|
||||||
var r0 []gonetworkmanager.IP4RouteData
|
var r0 []gonetworkmanager.IP4RouteData
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4RouteData, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4RouteData, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4RouteData); ok {
|
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4RouteData); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]gonetworkmanager.IP4RouteData)
|
r0 = ret.Get(0).([]gonetworkmanager.IP4RouteData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,8 +517,8 @@ func (_c *MockIP4Config_GetPropertyRouteData_Call) Run(run func()) *MockIP4Confi
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyRouteData_Call) Return(_a0 []gonetworkmanager.IP4RouteData, _a1 error) *MockIP4Config_GetPropertyRouteData_Call {
|
func (_c *MockIP4Config_GetPropertyRouteData_Call) Return(iP4RouteDatas []gonetworkmanager.IP4RouteData, err error) *MockIP4Config_GetPropertyRouteData_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(iP4RouteDatas, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -529,9 +527,9 @@ func (_c *MockIP4Config_GetPropertyRouteData_Call) RunAndReturn(run func() ([]go
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyRoutes provides a mock function with no fields
|
// GetPropertyRoutes provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyRoutes() ([]gonetworkmanager.IP4Route, error) {
|
func (_mock *MockIP4Config) GetPropertyRoutes() ([]gonetworkmanager.IP4Route, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyRoutes")
|
panic("no return value specified for GetPropertyRoutes")
|
||||||
@@ -539,23 +537,21 @@ func (_m *MockIP4Config) GetPropertyRoutes() ([]gonetworkmanager.IP4Route, error
|
|||||||
|
|
||||||
var r0 []gonetworkmanager.IP4Route
|
var r0 []gonetworkmanager.IP4Route
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Route, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Route, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4Route); ok {
|
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4Route); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]gonetworkmanager.IP4Route)
|
r0 = ret.Get(0).([]gonetworkmanager.IP4Route)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -576,8 +572,8 @@ func (_c *MockIP4Config_GetPropertyRoutes_Call) Run(run func()) *MockIP4Config_G
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyRoutes_Call) Return(_a0 []gonetworkmanager.IP4Route, _a1 error) *MockIP4Config_GetPropertyRoutes_Call {
|
func (_c *MockIP4Config_GetPropertyRoutes_Call) Return(iP4Routes []gonetworkmanager.IP4Route, err error) *MockIP4Config_GetPropertyRoutes_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(iP4Routes, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,9 +582,9 @@ func (_c *MockIP4Config_GetPropertyRoutes_Call) RunAndReturn(run func() ([]gonet
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertySearches provides a mock function with no fields
|
// GetPropertySearches provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertySearches() ([]string, error) {
|
func (_mock *MockIP4Config) GetPropertySearches() ([]string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertySearches")
|
panic("no return value specified for GetPropertySearches")
|
||||||
@@ -596,23 +592,21 @@ func (_m *MockIP4Config) GetPropertySearches() ([]string, error) {
|
|||||||
|
|
||||||
var r0 []string
|
var r0 []string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []string); ok {
|
if returnFunc, ok := ret.Get(0).(func() []string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]string)
|
r0 = ret.Get(0).([]string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -633,8 +627,8 @@ func (_c *MockIP4Config_GetPropertySearches_Call) Run(run func()) *MockIP4Config
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertySearches_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertySearches_Call {
|
func (_c *MockIP4Config_GetPropertySearches_Call) Return(strings []string, err error) *MockIP4Config_GetPropertySearches_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(strings, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -643,9 +637,9 @@ func (_c *MockIP4Config_GetPropertySearches_Call) RunAndReturn(run func() ([]str
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyWinsServerData provides a mock function with no fields
|
// GetPropertyWinsServerData provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) GetPropertyWinsServerData() ([]string, error) {
|
func (_mock *MockIP4Config) GetPropertyWinsServerData() ([]string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyWinsServerData")
|
panic("no return value specified for GetPropertyWinsServerData")
|
||||||
@@ -653,23 +647,21 @@ func (_m *MockIP4Config) GetPropertyWinsServerData() ([]string, error) {
|
|||||||
|
|
||||||
var r0 []string
|
var r0 []string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []string); ok {
|
if returnFunc, ok := ret.Get(0).(func() []string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]string)
|
r0 = ret.Get(0).([]string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -690,8 +682,8 @@ func (_c *MockIP4Config_GetPropertyWinsServerData_Call) Run(run func()) *MockIP4
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_GetPropertyWinsServerData_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyWinsServerData_Call {
|
func (_c *MockIP4Config_GetPropertyWinsServerData_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyWinsServerData_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(strings, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -700,9 +692,9 @@ func (_c *MockIP4Config_GetPropertyWinsServerData_Call) RunAndReturn(run func()
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON provides a mock function with no fields
|
// MarshalJSON provides a mock function for the type MockIP4Config
|
||||||
func (_m *MockIP4Config) MarshalJSON() ([]byte, error) {
|
func (_mock *MockIP4Config) MarshalJSON() ([]byte, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for MarshalJSON")
|
panic("no return value specified for MarshalJSON")
|
||||||
@@ -710,23 +702,21 @@ func (_m *MockIP4Config) MarshalJSON() ([]byte, error) {
|
|||||||
|
|
||||||
var r0 []byte
|
var r0 []byte
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]byte, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]byte, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []byte); ok {
|
if returnFunc, ok := ret.Get(0).(func() []byte); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]byte)
|
r0 = ret.Get(0).([]byte)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -747,8 +737,8 @@ func (_c *MockIP4Config_MarshalJSON_Call) Run(run func()) *MockIP4Config_Marshal
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockIP4Config_MarshalJSON_Call) Return(_a0 []byte, _a1 error) *MockIP4Config_MarshalJSON_Call {
|
func (_c *MockIP4Config_MarshalJSON_Call) Return(bytes []byte, err error) *MockIP4Config_MarshalJSON_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(bytes, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -756,17 +746,3 @@ func (_c *MockIP4Config_MarshalJSON_Call) RunAndReturn(run func() ([]byte, error
|
|||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockIP4Config creates a new instance of MockIP4Config. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockIP4Config(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockIP4Config {
|
|
||||||
mock := &MockIP4Config{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,28 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package gonetworkmanager
|
package gonetworkmanager
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
|
"github.com/Wifx/gonetworkmanager/v2"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockSettings creates a new instance of MockSettings. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockSettings(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockSettings {
|
||||||
|
mock := &MockSettings{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockSettings is an autogenerated mock type for the Settings type
|
// MockSettings is an autogenerated mock type for the Settings type
|
||||||
type MockSettings struct {
|
type MockSettings struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -20,9 +36,9 @@ func (_m *MockSettings) EXPECT() *MockSettings_Expecter {
|
|||||||
return &MockSettings_Expecter{mock: &_m.Mock}
|
return &MockSettings_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddConnection provides a mock function with given fields: settings
|
// AddConnection provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) AddConnection(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) {
|
func (_mock *MockSettings) AddConnection(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) {
|
||||||
ret := _m.Called(settings)
|
ret := _mock.Called(settings)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for AddConnection")
|
panic("no return value specified for AddConnection")
|
||||||
@@ -30,23 +46,21 @@ func (_m *MockSettings) AddConnection(settings gonetworkmanager.ConnectionSettin
|
|||||||
|
|
||||||
var r0 gonetworkmanager.Connection
|
var r0 gonetworkmanager.Connection
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok {
|
||||||
return rf(settings)
|
return returnFunc(settings)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok {
|
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok {
|
||||||
r0 = rf(settings)
|
r0 = returnFunc(settings)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
r1 = returnFunc(settings)
|
||||||
r1 = rf(settings)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,30 +71,36 @@ type MockSettings_AddConnection_Call struct {
|
|||||||
|
|
||||||
// AddConnection is a helper method to define mock.On call
|
// AddConnection is a helper method to define mock.On call
|
||||||
// - settings gonetworkmanager.ConnectionSettings
|
// - settings gonetworkmanager.ConnectionSettings
|
||||||
func (_e *MockSettings_Expecter) AddConnection(settings interface{}) *MockSettings_AddConnection_Call {
|
func (_e *MockSettings_Expecter) AddConnection(settings any) *MockSettings_AddConnection_Call {
|
||||||
return &MockSettings_AddConnection_Call{Call: _e.mock.On("AddConnection", settings)}
|
return &MockSettings_AddConnection_Call{Call: _e.mock.On("AddConnection", settings)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_AddConnection_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnection_Call {
|
func (_c *MockSettings_AddConnection_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnection_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(gonetworkmanager.ConnectionSettings))
|
var arg0 gonetworkmanager.ConnectionSettings
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_AddConnection_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockSettings_AddConnection_Call {
|
func (_c *MockSettings_AddConnection_Call) Return(connection gonetworkmanager.Connection, err error) *MockSettings_AddConnection_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(connection, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_AddConnection_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnection_Call {
|
func (_c *MockSettings_AddConnection_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnection_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddConnectionUnsaved provides a mock function with given fields: settings
|
// AddConnectionUnsaved provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) AddConnectionUnsaved(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) {
|
func (_mock *MockSettings) AddConnectionUnsaved(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) {
|
||||||
ret := _m.Called(settings)
|
ret := _mock.Called(settings)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for AddConnectionUnsaved")
|
panic("no return value specified for AddConnectionUnsaved")
|
||||||
@@ -88,23 +108,21 @@ func (_m *MockSettings) AddConnectionUnsaved(settings gonetworkmanager.Connectio
|
|||||||
|
|
||||||
var r0 gonetworkmanager.Connection
|
var r0 gonetworkmanager.Connection
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok {
|
||||||
return rf(settings)
|
return returnFunc(settings)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok {
|
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok {
|
||||||
r0 = rf(settings)
|
r0 = returnFunc(settings)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
|
r1 = returnFunc(settings)
|
||||||
r1 = rf(settings)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,30 +133,36 @@ type MockSettings_AddConnectionUnsaved_Call struct {
|
|||||||
|
|
||||||
// AddConnectionUnsaved is a helper method to define mock.On call
|
// AddConnectionUnsaved is a helper method to define mock.On call
|
||||||
// - settings gonetworkmanager.ConnectionSettings
|
// - settings gonetworkmanager.ConnectionSettings
|
||||||
func (_e *MockSettings_Expecter) AddConnectionUnsaved(settings interface{}) *MockSettings_AddConnectionUnsaved_Call {
|
func (_e *MockSettings_Expecter) AddConnectionUnsaved(settings any) *MockSettings_AddConnectionUnsaved_Call {
|
||||||
return &MockSettings_AddConnectionUnsaved_Call{Call: _e.mock.On("AddConnectionUnsaved", settings)}
|
return &MockSettings_AddConnectionUnsaved_Call{Call: _e.mock.On("AddConnectionUnsaved", settings)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_AddConnectionUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnectionUnsaved_Call {
|
func (_c *MockSettings_AddConnectionUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnectionUnsaved_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(gonetworkmanager.ConnectionSettings))
|
var arg0 gonetworkmanager.ConnectionSettings
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_AddConnectionUnsaved_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockSettings_AddConnectionUnsaved_Call {
|
func (_c *MockSettings_AddConnectionUnsaved_Call) Return(connection gonetworkmanager.Connection, err error) *MockSettings_AddConnectionUnsaved_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(connection, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_AddConnectionUnsaved_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnectionUnsaved_Call {
|
func (_c *MockSettings_AddConnectionUnsaved_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnectionUnsaved_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetConnectionByUUID provides a mock function with given fields: uuid
|
// GetConnectionByUUID provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) GetConnectionByUUID(uuid string) (gonetworkmanager.Connection, error) {
|
func (_mock *MockSettings) GetConnectionByUUID(uuid string) (gonetworkmanager.Connection, error) {
|
||||||
ret := _m.Called(uuid)
|
ret := _mock.Called(uuid)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetConnectionByUUID")
|
panic("no return value specified for GetConnectionByUUID")
|
||||||
@@ -146,23 +170,21 @@ func (_m *MockSettings) GetConnectionByUUID(uuid string) (gonetworkmanager.Conne
|
|||||||
|
|
||||||
var r0 gonetworkmanager.Connection
|
var r0 gonetworkmanager.Connection
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(string) (gonetworkmanager.Connection, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) (gonetworkmanager.Connection, error)); ok {
|
||||||
return rf(uuid)
|
return returnFunc(uuid)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(string) gonetworkmanager.Connection); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) gonetworkmanager.Connection); ok {
|
||||||
r0 = rf(uuid)
|
r0 = returnFunc(uuid)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
r0 = ret.Get(0).(gonetworkmanager.Connection)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
r1 = returnFunc(uuid)
|
||||||
r1 = rf(uuid)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,30 +195,36 @@ type MockSettings_GetConnectionByUUID_Call struct {
|
|||||||
|
|
||||||
// GetConnectionByUUID is a helper method to define mock.On call
|
// GetConnectionByUUID is a helper method to define mock.On call
|
||||||
// - uuid string
|
// - uuid string
|
||||||
func (_e *MockSettings_Expecter) GetConnectionByUUID(uuid interface{}) *MockSettings_GetConnectionByUUID_Call {
|
func (_e *MockSettings_Expecter) GetConnectionByUUID(uuid any) *MockSettings_GetConnectionByUUID_Call {
|
||||||
return &MockSettings_GetConnectionByUUID_Call{Call: _e.mock.On("GetConnectionByUUID", uuid)}
|
return &MockSettings_GetConnectionByUUID_Call{Call: _e.mock.On("GetConnectionByUUID", uuid)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_GetConnectionByUUID_Call) Run(run func(uuid string)) *MockSettings_GetConnectionByUUID_Call {
|
func (_c *MockSettings_GetConnectionByUUID_Call) Run(run func(uuid string)) *MockSettings_GetConnectionByUUID_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_GetConnectionByUUID_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockSettings_GetConnectionByUUID_Call {
|
func (_c *MockSettings_GetConnectionByUUID_Call) Return(connection gonetworkmanager.Connection, err error) *MockSettings_GetConnectionByUUID_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(connection, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_GetConnectionByUUID_Call) RunAndReturn(run func(string) (gonetworkmanager.Connection, error)) *MockSettings_GetConnectionByUUID_Call {
|
func (_c *MockSettings_GetConnectionByUUID_Call) RunAndReturn(run func(uuid string) (gonetworkmanager.Connection, error)) *MockSettings_GetConnectionByUUID_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyCanModify provides a mock function with no fields
|
// GetPropertyCanModify provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) GetPropertyCanModify() (bool, error) {
|
func (_mock *MockSettings) GetPropertyCanModify() (bool, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyCanModify")
|
panic("no return value specified for GetPropertyCanModify")
|
||||||
@@ -204,21 +232,19 @@ func (_m *MockSettings) GetPropertyCanModify() (bool, error) {
|
|||||||
|
|
||||||
var r0 bool
|
var r0 bool
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (bool, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() bool); ok {
|
if returnFunc, ok := ret.Get(0).(func() bool); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(bool)
|
r0 = ret.Get(0).(bool)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,8 +265,8 @@ func (_c *MockSettings_GetPropertyCanModify_Call) Run(run func()) *MockSettings_
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_GetPropertyCanModify_Call) Return(_a0 bool, _a1 error) *MockSettings_GetPropertyCanModify_Call {
|
func (_c *MockSettings_GetPropertyCanModify_Call) Return(b bool, err error) *MockSettings_GetPropertyCanModify_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(b, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,9 +275,9 @@ func (_c *MockSettings_GetPropertyCanModify_Call) RunAndReturn(run func() (bool,
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPropertyHostname provides a mock function with no fields
|
// GetPropertyHostname provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) GetPropertyHostname() (string, error) {
|
func (_mock *MockSettings) GetPropertyHostname() (string, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetPropertyHostname")
|
panic("no return value specified for GetPropertyHostname")
|
||||||
@@ -259,21 +285,19 @@ func (_m *MockSettings) GetPropertyHostname() (string, error) {
|
|||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (string, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,8 +318,8 @@ func (_c *MockSettings_GetPropertyHostname_Call) Run(run func()) *MockSettings_G
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_GetPropertyHostname_Call) Return(_a0 string, _a1 error) *MockSettings_GetPropertyHostname_Call {
|
func (_c *MockSettings_GetPropertyHostname_Call) Return(s string, err error) *MockSettings_GetPropertyHostname_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(s, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,9 +328,9 @@ func (_c *MockSettings_GetPropertyHostname_Call) RunAndReturn(run func() (string
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListConnections provides a mock function with no fields
|
// ListConnections provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) ListConnections() ([]gonetworkmanager.Connection, error) {
|
func (_mock *MockSettings) ListConnections() ([]gonetworkmanager.Connection, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for ListConnections")
|
panic("no return value specified for ListConnections")
|
||||||
@@ -314,23 +338,21 @@ func (_m *MockSettings) ListConnections() ([]gonetworkmanager.Connection, error)
|
|||||||
|
|
||||||
var r0 []gonetworkmanager.Connection
|
var r0 []gonetworkmanager.Connection
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.Connection, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.Connection, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() []gonetworkmanager.Connection); ok {
|
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.Connection); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).([]gonetworkmanager.Connection)
|
r0 = ret.Get(0).([]gonetworkmanager.Connection)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,8 +373,8 @@ func (_c *MockSettings_ListConnections_Call) Run(run func()) *MockSettings_ListC
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_ListConnections_Call) Return(_a0 []gonetworkmanager.Connection, _a1 error) *MockSettings_ListConnections_Call {
|
func (_c *MockSettings_ListConnections_Call) Return(connections []gonetworkmanager.Connection, err error) *MockSettings_ListConnections_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(connections, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,21 +383,20 @@ func (_c *MockSettings_ListConnections_Call) RunAndReturn(run func() ([]gonetwor
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReloadConnections provides a mock function with no fields
|
// ReloadConnections provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) ReloadConnections() error {
|
func (_mock *MockSettings) ReloadConnections() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for ReloadConnections")
|
panic("no return value specified for ReloadConnections")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,8 +417,8 @@ func (_c *MockSettings_ReloadConnections_Call) Run(run func()) *MockSettings_Rel
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_ReloadConnections_Call) Return(_a0 error) *MockSettings_ReloadConnections_Call {
|
func (_c *MockSettings_ReloadConnections_Call) Return(err error) *MockSettings_ReloadConnections_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,21 +427,20 @@ func (_c *MockSettings_ReloadConnections_Call) RunAndReturn(run func() error) *M
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SaveHostname provides a mock function with given fields: hostname
|
// SaveHostname provides a mock function for the type MockSettings
|
||||||
func (_m *MockSettings) SaveHostname(hostname string) error {
|
func (_mock *MockSettings) SaveHostname(hostname string) error {
|
||||||
ret := _m.Called(hostname)
|
ret := _mock.Called(hostname)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for SaveHostname")
|
panic("no return value specified for SaveHostname")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(string) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) error); ok {
|
||||||
r0 = rf(hostname)
|
r0 = returnFunc(hostname)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,37 +451,29 @@ type MockSettings_SaveHostname_Call struct {
|
|||||||
|
|
||||||
// SaveHostname is a helper method to define mock.On call
|
// SaveHostname is a helper method to define mock.On call
|
||||||
// - hostname string
|
// - hostname string
|
||||||
func (_e *MockSettings_Expecter) SaveHostname(hostname interface{}) *MockSettings_SaveHostname_Call {
|
func (_e *MockSettings_Expecter) SaveHostname(hostname any) *MockSettings_SaveHostname_Call {
|
||||||
return &MockSettings_SaveHostname_Call{Call: _e.mock.On("SaveHostname", hostname)}
|
return &MockSettings_SaveHostname_Call{Call: _e.mock.On("SaveHostname", hostname)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_SaveHostname_Call) Run(run func(hostname string)) *MockSettings_SaveHostname_Call {
|
func (_c *MockSettings_SaveHostname_Call) Run(run func(hostname string)) *MockSettings_SaveHostname_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_SaveHostname_Call) Return(_a0 error) *MockSettings_SaveHostname_Call {
|
func (_c *MockSettings_SaveHostname_Call) Return(err error) *MockSettings_SaveHostname_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockSettings_SaveHostname_Call) RunAndReturn(run func(string) error) *MockSettings_SaveHostname_Call {
|
func (_c *MockSettings_SaveHostname_Call) RunAndReturn(run func(hostname string) error) *MockSettings_SaveHostname_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockSettings creates a new instance of MockSettings. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockSettings(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockSettings {
|
|
||||||
mock := &MockSettings{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,14 +1,30 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package dbus
|
package dbus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
"context"
|
||||||
|
|
||||||
dbus "github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockBusObject creates a new instance of MockBusObject. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockBusObject(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockBusObject {
|
||||||
|
mock := &MockBusObject{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockBusObject is an autogenerated mock type for the BusObject type
|
// MockBusObject is an autogenerated mock type for the BusObject type
|
||||||
type MockBusObject struct {
|
type MockBusObject struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -22,30 +38,30 @@ func (_m *MockBusObject) EXPECT() *MockBusObject_Expecter {
|
|||||||
return &MockBusObject_Expecter{mock: &_m.Mock}
|
return &MockBusObject_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddMatchSignal provides a mock function with given fields: iface, member, options
|
// AddMatchSignal provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) AddMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call {
|
func (_mock *MockBusObject) AddMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call {
|
||||||
_va := make([]interface{}, len(options))
|
// dbus.MatchOption
|
||||||
|
_va := make([]any, len(options))
|
||||||
for _i := range options {
|
for _i := range options {
|
||||||
_va[_i] = options[_i]
|
_va[_i] = options[_i]
|
||||||
}
|
}
|
||||||
var _ca []interface{}
|
var _ca []any
|
||||||
_ca = append(_ca, iface, member)
|
_ca = append(_ca, iface, member)
|
||||||
_ca = append(_ca, _va...)
|
_ca = append(_ca, _va...)
|
||||||
ret := _m.Called(_ca...)
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for AddMatchSignal")
|
panic("no return value specified for AddMatchSignal")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *dbus.Call
|
var r0 *dbus.Call
|
||||||
if rf, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok {
|
||||||
r0 = rf(iface, member, options...)
|
r0 = returnFunc(iface, member, options...)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*dbus.Call)
|
r0 = ret.Get(0).(*dbus.Call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,54 +74,67 @@ type MockBusObject_AddMatchSignal_Call struct {
|
|||||||
// - iface string
|
// - iface string
|
||||||
// - member string
|
// - member string
|
||||||
// - options ...dbus.MatchOption
|
// - options ...dbus.MatchOption
|
||||||
func (_e *MockBusObject_Expecter) AddMatchSignal(iface interface{}, member interface{}, options ...interface{}) *MockBusObject_AddMatchSignal_Call {
|
func (_e *MockBusObject_Expecter) AddMatchSignal(iface any, member any, options ...any) *MockBusObject_AddMatchSignal_Call {
|
||||||
return &MockBusObject_AddMatchSignal_Call{Call: _e.mock.On("AddMatchSignal",
|
return &MockBusObject_AddMatchSignal_Call{Call: _e.mock.On("AddMatchSignal",
|
||||||
append([]interface{}{iface, member}, options...)...)}
|
append([]any{iface, member}, options...)...)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_AddMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_AddMatchSignal_Call {
|
func (_c *MockBusObject_AddMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_AddMatchSignal_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 string
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(string)
|
||||||
|
}
|
||||||
|
var arg2 []dbus.MatchOption
|
||||||
variadicArgs := make([]dbus.MatchOption, len(args)-2)
|
variadicArgs := make([]dbus.MatchOption, len(args)-2)
|
||||||
for i, a := range args[2:] {
|
for i, a := range args[2:] {
|
||||||
if a != nil {
|
if a != nil {
|
||||||
variadicArgs[i] = a.(dbus.MatchOption)
|
variadicArgs[i] = a.(dbus.MatchOption)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run(args[0].(string), args[1].(string), variadicArgs...)
|
arg2 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
arg2...,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_AddMatchSignal_Call) Return(_a0 *dbus.Call) *MockBusObject_AddMatchSignal_Call {
|
func (_c *MockBusObject_AddMatchSignal_Call) Return(call *dbus.Call) *MockBusObject_AddMatchSignal_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(call)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_AddMatchSignal_Call) RunAndReturn(run func(string, string, ...dbus.MatchOption) *dbus.Call) *MockBusObject_AddMatchSignal_Call {
|
func (_c *MockBusObject_AddMatchSignal_Call) RunAndReturn(run func(iface string, member string, options ...dbus.MatchOption) *dbus.Call) *MockBusObject_AddMatchSignal_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call provides a mock function with given fields: method, flags, args
|
// Call provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) Call(method string, flags dbus.Flags, args ...interface{}) *dbus.Call {
|
func (_mock *MockBusObject) Call(method string, flags dbus.Flags, args ...any) *dbus.Call {
|
||||||
var _ca []interface{}
|
var _ca []any
|
||||||
_ca = append(_ca, method, flags)
|
_ca = append(_ca, method, flags)
|
||||||
_ca = append(_ca, args...)
|
_ca = append(_ca, args...)
|
||||||
ret := _m.Called(_ca...)
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Call")
|
panic("no return value specified for Call")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *dbus.Call
|
var r0 *dbus.Call
|
||||||
if rf, ok := ret.Get(0).(func(string, dbus.Flags, ...interface{}) *dbus.Call); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, dbus.Flags, ...any) *dbus.Call); ok {
|
||||||
r0 = rf(method, flags, args...)
|
r0 = returnFunc(method, flags, args...)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*dbus.Call)
|
r0 = ret.Get(0).(*dbus.Call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,55 +146,68 @@ type MockBusObject_Call_Call struct {
|
|||||||
// Call is a helper method to define mock.On call
|
// Call is a helper method to define mock.On call
|
||||||
// - method string
|
// - method string
|
||||||
// - flags dbus.Flags
|
// - flags dbus.Flags
|
||||||
// - args ...interface{}
|
// - args ...any
|
||||||
func (_e *MockBusObject_Expecter) Call(method interface{}, flags interface{}, args ...interface{}) *MockBusObject_Call_Call {
|
func (_e *MockBusObject_Expecter) Call(method any, flags any, args ...any) *MockBusObject_Call_Call {
|
||||||
return &MockBusObject_Call_Call{Call: _e.mock.On("Call",
|
return &MockBusObject_Call_Call{Call: _e.mock.On("Call",
|
||||||
append([]interface{}{method, flags}, args...)...)}
|
append([]any{method, flags}, args...)...)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Call_Call) Run(run func(method string, flags dbus.Flags, args ...interface{})) *MockBusObject_Call_Call {
|
func (_c *MockBusObject_Call_Call) Run(run func(method string, flags dbus.Flags, args ...any)) *MockBusObject_Call_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
variadicArgs := make([]interface{}, len(args)-2)
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 dbus.Flags
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(dbus.Flags)
|
||||||
|
}
|
||||||
|
var arg2 []any
|
||||||
|
variadicArgs := make([]any, len(args)-2)
|
||||||
for i, a := range args[2:] {
|
for i, a := range args[2:] {
|
||||||
if a != nil {
|
if a != nil {
|
||||||
variadicArgs[i] = a.(interface{})
|
variadicArgs[i] = a.(any)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run(args[0].(string), args[1].(dbus.Flags), variadicArgs...)
|
arg2 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
arg2...,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Call_Call) Return(_a0 *dbus.Call) *MockBusObject_Call_Call {
|
func (_c *MockBusObject_Call_Call) Return(call *dbus.Call) *MockBusObject_Call_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(call)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Call_Call) RunAndReturn(run func(string, dbus.Flags, ...interface{}) *dbus.Call) *MockBusObject_Call_Call {
|
func (_c *MockBusObject_Call_Call) RunAndReturn(run func(method string, flags dbus.Flags, args ...any) *dbus.Call) *MockBusObject_Call_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// CallWithContext provides a mock function with given fields: ctx, method, flags, args
|
// CallWithContext provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) CallWithContext(ctx context.Context, method string, flags dbus.Flags, args ...interface{}) *dbus.Call {
|
func (_mock *MockBusObject) CallWithContext(ctx context.Context, method string, flags dbus.Flags, args ...any) *dbus.Call {
|
||||||
var _ca []interface{}
|
var _ca []any
|
||||||
_ca = append(_ca, ctx, method, flags)
|
_ca = append(_ca, ctx, method, flags)
|
||||||
_ca = append(_ca, args...)
|
_ca = append(_ca, args...)
|
||||||
ret := _m.Called(_ca...)
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for CallWithContext")
|
panic("no return value specified for CallWithContext")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *dbus.Call
|
var r0 *dbus.Call
|
||||||
if rf, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, ...interface{}) *dbus.Call); ok {
|
if returnFunc, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, ...any) *dbus.Call); ok {
|
||||||
r0 = rf(ctx, method, flags, args...)
|
r0 = returnFunc(ctx, method, flags, args...)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*dbus.Call)
|
r0 = ret.Get(0).(*dbus.Call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,50 +220,68 @@ type MockBusObject_CallWithContext_Call struct {
|
|||||||
// - ctx context.Context
|
// - ctx context.Context
|
||||||
// - method string
|
// - method string
|
||||||
// - flags dbus.Flags
|
// - flags dbus.Flags
|
||||||
// - args ...interface{}
|
// - args ...any
|
||||||
func (_e *MockBusObject_Expecter) CallWithContext(ctx interface{}, method interface{}, flags interface{}, args ...interface{}) *MockBusObject_CallWithContext_Call {
|
func (_e *MockBusObject_Expecter) CallWithContext(ctx any, method any, flags any, args ...any) *MockBusObject_CallWithContext_Call {
|
||||||
return &MockBusObject_CallWithContext_Call{Call: _e.mock.On("CallWithContext",
|
return &MockBusObject_CallWithContext_Call{Call: _e.mock.On("CallWithContext",
|
||||||
append([]interface{}{ctx, method, flags}, args...)...)}
|
append([]any{ctx, method, flags}, args...)...)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_CallWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, args ...interface{})) *MockBusObject_CallWithContext_Call {
|
func (_c *MockBusObject_CallWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, args ...any)) *MockBusObject_CallWithContext_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
variadicArgs := make([]interface{}, len(args)-3)
|
var arg0 context.Context
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(context.Context)
|
||||||
|
}
|
||||||
|
var arg1 string
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(string)
|
||||||
|
}
|
||||||
|
var arg2 dbus.Flags
|
||||||
|
if args[2] != nil {
|
||||||
|
arg2 = args[2].(dbus.Flags)
|
||||||
|
}
|
||||||
|
var arg3 []any
|
||||||
|
variadicArgs := make([]any, len(args)-3)
|
||||||
for i, a := range args[3:] {
|
for i, a := range args[3:] {
|
||||||
if a != nil {
|
if a != nil {
|
||||||
variadicArgs[i] = a.(interface{})
|
variadicArgs[i] = a.(any)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run(args[0].(context.Context), args[1].(string), args[2].(dbus.Flags), variadicArgs...)
|
arg3 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
arg2,
|
||||||
|
arg3...,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_CallWithContext_Call) Return(_a0 *dbus.Call) *MockBusObject_CallWithContext_Call {
|
func (_c *MockBusObject_CallWithContext_Call) Return(call *dbus.Call) *MockBusObject_CallWithContext_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(call)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_CallWithContext_Call) RunAndReturn(run func(context.Context, string, dbus.Flags, ...interface{}) *dbus.Call) *MockBusObject_CallWithContext_Call {
|
func (_c *MockBusObject_CallWithContext_Call) RunAndReturn(run func(ctx context.Context, method string, flags dbus.Flags, args ...any) *dbus.Call) *MockBusObject_CallWithContext_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destination provides a mock function with no fields
|
// Destination provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) Destination() string {
|
func (_mock *MockBusObject) Destination() string {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Destination")
|
panic("no return value specified for Destination")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 string
|
var r0 string
|
||||||
if rf, ok := ret.Get(0).(func() string); ok {
|
if returnFunc, ok := ret.Get(0).(func() string); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(string)
|
r0 = ret.Get(0).(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,8 +302,8 @@ func (_c *MockBusObject_Destination_Call) Run(run func()) *MockBusObject_Destina
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Destination_Call) Return(_a0 string) *MockBusObject_Destination_Call {
|
func (_c *MockBusObject_Destination_Call) Return(s string) *MockBusObject_Destination_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(s)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,9 +312,9 @@ func (_c *MockBusObject_Destination_Call) RunAndReturn(run func() string) *MockB
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetProperty provides a mock function with given fields: p
|
// GetProperty provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) GetProperty(p string) (dbus.Variant, error) {
|
func (_mock *MockBusObject) GetProperty(p string) (dbus.Variant, error) {
|
||||||
ret := _m.Called(p)
|
ret := _mock.Called(p)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetProperty")
|
panic("no return value specified for GetProperty")
|
||||||
@@ -262,21 +322,19 @@ func (_m *MockBusObject) GetProperty(p string) (dbus.Variant, error) {
|
|||||||
|
|
||||||
var r0 dbus.Variant
|
var r0 dbus.Variant
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(string) (dbus.Variant, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) (dbus.Variant, error)); ok {
|
||||||
return rf(p)
|
return returnFunc(p)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(string) dbus.Variant); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) dbus.Variant); ok {
|
||||||
r0 = rf(p)
|
r0 = returnFunc(p)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(dbus.Variant)
|
r0 = ret.Get(0).(dbus.Variant)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
r1 = returnFunc(p)
|
||||||
r1 = rf(p)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,47 +345,52 @@ type MockBusObject_GetProperty_Call struct {
|
|||||||
|
|
||||||
// GetProperty is a helper method to define mock.On call
|
// GetProperty is a helper method to define mock.On call
|
||||||
// - p string
|
// - p string
|
||||||
func (_e *MockBusObject_Expecter) GetProperty(p interface{}) *MockBusObject_GetProperty_Call {
|
func (_e *MockBusObject_Expecter) GetProperty(p any) *MockBusObject_GetProperty_Call {
|
||||||
return &MockBusObject_GetProperty_Call{Call: _e.mock.On("GetProperty", p)}
|
return &MockBusObject_GetProperty_Call{Call: _e.mock.On("GetProperty", p)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_GetProperty_Call) Run(run func(p string)) *MockBusObject_GetProperty_Call {
|
func (_c *MockBusObject_GetProperty_Call) Run(run func(p string)) *MockBusObject_GetProperty_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_GetProperty_Call) Return(_a0 dbus.Variant, _a1 error) *MockBusObject_GetProperty_Call {
|
func (_c *MockBusObject_GetProperty_Call) Return(variant dbus.Variant, err error) *MockBusObject_GetProperty_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(variant, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_GetProperty_Call) RunAndReturn(run func(string) (dbus.Variant, error)) *MockBusObject_GetProperty_Call {
|
func (_c *MockBusObject_GetProperty_Call) RunAndReturn(run func(p string) (dbus.Variant, error)) *MockBusObject_GetProperty_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Go provides a mock function with given fields: method, flags, ch, args
|
// Go provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) Go(method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{}) *dbus.Call {
|
func (_mock *MockBusObject) Go(method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call {
|
||||||
var _ca []interface{}
|
var _ca []any
|
||||||
_ca = append(_ca, method, flags, ch)
|
_ca = append(_ca, method, flags, ch)
|
||||||
_ca = append(_ca, args...)
|
_ca = append(_ca, args...)
|
||||||
ret := _m.Called(_ca...)
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Go")
|
panic("no return value specified for Go")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *dbus.Call
|
var r0 *dbus.Call
|
||||||
if rf, ok := ret.Get(0).(func(string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, dbus.Flags, chan *dbus.Call, ...any) *dbus.Call); ok {
|
||||||
r0 = rf(method, flags, ch, args...)
|
r0 = returnFunc(method, flags, ch, args...)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*dbus.Call)
|
r0 = ret.Get(0).(*dbus.Call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,55 +403,73 @@ type MockBusObject_Go_Call struct {
|
|||||||
// - method string
|
// - method string
|
||||||
// - flags dbus.Flags
|
// - flags dbus.Flags
|
||||||
// - ch chan *dbus.Call
|
// - ch chan *dbus.Call
|
||||||
// - args ...interface{}
|
// - args ...any
|
||||||
func (_e *MockBusObject_Expecter) Go(method interface{}, flags interface{}, ch interface{}, args ...interface{}) *MockBusObject_Go_Call {
|
func (_e *MockBusObject_Expecter) Go(method any, flags any, ch any, args ...any) *MockBusObject_Go_Call {
|
||||||
return &MockBusObject_Go_Call{Call: _e.mock.On("Go",
|
return &MockBusObject_Go_Call{Call: _e.mock.On("Go",
|
||||||
append([]interface{}{method, flags, ch}, args...)...)}
|
append([]any{method, flags, ch}, args...)...)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Go_Call) Run(run func(method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{})) *MockBusObject_Go_Call {
|
func (_c *MockBusObject_Go_Call) Run(run func(method string, flags dbus.Flags, ch chan *dbus.Call, args ...any)) *MockBusObject_Go_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
variadicArgs := make([]interface{}, len(args)-3)
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 dbus.Flags
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(dbus.Flags)
|
||||||
|
}
|
||||||
|
var arg2 chan *dbus.Call
|
||||||
|
if args[2] != nil {
|
||||||
|
arg2 = args[2].(chan *dbus.Call)
|
||||||
|
}
|
||||||
|
var arg3 []any
|
||||||
|
variadicArgs := make([]any, len(args)-3)
|
||||||
for i, a := range args[3:] {
|
for i, a := range args[3:] {
|
||||||
if a != nil {
|
if a != nil {
|
||||||
variadicArgs[i] = a.(interface{})
|
variadicArgs[i] = a.(any)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run(args[0].(string), args[1].(dbus.Flags), args[2].(chan *dbus.Call), variadicArgs...)
|
arg3 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
arg2,
|
||||||
|
arg3...,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Go_Call) Return(_a0 *dbus.Call) *MockBusObject_Go_Call {
|
func (_c *MockBusObject_Go_Call) Return(call *dbus.Call) *MockBusObject_Go_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(call)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Go_Call) RunAndReturn(run func(string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call) *MockBusObject_Go_Call {
|
func (_c *MockBusObject_Go_Call) RunAndReturn(run func(method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call) *MockBusObject_Go_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GoWithContext provides a mock function with given fields: ctx, method, flags, ch, args
|
// GoWithContext provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) GoWithContext(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{}) *dbus.Call {
|
func (_mock *MockBusObject) GoWithContext(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call {
|
||||||
var _ca []interface{}
|
var _ca []any
|
||||||
_ca = append(_ca, ctx, method, flags, ch)
|
_ca = append(_ca, ctx, method, flags, ch)
|
||||||
_ca = append(_ca, args...)
|
_ca = append(_ca, args...)
|
||||||
ret := _m.Called(_ca...)
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GoWithContext")
|
panic("no return value specified for GoWithContext")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *dbus.Call
|
var r0 *dbus.Call
|
||||||
if rf, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call); ok {
|
if returnFunc, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, chan *dbus.Call, ...any) *dbus.Call); ok {
|
||||||
r0 = rf(ctx, method, flags, ch, args...)
|
r0 = returnFunc(ctx, method, flags, ch, args...)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*dbus.Call)
|
r0 = ret.Get(0).(*dbus.Call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -402,50 +483,73 @@ type MockBusObject_GoWithContext_Call struct {
|
|||||||
// - method string
|
// - method string
|
||||||
// - flags dbus.Flags
|
// - flags dbus.Flags
|
||||||
// - ch chan *dbus.Call
|
// - ch chan *dbus.Call
|
||||||
// - args ...interface{}
|
// - args ...any
|
||||||
func (_e *MockBusObject_Expecter) GoWithContext(ctx interface{}, method interface{}, flags interface{}, ch interface{}, args ...interface{}) *MockBusObject_GoWithContext_Call {
|
func (_e *MockBusObject_Expecter) GoWithContext(ctx any, method any, flags any, ch any, args ...any) *MockBusObject_GoWithContext_Call {
|
||||||
return &MockBusObject_GoWithContext_Call{Call: _e.mock.On("GoWithContext",
|
return &MockBusObject_GoWithContext_Call{Call: _e.mock.On("GoWithContext",
|
||||||
append([]interface{}{ctx, method, flags, ch}, args...)...)}
|
append([]any{ctx, method, flags, ch}, args...)...)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_GoWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{})) *MockBusObject_GoWithContext_Call {
|
func (_c *MockBusObject_GoWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...any)) *MockBusObject_GoWithContext_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
variadicArgs := make([]interface{}, len(args)-4)
|
var arg0 context.Context
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(context.Context)
|
||||||
|
}
|
||||||
|
var arg1 string
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(string)
|
||||||
|
}
|
||||||
|
var arg2 dbus.Flags
|
||||||
|
if args[2] != nil {
|
||||||
|
arg2 = args[2].(dbus.Flags)
|
||||||
|
}
|
||||||
|
var arg3 chan *dbus.Call
|
||||||
|
if args[3] != nil {
|
||||||
|
arg3 = args[3].(chan *dbus.Call)
|
||||||
|
}
|
||||||
|
var arg4 []any
|
||||||
|
variadicArgs := make([]any, len(args)-4)
|
||||||
for i, a := range args[4:] {
|
for i, a := range args[4:] {
|
||||||
if a != nil {
|
if a != nil {
|
||||||
variadicArgs[i] = a.(interface{})
|
variadicArgs[i] = a.(any)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run(args[0].(context.Context), args[1].(string), args[2].(dbus.Flags), args[3].(chan *dbus.Call), variadicArgs...)
|
arg4 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
arg2,
|
||||||
|
arg3,
|
||||||
|
arg4...,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_GoWithContext_Call) Return(_a0 *dbus.Call) *MockBusObject_GoWithContext_Call {
|
func (_c *MockBusObject_GoWithContext_Call) Return(call *dbus.Call) *MockBusObject_GoWithContext_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(call)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_GoWithContext_Call) RunAndReturn(run func(context.Context, string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call) *MockBusObject_GoWithContext_Call {
|
func (_c *MockBusObject_GoWithContext_Call) RunAndReturn(run func(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call) *MockBusObject_GoWithContext_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path provides a mock function with no fields
|
// Path provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) Path() dbus.ObjectPath {
|
func (_mock *MockBusObject) Path() dbus.ObjectPath {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Path")
|
panic("no return value specified for Path")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 dbus.ObjectPath
|
var r0 dbus.ObjectPath
|
||||||
if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(dbus.ObjectPath)
|
r0 = ret.Get(0).(dbus.ObjectPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,8 +570,8 @@ func (_c *MockBusObject_Path_Call) Run(run func()) *MockBusObject_Path_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_Path_Call) Return(_a0 dbus.ObjectPath) *MockBusObject_Path_Call {
|
func (_c *MockBusObject_Path_Call) Return(objectPath dbus.ObjectPath) *MockBusObject_Path_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(objectPath)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,30 +580,30 @@ func (_c *MockBusObject_Path_Call) RunAndReturn(run func() dbus.ObjectPath) *Moc
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveMatchSignal provides a mock function with given fields: iface, member, options
|
// RemoveMatchSignal provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) RemoveMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call {
|
func (_mock *MockBusObject) RemoveMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call {
|
||||||
_va := make([]interface{}, len(options))
|
// dbus.MatchOption
|
||||||
|
_va := make([]any, len(options))
|
||||||
for _i := range options {
|
for _i := range options {
|
||||||
_va[_i] = options[_i]
|
_va[_i] = options[_i]
|
||||||
}
|
}
|
||||||
var _ca []interface{}
|
var _ca []any
|
||||||
_ca = append(_ca, iface, member)
|
_ca = append(_ca, iface, member)
|
||||||
_ca = append(_ca, _va...)
|
_ca = append(_ca, _va...)
|
||||||
ret := _m.Called(_ca...)
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for RemoveMatchSignal")
|
panic("no return value specified for RemoveMatchSignal")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *dbus.Call
|
var r0 *dbus.Call
|
||||||
if rf, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok {
|
||||||
r0 = rf(iface, member, options...)
|
r0 = returnFunc(iface, member, options...)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*dbus.Call)
|
r0 = ret.Get(0).(*dbus.Call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -512,49 +616,62 @@ type MockBusObject_RemoveMatchSignal_Call struct {
|
|||||||
// - iface string
|
// - iface string
|
||||||
// - member string
|
// - member string
|
||||||
// - options ...dbus.MatchOption
|
// - options ...dbus.MatchOption
|
||||||
func (_e *MockBusObject_Expecter) RemoveMatchSignal(iface interface{}, member interface{}, options ...interface{}) *MockBusObject_RemoveMatchSignal_Call {
|
func (_e *MockBusObject_Expecter) RemoveMatchSignal(iface any, member any, options ...any) *MockBusObject_RemoveMatchSignal_Call {
|
||||||
return &MockBusObject_RemoveMatchSignal_Call{Call: _e.mock.On("RemoveMatchSignal",
|
return &MockBusObject_RemoveMatchSignal_Call{Call: _e.mock.On("RemoveMatchSignal",
|
||||||
append([]interface{}{iface, member}, options...)...)}
|
append([]any{iface, member}, options...)...)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_RemoveMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_RemoveMatchSignal_Call {
|
func (_c *MockBusObject_RemoveMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_RemoveMatchSignal_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 string
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(string)
|
||||||
|
}
|
||||||
|
var arg2 []dbus.MatchOption
|
||||||
variadicArgs := make([]dbus.MatchOption, len(args)-2)
|
variadicArgs := make([]dbus.MatchOption, len(args)-2)
|
||||||
for i, a := range args[2:] {
|
for i, a := range args[2:] {
|
||||||
if a != nil {
|
if a != nil {
|
||||||
variadicArgs[i] = a.(dbus.MatchOption)
|
variadicArgs[i] = a.(dbus.MatchOption)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
run(args[0].(string), args[1].(string), variadicArgs...)
|
arg2 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
arg2...,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_RemoveMatchSignal_Call) Return(_a0 *dbus.Call) *MockBusObject_RemoveMatchSignal_Call {
|
func (_c *MockBusObject_RemoveMatchSignal_Call) Return(call *dbus.Call) *MockBusObject_RemoveMatchSignal_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(call)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_RemoveMatchSignal_Call) RunAndReturn(run func(string, string, ...dbus.MatchOption) *dbus.Call) *MockBusObject_RemoveMatchSignal_Call {
|
func (_c *MockBusObject_RemoveMatchSignal_Call) RunAndReturn(run func(iface string, member string, options ...dbus.MatchOption) *dbus.Call) *MockBusObject_RemoveMatchSignal_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetProperty provides a mock function with given fields: p, v
|
// SetProperty provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) SetProperty(p string, v interface{}) error {
|
func (_mock *MockBusObject) SetProperty(p string, v any) error {
|
||||||
ret := _m.Called(p, v)
|
ret := _mock.Called(p, v)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for SetProperty")
|
panic("no return value specified for SetProperty")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(string, interface{}) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, any) error); ok {
|
||||||
r0 = rf(p, v)
|
r0 = returnFunc(p, v)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -565,43 +682,53 @@ type MockBusObject_SetProperty_Call struct {
|
|||||||
|
|
||||||
// SetProperty is a helper method to define mock.On call
|
// SetProperty is a helper method to define mock.On call
|
||||||
// - p string
|
// - p string
|
||||||
// - v interface{}
|
// - v any
|
||||||
func (_e *MockBusObject_Expecter) SetProperty(p interface{}, v interface{}) *MockBusObject_SetProperty_Call {
|
func (_e *MockBusObject_Expecter) SetProperty(p any, v any) *MockBusObject_SetProperty_Call {
|
||||||
return &MockBusObject_SetProperty_Call{Call: _e.mock.On("SetProperty", p, v)}
|
return &MockBusObject_SetProperty_Call{Call: _e.mock.On("SetProperty", p, v)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_SetProperty_Call) Run(run func(p string, v interface{})) *MockBusObject_SetProperty_Call {
|
func (_c *MockBusObject_SetProperty_Call) Run(run func(p string, v any)) *MockBusObject_SetProperty_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string), args[1].(interface{}))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 any
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(any)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_SetProperty_Call) Return(_a0 error) *MockBusObject_SetProperty_Call {
|
func (_c *MockBusObject_SetProperty_Call) Return(err error) *MockBusObject_SetProperty_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_SetProperty_Call) RunAndReturn(run func(string, interface{}) error) *MockBusObject_SetProperty_Call {
|
func (_c *MockBusObject_SetProperty_Call) RunAndReturn(run func(p string, v any) error) *MockBusObject_SetProperty_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// StoreProperty provides a mock function with given fields: p, value
|
// StoreProperty provides a mock function for the type MockBusObject
|
||||||
func (_m *MockBusObject) StoreProperty(p string, value interface{}) error {
|
func (_mock *MockBusObject) StoreProperty(p string, value any) error {
|
||||||
ret := _m.Called(p, value)
|
ret := _mock.Called(p, value)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for StoreProperty")
|
panic("no return value specified for StoreProperty")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(string, interface{}) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, any) error); ok {
|
||||||
r0 = rf(p, value)
|
r0 = returnFunc(p, value)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -612,38 +739,35 @@ type MockBusObject_StoreProperty_Call struct {
|
|||||||
|
|
||||||
// StoreProperty is a helper method to define mock.On call
|
// StoreProperty is a helper method to define mock.On call
|
||||||
// - p string
|
// - p string
|
||||||
// - value interface{}
|
// - value any
|
||||||
func (_e *MockBusObject_Expecter) StoreProperty(p interface{}, value interface{}) *MockBusObject_StoreProperty_Call {
|
func (_e *MockBusObject_Expecter) StoreProperty(p any, value any) *MockBusObject_StoreProperty_Call {
|
||||||
return &MockBusObject_StoreProperty_Call{Call: _e.mock.On("StoreProperty", p, value)}
|
return &MockBusObject_StoreProperty_Call{Call: _e.mock.On("StoreProperty", p, value)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_StoreProperty_Call) Run(run func(p string, value interface{})) *MockBusObject_StoreProperty_Call {
|
func (_c *MockBusObject_StoreProperty_Call) Run(run func(p string, value any)) *MockBusObject_StoreProperty_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string), args[1].(interface{}))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 any
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(any)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_StoreProperty_Call) Return(_a0 error) *MockBusObject_StoreProperty_Call {
|
func (_c *MockBusObject_StoreProperty_Call) Return(err error) *MockBusObject_StoreProperty_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockBusObject_StoreProperty_Call) RunAndReturn(run func(string, interface{}) error) *MockBusObject_StoreProperty_Call {
|
func (_c *MockBusObject_StoreProperty_Call) RunAndReturn(run func(p string, value any) error) *MockBusObject_StoreProperty_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockBusObject creates a new instance of MockBusObject. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockBusObject(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockBusObject {
|
|
||||||
mock := &MockBusObject{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,26 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package plugins
|
package plugins
|
||||||
|
|
||||||
import mock "github.com/stretchr/testify/mock"
|
import (
|
||||||
|
mock "github.com/stretchr/testify/mock"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewMockGitClient creates a new instance of MockGitClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockGitClient(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockGitClient {
|
||||||
|
mock := &MockGitClient{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockGitClient is an autogenerated mock type for the GitClient type
|
// MockGitClient is an autogenerated mock type for the GitClient type
|
||||||
type MockGitClient struct {
|
type MockGitClient struct {
|
||||||
@@ -17,9 +35,9 @@ func (_m *MockGitClient) EXPECT() *MockGitClient_Expecter {
|
|||||||
return &MockGitClient_Expecter{mock: &_m.Mock}
|
return &MockGitClient_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasUpdates provides a mock function with given fields: path
|
// HasUpdates provides a mock function for the type MockGitClient
|
||||||
func (_m *MockGitClient) HasUpdates(path string) (bool, error) {
|
func (_mock *MockGitClient) HasUpdates(path string) (bool, error) {
|
||||||
ret := _m.Called(path)
|
ret := _mock.Called(path)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for HasUpdates")
|
panic("no return value specified for HasUpdates")
|
||||||
@@ -27,21 +45,19 @@ func (_m *MockGitClient) HasUpdates(path string) (bool, error) {
|
|||||||
|
|
||||||
var r0 bool
|
var r0 bool
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(string) (bool, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) (bool, error)); ok {
|
||||||
return rf(path)
|
return returnFunc(path)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(string) bool); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) bool); ok {
|
||||||
r0 = rf(path)
|
r0 = returnFunc(path)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(bool)
|
r0 = ret.Get(0).(bool)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
r1 = returnFunc(path)
|
||||||
r1 = rf(path)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,36 +74,41 @@ func (_e *MockGitClient_Expecter) HasUpdates(path any) *MockGitClient_HasUpdates
|
|||||||
|
|
||||||
func (_c *MockGitClient_HasUpdates_Call) Run(run func(path string)) *MockGitClient_HasUpdates_Call {
|
func (_c *MockGitClient_HasUpdates_Call) Run(run func(path string)) *MockGitClient_HasUpdates_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockGitClient_HasUpdates_Call) Return(_a0 bool, _a1 error) *MockGitClient_HasUpdates_Call {
|
func (_c *MockGitClient_HasUpdates_Call) Return(b bool, err error) *MockGitClient_HasUpdates_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(b, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockGitClient_HasUpdates_Call) RunAndReturn(run func(string) (bool, error)) *MockGitClient_HasUpdates_Call {
|
func (_c *MockGitClient_HasUpdates_Call) RunAndReturn(run func(path string) (bool, error)) *MockGitClient_HasUpdates_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// PlainClone provides a mock function with given fields: path, url
|
// PlainClone provides a mock function for the type MockGitClient
|
||||||
func (_m *MockGitClient) PlainClone(path string, url string) error {
|
func (_mock *MockGitClient) PlainClone(path string, url string) error {
|
||||||
ret := _m.Called(path, url)
|
ret := _mock.Called(path, url)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for PlainClone")
|
panic("no return value specified for PlainClone")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(string, string) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(string, string) error); ok {
|
||||||
r0 = rf(path, url)
|
r0 = returnFunc(path, url)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,36 +126,46 @@ func (_e *MockGitClient_Expecter) PlainClone(path any, url any) *MockGitClient_P
|
|||||||
|
|
||||||
func (_c *MockGitClient_PlainClone_Call) Run(run func(path string, url string)) *MockGitClient_PlainClone_Call {
|
func (_c *MockGitClient_PlainClone_Call) Run(run func(path string, url string)) *MockGitClient_PlainClone_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string), args[1].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
var arg1 string
|
||||||
|
if args[1] != nil {
|
||||||
|
arg1 = args[1].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
arg1,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockGitClient_PlainClone_Call) Return(_a0 error) *MockGitClient_PlainClone_Call {
|
func (_c *MockGitClient_PlainClone_Call) Return(err error) *MockGitClient_PlainClone_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockGitClient_PlainClone_Call) RunAndReturn(run func(string, string) error) *MockGitClient_PlainClone_Call {
|
func (_c *MockGitClient_PlainClone_Call) RunAndReturn(run func(path string, url string) error) *MockGitClient_PlainClone_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pull provides a mock function with given fields: path
|
// Pull provides a mock function for the type MockGitClient
|
||||||
func (_m *MockGitClient) Pull(path string) error {
|
func (_mock *MockGitClient) Pull(path string) error {
|
||||||
ret := _m.Called(path)
|
ret := _mock.Called(path)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Pull")
|
panic("no return value specified for Pull")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(string) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(string) error); ok {
|
||||||
r0 = rf(path)
|
r0 = returnFunc(path)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,31 +182,23 @@ func (_e *MockGitClient_Expecter) Pull(path any) *MockGitClient_Pull_Call {
|
|||||||
|
|
||||||
func (_c *MockGitClient_Pull_Call) Run(run func(path string)) *MockGitClient_Pull_Call {
|
func (_c *MockGitClient_Pull_Call) Run(run func(path string)) *MockGitClient_Pull_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(string))
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockGitClient_Pull_Call) Return(_a0 error) *MockGitClient_Pull_Call {
|
func (_c *MockGitClient_Pull_Call) Return(err error) *MockGitClient_Pull_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockGitClient_Pull_Call) RunAndReturn(run func(string) error) *MockGitClient_Pull_Call {
|
func (_c *MockGitClient_Pull_Call) RunAndReturn(run func(path string) error) *MockGitClient_Pull_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockGitClient creates a new instance of MockGitClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockGitClient(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockGitClient {
|
|
||||||
mock := &MockGitClient{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,15 +1,30 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package net
|
package net
|
||||||
|
|
||||||
import (
|
import (
|
||||||
net "net"
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
|
|
||||||
time "time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockConn creates a new instance of MockConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockConn(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockConn {
|
||||||
|
mock := &MockConn{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockConn is an autogenerated mock type for the Conn type
|
// MockConn is an autogenerated mock type for the Conn type
|
||||||
type MockConn struct {
|
type MockConn struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -23,21 +38,20 @@ func (_m *MockConn) EXPECT() *MockConn_Expecter {
|
|||||||
return &MockConn_Expecter{mock: &_m.Mock}
|
return &MockConn_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close provides a mock function with no fields
|
// Close provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) Close() error {
|
func (_mock *MockConn) Close() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Close")
|
panic("no return value specified for Close")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,8 +72,8 @@ func (_c *MockConn_Close_Call) Run(run func()) *MockConn_Close_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_Close_Call) Return(_a0 error) *MockConn_Close_Call {
|
func (_c *MockConn_Close_Call) Return(err error) *MockConn_Close_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,23 +82,22 @@ func (_c *MockConn_Close_Call) RunAndReturn(run func() error) *MockConn_Close_Ca
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// LocalAddr provides a mock function with no fields
|
// LocalAddr provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) LocalAddr() net.Addr {
|
func (_mock *MockConn) LocalAddr() net.Addr {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for LocalAddr")
|
panic("no return value specified for LocalAddr")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 net.Addr
|
var r0 net.Addr
|
||||||
if rf, ok := ret.Get(0).(func() net.Addr); ok {
|
if returnFunc, ok := ret.Get(0).(func() net.Addr); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(net.Addr)
|
r0 = ret.Get(0).(net.Addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,8 +118,8 @@ func (_c *MockConn_LocalAddr_Call) Run(run func()) *MockConn_LocalAddr_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_LocalAddr_Call) Return(_a0 net.Addr) *MockConn_LocalAddr_Call {
|
func (_c *MockConn_LocalAddr_Call) Return(addr net.Addr) *MockConn_LocalAddr_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(addr)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,9 +128,9 @@ func (_c *MockConn_LocalAddr_Call) RunAndReturn(run func() net.Addr) *MockConn_L
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read provides a mock function with given fields: b
|
// Read provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) Read(b []byte) (int, error) {
|
func (_mock *MockConn) Read(b []byte) (int, error) {
|
||||||
ret := _m.Called(b)
|
ret := _mock.Called(b)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Read")
|
panic("no return value specified for Read")
|
||||||
@@ -125,21 +138,19 @@ func (_m *MockConn) Read(b []byte) (int, error) {
|
|||||||
|
|
||||||
var r0 int
|
var r0 int
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func([]byte) (int, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func([]byte) (int, error)); ok {
|
||||||
return rf(b)
|
return returnFunc(b)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func([]byte) int); ok {
|
if returnFunc, ok := ret.Get(0).(func([]byte) int); ok {
|
||||||
r0 = rf(b)
|
r0 = returnFunc(b)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(int)
|
r0 = ret.Get(0).(int)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func([]byte) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func([]byte) error); ok {
|
r1 = returnFunc(b)
|
||||||
r1 = rf(b)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,13 +161,19 @@ type MockConn_Read_Call struct {
|
|||||||
|
|
||||||
// Read is a helper method to define mock.On call
|
// Read is a helper method to define mock.On call
|
||||||
// - b []byte
|
// - b []byte
|
||||||
func (_e *MockConn_Expecter) Read(b interface{}) *MockConn_Read_Call {
|
func (_e *MockConn_Expecter) Read(b any) *MockConn_Read_Call {
|
||||||
return &MockConn_Read_Call{Call: _e.mock.On("Read", b)}
|
return &MockConn_Read_Call{Call: _e.mock.On("Read", b)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_Read_Call) Run(run func(b []byte)) *MockConn_Read_Call {
|
func (_c *MockConn_Read_Call) Run(run func(b []byte)) *MockConn_Read_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].([]byte))
|
var arg0 []byte
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].([]byte)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
@@ -166,28 +183,27 @@ func (_c *MockConn_Read_Call) Return(n int, err error) *MockConn_Read_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_Read_Call) RunAndReturn(run func([]byte) (int, error)) *MockConn_Read_Call {
|
func (_c *MockConn_Read_Call) RunAndReturn(run func(b []byte) (int, error)) *MockConn_Read_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoteAddr provides a mock function with no fields
|
// RemoteAddr provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) RemoteAddr() net.Addr {
|
func (_mock *MockConn) RemoteAddr() net.Addr {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for RemoteAddr")
|
panic("no return value specified for RemoteAddr")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 net.Addr
|
var r0 net.Addr
|
||||||
if rf, ok := ret.Get(0).(func() net.Addr); ok {
|
if returnFunc, ok := ret.Get(0).(func() net.Addr); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(net.Addr)
|
r0 = ret.Get(0).(net.Addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,8 +224,8 @@ func (_c *MockConn_RemoteAddr_Call) Run(run func()) *MockConn_RemoteAddr_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_RemoteAddr_Call) Return(_a0 net.Addr) *MockConn_RemoteAddr_Call {
|
func (_c *MockConn_RemoteAddr_Call) Return(addr net.Addr) *MockConn_RemoteAddr_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(addr)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,21 +234,20 @@ func (_c *MockConn_RemoteAddr_Call) RunAndReturn(run func() net.Addr) *MockConn_
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDeadline provides a mock function with given fields: t
|
// SetDeadline provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) SetDeadline(t time.Time) error {
|
func (_mock *MockConn) SetDeadline(t time.Time) error {
|
||||||
ret := _m.Called(t)
|
ret := _mock.Called(t)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for SetDeadline")
|
panic("no return value specified for SetDeadline")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(time.Time) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(time.Time) error); ok {
|
||||||
r0 = rf(t)
|
r0 = returnFunc(t)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,42 +258,47 @@ type MockConn_SetDeadline_Call struct {
|
|||||||
|
|
||||||
// SetDeadline is a helper method to define mock.On call
|
// SetDeadline is a helper method to define mock.On call
|
||||||
// - t time.Time
|
// - t time.Time
|
||||||
func (_e *MockConn_Expecter) SetDeadline(t interface{}) *MockConn_SetDeadline_Call {
|
func (_e *MockConn_Expecter) SetDeadline(t any) *MockConn_SetDeadline_Call {
|
||||||
return &MockConn_SetDeadline_Call{Call: _e.mock.On("SetDeadline", t)}
|
return &MockConn_SetDeadline_Call{Call: _e.mock.On("SetDeadline", t)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetDeadline_Call) Run(run func(t time.Time)) *MockConn_SetDeadline_Call {
|
func (_c *MockConn_SetDeadline_Call) Run(run func(t time.Time)) *MockConn_SetDeadline_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(time.Time))
|
var arg0 time.Time
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(time.Time)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetDeadline_Call) Return(_a0 error) *MockConn_SetDeadline_Call {
|
func (_c *MockConn_SetDeadline_Call) Return(err error) *MockConn_SetDeadline_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetDeadline_Call) RunAndReturn(run func(time.Time) error) *MockConn_SetDeadline_Call {
|
func (_c *MockConn_SetDeadline_Call) RunAndReturn(run func(t time.Time) error) *MockConn_SetDeadline_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetReadDeadline provides a mock function with given fields: t
|
// SetReadDeadline provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) SetReadDeadline(t time.Time) error {
|
func (_mock *MockConn) SetReadDeadline(t time.Time) error {
|
||||||
ret := _m.Called(t)
|
ret := _mock.Called(t)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for SetReadDeadline")
|
panic("no return value specified for SetReadDeadline")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(time.Time) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(time.Time) error); ok {
|
||||||
r0 = rf(t)
|
r0 = returnFunc(t)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,42 +309,47 @@ type MockConn_SetReadDeadline_Call struct {
|
|||||||
|
|
||||||
// SetReadDeadline is a helper method to define mock.On call
|
// SetReadDeadline is a helper method to define mock.On call
|
||||||
// - t time.Time
|
// - t time.Time
|
||||||
func (_e *MockConn_Expecter) SetReadDeadline(t interface{}) *MockConn_SetReadDeadline_Call {
|
func (_e *MockConn_Expecter) SetReadDeadline(t any) *MockConn_SetReadDeadline_Call {
|
||||||
return &MockConn_SetReadDeadline_Call{Call: _e.mock.On("SetReadDeadline", t)}
|
return &MockConn_SetReadDeadline_Call{Call: _e.mock.On("SetReadDeadline", t)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetReadDeadline_Call) Run(run func(t time.Time)) *MockConn_SetReadDeadline_Call {
|
func (_c *MockConn_SetReadDeadline_Call) Run(run func(t time.Time)) *MockConn_SetReadDeadline_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(time.Time))
|
var arg0 time.Time
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(time.Time)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetReadDeadline_Call) Return(_a0 error) *MockConn_SetReadDeadline_Call {
|
func (_c *MockConn_SetReadDeadline_Call) Return(err error) *MockConn_SetReadDeadline_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetReadDeadline_Call) RunAndReturn(run func(time.Time) error) *MockConn_SetReadDeadline_Call {
|
func (_c *MockConn_SetReadDeadline_Call) RunAndReturn(run func(t time.Time) error) *MockConn_SetReadDeadline_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetWriteDeadline provides a mock function with given fields: t
|
// SetWriteDeadline provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) SetWriteDeadline(t time.Time) error {
|
func (_mock *MockConn) SetWriteDeadline(t time.Time) error {
|
||||||
ret := _m.Called(t)
|
ret := _mock.Called(t)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for SetWriteDeadline")
|
panic("no return value specified for SetWriteDeadline")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func(time.Time) error); ok {
|
if returnFunc, ok := ret.Get(0).(func(time.Time) error); ok {
|
||||||
r0 = rf(t)
|
r0 = returnFunc(t)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,30 +360,36 @@ type MockConn_SetWriteDeadline_Call struct {
|
|||||||
|
|
||||||
// SetWriteDeadline is a helper method to define mock.On call
|
// SetWriteDeadline is a helper method to define mock.On call
|
||||||
// - t time.Time
|
// - t time.Time
|
||||||
func (_e *MockConn_Expecter) SetWriteDeadline(t interface{}) *MockConn_SetWriteDeadline_Call {
|
func (_e *MockConn_Expecter) SetWriteDeadline(t any) *MockConn_SetWriteDeadline_Call {
|
||||||
return &MockConn_SetWriteDeadline_Call{Call: _e.mock.On("SetWriteDeadline", t)}
|
return &MockConn_SetWriteDeadline_Call{Call: _e.mock.On("SetWriteDeadline", t)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetWriteDeadline_Call) Run(run func(t time.Time)) *MockConn_SetWriteDeadline_Call {
|
func (_c *MockConn_SetWriteDeadline_Call) Run(run func(t time.Time)) *MockConn_SetWriteDeadline_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(time.Time))
|
var arg0 time.Time
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(time.Time)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetWriteDeadline_Call) Return(_a0 error) *MockConn_SetWriteDeadline_Call {
|
func (_c *MockConn_SetWriteDeadline_Call) Return(err error) *MockConn_SetWriteDeadline_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_SetWriteDeadline_Call) RunAndReturn(run func(time.Time) error) *MockConn_SetWriteDeadline_Call {
|
func (_c *MockConn_SetWriteDeadline_Call) RunAndReturn(run func(t time.Time) error) *MockConn_SetWriteDeadline_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write provides a mock function with given fields: b
|
// Write provides a mock function for the type MockConn
|
||||||
func (_m *MockConn) Write(b []byte) (int, error) {
|
func (_mock *MockConn) Write(b []byte) (int, error) {
|
||||||
ret := _m.Called(b)
|
ret := _mock.Called(b)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Write")
|
panic("no return value specified for Write")
|
||||||
@@ -366,21 +397,19 @@ func (_m *MockConn) Write(b []byte) (int, error) {
|
|||||||
|
|
||||||
var r0 int
|
var r0 int
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func([]byte) (int, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func([]byte) (int, error)); ok {
|
||||||
return rf(b)
|
return returnFunc(b)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func([]byte) int); ok {
|
if returnFunc, ok := ret.Get(0).(func([]byte) int); ok {
|
||||||
r0 = rf(b)
|
r0 = returnFunc(b)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(int)
|
r0 = ret.Get(0).(int)
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func([]byte) error); ok {
|
||||||
if rf, ok := ret.Get(1).(func([]byte) error); ok {
|
r1 = returnFunc(b)
|
||||||
r1 = rf(b)
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,13 +420,19 @@ type MockConn_Write_Call struct {
|
|||||||
|
|
||||||
// Write is a helper method to define mock.On call
|
// Write is a helper method to define mock.On call
|
||||||
// - b []byte
|
// - b []byte
|
||||||
func (_e *MockConn_Expecter) Write(b interface{}) *MockConn_Write_Call {
|
func (_e *MockConn_Expecter) Write(b any) *MockConn_Write_Call {
|
||||||
return &MockConn_Write_Call{Call: _e.mock.On("Write", b)}
|
return &MockConn_Write_Call{Call: _e.mock.On("Write", b)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_Write_Call) Run(run func(b []byte)) *MockConn_Write_Call {
|
func (_c *MockConn_Write_Call) Run(run func(b []byte)) *MockConn_Write_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].([]byte))
|
var arg0 []byte
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].([]byte)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
@@ -407,21 +442,7 @@ func (_c *MockConn_Write_Call) Return(n int, err error) *MockConn_Write_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockConn_Write_Call) RunAndReturn(run func([]byte) (int, error)) *MockConn_Write_Call {
|
func (_c *MockConn_Write_Call) RunAndReturn(run func(b []byte) (int, error)) *MockConn_Write_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockConn creates a new instance of MockConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockConn(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockConn {
|
|
||||||
mock := &MockConn{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,231 +1,12 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package mocks_utils
|
package mocks_utils
|
||||||
|
|
||||||
import mock "github.com/stretchr/testify/mock"
|
import (
|
||||||
|
mock "github.com/stretchr/testify/mock"
|
||||||
// MockAppChecker is an autogenerated mock type for the AppChecker type
|
)
|
||||||
type MockAppChecker struct {
|
|
||||||
mock.Mock
|
|
||||||
}
|
|
||||||
|
|
||||||
type MockAppChecker_Expecter struct {
|
|
||||||
mock *mock.Mock
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_m *MockAppChecker) EXPECT() *MockAppChecker_Expecter {
|
|
||||||
return &MockAppChecker_Expecter{mock: &_m.Mock}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AnyCommandExists provides a mock function with given fields: cmds
|
|
||||||
func (_m *MockAppChecker) AnyCommandExists(cmds ...string) bool {
|
|
||||||
_va := make([]interface{}, len(cmds))
|
|
||||||
for _i := range cmds {
|
|
||||||
_va[_i] = cmds[_i]
|
|
||||||
}
|
|
||||||
var _ca []interface{}
|
|
||||||
_ca = append(_ca, _va...)
|
|
||||||
ret := _m.Called(_ca...)
|
|
||||||
|
|
||||||
if len(ret) == 0 {
|
|
||||||
panic("no return value specified for AnyCommandExists")
|
|
||||||
}
|
|
||||||
|
|
||||||
var r0 bool
|
|
||||||
if rf, ok := ret.Get(0).(func(...string) bool); ok {
|
|
||||||
r0 = rf(cmds...)
|
|
||||||
} else {
|
|
||||||
r0 = ret.Get(0).(bool)
|
|
||||||
}
|
|
||||||
|
|
||||||
return r0
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockAppChecker_AnyCommandExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AnyCommandExists'
|
|
||||||
type MockAppChecker_AnyCommandExists_Call struct {
|
|
||||||
*mock.Call
|
|
||||||
}
|
|
||||||
|
|
||||||
// AnyCommandExists is a helper method to define mock.On call
|
|
||||||
// - cmds ...string
|
|
||||||
func (_e *MockAppChecker_Expecter) AnyCommandExists(cmds ...interface{}) *MockAppChecker_AnyCommandExists_Call {
|
|
||||||
return &MockAppChecker_AnyCommandExists_Call{Call: _e.mock.On("AnyCommandExists",
|
|
||||||
append([]interface{}{}, cmds...)...)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_AnyCommandExists_Call) Run(run func(cmds ...string)) *MockAppChecker_AnyCommandExists_Call {
|
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
|
||||||
variadicArgs := make([]string, len(args)-0)
|
|
||||||
for i, a := range args[0:] {
|
|
||||||
if a != nil {
|
|
||||||
variadicArgs[i] = a.(string)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
run(variadicArgs...)
|
|
||||||
})
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_AnyCommandExists_Call) Return(_a0 bool) *MockAppChecker_AnyCommandExists_Call {
|
|
||||||
_c.Call.Return(_a0)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_AnyCommandExists_Call) RunAndReturn(run func(...string) bool) *MockAppChecker_AnyCommandExists_Call {
|
|
||||||
_c.Call.Return(run)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
// AnyFlatpakExists provides a mock function with given fields: flatpaks
|
|
||||||
func (_m *MockAppChecker) AnyFlatpakExists(flatpaks ...string) bool {
|
|
||||||
_va := make([]interface{}, len(flatpaks))
|
|
||||||
for _i := range flatpaks {
|
|
||||||
_va[_i] = flatpaks[_i]
|
|
||||||
}
|
|
||||||
var _ca []interface{}
|
|
||||||
_ca = append(_ca, _va...)
|
|
||||||
ret := _m.Called(_ca...)
|
|
||||||
|
|
||||||
if len(ret) == 0 {
|
|
||||||
panic("no return value specified for AnyFlatpakExists")
|
|
||||||
}
|
|
||||||
|
|
||||||
var r0 bool
|
|
||||||
if rf, ok := ret.Get(0).(func(...string) bool); ok {
|
|
||||||
r0 = rf(flatpaks...)
|
|
||||||
} else {
|
|
||||||
r0 = ret.Get(0).(bool)
|
|
||||||
}
|
|
||||||
|
|
||||||
return r0
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockAppChecker_AnyFlatpakExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AnyFlatpakExists'
|
|
||||||
type MockAppChecker_AnyFlatpakExists_Call struct {
|
|
||||||
*mock.Call
|
|
||||||
}
|
|
||||||
|
|
||||||
// AnyFlatpakExists is a helper method to define mock.On call
|
|
||||||
// - flatpaks ...string
|
|
||||||
func (_e *MockAppChecker_Expecter) AnyFlatpakExists(flatpaks ...interface{}) *MockAppChecker_AnyFlatpakExists_Call {
|
|
||||||
return &MockAppChecker_AnyFlatpakExists_Call{Call: _e.mock.On("AnyFlatpakExists",
|
|
||||||
append([]interface{}{}, flatpaks...)...)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_AnyFlatpakExists_Call) Run(run func(flatpaks ...string)) *MockAppChecker_AnyFlatpakExists_Call {
|
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
|
||||||
variadicArgs := make([]string, len(args)-0)
|
|
||||||
for i, a := range args[0:] {
|
|
||||||
if a != nil {
|
|
||||||
variadicArgs[i] = a.(string)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
run(variadicArgs...)
|
|
||||||
})
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_AnyFlatpakExists_Call) Return(_a0 bool) *MockAppChecker_AnyFlatpakExists_Call {
|
|
||||||
_c.Call.Return(_a0)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_AnyFlatpakExists_Call) RunAndReturn(run func(...string) bool) *MockAppChecker_AnyFlatpakExists_Call {
|
|
||||||
_c.Call.Return(run)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommandExists provides a mock function with given fields: cmd
|
|
||||||
func (_m *MockAppChecker) CommandExists(cmd string) bool {
|
|
||||||
ret := _m.Called(cmd)
|
|
||||||
|
|
||||||
if len(ret) == 0 {
|
|
||||||
panic("no return value specified for CommandExists")
|
|
||||||
}
|
|
||||||
|
|
||||||
var r0 bool
|
|
||||||
if rf, ok := ret.Get(0).(func(string) bool); ok {
|
|
||||||
r0 = rf(cmd)
|
|
||||||
} else {
|
|
||||||
r0 = ret.Get(0).(bool)
|
|
||||||
}
|
|
||||||
|
|
||||||
return r0
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockAppChecker_CommandExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CommandExists'
|
|
||||||
type MockAppChecker_CommandExists_Call struct {
|
|
||||||
*mock.Call
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommandExists is a helper method to define mock.On call
|
|
||||||
// - cmd string
|
|
||||||
func (_e *MockAppChecker_Expecter) CommandExists(cmd interface{}) *MockAppChecker_CommandExists_Call {
|
|
||||||
return &MockAppChecker_CommandExists_Call{Call: _e.mock.On("CommandExists", cmd)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_CommandExists_Call) Run(run func(cmd string)) *MockAppChecker_CommandExists_Call {
|
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
|
||||||
run(args[0].(string))
|
|
||||||
})
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_CommandExists_Call) Return(_a0 bool) *MockAppChecker_CommandExists_Call {
|
|
||||||
_c.Call.Return(_a0)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_CommandExists_Call) RunAndReturn(run func(string) bool) *MockAppChecker_CommandExists_Call {
|
|
||||||
_c.Call.Return(run)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
// FlatpakExists provides a mock function with given fields: name
|
|
||||||
func (_m *MockAppChecker) FlatpakExists(name string) bool {
|
|
||||||
ret := _m.Called(name)
|
|
||||||
|
|
||||||
if len(ret) == 0 {
|
|
||||||
panic("no return value specified for FlatpakExists")
|
|
||||||
}
|
|
||||||
|
|
||||||
var r0 bool
|
|
||||||
if rf, ok := ret.Get(0).(func(string) bool); ok {
|
|
||||||
r0 = rf(name)
|
|
||||||
} else {
|
|
||||||
r0 = ret.Get(0).(bool)
|
|
||||||
}
|
|
||||||
|
|
||||||
return r0
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockAppChecker_FlatpakExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FlatpakExists'
|
|
||||||
type MockAppChecker_FlatpakExists_Call struct {
|
|
||||||
*mock.Call
|
|
||||||
}
|
|
||||||
|
|
||||||
// FlatpakExists is a helper method to define mock.On call
|
|
||||||
// - name string
|
|
||||||
func (_e *MockAppChecker_Expecter) FlatpakExists(name interface{}) *MockAppChecker_FlatpakExists_Call {
|
|
||||||
return &MockAppChecker_FlatpakExists_Call{Call: _e.mock.On("FlatpakExists", name)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_FlatpakExists_Call) Run(run func(name string)) *MockAppChecker_FlatpakExists_Call {
|
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
|
||||||
run(args[0].(string))
|
|
||||||
})
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_FlatpakExists_Call) Return(_a0 bool) *MockAppChecker_FlatpakExists_Call {
|
|
||||||
_c.Call.Return(_a0)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockAppChecker_FlatpakExists_Call) RunAndReturn(run func(string) bool) *MockAppChecker_FlatpakExists_Call {
|
|
||||||
_c.Call.Return(run)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockAppChecker creates a new instance of MockAppChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
// NewMockAppChecker creates a new instance of MockAppChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
// The first argument is typically a *testing.T value.
|
// The first argument is typically a *testing.T value.
|
||||||
@@ -240,3 +21,244 @@ func NewMockAppChecker(t interface {
|
|||||||
|
|
||||||
return mock
|
return mock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MockAppChecker is an autogenerated mock type for the AppChecker type
|
||||||
|
type MockAppChecker struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
type MockAppChecker_Expecter struct {
|
||||||
|
mock *mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_m *MockAppChecker) EXPECT() *MockAppChecker_Expecter {
|
||||||
|
return &MockAppChecker_Expecter{mock: &_m.Mock}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnyCommandExists provides a mock function for the type MockAppChecker
|
||||||
|
func (_mock *MockAppChecker) AnyCommandExists(cmds ...string) bool {
|
||||||
|
// string
|
||||||
|
_va := make([]any, len(cmds))
|
||||||
|
for _i := range cmds {
|
||||||
|
_va[_i] = cmds[_i]
|
||||||
|
}
|
||||||
|
var _ca []any
|
||||||
|
_ca = append(_ca, _va...)
|
||||||
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for AnyCommandExists")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 bool
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(...string) bool); ok {
|
||||||
|
r0 = returnFunc(cmds...)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(bool)
|
||||||
|
}
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockAppChecker_AnyCommandExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AnyCommandExists'
|
||||||
|
type MockAppChecker_AnyCommandExists_Call struct {
|
||||||
|
*mock.Call
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnyCommandExists is a helper method to define mock.On call
|
||||||
|
// - cmds ...string
|
||||||
|
func (_e *MockAppChecker_Expecter) AnyCommandExists(cmds ...any) *MockAppChecker_AnyCommandExists_Call {
|
||||||
|
return &MockAppChecker_AnyCommandExists_Call{Call: _e.mock.On("AnyCommandExists",
|
||||||
|
append([]any{}, cmds...)...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_AnyCommandExists_Call) Run(run func(cmds ...string)) *MockAppChecker_AnyCommandExists_Call {
|
||||||
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 []string
|
||||||
|
variadicArgs := make([]string, len(args)-0)
|
||||||
|
for i, a := range args[0:] {
|
||||||
|
if a != nil {
|
||||||
|
variadicArgs[i] = a.(string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arg0 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0...,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_AnyCommandExists_Call) Return(b bool) *MockAppChecker_AnyCommandExists_Call {
|
||||||
|
_c.Call.Return(b)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_AnyCommandExists_Call) RunAndReturn(run func(cmds ...string) bool) *MockAppChecker_AnyCommandExists_Call {
|
||||||
|
_c.Call.Return(run)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnyFlatpakExists provides a mock function for the type MockAppChecker
|
||||||
|
func (_mock *MockAppChecker) AnyFlatpakExists(flatpaks ...string) bool {
|
||||||
|
// string
|
||||||
|
_va := make([]any, len(flatpaks))
|
||||||
|
for _i := range flatpaks {
|
||||||
|
_va[_i] = flatpaks[_i]
|
||||||
|
}
|
||||||
|
var _ca []any
|
||||||
|
_ca = append(_ca, _va...)
|
||||||
|
ret := _mock.Called(_ca...)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for AnyFlatpakExists")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 bool
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(...string) bool); ok {
|
||||||
|
r0 = returnFunc(flatpaks...)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(bool)
|
||||||
|
}
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockAppChecker_AnyFlatpakExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AnyFlatpakExists'
|
||||||
|
type MockAppChecker_AnyFlatpakExists_Call struct {
|
||||||
|
*mock.Call
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnyFlatpakExists is a helper method to define mock.On call
|
||||||
|
// - flatpaks ...string
|
||||||
|
func (_e *MockAppChecker_Expecter) AnyFlatpakExists(flatpaks ...any) *MockAppChecker_AnyFlatpakExists_Call {
|
||||||
|
return &MockAppChecker_AnyFlatpakExists_Call{Call: _e.mock.On("AnyFlatpakExists",
|
||||||
|
append([]any{}, flatpaks...)...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_AnyFlatpakExists_Call) Run(run func(flatpaks ...string)) *MockAppChecker_AnyFlatpakExists_Call {
|
||||||
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 []string
|
||||||
|
variadicArgs := make([]string, len(args)-0)
|
||||||
|
for i, a := range args[0:] {
|
||||||
|
if a != nil {
|
||||||
|
variadicArgs[i] = a.(string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arg0 = variadicArgs
|
||||||
|
run(
|
||||||
|
arg0...,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_AnyFlatpakExists_Call) Return(b bool) *MockAppChecker_AnyFlatpakExists_Call {
|
||||||
|
_c.Call.Return(b)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_AnyFlatpakExists_Call) RunAndReturn(run func(flatpaks ...string) bool) *MockAppChecker_AnyFlatpakExists_Call {
|
||||||
|
_c.Call.Return(run)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommandExists provides a mock function for the type MockAppChecker
|
||||||
|
func (_mock *MockAppChecker) CommandExists(cmd string) bool {
|
||||||
|
ret := _mock.Called(cmd)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for CommandExists")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 bool
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(string) bool); ok {
|
||||||
|
r0 = returnFunc(cmd)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(bool)
|
||||||
|
}
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockAppChecker_CommandExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CommandExists'
|
||||||
|
type MockAppChecker_CommandExists_Call struct {
|
||||||
|
*mock.Call
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommandExists is a helper method to define mock.On call
|
||||||
|
// - cmd string
|
||||||
|
func (_e *MockAppChecker_Expecter) CommandExists(cmd any) *MockAppChecker_CommandExists_Call {
|
||||||
|
return &MockAppChecker_CommandExists_Call{Call: _e.mock.On("CommandExists", cmd)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_CommandExists_Call) Run(run func(cmd string)) *MockAppChecker_CommandExists_Call {
|
||||||
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_CommandExists_Call) Return(b bool) *MockAppChecker_CommandExists_Call {
|
||||||
|
_c.Call.Return(b)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_CommandExists_Call) RunAndReturn(run func(cmd string) bool) *MockAppChecker_CommandExists_Call {
|
||||||
|
_c.Call.Return(run)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlatpakExists provides a mock function for the type MockAppChecker
|
||||||
|
func (_mock *MockAppChecker) FlatpakExists(name string) bool {
|
||||||
|
ret := _mock.Called(name)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for FlatpakExists")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 bool
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(string) bool); ok {
|
||||||
|
r0 = returnFunc(name)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(bool)
|
||||||
|
}
|
||||||
|
return r0
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockAppChecker_FlatpakExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FlatpakExists'
|
||||||
|
type MockAppChecker_FlatpakExists_Call struct {
|
||||||
|
*mock.Call
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlatpakExists is a helper method to define mock.On call
|
||||||
|
// - name string
|
||||||
|
func (_e *MockAppChecker_Expecter) FlatpakExists(name any) *MockAppChecker_FlatpakExists_Call {
|
||||||
|
return &MockAppChecker_FlatpakExists_Call{Call: _e.mock.On("FlatpakExists", name)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_FlatpakExists_Call) Run(run func(name string)) *MockAppChecker_FlatpakExists_Call {
|
||||||
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_FlatpakExists_Call) Return(b bool) *MockAppChecker_FlatpakExists_Call {
|
||||||
|
_c.Call.Return(b)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockAppChecker_FlatpakExists_Call) RunAndReturn(run func(name string) bool) *MockAppChecker_FlatpakExists_Call {
|
||||||
|
_c.Call.Return(run)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,133 +1,12 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package mocks_version
|
package mocks_version
|
||||||
|
|
||||||
import mock "github.com/stretchr/testify/mock"
|
import (
|
||||||
|
mock "github.com/stretchr/testify/mock"
|
||||||
// MockVersionFetcher is an autogenerated mock type for the VersionFetcher type
|
)
|
||||||
type MockVersionFetcher struct {
|
|
||||||
mock.Mock
|
|
||||||
}
|
|
||||||
|
|
||||||
type MockVersionFetcher_Expecter struct {
|
|
||||||
mock *mock.Mock
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_m *MockVersionFetcher) EXPECT() *MockVersionFetcher_Expecter {
|
|
||||||
return &MockVersionFetcher_Expecter{mock: &_m.Mock}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCurrentVersion provides a mock function with given fields: dmsPath
|
|
||||||
func (_m *MockVersionFetcher) GetCurrentVersion(dmsPath string) (string, error) {
|
|
||||||
ret := _m.Called(dmsPath)
|
|
||||||
|
|
||||||
if len(ret) == 0 {
|
|
||||||
panic("no return value specified for GetCurrentVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
var r0 string
|
|
||||||
var r1 error
|
|
||||||
if rf, ok := ret.Get(0).(func(string) (string, error)); ok {
|
|
||||||
return rf(dmsPath)
|
|
||||||
}
|
|
||||||
if rf, ok := ret.Get(0).(func(string) string); ok {
|
|
||||||
r0 = rf(dmsPath)
|
|
||||||
} else {
|
|
||||||
r0 = ret.Get(0).(string)
|
|
||||||
}
|
|
||||||
|
|
||||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
|
||||||
r1 = rf(dmsPath)
|
|
||||||
} else {
|
|
||||||
r1 = ret.Error(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
return r0, r1
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockVersionFetcher_GetCurrentVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCurrentVersion'
|
|
||||||
type MockVersionFetcher_GetCurrentVersion_Call struct {
|
|
||||||
*mock.Call
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCurrentVersion is a helper method to define mock.On call
|
|
||||||
// - dmsPath string
|
|
||||||
func (_e *MockVersionFetcher_Expecter) GetCurrentVersion(dmsPath interface{}) *MockVersionFetcher_GetCurrentVersion_Call {
|
|
||||||
return &MockVersionFetcher_GetCurrentVersion_Call{Call: _e.mock.On("GetCurrentVersion", dmsPath)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockVersionFetcher_GetCurrentVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetCurrentVersion_Call {
|
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
|
||||||
run(args[0].(string))
|
|
||||||
})
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockVersionFetcher_GetCurrentVersion_Call) Return(_a0 string, _a1 error) *MockVersionFetcher_GetCurrentVersion_Call {
|
|
||||||
_c.Call.Return(_a0, _a1)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockVersionFetcher_GetCurrentVersion_Call) RunAndReturn(run func(string) (string, error)) *MockVersionFetcher_GetCurrentVersion_Call {
|
|
||||||
_c.Call.Return(run)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLatestVersion provides a mock function with given fields: dmsPath
|
|
||||||
func (_m *MockVersionFetcher) GetLatestVersion(dmsPath string) (string, error) {
|
|
||||||
ret := _m.Called(dmsPath)
|
|
||||||
|
|
||||||
if len(ret) == 0 {
|
|
||||||
panic("no return value specified for GetLatestVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
var r0 string
|
|
||||||
var r1 error
|
|
||||||
if rf, ok := ret.Get(0).(func(string) (string, error)); ok {
|
|
||||||
return rf(dmsPath)
|
|
||||||
}
|
|
||||||
if rf, ok := ret.Get(0).(func(string) string); ok {
|
|
||||||
r0 = rf(dmsPath)
|
|
||||||
} else {
|
|
||||||
r0 = ret.Get(0).(string)
|
|
||||||
}
|
|
||||||
|
|
||||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
|
||||||
r1 = rf(dmsPath)
|
|
||||||
} else {
|
|
||||||
r1 = ret.Error(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
return r0, r1
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockVersionFetcher_GetLatestVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestVersion'
|
|
||||||
type MockVersionFetcher_GetLatestVersion_Call struct {
|
|
||||||
*mock.Call
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLatestVersion is a helper method to define mock.On call
|
|
||||||
// - dmsPath string
|
|
||||||
func (_e *MockVersionFetcher_Expecter) GetLatestVersion(dmsPath interface{}) *MockVersionFetcher_GetLatestVersion_Call {
|
|
||||||
return &MockVersionFetcher_GetLatestVersion_Call{Call: _e.mock.On("GetLatestVersion", dmsPath)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockVersionFetcher_GetLatestVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetLatestVersion_Call {
|
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
|
||||||
run(args[0].(string))
|
|
||||||
})
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockVersionFetcher_GetLatestVersion_Call) Return(_a0 string, _a1 error) *MockVersionFetcher_GetLatestVersion_Call {
|
|
||||||
_c.Call.Return(_a0, _a1)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (_c *MockVersionFetcher_GetLatestVersion_Call) RunAndReturn(run func(string) (string, error)) *MockVersionFetcher_GetLatestVersion_Call {
|
|
||||||
_c.Call.Return(run)
|
|
||||||
return _c
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockVersionFetcher creates a new instance of MockVersionFetcher. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
// NewMockVersionFetcher creates a new instance of MockVersionFetcher. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
// The first argument is typically a *testing.T value.
|
// The first argument is typically a *testing.T value.
|
||||||
@@ -142,3 +21,136 @@ func NewMockVersionFetcher(t interface {
|
|||||||
|
|
||||||
return mock
|
return mock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MockVersionFetcher is an autogenerated mock type for the VersionFetcher type
|
||||||
|
type MockVersionFetcher struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
type MockVersionFetcher_Expecter struct {
|
||||||
|
mock *mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_m *MockVersionFetcher) EXPECT() *MockVersionFetcher_Expecter {
|
||||||
|
return &MockVersionFetcher_Expecter{mock: &_m.Mock}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCurrentVersion provides a mock function for the type MockVersionFetcher
|
||||||
|
func (_mock *MockVersionFetcher) GetCurrentVersion(dmsPath string) (string, error) {
|
||||||
|
ret := _mock.Called(dmsPath)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for GetCurrentVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 string
|
||||||
|
var r1 error
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(string) (string, error)); ok {
|
||||||
|
return returnFunc(dmsPath)
|
||||||
|
}
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(string) string); ok {
|
||||||
|
r0 = returnFunc(dmsPath)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(string)
|
||||||
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
|
||||||
|
r1 = returnFunc(dmsPath)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockVersionFetcher_GetCurrentVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCurrentVersion'
|
||||||
|
type MockVersionFetcher_GetCurrentVersion_Call struct {
|
||||||
|
*mock.Call
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCurrentVersion is a helper method to define mock.On call
|
||||||
|
// - dmsPath string
|
||||||
|
func (_e *MockVersionFetcher_Expecter) GetCurrentVersion(dmsPath any) *MockVersionFetcher_GetCurrentVersion_Call {
|
||||||
|
return &MockVersionFetcher_GetCurrentVersion_Call{Call: _e.mock.On("GetCurrentVersion", dmsPath)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockVersionFetcher_GetCurrentVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetCurrentVersion_Call {
|
||||||
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockVersionFetcher_GetCurrentVersion_Call) Return(s string, err error) *MockVersionFetcher_GetCurrentVersion_Call {
|
||||||
|
_c.Call.Return(s, err)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockVersionFetcher_GetCurrentVersion_Call) RunAndReturn(run func(dmsPath string) (string, error)) *MockVersionFetcher_GetCurrentVersion_Call {
|
||||||
|
_c.Call.Return(run)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLatestVersion provides a mock function for the type MockVersionFetcher
|
||||||
|
func (_mock *MockVersionFetcher) GetLatestVersion(dmsPath string) (string, error) {
|
||||||
|
ret := _mock.Called(dmsPath)
|
||||||
|
|
||||||
|
if len(ret) == 0 {
|
||||||
|
panic("no return value specified for GetLatestVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
var r0 string
|
||||||
|
var r1 error
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(string) (string, error)); ok {
|
||||||
|
return returnFunc(dmsPath)
|
||||||
|
}
|
||||||
|
if returnFunc, ok := ret.Get(0).(func(string) string); ok {
|
||||||
|
r0 = returnFunc(dmsPath)
|
||||||
|
} else {
|
||||||
|
r0 = ret.Get(0).(string)
|
||||||
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
|
||||||
|
r1 = returnFunc(dmsPath)
|
||||||
|
} else {
|
||||||
|
r1 = ret.Error(1)
|
||||||
|
}
|
||||||
|
return r0, r1
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockVersionFetcher_GetLatestVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestVersion'
|
||||||
|
type MockVersionFetcher_GetLatestVersion_Call struct {
|
||||||
|
*mock.Call
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLatestVersion is a helper method to define mock.On call
|
||||||
|
// - dmsPath string
|
||||||
|
func (_e *MockVersionFetcher_Expecter) GetLatestVersion(dmsPath any) *MockVersionFetcher_GetLatestVersion_Call {
|
||||||
|
return &MockVersionFetcher_GetLatestVersion_Call{Call: _e.mock.On("GetLatestVersion", dmsPath)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockVersionFetcher_GetLatestVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetLatestVersion_Call {
|
||||||
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
|
var arg0 string
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(string)
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockVersionFetcher_GetLatestVersion_Call) Return(s string, err error) *MockVersionFetcher_GetLatestVersion_Call {
|
||||||
|
_c.Call.Return(s, err)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_c *MockVersionFetcher_GetLatestVersion_Call) RunAndReturn(run func(dmsPath string) (string, error)) *MockVersionFetcher_GetLatestVersion_Call {
|
||||||
|
_c.Call.Return(run)
|
||||||
|
return _c
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,12 +1,28 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package mocks_wlclient
|
package mocks_wlclient
|
||||||
|
|
||||||
import (
|
import (
|
||||||
client "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
|
"github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockWaylandDisplay creates a new instance of MockWaylandDisplay. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockWaylandDisplay(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockWaylandDisplay {
|
||||||
|
mock := &MockWaylandDisplay{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockWaylandDisplay is an autogenerated mock type for the WaylandDisplay type
|
// MockWaylandDisplay is an autogenerated mock type for the WaylandDisplay type
|
||||||
type MockWaylandDisplay struct {
|
type MockWaylandDisplay struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -20,23 +36,22 @@ func (_m *MockWaylandDisplay) EXPECT() *MockWaylandDisplay_Expecter {
|
|||||||
return &MockWaylandDisplay_Expecter{mock: &_m.Mock}
|
return &MockWaylandDisplay_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Context provides a mock function with no fields
|
// Context provides a mock function for the type MockWaylandDisplay
|
||||||
func (_m *MockWaylandDisplay) Context() *client.Context {
|
func (_mock *MockWaylandDisplay) Context() *client.Context {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Context")
|
panic("no return value specified for Context")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *client.Context
|
var r0 *client.Context
|
||||||
if rf, ok := ret.Get(0).(func() *client.Context); ok {
|
if returnFunc, ok := ret.Get(0).(func() *client.Context); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*client.Context)
|
r0 = ret.Get(0).(*client.Context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,8 +72,8 @@ func (_c *MockWaylandDisplay_Context_Call) Run(run func()) *MockWaylandDisplay_C
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandDisplay_Context_Call) Return(_a0 *client.Context) *MockWaylandDisplay_Context_Call {
|
func (_c *MockWaylandDisplay_Context_Call) Return(context *client.Context) *MockWaylandDisplay_Context_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(context)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,21 +82,20 @@ func (_c *MockWaylandDisplay_Context_Call) RunAndReturn(run func() *client.Conte
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destroy provides a mock function with no fields
|
// Destroy provides a mock function for the type MockWaylandDisplay
|
||||||
func (_m *MockWaylandDisplay) Destroy() error {
|
func (_mock *MockWaylandDisplay) Destroy() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Destroy")
|
panic("no return value specified for Destroy")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,8 +116,8 @@ func (_c *MockWaylandDisplay_Destroy_Call) Run(run func()) *MockWaylandDisplay_D
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandDisplay_Destroy_Call) Return(_a0 error) *MockWaylandDisplay_Destroy_Call {
|
func (_c *MockWaylandDisplay_Destroy_Call) Return(err error) *MockWaylandDisplay_Destroy_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,9 +126,9 @@ func (_c *MockWaylandDisplay_Destroy_Call) RunAndReturn(run func() error) *MockW
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRegistry provides a mock function with no fields
|
// GetRegistry provides a mock function for the type MockWaylandDisplay
|
||||||
func (_m *MockWaylandDisplay) GetRegistry() (*client.Registry, error) {
|
func (_mock *MockWaylandDisplay) GetRegistry() (*client.Registry, error) {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for GetRegistry")
|
panic("no return value specified for GetRegistry")
|
||||||
@@ -122,23 +136,21 @@ func (_m *MockWaylandDisplay) GetRegistry() (*client.Registry, error) {
|
|||||||
|
|
||||||
var r0 *client.Registry
|
var r0 *client.Registry
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func() (*client.Registry, error)); ok {
|
if returnFunc, ok := ret.Get(0).(func() (*client.Registry, error)); ok {
|
||||||
return rf()
|
return returnFunc()
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func() *client.Registry); ok {
|
if returnFunc, ok := ret.Get(0).(func() *client.Registry); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*client.Registry)
|
r0 = ret.Get(0).(*client.Registry)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if returnFunc, ok := ret.Get(1).(func() error); ok {
|
||||||
if rf, ok := ret.Get(1).(func() error); ok {
|
r1 = returnFunc()
|
||||||
r1 = rf()
|
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,8 +171,8 @@ func (_c *MockWaylandDisplay_GetRegistry_Call) Run(run func()) *MockWaylandDispl
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandDisplay_GetRegistry_Call) Return(_a0 *client.Registry, _a1 error) *MockWaylandDisplay_GetRegistry_Call {
|
func (_c *MockWaylandDisplay_GetRegistry_Call) Return(registry *client.Registry, err error) *MockWaylandDisplay_GetRegistry_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(registry, err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,21 +181,20 @@ func (_c *MockWaylandDisplay_GetRegistry_Call) RunAndReturn(run func() (*client.
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Roundtrip provides a mock function with no fields
|
// Roundtrip provides a mock function for the type MockWaylandDisplay
|
||||||
func (_m *MockWaylandDisplay) Roundtrip() error {
|
func (_mock *MockWaylandDisplay) Roundtrip() error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Roundtrip")
|
panic("no return value specified for Roundtrip")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 error
|
var r0 error
|
||||||
if rf, ok := ret.Get(0).(func() error); ok {
|
if returnFunc, ok := ret.Get(0).(func() error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Error(0)
|
r0 = ret.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,8 +215,8 @@ func (_c *MockWaylandDisplay_Roundtrip_Call) Run(run func()) *MockWaylandDisplay
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandDisplay_Roundtrip_Call) Return(_a0 error) *MockWaylandDisplay_Roundtrip_Call {
|
func (_c *MockWaylandDisplay_Roundtrip_Call) Return(err error) *MockWaylandDisplay_Roundtrip_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(err)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,17 +224,3 @@ func (_c *MockWaylandDisplay_Roundtrip_Call) RunAndReturn(run func() error) *Moc
|
|||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockWaylandDisplay creates a new instance of MockWaylandDisplay. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockWaylandDisplay(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockWaylandDisplay {
|
|
||||||
mock := &MockWaylandDisplay{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,12 +1,28 @@
|
|||||||
// Code generated by mockery v2.53.5. DO NOT EDIT.
|
// Code generated by mockery; DO NOT EDIT.
|
||||||
|
// github.com/vektra/mockery
|
||||||
|
// template: testify
|
||||||
|
|
||||||
package mocks_wlcontext
|
package mocks_wlcontext
|
||||||
|
|
||||||
import (
|
import (
|
||||||
client "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
|
"github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMockWaylandContext creates a new instance of MockWaylandContext. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewMockWaylandContext(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *MockWaylandContext {
|
||||||
|
mock := &MockWaylandContext{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
// MockWaylandContext is an autogenerated mock type for the WaylandContext type
|
// MockWaylandContext is an autogenerated mock type for the WaylandContext type
|
||||||
type MockWaylandContext struct {
|
type MockWaylandContext struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
@@ -20,9 +36,10 @@ func (_m *MockWaylandContext) EXPECT() *MockWaylandContext_Expecter {
|
|||||||
return &MockWaylandContext_Expecter{mock: &_m.Mock}
|
return &MockWaylandContext_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close provides a mock function with no fields
|
// Close provides a mock function for the type MockWaylandContext
|
||||||
func (_m *MockWaylandContext) Close() {
|
func (_mock *MockWaylandContext) Close() {
|
||||||
_m.Called()
|
_mock.Called()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockWaylandContext_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
|
// MockWaylandContext_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
|
||||||
@@ -52,23 +69,22 @@ func (_c *MockWaylandContext_Close_Call) RunAndReturn(run func()) *MockWaylandCo
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display provides a mock function with no fields
|
// Display provides a mock function for the type MockWaylandContext
|
||||||
func (_m *MockWaylandContext) Display() *client.Display {
|
func (_mock *MockWaylandContext) Display() *client.Display {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for Display")
|
panic("no return value specified for Display")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 *client.Display
|
var r0 *client.Display
|
||||||
if rf, ok := ret.Get(0).(func() *client.Display); ok {
|
if returnFunc, ok := ret.Get(0).(func() *client.Display); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*client.Display)
|
r0 = ret.Get(0).(*client.Display)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,8 +105,8 @@ func (_c *MockWaylandContext_Display_Call) Run(run func()) *MockWaylandContext_D
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandContext_Display_Call) Return(_a0 *client.Display) *MockWaylandContext_Display_Call {
|
func (_c *MockWaylandContext_Display_Call) Return(display *client.Display) *MockWaylandContext_Display_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(display)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,23 +115,22 @@ func (_c *MockWaylandContext_Display_Call) RunAndReturn(run func() *client.Displ
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// FatalError provides a mock function with no fields
|
// FatalError provides a mock function for the type MockWaylandContext
|
||||||
func (_m *MockWaylandContext) FatalError() <-chan error {
|
func (_mock *MockWaylandContext) FatalError() <-chan error {
|
||||||
ret := _m.Called()
|
ret := _mock.Called()
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for FatalError")
|
panic("no return value specified for FatalError")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 <-chan error
|
var r0 <-chan error
|
||||||
if rf, ok := ret.Get(0).(func() <-chan error); ok {
|
if returnFunc, ok := ret.Get(0).(func() <-chan error); ok {
|
||||||
r0 = rf()
|
r0 = returnFunc()
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(<-chan error)
|
r0 = ret.Get(0).(<-chan error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,8 +151,8 @@ func (_c *MockWaylandContext_FatalError_Call) Run(run func()) *MockWaylandContex
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandContext_FatalError_Call) Return(_a0 <-chan error) *MockWaylandContext_FatalError_Call {
|
func (_c *MockWaylandContext_FatalError_Call) Return(errCh <-chan error) *MockWaylandContext_FatalError_Call {
|
||||||
_c.Call.Return(_a0)
|
_c.Call.Return(errCh)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,9 +161,10 @@ func (_c *MockWaylandContext_FatalError_Call) RunAndReturn(run func() <-chan err
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Post provides a mock function with given fields: fn
|
// Post provides a mock function for the type MockWaylandContext
|
||||||
func (_m *MockWaylandContext) Post(fn func()) {
|
func (_mock *MockWaylandContext) Post(fn func()) {
|
||||||
_m.Called(fn)
|
_mock.Called(fn)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockWaylandContext_Post_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Post'
|
// MockWaylandContext_Post_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Post'
|
||||||
@@ -158,13 +174,19 @@ type MockWaylandContext_Post_Call struct {
|
|||||||
|
|
||||||
// Post is a helper method to define mock.On call
|
// Post is a helper method to define mock.On call
|
||||||
// - fn func()
|
// - fn func()
|
||||||
func (_e *MockWaylandContext_Expecter) Post(fn interface{}) *MockWaylandContext_Post_Call {
|
func (_e *MockWaylandContext_Expecter) Post(fn any) *MockWaylandContext_Post_Call {
|
||||||
return &MockWaylandContext_Post_Call{Call: _e.mock.On("Post", fn)}
|
return &MockWaylandContext_Post_Call{Call: _e.mock.On("Post", fn)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandContext_Post_Call) Run(run func(fn func())) *MockWaylandContext_Post_Call {
|
func (_c *MockWaylandContext_Post_Call) Run(run func(fn func())) *MockWaylandContext_Post_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(func()))
|
var arg0 func()
|
||||||
|
if args[0] != nil {
|
||||||
|
arg0 = args[0].(func())
|
||||||
|
}
|
||||||
|
run(
|
||||||
|
arg0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
@@ -174,14 +196,15 @@ func (_c *MockWaylandContext_Post_Call) Return() *MockWaylandContext_Post_Call {
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *MockWaylandContext_Post_Call) RunAndReturn(run func(func())) *MockWaylandContext_Post_Call {
|
func (_c *MockWaylandContext_Post_Call) RunAndReturn(run func(fn func())) *MockWaylandContext_Post_Call {
|
||||||
_c.Run(run)
|
_c.Run(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start provides a mock function with no fields
|
// Start provides a mock function for the type MockWaylandContext
|
||||||
func (_m *MockWaylandContext) Start() {
|
func (_mock *MockWaylandContext) Start() {
|
||||||
_m.Called()
|
_mock.Called()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockWaylandContext_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'
|
// MockWaylandContext_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'
|
||||||
@@ -210,17 +233,3 @@ func (_c *MockWaylandContext_Start_Call) RunAndReturn(run func()) *MockWaylandCo
|
|||||||
_c.Run(run)
|
_c.Run(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockWaylandContext creates a new instance of MockWaylandContext. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
|
||||||
// The first argument is typically a *testing.T value.
|
|
||||||
func NewMockWaylandContext(t interface {
|
|
||||||
mock.TestingT
|
|
||||||
Cleanup(func())
|
|
||||||
}) *MockWaylandContext {
|
|
||||||
mock := &MockWaylandContext{}
|
|
||||||
mock.Mock.Test(t)
|
|
||||||
|
|
||||||
t.Cleanup(func() { mock.AssertExpectations(t) })
|
|
||||||
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package qmlchecks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGreeterRememberLastSessionFallsBackToDesktopID(t *testing.T) {
|
||||||
|
data, err := os.ReadFile("../../../quickshell/Modules/Greetd/GreeterContent.qml")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("read greeter QML: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
content := string(data)
|
||||||
|
if !strings.Contains(content, "GreetdMemory.lastSessionDesktopId || desktopIdFromPath(GreetdMemory.lastSessionId)") {
|
||||||
|
t.Fatalf("remembered greeter sessions should derive a desktop id from legacy absolute session paths")
|
||||||
|
}
|
||||||
|
if !strings.Contains(content, "GreeterState.sessionDesktopIds[i] === savedDesktopId") {
|
||||||
|
t.Fatalf("remembered greeter sessions should match current sessions by desktop id")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -935,7 +935,7 @@ func (m *Manager) CreateHistoryEntryFromPinned(pinnedEntry *Entry) error {
|
|||||||
Pinned: false,
|
Pinned: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := m.storeEntryWithoutDedup(newEntry); err != nil {
|
if err := m.storeEntry(newEntry); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -945,36 +945,6 @@ func (m *Manager) CreateHistoryEntryFromPinned(pinnedEntry *Entry) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) storeEntryWithoutDedup(entry Entry) error {
|
|
||||||
if m.db == nil {
|
|
||||||
return fmt.Errorf("database not available")
|
|
||||||
}
|
|
||||||
|
|
||||||
entry.Hash = computeHash(entry.Data)
|
|
||||||
|
|
||||||
return m.db.Update(func(tx *bolt.Tx) error {
|
|
||||||
b := tx.Bucket([]byte("clipboard"))
|
|
||||||
|
|
||||||
id, err := b.NextSequence()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
entry.ID = id
|
|
||||||
|
|
||||||
encoded, err := encodeEntry(entry)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := b.Put(itob(id), encoded); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m.trimLengthInTx(b)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Manager) ClearHistory() {
|
func (m *Manager) ClearHistory() {
|
||||||
if m.db == nil {
|
if m.db == nil {
|
||||||
return
|
return
|
||||||
@@ -1653,6 +1623,37 @@ func (m *Manager) UnpinEntry(id uint64) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if entry.Pinned {
|
||||||
|
currentKey := itob(id)
|
||||||
|
var keepKey []byte
|
||||||
|
var deleteKeys [][]byte
|
||||||
|
|
||||||
|
c := b.Cursor()
|
||||||
|
for k, v := c.Last(); k != nil; k, v = c.Prev() {
|
||||||
|
if bytes.Equal(k, currentKey) || extractHash(v) != entry.Hash {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
duplicate, err := decodeEntryMeta(v)
|
||||||
|
if err == nil && !duplicate.Pinned {
|
||||||
|
key := append([]byte(nil), k...)
|
||||||
|
if keepKey == nil {
|
||||||
|
keepKey = key
|
||||||
|
} else {
|
||||||
|
deleteKeys = append(deleteKeys, key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if keepKey != nil {
|
||||||
|
for _, key := range deleteKeys {
|
||||||
|
if err := b.Delete(key); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b.Delete(currentKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
entry.Pinned = false
|
entry.Pinned = false
|
||||||
encoded, err := encodeEntry(entry)
|
encoded, err := encodeEntry(entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/mock"
|
"github.com/stretchr/testify/mock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
|
|
||||||
mocks_wlcontext "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/wlcontext"
|
mocks_wlcontext "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/wlcontext"
|
||||||
)
|
)
|
||||||
@@ -273,6 +274,110 @@ func TestHandleGetEntry_MissingIDReturnsNullResult(t *testing.T) {
|
|||||||
assert.Nil(t, resp.Result)
|
assert.Nil(t, resp.Result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnpinEntry_KeepsTopUnpinnedDuplicate(t *testing.T) {
|
||||||
|
m := newTestManagerWithDB(t)
|
||||||
|
|
||||||
|
require.NoError(t, m.storeEntry(Entry{
|
||||||
|
Data: []byte("saved content"),
|
||||||
|
MimeType: "text/plain;charset=utf-8",
|
||||||
|
Preview: "saved content",
|
||||||
|
Size: len("saved content"),
|
||||||
|
Timestamp: time.Now().Add(-time.Minute).Truncate(time.Second),
|
||||||
|
IsImage: false,
|
||||||
|
}))
|
||||||
|
|
||||||
|
history := m.GetHistory()
|
||||||
|
require.Len(t, history, 1)
|
||||||
|
pinnedID := history[0].ID
|
||||||
|
require.NoError(t, m.PinEntry(pinnedID))
|
||||||
|
|
||||||
|
pinnedEntry, err := m.GetEntry(pinnedID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.True(t, pinnedEntry.Pinned)
|
||||||
|
|
||||||
|
// Bypass storeEntry to simulate legacy duplicate ordinary history entries.
|
||||||
|
insertLegacyUnpinnedDuplicate := func(timestamp time.Time) Entry {
|
||||||
|
duplicate := Entry{
|
||||||
|
Data: pinnedEntry.Data,
|
||||||
|
MimeType: pinnedEntry.MimeType,
|
||||||
|
Preview: pinnedEntry.Preview,
|
||||||
|
Size: pinnedEntry.Size,
|
||||||
|
Timestamp: timestamp,
|
||||||
|
IsImage: pinnedEntry.IsImage,
|
||||||
|
Pinned: false,
|
||||||
|
}
|
||||||
|
duplicate.Hash = computeHash(duplicate.Data)
|
||||||
|
|
||||||
|
require.NoError(t, m.db.Update(func(tx *bolt.Tx) error {
|
||||||
|
b := tx.Bucket([]byte("clipboard"))
|
||||||
|
id, err := b.NextSequence()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
duplicate.ID = id
|
||||||
|
|
||||||
|
encoded, err := encodeEntry(duplicate)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return b.Put(itob(id), encoded)
|
||||||
|
}))
|
||||||
|
|
||||||
|
return duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
olderHistoryDuplicate := insertLegacyUnpinnedDuplicate(time.Now().Add(time.Hour))
|
||||||
|
topHistoryDuplicate := insertLegacyUnpinnedDuplicate(time.Now().Add(-time.Hour))
|
||||||
|
require.Greater(t, topHistoryDuplicate.ID, olderHistoryDuplicate.ID)
|
||||||
|
require.True(t, olderHistoryDuplicate.Timestamp.After(topHistoryDuplicate.Timestamp))
|
||||||
|
|
||||||
|
history = m.GetHistory()
|
||||||
|
require.Len(t, history, 3)
|
||||||
|
require.Equal(t, topHistoryDuplicate.ID, history[0].ID)
|
||||||
|
require.NoError(t, m.UnpinEntry(pinnedID))
|
||||||
|
|
||||||
|
history = m.GetHistory()
|
||||||
|
require.Len(t, history, 1)
|
||||||
|
assert.False(t, history[0].Pinned)
|
||||||
|
assert.Equal(t, pinnedEntry.Hash, history[0].Hash)
|
||||||
|
assert.Equal(t, topHistoryDuplicate.ID, history[0].ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateHistoryEntryFromPinned_KeepsLatestUnpinnedDuplicate(t *testing.T) {
|
||||||
|
m := newTestManagerWithDB(t)
|
||||||
|
|
||||||
|
require.NoError(t, m.storeEntry(Entry{
|
||||||
|
Data: []byte("saved content"),
|
||||||
|
MimeType: "text/plain;charset=utf-8",
|
||||||
|
Preview: "saved content",
|
||||||
|
Size: len("saved content"),
|
||||||
|
Timestamp: time.Now().Add(-time.Minute).Truncate(time.Second),
|
||||||
|
IsImage: false,
|
||||||
|
}))
|
||||||
|
|
||||||
|
history := m.GetHistory()
|
||||||
|
require.Len(t, history, 1)
|
||||||
|
pinnedID := history[0].ID
|
||||||
|
require.NoError(t, m.PinEntry(pinnedID))
|
||||||
|
|
||||||
|
pinnedEntry, err := m.GetEntry(pinnedID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.True(t, pinnedEntry.Pinned)
|
||||||
|
require.NoError(t, m.CreateHistoryEntryFromPinned(pinnedEntry))
|
||||||
|
firstDuplicate := m.GetHistory()[0]
|
||||||
|
require.NotEqual(t, pinnedID, firstDuplicate.ID)
|
||||||
|
require.NoError(t, m.CreateHistoryEntryFromPinned(pinnedEntry))
|
||||||
|
latestDuplicate := m.GetHistory()[0]
|
||||||
|
|
||||||
|
history = m.GetHistory()
|
||||||
|
require.Len(t, history, 2)
|
||||||
|
assert.Equal(t, latestDuplicate.ID, history[0].ID)
|
||||||
|
assert.False(t, history[0].Pinned)
|
||||||
|
assert.Equal(t, pinnedID, history[1].ID)
|
||||||
|
assert.True(t, history[1].Pinned)
|
||||||
|
assert.NotEqual(t, firstDuplicate.ID, latestDuplicate.ID)
|
||||||
|
}
|
||||||
|
|
||||||
func TestManager_ConcurrentSubscriberAccess(t *testing.T) {
|
func TestManager_ConcurrentSubscriberAccess(t *testing.T) {
|
||||||
m := &Manager{
|
m := &Manager{
|
||||||
subscribers: make(map[string]chan State),
|
subscribers: make(map[string]chan State),
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
)
|
)
|
||||||
@@ -94,9 +95,65 @@ func (m *Manager) initializeSettings() error {
|
|||||||
return fmt.Errorf("failed to update settings state: %w", err)
|
return fmt.Errorf("failed to update settings state: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
go m.watchSettingsChanges()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Manager) watchSettingsChanges() {
|
||||||
|
conn, err := dbus.ConnectSessionBus()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("color-scheme watcher: session bus connect: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := conn.AddMatchSignal(
|
||||||
|
dbus.WithMatchInterface(dbusPortalSettingsInterface),
|
||||||
|
dbus.WithMatchMember("SettingChanged"),
|
||||||
|
); err != nil {
|
||||||
|
log.Warnf("Failed to watch portal settings changes: %v", err)
|
||||||
|
conn.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
signals := make(chan *dbus.Signal, 64)
|
||||||
|
conn.Signal(signals)
|
||||||
|
|
||||||
|
for sig := range signals {
|
||||||
|
if sig.Name != dbusPortalSettingsInterface+".SettingChanged" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if len(sig.Body) < 3 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace, _ := sig.Body[0].(string)
|
||||||
|
key, _ := sig.Body[1].(string)
|
||||||
|
if namespace != "org.freedesktop.appearance" || key != "color-scheme" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
variant, ok := sig.Body[2].(dbus.Variant)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
colorScheme, ok := dbusutil.As[uint32](variant)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
m.stateMutex.Lock()
|
||||||
|
changed := m.state.Settings.ColorScheme != colorScheme || !m.state.Settings.Available
|
||||||
|
m.state.Settings.ColorScheme = colorScheme
|
||||||
|
m.state.Settings.Available = true
|
||||||
|
m.stateMutex.Unlock()
|
||||||
|
|
||||||
|
if changed {
|
||||||
|
m.NotifySubscribers()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Manager) updateAccountsState() error {
|
func (m *Manager) updateAccountsState() error {
|
||||||
if !m.state.Accounts.Available || m.accountsObj == nil {
|
if !m.state.Accounts.Available || m.accountsObj == nil {
|
||||||
return fmt.Errorf("accounts service not available")
|
return fmt.Errorf("accounts service not available")
|
||||||
@@ -134,10 +191,23 @@ func (m *Manager) updateSettingsState() error {
|
|||||||
var variant dbus.Variant
|
var variant dbus.Variant
|
||||||
err := m.settingsObj.Call(dbusPortalSettingsInterface+".ReadOne", 0, "org.freedesktop.appearance", "color-scheme").Store(&variant)
|
err := m.settingsObj.Call(dbusPortalSettingsInterface+".ReadOne", 0, "org.freedesktop.appearance", "color-scheme").Store(&variant)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
// Older xdg-desktop-portal versions only expose the deprecated Read.
|
||||||
|
var nested dbus.Variant
|
||||||
|
if rerr := m.settingsObj.Call(dbusPortalSettingsInterface+".Read", 0, "org.freedesktop.appearance", "color-scheme").Store(&nested); rerr != nil {
|
||||||
|
log.Warnf("color-scheme: ReadOne (%v) and Read (%v) both failed", err, rerr)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
variant = nested
|
||||||
|
}
|
||||||
|
|
||||||
if colorScheme, ok := dbusutil.As[uint32](variant); ok {
|
colorScheme, ok := dbusutil.As[uint32](variant)
|
||||||
|
if !ok {
|
||||||
|
// Read double-wraps the value in a variant.
|
||||||
|
if inner, innerOk := variant.Value().(dbus.Variant); innerOk {
|
||||||
|
colorScheme, ok = dbusutil.As[uint32](inner)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
m.stateMutex.Lock()
|
m.stateMutex.Lock()
|
||||||
m.state.Settings.ColorScheme = colorScheme
|
m.state.Settings.ColorScheme = colorScheme
|
||||||
m.stateMutex.Unlock()
|
m.stateMutex.Unlock()
|
||||||
|
|||||||
@@ -125,6 +125,8 @@ State updates are sent whenever network configuration changes:
|
|||||||
- `wifiConnected`: Whether associated with an access point
|
- `wifiConnected`: Whether associated with an access point
|
||||||
- `wifiSSID`: Currently connected network name
|
- `wifiSSID`: Currently connected network name
|
||||||
- `wifiIP`: Assigned IP address (empty until DHCP completes)
|
- `wifiIP`: Assigned IP address (empty until DHCP completes)
|
||||||
|
- `savedWifiNetworks` (API v26+): Saved WiFi profiles exposed at SSID granularity. If a backend has multiple profiles for the same SSID, DMS merges them into one SSID-level entry. Clients talking to older servers should derive saved visible networks from `wifiNetworks` entries where `saved` is true.
|
||||||
|
- `savedWifiNetworks[].outOfRange` (API v26+): Whether the saved profile is not currently visible in scan results. Fallback entries derived from `wifiNetworks` should be treated as visible (`outOfRange: false`).
|
||||||
- `lastError`: Error message from last failed connection attempt
|
- `lastError`: Error message from last failed connection attempt
|
||||||
|
|
||||||
### network.credentials Service Events
|
### network.credentials Service Events
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ type BackendState struct {
|
|||||||
WiFiBSSID string
|
WiFiBSSID string
|
||||||
WiFiSignal uint8
|
WiFiSignal uint8
|
||||||
WiFiNetworks []WiFiNetwork
|
WiFiNetworks []WiFiNetwork
|
||||||
|
SavedWiFiNetworks []WiFiNetwork
|
||||||
WiFiDevices []WiFiDevice
|
WiFiDevices []WiFiDevice
|
||||||
WiredConnections []WiredConnection
|
WiredConnections []WiredConnection
|
||||||
VPNProfiles []VPNProfile
|
VPNProfiles []VPNProfile
|
||||||
|
|||||||
@@ -27,6 +27,19 @@ func TestHybridIwdNetworkdBackend_GetCurrentState_MergesState(t *testing.T) {
|
|||||||
wifi.state.WiFiBSSID = "00:11:22:33:44:55"
|
wifi.state.WiFiBSSID = "00:11:22:33:44:55"
|
||||||
wifi.state.WiFiSignal = 75
|
wifi.state.WiFiSignal = 75
|
||||||
wifi.state.WiFiDevice = "wlan0"
|
wifi.state.WiFiDevice = "wlan0"
|
||||||
|
wifi.state.SavedWiFiNetworks = []WiFiNetwork{
|
||||||
|
{
|
||||||
|
SSID: "TestNetwork",
|
||||||
|
Saved: true,
|
||||||
|
Autoconnect: true,
|
||||||
|
Connected: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SSID: "AwayNetwork",
|
||||||
|
Saved: true,
|
||||||
|
OutOfRange: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
l3.state.WiFiIP = "192.168.1.100"
|
l3.state.WiFiIP = "192.168.1.100"
|
||||||
l3.state.EthernetConnected = false
|
l3.state.EthernetConnected = false
|
||||||
@@ -42,6 +55,9 @@ func TestHybridIwdNetworkdBackend_GetCurrentState_MergesState(t *testing.T) {
|
|||||||
assert.True(t, state.WiFiConnected)
|
assert.True(t, state.WiFiConnected)
|
||||||
assert.False(t, state.EthernetConnected)
|
assert.False(t, state.EthernetConnected)
|
||||||
assert.Equal(t, StatusWiFi, state.NetworkStatus)
|
assert.Equal(t, StatusWiFi, state.NetworkStatus)
|
||||||
|
assert.Len(t, state.SavedWiFiNetworks, 2)
|
||||||
|
assert.Equal(t, "TestNetwork", state.SavedWiFiNetworks[0].SSID)
|
||||||
|
assert.True(t, state.SavedWiFiNetworks[1].OutOfRange)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHybridIwdNetworkdBackend_GetCurrentState_EthernetPriority(t *testing.T) {
|
func TestHybridIwdNetworkdBackend_GetCurrentState_EthernetPriority(t *testing.T) {
|
||||||
|
|||||||
@@ -80,6 +80,10 @@ func (b *IWDBackend) Initialize() error {
|
|||||||
return fmt.Errorf("failed to discover iwd devices: %w", err)
|
return fmt.Errorf("failed to discover iwd devices: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := b.updateSavedWiFiNetworks(); err != nil {
|
||||||
|
log.Warnf("Failed to get initial saved WiFi networks: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
if err := b.updateState(); err != nil {
|
if err := b.updateState(); err != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
return fmt.Errorf("failed to get initial state: %w", err)
|
return fmt.Errorf("failed to get initial state: %w", err)
|
||||||
@@ -145,6 +149,7 @@ func (b *IWDBackend) GetCurrentState() (*BackendState, error) {
|
|||||||
|
|
||||||
state := *b.state
|
state := *b.state
|
||||||
state.WiFiNetworks = append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
|
state.WiFiNetworks = append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
|
||||||
|
state.SavedWiFiNetworks = append([]WiFiNetwork(nil), b.state.SavedWiFiNetworks...)
|
||||||
state.WiredConnections = append([]WiredConnection(nil), b.state.WiredConnections...)
|
state.WiredConnections = append([]WiredConnection(nil), b.state.WiredConnections...)
|
||||||
state.WiFiDevices = b.getWiFiDevicesLocked()
|
state.WiFiDevices = b.getWiFiDevicesLocked()
|
||||||
|
|
||||||
|
|||||||
@@ -45,12 +45,42 @@ func (b *IWDBackend) StartMonitoring(onStateChange func()) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := b.conn.AddMatchSignal(
|
||||||
|
dbus.WithMatchInterface(dbusPropertiesInterface),
|
||||||
|
dbus.WithMatchMember("PropertiesChanged"),
|
||||||
|
dbus.WithMatchArg(0, iwdKnownNetworkInterface),
|
||||||
|
); err != nil {
|
||||||
|
return fmt.Errorf("failed to add known network signal match: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := b.conn.AddMatchSignal(
|
||||||
|
dbus.WithMatchInterface(dbusObjectManager),
|
||||||
|
dbus.WithMatchMember("InterfacesAdded"),
|
||||||
|
); err != nil {
|
||||||
|
return fmt.Errorf("failed to add iwd interfaces-added signal match: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := b.conn.AddMatchSignal(
|
||||||
|
dbus.WithMatchInterface(dbusObjectManager),
|
||||||
|
dbus.WithMatchMember("InterfacesRemoved"),
|
||||||
|
); err != nil {
|
||||||
|
return fmt.Errorf("failed to add iwd interfaces-removed signal match: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
b.sigWG.Add(1)
|
b.sigWG.Add(1)
|
||||||
go b.signalHandler(sigChan)
|
go b.signalHandler(sigChan)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *IWDBackend) refreshWiFiNetworkState() bool {
|
||||||
|
_, err := b.updateWiFiNetworks()
|
||||||
|
if err == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return b.updateSavedWiFiNetworks() == nil
|
||||||
|
}
|
||||||
|
|
||||||
func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
||||||
defer b.sigWG.Done()
|
defer b.sigWG.Done()
|
||||||
|
|
||||||
@@ -66,11 +96,36 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if sig.Name != dbusPropertiesInterface+".PropertiesChanged" {
|
if sig.Name == dbusObjectManager+".InterfacesAdded" {
|
||||||
|
if len(sig.Body) >= 2 {
|
||||||
|
if interfaces, ok := sig.Body[1].(map[string]map[string]dbus.Variant); ok {
|
||||||
|
if _, ok := interfaces[iwdKnownNetworkInterface]; ok {
|
||||||
|
if b.refreshWiFiNetworkState() && b.onStateChange != nil {
|
||||||
|
b.onStateChange()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(sig.Body) < 2 {
|
if sig.Name == dbusObjectManager+".InterfacesRemoved" {
|
||||||
|
if len(sig.Body) >= 2 {
|
||||||
|
if interfaces, ok := sig.Body[1].([]string); ok {
|
||||||
|
for _, iface := range interfaces {
|
||||||
|
if iface == iwdKnownNetworkInterface {
|
||||||
|
if b.refreshWiFiNetworkState() && b.onStateChange != nil {
|
||||||
|
b.onStateChange()
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if sig.Name != dbusPropertiesInterface+".PropertiesChanged" || len(sig.Body) < 2 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,6 +142,9 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
|||||||
stateChanged := false
|
stateChanged := false
|
||||||
|
|
||||||
switch iface {
|
switch iface {
|
||||||
|
case iwdKnownNetworkInterface:
|
||||||
|
stateChanged = b.refreshWiFiNetworkState()
|
||||||
|
|
||||||
case iwdDeviceInterface:
|
case iwdDeviceInterface:
|
||||||
if sig.Path == b.devicePath {
|
if sig.Path == b.devicePath {
|
||||||
if poweredVar, ok := changed["Powered"]; ok {
|
if poweredVar, ok := changed["Powered"]; ok {
|
||||||
@@ -105,13 +163,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
|||||||
if sig.Path == b.stationPath {
|
if sig.Path == b.stationPath {
|
||||||
if scanningVar, ok := changed["Scanning"]; ok {
|
if scanningVar, ok := changed["Scanning"]; ok {
|
||||||
if scanning, ok := scanningVar.Value().(bool); ok && !scanning {
|
if scanning, ok := scanningVar.Value().(bool); ok && !scanning {
|
||||||
networks, err := b.updateWiFiNetworks()
|
stateChanged = b.refreshWiFiNetworkState() || stateChanged
|
||||||
if err == nil {
|
|
||||||
b.stateMutex.Lock()
|
|
||||||
b.state.WiFiNetworks = networks
|
|
||||||
b.stateMutex.Unlock()
|
|
||||||
stateChanged = true
|
|
||||||
}
|
|
||||||
|
|
||||||
b.stateMutex.RLock()
|
b.stateMutex.RLock()
|
||||||
wifiConnected := b.state.WiFiConnected
|
wifiConnected := b.state.WiFiConnected
|
||||||
@@ -236,6 +288,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b.refreshWiFiNetworkState()
|
||||||
stateChanged = true
|
stateChanged = true
|
||||||
|
|
||||||
if att != nil && isTarget {
|
if att != nil && isTarget {
|
||||||
@@ -282,6 +335,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
|||||||
b.state.NetworkStatus = StatusDisconnected
|
b.state.NetworkStatus = StatusDisconnected
|
||||||
}
|
}
|
||||||
b.stateMutex.Unlock()
|
b.stateMutex.Unlock()
|
||||||
|
b.refreshWiFiNetworkState()
|
||||||
stateChanged = true
|
stateChanged = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,6 +396,7 @@ func (b *IWDBackend) signalHandler(sigChan chan *dbus.Signal) {
|
|||||||
stateChanged = true
|
stateChanged = true
|
||||||
}
|
}
|
||||||
b.stateMutex.Unlock()
|
b.stateMutex.Unlock()
|
||||||
|
b.refreshWiFiNetworkState()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/godbus/dbus/v5"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -168,6 +169,92 @@ func TestIWDBackend_MapIwdDBusError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIWDSavedWiFiProfilesFromManagedObjects(t *testing.T) {
|
||||||
|
objects := map[dbus.ObjectPath]map[string]map[string]dbus.Variant{
|
||||||
|
"/net/connman/iwd/known_network/1": {
|
||||||
|
iwdKnownNetworkInterface: {
|
||||||
|
"Name": dbus.MakeVariant("Home"),
|
||||||
|
"AutoConnect": dbus.MakeVariant(false),
|
||||||
|
"Hidden": dbus.MakeVariant(true),
|
||||||
|
"Type": dbus.MakeVariant("psk"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"/net/connman/iwd/known_network/2": {
|
||||||
|
iwdKnownNetworkInterface: {
|
||||||
|
"Name": dbus.MakeVariant("Office"),
|
||||||
|
"Type": dbus.MakeVariant("8021x"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"/net/connman/iwd/known_network/3": {
|
||||||
|
iwdKnownNetworkInterface: {
|
||||||
|
"Name": dbus.MakeVariant("Cafe"),
|
||||||
|
"Type": dbus.MakeVariant("open"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"/net/connman/iwd/network/1": {
|
||||||
|
iwdNetworkInterface: {
|
||||||
|
"Name": dbus.MakeVariant("VisibleOnly"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
profiles := iwdSavedWiFiProfilesFromManagedObjects(objects)
|
||||||
|
|
||||||
|
assert.Len(t, profiles, 3)
|
||||||
|
assert.False(t, profiles["Home"].Autoconnect)
|
||||||
|
assert.True(t, profiles["Home"].Hidden)
|
||||||
|
assert.True(t, profiles["Home"].Secured)
|
||||||
|
assert.False(t, profiles["Home"].Enterprise)
|
||||||
|
|
||||||
|
assert.True(t, profiles["Office"].Autoconnect)
|
||||||
|
assert.True(t, profiles["Office"].Secured)
|
||||||
|
assert.True(t, profiles["Office"].Enterprise)
|
||||||
|
|
||||||
|
assert.True(t, profiles["Cafe"].Autoconnect)
|
||||||
|
assert.False(t, profiles["Cafe"].Secured)
|
||||||
|
assert.False(t, profiles["Cafe"].Enterprise)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIWDWiFiNetworksFromVisibleIncludesConnectedHiddenFallback(t *testing.T) {
|
||||||
|
profiles := map[string]savedWiFiProfile{
|
||||||
|
"Home": {
|
||||||
|
Autoconnect: true,
|
||||||
|
Secured: true,
|
||||||
|
Hidden: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
visible := []WiFiNetwork{
|
||||||
|
{
|
||||||
|
SSID: "Cafe",
|
||||||
|
Signal: 42,
|
||||||
|
Secured: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
networks := iwdWiFiNetworksFromVisible(visible, profiles, "Home", true, 68)
|
||||||
|
savedNetworks := savedWiFiNetworksFromProfiles(profiles, map[string]WiFiNetwork{
|
||||||
|
networks[0].SSID: networks[0],
|
||||||
|
networks[1].SSID: networks[1],
|
||||||
|
}, "Home", true)
|
||||||
|
|
||||||
|
assert.Len(t, networks, 2)
|
||||||
|
assert.Equal(t, "Cafe", networks[0].SSID)
|
||||||
|
assert.False(t, networks[0].Connected)
|
||||||
|
|
||||||
|
assert.Equal(t, "Home", networks[1].SSID)
|
||||||
|
assert.True(t, networks[1].Connected)
|
||||||
|
assert.True(t, networks[1].Hidden)
|
||||||
|
assert.True(t, networks[1].Saved)
|
||||||
|
assert.True(t, networks[1].Autoconnect)
|
||||||
|
assert.Equal(t, uint8(68), networks[1].Signal)
|
||||||
|
|
||||||
|
assert.Len(t, savedNetworks, 1)
|
||||||
|
assert.Equal(t, "Home", savedNetworks[0].SSID)
|
||||||
|
assert.True(t, savedNetworks[0].Connected)
|
||||||
|
assert.False(t, savedNetworks[0].OutOfRange)
|
||||||
|
}
|
||||||
|
|
||||||
func TestConnectAttempt_Finalization(t *testing.T) {
|
func TestConnectAttempt_Finalization(t *testing.T) {
|
||||||
backend, _ := NewIWDBackend()
|
backend, _ := NewIWDBackend()
|
||||||
backend.state = &BackendState{}
|
backend.state = &BackendState{}
|
||||||
|
|||||||
@@ -164,22 +164,18 @@ func (b *IWDBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
return nil, fmt.Errorf("failed to get networks: %w", err)
|
return nil, fmt.Errorf("failed to get networks: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
knownNetworks, err := b.getKnownNetworks()
|
savedProfiles, err := b.getIWDSavedWiFiProfiles()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
knownNetworks = make(map[string]bool)
|
savedProfiles = make(map[string]savedWiFiProfile)
|
||||||
}
|
|
||||||
|
|
||||||
autoconnectMap, err := b.getAutoconnectSettings()
|
|
||||||
if err != nil {
|
|
||||||
autoconnectMap = make(map[string]bool)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
b.stateMutex.RLock()
|
b.stateMutex.RLock()
|
||||||
currentSSID := b.state.WiFiSSID
|
currentSSID := b.state.WiFiSSID
|
||||||
wifiConnected := b.state.WiFiConnected
|
wifiConnected := b.state.WiFiConnected
|
||||||
|
wifiSignal := b.state.WiFiSignal
|
||||||
b.stateMutex.RUnlock()
|
b.stateMutex.RUnlock()
|
||||||
|
|
||||||
networks := make([]WiFiNetwork, 0, len(orderedNetworks))
|
visibleNetworks := make([]WiFiNetwork, 0, len(orderedNetworks))
|
||||||
for _, netData := range orderedNetworks {
|
for _, netData := range orderedNetworks {
|
||||||
if len(netData) < 2 {
|
if len(netData) < 2 {
|
||||||
continue
|
continue
|
||||||
@@ -225,23 +221,26 @@ func (b *IWDBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
|
|
||||||
secured := netType != "open"
|
secured := netType != "open"
|
||||||
|
|
||||||
network := WiFiNetwork{
|
visibleNetworks = append(visibleNetworks, WiFiNetwork{
|
||||||
SSID: name,
|
SSID: name,
|
||||||
Signal: signal,
|
Signal: signal,
|
||||||
Secured: secured,
|
Secured: secured,
|
||||||
Connected: wifiConnected && name == currentSSID,
|
|
||||||
Saved: knownNetworks[name],
|
|
||||||
Autoconnect: autoconnectMap[name],
|
|
||||||
Enterprise: netType == "8021x",
|
Enterprise: netType == "8021x",
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
networks = append(networks, network)
|
networks := iwdWiFiNetworksFromVisible(visibleNetworks, savedProfiles, currentSSID, wifiConnected, wifiSignal)
|
||||||
|
visibleNetworkMap := make(map[string]WiFiNetwork, len(networks))
|
||||||
|
for _, network := range networks {
|
||||||
|
visibleNetworkMap[network.SSID] = network
|
||||||
}
|
}
|
||||||
|
savedNetworks := savedWiFiNetworksFromProfiles(savedProfiles, visibleNetworkMap, currentSSID, wifiConnected)
|
||||||
|
|
||||||
sortWiFiNetworks(networks)
|
sortWiFiNetworks(networks)
|
||||||
|
|
||||||
b.stateMutex.Lock()
|
b.stateMutex.Lock()
|
||||||
b.state.WiFiNetworks = networks
|
b.state.WiFiNetworks = networks
|
||||||
|
b.state.SavedWiFiNetworks = savedNetworks
|
||||||
b.stateMutex.Unlock()
|
b.stateMutex.Unlock()
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@@ -254,30 +253,129 @@ func (b *IWDBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
return networks, nil
|
return networks, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *IWDBackend) getKnownNetworks() (map[string]bool, error) {
|
func (b *IWDBackend) updateSavedWiFiNetworks() error {
|
||||||
obj := b.conn.Object(iwdBusName, iwdObjectPath)
|
savedProfiles, err := b.getIWDSavedWiFiProfiles()
|
||||||
|
|
||||||
var objects map[dbus.ObjectPath]map[string]map[string]dbus.Variant
|
|
||||||
err := obj.Call(dbusObjectManager+".GetManagedObjects", 0).Store(&objects)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
known := make(map[string]bool)
|
b.stateMutex.RLock()
|
||||||
for _, interfaces := range objects {
|
currentSSID := b.state.WiFiSSID
|
||||||
if knownProps, ok := interfaces[iwdKnownNetworkInterface]; ok {
|
wifiConnected := b.state.WiFiConnected
|
||||||
if nameVar, ok := knownProps["Name"]; ok {
|
wifiNetworks := append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
|
||||||
if name, ok := nameVar.Value().(string); ok {
|
b.stateMutex.RUnlock()
|
||||||
known[name] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return known, nil
|
wifiNetworks, savedNetworks := refreshSavedWiFiState(wifiNetworks, savedProfiles, currentSSID, wifiConnected)
|
||||||
|
|
||||||
|
b.stateMutex.Lock()
|
||||||
|
b.state.WiFiNetworks = wifiNetworks
|
||||||
|
b.state.SavedWiFiNetworks = savedNetworks
|
||||||
|
b.stateMutex.Unlock()
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *IWDBackend) getAutoconnectSettings() (map[string]bool, error) {
|
func iwdWiFiNetworksFromVisible(visibleNetworks []WiFiNetwork, savedProfiles map[string]savedWiFiProfile, currentSSID string, wifiConnected bool, wifiSignal uint8) []WiFiNetwork {
|
||||||
|
networks := make([]WiFiNetwork, 0, len(visibleNetworks)+1)
|
||||||
|
seenSSIDs := make(map[string]struct{}, len(visibleNetworks)+1)
|
||||||
|
|
||||||
|
for _, network := range visibleNetworks {
|
||||||
|
profile, saved := savedProfiles[network.SSID]
|
||||||
|
network.Connected = wifiConnected && network.SSID == currentSSID
|
||||||
|
network.Saved = saved
|
||||||
|
network.Autoconnect = profile.Autoconnect
|
||||||
|
network.Hidden = network.Hidden || profile.Hidden
|
||||||
|
network.Secured = network.Secured || profile.Secured
|
||||||
|
network.Enterprise = network.Enterprise || profile.Enterprise
|
||||||
|
if network.Mode == "" {
|
||||||
|
network.Mode = profile.Mode
|
||||||
|
}
|
||||||
|
networks = append(networks, network)
|
||||||
|
seenSSIDs[network.SSID] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if wifiConnected && currentSSID != "" {
|
||||||
|
if _, exists := seenSSIDs[currentSSID]; !exists {
|
||||||
|
profile, saved := savedProfiles[currentSSID]
|
||||||
|
secured := profile.Secured
|
||||||
|
if !saved {
|
||||||
|
secured = true
|
||||||
|
}
|
||||||
|
mode := profile.Mode
|
||||||
|
if mode == "" {
|
||||||
|
mode = "infrastructure"
|
||||||
|
}
|
||||||
|
|
||||||
|
networks = append(networks, WiFiNetwork{
|
||||||
|
SSID: currentSSID,
|
||||||
|
Signal: wifiSignal,
|
||||||
|
Secured: secured,
|
||||||
|
Enterprise: profile.Enterprise,
|
||||||
|
Connected: true,
|
||||||
|
Saved: saved,
|
||||||
|
Autoconnect: profile.Autoconnect,
|
||||||
|
Hidden: true,
|
||||||
|
Mode: mode,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return networks
|
||||||
|
}
|
||||||
|
|
||||||
|
func iwdSavedWiFiProfilesFromManagedObjects(objects map[dbus.ObjectPath]map[string]map[string]dbus.Variant) map[string]savedWiFiProfile {
|
||||||
|
profiles := make(map[string]savedWiFiProfile)
|
||||||
|
|
||||||
|
for _, interfaces := range objects {
|
||||||
|
knownProps, ok := interfaces[iwdKnownNetworkInterface]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
nameVar, ok := knownProps["Name"]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
name, ok := nameVar.Value().(string)
|
||||||
|
if !ok || name == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
profile := savedWiFiProfile{
|
||||||
|
Autoconnect: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
}
|
||||||
|
if acVar, ok := knownProps["AutoConnect"]; ok {
|
||||||
|
if autoconnect, ok := acVar.Value().(bool); ok {
|
||||||
|
profile.Autoconnect = autoconnect
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hiddenVar, ok := knownProps["Hidden"]; ok {
|
||||||
|
if hidden, ok := hiddenVar.Value().(bool); ok {
|
||||||
|
profile.Hidden = hidden
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if typeVar, ok := knownProps["Type"]; ok {
|
||||||
|
if networkType, ok := typeVar.Value().(string); ok {
|
||||||
|
profile.Secured = networkType != "" && networkType != "open"
|
||||||
|
profile.Enterprise = networkType == "8021x"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if existing, ok := profiles[name]; ok {
|
||||||
|
profile.Autoconnect = profile.Autoconnect || existing.Autoconnect
|
||||||
|
profile.Hidden = profile.Hidden || existing.Hidden
|
||||||
|
profile.Secured = profile.Secured || existing.Secured
|
||||||
|
profile.Enterprise = profile.Enterprise || existing.Enterprise
|
||||||
|
}
|
||||||
|
|
||||||
|
profiles[name] = profile
|
||||||
|
}
|
||||||
|
|
||||||
|
return profiles
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *IWDBackend) getIWDSavedWiFiProfiles() (map[string]savedWiFiProfile, error) {
|
||||||
obj := b.conn.Object(iwdBusName, iwdObjectPath)
|
obj := b.conn.Object(iwdBusName, iwdObjectPath)
|
||||||
|
|
||||||
var objects map[dbus.ObjectPath]map[string]map[string]dbus.Variant
|
var objects map[dbus.ObjectPath]map[string]map[string]dbus.Variant
|
||||||
@@ -286,24 +384,7 @@ func (b *IWDBackend) getAutoconnectSettings() (map[string]bool, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
autoconnectMap := make(map[string]bool)
|
return iwdSavedWiFiProfilesFromManagedObjects(objects), nil
|
||||||
for _, interfaces := range objects {
|
|
||||||
if knownProps, ok := interfaces[iwdKnownNetworkInterface]; ok {
|
|
||||||
if nameVar, ok := knownProps["Name"]; ok {
|
|
||||||
if name, ok := nameVar.Value().(string); ok {
|
|
||||||
autoconnect := true
|
|
||||||
if acVar, ok := knownProps["AutoConnect"]; ok {
|
|
||||||
if ac, ok := acVar.Value().(bool); ok {
|
|
||||||
autoconnect = ac
|
|
||||||
}
|
|
||||||
}
|
|
||||||
autoconnectMap[name] = autoconnect
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return autoconnectMap, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *IWDBackend) GetWiFiNetworkDetails(ssid string) (*NetworkInfoResponse, error) {
|
func (b *IWDBackend) GetWiFiNetworkDetails(ssid string) (*NetworkInfoResponse, error) {
|
||||||
@@ -614,6 +695,8 @@ func (b *IWDBackend) ForgetWiFiNetwork(ssid string) error {
|
|||||||
b.stateMutex.Unlock()
|
b.stateMutex.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, _ = b.updateWiFiNetworks()
|
||||||
|
|
||||||
if b.onStateChange != nil {
|
if b.onStateChange != nil {
|
||||||
b.onStateChange()
|
b.onStateChange()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,6 +222,10 @@ func (b *NetworkManagerBackend) Initialize() error {
|
|||||||
log.Warnf("Failed to update WiFi state: %v", err)
|
log.Warnf("Failed to update WiFi state: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := b.updateSavedWiFiNetworks(); err != nil {
|
||||||
|
log.Warnf("Failed to get initial saved WiFi networks: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
if wifiEnabled {
|
if wifiEnabled {
|
||||||
if _, err := b.updateWiFiNetworks(); err != nil {
|
if _, err := b.updateWiFiNetworks(); err != nil {
|
||||||
log.Warnf("Failed to get initial networks: %v", err)
|
log.Warnf("Failed to get initial networks: %v", err)
|
||||||
@@ -261,6 +265,7 @@ func (b *NetworkManagerBackend) GetCurrentState() (*BackendState, error) {
|
|||||||
|
|
||||||
state := *b.state
|
state := *b.state
|
||||||
state.WiFiNetworks = append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
|
state.WiFiNetworks = append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
|
||||||
|
state.SavedWiFiNetworks = append([]WiFiNetwork(nil), b.state.SavedWiFiNetworks...)
|
||||||
state.WiFiDevices = append([]WiFiDevice(nil), b.state.WiFiDevices...)
|
state.WiFiDevices = append([]WiFiDevice(nil), b.state.WiFiDevices...)
|
||||||
state.WiredConnections = append([]WiredConnection(nil), b.state.WiredConnections...)
|
state.WiredConnections = append([]WiredConnection(nil), b.state.WiredConnections...)
|
||||||
state.EthernetDevices = append([]EthernetDevice(nil), b.state.EthernetDevices...)
|
state.EthernetDevices = append([]EthernetDevice(nil), b.state.EthernetDevices...)
|
||||||
|
|||||||
@@ -5,6 +5,12 @@ import (
|
|||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
dbusNMSettingsPath = "/org/freedesktop/NetworkManager/Settings"
|
||||||
|
dbusNMSettingsInterface = "org.freedesktop.NetworkManager.Settings"
|
||||||
|
dbusNMSettingsConnectionInterface = "org.freedesktop.NetworkManager.Settings.Connection"
|
||||||
|
)
|
||||||
|
|
||||||
func (b *NetworkManagerBackend) startSignalPump() error {
|
func (b *NetworkManagerBackend) startSignalPump() error {
|
||||||
conn, err := dbus.ConnectSystemBus()
|
conn, err := dbus.ConnectSystemBus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -27,8 +33,8 @@ func (b *NetworkManagerBackend) startSignalPump() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := conn.AddMatchSignal(
|
if err := conn.AddMatchSignal(
|
||||||
dbus.WithMatchObjectPath(dbus.ObjectPath("/org/freedesktop/NetworkManager/Settings")),
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
dbus.WithMatchInterface("org.freedesktop.NetworkManager.Settings"),
|
dbus.WithMatchInterface(dbusNMSettingsInterface),
|
||||||
dbus.WithMatchMember("NewConnection"),
|
dbus.WithMatchMember("NewConnection"),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
conn.RemoveMatchSignal(
|
conn.RemoveMatchSignal(
|
||||||
@@ -42,8 +48,8 @@ func (b *NetworkManagerBackend) startSignalPump() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := conn.AddMatchSignal(
|
if err := conn.AddMatchSignal(
|
||||||
dbus.WithMatchObjectPath(dbus.ObjectPath("/org/freedesktop/NetworkManager/Settings")),
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
dbus.WithMatchInterface("org.freedesktop.NetworkManager.Settings"),
|
dbus.WithMatchInterface(dbusNMSettingsInterface),
|
||||||
dbus.WithMatchMember("ConnectionRemoved"),
|
dbus.WithMatchMember("ConnectionRemoved"),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
conn.RemoveMatchSignal(
|
conn.RemoveMatchSignal(
|
||||||
@@ -52,8 +58,8 @@ func (b *NetworkManagerBackend) startSignalPump() error {
|
|||||||
dbus.WithMatchMember("PropertiesChanged"),
|
dbus.WithMatchMember("PropertiesChanged"),
|
||||||
)
|
)
|
||||||
conn.RemoveMatchSignal(
|
conn.RemoveMatchSignal(
|
||||||
dbus.WithMatchObjectPath(dbus.ObjectPath("/org/freedesktop/NetworkManager/Settings")),
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
dbus.WithMatchInterface("org.freedesktop.NetworkManager.Settings"),
|
dbus.WithMatchInterface(dbusNMSettingsInterface),
|
||||||
dbus.WithMatchMember("NewConnection"),
|
dbus.WithMatchMember("NewConnection"),
|
||||||
)
|
)
|
||||||
conn.RemoveSignal(signals)
|
conn.RemoveSignal(signals)
|
||||||
@@ -61,6 +67,31 @@ func (b *NetworkManagerBackend) startSignalPump() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := conn.AddMatchSignal(
|
||||||
|
dbus.WithMatchPathNamespace(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMSettingsConnectionInterface),
|
||||||
|
dbus.WithMatchMember("Updated"),
|
||||||
|
); err != nil {
|
||||||
|
conn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
|
||||||
|
dbus.WithMatchInterface(dbusPropsInterface),
|
||||||
|
dbus.WithMatchMember("PropertiesChanged"),
|
||||||
|
)
|
||||||
|
conn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMSettingsInterface),
|
||||||
|
dbus.WithMatchMember("NewConnection"),
|
||||||
|
)
|
||||||
|
conn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMSettingsInterface),
|
||||||
|
dbus.WithMatchMember("ConnectionRemoved"),
|
||||||
|
)
|
||||||
|
conn.RemoveSignal(signals)
|
||||||
|
conn.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if err := conn.AddMatchSignal(
|
if err := conn.AddMatchSignal(
|
||||||
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
|
||||||
dbus.WithMatchInterface(dbusNMInterface),
|
dbus.WithMatchInterface(dbusNMInterface),
|
||||||
@@ -137,6 +168,32 @@ func (b *NetworkManagerBackend) stopSignalPump() {
|
|||||||
dbus.WithMatchMember("PropertiesChanged"),
|
dbus.WithMatchMember("PropertiesChanged"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
b.dbusConn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMSettingsInterface),
|
||||||
|
dbus.WithMatchMember("NewConnection"),
|
||||||
|
)
|
||||||
|
b.dbusConn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMSettingsInterface),
|
||||||
|
dbus.WithMatchMember("ConnectionRemoved"),
|
||||||
|
)
|
||||||
|
b.dbusConn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchPathNamespace(dbus.ObjectPath(dbusNMSettingsPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMSettingsConnectionInterface),
|
||||||
|
dbus.WithMatchMember("Updated"),
|
||||||
|
)
|
||||||
|
b.dbusConn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMInterface),
|
||||||
|
dbus.WithMatchMember("DeviceAdded"),
|
||||||
|
)
|
||||||
|
b.dbusConn.RemoveMatchSignal(
|
||||||
|
dbus.WithMatchObjectPath(dbus.ObjectPath(dbusNMPath)),
|
||||||
|
dbus.WithMatchInterface(dbusNMInterface),
|
||||||
|
dbus.WithMatchMember("DeviceRemoved"),
|
||||||
|
)
|
||||||
|
|
||||||
for _, info := range b.wifiDevices {
|
for _, info := range b.wifiDevices {
|
||||||
b.dbusConn.RemoveMatchSignal(
|
b.dbusConn.RemoveMatchSignal(
|
||||||
dbus.WithMatchObjectPath(dbus.ObjectPath(info.device.GetPath())),
|
dbus.WithMatchObjectPath(dbus.ObjectPath(info.device.GetPath())),
|
||||||
@@ -164,9 +221,13 @@ func (b *NetworkManagerBackend) stopSignalPump() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *NetworkManagerBackend) handleDBusSignal(sig *dbus.Signal) {
|
func (b *NetworkManagerBackend) handleDBusSignal(sig *dbus.Signal) {
|
||||||
if sig.Name == "org.freedesktop.NetworkManager.Settings.NewConnection" ||
|
if sig.Name == dbusNMSettingsInterface+".NewConnection" ||
|
||||||
sig.Name == "org.freedesktop.NetworkManager.Settings.ConnectionRemoved" {
|
sig.Name == dbusNMSettingsInterface+".ConnectionRemoved" ||
|
||||||
|
sig.Name == dbusNMSettingsConnectionInterface+".Updated" {
|
||||||
b.ListVPNProfiles()
|
b.ListVPNProfiles()
|
||||||
|
if err := b.updateSavedWiFiNetworks(); err != nil {
|
||||||
|
b.updateWiFiNetworks()
|
||||||
|
}
|
||||||
if b.onStateChange != nil {
|
if b.onStateChange != nil {
|
||||||
b.onStateChange()
|
b.onStateChange()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -225,24 +225,14 @@ func (b *NetworkManagerBackend) GetWiFiQRCodeContent(ssid string) (string, error
|
|||||||
return "", fmt.Errorf("failed to identify security type of network `%s`", ssid)
|
return "", fmt.Errorf("failed to identify security type of network `%s`", ssid)
|
||||||
}
|
}
|
||||||
|
|
||||||
var securityType string
|
|
||||||
switch keyMgmt {
|
switch keyMgmt {
|
||||||
case "none":
|
case "none":
|
||||||
authAlg, _ := secSettings["auth-alg"].(string)
|
return "", fmt.Errorf("QR code generation only supports WPA-PSK connections, `%s` is open or WEP", ssid)
|
||||||
switch authAlg {
|
|
||||||
case "open":
|
|
||||||
securityType = "nopass"
|
|
||||||
default:
|
|
||||||
securityType = "WEP"
|
|
||||||
}
|
|
||||||
case "ieee8021x":
|
case "ieee8021x":
|
||||||
securityType = "WEP"
|
return "", fmt.Errorf("QR code generation only supports WPA-PSK connections, `%s` is enterprise", ssid)
|
||||||
|
case "wpa-psk", "sae", "wpa-psk-sae":
|
||||||
default:
|
default:
|
||||||
securityType = "WPA"
|
return "", fmt.Errorf("QR code generation only supports WPA-PSK connections, `%s` uses %s", ssid, keyMgmt)
|
||||||
}
|
|
||||||
|
|
||||||
if securityType != "WPA" {
|
|
||||||
return "", fmt.Errorf("QR code generation only supports WPA connections, `%s` uses %s", ssid, securityType)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var psk string
|
var psk string
|
||||||
@@ -276,7 +266,7 @@ func (b *NetworkManagerBackend) GetWiFiQRCodeContent(ssid string) (string, error
|
|||||||
return "", fmt.Errorf("failed to retrieve password for `%s`", ssid)
|
return "", fmt.Errorf("failed to retrieve password for `%s`", ssid)
|
||||||
}
|
}
|
||||||
|
|
||||||
return FormatWiFiQRString(securityType, ssid, psk), nil
|
return FormatWiFiQRString("WPA", ssid, psk), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *NetworkManagerBackend) ConnectWiFi(req ConnectionRequest) error {
|
func (b *NetworkManagerBackend) ConnectWiFi(req ConnectionRequest) error {
|
||||||
@@ -405,6 +395,74 @@ func (b *NetworkManagerBackend) ForgetWiFiNetwork(ssid string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSavedWiFiProfiles(connections []gonetworkmanager.Connection) map[string]savedWiFiProfile {
|
||||||
|
profiles := make(map[string]savedWiFiProfile)
|
||||||
|
|
||||||
|
for _, conn := range connections {
|
||||||
|
connSettings, err := conn.GetSettings()
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
connMeta, ok := connSettings["connection"]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
connType, ok := connMeta["type"].(string)
|
||||||
|
if !ok || connType != "802-11-wireless" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
wifiSettings, ok := connSettings["802-11-wireless"]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ssidBytes, ok := wifiSettings["ssid"].([]byte)
|
||||||
|
if !ok || len(ssidBytes) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ssid := string(ssidBytes)
|
||||||
|
profile := savedWiFiProfile{
|
||||||
|
Autoconnect: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
}
|
||||||
|
|
||||||
|
if ac, ok := connMeta["autoconnect"].(bool); ok {
|
||||||
|
profile.Autoconnect = ac
|
||||||
|
}
|
||||||
|
if hidden, ok := wifiSettings["hidden"].(bool); ok {
|
||||||
|
profile.Hidden = hidden
|
||||||
|
}
|
||||||
|
if mode, ok := wifiSettings["mode"].(string); ok && mode != "" {
|
||||||
|
profile.Mode = mode
|
||||||
|
}
|
||||||
|
if _, ok := connSettings["802-11-wireless-security"]; ok {
|
||||||
|
profile.Secured = true
|
||||||
|
}
|
||||||
|
if _, ok := connSettings["802-1x"]; ok {
|
||||||
|
profile.Enterprise = true
|
||||||
|
profile.Secured = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if existing, ok := profiles[ssid]; ok {
|
||||||
|
profile.Autoconnect = profile.Autoconnect || existing.Autoconnect
|
||||||
|
profile.Hidden = profile.Hidden || existing.Hidden
|
||||||
|
profile.Secured = profile.Secured || existing.Secured
|
||||||
|
profile.Enterprise = profile.Enterprise || existing.Enterprise
|
||||||
|
if profile.Mode == "" {
|
||||||
|
profile.Mode = existing.Mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
profiles[ssid] = profile
|
||||||
|
}
|
||||||
|
|
||||||
|
return profiles
|
||||||
|
}
|
||||||
|
|
||||||
func (b *NetworkManagerBackend) IsConnectingTo(ssid string) bool {
|
func (b *NetworkManagerBackend) IsConnectingTo(ssid string) bool {
|
||||||
b.stateMutex.RLock()
|
b.stateMutex.RLock()
|
||||||
defer b.stateMutex.RUnlock()
|
defer b.stateMutex.RUnlock()
|
||||||
@@ -442,47 +500,7 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
return nil, fmt.Errorf("failed to get connections: %w", err)
|
return nil, fmt.Errorf("failed to get connections: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
savedSSIDs := make(map[string]bool)
|
savedProfiles := getSavedWiFiProfiles(connections)
|
||||||
autoconnectMap := make(map[string]bool)
|
|
||||||
hiddenSSIDs := make(map[string]bool)
|
|
||||||
for _, conn := range connections {
|
|
||||||
connSettings, err := conn.GetSettings()
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
connMeta, ok := connSettings["connection"]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
connType, ok := connMeta["type"].(string)
|
|
||||||
if !ok || connType != "802-11-wireless" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
wifiSettings, ok := connSettings["802-11-wireless"]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ssidBytes, ok := wifiSettings["ssid"].([]byte)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ssid := string(ssidBytes)
|
|
||||||
savedSSIDs[ssid] = true
|
|
||||||
autoconnect := true
|
|
||||||
if ac, ok := connMeta["autoconnect"].(bool); ok {
|
|
||||||
autoconnect = ac
|
|
||||||
}
|
|
||||||
autoconnectMap[ssid] = autoconnect
|
|
||||||
|
|
||||||
if hidden, ok := wifiSettings["hidden"].(bool); ok && hidden {
|
|
||||||
hiddenSSIDs[ssid] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
b.stateMutex.RLock()
|
b.stateMutex.RLock()
|
||||||
currentSSID := b.state.WiFiSSID
|
currentSSID := b.state.WiFiSSID
|
||||||
@@ -491,8 +509,8 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
wifiBSSID := b.state.WiFiBSSID
|
wifiBSSID := b.state.WiFiBSSID
|
||||||
b.stateMutex.RUnlock()
|
b.stateMutex.RUnlock()
|
||||||
|
|
||||||
seenSSIDs := make(map[string]*WiFiNetwork)
|
seenSSIDs := make(map[string]int)
|
||||||
networks := []WiFiNetwork{}
|
networks := make([]WiFiNetwork, 0, len(apPaths)+1)
|
||||||
|
|
||||||
for _, ap := range apPaths {
|
for _, ap := range apPaths {
|
||||||
ssid, err := ap.GetPropertySSID()
|
ssid, err := ap.GetPropertySSID()
|
||||||
@@ -500,7 +518,8 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if existing, exists := seenSSIDs[ssid]; exists {
|
if existingIndex, exists := seenSSIDs[ssid]; exists {
|
||||||
|
existing := &networks[existingIndex]
|
||||||
strength, _ := ap.GetPropertyStrength()
|
strength, _ := ap.GetPropertyStrength()
|
||||||
if strength > existing.Signal {
|
if strength > existing.Signal {
|
||||||
existing.Signal = strength
|
existing.Signal = strength
|
||||||
@@ -550,6 +569,7 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profile, saved := savedProfiles[ssid]
|
||||||
network := WiFiNetwork{
|
network := WiFiNetwork{
|
||||||
SSID: ssid,
|
SSID: ssid,
|
||||||
BSSID: bssid,
|
BSSID: bssid,
|
||||||
@@ -557,45 +577,86 @@ func (b *NetworkManagerBackend) updateWiFiNetworks() ([]WiFiNetwork, error) {
|
|||||||
Secured: secured,
|
Secured: secured,
|
||||||
Enterprise: enterprise,
|
Enterprise: enterprise,
|
||||||
Connected: isConnected,
|
Connected: isConnected,
|
||||||
Saved: savedSSIDs[ssid],
|
Saved: saved,
|
||||||
Autoconnect: autoconnectMap[ssid],
|
Autoconnect: profile.Autoconnect,
|
||||||
Hidden: hiddenSSIDs[ssid],
|
Hidden: profile.Hidden,
|
||||||
Frequency: freq,
|
Frequency: freq,
|
||||||
Mode: modeStr,
|
Mode: modeStr,
|
||||||
Rate: rate,
|
Rate: rate,
|
||||||
Channel: channel,
|
Channel: channel,
|
||||||
}
|
}
|
||||||
|
|
||||||
seenSSIDs[ssid] = &network
|
|
||||||
networks = append(networks, network)
|
networks = append(networks, network)
|
||||||
|
seenSSIDs[ssid] = len(networks) - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if wifiConnected && currentSSID != "" {
|
if wifiConnected && currentSSID != "" {
|
||||||
if _, exists := seenSSIDs[currentSSID]; !exists {
|
if _, exists := seenSSIDs[currentSSID]; !exists {
|
||||||
|
profile, saved := savedProfiles[currentSSID]
|
||||||
hiddenNetwork := WiFiNetwork{
|
hiddenNetwork := WiFiNetwork{
|
||||||
SSID: currentSSID,
|
SSID: currentSSID,
|
||||||
BSSID: wifiBSSID,
|
BSSID: wifiBSSID,
|
||||||
Signal: wifiSignal,
|
Signal: wifiSignal,
|
||||||
Secured: true,
|
Secured: true,
|
||||||
Connected: true,
|
Connected: true,
|
||||||
Saved: savedSSIDs[currentSSID],
|
Saved: saved,
|
||||||
Autoconnect: autoconnectMap[currentSSID],
|
Autoconnect: profile.Autoconnect,
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
Mode: "infrastructure",
|
Mode: "infrastructure",
|
||||||
}
|
}
|
||||||
networks = append(networks, hiddenNetwork)
|
networks = append(networks, hiddenNetwork)
|
||||||
|
seenSSIDs[currentSSID] = len(networks) - 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
visibleNetworks := wiFiNetworksBySSID(networks, true)
|
||||||
|
savedNetworks := savedWiFiNetworksFromProfiles(savedProfiles, visibleNetworks, currentSSID, wifiConnected)
|
||||||
|
|
||||||
sortWiFiNetworks(networks)
|
sortWiFiNetworks(networks)
|
||||||
|
|
||||||
b.stateMutex.Lock()
|
b.stateMutex.Lock()
|
||||||
b.state.WiFiNetworks = networks
|
b.state.WiFiNetworks = networks
|
||||||
|
b.state.SavedWiFiNetworks = savedNetworks
|
||||||
b.stateMutex.Unlock()
|
b.stateMutex.Unlock()
|
||||||
|
|
||||||
return networks, nil
|
return networks, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *NetworkManagerBackend) updateSavedWiFiNetworks() error {
|
||||||
|
s := b.settings
|
||||||
|
if s == nil {
|
||||||
|
var err error
|
||||||
|
s, err = gonetworkmanager.NewSettings()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get settings: %w", err)
|
||||||
|
}
|
||||||
|
b.settings = s
|
||||||
|
}
|
||||||
|
|
||||||
|
settingsMgr := s.(gonetworkmanager.Settings)
|
||||||
|
connections, err := settingsMgr.ListConnections()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get connections: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
savedProfiles := getSavedWiFiProfiles(connections)
|
||||||
|
|
||||||
|
b.stateMutex.RLock()
|
||||||
|
currentSSID := b.state.WiFiSSID
|
||||||
|
wifiConnected := b.state.WiFiConnected
|
||||||
|
wifiNetworks := append([]WiFiNetwork(nil), b.state.WiFiNetworks...)
|
||||||
|
b.stateMutex.RUnlock()
|
||||||
|
|
||||||
|
wifiNetworks, savedNetworks := refreshSavedWiFiState(wifiNetworks, savedProfiles, currentSSID, wifiConnected)
|
||||||
|
|
||||||
|
b.stateMutex.Lock()
|
||||||
|
b.state.WiFiNetworks = wifiNetworks
|
||||||
|
b.state.SavedWiFiNetworks = savedNetworks
|
||||||
|
b.stateMutex.Unlock()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (b *NetworkManagerBackend) findConnection(ssid string) (gonetworkmanager.Connection, error) {
|
func (b *NetworkManagerBackend) findConnection(ssid string) (gonetworkmanager.Connection, error) {
|
||||||
s := b.settings
|
s := b.settings
|
||||||
if s == nil {
|
if s == nil {
|
||||||
@@ -975,49 +1036,14 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
savedSSIDs := make(map[string]bool)
|
savedProfiles := getSavedWiFiProfiles(connections)
|
||||||
autoconnectMap := make(map[string]bool)
|
|
||||||
hiddenSSIDs := make(map[string]bool)
|
|
||||||
for _, conn := range connections {
|
|
||||||
connSettings, err := conn.GetSettings()
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
connMeta, ok := connSettings["connection"]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
connType, ok := connMeta["type"].(string)
|
|
||||||
if !ok || connType != "802-11-wireless" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
wifiSettings, ok := connSettings["802-11-wireless"]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ssidBytes, ok := wifiSettings["ssid"].([]byte)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ssid := string(ssidBytes)
|
|
||||||
savedSSIDs[ssid] = true
|
|
||||||
autoconnect := true
|
|
||||||
if ac, ok := connMeta["autoconnect"].(bool); ok {
|
|
||||||
autoconnect = ac
|
|
||||||
}
|
|
||||||
autoconnectMap[ssid] = autoconnect
|
|
||||||
|
|
||||||
if hidden, ok := wifiSettings["hidden"].(bool); ok && hidden {
|
|
||||||
hiddenSSIDs[ssid] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var devices []WiFiDevice
|
var devices []WiFiDevice
|
||||||
|
visibleNetworks := make(map[string]WiFiNetwork)
|
||||||
|
b.stateMutex.RLock()
|
||||||
|
currentSSID := b.state.WiFiSSID
|
||||||
|
wifiConnected := b.state.WiFiConnected
|
||||||
|
b.stateMutex.RUnlock()
|
||||||
|
|
||||||
for name, devInfo := range b.wifiDevices {
|
for name, devInfo := range b.wifiDevices {
|
||||||
state, _ := devInfo.device.GetPropertyState()
|
state, _ := devInfo.device.GetPropertyState()
|
||||||
@@ -1050,14 +1076,16 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
|
|||||||
apPaths, err := devInfo.wireless.GetAccessPoints()
|
apPaths, err := devInfo.wireless.GetAccessPoints()
|
||||||
var networks []WiFiNetwork
|
var networks []WiFiNetwork
|
||||||
if err == nil {
|
if err == nil {
|
||||||
seenSSIDs := make(map[string]*WiFiNetwork)
|
seenSSIDs := make(map[string]int)
|
||||||
|
networks = make([]WiFiNetwork, 0, len(apPaths)+1)
|
||||||
for _, ap := range apPaths {
|
for _, ap := range apPaths {
|
||||||
apSSID, err := ap.GetPropertySSID()
|
apSSID, err := ap.GetPropertySSID()
|
||||||
if err != nil || apSSID == "" {
|
if err != nil || apSSID == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if existing, exists := seenSSIDs[apSSID]; exists {
|
if existingIndex, exists := seenSSIDs[apSSID]; exists {
|
||||||
|
existing := &networks[existingIndex]
|
||||||
strength, _ := ap.GetPropertyStrength()
|
strength, _ := ap.GetPropertyStrength()
|
||||||
if strength > existing.Signal {
|
if strength > existing.Signal {
|
||||||
existing.Signal = strength
|
existing.Signal = strength
|
||||||
@@ -1107,6 +1135,7 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
profile, saved := savedProfiles[apSSID]
|
||||||
network := WiFiNetwork{
|
network := WiFiNetwork{
|
||||||
SSID: apSSID,
|
SSID: apSSID,
|
||||||
BSSID: apBSSID,
|
BSSID: apBSSID,
|
||||||
@@ -1114,9 +1143,9 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
|
|||||||
Secured: secured,
|
Secured: secured,
|
||||||
Enterprise: enterprise,
|
Enterprise: enterprise,
|
||||||
Connected: isConnected,
|
Connected: isConnected,
|
||||||
Saved: savedSSIDs[apSSID],
|
Saved: saved,
|
||||||
Autoconnect: autoconnectMap[apSSID],
|
Autoconnect: profile.Autoconnect,
|
||||||
Hidden: hiddenSSIDs[apSSID],
|
Hidden: profile.Hidden,
|
||||||
Frequency: freq,
|
Frequency: freq,
|
||||||
Mode: modeStr,
|
Mode: modeStr,
|
||||||
Rate: rate,
|
Rate: rate,
|
||||||
@@ -1124,25 +1153,31 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
|
|||||||
Device: name,
|
Device: name,
|
||||||
}
|
}
|
||||||
|
|
||||||
seenSSIDs[apSSID] = &network
|
|
||||||
networks = append(networks, network)
|
networks = append(networks, network)
|
||||||
|
seenSSIDs[apSSID] = len(networks) - 1
|
||||||
|
if existing, ok := visibleNetworks[apSSID]; !ok || network.Signal > existing.Signal {
|
||||||
|
visibleNetworks[apSSID] = network
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if connected && ssid != "" {
|
if connected && ssid != "" {
|
||||||
if _, exists := seenSSIDs[ssid]; !exists {
|
if _, exists := seenSSIDs[ssid]; !exists {
|
||||||
|
profile, saved := savedProfiles[ssid]
|
||||||
hiddenNetwork := WiFiNetwork{
|
hiddenNetwork := WiFiNetwork{
|
||||||
SSID: ssid,
|
SSID: ssid,
|
||||||
BSSID: bssid,
|
BSSID: bssid,
|
||||||
Signal: signal,
|
Signal: signal,
|
||||||
Secured: true,
|
Secured: true,
|
||||||
Connected: true,
|
Connected: true,
|
||||||
Saved: savedSSIDs[ssid],
|
Saved: saved,
|
||||||
Autoconnect: autoconnectMap[ssid],
|
Autoconnect: profile.Autoconnect,
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
Mode: "infrastructure",
|
Mode: "infrastructure",
|
||||||
Device: name,
|
Device: name,
|
||||||
}
|
}
|
||||||
networks = append(networks, hiddenNetwork)
|
networks = append(networks, hiddenNetwork)
|
||||||
|
seenSSIDs[ssid] = len(networks) - 1
|
||||||
|
visibleNetworks[ssid] = hiddenNetwork
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1168,6 +1203,7 @@ func (b *NetworkManagerBackend) updateAllWiFiDevices() {
|
|||||||
|
|
||||||
b.stateMutex.Lock()
|
b.stateMutex.Lock()
|
||||||
b.state.WiFiDevices = devices
|
b.state.WiFiDevices = devices
|
||||||
|
b.state.SavedWiFiNetworks = savedWiFiNetworksFromProfiles(savedProfiles, visibleNetworks, currentSSID, wifiConnected)
|
||||||
b.stateMutex.Unlock()
|
b.stateMutex.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
mock_gonetworkmanager "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/github.com/Wifx/gonetworkmanager/v2"
|
mock_gonetworkmanager "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/github.com/Wifx/gonetworkmanager/v2"
|
||||||
|
"github.com/Wifx/gonetworkmanager/v2"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -176,6 +177,54 @@ func TestNetworkManagerBackend_UpdateWiFiNetworks_NoDevice(t *testing.T) {
|
|||||||
assert.Contains(t, err.Error(), "no WiFi device available")
|
assert.Contains(t, err.Error(), "no WiFi device available")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNetworkManagerBackend_UpdateSavedWiFiNetworksPreservesVisibleSavedNetworks(t *testing.T) {
|
||||||
|
mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
|
||||||
|
mockSettings := mock_gonetworkmanager.NewMockSettings(t)
|
||||||
|
mockConn := mock_gonetworkmanager.NewMockConnection(t)
|
||||||
|
|
||||||
|
backend, err := NewNetworkManagerBackend(mockNM)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
backend.settings = mockSettings
|
||||||
|
|
||||||
|
backend.stateMutex.Lock()
|
||||||
|
backend.state.WiFiNetworks = []WiFiNetwork{
|
||||||
|
{
|
||||||
|
SSID: "Home",
|
||||||
|
Signal: 76,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
backend.stateMutex.Unlock()
|
||||||
|
|
||||||
|
settings := gonetworkmanager.ConnectionSettings{
|
||||||
|
"connection": {
|
||||||
|
"type": "802-11-wireless",
|
||||||
|
"autoconnect": true,
|
||||||
|
},
|
||||||
|
"802-11-wireless": {
|
||||||
|
"ssid": []byte("Home"),
|
||||||
|
},
|
||||||
|
"802-11-wireless-security": {},
|
||||||
|
}
|
||||||
|
mockSettings.EXPECT().ListConnections().Return([]gonetworkmanager.Connection{mockConn}, nil)
|
||||||
|
mockConn.EXPECT().GetSettings().Return(settings, nil)
|
||||||
|
|
||||||
|
err = backend.updateSavedWiFiNetworks()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
backend.stateMutex.RLock()
|
||||||
|
savedNetworks := append([]WiFiNetwork(nil), backend.state.SavedWiFiNetworks...)
|
||||||
|
wifiNetworks := append([]WiFiNetwork(nil), backend.state.WiFiNetworks...)
|
||||||
|
backend.stateMutex.RUnlock()
|
||||||
|
|
||||||
|
assert.Len(t, wifiNetworks, 1)
|
||||||
|
assert.True(t, wifiNetworks[0].Saved)
|
||||||
|
assert.Len(t, savedNetworks, 1)
|
||||||
|
assert.Equal(t, "Home", savedNetworks[0].SSID)
|
||||||
|
assert.True(t, savedNetworks[0].Saved)
|
||||||
|
assert.False(t, savedNetworks[0].OutOfRange)
|
||||||
|
assert.Equal(t, uint8(76), savedNetworks[0].Signal)
|
||||||
|
}
|
||||||
|
|
||||||
func TestNetworkManagerBackend_FindConnection_NoSettings(t *testing.T) {
|
func TestNetworkManagerBackend_FindConnection_NoSettings(t *testing.T) {
|
||||||
mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
|
mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package network
|
package network
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -10,6 +11,10 @@ import (
|
|||||||
"github.com/yeqown/go-qrcode/writer/standard"
|
"github.com/yeqown/go-qrcode/writer/standard"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ErrNoNetworkBackend is returned when no supported network management daemon
|
||||||
|
// (NetworkManager, iwd, systemd-networkd, ConnMan) is present on the system.
|
||||||
|
var ErrNoNetworkBackend = errors.New("no supported network backend found")
|
||||||
|
|
||||||
func NewManager() (*Manager, error) {
|
func NewManager() (*Manager, error) {
|
||||||
detection, err := DetectNetworkStack()
|
detection, err := DetectNetworkStack()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -58,7 +63,7 @@ func NewManager() (*Manager, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("no supported network backend found: %s", detection.ChosenReason)
|
return nil, fmt.Errorf("%w: %s", ErrNoNetworkBackend, detection.ChosenReason)
|
||||||
}
|
}
|
||||||
|
|
||||||
m := &Manager{
|
m := &Manager{
|
||||||
@@ -67,6 +72,7 @@ func NewManager() (*Manager, error) {
|
|||||||
NetworkStatus: StatusDisconnected,
|
NetworkStatus: StatusDisconnected,
|
||||||
Preference: PreferenceAuto,
|
Preference: PreferenceAuto,
|
||||||
WiFiNetworks: []WiFiNetwork{},
|
WiFiNetworks: []WiFiNetwork{},
|
||||||
|
SavedWiFiNetworks: []WiFiNetwork{},
|
||||||
},
|
},
|
||||||
stateMutex: sync.RWMutex{},
|
stateMutex: sync.RWMutex{},
|
||||||
|
|
||||||
@@ -120,6 +126,7 @@ func (m *Manager) syncStateFromBackend() error {
|
|||||||
m.state.WiFiBSSID = backendState.WiFiBSSID
|
m.state.WiFiBSSID = backendState.WiFiBSSID
|
||||||
m.state.WiFiSignal = backendState.WiFiSignal
|
m.state.WiFiSignal = backendState.WiFiSignal
|
||||||
m.state.WiFiNetworks = backendState.WiFiNetworks
|
m.state.WiFiNetworks = backendState.WiFiNetworks
|
||||||
|
m.state.SavedWiFiNetworks = backendState.SavedWiFiNetworks
|
||||||
m.state.WiFiDevices = backendState.WiFiDevices
|
m.state.WiFiDevices = backendState.WiFiDevices
|
||||||
m.state.WiredConnections = backendState.WiredConnections
|
m.state.WiredConnections = backendState.WiredConnections
|
||||||
m.state.VPNProfiles = backendState.VPNProfiles
|
m.state.VPNProfiles = backendState.VPNProfiles
|
||||||
@@ -156,6 +163,7 @@ func (m *Manager) snapshotState() NetworkState {
|
|||||||
defer m.stateMutex.RUnlock()
|
defer m.stateMutex.RUnlock()
|
||||||
s := *m.state
|
s := *m.state
|
||||||
s.WiFiNetworks = append([]WiFiNetwork(nil), m.state.WiFiNetworks...)
|
s.WiFiNetworks = append([]WiFiNetwork(nil), m.state.WiFiNetworks...)
|
||||||
|
s.SavedWiFiNetworks = append([]WiFiNetwork(nil), m.state.SavedWiFiNetworks...)
|
||||||
s.WiFiDevices = append([]WiFiDevice(nil), m.state.WiFiDevices...)
|
s.WiFiDevices = append([]WiFiDevice(nil), m.state.WiFiDevices...)
|
||||||
s.WiredConnections = append([]WiredConnection(nil), m.state.WiredConnections...)
|
s.WiredConnections = append([]WiredConnection(nil), m.state.WiredConnections...)
|
||||||
s.EthernetDevices = append([]EthernetDevice(nil), m.state.EthernetDevices...)
|
s.EthernetDevices = append([]EthernetDevice(nil), m.state.EthernetDevices...)
|
||||||
@@ -211,6 +219,9 @@ func stateChangedMeaningfully(old, new *NetworkState) bool {
|
|||||||
if len(old.WiFiNetworks) != len(new.WiFiNetworks) {
|
if len(old.WiFiNetworks) != len(new.WiFiNetworks) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
if len(old.SavedWiFiNetworks) != len(new.SavedWiFiNetworks) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
if len(old.WiFiDevices) != len(new.WiFiDevices) {
|
if len(old.WiFiDevices) != len(new.WiFiDevices) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -238,6 +249,23 @@ func stateChangedMeaningfully(old, new *NetworkState) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for i := range old.SavedWiFiNetworks {
|
||||||
|
oldNet := &old.SavedWiFiNetworks[i]
|
||||||
|
newNet := &new.SavedWiFiNetworks[i]
|
||||||
|
if oldNet.SSID != newNet.SSID {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if oldNet.Connected != newNet.Connected {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if oldNet.Autoconnect != newNet.Autoconnect {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if oldNet.OutOfRange != newNet.OutOfRange {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for i := range old.WiredConnections {
|
for i := range old.WiredConnections {
|
||||||
oldNet := &old.WiredConnections[i]
|
oldNet := &old.WiredConnections[i]
|
||||||
newNet := &new.WiredConnections[i]
|
newNet := &new.WiredConnections[i]
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ type WiFiNetwork struct {
|
|||||||
Saved bool `json:"saved"`
|
Saved bool `json:"saved"`
|
||||||
Autoconnect bool `json:"autoconnect"`
|
Autoconnect bool `json:"autoconnect"`
|
||||||
Hidden bool `json:"hidden"`
|
Hidden bool `json:"hidden"`
|
||||||
|
OutOfRange bool `json:"outOfRange"`
|
||||||
Frequency uint32 `json:"frequency"`
|
Frequency uint32 `json:"frequency"`
|
||||||
Mode string `json:"mode"`
|
Mode string `json:"mode"`
|
||||||
Rate uint32 `json:"rate"`
|
Rate uint32 `json:"rate"`
|
||||||
@@ -111,6 +112,7 @@ type NetworkState struct {
|
|||||||
WiFiBSSID string `json:"wifiBSSID"`
|
WiFiBSSID string `json:"wifiBSSID"`
|
||||||
WiFiSignal uint8 `json:"wifiSignal"`
|
WiFiSignal uint8 `json:"wifiSignal"`
|
||||||
WiFiNetworks []WiFiNetwork `json:"wifiNetworks"`
|
WiFiNetworks []WiFiNetwork `json:"wifiNetworks"`
|
||||||
|
SavedWiFiNetworks []WiFiNetwork `json:"savedWifiNetworks"`
|
||||||
WiFiDevices []WiFiDevice `json:"wifiDevices"`
|
WiFiDevices []WiFiDevice `json:"wifiDevices"`
|
||||||
WiredConnections []WiredConnection `json:"wiredConnections"`
|
WiredConnections []WiredConnection `json:"wiredConnections"`
|
||||||
VPNProfiles []VPNProfile `json:"vpnProfiles"`
|
VPNProfiles []VPNProfile `json:"vpnProfiles"`
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package network
|
||||||
|
|
||||||
|
import "sort"
|
||||||
|
|
||||||
|
type savedWiFiProfile struct {
|
||||||
|
Autoconnect bool
|
||||||
|
Hidden bool
|
||||||
|
Secured bool
|
||||||
|
Enterprise bool
|
||||||
|
Mode string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Saved WiFi state is keyed by SSID because the UI/API accepts SSID actions.
|
||||||
|
// Multiple backend profiles for the same SSID are intentionally collapsed here.
|
||||||
|
func mergeSavedProfilesIntoWiFiNetworks(networks []WiFiNetwork, profiles map[string]savedWiFiProfile, currentSSID string, wifiConnected bool) []WiFiNetwork {
|
||||||
|
merged := make([]WiFiNetwork, len(networks))
|
||||||
|
for i, network := range networks {
|
||||||
|
profile, saved := profiles[network.SSID]
|
||||||
|
network.Connected = wifiConnected && network.SSID == currentSSID
|
||||||
|
network.Saved = saved
|
||||||
|
if saved {
|
||||||
|
network.Autoconnect = profile.Autoconnect
|
||||||
|
network.Hidden = network.Hidden || profile.Hidden
|
||||||
|
network.Secured = network.Secured || profile.Secured
|
||||||
|
network.Enterprise = network.Enterprise || profile.Enterprise
|
||||||
|
if network.Mode == "" {
|
||||||
|
network.Mode = profile.Mode
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
network.Autoconnect = false
|
||||||
|
}
|
||||||
|
merged[i] = network
|
||||||
|
}
|
||||||
|
return merged
|
||||||
|
}
|
||||||
|
|
||||||
|
func wiFiNetworksBySSID(networks []WiFiNetwork, visibleOnly bool) map[string]WiFiNetwork {
|
||||||
|
visible := make(map[string]WiFiNetwork, len(networks))
|
||||||
|
for _, network := range networks {
|
||||||
|
if visibleOnly && network.OutOfRange {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
visible[network.SSID] = network
|
||||||
|
}
|
||||||
|
return visible
|
||||||
|
}
|
||||||
|
|
||||||
|
func refreshSavedWiFiState(networks []WiFiNetwork, profiles map[string]savedWiFiProfile, currentSSID string, wifiConnected bool) ([]WiFiNetwork, []WiFiNetwork) {
|
||||||
|
mergedNetworks := mergeSavedProfilesIntoWiFiNetworks(networks, profiles, currentSSID, wifiConnected)
|
||||||
|
visibleNetworks := wiFiNetworksBySSID(mergedNetworks, true)
|
||||||
|
savedNetworks := savedWiFiNetworksFromProfiles(profiles, visibleNetworks, currentSSID, wifiConnected)
|
||||||
|
return mergedNetworks, savedNetworks
|
||||||
|
}
|
||||||
|
|
||||||
|
func savedWiFiNetworksFromProfiles(profiles map[string]savedWiFiProfile, visible map[string]WiFiNetwork, currentSSID string, wifiConnected bool) []WiFiNetwork {
|
||||||
|
networks := make([]WiFiNetwork, 0, len(profiles))
|
||||||
|
for ssid, profile := range profiles {
|
||||||
|
if network, ok := visible[ssid]; ok {
|
||||||
|
network.Saved = true
|
||||||
|
network.Autoconnect = profile.Autoconnect
|
||||||
|
network.Hidden = network.Hidden || profile.Hidden
|
||||||
|
network.Secured = network.Secured || profile.Secured
|
||||||
|
network.Enterprise = network.Enterprise || profile.Enterprise
|
||||||
|
network.OutOfRange = false
|
||||||
|
if network.Mode == "" {
|
||||||
|
network.Mode = profile.Mode
|
||||||
|
}
|
||||||
|
networks = append(networks, network)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
isConnected := wifiConnected && ssid == currentSSID
|
||||||
|
networks = append(networks, WiFiNetwork{
|
||||||
|
SSID: ssid,
|
||||||
|
Secured: profile.Secured,
|
||||||
|
Enterprise: profile.Enterprise,
|
||||||
|
Connected: isConnected,
|
||||||
|
Saved: true,
|
||||||
|
Autoconnect: profile.Autoconnect,
|
||||||
|
Hidden: profile.Hidden,
|
||||||
|
OutOfRange: !isConnected,
|
||||||
|
Mode: profile.Mode,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(networks, func(i, j int) bool {
|
||||||
|
if networks[i].Connected && !networks[j].Connected {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if !networks[i].Connected && networks[j].Connected {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if networks[i].OutOfRange != networks[j].OutOfRange {
|
||||||
|
return !networks[i].OutOfRange
|
||||||
|
}
|
||||||
|
if networks[i].Signal != networks[j].Signal {
|
||||||
|
return networks[i].Signal > networks[j].Signal
|
||||||
|
}
|
||||||
|
return networks[i].SSID < networks[j].SSID
|
||||||
|
})
|
||||||
|
|
||||||
|
return networks
|
||||||
|
}
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
package network
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMergeSavedProfilesIntoWiFiNetworks(t *testing.T) {
|
||||||
|
networks := []WiFiNetwork{
|
||||||
|
{
|
||||||
|
SSID: "Home",
|
||||||
|
Signal: 80,
|
||||||
|
Secured: false,
|
||||||
|
Autoconnect: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SSID: "Cafe",
|
||||||
|
Signal: 50,
|
||||||
|
Secured: false,
|
||||||
|
Autoconnect: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
profiles := map[string]savedWiFiProfile{
|
||||||
|
"Home": {
|
||||||
|
Autoconnect: true,
|
||||||
|
Hidden: true,
|
||||||
|
Secured: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
merged := mergeSavedProfilesIntoWiFiNetworks(networks, profiles, "Home", true)
|
||||||
|
|
||||||
|
assert.Len(t, merged, 2)
|
||||||
|
assert.Equal(t, "Home", merged[0].SSID)
|
||||||
|
assert.True(t, merged[0].Connected)
|
||||||
|
assert.True(t, merged[0].Saved)
|
||||||
|
assert.True(t, merged[0].Autoconnect)
|
||||||
|
assert.True(t, merged[0].Hidden)
|
||||||
|
assert.True(t, merged[0].Secured)
|
||||||
|
assert.Equal(t, "infrastructure", merged[0].Mode)
|
||||||
|
|
||||||
|
assert.Equal(t, "Cafe", merged[1].SSID)
|
||||||
|
assert.False(t, merged[1].Saved)
|
||||||
|
assert.False(t, merged[1].Autoconnect)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSavedWiFiNetworksFromProfilesOutOfRangeWithoutVisibleNetworks(t *testing.T) {
|
||||||
|
profiles := map[string]savedWiFiProfile{
|
||||||
|
"Home": {
|
||||||
|
Autoconnect: true,
|
||||||
|
Secured: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
networks := savedWiFiNetworksFromProfiles(profiles, nil, "", false)
|
||||||
|
|
||||||
|
assert.Len(t, networks, 1)
|
||||||
|
assert.Equal(t, "Home", networks[0].SSID)
|
||||||
|
assert.True(t, networks[0].Saved)
|
||||||
|
assert.True(t, networks[0].OutOfRange)
|
||||||
|
assert.Equal(t, uint8(0), networks[0].Signal)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSavedWiFiNetworksFromProfilesKeepsConnectedCurrentNetworkInRange(t *testing.T) {
|
||||||
|
profiles := map[string]savedWiFiProfile{
|
||||||
|
"Home": {
|
||||||
|
Autoconnect: true,
|
||||||
|
Secured: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
networks := savedWiFiNetworksFromProfiles(profiles, nil, "Home", true)
|
||||||
|
|
||||||
|
assert.Len(t, networks, 1)
|
||||||
|
assert.Equal(t, "Home", networks[0].SSID)
|
||||||
|
assert.True(t, networks[0].Connected)
|
||||||
|
assert.False(t, networks[0].OutOfRange)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSavedWiFiNetworksFromProfilesIncludesOutOfRange(t *testing.T) {
|
||||||
|
profiles := map[string]savedWiFiProfile{
|
||||||
|
"Home": {
|
||||||
|
Autoconnect: true,
|
||||||
|
Hidden: true,
|
||||||
|
Secured: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
},
|
||||||
|
"Office": {
|
||||||
|
Autoconnect: false,
|
||||||
|
Secured: true,
|
||||||
|
Enterprise: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
visible := map[string]WiFiNetwork{
|
||||||
|
"Home": {
|
||||||
|
SSID: "Home",
|
||||||
|
Signal: 72,
|
||||||
|
Secured: true,
|
||||||
|
Connected: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
networks := savedWiFiNetworksFromProfiles(profiles, visible, "Home", true)
|
||||||
|
|
||||||
|
assert.Len(t, networks, 2)
|
||||||
|
assert.Equal(t, "Home", networks[0].SSID)
|
||||||
|
assert.True(t, networks[0].Saved)
|
||||||
|
assert.True(t, networks[0].Connected)
|
||||||
|
assert.False(t, networks[0].OutOfRange)
|
||||||
|
assert.True(t, networks[0].Hidden)
|
||||||
|
assert.Equal(t, uint8(72), networks[0].Signal)
|
||||||
|
|
||||||
|
assert.Equal(t, "Office", networks[1].SSID)
|
||||||
|
assert.True(t, networks[1].Saved)
|
||||||
|
assert.False(t, networks[1].Autoconnect)
|
||||||
|
assert.True(t, networks[1].Enterprise)
|
||||||
|
assert.True(t, networks[1].OutOfRange)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWiFiNetworksBySSIDVisibleOnlySkipsOutOfRange(t *testing.T) {
|
||||||
|
visible := wiFiNetworksBySSID([]WiFiNetwork{
|
||||||
|
{SSID: "Home", Signal: 70},
|
||||||
|
{SSID: "Office", Signal: 0, OutOfRange: true},
|
||||||
|
}, true)
|
||||||
|
|
||||||
|
assert.Contains(t, visible, "Home")
|
||||||
|
assert.NotContains(t, visible, "Office")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRefreshSavedWiFiStatePreservesVisibleSavedNetworks(t *testing.T) {
|
||||||
|
networks := []WiFiNetwork{
|
||||||
|
{
|
||||||
|
SSID: "Home",
|
||||||
|
Signal: 82,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
profiles := map[string]savedWiFiProfile{
|
||||||
|
"Home": {
|
||||||
|
Autoconnect: true,
|
||||||
|
Secured: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
},
|
||||||
|
"Office": {
|
||||||
|
Autoconnect: false,
|
||||||
|
Secured: true,
|
||||||
|
Mode: "infrastructure",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
mergedNetworks, savedNetworks := refreshSavedWiFiState(networks, profiles, "", false)
|
||||||
|
|
||||||
|
assert.Len(t, mergedNetworks, 1)
|
||||||
|
assert.Equal(t, "Home", mergedNetworks[0].SSID)
|
||||||
|
assert.True(t, mergedNetworks[0].Saved)
|
||||||
|
assert.True(t, mergedNetworks[0].Autoconnect)
|
||||||
|
|
||||||
|
assert.Len(t, savedNetworks, 2)
|
||||||
|
assert.Equal(t, "Home", savedNetworks[0].SSID)
|
||||||
|
assert.True(t, savedNetworks[0].Saved)
|
||||||
|
assert.False(t, savedNetworks[0].OutOfRange)
|
||||||
|
assert.Equal(t, uint8(82), savedNetworks[0].Signal)
|
||||||
|
|
||||||
|
assert.Equal(t, "Office", savedNetworks[1].SSID)
|
||||||
|
assert.True(t, savedNetworks[1].Saved)
|
||||||
|
assert.True(t, savedNetworks[1].OutOfRange)
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package server
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
@@ -38,7 +39,7 @@ import (
|
|||||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||||
)
|
)
|
||||||
|
|
||||||
const APIVersion = 25
|
const APIVersion = 26
|
||||||
|
|
||||||
var CLIVersion = "dev"
|
var CLIVersion = "dev"
|
||||||
|
|
||||||
@@ -1481,26 +1482,36 @@ func Start(printDocs bool) error {
|
|||||||
log.Info("")
|
log.Info("")
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
switch err := InitializeNetworkManager(); {
|
||||||
|
case err == nil:
|
||||||
|
notifyCapabilityChange()
|
||||||
|
return
|
||||||
|
case errors.Is(err, network.ErrNoNetworkBackend):
|
||||||
|
log.Warn("No supported network backend present; skipping retries")
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
log.Warnf("Network manager unavailable, will retry: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
ticker := time.NewTicker(30 * time.Second)
|
ticker := time.NewTicker(30 * time.Second)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|
||||||
if err := InitializeNetworkManager(); err != nil {
|
for range 10 {
|
||||||
log.Warnf("Network manager unavailable: %v", err)
|
<-ticker.C
|
||||||
} else {
|
|
||||||
notifyCapabilityChange()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for range ticker.C {
|
|
||||||
if networkManager != nil {
|
if networkManager != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err := InitializeNetworkManager(); err == nil {
|
switch err := InitializeNetworkManager(); {
|
||||||
|
case err == nil:
|
||||||
log.Info("Network manager initialized")
|
log.Info("Network manager initialized")
|
||||||
notifyCapabilityChange()
|
notifyCapabilityChange()
|
||||||
return
|
return
|
||||||
|
case errors.Is(err, network.ErrNoNetworkBackend):
|
||||||
|
log.Warn("No supported network backend present; stopping retries")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log.Warn("Network manager still unavailable after retries; giving up")
|
||||||
}()
|
}()
|
||||||
|
|
||||||
loginctlReady := make(chan struct{})
|
loginctlReady := make(chan struct{})
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ func convertPeerStatus(ps *ipnstate.PeerStatus, users map[tailcfg.UserID]tailcfg
|
|||||||
Online: ps.Online,
|
Online: ps.Online,
|
||||||
Active: ps.Active,
|
Active: ps.Active,
|
||||||
ExitNode: ps.ExitNode,
|
ExitNode: ps.ExitNode,
|
||||||
|
ExitNodeOption: ps.ExitNodeOption,
|
||||||
Relay: ps.Relay,
|
Relay: ps.Relay,
|
||||||
RxBytes: ps.RxBytes,
|
RxBytes: ps.RxBytes,
|
||||||
TxBytes: ps.TxBytes,
|
TxBytes: ps.TxBytes,
|
||||||
|
|||||||
@@ -14,6 +14,14 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
|||||||
handleGetStatus(conn, req, manager)
|
handleGetStatus(conn, req, manager)
|
||||||
case "tailscale.refresh":
|
case "tailscale.refresh":
|
||||||
handleRefresh(conn, req, manager)
|
handleRefresh(conn, req, manager)
|
||||||
|
case "tailscale.connect":
|
||||||
|
handleConnect(conn, req, manager)
|
||||||
|
case "tailscale.disconnect":
|
||||||
|
handleDisconnect(conn, req, manager)
|
||||||
|
case "tailscale.setExitNode":
|
||||||
|
handleSetExitNode(conn, req, manager)
|
||||||
|
case "tailscale.setAllowLanAccess":
|
||||||
|
handleSetAllowLanAccess(conn, req, manager)
|
||||||
default:
|
default:
|
||||||
models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method))
|
models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method))
|
||||||
}
|
}
|
||||||
@@ -28,3 +36,37 @@ func handleRefresh(conn net.Conn, req models.Request, manager *Manager) {
|
|||||||
manager.RefreshState()
|
manager.RefreshState()
|
||||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "refreshed"})
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "refreshed"})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleConnect(conn net.Conn, req models.Request, manager *Manager) {
|
||||||
|
if err := manager.Connect(); err != nil {
|
||||||
|
models.RespondError(conn, req.ID, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "connected"})
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleDisconnect(conn net.Conn, req models.Request, manager *Manager) {
|
||||||
|
if err := manager.Disconnect(); err != nil {
|
||||||
|
models.RespondError(conn, req.ID, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "disconnected"})
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSetExitNode(conn net.Conn, req models.Request, manager *Manager) {
|
||||||
|
id := models.GetOr(req, "id", "")
|
||||||
|
if err := manager.SetExitNode(id); err != nil {
|
||||||
|
models.RespondError(conn, req.ID, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "exit node updated"})
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSetAllowLanAccess(conn net.Conn, req models.Request, manager *Manager) {
|
||||||
|
enabled := models.GetOr(req, "enabled", false)
|
||||||
|
if err := manager.SetAllowLANAccess(enabled); err != nil {
|
||||||
|
models.RespondError(conn, req.ID, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "lan access updated"})
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -78,6 +79,63 @@ func TestHandleRefresh(t *testing.T) {
|
|||||||
assert.True(t, resp.Result.Success)
|
assert.True(t, resp.Result.Success)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHandleActions(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
name string
|
||||||
|
method string
|
||||||
|
params map[string]any
|
||||||
|
}{
|
||||||
|
{"connect", "tailscale.connect", nil},
|
||||||
|
{"disconnect", "tailscale.disconnect", nil},
|
||||||
|
{"setExitNode", "tailscale.setExitNode", map[string]any{"id": "nABC123"}},
|
||||||
|
{"clearExitNode", "tailscale.setExitNode", map[string]any{"id": ""}},
|
||||||
|
{"setAllowLanAccess", "tailscale.setAllowLanAccess", map[string]any{"enabled": true}},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range cases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
m := handlerTestManager()
|
||||||
|
defer m.Close()
|
||||||
|
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
conn := &mockConn{Buffer: buf}
|
||||||
|
|
||||||
|
req := models.Request{ID: 1, Method: tc.method, Params: tc.params}
|
||||||
|
HandleRequest(conn, req, m)
|
||||||
|
|
||||||
|
var resp models.Response[models.SuccessResult]
|
||||||
|
require.NoError(t, json.NewDecoder(buf).Decode(&resp))
|
||||||
|
assert.Equal(t, 1, resp.ID)
|
||||||
|
assert.Empty(t, resp.Error)
|
||||||
|
require.NotNil(t, resp.Result)
|
||||||
|
assert.True(t, resp.Result.Success)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHandleAction_BackendError(t *testing.T) {
|
||||||
|
client := &mockClient{
|
||||||
|
watchFn: blockingWatch,
|
||||||
|
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
|
||||||
|
editPrefsFn: func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
|
||||||
|
return nil, fmt.Errorf("backend rejected edit")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
m := newManager(client)
|
||||||
|
defer m.Close()
|
||||||
|
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
conn := &mockConn{Buffer: buf}
|
||||||
|
|
||||||
|
req := models.Request{ID: 1, Method: "tailscale.connect"}
|
||||||
|
HandleRequest(conn, req, m)
|
||||||
|
|
||||||
|
var resp models.Response[models.SuccessResult]
|
||||||
|
require.NoError(t, json.NewDecoder(buf).Decode(&resp))
|
||||||
|
assert.Nil(t, resp.Result)
|
||||||
|
assert.Contains(t, resp.Error, "backend rejected edit")
|
||||||
|
}
|
||||||
|
|
||||||
func TestHandleRequest_UnknownMethod(t *testing.T) {
|
func TestHandleRequest_UnknownMethod(t *testing.T) {
|
||||||
m := handlerTestManager()
|
m := handlerTestManager()
|
||||||
defer m.Close()
|
defer m.Close()
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"tailscale.com/client/local"
|
"tailscale.com/client/local"
|
||||||
"tailscale.com/ipn"
|
"tailscale.com/ipn"
|
||||||
"tailscale.com/ipn/ipnstate"
|
"tailscale.com/ipn/ipnstate"
|
||||||
|
"tailscale.com/tailcfg"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -22,6 +23,8 @@ const (
|
|||||||
type tailscaleClient interface {
|
type tailscaleClient interface {
|
||||||
WatchIPNBus(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error)
|
WatchIPNBus(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error)
|
||||||
Status(ctx context.Context) (*ipnstate.Status, error)
|
Status(ctx context.Context) (*ipnstate.Status, error)
|
||||||
|
GetPrefs(ctx context.Context) (*ipn.Prefs, error)
|
||||||
|
EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ipnBusWatcher abstracts the IPN bus watcher for testing.
|
// ipnBusWatcher abstracts the IPN bus watcher for testing.
|
||||||
@@ -43,6 +46,14 @@ func (w *localClientWrapper) Status(ctx context.Context) (*ipnstate.Status, erro
|
|||||||
return w.client.Status(ctx)
|
return w.client.Status(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *localClientWrapper) GetPrefs(ctx context.Context) (*ipn.Prefs, error) {
|
||||||
|
return w.client.GetPrefs(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *localClientWrapper) EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
|
||||||
|
return w.client.EditPrefs(ctx, mp)
|
||||||
|
}
|
||||||
|
|
||||||
// Manager manages Tailscale state via IPN bus events and subscriber notifications.
|
// Manager manages Tailscale state via IPN bus events and subscriber notifications.
|
||||||
type Manager struct {
|
type Manager struct {
|
||||||
state *TailscaleState
|
state *TailscaleState
|
||||||
@@ -169,16 +180,36 @@ func (m *Manager) fetchAndBroadcast(ctx context.Context) {
|
|||||||
statusCtx, cancel := context.WithTimeout(ctx, statusTimeout)
|
statusCtx, cancel := context.WithTimeout(ctx, statusTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
status, err := m.client.Status(statusCtx)
|
state, err := m.fetchState(statusCtx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("[Tailscale] Failed to fetch status: %v", err)
|
log.Warnf("[Tailscale] Failed to fetch status: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
state := convertStatus(status)
|
|
||||||
m.updateState(state)
|
m.updateState(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fetchState fetches the current status and merges in pref-derived fields
|
||||||
|
// (e.g. exit-node LAN access) that are not present in the IPN status itself.
|
||||||
|
func (m *Manager) fetchState(ctx context.Context) (*TailscaleState, error) {
|
||||||
|
status, err := m.client.Status(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
state := convertStatus(status)
|
||||||
|
|
||||||
|
// Prefs carry the exit-node LAN-access toggle, which the status does not
|
||||||
|
// expose. Treat a prefs failure as non-fatal so status still updates.
|
||||||
|
if prefs, err := m.client.GetPrefs(ctx); err != nil {
|
||||||
|
log.Warnf("[Tailscale] Failed to fetch prefs: %v", err)
|
||||||
|
} else if prefs != nil {
|
||||||
|
state.ExitNodeAllowLANAccess = prefs.ExitNodeAllowLANAccess
|
||||||
|
}
|
||||||
|
|
||||||
|
return state, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Manager) updateState(state *TailscaleState) {
|
func (m *Manager) updateState(state *TailscaleState) {
|
||||||
m.stateMutex.Lock()
|
m.stateMutex.Lock()
|
||||||
m.state = state
|
m.state = state
|
||||||
@@ -266,12 +297,62 @@ func (m *Manager) RefreshState() {
|
|||||||
ctx, cancel := context.WithTimeout(m.ctx, statusTimeout)
|
ctx, cancel := context.WithTimeout(m.ctx, statusTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
status, err := m.client.Status(ctx)
|
state, err := m.fetchState(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("[Tailscale] Failed to refresh state: %v", err)
|
log.Warnf("[Tailscale] Failed to refresh state: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
state := convertStatus(status)
|
|
||||||
m.updateState(state)
|
m.updateState(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Connect brings the Tailscale backend up (WantRunning = true).
|
||||||
|
func (m *Manager) Connect() error {
|
||||||
|
return m.editPrefs(&ipn.MaskedPrefs{
|
||||||
|
Prefs: ipn.Prefs{WantRunning: true},
|
||||||
|
WantRunningSet: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disconnect brings the Tailscale backend down (WantRunning = false).
|
||||||
|
func (m *Manager) Disconnect() error {
|
||||||
|
return m.editPrefs(&ipn.MaskedPrefs{
|
||||||
|
Prefs: ipn.Prefs{WantRunning: false},
|
||||||
|
WantRunningSet: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetExitNode selects the exit node identified by its stable node ID. An empty
|
||||||
|
// id clears the current exit node. Mirrors `tailscale set --exit-node=<id>`,
|
||||||
|
// which also clears any legacy IP-based exit node so a stale ExitNodeIP cannot
|
||||||
|
// silently take precedence over the now-empty ID.
|
||||||
|
func (m *Manager) SetExitNode(id string) error {
|
||||||
|
return m.editPrefs(&ipn.MaskedPrefs{
|
||||||
|
Prefs: ipn.Prefs{ExitNodeID: tailcfg.StableNodeID(id)},
|
||||||
|
ExitNodeIDSet: true,
|
||||||
|
ExitNodeIPSet: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetAllowLANAccess toggles whether locally accessible subnets remain
|
||||||
|
// reachable while an exit node is in use.
|
||||||
|
func (m *Manager) SetAllowLANAccess(enabled bool) error {
|
||||||
|
return m.editPrefs(&ipn.MaskedPrefs{
|
||||||
|
Prefs: ipn.Prefs{ExitNodeAllowLANAccess: enabled},
|
||||||
|
ExitNodeAllowLANAccessSet: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// editPrefs applies a masked prefs edit and refreshes state so subscribers see
|
||||||
|
// the result immediately, in addition to the IPN bus notification it triggers.
|
||||||
|
func (m *Manager) editPrefs(mp *ipn.MaskedPrefs) error {
|
||||||
|
ctx, cancel := context.WithTimeout(m.ctx, statusTimeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if _, err := m.client.EditPrefs(ctx, mp); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.RefreshState()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,8 +12,16 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"tailscale.com/ipn"
|
"tailscale.com/ipn"
|
||||||
"tailscale.com/ipn/ipnstate"
|
"tailscale.com/ipn/ipnstate"
|
||||||
|
"tailscale.com/tailcfg"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// blockingWatch is a watchFn that blocks until the context is cancelled, used
|
||||||
|
// by tests that exercise direct manager calls rather than the watch loop.
|
||||||
|
func blockingWatch(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error) {
|
||||||
|
<-ctx.Done()
|
||||||
|
return nil, ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
// mockWatcher yields canned Notify events, then returns err or blocks until Close/context cancel.
|
// mockWatcher yields canned Notify events, then returns err or blocks until Close/context cancel.
|
||||||
type mockWatcher struct {
|
type mockWatcher struct {
|
||||||
events []ipn.Notify
|
events []ipn.Notify
|
||||||
@@ -70,6 +78,8 @@ func (w *mockWatcher) Close() error {
|
|||||||
type mockClient struct {
|
type mockClient struct {
|
||||||
watchFn func(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error)
|
watchFn func(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error)
|
||||||
statusFn func(ctx context.Context) (*ipnstate.Status, error)
|
statusFn func(ctx context.Context) (*ipnstate.Status, error)
|
||||||
|
getPrefsFn func(ctx context.Context) (*ipn.Prefs, error)
|
||||||
|
editPrefsFn func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *mockClient) WatchIPNBus(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error) {
|
func (c *mockClient) WatchIPNBus(ctx context.Context, mask ipn.NotifyWatchOpt) (ipnBusWatcher, error) {
|
||||||
@@ -80,6 +90,20 @@ func (c *mockClient) Status(ctx context.Context) (*ipnstate.Status, error) {
|
|||||||
return c.statusFn(ctx)
|
return c.statusFn(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *mockClient) GetPrefs(ctx context.Context) (*ipn.Prefs, error) {
|
||||||
|
if c.getPrefsFn != nil {
|
||||||
|
return c.getPrefsFn(ctx)
|
||||||
|
}
|
||||||
|
return &ipn.Prefs{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *mockClient) EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
|
||||||
|
if c.editPrefsFn != nil {
|
||||||
|
return c.editPrefsFn(ctx, mp)
|
||||||
|
}
|
||||||
|
return &ipn.Prefs{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func runningStatus() *ipnstate.Status {
|
func runningStatus() *ipnstate.Status {
|
||||||
return &ipnstate.Status{
|
return &ipnstate.Status{
|
||||||
Version: "1.94.2",
|
Version: "1.94.2",
|
||||||
@@ -296,3 +320,78 @@ func TestManager_RefreshState(t *testing.T) {
|
|||||||
assert.True(t, state.Connected)
|
assert.True(t, state.Connected)
|
||||||
assert.Equal(t, "cachyos", state.Self.Hostname)
|
assert.Equal(t, "cachyos", state.Self.Hostname)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestManager_RefreshState_MergesPrefs(t *testing.T) {
|
||||||
|
client := &mockClient{
|
||||||
|
watchFn: blockingWatch,
|
||||||
|
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
|
||||||
|
getPrefsFn: func(ctx context.Context) (*ipn.Prefs, error) {
|
||||||
|
return &ipn.Prefs{ExitNodeAllowLANAccess: true}, nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
m := newManager(client)
|
||||||
|
defer m.Close()
|
||||||
|
|
||||||
|
m.RefreshState()
|
||||||
|
|
||||||
|
assert.True(t, m.GetState().ExitNodeAllowLANAccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestManager_Actions_EditPrefs(t *testing.T) {
|
||||||
|
var captured *ipn.MaskedPrefs
|
||||||
|
client := &mockClient{
|
||||||
|
watchFn: blockingWatch,
|
||||||
|
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
|
||||||
|
editPrefsFn: func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
|
||||||
|
captured = mp
|
||||||
|
return &ipn.Prefs{}, nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
m := newManager(client)
|
||||||
|
defer m.Close()
|
||||||
|
|
||||||
|
require.NoError(t, m.Connect())
|
||||||
|
require.NotNil(t, captured)
|
||||||
|
assert.True(t, captured.WantRunningSet)
|
||||||
|
assert.True(t, captured.WantRunning)
|
||||||
|
|
||||||
|
require.NoError(t, m.Disconnect())
|
||||||
|
assert.True(t, captured.WantRunningSet)
|
||||||
|
assert.False(t, captured.WantRunning)
|
||||||
|
|
||||||
|
require.NoError(t, m.SetExitNode("nABC123"))
|
||||||
|
assert.True(t, captured.ExitNodeIDSet)
|
||||||
|
assert.Equal(t, tailcfg.StableNodeID("nABC123"), captured.ExitNodeID)
|
||||||
|
// ExitNodeIPSet must also be set so a stale legacy ExitNodeIP cannot
|
||||||
|
// override the ID-based selection (mirrors `tailscale set --exit-node`).
|
||||||
|
assert.True(t, captured.ExitNodeIPSet)
|
||||||
|
|
||||||
|
require.NoError(t, m.SetExitNode(""))
|
||||||
|
assert.True(t, captured.ExitNodeIDSet)
|
||||||
|
assert.Equal(t, tailcfg.StableNodeID(""), captured.ExitNodeID)
|
||||||
|
// Clearing must zero both the ID and any legacy IP-based exit node.
|
||||||
|
assert.True(t, captured.ExitNodeIPSet)
|
||||||
|
|
||||||
|
require.NoError(t, m.SetAllowLANAccess(true))
|
||||||
|
assert.True(t, captured.ExitNodeAllowLANAccessSet)
|
||||||
|
assert.True(t, captured.ExitNodeAllowLANAccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestManager_Actions_PropagateError(t *testing.T) {
|
||||||
|
client := &mockClient{
|
||||||
|
watchFn: blockingWatch,
|
||||||
|
statusFn: func(ctx context.Context) (*ipnstate.Status, error) { return runningStatus(), nil },
|
||||||
|
editPrefsFn: func(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn.Prefs, error) {
|
||||||
|
return nil, fmt.Errorf("backend rejected edit")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
m := newManager(client)
|
||||||
|
defer m.Close()
|
||||||
|
|
||||||
|
assert.Error(t, m.Connect())
|
||||||
|
assert.Error(t, m.SetExitNode("nABC123"))
|
||||||
|
assert.Error(t, m.SetAllowLANAccess(true))
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ type TailscaleState struct {
|
|||||||
BackendState string `json:"backendState"`
|
BackendState string `json:"backendState"`
|
||||||
MagicDNSSuffix string `json:"magicDnsSuffix"`
|
MagicDNSSuffix string `json:"magicDnsSuffix"`
|
||||||
TailnetName string `json:"tailnetName"`
|
TailnetName string `json:"tailnetName"`
|
||||||
|
ExitNodeAllowLANAccess bool `json:"exitNodeAllowLanAccess"`
|
||||||
Self Peer `json:"self"`
|
Self Peer `json:"self"`
|
||||||
Peers []Peer `json:"peers"`
|
Peers []Peer `json:"peers"`
|
||||||
}
|
}
|
||||||
@@ -22,6 +23,7 @@ type Peer struct {
|
|||||||
Online bool `json:"online"`
|
Online bool `json:"online"`
|
||||||
LastSeen string `json:"lastSeen,omitempty"`
|
LastSeen string `json:"lastSeen,omitempty"`
|
||||||
ExitNode bool `json:"exitNode"`
|
ExitNode bool `json:"exitNode"`
|
||||||
|
ExitNodeOption bool `json:"exitNodeOption"`
|
||||||
Tags []string `json:"tags,omitempty"`
|
Tags []string `json:"tags,omitempty"`
|
||||||
Owner string `json:"owner"`
|
Owner string `json:"owner"`
|
||||||
Relay string `json:"relay,omitempty"`
|
Relay string `json:"relay,omitempty"`
|
||||||
|
|||||||
@@ -3,10 +3,10 @@
|
|||||||
# Usage: ./create-source.sh <package-dir> [ubuntu-series]
|
# Usage: ./create-source.sh <package-dir> [ubuntu-series]
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
# ./create-source.sh ../dms questing # Ubuntu 25.10 (default series in ppa-upload)
|
# ./create-source.sh ../dms resolute # Ubuntu 26.04 LTS (default series in ppa-upload)
|
||||||
# ./create-source.sh ../dms resolute # Ubuntu 26.04 LTS
|
# ./create-source.sh ../dms stonking # Ubuntu 26.10
|
||||||
# ./create-source.sh ../dms-git questing
|
|
||||||
# ./create-source.sh ../dms-git resolute
|
# ./create-source.sh ../dms-git resolute
|
||||||
|
# ./create-source.sh ../dms-git stonking
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -27,13 +27,13 @@ if [ $# -lt 1 ]; then
|
|||||||
echo "Arguments:"
|
echo "Arguments:"
|
||||||
echo " package-dir : Path to package directory (e.g., ../dms)"
|
echo " package-dir : Path to package directory (e.g., ../dms)"
|
||||||
echo " ubuntu-series : Ubuntu series (optional, default: noble)"
|
echo " ubuntu-series : Ubuntu series (optional, default: noble)"
|
||||||
echo " Options: noble, jammy, oracular, mantic, questing, resolute"
|
echo " Options: noble, jammy, oracular, mantic, resolute, stonking"
|
||||||
echo
|
echo
|
||||||
echo "Examples:"
|
echo "Examples:"
|
||||||
echo " $0 ../dms questing"
|
|
||||||
echo " $0 ../dms resolute"
|
echo " $0 ../dms resolute"
|
||||||
echo " $0 ../dms-git questing"
|
echo " $0 ../dms stonking"
|
||||||
echo " $0 ../dms-git resolute"
|
echo " $0 ../dms-git resolute"
|
||||||
|
echo " $0 ../dms-git stonking"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ check_ppa_version_exists() {
|
|||||||
local CHECK_MODE="${4:-commit}"
|
local CHECK_MODE="${4:-commit}"
|
||||||
local DISTRO_SERIES="${5:-}"
|
local DISTRO_SERIES="${5:-}"
|
||||||
|
|
||||||
# Query Launchpad API (optionally scoped to one Ubuntu series so the same version can ship to questing and resolute)
|
# Query Launchpad API (optionally scoped to one Ubuntu series so the same version can ship to resolute and stonking)
|
||||||
local API_URL="https://api.launchpad.net/1.0/~avengemedia/+archive/ubuntu/$PPA_NAME?ws.op=getPublishedSources&source_name=$SOURCE_NAME&status=Published"
|
local API_URL="https://api.launchpad.net/1.0/~avengemedia/+archive/ubuntu/$PPA_NAME?ws.op=getPublishedSources&source_name=$SOURCE_NAME&status=Published"
|
||||||
if [[ -n "$DISTRO_SERIES" ]]; then
|
if [[ -n "$DISTRO_SERIES" ]]; then
|
||||||
API_URL+="&distro_series=https://api.launchpad.net/1.0/ubuntu/${DISTRO_SERIES}"
|
API_URL+="&distro_series=https://api.launchpad.net/1.0/ubuntu/${DISTRO_SERIES}"
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
PPA_OWNER="avengemedia"
|
PPA_OWNER="avengemedia"
|
||||||
LAUNCHPAD_API="https://api.launchpad.net/1.0"
|
LAUNCHPAD_API="https://api.launchpad.net/1.0"
|
||||||
# Supported Ubuntu series for PPA builds (25.10 questing + 26.04 LTS resolute)
|
# Supported Ubuntu series for PPA builds (26.04 LTS resolute + 26.10 stonking)
|
||||||
DISTRO_SERIES_LIST=(questing resolute)
|
DISTRO_SERIES_LIST=(resolute stonking)
|
||||||
|
|
||||||
# Define packages (sync with ppa-upload.sh)
|
# Define packages (sync with ppa-upload.sh)
|
||||||
ALL_PACKAGES=(dms dms-git dms-greeter)
|
ALL_PACKAGES=(dms dms-git dms-greeter)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ set -euo pipefail
|
|||||||
|
|
||||||
PPA_OWNER="avengemedia"
|
PPA_OWNER="avengemedia"
|
||||||
LAUNCHPAD_API="https://api.launchpad.net/1.0"
|
LAUNCHPAD_API="https://api.launchpad.net/1.0"
|
||||||
SERIES_LIST=(questing resolute)
|
SERIES_LIST=(resolute stonking)
|
||||||
PACKAGE_FILTER="dms-git"
|
PACKAGE_FILTER="dms-git"
|
||||||
REBUILD_RELEASE=""
|
REBUILD_RELEASE=""
|
||||||
JSON=false
|
JSON=false
|
||||||
@@ -72,12 +72,12 @@ embedded_commit() {
|
|||||||
target_ppa() {
|
target_ppa() {
|
||||||
local series="$1"
|
local series="$1"
|
||||||
if [[ -n "$REBUILD_RELEASE" ]]; then
|
if [[ -n "$REBUILD_RELEASE" ]]; then
|
||||||
if [[ "$series" == "resolute" ]]; then
|
if [[ "$series" == "stonking" ]]; then
|
||||||
echo $((REBUILD_RELEASE + 1))
|
echo $((REBUILD_RELEASE + 1))
|
||||||
else
|
else
|
||||||
echo "$REBUILD_RELEASE"
|
echo "$REBUILD_RELEASE"
|
||||||
fi
|
fi
|
||||||
elif [[ "$series" == "resolute" ]]; then
|
elif [[ "$series" == "stonking" ]]; then
|
||||||
echo "2"
|
echo "2"
|
||||||
else
|
else
|
||||||
echo "1"
|
echo "1"
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
# Usage: ./ppa-upload.sh [package-name] [ppa-name] [ubuntu-series] [rebuild-number] [--keep-builds] [--rebuild=N]
|
# Usage: ./ppa-upload.sh [package-name] [ppa-name] [ubuntu-series] [rebuild-number] [--keep-builds] [--rebuild=N]
|
||||||
#
|
#
|
||||||
# Examples:
|
# Examples:
|
||||||
# ./ppa-upload.sh dms # Upload to questing + resolute (default)
|
# ./ppa-upload.sh dms # Upload to resolute + stonking (default)
|
||||||
# ./ppa-upload.sh dms 2 # Native: questing ppa2, resolute ppa3 (auto +1 on second series)
|
# ./ppa-upload.sh dms 2 # Native: resolute ppa2, stonking ppa3 (auto +1 on second series)
|
||||||
# ./ppa-upload.sh dms --rebuild=2 # Rebuild with ppa2 (flag syntax)
|
# ./ppa-upload.sh dms --rebuild=2 # Rebuild with ppa2 (flag syntax)
|
||||||
# ./ppa-upload.sh dms-git # Single package (both series)
|
# ./ppa-upload.sh dms-git # Single package (both series)
|
||||||
# ./ppa-upload.sh all # All packages (each to both series)
|
# ./ppa-upload.sh all # All packages (each to both series)
|
||||||
# ./ppa-upload.sh dms resolute # 26.04 LTS only (same as "dms dms resolute")
|
# ./ppa-upload.sh dms resolute # 26.04 LTS only (same as "dms dms resolute")
|
||||||
# ./ppa-upload.sh dms questing # 25.10 only
|
# ./ppa-upload.sh dms stonking # 26.10 only
|
||||||
# ./ppa-upload.sh dms dms resolute # Explicit PPA name + one series (optional form)
|
# ./ppa-upload.sh dms dms resolute # Explicit PPA name + one series (optional form)
|
||||||
# ./ppa-upload.sh dms dms resolute 2 # One series + rebuild number
|
# ./ppa-upload.sh dms dms resolute 2 # One series + rebuild number
|
||||||
# ./ppa-upload.sh distro/ubuntu/dms dms # Path-style (backward compatible)
|
# ./ppa-upload.sh distro/ubuntu/dms dms # Path-style (backward compatible)
|
||||||
@@ -70,8 +70,8 @@ if [[ ${#POSITIONAL_ARGS[@]} -gt 0 ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Shorthand: "dms resolute" / "dms questing" (package + series; PPA inferred — no need for "dms dms resolute")
|
# Shorthand: "dms resolute" / "dms stonking" (package + series; PPA inferred — no need for "dms dms resolute")
|
||||||
if [[ ${#POSITIONAL_ARGS[@]} -eq 2 ]] && [[ "${POSITIONAL_ARGS[1]}" == "questing" || "${POSITIONAL_ARGS[1]}" == "resolute" ]]; then
|
if [[ ${#POSITIONAL_ARGS[@]} -eq 2 ]] && [[ "${POSITIONAL_ARGS[1]}" == "resolute" || "${POSITIONAL_ARGS[1]}" == "stonking" ]]; then
|
||||||
PACKAGE_INPUT="${POSITIONAL_ARGS[0]}"
|
PACKAGE_INPUT="${POSITIONAL_ARGS[0]}"
|
||||||
PPA_NAME_INPUT=""
|
PPA_NAME_INPUT=""
|
||||||
UBUNTU_SERIES_RAW="${POSITIONAL_ARGS[1]}"
|
UBUNTU_SERIES_RAW="${POSITIONAL_ARGS[1]}"
|
||||||
@@ -79,11 +79,11 @@ fi
|
|||||||
|
|
||||||
SERIES_LIST=()
|
SERIES_LIST=()
|
||||||
if [[ -z "$UBUNTU_SERIES_RAW" ]]; then
|
if [[ -z "$UBUNTU_SERIES_RAW" ]]; then
|
||||||
SERIES_LIST=(questing resolute)
|
SERIES_LIST=(resolute stonking)
|
||||||
elif [[ "$UBUNTU_SERIES_RAW" == "questing" || "$UBUNTU_SERIES_RAW" == "resolute" ]]; then
|
elif [[ "$UBUNTU_SERIES_RAW" == "resolute" || "$UBUNTU_SERIES_RAW" == "stonking" ]]; then
|
||||||
SERIES_LIST=("$UBUNTU_SERIES_RAW")
|
SERIES_LIST=("$UBUNTU_SERIES_RAW")
|
||||||
else
|
else
|
||||||
error "Invalid Ubuntu series: $UBUNTU_SERIES_RAW (use questing, resolute, or omit for both)"
|
error "Invalid Ubuntu series: $UBUNTU_SERIES_RAW (use resolute, stonking, or omit for both)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -40,10 +40,17 @@ override_dh_auto_install:
|
|||||||
install -Dm644 DankMaterialShell-$(BASE_VERSION)/LICENSE \
|
install -Dm644 DankMaterialShell-$(BASE_VERSION)/LICENSE \
|
||||||
debian/dms-greeter/usr/share/doc/dms-greeter/LICENSE
|
debian/dms-greeter/usr/share/doc/dms-greeter/LICENSE
|
||||||
|
|
||||||
|
# Install systemd tmpfiles/sysusers fragments only when present in the fetched source.
|
||||||
|
# sysusers-dms-greeter.conf landed upstream after v1.4.6; guarding both lets older
|
||||||
|
# release tarballs build, while future tags that ship the files install them automatically.
|
||||||
|
if [ -f DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/tmpfiles-dms-greeter.conf ]; then \
|
||||||
install -Dpm0644 DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/tmpfiles-dms-greeter.conf \
|
install -Dpm0644 DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/tmpfiles-dms-greeter.conf \
|
||||||
debian/dms-greeter/usr/lib/tmpfiles.d/dms-greeter.conf
|
debian/dms-greeter/usr/lib/tmpfiles.d/dms-greeter.conf; \
|
||||||
|
fi
|
||||||
|
if [ -f DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/sysusers-dms-greeter.conf ]; then \
|
||||||
install -Dm644 DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/sysusers-dms-greeter.conf \
|
install -Dm644 DankMaterialShell-$(BASE_VERSION)/quickshell/systemd/sysusers-dms-greeter.conf \
|
||||||
debian/dms-greeter/usr/lib/sysusers.d/dms-greeter.conf
|
debian/dms-greeter/usr/lib/sysusers.d/dms-greeter.conf; \
|
||||||
|
fi
|
||||||
|
|
||||||
# Create cache directory structure (will be created by postinst)
|
# Create cache directory structure (will be created by postinst)
|
||||||
mkdir -p debian/dms-greeter/var/cache/dms-greeter
|
mkdir -p debian/dms-greeter/var/cache/dms-greeter
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# Void Linux packaging
|
||||||
|
|
||||||
|
XBPS templates for DankMaterialShell on [Void Linux](https://voidlinux.org).
|
||||||
|
|
||||||
|
| Package | Source repo | Template |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `dms` | DankMaterialShell | [`srcpkgs/dms/template`](srcpkgs/dms/template) |
|
||||||
|
| `dms-greeter` (optional) | DankMaterialShell | [`srcpkgs/dms-greeter/template`](srcpkgs/dms-greeter/template) |
|
||||||
|
| `dgop` | AvengeMedia/dgop | maintained in the **danklinux** repo (`distro/void/srcpkgs/dgop`) |
|
||||||
|
| `danksearch` | AvengeMedia/danksearch | maintained in the **danklinux** repo (`distro/void/srcpkgs/danksearch`) |
|
||||||
|
|
||||||
|
All build from source.
|
||||||
|
|
||||||
|
## Distribution
|
||||||
|
|
||||||
|
These packages target the official
|
||||||
|
[`void-linux/void-packages`](https://github.com/void-linux/void-packages)
|
||||||
|
repository, so they install with a plain `xbps-install dms` and no extra setup.
|
||||||
|
Most dependencies (`quickshell`, `matugen`, `cava`, `niri`, `greetd`, …) are
|
||||||
|
already in Void; `dgop` and `danksearch` are packaged alongside in the
|
||||||
|
[danklinux repo](https://github.com/AvengeMedia/danklinux/tree/master/distro/void).
|
||||||
|
|
||||||
|
The templates here are the source of truth: copy each into a void-packages
|
||||||
|
checkout at `srcpkgs/<pkg>/template` to build or submit it. Only tagged releases
|
||||||
|
are packaged (no `-git`/nightly variant).
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Installing `dms` automatically pulls in `quickshell`, `accountsservice`, `dgop`,
|
||||||
|
and `matugen` (which drives the Material You theming). The rest are optional —
|
||||||
|
install whichever features you want:
|
||||||
|
|
||||||
|
| Package | Enables |
|
||||||
|
| --- | --- |
|
||||||
|
| `danksearch` | launcher / filesystem search |
|
||||||
|
| `cava` | audio visualiser widget |
|
||||||
|
| `qt6-multimedia` | system sound feedback |
|
||||||
|
| `qt6ct` | Qt app theming |
|
||||||
|
| `wtype` | virtual keyboard input |
|
||||||
|
| `power-profiles-daemon` | power profile control |
|
||||||
|
| `cups-pk-helper` | printer management |
|
||||||
|
| `NetworkManager` | network control |
|
||||||
|
| `i2c-tools` | external-monitor brightness (DDC) |
|
||||||
|
| `niri` / `hyprland` / `sway` | a Wayland compositor (niri is the team's choice) |
|
||||||
|
|
||||||
|
## Building & testing
|
||||||
|
|
||||||
|
Inside a `void-packages` checkout (symlink or copy these `srcpkgs/<pkg>` dirs in):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# build the dependency packages first (dms requires dgop)
|
||||||
|
./xbps-src pkg dgop
|
||||||
|
./xbps-src pkg danksearch
|
||||||
|
./xbps-src pkg dms
|
||||||
|
./xbps-src pkg dms-greeter # optional
|
||||||
|
|
||||||
|
# lint (xlint ships in the xtools package)
|
||||||
|
xlint srcpkgs/dms/template
|
||||||
|
|
||||||
|
# install the built packages
|
||||||
|
sudo xbps-install --repository=hostdir/binpkgs dms dgop
|
||||||
|
```
|
||||||
|
|
||||||
|
`dms` requires Go ≥ 1.26 in the build environment (per `core/go.mod`).
|
||||||
|
|
||||||
|
## Running the shell
|
||||||
|
|
||||||
|
DMS is a user-level Wayland shell with **no system service** — start it from your
|
||||||
|
compositor's autostart, e.g. niri:
|
||||||
|
|
||||||
|
```kdl
|
||||||
|
spawn-at-startup "dms" "run"
|
||||||
|
```
|
||||||
|
|
||||||
|
or Hyprland: `exec-once = dms run`.
|
||||||
|
|
||||||
|
## Greeter (optional)
|
||||||
|
|
||||||
|
Install `dms-greeter`, then let the CLI do the setup:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dms greeter enable # configures greetd + the Void seat/PAM bits below
|
||||||
|
dms greeter sync # optional: share theming with the shell
|
||||||
|
```
|
||||||
|
|
||||||
|
`dms greeter enable` handles what logind does automatically on systemd: it points
|
||||||
|
greetd at the greeter, enables `seatd`, adds `_greeter` to the `_seatd`/`video`/
|
||||||
|
`input` groups, and adds `pam_rundir` to `/etc/pam.d/greetd` (so the post-login
|
||||||
|
session gets an `XDG_RUNTIME_DIR`). A Wayland compositor and a working DRM device
|
||||||
|
(`/dev/dri/card*`) are required and not pulled in automatically.
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
dms-greeter installed.
|
||||||
|
|
||||||
|
Configure and enable it with:
|
||||||
|
|
||||||
|
dms greeter enable
|
||||||
|
|
||||||
|
This points greetd at the greeter and sets up everything Void needs that logind
|
||||||
|
would handle on systemd: enables seatd, adds the greeter user to the seat/video/
|
||||||
|
input groups, and adds pam_rundir to the greetd PAM stack. Optionally sync your
|
||||||
|
shell theme into the greeter with:
|
||||||
|
|
||||||
|
dms greeter sync
|
||||||
|
|
||||||
|
Requirements not pulled in automatically: a Wayland compositor (niri, hyprland,
|
||||||
|
sway, …) and a working DRM device (/dev/dri/card*; in a VM, enable virtio-gpu).
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Template file for 'dms-greeter'
|
||||||
|
#
|
||||||
|
# greetd greeter for DankMaterialShell
|
||||||
|
# Builds from the same DMS release tarball as 'dms'; keep version/checksum in sync.
|
||||||
|
# Setup is done by `dms greeter enable`, not by this package — see distro/void/README.md.
|
||||||
|
pkgname=dms-greeter
|
||||||
|
version=1.4.6
|
||||||
|
revision=1
|
||||||
|
short_desc="DankMaterialShell greeter for greetd"
|
||||||
|
maintainer="AvengeMedia <AvengeMedia.US@gmail.com>"
|
||||||
|
license="MIT"
|
||||||
|
homepage="https://danklinux.com"
|
||||||
|
distfiles="https://github.com/AvengeMedia/DankMaterialShell/archive/refs/tags/v${version}.tar.gz"
|
||||||
|
checksum=f54601e522c883fa9cce02bec070e4321e47389a1cf453e7ad0bb7379ad91b61
|
||||||
|
|
||||||
|
depends="greetd quickshell acl-progs seatd pam_rundir"
|
||||||
|
|
||||||
|
# Cache dir the greeter uses as $HOME (owned by greetd's _greeter user).
|
||||||
|
make_dirs="/var/cache/dms-greeter 0750 _greeter _greeter"
|
||||||
|
|
||||||
|
do_install() {
|
||||||
|
# Launcher wrapper -> /usr/bin/dms-greeter
|
||||||
|
vbin quickshell/Modules/Greetd/assets/dms-greeter
|
||||||
|
|
||||||
|
# Same QML tree as the shell; greeter mode is selected at runtime via DMS_RUN_GREETER.
|
||||||
|
vmkdir usr/share/quickshell/dms-greeter
|
||||||
|
vcopy "quickshell/*" usr/share/quickshell/dms-greeter
|
||||||
|
|
||||||
|
# Sample compositor configs for reference
|
||||||
|
vinstall quickshell/Modules/Greetd/assets/dms-niri.kdl 644 usr/share/dms-greeter
|
||||||
|
vinstall quickshell/Modules/Greetd/assets/dms-hypr.conf 644 usr/share/dms-greeter
|
||||||
|
|
||||||
|
vdoc quickshell/Modules/Greetd/README.md
|
||||||
|
vlicense LICENSE
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# Template file for 'dms'
|
||||||
|
#
|
||||||
|
# DankMaterialShell stable release
|
||||||
|
#
|
||||||
|
# NOTE: the binary is built with the `distro_binary` build tag, which is the
|
||||||
|
# packaged variant upstream ships (it drops the in-app self-update command).
|
||||||
|
pkgname=dms
|
||||||
|
version=1.4.6
|
||||||
|
revision=1
|
||||||
|
build_style=go
|
||||||
|
build_wrksrc="core"
|
||||||
|
go_import_path="github.com/AvengeMedia/DankMaterialShell/core"
|
||||||
|
go_package="${go_import_path}/cmd/dms"
|
||||||
|
go_build_tags="distro_binary"
|
||||||
|
go_ldflags="-X main.Version=${version}"
|
||||||
|
short_desc="DankMaterialShell — Material 3 desktop shell for Wayland"
|
||||||
|
maintainer="AvengeMedia <AvengeMedia.US@gmail.com>"
|
||||||
|
license="MIT"
|
||||||
|
homepage="https://danklinux.com"
|
||||||
|
changelog="https://github.com/AvengeMedia/DankMaterialShell/releases"
|
||||||
|
distfiles="https://github.com/AvengeMedia/DankMaterialShell/archive/refs/tags/v${version}.tar.gz"
|
||||||
|
checksum=f54601e522c883fa9cce02bec070e4321e47389a1cf453e7ad0bb7379ad91b61
|
||||||
|
|
||||||
|
# Optional feature deps (XBPS has no "recommends") are listed in distro/void/README.md.
|
||||||
|
depends="quickshell accountsservice dgop matugen"
|
||||||
|
|
||||||
|
post_install() {
|
||||||
|
# QML shell tree (build_style=go already installed the dms binary)
|
||||||
|
vmkdir usr/share/quickshell/dms
|
||||||
|
vcopy "${wrksrc}/quickshell/*" usr/share/quickshell/dms
|
||||||
|
echo "${version}" > "${DESTDIR}/usr/share/quickshell/dms/VERSION"
|
||||||
|
|
||||||
|
# Desktop entry + icon
|
||||||
|
vinstall "${wrksrc}/assets/dms-open.desktop" 644 usr/share/applications
|
||||||
|
vinstall "${wrksrc}/assets/danklogo.svg" 644 usr/share/icons/hicolor/scalable/apps
|
||||||
|
|
||||||
|
# Shell completions (generated by the built binary; skip when cross-building)
|
||||||
|
vmkdir usr/share/bash-completion/completions
|
||||||
|
vmkdir usr/share/zsh/site-functions
|
||||||
|
vmkdir usr/share/fish/vendor_completions.d
|
||||||
|
if [ -z "$CROSS_BUILD" ]; then
|
||||||
|
"${DESTDIR}/usr/bin/dms" completion bash > "${DESTDIR}/usr/share/bash-completion/completions/dms"
|
||||||
|
"${DESTDIR}/usr/bin/dms" completion zsh > "${DESTDIR}/usr/share/zsh/site-functions/_dms"
|
||||||
|
"${DESTDIR}/usr/bin/dms" completion fish > "${DESTDIR}/usr/share/fish/vendor_completions.d/dms.fish"
|
||||||
|
fi
|
||||||
|
|
||||||
|
vlicense "${wrksrc}/LICENSE"
|
||||||
|
}
|
||||||
+21
-1
@@ -6,6 +6,18 @@ DankMaterialShell provides comprehensive IPC (Inter-Process Communication) funct
|
|||||||
dms ipc call <target> <function> [parameters...]
|
dms ipc call <target> <function> [parameters...]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Discovering IPC commands
|
||||||
|
|
||||||
|
List all available targets and functions while DMS is running:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dms ipc list
|
||||||
|
dms ipc # same
|
||||||
|
dms ipc --help # same, plus usage text
|
||||||
|
```
|
||||||
|
|
||||||
|
Live listing requires DMS to be running. If listing fails, use this document or the [Keybinds & IPC docs](https://danklinux.com/docs/dankmaterialshell/keybinds-ipc) as an offline reference.
|
||||||
|
|
||||||
## Target: `audio`
|
## Target: `audio`
|
||||||
|
|
||||||
Audio system control and information.
|
Audio system control and information.
|
||||||
@@ -707,7 +719,7 @@ File browser controls for selecting wallpapers and profile images.
|
|||||||
- Both browsers support common image formats (jpg, jpeg, png, bmp, gif, webp)
|
- Both browsers support common image formats (jpg, jpeg, png, bmp, gif, webp)
|
||||||
|
|
||||||
### Target: `color-picker`
|
### Target: `color-picker`
|
||||||
Color picker modal control.
|
In-shell color picker modal for theme and settings color selection.
|
||||||
|
|
||||||
**Functions:**
|
**Functions:**
|
||||||
- `open` - Show color picker modal
|
- `open` - Show color picker modal
|
||||||
@@ -718,6 +730,14 @@ Color picker modal control.
|
|||||||
- `toggle` - Toggle color picker modal visibility
|
- `toggle` - Toggle color picker modal visibility
|
||||||
- `toggleInstant` - Toggle color picker modal visibility without animation on hide
|
- `toggleInstant` - Toggle color picker modal visibility without animation on hide
|
||||||
|
|
||||||
|
**Note:** This controls the in-shell modal. To pick a pixel from the screen via CLI, use `dms color pick` instead (see [Color Picker CLI](https://danklinux.com/docs/dankmaterialshell/cli-color-picker)).
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```bash
|
||||||
|
dms ipc call color-picker toggle
|
||||||
|
dms ipc call color-picker openColor "#3f51b5"
|
||||||
|
```
|
||||||
|
|
||||||
### Target: `hypr`
|
### Target: `hypr`
|
||||||
Hyprland-specific controls including keybinds cheatsheet and workspace overview (Hyprland only).
|
Hyprland-specific controls including keybinds cheatsheet and workspace overview (Hyprland only).
|
||||||
|
|
||||||
|
|||||||
@@ -222,7 +222,7 @@
|
|||||||
with pkgs;
|
with pkgs;
|
||||||
[
|
[
|
||||||
(goForPkgs pkgs)
|
(goForPkgs pkgs)
|
||||||
go-mockery_2
|
go-mockery
|
||||||
gopls
|
gopls
|
||||||
delve
|
delve
|
||||||
go-tools
|
go-tools
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Item {
|
|||||||
|
|
||||||
required property var modalHandle
|
required property var modalHandle
|
||||||
required property string claimPrefix
|
required property string claimPrefix
|
||||||
|
property string surfaceKind: "modal"
|
||||||
property string screenName: ""
|
property string screenName: ""
|
||||||
property bool enabled: false
|
property bool enabled: false
|
||||||
property bool active: false
|
property bool active: false
|
||||||
@@ -14,112 +15,97 @@ Item {
|
|||||||
property bool dockBlocked: false
|
property bool dockBlocked: false
|
||||||
property string dockSide: ""
|
property string dockSide: ""
|
||||||
|
|
||||||
property string claimId: ""
|
property alias claimId: lease.claimId
|
||||||
property string claimedScreenName: ""
|
property alias claimedScreenName: lease.claimedScreenName
|
||||||
|
|
||||||
signal recoveryRequested
|
signal recoveryRequested
|
||||||
|
|
||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
function _nextClaimId() {
|
|
||||||
return claimPrefix + ":" + (new Date()).getTime() + ":" + Math.floor(Math.random() * 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _isCurrentModal(name) {
|
function _isCurrentModal(name) {
|
||||||
return !!name && ModalManager.isCurrentModal(modalHandle, name);
|
return !!name && ModalManager.isCurrentModal(modalHandle, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _shouldRecover() {
|
ConnectedSurfaceLease {
|
||||||
return active && enabled && _isCurrentModal(screenName);
|
id: lease
|
||||||
|
claimPrefix: root.claimPrefix
|
||||||
|
screenName: root.screenName
|
||||||
|
enabled: root.enabled
|
||||||
|
active: root.active
|
||||||
|
presented: root.presented
|
||||||
|
dockBlocked: root.dockBlocked
|
||||||
|
dockSide: root.dockSide
|
||||||
|
isCurrentOwner: function(name) {
|
||||||
|
return root._isCurrentModal(name);
|
||||||
}
|
}
|
||||||
|
hasOwner: function(name, ownerId) {
|
||||||
function _requestRecovery() {
|
return ConnectedModeState.hasModalOwner(name, ownerId);
|
||||||
if (_shouldRecover())
|
}
|
||||||
recoveryRequested();
|
statePresent: function(name, ownerId) {
|
||||||
|
return ConnectedModeState.hasModalOwner(name, ownerId) && ConnectedModeState.hasSurfaceDescriptor(name, root.surfaceKind, ownerId);
|
||||||
|
}
|
||||||
|
claimState: function(name, state, ownerId) {
|
||||||
|
return ConnectedModeState.claimModalState(name, state, ownerId);
|
||||||
|
}
|
||||||
|
ensureState: function(name, state, ownerId) {
|
||||||
|
return ConnectedModeState.ensureModalState(name, state, ownerId);
|
||||||
|
}
|
||||||
|
releaseState: function(name, ownerId) {
|
||||||
|
return ConnectedModeState.clearModalState(name, ownerId);
|
||||||
|
}
|
||||||
|
updateAnimationState: function(name, ownerId, animX, animY) {
|
||||||
|
return ConnectedModeState.setModalAnim(name, animX, animY, ownerId);
|
||||||
|
}
|
||||||
|
updateBodyState: function(name, ownerId, bodyX, bodyY, bodyW, bodyH) {
|
||||||
|
return ConnectedModeState.setModalBody(name, bodyX, bodyY, bodyW, bodyH, ownerId);
|
||||||
|
}
|
||||||
|
requestDockRetract: function(ownerId, name, side) {
|
||||||
|
return ConnectedModeState.requestDockRetract(ownerId, name, side);
|
||||||
|
}
|
||||||
|
releaseDockRetract: function(ownerId) {
|
||||||
|
return ConnectedModeState.releaseDockRetract(ownerId);
|
||||||
|
}
|
||||||
|
onRecoveryRequested: root.recoveryRequested()
|
||||||
}
|
}
|
||||||
|
|
||||||
function publish(state) {
|
function publish(state) {
|
||||||
if (!enabled || !screenName || !state) {
|
return lease.publish(Object.assign({}, state, {
|
||||||
release();
|
"kind": root.surfaceKind,
|
||||||
return false;
|
"screenName": root.screenName,
|
||||||
}
|
"presented": root.presented,
|
||||||
if (claimedScreenName && claimedScreenName !== screenName)
|
"dockRetractSide": root.dockBlocked ? root.dockSide : ""
|
||||||
release();
|
}), false);
|
||||||
|
|
||||||
const isCurrent = _isCurrentModal(screenName);
|
|
||||||
let isClaim = !claimId;
|
|
||||||
if (isClaim && !isCurrent)
|
|
||||||
return false;
|
|
||||||
if (isClaim)
|
|
||||||
claimId = _nextClaimId();
|
|
||||||
|
|
||||||
let published = isClaim ? ConnectedModeState.claimModalState(screenName, state, claimId) : ConnectedModeState.ensureModalState(screenName, state, claimId);
|
|
||||||
if (!published && !isClaim && isCurrent) {
|
|
||||||
ConnectedModeState.releaseDockRetract(claimId);
|
|
||||||
claimId = _nextClaimId();
|
|
||||||
published = ConnectedModeState.claimModalState(screenName, state, claimId);
|
|
||||||
}
|
|
||||||
if (!published)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
claimedScreenName = screenName;
|
|
||||||
if (dockBlocked && presented)
|
|
||||||
ConnectedModeState.requestDockRetract(claimId, screenName, dockSide);
|
|
||||||
else
|
|
||||||
ConnectedModeState.releaseDockRetract(claimId);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateAnim(animX, animY) {
|
function updateAnim(animX, animY) {
|
||||||
if (!enabled || !claimId || !claimedScreenName)
|
return lease.updateAnim(animX, animY);
|
||||||
return false;
|
|
||||||
if (!ConnectedModeState.hasModalOwner(claimedScreenName, claimId)) {
|
|
||||||
_requestRecovery();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return ConnectedModeState.setModalAnim(claimedScreenName, animX, animY, claimId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateBody(bodyX, bodyY, bodyW, bodyH) {
|
function updateBody(bodyX, bodyY, bodyW, bodyH) {
|
||||||
if (!enabled || !claimId || !claimedScreenName)
|
return lease.updateBody(bodyX, bodyY, bodyW, bodyH);
|
||||||
return false;
|
|
||||||
if (!ConnectedModeState.hasModalOwner(claimedScreenName, claimId)) {
|
|
||||||
_requestRecovery();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return ConnectedModeState.setModalBody(claimedScreenName, bodyX, bodyY, bodyW, bodyH, claimId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function release() {
|
function release() {
|
||||||
if (!claimId)
|
return lease.release();
|
||||||
return;
|
|
||||||
ConnectedModeState.releaseDockRetract(claimId);
|
|
||||||
const releasedClaimId = claimId;
|
|
||||||
const releasedScreenName = claimedScreenName;
|
|
||||||
claimId = "";
|
|
||||||
claimedScreenName = "";
|
|
||||||
if (releasedScreenName)
|
|
||||||
ConnectedModeState.clearModalState(releasedScreenName, releasedClaimId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onDestruction: release()
|
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: ModalManager
|
target: ModalManager
|
||||||
function onModalChanged() {
|
function onModalChanged() {
|
||||||
root._requestRecovery();
|
lease.requestRecovery();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: ConnectedModeState
|
target: ConnectedModeState
|
||||||
function onModalOwnersChanged() {
|
function onModalOwnersChanged() {
|
||||||
if (!ConnectedModeState.hasModalOwner(root.screenName, root.claimId))
|
lease.checkOwnershipRecovery();
|
||||||
root._requestRecovery();
|
|
||||||
}
|
}
|
||||||
function onModalStatesChanged() {
|
function onModalStatesChanged() {
|
||||||
if (!ConnectedModeState.modalStates[root.screenName])
|
lease.checkStateRecovery();
|
||||||
root._requestRecovery();
|
}
|
||||||
|
function onSurfaceDescriptorsChanged() {
|
||||||
|
lease.checkStateRecovery();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,123 @@ pragma ComponentBehavior: Bound
|
|||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
|
import "ConnectedSurfaceDescriptor.js" as SurfaceDescriptor
|
||||||
|
|
||||||
Singleton {
|
Singleton {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
|
property var surfaceDescriptors: ({})
|
||||||
|
|
||||||
|
function _surfaceSlot(kind) {
|
||||||
|
return SurfaceDescriptor.slotForKind(kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
function surfaceDescriptor(screenName, kind) {
|
||||||
|
const slot = _surfaceSlot(kind);
|
||||||
|
const screenDescriptors = screenName ? surfaceDescriptors[screenName] : null;
|
||||||
|
const descriptor = screenDescriptors && screenDescriptors[slot] ? screenDescriptors[slot] : SurfaceDescriptor.empty(kind, screenName);
|
||||||
|
let bodyRect = descriptor.bodyRect;
|
||||||
|
let animationOffset = descriptor.animationOffset;
|
||||||
|
if (slot === "popout" && popoutScreen === screenName) {
|
||||||
|
bodyRect = {
|
||||||
|
"x": popoutBodyX,
|
||||||
|
"y": popoutBodyY,
|
||||||
|
"width": popoutBodyW,
|
||||||
|
"height": popoutBodyH
|
||||||
|
};
|
||||||
|
animationOffset = {
|
||||||
|
"x": popoutAnimX,
|
||||||
|
"y": popoutAnimY
|
||||||
|
};
|
||||||
|
} else if (slot === "modal" && modalStates[screenName]) {
|
||||||
|
const modal = modalStates[screenName];
|
||||||
|
bodyRect = {
|
||||||
|
"x": modal.bodyX,
|
||||||
|
"y": modal.bodyY,
|
||||||
|
"width": modal.bodyW,
|
||||||
|
"height": modal.bodyH
|
||||||
|
};
|
||||||
|
animationOffset = {
|
||||||
|
"x": modal.animX,
|
||||||
|
"y": modal.animY
|
||||||
|
};
|
||||||
|
} else if (slot === "dock" && dockStates[screenName]) {
|
||||||
|
const dock = dockStates[screenName];
|
||||||
|
const slide = dockSlides[screenName] || {
|
||||||
|
"x": dock.slideX,
|
||||||
|
"y": dock.slideY
|
||||||
|
};
|
||||||
|
bodyRect = {
|
||||||
|
"x": dock.bodyX,
|
||||||
|
"y": dock.bodyY,
|
||||||
|
"width": dock.bodyW,
|
||||||
|
"height": dock.bodyH
|
||||||
|
};
|
||||||
|
animationOffset = {
|
||||||
|
"x": slide.x,
|
||||||
|
"y": slide.y
|
||||||
|
};
|
||||||
|
} else if (slot === "notification" && notificationStates[screenName]) {
|
||||||
|
const notification = notificationStates[screenName];
|
||||||
|
bodyRect = {
|
||||||
|
"x": notification.bodyX,
|
||||||
|
"y": notification.bodyY,
|
||||||
|
"width": notification.bodyW,
|
||||||
|
"height": notification.bodyH
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return SurfaceDescriptor.normalize({
|
||||||
|
"bodyRect": bodyRect,
|
||||||
|
"animationOffset": animationOffset
|
||||||
|
}, descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasSurfaceDescriptor(screenName, kind, ownerId) {
|
||||||
|
const descriptor = surfaceDescriptor(screenName, kind);
|
||||||
|
return descriptor.phase !== "hidden" && (!ownerId || descriptor.ownerId === ownerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _setSurfaceDescriptor(screenName, slotKind, state, ownerId) {
|
||||||
|
if (!screenName || !state)
|
||||||
|
return false;
|
||||||
|
const slot = _surfaceSlot(slotKind);
|
||||||
|
const currentScreen = surfaceDescriptors[screenName] || {};
|
||||||
|
const previous = currentScreen[slot] || SurfaceDescriptor.empty(state.kind || slotKind, screenName);
|
||||||
|
let normalized = SurfaceDescriptor.normalize(Object.assign({}, state, {
|
||||||
|
"ownerId": ownerId !== undefined ? ownerId : previous.ownerId,
|
||||||
|
"screenName": screenName,
|
||||||
|
"revision": previous.revision
|
||||||
|
}), previous);
|
||||||
|
if (SurfaceDescriptor.same(previous, normalized))
|
||||||
|
return true;
|
||||||
|
normalized = SurfaceDescriptor.withRevision(normalized, previous.revision + 1);
|
||||||
|
const nextScreen = _cloneDict(currentScreen);
|
||||||
|
nextScreen[slot] = normalized;
|
||||||
|
const next = _cloneDict(surfaceDescriptors);
|
||||||
|
next[screenName] = nextScreen;
|
||||||
|
surfaceDescriptors = next;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _clearSurfaceDescriptor(screenName, kind, ownerId) {
|
||||||
|
if (!screenName)
|
||||||
|
return false;
|
||||||
|
const slot = _surfaceSlot(kind);
|
||||||
|
const currentScreen = surfaceDescriptors[screenName];
|
||||||
|
const current = currentScreen ? currentScreen[slot] : null;
|
||||||
|
if (!current || (ownerId && current.ownerId !== ownerId))
|
||||||
|
return false;
|
||||||
|
const nextScreen = _cloneDict(currentScreen);
|
||||||
|
delete nextScreen[slot];
|
||||||
|
const next = _cloneDict(surfaceDescriptors);
|
||||||
|
if (Object.keys(nextScreen).length > 0)
|
||||||
|
next[screenName] = nextScreen;
|
||||||
|
else
|
||||||
|
delete next[screenName];
|
||||||
|
surfaceDescriptors = next;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
readonly property var emptyDockState: ({
|
readonly property var emptyDockState: ({
|
||||||
"reveal": false,
|
"reveal": false,
|
||||||
"barSide": "bottom",
|
"barSide": "bottom",
|
||||||
@@ -18,7 +131,6 @@ Singleton {
|
|||||||
"slideY": 0
|
"slideY": 0
|
||||||
})
|
})
|
||||||
|
|
||||||
// Popout state (updated by DankPopout when connectedFrameModeActive)
|
|
||||||
property string popoutOwnerId: ""
|
property string popoutOwnerId: ""
|
||||||
property bool popoutVisible: false
|
property bool popoutVisible: false
|
||||||
property string popoutBarSide: "top"
|
property string popoutBarSide: "top"
|
||||||
@@ -32,14 +144,10 @@ Singleton {
|
|||||||
property bool popoutOmitStartConnector: false
|
property bool popoutOmitStartConnector: false
|
||||||
property bool popoutOmitEndConnector: false
|
property bool popoutOmitEndConnector: false
|
||||||
|
|
||||||
// Dock state (updated by Dock when connectedFrameModeActive), keyed by screen.name
|
|
||||||
property var dockStates: ({})
|
property var dockStates: ({})
|
||||||
|
|
||||||
// Dock slide offsets — hot-path updates separated from full geometry state
|
|
||||||
property var dockSlides: ({})
|
property var dockSlides: ({})
|
||||||
|
|
||||||
// Surfaces are keyed by screen.name. FrameWindow watches to refresh connected chrome
|
|
||||||
// after claim/release boundaries without tracking each animation frame
|
|
||||||
property var surfaceRevisions: ({})
|
property var surfaceRevisions: ({})
|
||||||
|
|
||||||
function _cloneDict(src) {
|
function _cloneDict(src) {
|
||||||
@@ -69,8 +177,10 @@ Singleton {
|
|||||||
popoutOwnerId = claimId;
|
popoutOwnerId = claimId;
|
||||||
const ok = updatePopout(claimId, state);
|
const ok = updatePopout(claimId, state);
|
||||||
if (ok) {
|
if (ok) {
|
||||||
if (previousScreen && previousScreen !== popoutScreen)
|
if (previousScreen && previousScreen !== popoutScreen) {
|
||||||
|
_clearSurfaceDescriptor(previousScreen, "popout");
|
||||||
_bumpSurfaceRevision(previousScreen);
|
_bumpSurfaceRevision(previousScreen);
|
||||||
|
}
|
||||||
_bumpSurfaceRevision(popoutScreen);
|
_bumpSurfaceRevision(popoutScreen);
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
@@ -103,6 +213,21 @@ Singleton {
|
|||||||
if (state.omitEndConnector !== undefined)
|
if (state.omitEndConnector !== undefined)
|
||||||
popoutOmitEndConnector = !!state.omitEndConnector;
|
popoutOmitEndConnector = !!state.omitEndConnector;
|
||||||
|
|
||||||
|
_setSurfaceDescriptor(popoutScreen, "popout", Object.assign({}, state, {
|
||||||
|
"kind": "popout",
|
||||||
|
"screenName": popoutScreen,
|
||||||
|
"visible": popoutVisible,
|
||||||
|
"presented": state.presented !== undefined ? !!state.presented : popoutVisible,
|
||||||
|
"barSide": popoutBarSide,
|
||||||
|
"bodyX": popoutBodyX,
|
||||||
|
"bodyY": popoutBodyY,
|
||||||
|
"bodyW": popoutBodyW,
|
||||||
|
"bodyH": popoutBodyH,
|
||||||
|
"animX": popoutAnimX,
|
||||||
|
"animY": popoutAnimY,
|
||||||
|
"omitStartConnector": popoutOmitStartConnector,
|
||||||
|
"omitEndConnector": popoutOmitEndConnector
|
||||||
|
}), claimId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,6 +248,7 @@ Singleton {
|
|||||||
popoutScreen = "";
|
popoutScreen = "";
|
||||||
popoutOmitStartConnector = false;
|
popoutOmitStartConnector = false;
|
||||||
popoutOmitEndConnector = false;
|
popoutOmitEndConnector = false;
|
||||||
|
_clearSurfaceDescriptor(releasedScreen, "popout", claimId);
|
||||||
_bumpSurfaceRevision(releasedScreen);
|
_bumpSurfaceRevision(releasedScreen);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -193,13 +319,21 @@ Singleton {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
const normalized = _normalizeDockState(state);
|
const normalized = _normalizeDockState(state);
|
||||||
if (_sameDockState(dockStates[screenName], normalized))
|
const descriptorState = Object.assign({}, state, normalized, {
|
||||||
return true;
|
"kind": "dock",
|
||||||
|
"screenName": screenName,
|
||||||
|
"visible": normalized.reveal,
|
||||||
|
"presented": normalized.reveal,
|
||||||
|
"phase": normalized.reveal ? (state.phase || "open") : "hidden"
|
||||||
|
});
|
||||||
const previous = dockStates[screenName] || emptyDockState;
|
const previous = dockStates[screenName] || emptyDockState;
|
||||||
|
const stateChanged = !_sameDockState(dockStates[screenName], normalized);
|
||||||
|
if (stateChanged) {
|
||||||
const next = _cloneDict(dockStates);
|
const next = _cloneDict(dockStates);
|
||||||
next[screenName] = normalized;
|
next[screenName] = normalized;
|
||||||
dockStates = next;
|
dockStates = next;
|
||||||
|
}
|
||||||
|
_setSurfaceDescriptor(screenName, "dock", descriptorState, "dock:" + screenName);
|
||||||
if (!!previous.reveal !== !!normalized.reveal)
|
if (!!previous.reveal !== !!normalized.reveal)
|
||||||
_bumpSurfaceRevision(screenName);
|
_bumpSurfaceRevision(screenName);
|
||||||
return true;
|
return true;
|
||||||
@@ -212,8 +346,8 @@ Singleton {
|
|||||||
const next = _cloneDict(dockStates);
|
const next = _cloneDict(dockStates);
|
||||||
delete next[screenName];
|
delete next[screenName];
|
||||||
dockStates = next;
|
dockStates = next;
|
||||||
|
_clearSurfaceDescriptor(screenName, "dock");
|
||||||
|
|
||||||
// Also clear corresponding slide
|
|
||||||
if (dockSlides[screenName]) {
|
if (dockSlides[screenName]) {
|
||||||
const nextSlides = _cloneDict(dockSlides);
|
const nextSlides = _cloneDict(dockSlides);
|
||||||
delete nextSlides[screenName];
|
delete nextSlides[screenName];
|
||||||
@@ -283,13 +417,20 @@ Singleton {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
const normalized = _normalizeNotificationState(state);
|
const normalized = _normalizeNotificationState(state);
|
||||||
if (_sameNotificationState(notificationStates[screenName], normalized))
|
const descriptorState = Object.assign({}, state, normalized, {
|
||||||
return true;
|
"kind": "notification",
|
||||||
|
"screenName": screenName,
|
||||||
|
"presented": normalized.visible,
|
||||||
|
"phase": normalized.visible ? (state.phase || "open") : "hidden"
|
||||||
|
});
|
||||||
const previous = notificationStates[screenName] || emptyNotificationState;
|
const previous = notificationStates[screenName] || emptyNotificationState;
|
||||||
|
const stateChanged = !_sameNotificationState(notificationStates[screenName], normalized);
|
||||||
|
if (stateChanged) {
|
||||||
const next = _cloneDict(notificationStates);
|
const next = _cloneDict(notificationStates);
|
||||||
next[screenName] = normalized;
|
next[screenName] = normalized;
|
||||||
notificationStates = next;
|
notificationStates = next;
|
||||||
|
}
|
||||||
|
_setSurfaceDescriptor(screenName, "notification", descriptorState, "notification:" + screenName);
|
||||||
if (!!previous.visible !== !!normalized.visible)
|
if (!!previous.visible !== !!normalized.visible)
|
||||||
_bumpSurfaceRevision(screenName);
|
_bumpSurfaceRevision(screenName);
|
||||||
return true;
|
return true;
|
||||||
@@ -302,11 +443,11 @@ Singleton {
|
|||||||
const next = _cloneDict(notificationStates);
|
const next = _cloneDict(notificationStates);
|
||||||
delete next[screenName];
|
delete next[screenName];
|
||||||
notificationStates = next;
|
notificationStates = next;
|
||||||
|
_clearSurfaceDescriptor(screenName, "notification");
|
||||||
_bumpSurfaceRevision(screenName);
|
_bumpSurfaceRevision(screenName);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// DankModal / DankLauncherV2Modal State
|
|
||||||
readonly property var emptyModalState: ({
|
readonly property var emptyModalState: ({
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"barSide": "bottom",
|
"barSide": "bottom",
|
||||||
@@ -362,6 +503,10 @@ Singleton {
|
|||||||
const next = _cloneDict(modalStates);
|
const next = _cloneDict(modalStates);
|
||||||
next[screenName] = normalized;
|
next[screenName] = normalized;
|
||||||
modalStates = next;
|
modalStates = next;
|
||||||
|
_setSurfaceDescriptor(screenName, "modal", Object.assign({}, state, normalized, {
|
||||||
|
"kind": state.kind || "modal",
|
||||||
|
"screenName": screenName
|
||||||
|
}), ownerId || "");
|
||||||
_bumpSurfaceRevision(screenName);
|
_bumpSurfaceRevision(screenName);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -372,11 +517,16 @@ Singleton {
|
|||||||
if (ownerId && modalOwners[screenName] !== ownerId)
|
if (ownerId && modalOwners[screenName] !== ownerId)
|
||||||
return false;
|
return false;
|
||||||
const normalized = _normalizeModalState(state);
|
const normalized = _normalizeModalState(state);
|
||||||
if (_sameModalState(modalStates[screenName], normalized))
|
const descriptorState = Object.assign({}, state, normalized, {
|
||||||
return true;
|
"kind": state.kind || (surfaceDescriptor(screenName, "modal").kind || "modal"),
|
||||||
|
"screenName": screenName
|
||||||
|
});
|
||||||
|
if (!_sameModalState(modalStates[screenName], normalized)) {
|
||||||
const next = _cloneDict(modalStates);
|
const next = _cloneDict(modalStates);
|
||||||
next[screenName] = normalized;
|
next[screenName] = normalized;
|
||||||
modalStates = next;
|
modalStates = next;
|
||||||
|
}
|
||||||
|
_setSurfaceDescriptor(screenName, "modal", descriptorState, ownerId || modalOwners[screenName] || "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,10 +545,6 @@ Singleton {
|
|||||||
return updateModalState(screenName, state, ownerId);
|
return updateModalState(screenName, state, ownerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setModalState(screenName, state) {
|
|
||||||
return updateModalState(screenName, state, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearModalState(screenName, ownerId) {
|
function clearModalState(screenName, ownerId) {
|
||||||
if (!screenName)
|
if (!screenName)
|
||||||
return false;
|
return false;
|
||||||
@@ -418,6 +564,7 @@ Singleton {
|
|||||||
delete nextOwners[screenName];
|
delete nextOwners[screenName];
|
||||||
modalOwners = nextOwners;
|
modalOwners = nextOwners;
|
||||||
}
|
}
|
||||||
|
_clearSurfaceDescriptor(screenName, "modal", ownerId);
|
||||||
_bumpSurfaceRevision(screenName);
|
_bumpSurfaceRevision(screenName);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -501,9 +648,6 @@ Singleton {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prune state for screens that are no longer connected. Stale entries
|
|
||||||
// accumulate across hotplug cycles otherwise — Frame's per-screen
|
|
||||||
// FrameInstance doesn't notice when its peer dicts go orphan.
|
|
||||||
function _pruneToLiveScreens() {
|
function _pruneToLiveScreens() {
|
||||||
const live = {};
|
const live = {};
|
||||||
const screens = Quickshell.screens || [];
|
const screens = Quickshell.screens || [];
|
||||||
@@ -543,6 +687,9 @@ Singleton {
|
|||||||
const nextSurfaceRevisions = pruneKeyed(surfaceRevisions);
|
const nextSurfaceRevisions = pruneKeyed(surfaceRevisions);
|
||||||
if (nextSurfaceRevisions !== null)
|
if (nextSurfaceRevisions !== null)
|
||||||
surfaceRevisions = nextSurfaceRevisions;
|
surfaceRevisions = nextSurfaceRevisions;
|
||||||
|
const nextDescriptors = pruneKeyed(surfaceDescriptors);
|
||||||
|
if (nextDescriptors !== null)
|
||||||
|
surfaceDescriptors = nextDescriptors;
|
||||||
|
|
||||||
let retractChanged = false;
|
let retractChanged = false;
|
||||||
const nextRetract = {};
|
const nextRetract = {};
|
||||||
|
|||||||
@@ -0,0 +1,159 @@
|
|||||||
|
.pragma library
|
||||||
|
|
||||||
|
var VALID_KINDS = {
|
||||||
|
"popout": true,
|
||||||
|
"modal": true,
|
||||||
|
"launcher": true,
|
||||||
|
"dock": true,
|
||||||
|
"notification": true
|
||||||
|
};
|
||||||
|
|
||||||
|
var VALID_PHASES = {
|
||||||
|
"opening": true,
|
||||||
|
"open": true,
|
||||||
|
"closing": true,
|
||||||
|
"hidden": true,
|
||||||
|
"recovering": true
|
||||||
|
};
|
||||||
|
|
||||||
|
function _number(value, fallback) {
|
||||||
|
var n = Number(value);
|
||||||
|
return isNaN(n) ? fallback : n;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _bool(value, fallback) {
|
||||||
|
return value === undefined ? fallback : !!value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _kind(value, fallback) {
|
||||||
|
if (VALID_KINDS[value])
|
||||||
|
return value;
|
||||||
|
return VALID_KINDS[fallback] ? fallback : "modal";
|
||||||
|
}
|
||||||
|
|
||||||
|
function _defaultBarSide(kind) {
|
||||||
|
return kind === "popout" || kind === "notification" ? "top" : "bottom";
|
||||||
|
}
|
||||||
|
|
||||||
|
function _barSide(value, fallback) {
|
||||||
|
if (value === "top" || value === "bottom" || value === "left" || value === "right")
|
||||||
|
return value;
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
function slotForKind(kind) {
|
||||||
|
return kind === "launcher" ? "modal" : _kind(kind, "modal");
|
||||||
|
}
|
||||||
|
|
||||||
|
function inferPhase(visible, presented, requestedPhase) {
|
||||||
|
if (VALID_PHASES[requestedPhase])
|
||||||
|
return requestedPhase;
|
||||||
|
if (!visible && !presented)
|
||||||
|
return "hidden";
|
||||||
|
if (!visible && presented)
|
||||||
|
return "closing";
|
||||||
|
return "open";
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalize(input, defaults) {
|
||||||
|
var source = input || {};
|
||||||
|
var base = defaults || {};
|
||||||
|
var kind = _kind(source.kind, base.kind);
|
||||||
|
var defaultSide = _defaultBarSide(kind);
|
||||||
|
var sourceRect = source.bodyRect || {};
|
||||||
|
var baseRect = base.bodyRect || {};
|
||||||
|
var sourceOffset = source.animationOffset || {};
|
||||||
|
var baseOffset = base.animationOffset || {};
|
||||||
|
var visible = _bool(source.visible !== undefined ? source.visible : source.reveal, _bool(base.visible !== undefined ? base.visible : base.reveal, false));
|
||||||
|
var presented = _bool(source.presented, _bool(base.presented, visible));
|
||||||
|
var bodyRect = {
|
||||||
|
"x": _number(sourceRect.x !== undefined ? sourceRect.x : source.bodyX, _number(baseRect.x !== undefined ? baseRect.x : base.bodyX, 0)),
|
||||||
|
"y": _number(sourceRect.y !== undefined ? sourceRect.y : source.bodyY, _number(baseRect.y !== undefined ? baseRect.y : base.bodyY, 0)),
|
||||||
|
"width": Math.max(0, _number(sourceRect.width !== undefined ? sourceRect.width : source.bodyW, _number(baseRect.width !== undefined ? baseRect.width : base.bodyW, 0))),
|
||||||
|
"height": Math.max(0, _number(sourceRect.height !== undefined ? sourceRect.height : source.bodyH, _number(baseRect.height !== undefined ? baseRect.height : base.bodyH, 0)))
|
||||||
|
};
|
||||||
|
var animationOffset = {
|
||||||
|
"x": _number(sourceOffset.x !== undefined ? sourceOffset.x : (source.animX !== undefined ? source.animX : source.slideX), _number(baseOffset.x !== undefined ? baseOffset.x : (base.animX !== undefined ? base.animX : base.slideX), 0)),
|
||||||
|
"y": _number(sourceOffset.y !== undefined ? sourceOffset.y : (source.animY !== undefined ? source.animY : source.slideY), _number(baseOffset.y !== undefined ? baseOffset.y : (base.animY !== undefined ? base.animY : base.slideY), 0))
|
||||||
|
};
|
||||||
|
var screenName = source.screenName !== undefined ? source.screenName : (source.screen !== undefined ? source.screen : (base.screenName !== undefined ? base.screenName : base.screen));
|
||||||
|
var opacity = Math.max(0, Math.min(1, _number(source.opacity, _number(base.opacity, 1))));
|
||||||
|
|
||||||
|
return {
|
||||||
|
"ownerId": String(source.ownerId !== undefined ? source.ownerId : (base.ownerId || "")),
|
||||||
|
"kind": kind,
|
||||||
|
"screenName": String(screenName || ""),
|
||||||
|
"phase": inferPhase(visible, presented, source.phase !== undefined ? source.phase : base.phase),
|
||||||
|
"visible": visible,
|
||||||
|
"presented": presented,
|
||||||
|
"barSide": _barSide(source.barSide, _barSide(base.barSide, defaultSide)),
|
||||||
|
"bodyRect": bodyRect,
|
||||||
|
"animationOffset": animationOffset,
|
||||||
|
"scale": Math.max(0, _number(source.scale, _number(base.scale, 1))),
|
||||||
|
"opacity": opacity,
|
||||||
|
"omitStartConnector": _bool(source.omitStartConnector, _bool(base.omitStartConnector, false)),
|
||||||
|
"omitEndConnector": _bool(source.omitEndConnector, _bool(base.omitEndConnector, false)),
|
||||||
|
"dockRetractSide": String(source.dockRetractSide !== undefined ? source.dockRetractSide : (base.dockRetractSide || "")),
|
||||||
|
"revision": Math.max(0, Math.floor(_number(source.revision, _number(base.revision, 0))))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function empty(kind, screenName) {
|
||||||
|
return normalize({
|
||||||
|
"kind": kind,
|
||||||
|
"screenName": screenName || "",
|
||||||
|
"phase": "hidden",
|
||||||
|
"visible": false,
|
||||||
|
"presented": false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function withRevision(descriptor, revision) {
|
||||||
|
var next = normalize(descriptor);
|
||||||
|
next.revision = Math.max(0, Math.floor(_number(revision, next.revision)));
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
function withAnimationOffset(descriptor, x, y) {
|
||||||
|
var next = normalize(descriptor);
|
||||||
|
next.animationOffset = {
|
||||||
|
"x": x === undefined ? next.animationOffset.x : _number(x, next.animationOffset.x),
|
||||||
|
"y": y === undefined ? next.animationOffset.y : _number(y, next.animationOffset.y)
|
||||||
|
};
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
function withBodyRect(descriptor, x, y, width, height) {
|
||||||
|
var next = normalize(descriptor);
|
||||||
|
next.bodyRect = {
|
||||||
|
"x": x === undefined ? next.bodyRect.x : _number(x, next.bodyRect.x),
|
||||||
|
"y": y === undefined ? next.bodyRect.y : _number(y, next.bodyRect.y),
|
||||||
|
"width": width === undefined ? next.bodyRect.width : Math.max(0, _number(width, next.bodyRect.width)),
|
||||||
|
"height": height === undefined ? next.bodyRect.height : Math.max(0, _number(height, next.bodyRect.height))
|
||||||
|
};
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
function same(a, b, threshold) {
|
||||||
|
if (!a || !b)
|
||||||
|
return false;
|
||||||
|
var epsilon = threshold === undefined ? 0.5 : Math.max(0, Number(threshold));
|
||||||
|
return a.ownerId === b.ownerId
|
||||||
|
&& a.kind === b.kind
|
||||||
|
&& a.screenName === b.screenName
|
||||||
|
&& a.phase === b.phase
|
||||||
|
&& a.visible === b.visible
|
||||||
|
&& a.presented === b.presented
|
||||||
|
&& a.barSide === b.barSide
|
||||||
|
&& Math.abs(a.bodyRect.x - b.bodyRect.x) < epsilon
|
||||||
|
&& Math.abs(a.bodyRect.y - b.bodyRect.y) < epsilon
|
||||||
|
&& Math.abs(a.bodyRect.width - b.bodyRect.width) < epsilon
|
||||||
|
&& Math.abs(a.bodyRect.height - b.bodyRect.height) < epsilon
|
||||||
|
&& Math.abs(a.animationOffset.x - b.animationOffset.x) < epsilon
|
||||||
|
&& Math.abs(a.animationOffset.y - b.animationOffset.y) < epsilon
|
||||||
|
&& Math.abs(a.scale - b.scale) < 0.0001
|
||||||
|
&& Math.abs(a.opacity - b.opacity) < 0.0001
|
||||||
|
&& a.omitStartConnector === b.omitStartConnector
|
||||||
|
&& a.omitEndConnector === b.omitEndConnector
|
||||||
|
&& a.dockRetractSide === b.dockRetractSide;
|
||||||
|
}
|
||||||
@@ -0,0 +1,232 @@
|
|||||||
|
.pragma library
|
||||||
|
|
||||||
|
function _number(value, fallback) {
|
||||||
|
var n = Number(value);
|
||||||
|
return isNaN(n) ? fallback : n;
|
||||||
|
}
|
||||||
|
|
||||||
|
function snap(value, dpr) {
|
||||||
|
var scale = dpr || 1;
|
||||||
|
return Math.round(_number(value, 0) * scale) / scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isHorizontal(side) {
|
||||||
|
return side === "top" || side === "bottom";
|
||||||
|
}
|
||||||
|
|
||||||
|
function isVertical(side) {
|
||||||
|
return side === "left" || side === "right";
|
||||||
|
}
|
||||||
|
|
||||||
|
function bodyRect(descriptor, dpr) {
|
||||||
|
var source = descriptor && descriptor.bodyRect ? descriptor.bodyRect : descriptor || {};
|
||||||
|
return {
|
||||||
|
"x": snap(source.x !== undefined ? source.x : source.bodyX, dpr),
|
||||||
|
"y": snap(source.y !== undefined ? source.y : source.bodyY, dpr),
|
||||||
|
"width": Math.max(0, snap(source.width !== undefined ? source.width : source.bodyW, dpr)),
|
||||||
|
"height": Math.max(0, snap(source.height !== undefined ? source.height : source.bodyH, dpr))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function animatedBodyRect(descriptor, dpr) {
|
||||||
|
var rect = bodyRect(descriptor, dpr);
|
||||||
|
var offset = descriptor && descriptor.animationOffset ? descriptor.animationOffset : descriptor || {};
|
||||||
|
var side = descriptor && descriptor.barSide ? descriptor.barSide : "bottom";
|
||||||
|
var dx = isVertical(side) ? Math.max(-rect.width, Math.min(_number(offset.x !== undefined ? offset.x : offset.animX, 0), rect.width)) : 0;
|
||||||
|
var dy = isHorizontal(side) ? Math.max(-rect.height, Math.min(_number(offset.y !== undefined ? offset.y : offset.animY, 0), rect.height)) : 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
"x": snap(rect.x + (side === "right" ? dx : 0), dpr),
|
||||||
|
"y": snap(rect.y + (side === "bottom" ? dy : 0), dpr),
|
||||||
|
"width": Math.max(0, snap(rect.width - Math.abs(dx), dpr)),
|
||||||
|
"height": Math.max(0, snap(rect.height - Math.abs(dy), dpr)),
|
||||||
|
"dx": snap(dx, dpr),
|
||||||
|
"dy": snap(dy, dpr)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function translatedBodyRect(descriptor, dpr) {
|
||||||
|
var rect = bodyRect(descriptor, dpr);
|
||||||
|
var offset = descriptor && descriptor.animationOffset ? descriptor.animationOffset : {};
|
||||||
|
return {
|
||||||
|
"x": snap(rect.x + _number(offset.x, 0), dpr),
|
||||||
|
"y": snap(rect.y + _number(offset.y, 0), dpr),
|
||||||
|
"width": rect.width,
|
||||||
|
"height": rect.height
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectorRadii(descriptor, rect, connectedRadius, surfaceRadius, dpr, nearIncludesSurface) {
|
||||||
|
var side = descriptor && descriptor.barSide ? descriptor.barSide : "bottom";
|
||||||
|
var horizontal = isHorizontal(side);
|
||||||
|
var extent = horizontal ? rect.height : rect.width;
|
||||||
|
var crossSize = horizontal ? rect.width : rect.height;
|
||||||
|
var nearLimit = nearIncludesSurface ? Math.min(connectedRadius, surfaceRadius, extent, crossSize / 2) : Math.min(connectedRadius, extent, crossSize / 2);
|
||||||
|
var farLimit = Math.min(connectedRadius, surfaceRadius, crossSize / 2);
|
||||||
|
var near = snap(Math.max(0, nearLimit), dpr);
|
||||||
|
var far = snap(Math.max(0, farLimit), dpr);
|
||||||
|
var omitStart = !!(descriptor && descriptor.omitStartConnector);
|
||||||
|
var omitEnd = !!(descriptor && descriptor.omitEndConnector);
|
||||||
|
return {
|
||||||
|
"near": near,
|
||||||
|
"far": far,
|
||||||
|
"start": omitStart ? 0 : near,
|
||||||
|
"end": omitEnd ? 0 : near,
|
||||||
|
"farStart": omitStart ? far : 0,
|
||||||
|
"farEnd": omitEnd ? far : 0,
|
||||||
|
"farExtent": Math.max(omitStart ? far : 0, omitEnd ? far : 0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function _connectorWidth(side, spacing, radius) {
|
||||||
|
return isVertical(side) ? spacing + radius : radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _connectorHeight(side, spacing, radius) {
|
||||||
|
return isVertical(side) ? radius : spacing + radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectorRect(side, rect, placement, spacing, radius, dpr) {
|
||||||
|
var width = _connectorWidth(side, spacing, radius);
|
||||||
|
var height = _connectorHeight(side, spacing, radius);
|
||||||
|
var seamX = isVertical(side) ? (side === "left" ? rect.x : rect.x + rect.width) : (placement === "left" ? rect.x : rect.x + rect.width);
|
||||||
|
var seamY = side === "top" ? rect.y : (side === "bottom" ? rect.y + rect.height : (placement === "left" ? rect.y : rect.y + rect.height));
|
||||||
|
var x = isVertical(side) ? (side === "left" ? seamX : seamX - width) : (placement === "left" ? seamX - width : seamX);
|
||||||
|
var y = side === "top" ? seamY : (side === "bottom" ? seamY - height : (placement === "left" ? seamY - height : seamY));
|
||||||
|
return {
|
||||||
|
"x": snap(x, dpr),
|
||||||
|
"y": snap(y, dpr),
|
||||||
|
"width": Math.max(0, snap(width, dpr)),
|
||||||
|
"height": Math.max(0, snap(height, dpr))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function farConnectorRect(side, rect, placement, radius, dpr) {
|
||||||
|
var x;
|
||||||
|
var y;
|
||||||
|
if (isHorizontal(side)) {
|
||||||
|
x = placement === "left" ? rect.x : rect.x + rect.width - radius;
|
||||||
|
y = side === "top" ? rect.y + rect.height : rect.y - radius;
|
||||||
|
} else {
|
||||||
|
x = side === "left" ? rect.x + rect.width : rect.x - radius;
|
||||||
|
y = placement === "left" ? rect.y : rect.y + rect.height - radius;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
"x": snap(x, dpr),
|
||||||
|
"y": snap(y, dpr),
|
||||||
|
"width": Math.max(0, snap(radius, dpr)),
|
||||||
|
"height": Math.max(0, snap(radius, dpr))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function farBodyCapRect(side, rect, placement, radius, dpr) {
|
||||||
|
var x;
|
||||||
|
var y;
|
||||||
|
if (isHorizontal(side)) {
|
||||||
|
x = placement === "left" ? rect.x : rect.x + rect.width - radius;
|
||||||
|
y = side === "top" ? rect.y + rect.height - radius : rect.y;
|
||||||
|
} else {
|
||||||
|
x = side === "left" ? rect.x + rect.width - radius : rect.x;
|
||||||
|
y = placement === "left" ? rect.y : rect.y + rect.height - radius;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
"x": snap(x, dpr),
|
||||||
|
"y": snap(y, dpr),
|
||||||
|
"width": Math.max(0, snap(radius, dpr)),
|
||||||
|
"height": Math.max(0, snap(radius, dpr))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function chromeBounds(rect, side, startRadius, endRadius, farExtent, dpr) {
|
||||||
|
var horizontal = isHorizontal(side);
|
||||||
|
var bodyOffsetX = horizontal ? startRadius : (side === "right" ? farExtent : 0);
|
||||||
|
var bodyOffsetY = horizontal ? (side === "bottom" ? farExtent : 0) : startRadius;
|
||||||
|
return {
|
||||||
|
"x": snap(rect.x - bodyOffsetX, dpr),
|
||||||
|
"y": snap(rect.y - bodyOffsetY, dpr),
|
||||||
|
"width": Math.max(0, snap(horizontal ? rect.width + startRadius + endRadius : rect.width + farExtent, dpr)),
|
||||||
|
"height": Math.max(0, snap(horizontal ? rect.height + farExtent : rect.height + startRadius + endRadius, dpr)),
|
||||||
|
"bodyOffsetX": snap(bodyOffsetX, dpr),
|
||||||
|
"bodyOffsetY": snap(bodyOffsetY, dpr)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function fillBounds(rect, side, seamOverlap, dpr) {
|
||||||
|
var overlapX = isHorizontal(side) ? seamOverlap : 0;
|
||||||
|
var overlapY = isVertical(side) ? seamOverlap : 0;
|
||||||
|
return {
|
||||||
|
"x": snap(rect.x - overlapX, dpr),
|
||||||
|
"y": snap(rect.y - overlapY, dpr),
|
||||||
|
"width": Math.max(0, snap(rect.width + overlapX * 2, dpr)),
|
||||||
|
"height": Math.max(0, snap(rect.height + overlapY * 2, dpr))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function clipEnvelope(rect, side, radii, seamOverlap, dpr) {
|
||||||
|
var fill = fillBounds(rect, side, seamOverlap, dpr);
|
||||||
|
var chrome = chromeBounds(fill, side, radii.start, radii.end, radii.farExtent, dpr);
|
||||||
|
return {
|
||||||
|
"x": chrome.x,
|
||||||
|
"y": chrome.y,
|
||||||
|
"width": chrome.width,
|
||||||
|
"height": chrome.height,
|
||||||
|
"bodyX": snap(fill.x - chrome.x, dpr),
|
||||||
|
"bodyY": snap(fill.y - chrome.y, dpr),
|
||||||
|
"bodyWidth": fill.width,
|
||||||
|
"bodyHeight": fill.height
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function blurRegions(descriptor, rect, radii, dpr) {
|
||||||
|
var side = descriptor.barSide;
|
||||||
|
var regions = [bodyRect(rect, dpr)];
|
||||||
|
if (radii.start > 0)
|
||||||
|
regions.push(connectorRect(side, rect, "left", 0, radii.start, dpr));
|
||||||
|
if (radii.end > 0)
|
||||||
|
regions.push(connectorRect(side, rect, "right", 0, radii.end, dpr));
|
||||||
|
if (radii.farStart > 0) {
|
||||||
|
regions.push(farConnectorRect(side, rect, "left", radii.farStart, dpr));
|
||||||
|
regions.push(farBodyCapRect(side, rect, "left", radii.farStart, dpr));
|
||||||
|
}
|
||||||
|
if (radii.farEnd > 0) {
|
||||||
|
regions.push(farConnectorRect(side, rect, "right", radii.farEnd, dpr));
|
||||||
|
regions.push(farBodyCapRect(side, rect, "right", radii.farEnd, dpr));
|
||||||
|
}
|
||||||
|
return regions;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unionBounds(rects, padding, dpr) {
|
||||||
|
var minX = Infinity;
|
||||||
|
var minY = Infinity;
|
||||||
|
var maxX = -Infinity;
|
||||||
|
var maxY = -Infinity;
|
||||||
|
for (var i = 0; i < rects.length; i++) {
|
||||||
|
var rect = rects[i];
|
||||||
|
if (!rect || rect.width <= 0 || rect.height <= 0)
|
||||||
|
continue;
|
||||||
|
minX = Math.min(minX, rect.x);
|
||||||
|
minY = Math.min(minY, rect.y);
|
||||||
|
maxX = Math.max(maxX, rect.x + rect.width);
|
||||||
|
maxY = Math.max(maxY, rect.y + rect.height);
|
||||||
|
}
|
||||||
|
if (minX === Infinity)
|
||||||
|
return {"x": 0, "y": 0, "width": 0, "height": 0};
|
||||||
|
var pad = Math.max(0, _number(padding, 0));
|
||||||
|
return {
|
||||||
|
"x": snap(minX - pad, dpr),
|
||||||
|
"y": snap(minY - pad, dpr),
|
||||||
|
"width": Math.max(0, snap(maxX - minX + pad * 2, dpr)),
|
||||||
|
"height": Math.max(0, snap(maxY - minY + pad * 2, dpr))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function shadowSourceBounds(descriptor, rect, radii, padding, dpr) {
|
||||||
|
return unionBounds(blurRegions(descriptor, rect, radii, dpr), padding, dpr);
|
||||||
|
}
|
||||||
|
|
||||||
|
function stableEqual(a, b, dpr) {
|
||||||
|
if (!a || !b)
|
||||||
|
return false;
|
||||||
|
var threshold = 0.5 / (dpr || 1);
|
||||||
|
return Math.abs(a.x - b.x) < threshold && Math.abs(a.y - b.y) < threshold && Math.abs(a.width - b.width) < threshold && Math.abs(a.height - b.height) < threshold;
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
required property string claimPrefix
|
||||||
|
required property var isCurrentOwner
|
||||||
|
required property var hasOwner
|
||||||
|
required property var claimState
|
||||||
|
required property var ensureState
|
||||||
|
required property var releaseState
|
||||||
|
|
||||||
|
property var statePresent: null
|
||||||
|
property var updateAnimationState: null
|
||||||
|
property var updateBodyState: null
|
||||||
|
property var requestDockRetract: null
|
||||||
|
property var releaseDockRetract: null
|
||||||
|
|
||||||
|
property string screenName: ""
|
||||||
|
property bool enabled: false
|
||||||
|
property bool active: false
|
||||||
|
property bool presented: false
|
||||||
|
property bool dockBlocked: false
|
||||||
|
property string dockSide: ""
|
||||||
|
property bool renewTokenOnRecovery: true
|
||||||
|
|
||||||
|
property string claimId: ""
|
||||||
|
property string claimedScreenName: ""
|
||||||
|
property int _claimSerial: 0
|
||||||
|
|
||||||
|
signal recoveryRequested
|
||||||
|
|
||||||
|
visible: false
|
||||||
|
|
||||||
|
function _nextClaimId() {
|
||||||
|
_claimSerial += 1;
|
||||||
|
return claimPrefix + ":" + (new Date()).getTime() + ":" + _claimSerial + ":" + Math.floor(Math.random() * 1000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _isCurrent(name) {
|
||||||
|
return !!name && !!isCurrentOwner && !!isCurrentOwner(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _hasOwner(name, ownerId) {
|
||||||
|
return !!name && !!ownerId && !!hasOwner && !!hasOwner(name, ownerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _hasState(name, ownerId) {
|
||||||
|
return !statePresent || !!statePresent(name, ownerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _shouldRecover() {
|
||||||
|
return active && enabled && _isCurrent(screenName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestRecovery() {
|
||||||
|
if (!_shouldRecover())
|
||||||
|
return false;
|
||||||
|
recoveryRequested();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkOwnershipRecovery() {
|
||||||
|
if (!_shouldRecover())
|
||||||
|
return false;
|
||||||
|
if (claimedScreenName === screenName && _hasOwner(screenName, claimId))
|
||||||
|
return false;
|
||||||
|
recoveryRequested();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkStateRecovery() {
|
||||||
|
if (!_shouldRecover())
|
||||||
|
return false;
|
||||||
|
if (claimedScreenName === screenName && _hasOwner(screenName, claimId) && _hasState(screenName, claimId))
|
||||||
|
return false;
|
||||||
|
recoveryRequested();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkRecovery() {
|
||||||
|
return checkStateRecovery();
|
||||||
|
}
|
||||||
|
|
||||||
|
function beginClaim() {
|
||||||
|
if (claimId && releaseDockRetract)
|
||||||
|
releaseDockRetract(claimId);
|
||||||
|
claimId = _nextClaimId();
|
||||||
|
claimedScreenName = "";
|
||||||
|
return claimId;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _syncDockRetract() {
|
||||||
|
if (!claimId)
|
||||||
|
return;
|
||||||
|
if (dockBlocked && presented && dockSide && requestDockRetract)
|
||||||
|
requestDockRetract(claimId, screenName, dockSide);
|
||||||
|
else if (releaseDockRetract)
|
||||||
|
releaseDockRetract(claimId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function publish(state, forceClaim) {
|
||||||
|
if (!enabled || !screenName || !state) {
|
||||||
|
release();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (claimedScreenName && claimedScreenName !== screenName)
|
||||||
|
release();
|
||||||
|
|
||||||
|
const current = _isCurrent(screenName);
|
||||||
|
let claiming = !!forceClaim || !claimId;
|
||||||
|
if (claiming && !current)
|
||||||
|
return false;
|
||||||
|
if (!claimId)
|
||||||
|
beginClaim();
|
||||||
|
|
||||||
|
let published = claiming ? claimState(screenName, state, claimId) : ensureState(screenName, state, claimId);
|
||||||
|
if (!published && !claiming && current) {
|
||||||
|
if (renewTokenOnRecovery) {
|
||||||
|
beginClaim();
|
||||||
|
} else if (releaseDockRetract) {
|
||||||
|
releaseDockRetract(claimId);
|
||||||
|
}
|
||||||
|
published = claimState(screenName, state, claimId);
|
||||||
|
}
|
||||||
|
if (!published)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
claimedScreenName = screenName;
|
||||||
|
_syncDockRetract();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateAnim(animX, animY) {
|
||||||
|
if (!enabled || !claimId || !claimedScreenName || !updateAnimationState)
|
||||||
|
return false;
|
||||||
|
if (!_hasOwner(claimedScreenName, claimId)) {
|
||||||
|
requestRecovery();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return updateAnimationState(claimedScreenName, claimId, animX, animY);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateBody(bodyX, bodyY, bodyW, bodyH) {
|
||||||
|
if (!enabled || !claimId || !claimedScreenName || !updateBodyState)
|
||||||
|
return false;
|
||||||
|
if (!_hasOwner(claimedScreenName, claimId)) {
|
||||||
|
requestRecovery();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return updateBodyState(claimedScreenName, claimId, bodyX, bodyY, bodyW, bodyH);
|
||||||
|
}
|
||||||
|
|
||||||
|
function release() {
|
||||||
|
if (!claimId) {
|
||||||
|
claimedScreenName = "";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const releasedClaimId = claimId;
|
||||||
|
const releasedScreenName = claimedScreenName;
|
||||||
|
claimId = "";
|
||||||
|
claimedScreenName = "";
|
||||||
|
|
||||||
|
if (releaseDockRetract)
|
||||||
|
releaseDockRetract(releasedClaimId);
|
||||||
|
if (releasedScreenName)
|
||||||
|
return !!releaseState(releasedScreenName, releasedClaimId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onDestruction: release()
|
||||||
|
}
|
||||||
@@ -7,29 +7,31 @@ Item {
|
|||||||
property alias path: socket.path
|
property alias path: socket.path
|
||||||
property alias parser: socket.parser
|
property alias parser: socket.parser
|
||||||
property bool connected: false
|
property bool connected: false
|
||||||
|
property bool linkUp: false
|
||||||
|
|
||||||
property int reconnectBaseMs: 400
|
property int reconnectBaseMs: 400
|
||||||
property int reconnectMaxMs: 15000
|
property int reconnectMaxMs: 15000
|
||||||
|
|
||||||
property int _reconnectAttempt: 0
|
property int _reconnectAttempt: 0
|
||||||
|
|
||||||
signal connectionStateChanged()
|
signal connectionStateChanged
|
||||||
|
|
||||||
onConnectedChanged: {
|
onConnectedChanged: {
|
||||||
socket.connected = connected
|
socket.connected = connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
Socket {
|
Socket {
|
||||||
id: socket
|
id: socket
|
||||||
|
|
||||||
onConnectionStateChanged: {
|
onConnectionStateChanged: {
|
||||||
root.connectionStateChanged()
|
root.linkUp = connected;
|
||||||
|
root.connectionStateChanged();
|
||||||
if (connected) {
|
if (connected) {
|
||||||
root._reconnectAttempt = 0
|
root._reconnectAttempt = 0;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
if (root.connected) {
|
if (root.connected) {
|
||||||
root._scheduleReconnect()
|
root._scheduleReconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -39,24 +41,24 @@ Item {
|
|||||||
interval: 0
|
interval: 0
|
||||||
repeat: false
|
repeat: false
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
socket.connected = false
|
socket.connected = false;
|
||||||
Qt.callLater(() => socket.connected = true)
|
Qt.callLater(() => socket.connected = true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function send(data) {
|
function send(data) {
|
||||||
const json = typeof data === "string" ? data : JSON.stringify(data)
|
const json = typeof data === "string" ? data : JSON.stringify(data);
|
||||||
const message = json.endsWith("\n") ? json : json + "\n"
|
const message = json.endsWith("\n") ? json : json + "\n";
|
||||||
socket.write(message)
|
socket.write(message);
|
||||||
socket.flush()
|
socket.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _scheduleReconnect() {
|
function _scheduleReconnect() {
|
||||||
const pow = Math.min(_reconnectAttempt, 10)
|
const pow = Math.min(_reconnectAttempt, 10);
|
||||||
const base = Math.min(reconnectBaseMs * Math.pow(2, pow), reconnectMaxMs)
|
const base = Math.min(reconnectBaseMs * Math.pow(2, pow), reconnectMaxMs);
|
||||||
const jitter = Math.floor(Math.random() * Math.floor(base / 4))
|
const jitter = Math.floor(Math.random() * Math.floor(base / 4));
|
||||||
reconnectTimer.interval = base + jitter
|
reconnectTimer.interval = base + jitter;
|
||||||
reconnectTimer.restart()
|
reconnectTimer.restart();
|
||||||
_reconnectAttempt++
|
_reconnectAttempt++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
pragma ComponentBehavior: Bound
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Effects
|
|
||||||
import qs.Common
|
import qs.Common
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
@@ -19,7 +18,11 @@ Item {
|
|||||||
property real bottomRightRadius: targetRadius
|
property real bottomRightRadius: targetRadius
|
||||||
property color borderColor: "transparent"
|
property color borderColor: "transparent"
|
||||||
property real borderWidth: 0
|
property real borderWidth: 0
|
||||||
property bool useCustomSource: false
|
|
||||||
|
property real sourceX: 0
|
||||||
|
property real sourceY: 0
|
||||||
|
property real sourceWidth: width
|
||||||
|
property real sourceHeight: height
|
||||||
|
|
||||||
property bool shadowEnabled: Theme.elevationEnabled
|
property bool shadowEnabled: Theme.elevationEnabled
|
||||||
property real shadowBlurPx: level && level.blurPx !== undefined ? level.blurPx : 0
|
property real shadowBlurPx: level && level.blurPx !== undefined ? level.blurPx : 0
|
||||||
@@ -28,36 +31,24 @@ Item {
|
|||||||
property real shadowOffsetY: Theme.elevationOffsetYFor(level, direction, fallbackOffset)
|
property real shadowOffsetY: Theme.elevationOffsetYFor(level, direction, fallbackOffset)
|
||||||
property color shadowColor: Theme.elevationShadowColor(level)
|
property color shadowColor: Theme.elevationShadowColor(level)
|
||||||
property real shadowOpacity: 1
|
property real shadowOpacity: 1
|
||||||
property real blurMax: Theme.elevationBlurMax
|
|
||||||
|
|
||||||
property alias sourceRect: sourceRect
|
readonly property var _ambient: Theme.elevationAmbient(level)
|
||||||
|
readonly property real _pad: shadowEnabled ? Math.ceil(Math.max(shadowBlurPx + shadowSpreadPx + Math.max(Math.abs(shadowOffsetX), Math.abs(shadowOffsetY)), _ambient.blurPx + _ambient.spreadPx) + 2) : 0
|
||||||
|
|
||||||
layer.enabled: shadowEnabled
|
ShaderEffect {
|
||||||
|
|
||||||
layer.effect: MultiEffect {
|
|
||||||
autoPaddingEnabled: true
|
|
||||||
shadowEnabled: true
|
|
||||||
blurEnabled: false
|
|
||||||
maskEnabled: false
|
|
||||||
shadowBlur: Math.max(0, Math.min(1, root.shadowBlurPx / Math.max(1, root.blurMax)))
|
|
||||||
shadowScale: 1 + (2 * root.shadowSpreadPx) / Math.max(1, Math.min(root.width, root.height))
|
|
||||||
shadowHorizontalOffset: root.shadowOffsetX
|
|
||||||
shadowVerticalOffset: root.shadowOffsetY
|
|
||||||
blurMax: root.blurMax
|
|
||||||
shadowColor: root.shadowColor
|
|
||||||
shadowOpacity: root.shadowOpacity
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: sourceRect
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
visible: !root.useCustomSource
|
anchors.margins: -root._pad
|
||||||
topLeftRadius: root.topLeftRadius
|
fragmentShader: Qt.resolvedUrl("../Shaders/qsb/elevation_rect.frag.qsb")
|
||||||
topRightRadius: root.topRightRadius
|
|
||||||
bottomLeftRadius: root.bottomLeftRadius
|
property real widthPx: width
|
||||||
bottomRightRadius: root.bottomRightRadius
|
property real heightPx: height
|
||||||
color: root.targetColor
|
property real borderWidth: root.borderWidth
|
||||||
border.color: root.borderColor
|
property vector4d rectPx: Qt.vector4d(root._pad + root.sourceX, root._pad + root.sourceY, root.sourceWidth, root.sourceHeight)
|
||||||
border.width: root.borderWidth
|
property vector4d cornerRadius: Qt.vector4d(root.topLeftRadius, root.topRightRadius, root.bottomRightRadius, root.bottomLeftRadius)
|
||||||
|
property vector4d fillColor: Qt.vector4d(root.targetColor.r, root.targetColor.g, root.targetColor.b, root.targetColor.a)
|
||||||
|
property vector4d borderColor: Qt.vector4d(root.borderColor.r, root.borderColor.g, root.borderColor.b, root.borderColor.a)
|
||||||
|
property vector4d shadowColor: Qt.vector4d(root.shadowColor.r, root.shadowColor.g, root.shadowColor.b, root.shadowEnabled ? root.shadowColor.a * root.shadowOpacity : 0)
|
||||||
|
property vector4d shadowParam: Qt.vector4d(Math.max(0, root.shadowBlurPx), root.shadowSpreadPx, root.shadowOffsetX, root.shadowOffsetY)
|
||||||
|
property vector4d ambientParam: Qt.vector4d(root._ambient.blurPx, root._ambient.spreadPx, root.shadowEnabled ? root._ambient.alpha * root.shadowOpacity : 0, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,7 +126,40 @@ const KEY_MAP = {
|
|||||||
161: "exclamdown"
|
161: "exclamdown"
|
||||||
};
|
};
|
||||||
|
|
||||||
function xkbKeyFromQtKey(qk) {
|
// Numpad (keypad) keys. Qt reuses the same Qt::Key_* values for the numpad and
|
||||||
|
// the main rows/nav cluster; only Qt.KeypadModifier distinguishes them. niri and
|
||||||
|
// the other compositors bind against the xkb KP_* keysym names, so we must emit
|
||||||
|
// those instead of the collapsed twin. With NumLock off the numpad sends the
|
||||||
|
// navigation keysyms (KP_Home, KP_End, ...); with NumLock on it sends KP_0..KP_9
|
||||||
|
// (handled by the digit range in xkbKeyFromQtKey). Operators/Enter are the same
|
||||||
|
// in both states.
|
||||||
|
const KP_MAP = {
|
||||||
|
16777232: "KP_Home",
|
||||||
|
16777235: "KP_Up",
|
||||||
|
16777238: "KP_Prior",
|
||||||
|
16777234: "KP_Left",
|
||||||
|
16777227: "KP_Begin",
|
||||||
|
16777236: "KP_Right",
|
||||||
|
16777233: "KP_End",
|
||||||
|
16777237: "KP_Down",
|
||||||
|
16777239: "KP_Next",
|
||||||
|
16777222: "KP_Insert",
|
||||||
|
16777223: "KP_Delete",
|
||||||
|
16777221: "KP_Enter",
|
||||||
|
43: "KP_Add",
|
||||||
|
45: "KP_Subtract",
|
||||||
|
42: "KP_Multiply",
|
||||||
|
47: "KP_Divide",
|
||||||
|
46: "KP_Decimal"
|
||||||
|
};
|
||||||
|
|
||||||
|
function xkbKeyFromQtKey(qk, isKeypad) {
|
||||||
|
if (isKeypad) {
|
||||||
|
if (qk >= 48 && qk <= 57)
|
||||||
|
return "KP_" + (qk - 48);
|
||||||
|
if (KP_MAP[qk])
|
||||||
|
return KP_MAP[qk];
|
||||||
|
}
|
||||||
if (qk >= 65 && qk <= 90)
|
if (qk >= 65 && qk <= 90)
|
||||||
return String.fromCharCode(qk);
|
return String.fromCharCode(qk);
|
||||||
if (qk >= 97 && qk <= 122)
|
if (qk >= 97 && qk <= 122)
|
||||||
|
|||||||
@@ -56,6 +56,9 @@ const DMS_ACTIONS = [
|
|||||||
{ id: "spawn dms ipc call dankdash wallpaper", label: "Wallpaper Browser" },
|
{ id: "spawn dms ipc call dankdash wallpaper", label: "Wallpaper Browser" },
|
||||||
{ id: "spawn dms ipc call file browse wallpaper", label: "File: Browse Wallpaper" },
|
{ id: "spawn dms ipc call file browse wallpaper", label: "File: Browse Wallpaper" },
|
||||||
{ id: "spawn dms ipc call file browse profile", label: "File: Browse Profile" },
|
{ id: "spawn dms ipc call file browse profile", label: "File: Browse Profile" },
|
||||||
|
{ id: "spawn dms ipc call color-picker toggle", label: "Color Picker: Toggle" },
|
||||||
|
{ id: "spawn dms ipc call color-picker open", label: "Color Picker: Open" },
|
||||||
|
{ id: "spawn dms ipc call color-picker close", label: "Color Picker: Close" },
|
||||||
{ id: "spawn dms ipc call keybinds toggle niri", label: "Keybinds Cheatsheet: Toggle", compositor: "niri" },
|
{ id: "spawn dms ipc call keybinds toggle niri", label: "Keybinds Cheatsheet: Toggle", compositor: "niri" },
|
||||||
{ id: "spawn dms ipc call keybinds open niri", label: "Keybinds Cheatsheet: Open", compositor: "niri" },
|
{ id: "spawn dms ipc call keybinds open niri", label: "Keybinds Cheatsheet: Open", compositor: "niri" },
|
||||||
{ id: "spawn dms ipc call keybinds close", label: "Keybinds Cheatsheet: Close" },
|
{ id: "spawn dms ipc call keybinds close", label: "Keybinds Cheatsheet: Close" },
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
pragma Singleton
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Wayland
|
||||||
|
import qs.Services
|
||||||
|
|
||||||
|
// Manages keyboard focus policy for popouts, modals, and Hyprland focus grabs
|
||||||
|
Singleton {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
function keyboardFocus(active, customFocus) {
|
||||||
|
if (PopoutManager.screenshotActive)
|
||||||
|
return WlrKeyboardFocus.None;
|
||||||
|
if (customFocus !== null && customFocus !== undefined)
|
||||||
|
return customFocus;
|
||||||
|
if (!active)
|
||||||
|
return WlrKeyboardFocus.None;
|
||||||
|
if (CompositorService.useHyprlandFocusGrab)
|
||||||
|
return WlrKeyboardFocus.OnDemand;
|
||||||
|
return WlrKeyboardFocus.Exclusive;
|
||||||
|
}
|
||||||
|
|
||||||
|
function wantsGrab(active, customFocus) {
|
||||||
|
return CompositorService.useHyprlandFocusGrab && keyboardFocus(active, customFocus) === WlrKeyboardFocus.OnDemand;
|
||||||
|
}
|
||||||
|
|
||||||
|
property list<var> barWindows: []
|
||||||
|
|
||||||
|
function registerBarWindow(window) {
|
||||||
|
if (!window || barWindows.indexOf(window) !== -1)
|
||||||
|
return;
|
||||||
|
barWindows = barWindows.concat([window]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function unregisterBarWindow(window) {
|
||||||
|
const idx = barWindows.indexOf(window);
|
||||||
|
if (idx === -1)
|
||||||
|
return;
|
||||||
|
const next = barWindows.slice();
|
||||||
|
next.splice(idx, 1);
|
||||||
|
barWindows = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
-12
@@ -74,6 +74,15 @@ Singleton {
|
|||||||
return appId;
|
return appId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function themedIconPath(name: string): string {
|
||||||
|
if (!name)
|
||||||
|
return "";
|
||||||
|
const themed = (typeof IconThemeService !== "undefined") ? IconThemeService.resolve(name) : "";
|
||||||
|
if (themed)
|
||||||
|
return themed;
|
||||||
|
return Quickshell.iconPath(name, true);
|
||||||
|
}
|
||||||
|
|
||||||
function resolveIconPath(iconName: string): string {
|
function resolveIconPath(iconName: string): string {
|
||||||
if (!iconName)
|
if (!iconName)
|
||||||
return "";
|
return "";
|
||||||
@@ -83,23 +92,24 @@ Singleton {
|
|||||||
return toFileUrl(expandTilde(moddedId));
|
return toFileUrl(expandTilde(moddedId));
|
||||||
if (moddedId.startsWith("file://"))
|
if (moddedId.startsWith("file://"))
|
||||||
return moddedId;
|
return moddedId;
|
||||||
return Quickshell.iconPath(moddedId, true);
|
return themedIconPath(moddedId);
|
||||||
}
|
}
|
||||||
return Quickshell.iconPath(iconName, true) || DesktopService.resolveIconPath(iconName);
|
return themedIconPath(iconName) || DesktopService.resolveIconPath(iconName);
|
||||||
}
|
}
|
||||||
|
|
||||||
function resolveIconUrl(iconName: string): string {
|
function resolveIconUrl(iconName: string): string {
|
||||||
if (!iconName)
|
if (!iconName)
|
||||||
return "";
|
return "";
|
||||||
const moddedId = moddedAppId(iconName);
|
const moddedId = moddedAppId(iconName);
|
||||||
if (moddedId !== iconName) {
|
const target = (moddedId !== iconName) ? moddedId : iconName;
|
||||||
if (moddedId.startsWith("~") || moddedId.startsWith("/"))
|
if (target.startsWith("~") || target.startsWith("/"))
|
||||||
return toFileUrl(expandTilde(moddedId));
|
return toFileUrl(expandTilde(target));
|
||||||
if (moddedId.startsWith("file://"))
|
if (target.startsWith("file://"))
|
||||||
return moddedId;
|
return target;
|
||||||
return "image://icon/" + moddedId;
|
const themed = (typeof IconThemeService !== "undefined") ? IconThemeService.resolve(target) : "";
|
||||||
}
|
if (themed)
|
||||||
return "image://icon/" + iconName;
|
return themed;
|
||||||
|
return "image://icon/" + target;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAppIcon(appId: string, desktopEntry: var): string {
|
function getAppIcon(appId: string, desktopEntry: var): string {
|
||||||
@@ -113,10 +123,10 @@ Singleton {
|
|||||||
return resolveIconPath(appId);
|
return resolveIconPath(appId);
|
||||||
|
|
||||||
if (desktopEntry && desktopEntry.icon) {
|
if (desktopEntry && desktopEntry.icon) {
|
||||||
return Quickshell.iconPath(desktopEntry.icon, true);
|
return themedIconPath(desktopEntry.icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
const icon = Quickshell.iconPath(appId, true);
|
const icon = themedIconPath(appId);
|
||||||
if (icon && icon !== "")
|
if (icon && icon !== "")
|
||||||
return icon;
|
return icon;
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,11 @@ Singleton {
|
|||||||
saveSettings();
|
saveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
property bool clipboardClickToPaste: false
|
||||||
property bool clipboardEnterToPaste: false
|
property bool clipboardEnterToPaste: false
|
||||||
|
property bool clipboardRememberTypeFilter: false
|
||||||
|
property string clipboardTypeFilter: "all"
|
||||||
|
property var clipboardVisibleEntryActions: ["pin", "edit", "delete"]
|
||||||
|
|
||||||
property var launcherPluginVisibility: ({})
|
property var launcherPluginVisibility: ({})
|
||||||
|
|
||||||
@@ -163,6 +167,8 @@ Singleton {
|
|||||||
property real popupTransparency: 1.0
|
property real popupTransparency: 1.0
|
||||||
property real dockTransparency: 1
|
property real dockTransparency: 1
|
||||||
property string widgetBackgroundColor: "sch"
|
property string widgetBackgroundColor: "sch"
|
||||||
|
property string widgetBackgroundCustomColor: "#6750A4"
|
||||||
|
property real widgetBackgroundCustomStrength: 0.50
|
||||||
property string widgetColorMode: "default"
|
property string widgetColorMode: "default"
|
||||||
property string controlCenterTileColorMode: "primary"
|
property string controlCenterTileColorMode: "primary"
|
||||||
property string buttonColorMode: "primary"
|
property string buttonColorMode: "primary"
|
||||||
@@ -181,6 +187,7 @@ Singleton {
|
|||||||
|
|
||||||
property int firstDayOfWeek: -1
|
property int firstDayOfWeek: -1
|
||||||
property bool showWeekNumber: false
|
property bool showWeekNumber: false
|
||||||
|
property string calendarBackend: "auto"
|
||||||
property bool use24HourClock: true
|
property bool use24HourClock: true
|
||||||
property bool showSeconds: false
|
property bool showSeconds: false
|
||||||
property bool padHours12Hour: false
|
property bool padHours12Hour: false
|
||||||
@@ -235,11 +242,35 @@ Singleton {
|
|||||||
property string wallpaperFillMode: "Fill"
|
property string wallpaperFillMode: "Fill"
|
||||||
property bool blurredWallpaperLayer: false
|
property bool blurredWallpaperLayer: false
|
||||||
property bool blurWallpaperOnOverview: false
|
property bool blurWallpaperOnOverview: false
|
||||||
|
property string wallpaperBackgroundColorMode: "black"
|
||||||
|
property string wallpaperBackgroundCustomColor: "#000000"
|
||||||
|
readonly property color effectiveWallpaperBackgroundColor: {
|
||||||
|
switch (wallpaperBackgroundColorMode) {
|
||||||
|
case "black":
|
||||||
|
return "#000000";
|
||||||
|
case "white":
|
||||||
|
return "#ffffff";
|
||||||
|
case "primary":
|
||||||
|
return Theme.primary;
|
||||||
|
case "surface":
|
||||||
|
return Theme.surfaceContainer;
|
||||||
|
case "custom":
|
||||||
|
return wallpaperBackgroundCustomColor;
|
||||||
|
default:
|
||||||
|
return "#000000";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
property bool frameEnabled: false
|
property bool frameEnabled: false
|
||||||
onFrameEnabledChanged: saveSettings()
|
onFrameEnabledChanged: saveSettings()
|
||||||
property real frameThickness: 16
|
property real frameThickness: 16
|
||||||
onFrameThicknessChanged: saveSettings()
|
onFrameThicknessChanged: saveSettings()
|
||||||
|
property int barInsetPaddingShared: -1
|
||||||
|
onBarInsetPaddingSharedChanged: saveSettings()
|
||||||
|
property bool barInsetPaddingSyncAll: false
|
||||||
|
onBarInsetPaddingSyncAllChanged: saveSettings()
|
||||||
|
property int frameBarInsetPadding: -1
|
||||||
|
onFrameBarInsetPaddingChanged: saveSettings()
|
||||||
property real frameRounding: 23
|
property real frameRounding: 23
|
||||||
onFrameRoundingChanged: saveSettings()
|
onFrameRoundingChanged: saveSettings()
|
||||||
property string frameColor: ""
|
property string frameColor: ""
|
||||||
@@ -383,11 +414,16 @@ Singleton {
|
|||||||
property bool dwlShowAllTags: false
|
property bool dwlShowAllTags: false
|
||||||
property bool workspaceActiveAppHighlightEnabled: false
|
property bool workspaceActiveAppHighlightEnabled: false
|
||||||
property string workspaceColorMode: "default"
|
property string workspaceColorMode: "default"
|
||||||
|
property string workspaceFocusedCustomColor: "#6750A4"
|
||||||
property string workspaceOccupiedColorMode: "none"
|
property string workspaceOccupiedColorMode: "none"
|
||||||
|
property string workspaceOccupiedCustomColor: "#625B71"
|
||||||
property string workspaceUnfocusedColorMode: "default"
|
property string workspaceUnfocusedColorMode: "default"
|
||||||
|
property string workspaceUnfocusedCustomColor: "#49454E"
|
||||||
property string workspaceUrgentColorMode: "default"
|
property string workspaceUrgentColorMode: "default"
|
||||||
|
property string workspaceUrgentCustomColor: "#B3261E"
|
||||||
property bool workspaceFocusedBorderEnabled: false
|
property bool workspaceFocusedBorderEnabled: false
|
||||||
property string workspaceFocusedBorderColor: "primary"
|
property string workspaceFocusedBorderColor: "primary"
|
||||||
|
property string workspaceFocusedBorderCustomColor: "#6750A4"
|
||||||
property int workspaceFocusedBorderThickness: 2
|
property int workspaceFocusedBorderThickness: 2
|
||||||
property var workspaceNameIcons: ({})
|
property var workspaceNameIcons: ({})
|
||||||
property bool waveProgressEnabled: true
|
property bool waveProgressEnabled: true
|
||||||
@@ -396,6 +432,7 @@ Singleton {
|
|||||||
property bool audioVisualizerEnabled: true
|
property bool audioVisualizerEnabled: true
|
||||||
property string audioScrollMode: "volume"
|
property string audioScrollMode: "volume"
|
||||||
property int audioWheelScrollAmount: 5
|
property int audioWheelScrollAmount: 5
|
||||||
|
property bool audioDeviceScrollVolumeEnabled: false
|
||||||
property bool clockCompactMode: false
|
property bool clockCompactMode: false
|
||||||
property int focusedWindowSize: 1
|
property int focusedWindowSize: 1
|
||||||
property bool focusedWindowCompactMode: false
|
property bool focusedWindowCompactMode: false
|
||||||
@@ -403,6 +440,9 @@ Singleton {
|
|||||||
property int barMaxVisibleApps: 0
|
property int barMaxVisibleApps: 0
|
||||||
property int barMaxVisibleRunningApps: 0
|
property int barMaxVisibleRunningApps: 0
|
||||||
property bool barShowOverflowBadge: true
|
property bool barShowOverflowBadge: true
|
||||||
|
property bool trayAutoOverflow: true
|
||||||
|
property bool trayPopupSingleLine: true
|
||||||
|
property int trayMaxVisibleItems: 0
|
||||||
property bool appsDockHideIndicators: false
|
property bool appsDockHideIndicators: false
|
||||||
property bool appsDockColorizeActive: false
|
property bool appsDockColorizeActive: false
|
||||||
property string appsDockActiveColorMode: "primary"
|
property string appsDockActiveColorMode: "primary"
|
||||||
@@ -449,6 +489,7 @@ Singleton {
|
|||||||
onAppDrawerSectionViewModesChanged: saveSettings()
|
onAppDrawerSectionViewModesChanged: saveSettings()
|
||||||
property bool niriOverviewOverlayEnabled: true
|
property bool niriOverviewOverlayEnabled: true
|
||||||
property string dankLauncherV2Size: "compact"
|
property string dankLauncherV2Size: "compact"
|
||||||
|
property bool dankLauncherV2ShowSourceBadges: true
|
||||||
property bool dankLauncherV2BorderEnabled: false
|
property bool dankLauncherV2BorderEnabled: false
|
||||||
property int dankLauncherV2BorderThickness: 2
|
property int dankLauncherV2BorderThickness: 2
|
||||||
property string dankLauncherV2BorderColor: "primary"
|
property string dankLauncherV2BorderColor: "primary"
|
||||||
@@ -459,6 +500,8 @@ Singleton {
|
|||||||
property bool launcherUseOverlayLayer: false
|
property bool launcherUseOverlayLayer: false
|
||||||
property string launcherStyle: "full"
|
property string launcherStyle: "full"
|
||||||
property bool spotlightBarShowModeChips: false
|
property bool spotlightBarShowModeChips: false
|
||||||
|
property bool keybindsFloatingWindow: false
|
||||||
|
onKeybindsFloatingWindowChanged: saveSettings()
|
||||||
|
|
||||||
property string _legacyWeatherLocation: "New York, NY"
|
property string _legacyWeatherLocation: "New York, NY"
|
||||||
property string _legacyWeatherCoordinates: "40.7128,-74.0060"
|
property string _legacyWeatherCoordinates: "40.7128,-74.0060"
|
||||||
@@ -470,7 +513,11 @@ Singleton {
|
|||||||
|
|
||||||
property string networkPreference: "auto"
|
property string networkPreference: "auto"
|
||||||
|
|
||||||
property string iconTheme: "System Default"
|
property string iconThemeDark: "System Default"
|
||||||
|
property string iconThemeLight: "System Default"
|
||||||
|
property bool iconThemePerMode: false
|
||||||
|
property string lastAppliedIconTheme: ""
|
||||||
|
readonly property string iconTheme: resolveIconTheme()
|
||||||
property var availableIconThemes: ["System Default"]
|
property var availableIconThemes: ["System Default"]
|
||||||
property string systemDefaultIconTheme: ""
|
property string systemDefaultIconTheme: ""
|
||||||
property bool qt5ctAvailable: false
|
property bool qt5ctAvailable: false
|
||||||
@@ -515,14 +562,42 @@ Singleton {
|
|||||||
property bool notepadUseMonospace: true
|
property bool notepadUseMonospace: true
|
||||||
property string notepadFontFamily: ""
|
property string notepadFontFamily: ""
|
||||||
property real notepadFontSize: 14
|
property real notepadFontSize: 14
|
||||||
|
property real notificationSummaryFontSize: Spec.SPEC.notificationSummaryFontSize.def
|
||||||
|
property real notificationBodyFontSize: Spec.SPEC.notificationBodyFontSize.def
|
||||||
property bool notepadShowLineNumbers: false
|
property bool notepadShowLineNumbers: false
|
||||||
|
property bool notepadAutoSave: false
|
||||||
|
property string notepadSlideoutSide: "right"
|
||||||
|
property string notepadDefaultMode: "slideout"
|
||||||
property real notepadTransparencyOverride: -1
|
property real notepadTransparencyOverride: -1
|
||||||
property real notepadLastCustomTransparency: 0.7
|
property real notepadLastCustomTransparency: 0.7
|
||||||
|
property bool notepadUseCompositorGap: false
|
||||||
|
property int notepadEdgeGap: 0
|
||||||
|
|
||||||
|
// Compositor layout gap when enabled and available, else the manual value.
|
||||||
|
readonly property int notepadEffectiveEdgeGap: {
|
||||||
|
if (notepadUseCompositorGap) {
|
||||||
|
var g = -1;
|
||||||
|
if (CompositorService.isNiri)
|
||||||
|
g = niriLayoutGapsOverride;
|
||||||
|
else if (CompositorService.isHyprland)
|
||||||
|
g = hyprlandLayoutGapsOverride;
|
||||||
|
else if (CompositorService.isMango)
|
||||||
|
g = mangoLayoutGapsOverride;
|
||||||
|
if (g >= 0)
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
return Math.max(0, notepadEdgeGap);
|
||||||
|
}
|
||||||
|
|
||||||
onNotepadUseMonospaceChanged: saveSettings()
|
onNotepadUseMonospaceChanged: saveSettings()
|
||||||
onNotepadFontFamilyChanged: saveSettings()
|
onNotepadFontFamilyChanged: saveSettings()
|
||||||
onNotepadFontSizeChanged: saveSettings()
|
onNotepadFontSizeChanged: saveSettings()
|
||||||
onNotepadShowLineNumbersChanged: saveSettings()
|
onNotepadShowLineNumbersChanged: saveSettings()
|
||||||
|
onNotepadAutoSaveChanged: saveSettings()
|
||||||
|
onNotepadSlideoutSideChanged: saveSettings()
|
||||||
|
onNotepadDefaultModeChanged: saveSettings()
|
||||||
|
onNotepadUseCompositorGapChanged: saveSettings()
|
||||||
|
onNotepadEdgeGapChanged: saveSettings()
|
||||||
// onCenteringModeChanged: saveSettings()
|
// onCenteringModeChanged: saveSettings()
|
||||||
onNotepadTransparencyOverrideChanged: {
|
onNotepadTransparencyOverrideChanged: {
|
||||||
if (notepadTransparencyOverride > 0) {
|
if (notepadTransparencyOverride > 0) {
|
||||||
@@ -538,6 +613,7 @@ Singleton {
|
|||||||
property bool soundVolumeChanged: true
|
property bool soundVolumeChanged: true
|
||||||
property bool soundPluggedIn: true
|
property bool soundPluggedIn: true
|
||||||
property bool soundLogin: false
|
property bool soundLogin: false
|
||||||
|
property bool muteSoundsWhenMediaPlaying: true
|
||||||
|
|
||||||
property int acMonitorTimeout: 0
|
property int acMonitorTimeout: 0
|
||||||
property int acLockTimeout: 0
|
property int acLockTimeout: 0
|
||||||
@@ -552,6 +628,17 @@ Singleton {
|
|||||||
property string batteryProfileName: ""
|
property string batteryProfileName: ""
|
||||||
property int batteryPostLockMonitorTimeout: 0
|
property int batteryPostLockMonitorTimeout: 0
|
||||||
property int batteryChargeLimit: 100
|
property int batteryChargeLimit: 100
|
||||||
|
property bool batteryNotifyChargeLimit: false
|
||||||
|
property int batteryCriticalThreshold: 10
|
||||||
|
property bool batteryNotifyCritical: true
|
||||||
|
property int batteryLowThreshold: 20
|
||||||
|
property bool batteryNotifyLow: false
|
||||||
|
property int batteryNotificationType: 0
|
||||||
|
property bool batteryAutoPowerSaver: false
|
||||||
|
property bool showBatteryPercent: true
|
||||||
|
property bool showBatteryPercentOnlyOnBattery: false
|
||||||
|
property bool showBatteryTime: false
|
||||||
|
property bool showBatteryTimeOnlyOnBattery: false
|
||||||
property bool lockBeforeSuspend: false
|
property bool lockBeforeSuspend: false
|
||||||
property bool loginctlLockIntegration: true
|
property bool loginctlLockIntegration: true
|
||||||
property bool fadeToLockEnabled: true
|
property bool fadeToLockEnabled: true
|
||||||
@@ -695,6 +782,7 @@ Singleton {
|
|||||||
property int notificationTimeoutNormal: 5000
|
property int notificationTimeoutNormal: 5000
|
||||||
property int notificationTimeoutCritical: 0
|
property int notificationTimeoutCritical: 0
|
||||||
property bool notificationCompactMode: false
|
property bool notificationCompactMode: false
|
||||||
|
property bool notificationShowTimeoutBar: false
|
||||||
property bool notificationDedupeEnabled: true
|
property bool notificationDedupeEnabled: true
|
||||||
property int notificationPopupPosition: SettingsData.Position.Top
|
property int notificationPopupPosition: SettingsData.Position.Top
|
||||||
property int notificationAnimationSpeed: SettingsData.AnimationSpeed.Short
|
property int notificationAnimationSpeed: SettingsData.AnimationSpeed.Short
|
||||||
@@ -767,6 +855,7 @@ Singleton {
|
|||||||
"rightWidgets": ["systemTray", "clipboard", "cpuUsage", "memUsage", "notificationButton", "battery", "controlCenterButton"],
|
"rightWidgets": ["systemTray", "clipboard", "cpuUsage", "memUsage", "notificationButton", "battery", "controlCenterButton"],
|
||||||
"spacing": 4,
|
"spacing": 4,
|
||||||
"innerPadding": 4,
|
"innerPadding": 4,
|
||||||
|
"barInsetPadding": -1,
|
||||||
"bottomGap": 0,
|
"bottomGap": 0,
|
||||||
"transparency": 1.0,
|
"transparency": 1.0,
|
||||||
"widgetTransparency": 1.0,
|
"widgetTransparency": 1.0,
|
||||||
@@ -1225,14 +1314,67 @@ Singleton {
|
|||||||
MangoService.generateLayoutConfig();
|
MangoService.generateLayoutConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resolveIconTheme() {
|
||||||
|
if (iconThemePerMode && typeof SessionData !== "undefined" && SessionData.isLightMode)
|
||||||
|
return iconThemeLight;
|
||||||
|
return iconThemeDark;
|
||||||
|
}
|
||||||
|
|
||||||
function applyStoredIconTheme() {
|
function applyStoredIconTheme() {
|
||||||
updateGtkIconTheme();
|
updateGtkIconTheme();
|
||||||
updateQtIconTheme();
|
updateQtIconTheme();
|
||||||
updateCosmicIconTheme();
|
updateCosmicIconTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setIconThemeUnmanaged() {
|
||||||
|
iconThemePerMode = false;
|
||||||
|
iconThemeDark = "System Default";
|
||||||
|
iconThemeLight = "System Default";
|
||||||
|
lastAppliedIconTheme = "";
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkIconThemeDrift() {
|
||||||
|
if (isGreeterMode)
|
||||||
|
return;
|
||||||
|
if (resolveIconTheme() === "System Default")
|
||||||
|
return;
|
||||||
|
if (!lastAppliedIconTheme)
|
||||||
|
return;
|
||||||
|
const script = `if command -v gsettings >/dev/null 2>&1; then
|
||||||
|
gsettings get org.gnome.desktop.interface icon-theme 2>/dev/null | sed "s/'//g"
|
||||||
|
elif command -v dconf >/dev/null 2>&1; then
|
||||||
|
dconf read /org/gnome/desktop/interface/icon-theme 2>/dev/null | sed "s/'//g"
|
||||||
|
fi`;
|
||||||
|
|
||||||
|
Proc.runCommand("iconThemeDriftCheck", ["sh", "-c", script], (output, exitCode) => {
|
||||||
|
const platform = (output || "").trim();
|
||||||
|
if (!platform)
|
||||||
|
return;
|
||||||
|
if (platform === root.lastAppliedIconTheme || platform === root.iconThemeDark || platform === root.iconThemeLight)
|
||||||
|
return;
|
||||||
|
root.setIconThemeUnmanaged();
|
||||||
|
ToastService.showWarning(I18n.tr("Icon theme changed outside DMS; switched to System Default", "shown when an external tool overrides the icon theme DMS applied"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: typeof SessionData !== "undefined" ? SessionData : null
|
||||||
|
function onIsLightModeChanged() {
|
||||||
|
if (!SessionData.isSwitchingMode)
|
||||||
|
return;
|
||||||
|
if (!root.iconThemePerMode)
|
||||||
|
return;
|
||||||
|
if (root.iconThemeLight === root.iconThemeDark)
|
||||||
|
return;
|
||||||
|
root.applyStoredIconTheme();
|
||||||
|
root.saveSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function updateCosmicIconTheme() {
|
function updateCosmicIconTheme() {
|
||||||
let cosmicThemeName = (iconTheme === "System Default") ? systemDefaultIconTheme : iconTheme;
|
const resolved = resolveIconTheme();
|
||||||
|
let cosmicThemeName = (resolved === "System Default") ? systemDefaultIconTheme : resolved;
|
||||||
if (!cosmicThemeName || cosmicThemeName === "System Default") {
|
if (!cosmicThemeName || cosmicThemeName === "System Default") {
|
||||||
const detectScript = `if command -v gsettings >/dev/null 2>&1; then
|
const detectScript = `if command -v gsettings >/dev/null 2>&1; then
|
||||||
gsettings get org.gnome.desktop.interface icon-theme 2>/dev/null | sed "s/'//g"
|
gsettings get org.gnome.desktop.interface icon-theme 2>/dev/null | sed "s/'//g"
|
||||||
@@ -1268,9 +1410,11 @@ Singleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updateGtkIconTheme() {
|
function updateGtkIconTheme() {
|
||||||
const gtkThemeName = (iconTheme === "System Default") ? systemDefaultIconTheme : iconTheme;
|
const resolved = resolveIconTheme();
|
||||||
|
const gtkThemeName = (resolved === "System Default") ? systemDefaultIconTheme : resolved;
|
||||||
if (gtkThemeName === "System Default" || gtkThemeName === "")
|
if (gtkThemeName === "System Default" || gtkThemeName === "")
|
||||||
return;
|
return;
|
||||||
|
lastAppliedIconTheme = gtkThemeName;
|
||||||
if (typeof DMSService !== "undefined" && DMSService.apiVersion >= 3 && typeof PortalService !== "undefined") {
|
if (typeof DMSService !== "undefined" && DMSService.apiVersion >= 3 && typeof PortalService !== "undefined") {
|
||||||
PortalService.setSystemIconTheme(gtkThemeName);
|
PortalService.setSystemIconTheme(gtkThemeName);
|
||||||
}
|
}
|
||||||
@@ -1295,13 +1439,20 @@ Singleton {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if command -v gsettings >/dev/null 2>&1; then
|
||||||
|
gsettings set org.gnome.desktop.interface icon-theme '${gtkThemeName}' 2>/dev/null || true
|
||||||
|
elif command -v dconf >/dev/null 2>&1; then
|
||||||
|
dconf write /org/gnome/desktop/interface/icon-theme "'${gtkThemeName}'" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
pkill -HUP -f 'gtk' 2>/dev/null || true`;
|
pkill -HUP -f 'gtk' 2>/dev/null || true`;
|
||||||
|
|
||||||
Quickshell.execDetached(["sh", "-lc", configScript]);
|
Quickshell.execDetached(["sh", "-lc", configScript]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateQtIconTheme() {
|
function updateQtIconTheme() {
|
||||||
const qtThemeName = (iconTheme === "System Default") ? "" : iconTheme;
|
const resolved = resolveIconTheme();
|
||||||
|
const qtThemeName = (resolved === "System Default") ? "" : resolved;
|
||||||
if (!qtThemeName)
|
if (!qtThemeName)
|
||||||
return;
|
return;
|
||||||
const home = _homeUrl.replace("file://", "").replace(/'/g, "'\\''");
|
const home = _homeUrl.replace("file://", "").replace(/'/g, "'\\''");
|
||||||
@@ -1388,6 +1539,9 @@ Singleton {
|
|||||||
if (obj?.directionalAnimationMode === 3 && frameMode !== "connected")
|
if (obj?.directionalAnimationMode === 3 && frameMode !== "connected")
|
||||||
frameMode = "connected";
|
frameMode = "connected";
|
||||||
|
|
||||||
|
if (obj?.iconTheme !== undefined && obj?.iconThemeDark === undefined)
|
||||||
|
iconThemeDark = obj.iconTheme;
|
||||||
|
|
||||||
if (obj?.weatherLocation !== undefined)
|
if (obj?.weatherLocation !== undefined)
|
||||||
_legacyWeatherLocation = obj.weatherLocation;
|
_legacyWeatherLocation = obj.weatherLocation;
|
||||||
if (obj?.weatherCoordinates !== undefined)
|
if (obj?.weatherCoordinates !== undefined)
|
||||||
@@ -1403,6 +1557,7 @@ Singleton {
|
|||||||
applyStoredTheme();
|
applyStoredTheme();
|
||||||
updateCompositorCursor();
|
updateCompositorCursor();
|
||||||
Processes.detectQtTools();
|
Processes.detectQtTools();
|
||||||
|
Qt.callLater(checkIconThemeDrift);
|
||||||
|
|
||||||
_checkSettingsWritable();
|
_checkSettingsWritable();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -1647,6 +1802,15 @@ Singleton {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function effectiveBarConfigForRender(config, usesFrameBarChrome) {
|
||||||
|
if (!config || !connectedFrameModeActive || usesFrameBarChrome)
|
||||||
|
return config;
|
||||||
|
const backup = connectedFrameBarStyleBackups[config.id];
|
||||||
|
if (!backup)
|
||||||
|
return config;
|
||||||
|
return Object.assign({}, config, backup);
|
||||||
|
}
|
||||||
|
|
||||||
// Single entry point for connected-mode settings state.
|
// Single entry point for connected-mode settings state.
|
||||||
// !active → restore backups
|
// !active → restore backups
|
||||||
function _reconcileConnectedFrameBarStyles() {
|
function _reconcileConnectedFrameBarStyles() {
|
||||||
@@ -2401,10 +2565,24 @@ Singleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setIconTheme(themeName) {
|
function setIconTheme(themeName) {
|
||||||
iconTheme = themeName;
|
const light = iconThemePerMode && typeof SessionData !== "undefined" && SessionData.isLightMode;
|
||||||
updateGtkIconTheme();
|
setIconThemeForMode(themeName, light);
|
||||||
updateQtIconTheme();
|
}
|
||||||
updateCosmicIconTheme();
|
|
||||||
|
function setIconThemeForMode(themeName, light) {
|
||||||
|
if (light)
|
||||||
|
iconThemeLight = themeName;
|
||||||
|
else
|
||||||
|
iconThemeDark = themeName;
|
||||||
|
applyStoredIconTheme();
|
||||||
|
saveSettings();
|
||||||
|
if (typeof Theme !== "undefined" && Theme.currentTheme === Theme.dynamic)
|
||||||
|
Theme.generateSystemThemesFromCurrentTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
function setIconThemePerMode(enabled) {
|
||||||
|
iconThemePerMode = enabled;
|
||||||
|
applyStoredIconTheme();
|
||||||
saveSettings();
|
saveSettings();
|
||||||
if (typeof Theme !== "undefined" && Theme.currentTheme === Theme.dynamic)
|
if (typeof Theme !== "undefined" && Theme.currentTheme === Theme.dynamic)
|
||||||
Theme.generateSystemThemesFromCurrentTheme();
|
Theme.generateSystemThemesFromCurrentTheme();
|
||||||
|
|||||||
@@ -450,7 +450,9 @@ Singleton {
|
|||||||
"primaryText": getMatugenColor("on_primary", "#ffffff"),
|
"primaryText": getMatugenColor("on_primary", "#ffffff"),
|
||||||
"primaryContainer": getMatugenColor("primary_container", "#1976d2"),
|
"primaryContainer": getMatugenColor("primary_container", "#1976d2"),
|
||||||
"secondary": getMatugenColor("secondary", "#8ab4f8"),
|
"secondary": getMatugenColor("secondary", "#8ab4f8"),
|
||||||
|
"secondaryContainer": getMatugenColor("secondary_container", getMatugenColor("surface_container_high", "#292b2f")),
|
||||||
"tertiary": getMatugenColor("tertiary", "#efb8c8"),
|
"tertiary": getMatugenColor("tertiary", "#efb8c8"),
|
||||||
|
"tertiaryContainer": getMatugenColor("tertiary_container", getMatugenColor("surface_container_high", "#292b2f")),
|
||||||
"surface": getMatugenColor("surface", "#1a1c1e"),
|
"surface": getMatugenColor("surface", "#1a1c1e"),
|
||||||
"surfaceText": getMatugenColor("on_background", "#e3e8ef"),
|
"surfaceText": getMatugenColor("on_background", "#e3e8ef"),
|
||||||
"surfaceVariant": getMatugenColor("surface_variant", "#44464f"),
|
"surfaceVariant": getMatugenColor("surface_variant", "#44464f"),
|
||||||
@@ -521,7 +523,6 @@ Singleton {
|
|||||||
|
|
||||||
property color primary: currentThemeData.primary
|
property color primary: currentThemeData.primary
|
||||||
property color primaryText: currentThemeData.primaryText
|
property color primaryText: currentThemeData.primaryText
|
||||||
property color primaryContainer: currentThemeData.primaryContainer
|
|
||||||
property color secondary: currentThemeData.secondary
|
property color secondary: currentThemeData.secondary
|
||||||
property color tertiary: currentThemeData.tertiary || currentThemeData.secondary
|
property color tertiary: currentThemeData.tertiary || currentThemeData.secondary
|
||||||
property color surface: currentThemeData.surface
|
property color surface: currentThemeData.surface
|
||||||
@@ -536,6 +537,9 @@ Singleton {
|
|||||||
property color surfaceContainer: currentThemeData.surfaceContainer
|
property color surfaceContainer: currentThemeData.surfaceContainer
|
||||||
property color surfaceContainerHigh: currentThemeData.surfaceContainerHigh
|
property color surfaceContainerHigh: currentThemeData.surfaceContainerHigh
|
||||||
property color surfaceContainerHighest: currentThemeData.surfaceContainerHighest || surfaceContainerHigh
|
property color surfaceContainerHighest: currentThemeData.surfaceContainerHighest || surfaceContainerHigh
|
||||||
|
property color primaryContainer: currentThemeData.primaryContainer || blend(surfaceContainerHigh, primary, 0.45)
|
||||||
|
property color secondaryContainer: currentThemeData.secondaryContainer || blend(surfaceContainerHigh, secondary, 0.35)
|
||||||
|
property color tertiaryContainer: currentThemeData.tertiaryContainer || blend(surfaceContainerHigh, tertiary, 0.35)
|
||||||
|
|
||||||
property color onSurface: surfaceText
|
property color onSurface: surfaceText
|
||||||
property color onSurfaceVariant: surfaceVariantText
|
property color onSurfaceVariant: surfaceVariantText
|
||||||
@@ -577,6 +581,45 @@ Singleton {
|
|||||||
readonly property int layerOutlineWidth: BlurService.enabled && layerOutlineOpacity > 0 ? 1 : 0
|
readonly property int layerOutlineWidth: BlurService.enabled && layerOutlineOpacity > 0 ? 1 : 0
|
||||||
property color surfaceTextHover: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.08)
|
property color surfaceTextHover: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.08)
|
||||||
property color surfaceTextAlpha: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.3)
|
property color surfaceTextAlpha: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.3)
|
||||||
|
|
||||||
|
function roleColor(mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case "primary":
|
||||||
|
case "pri":
|
||||||
|
return primary;
|
||||||
|
case "primaryContainer":
|
||||||
|
return primaryContainer;
|
||||||
|
case "secondary":
|
||||||
|
case "sec":
|
||||||
|
return secondary;
|
||||||
|
case "secondaryContainer":
|
||||||
|
return secondaryContainer;
|
||||||
|
case "tertiary":
|
||||||
|
case "ter":
|
||||||
|
return tertiary;
|
||||||
|
case "tertiaryContainer":
|
||||||
|
return tertiaryContainer;
|
||||||
|
case "surfaceText":
|
||||||
|
return surfaceText;
|
||||||
|
case "surfaceVariant":
|
||||||
|
return surfaceVariant;
|
||||||
|
case "s":
|
||||||
|
return surface;
|
||||||
|
case "sc":
|
||||||
|
return surfaceContainer;
|
||||||
|
case "sch":
|
||||||
|
return surfaceContainerHigh;
|
||||||
|
case "schh":
|
||||||
|
return surfaceContainerHighest;
|
||||||
|
case "sth":
|
||||||
|
return surfaceTextHover;
|
||||||
|
case "error":
|
||||||
|
case "err":
|
||||||
|
return error;
|
||||||
|
default:
|
||||||
|
return "transparent";
|
||||||
|
}
|
||||||
|
}
|
||||||
property color surfaceTextLight: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.06)
|
property color surfaceTextLight: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.06)
|
||||||
property color surfaceTextMedium: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.7)
|
property color surfaceTextMedium: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.7)
|
||||||
|
|
||||||
@@ -911,6 +954,16 @@ Singleton {
|
|||||||
}
|
}
|
||||||
return Qt.rgba(r, g, b, alpha);
|
return Qt.rgba(r, g, b, alpha);
|
||||||
}
|
}
|
||||||
|
function elevationAmbient(level) {
|
||||||
|
const blur = (level && level.blurPx !== undefined) ? Math.max(0, level.blurPx) : 0;
|
||||||
|
const alpha = ((level && level.alpha !== undefined) ? level.alpha : 0.3) * 0.5;
|
||||||
|
return {
|
||||||
|
blurPx: blur * 1.75,
|
||||||
|
spreadPx: 1,
|
||||||
|
alpha: alpha
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function elevationTintOpacity(level) {
|
function elevationTintOpacity(level) {
|
||||||
if (!level)
|
if (!level)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1420,9 +1473,22 @@ Singleton {
|
|||||||
|
|
||||||
property bool widgetBackgroundHasAlpha: {
|
property bool widgetBackgroundHasAlpha: {
|
||||||
const colorMode = typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundColor : "sch";
|
const colorMode = typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundColor : "sch";
|
||||||
return colorMode === "sth";
|
return colorMode === "sth" || colorMode === "custom";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function safeColor(value, fallback) {
|
||||||
|
try {
|
||||||
|
if (value === undefined || value === null || value === "")
|
||||||
|
return fallback;
|
||||||
|
return Qt.color(value);
|
||||||
|
} catch (e) {
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly property color widgetBackgroundCustomBaseColor: safeColor(typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundCustomColor : "#6750A4", primaryContainer)
|
||||||
|
readonly property real widgetBackgroundCustomStrength: Math.max(0, Math.min(1, typeof SettingsData !== "undefined" ? (SettingsData.widgetBackgroundCustomStrength ?? 0.4) : 0.4))
|
||||||
|
|
||||||
property var widgetBaseBackgroundColor: {
|
property var widgetBaseBackgroundColor: {
|
||||||
const colorMode = typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundColor : "sch";
|
const colorMode = typeof SettingsData !== "undefined" ? SettingsData.widgetBackgroundColor : "sch";
|
||||||
switch (colorMode) {
|
switch (colorMode) {
|
||||||
@@ -1432,6 +1498,14 @@ Singleton {
|
|||||||
return surfaceContainer;
|
return surfaceContainer;
|
||||||
case "sch":
|
case "sch":
|
||||||
return surfaceContainerHigh;
|
return surfaceContainerHigh;
|
||||||
|
case "primaryContainer":
|
||||||
|
return primaryContainer;
|
||||||
|
case "secondaryContainer":
|
||||||
|
return secondaryContainer;
|
||||||
|
case "tertiaryContainer":
|
||||||
|
return tertiaryContainer;
|
||||||
|
case "custom":
|
||||||
|
return blend(surfaceContainerHigh, widgetBackgroundCustomBaseColor, widgetBackgroundCustomStrength);
|
||||||
case "sth":
|
case "sth":
|
||||||
default:
|
default:
|
||||||
return surfaceTextHover;
|
return surfaceTextHover;
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ Singleton {
|
|||||||
showMicIcon: false,
|
showMicIcon: false,
|
||||||
showMicPercent: true,
|
showMicPercent: true,
|
||||||
showBatteryIcon: false,
|
showBatteryIcon: false,
|
||||||
|
showBatteryPercent: true,
|
||||||
|
showBatteryPercentOnlyOnBattery: false,
|
||||||
|
showBatteryTime: false,
|
||||||
|
showBatteryTimeOnlyOnBattery: false,
|
||||||
showPrinterIcon: false,
|
showPrinterIcon: false,
|
||||||
showScreenSharingIcon: true
|
showScreenSharingIcon: true
|
||||||
};
|
};
|
||||||
@@ -83,6 +87,14 @@ Singleton {
|
|||||||
item.showMicPercent = order[i].showMicPercent;
|
item.showMicPercent = order[i].showMicPercent;
|
||||||
if (isObj && order[i].showBatteryIcon !== undefined)
|
if (isObj && order[i].showBatteryIcon !== undefined)
|
||||||
item.showBatteryIcon = order[i].showBatteryIcon;
|
item.showBatteryIcon = order[i].showBatteryIcon;
|
||||||
|
if (isObj && order[i].showBatteryPercent !== undefined)
|
||||||
|
item.showBatteryPercent = order[i].showBatteryPercent;
|
||||||
|
if (isObj && order[i].showBatteryPercentOnlyOnBattery !== undefined)
|
||||||
|
item.showBatteryPercentOnlyOnBattery = order[i].showBatteryPercentOnlyOnBattery;
|
||||||
|
if (isObj && order[i].showBatteryTime !== undefined)
|
||||||
|
item.showBatteryTime = order[i].showBatteryTime;
|
||||||
|
if (isObj && order[i].showBatteryTimeOnlyOnBattery !== undefined)
|
||||||
|
item.showBatteryTimeOnlyOnBattery = order[i].showBatteryTimeOnlyOnBattery;
|
||||||
if (isObj && order[i].showPrinterIcon !== undefined)
|
if (isObj && order[i].showPrinterIcon !== undefined)
|
||||||
item.showPrinterIcon = order[i].showPrinterIcon;
|
item.showPrinterIcon = order[i].showPrinterIcon;
|
||||||
if (isObj && order[i].showScreenSharingIcon !== undefined)
|
if (isObj && order[i].showScreenSharingIcon !== undefined)
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ var SPEC = {
|
|||||||
dockTransparency: { def: 1.0, coerce: percentToUnit },
|
dockTransparency: { def: 1.0, coerce: percentToUnit },
|
||||||
|
|
||||||
widgetBackgroundColor: { def: "sch" },
|
widgetBackgroundColor: { def: "sch" },
|
||||||
|
widgetBackgroundCustomColor: { def: "#6750A4" },
|
||||||
|
widgetBackgroundCustomStrength: { def: 0.50, coerce: percentToUnit },
|
||||||
widgetColorMode: { def: "default" },
|
widgetColorMode: { def: "default" },
|
||||||
controlCenterTileColorMode: { def: "primary" },
|
controlCenterTileColorMode: { def: "primary" },
|
||||||
buttonColorMode: { def: "primary" },
|
buttonColorMode: { def: "primary" },
|
||||||
@@ -37,6 +39,7 @@ var SPEC = {
|
|||||||
|
|
||||||
firstDayOfWeek: { def: -1 },
|
firstDayOfWeek: { def: -1 },
|
||||||
showWeekNumber: { def: false },
|
showWeekNumber: { def: false },
|
||||||
|
calendarBackend: { def: "auto" },
|
||||||
use24HourClock: { def: true },
|
use24HourClock: { def: true },
|
||||||
showSeconds: { def: false },
|
showSeconds: { def: false },
|
||||||
padHours12Hour: { def: false },
|
padHours12Hour: { def: false },
|
||||||
@@ -71,6 +74,8 @@ var SPEC = {
|
|||||||
wallpaperFillMode: { def: "Fill" },
|
wallpaperFillMode: { def: "Fill" },
|
||||||
blurredWallpaperLayer: { def: false },
|
blurredWallpaperLayer: { def: false },
|
||||||
blurWallpaperOnOverview: { def: false },
|
blurWallpaperOnOverview: { def: false },
|
||||||
|
wallpaperBackgroundColorMode: { def: "black" },
|
||||||
|
wallpaperBackgroundCustomColor: { def: "#000000" },
|
||||||
|
|
||||||
showLauncherButton: { def: true },
|
showLauncherButton: { def: true },
|
||||||
showWorkspaceSwitcher: { def: true },
|
showWorkspaceSwitcher: { def: true },
|
||||||
@@ -91,6 +96,10 @@ var SPEC = {
|
|||||||
showClock: { def: true },
|
showClock: { def: true },
|
||||||
showNotificationButton: { def: true },
|
showNotificationButton: { def: true },
|
||||||
showBattery: { def: true },
|
showBattery: { def: true },
|
||||||
|
showBatteryPercent: { def: true },
|
||||||
|
showBatteryPercentOnlyOnBattery: { def: false },
|
||||||
|
showBatteryTime: { def: false },
|
||||||
|
showBatteryTimeOnlyOnBattery: { def: false },
|
||||||
showControlCenterButton: { def: true },
|
showControlCenterButton: { def: true },
|
||||||
showCapsLockIndicator: { def: true },
|
showCapsLockIndicator: { def: true },
|
||||||
|
|
||||||
@@ -143,11 +152,16 @@ var SPEC = {
|
|||||||
dwlShowAllTags: { def: false },
|
dwlShowAllTags: { def: false },
|
||||||
workspaceActiveAppHighlightEnabled: { def: false },
|
workspaceActiveAppHighlightEnabled: { def: false },
|
||||||
workspaceColorMode: { def: "default" },
|
workspaceColorMode: { def: "default" },
|
||||||
|
workspaceFocusedCustomColor: { def: "#6750A4" },
|
||||||
workspaceOccupiedColorMode: { def: "none" },
|
workspaceOccupiedColorMode: { def: "none" },
|
||||||
|
workspaceOccupiedCustomColor: { def: "#625B71" },
|
||||||
workspaceUnfocusedColorMode: { def: "default" },
|
workspaceUnfocusedColorMode: { def: "default" },
|
||||||
|
workspaceUnfocusedCustomColor: { def: "#49454E" },
|
||||||
workspaceUrgentColorMode: { def: "default" },
|
workspaceUrgentColorMode: { def: "default" },
|
||||||
|
workspaceUrgentCustomColor: { def: "#B3261E" },
|
||||||
workspaceFocusedBorderEnabled: { def: false },
|
workspaceFocusedBorderEnabled: { def: false },
|
||||||
workspaceFocusedBorderColor: { def: "primary" },
|
workspaceFocusedBorderColor: { def: "primary" },
|
||||||
|
workspaceFocusedBorderCustomColor: { def: "#6750A4" },
|
||||||
workspaceFocusedBorderThickness: { def: 2 },
|
workspaceFocusedBorderThickness: { def: 2 },
|
||||||
workspaceNameIcons: { def: {} },
|
workspaceNameIcons: { def: {} },
|
||||||
waveProgressEnabled: { def: true },
|
waveProgressEnabled: { def: true },
|
||||||
@@ -156,6 +170,7 @@ var SPEC = {
|
|||||||
audioVisualizerEnabled: { def: true },
|
audioVisualizerEnabled: { def: true },
|
||||||
audioScrollMode: { def: "volume" },
|
audioScrollMode: { def: "volume" },
|
||||||
audioWheelScrollAmount: { def: 5 },
|
audioWheelScrollAmount: { def: 5 },
|
||||||
|
audioDeviceScrollVolumeEnabled: { def: false },
|
||||||
clockCompactMode: { def: false },
|
clockCompactMode: { def: false },
|
||||||
focusedWindowCompactMode: { def: false },
|
focusedWindowCompactMode: { def: false },
|
||||||
focusedWindowSize: { def: 1 },
|
focusedWindowSize: { def: 1 },
|
||||||
@@ -163,6 +178,9 @@ var SPEC = {
|
|||||||
barMaxVisibleApps: { def: 0 },
|
barMaxVisibleApps: { def: 0 },
|
||||||
barMaxVisibleRunningApps: { def: 0 },
|
barMaxVisibleRunningApps: { def: 0 },
|
||||||
barShowOverflowBadge: { def: true },
|
barShowOverflowBadge: { def: true },
|
||||||
|
trayAutoOverflow: { def: true },
|
||||||
|
trayPopupSingleLine: { def: true },
|
||||||
|
trayMaxVisibleItems: { def: 0 },
|
||||||
appsDockHideIndicators: { def: false },
|
appsDockHideIndicators: { def: false },
|
||||||
appsDockColorizeActive: { def: false },
|
appsDockColorizeActive: { def: false },
|
||||||
appsDockActiveColorMode: { def: "primary" },
|
appsDockActiveColorMode: { def: "primary" },
|
||||||
@@ -215,6 +233,7 @@ var SPEC = {
|
|||||||
appDrawerSectionViewModes: { def: {} },
|
appDrawerSectionViewModes: { def: {} },
|
||||||
niriOverviewOverlayEnabled: { def: true },
|
niriOverviewOverlayEnabled: { def: true },
|
||||||
dankLauncherV2Size: { def: "compact" },
|
dankLauncherV2Size: { def: "compact" },
|
||||||
|
dankLauncherV2ShowSourceBadges: { def: true },
|
||||||
dankLauncherV2BorderEnabled: { def: false },
|
dankLauncherV2BorderEnabled: { def: false },
|
||||||
dankLauncherV2BorderThickness: { def: 2 },
|
dankLauncherV2BorderThickness: { def: 2 },
|
||||||
dankLauncherV2BorderColor: { def: "primary" },
|
dankLauncherV2BorderColor: { def: "primary" },
|
||||||
@@ -225,13 +244,17 @@ var SPEC = {
|
|||||||
launcherUseOverlayLayer: { def: false },
|
launcherUseOverlayLayer: { def: false },
|
||||||
launcherStyle: { def: "full" },
|
launcherStyle: { def: "full" },
|
||||||
spotlightBarShowModeChips: { def: false },
|
spotlightBarShowModeChips: { def: false },
|
||||||
|
keybindsFloatingWindow: { def: false },
|
||||||
|
|
||||||
useAutoLocation: { def: false },
|
useAutoLocation: { def: false },
|
||||||
weatherEnabled: { def: true },
|
weatherEnabled: { def: true },
|
||||||
|
|
||||||
networkPreference: { def: "auto" },
|
networkPreference: { def: "auto" },
|
||||||
|
|
||||||
iconTheme: { def: "System Default", onChange: "applyStoredIconTheme" },
|
iconThemeDark: { def: "System Default", onChange: "applyStoredIconTheme" },
|
||||||
|
iconThemeLight: { def: "System Default", onChange: "applyStoredIconTheme" },
|
||||||
|
iconThemePerMode: { def: false, onChange: "applyStoredIconTheme" },
|
||||||
|
lastAppliedIconTheme: { def: "" },
|
||||||
availableIconThemes: { def: ["System Default"], persist: false },
|
availableIconThemes: { def: ["System Default"], persist: false },
|
||||||
systemDefaultIconTheme: { def: "", persist: false },
|
systemDefaultIconTheme: { def: "", persist: false },
|
||||||
qt5ctAvailable: { def: false, persist: false },
|
qt5ctAvailable: { def: false, persist: false },
|
||||||
@@ -260,9 +283,16 @@ var SPEC = {
|
|||||||
notepadUseMonospace: { def: true },
|
notepadUseMonospace: { def: true },
|
||||||
notepadFontFamily: { def: "" },
|
notepadFontFamily: { def: "" },
|
||||||
notepadFontSize: { def: 14 },
|
notepadFontSize: { def: 14 },
|
||||||
|
notificationSummaryFontSize: { def: 0 },
|
||||||
|
notificationBodyFontSize: { def: 0 },
|
||||||
notepadShowLineNumbers: { def: false },
|
notepadShowLineNumbers: { def: false },
|
||||||
|
notepadAutoSave: { def: false },
|
||||||
|
notepadSlideoutSide: { def: "right" },
|
||||||
|
notepadDefaultMode: { def: "slideout" },
|
||||||
notepadTransparencyOverride: { def: -1 },
|
notepadTransparencyOverride: { def: -1 },
|
||||||
notepadLastCustomTransparency: { def: 0.7 },
|
notepadLastCustomTransparency: { def: 0.7 },
|
||||||
|
notepadUseCompositorGap: { def: false },
|
||||||
|
notepadEdgeGap: { def: 0 },
|
||||||
|
|
||||||
soundsEnabled: { def: true },
|
soundsEnabled: { def: true },
|
||||||
useSystemSoundTheme: { def: false },
|
useSystemSoundTheme: { def: false },
|
||||||
@@ -270,6 +300,7 @@ var SPEC = {
|
|||||||
soundNewNotification: { def: true },
|
soundNewNotification: { def: true },
|
||||||
soundVolumeChanged: { def: true },
|
soundVolumeChanged: { def: true },
|
||||||
soundPluggedIn: { def: true },
|
soundPluggedIn: { def: true },
|
||||||
|
muteSoundsWhenMediaPlaying: { def: true },
|
||||||
|
|
||||||
acMonitorTimeout: { def: 0 },
|
acMonitorTimeout: { def: 0 },
|
||||||
acLockTimeout: { def: 0 },
|
acLockTimeout: { def: 0 },
|
||||||
@@ -284,6 +315,13 @@ var SPEC = {
|
|||||||
batteryProfileName: { def: "" },
|
batteryProfileName: { def: "" },
|
||||||
batteryPostLockMonitorTimeout: { def: 0 },
|
batteryPostLockMonitorTimeout: { def: 0 },
|
||||||
batteryChargeLimit: { def: 100 },
|
batteryChargeLimit: { def: 100 },
|
||||||
|
batteryNotifyChargeLimit: { def: false },
|
||||||
|
batteryCriticalThreshold: { def: 10 },
|
||||||
|
batteryNotifyCritical: { def: true },
|
||||||
|
batteryLowThreshold: { def: 20 },
|
||||||
|
batteryNotifyLow: { def: false },
|
||||||
|
batteryNotificationType: { def: 0 },
|
||||||
|
batteryAutoPowerSaver: { def: false },
|
||||||
lockBeforeSuspend: { def: false },
|
lockBeforeSuspend: { def: false },
|
||||||
loginctlLockIntegration: { def: true },
|
loginctlLockIntegration: { def: true },
|
||||||
fadeToLockEnabled: { def: true },
|
fadeToLockEnabled: { def: true },
|
||||||
@@ -406,6 +444,7 @@ var SPEC = {
|
|||||||
notificationTimeoutNormal: { def: 5000 },
|
notificationTimeoutNormal: { def: 5000 },
|
||||||
notificationTimeoutCritical: { def: 0 },
|
notificationTimeoutCritical: { def: 0 },
|
||||||
notificationCompactMode: { def: false },
|
notificationCompactMode: { def: false },
|
||||||
|
notificationShowTimeoutBar: { def: false },
|
||||||
notificationDedupeEnabled: { def: true },
|
notificationDedupeEnabled: { def: true },
|
||||||
notificationPopupPosition: { def: 0 },
|
notificationPopupPosition: { def: 0 },
|
||||||
notificationAnimationSpeed: { def: 1 },
|
notificationAnimationSpeed: { def: 1 },
|
||||||
@@ -568,7 +607,11 @@ var SPEC = {
|
|||||||
desktopWidgetGroups: { def: [] },
|
desktopWidgetGroups: { def: [] },
|
||||||
|
|
||||||
builtInPluginSettings: { def: {} },
|
builtInPluginSettings: { def: {} },
|
||||||
|
clipboardClickToPaste: { def: false },
|
||||||
clipboardEnterToPaste: { def: false },
|
clipboardEnterToPaste: { def: false },
|
||||||
|
clipboardRememberTypeFilter: { def: false },
|
||||||
|
clipboardTypeFilter: { def: "all" },
|
||||||
|
clipboardVisibleEntryActions: { def: ["pin", "edit", "delete"] },
|
||||||
|
|
||||||
launcherPluginVisibility: { def: {} },
|
launcherPluginVisibility: { def: {} },
|
||||||
launcherPluginOrder: { def: [] },
|
launcherPluginOrder: { def: [] },
|
||||||
@@ -585,7 +628,10 @@ var SPEC = {
|
|||||||
frameCloseGaps: { def: true },
|
frameCloseGaps: { def: true },
|
||||||
frameLauncherEmergeSide: { def: "bottom" },
|
frameLauncherEmergeSide: { def: "bottom" },
|
||||||
frameLauncherArcExtender: { def: false },
|
frameLauncherArcExtender: { def: false },
|
||||||
frameMode: { def: "connected" }
|
frameMode: { def: "connected" },
|
||||||
|
barInsetPaddingShared: { def: -1 },
|
||||||
|
barInsetPaddingSyncAll: { def: false },
|
||||||
|
frameBarInsetPadding: { def: -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
function getValidKeys() {
|
function getValidKeys() {
|
||||||
|
|||||||
+107
-48
@@ -64,27 +64,15 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property bool wallpaperSurfacesLoaded: true
|
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: blurredWallpaperBackgroundLoader
|
id: blurredWallpaperBackgroundLoader
|
||||||
active: root.wallpaperSurfacesLoaded && SettingsData.blurredWallpaperLayer && CompositorService.isNiri
|
active: SettingsData.blurredWallpaperLayer && CompositorService.isNiri
|
||||||
asynchronous: false
|
asynchronous: false
|
||||||
|
|
||||||
sourceComponent: BlurredWallpaperBackground {}
|
sourceComponent: BlurredWallpaperBackground {}
|
||||||
}
|
}
|
||||||
|
|
||||||
DeferredAction {
|
WallpaperBackground {}
|
||||||
id: wallpaperSurfaceReloadAction
|
|
||||||
onTriggered: root.wallpaperSurfacesLoaded = true
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: wallpaperBackgroundLoader
|
|
||||||
active: root.wallpaperSurfacesLoaded
|
|
||||||
asynchronous: false
|
|
||||||
sourceComponent: WallpaperBackground {}
|
|
||||||
}
|
|
||||||
|
|
||||||
DesktopWidgetLayer {}
|
DesktopWidgetLayer {}
|
||||||
|
|
||||||
@@ -128,6 +116,12 @@ Item {
|
|||||||
fadeWindowLoader.item.cancelFade();
|
fadeWindowLoader.item.cancelFade();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onDismissFadeToLock() {
|
||||||
|
if (fadeWindowLoader.item) {
|
||||||
|
fadeWindowLoader.item.dismiss();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,8 +175,7 @@ Item {
|
|||||||
property bool barSurfacesLoaded: true
|
property bool barSurfacesLoaded: true
|
||||||
|
|
||||||
function recreateBarSurfaces() {
|
function recreateBarSurfaces() {
|
||||||
log.info("Recreating bar surfaces, screens:", Quickshell.screens.length,
|
log.info("Recreating bar surfaces, screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","));
|
||||||
Quickshell.screens.map(s => s.name).join(","));
|
|
||||||
if (barSurfacesLoaded)
|
if (barSurfacesLoaded)
|
||||||
barSurfacesLoaded = false;
|
barSurfacesLoaded = false;
|
||||||
barSurfaceReloadAction.schedule();
|
barSurfaceReloadAction.schedule();
|
||||||
@@ -329,6 +322,9 @@ Item {
|
|||||||
|
|
||||||
property bool hadRealScreen: true
|
property bool hadRealScreen: true
|
||||||
property var previousRealScreenNames: []
|
property var previousRealScreenNames: []
|
||||||
|
// Guards for the screen-reconnect recovery path (see scheduleScreenReconnectRecovery).
|
||||||
|
property bool _screenRecoveryCooldown: false
|
||||||
|
property bool _screenRecoveryPending: false
|
||||||
|
|
||||||
function _getRealScreenNames() {
|
function _getRealScreenNames() {
|
||||||
const names = [];
|
const names = [];
|
||||||
@@ -348,12 +344,7 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function triggerSurfaceRecovery(source) {
|
function triggerSurfaceRecovery(source) {
|
||||||
log.info("Surface recovery triggered by:", source,
|
log.info("Surface recovery triggered by:", source, "screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","), "barLoaded:", root.barSurfacesLoaded, "frameLoaded:", root.frameSurfacesLoaded, "dockEnabled:", root.dockEnabled);
|
||||||
"screens:", Quickshell.screens.length,
|
|
||||||
Quickshell.screens.map(s => s.name).join(","),
|
|
||||||
"barLoaded:", root.barSurfacesLoaded,
|
|
||||||
"frameLoaded:", root.frameSurfacesLoaded,
|
|
||||||
"dockEnabled:", root.dockEnabled);
|
|
||||||
surfaceResumeRecoveryTimer.pass = 0;
|
surfaceResumeRecoveryTimer.pass = 0;
|
||||||
surfaceResumeRecoveryTimer.interval = 800;
|
surfaceResumeRecoveryTimer.interval = 800;
|
||||||
surfaceResumeRecoveryTimer.restart();
|
surfaceResumeRecoveryTimer.restart();
|
||||||
@@ -364,22 +355,63 @@ Item {
|
|||||||
function onScreensChanged() {
|
function onScreensChanged() {
|
||||||
const hasReal = root._hasRealScreen();
|
const hasReal = root._hasRealScreen();
|
||||||
const currentNames = root._getRealScreenNames();
|
const currentNames = root._getRealScreenNames();
|
||||||
log.info("Screens changed:", Quickshell.screens.length,
|
log.info("Screens changed:", Quickshell.screens.length, Quickshell.screens.map(s => "'" + s.name + "'").join(","), "hasReal:", hasReal, "hadReal:", root.hadRealScreen);
|
||||||
Quickshell.screens.map(s => "'" + s.name + "'").join(","),
|
|
||||||
"hasReal:", hasReal, "hadReal:", root.hadRealScreen);
|
|
||||||
const fullReconnect = !root.hadRealScreen && hasReal;
|
const fullReconnect = !root.hadRealScreen && hasReal;
|
||||||
const partialReconnect = root.previousRealScreenNames.length > 0
|
const partialReconnect = root.previousRealScreenNames.length > 0 && currentNames.some(name => !root.previousRealScreenNames.includes(name));
|
||||||
&& currentNames.some(name => !root.previousRealScreenNames.includes(name));
|
|
||||||
if (fullReconnect || partialReconnect) {
|
if (fullReconnect || partialReconnect) {
|
||||||
log.info("Screen reconnect detected, triggering surface recovery",
|
log.info("Screen reconnect detected, scheduling surface recovery", "full:", fullReconnect, "partial:", partialReconnect);
|
||||||
"full:", fullReconnect, "partial:", partialReconnect);
|
root.scheduleScreenReconnectRecovery();
|
||||||
root.triggerSurfaceRecovery("screen-reconnect");
|
|
||||||
}
|
}
|
||||||
root.hadRealScreen = hasReal;
|
root.hadRealScreen = hasReal;
|
||||||
root.previousRealScreenNames = currentNames;
|
root.previousRealScreenNames = currentNames;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A DPMS off/on cycle removes an output from the screen list and re-adds it,
|
||||||
|
// which is indistinguishable here from a hotplug. Recovering immediately on
|
||||||
|
// every such event lets a flapping monitor (or a recovery that itself perturbs
|
||||||
|
// the output) drive an endless recovery storm that power-cycles the display
|
||||||
|
// (#2642). Debounce a burst of changes into a single pass, then hold a cooldown
|
||||||
|
// so repeated flaps trigger at most one recovery per window. Recovery still runs
|
||||||
|
// once per resume, so a partial DPMS resume keeps redrawing its surfaces (#2579).
|
||||||
|
function scheduleScreenReconnectRecovery() {
|
||||||
|
if (root._screenRecoveryCooldown) {
|
||||||
|
root._screenRecoveryPending = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
screenReconnectDebounce.restart();
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: screenReconnectDebounce
|
||||||
|
// Wide enough to collapse the output-remove + output-re-add pair that one
|
||||||
|
// DPMS off/on cycle emits as two near-simultaneous events into one recovery.
|
||||||
|
interval: 450
|
||||||
|
repeat: false
|
||||||
|
onTriggered: {
|
||||||
|
root._screenRecoveryCooldown = true;
|
||||||
|
root._screenRecoveryPending = false;
|
||||||
|
screenReconnectCooldown.restart();
|
||||||
|
root.triggerSurfaceRecovery("screen-reconnect");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: screenReconnectCooldown
|
||||||
|
// Must exceed the full two-pass surfaceResumeRecoveryTimer sequence
|
||||||
|
// (800 + 2000 ms) so the cooldown still covers an in-flight recovery;
|
||||||
|
// raise this if those passes are lengthened.
|
||||||
|
interval: 4000
|
||||||
|
repeat: false
|
||||||
|
onTriggered: {
|
||||||
|
root._screenRecoveryCooldown = false;
|
||||||
|
if (root._screenRecoveryPending) {
|
||||||
|
root._screenRecoveryPending = false;
|
||||||
|
screenReconnectDebounce.restart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Timer {
|
Timer {
|
||||||
id: surfaceResumeRecoveryTimer
|
id: surfaceResumeRecoveryTimer
|
||||||
interval: 800
|
interval: 800
|
||||||
@@ -387,9 +419,7 @@ Item {
|
|||||||
property int pass: 0
|
property int pass: 0
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
pass++;
|
pass++;
|
||||||
log.info("Surface recovery pass", pass,
|
log.info("Surface recovery pass", pass, "screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","));
|
||||||
"screens:", Quickshell.screens.length,
|
|
||||||
Quickshell.screens.map(s => s.name).join(","));
|
|
||||||
|
|
||||||
root.recreateBarSurfaces();
|
root.recreateBarSurfaces();
|
||||||
|
|
||||||
@@ -398,11 +428,6 @@ Item {
|
|||||||
frameSurfaceReloadAction.schedule();
|
frameSurfaceReloadAction.schedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (root.wallpaperSurfacesLoaded) {
|
|
||||||
root.wallpaperSurfacesLoaded = false;
|
|
||||||
wallpaperSurfaceReloadAction.schedule();
|
|
||||||
}
|
|
||||||
|
|
||||||
root.dockEnabled = false;
|
root.dockEnabled = false;
|
||||||
Qt.callLater(() => {
|
Qt.callLater(() => {
|
||||||
root.dockEnabled = true;
|
root.dockEnabled = true;
|
||||||
@@ -420,11 +445,12 @@ Item {
|
|||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
dockRecreateDebounce.start();
|
dockRecreateDebounce.start();
|
||||||
// Force PolkitService singleton to initialize
|
|
||||||
PolkitService.polkitAvailable;
|
|
||||||
// Force DisplayConfigState singleton to initialize so auto-config runs at startup
|
|
||||||
DisplayConfigState.hasOutputBackend;
|
|
||||||
loginSoundTimer.start();
|
loginSoundTimer.start();
|
||||||
|
|
||||||
|
// These are dummy references just to trigger the singletons onCompleted to trigger
|
||||||
|
PolkitService.polkitAvailable;
|
||||||
|
DisplayConfigState.hasOutputBackend;
|
||||||
|
PortalService.systemColorScheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
@@ -670,7 +696,7 @@ Item {
|
|||||||
if (!wifiPasswordModalLoader.item)
|
if (!wifiPasswordModalLoader.item)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (wifiPasswordModalLoader.item.visible && timeSinceLastPrompt < 1000) {
|
if (wifiPasswordModalLoader.item.shouldBeVisible && timeSinceLastPrompt < 1000) {
|
||||||
NetworkService.cancelCredentials(lastCredentialsToken);
|
NetworkService.cancelCredentials(lastCredentialsToken);
|
||||||
lastCredentialsToken = token;
|
lastCredentialsToken = token;
|
||||||
lastCredentialsTime = now;
|
lastCredentialsTime = now;
|
||||||
@@ -1004,16 +1030,20 @@ Item {
|
|||||||
target: SessionService
|
target: SessionService
|
||||||
|
|
||||||
function onSessionResumed() {
|
function onSessionResumed() {
|
||||||
log.info("Session resumed: screens:", Quickshell.screens.length,
|
log.info("Session resumed: screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","), "barLoaded:", root.barSurfacesLoaded, "frameLoaded:", root.frameSurfacesLoaded, "dockEnabled:", root.dockEnabled);
|
||||||
Quickshell.screens.map(s => s.name).join(","),
|
|
||||||
"barLoaded:", root.barSurfacesLoaded,
|
|
||||||
"frameLoaded:", root.frameSurfacesLoaded,
|
|
||||||
"dockEnabled:", root.dockEnabled);
|
|
||||||
|
|
||||||
root.pendingOsdResumeReloads = 2;
|
root.pendingOsdResumeReloads = 2;
|
||||||
osdResumeRecreateTimer.interval = 400;
|
osdResumeRecreateTimer.interval = 400;
|
||||||
osdResumeRecreateTimer.restart();
|
osdResumeRecreateTimer.restart();
|
||||||
|
|
||||||
|
// This path runs its own recovery directly, so drop any queued or
|
||||||
|
// in-flight screen-reconnect recovery to avoid a redundant pass once
|
||||||
|
// its cooldown expires.
|
||||||
|
screenReconnectDebounce.stop();
|
||||||
|
screenReconnectCooldown.stop();
|
||||||
|
root._screenRecoveryCooldown = false;
|
||||||
|
root._screenRecoveryPending = false;
|
||||||
|
|
||||||
root.triggerSurfaceRecovery("sessionResumed");
|
root.triggerSurfaceRecovery("sessionResumed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1110,11 +1140,22 @@ Item {
|
|||||||
slideoutWidth: 480
|
slideoutWidth: 480
|
||||||
expandable: true
|
expandable: true
|
||||||
expandedWidthValue: 960
|
expandedWidthValue: 960
|
||||||
|
edgeGap: SettingsData.notepadEffectiveEdgeGap
|
||||||
|
slideEdge: SettingsData.notepadSlideoutSide
|
||||||
|
|
||||||
|
onIsVisibleChanged: {
|
||||||
|
if (isVisible)
|
||||||
|
PopoutService.notepadPopout?.hide();
|
||||||
|
}
|
||||||
|
|
||||||
content: Component {
|
content: Component {
|
||||||
Notepad {
|
Notepad {
|
||||||
slideout: notepadSlideout
|
slideout: notepadSlideout
|
||||||
onHideRequested: notepadSlideout.hide()
|
onHideRequested: notepadSlideout.hide()
|
||||||
|
onPopoutRequested: {
|
||||||
|
notepadSlideout.hide();
|
||||||
|
PopoutService.openNotepadPopout();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1131,6 +1172,24 @@ Item {
|
|||||||
Component.onCompleted: PopoutService.notepadSlideouts = instances
|
Component.onCompleted: PopoutService.notepadSlideouts = instances
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LazyLoader {
|
||||||
|
id: notepadPopoutLoader
|
||||||
|
active: false
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
PopoutService.notepadPopoutLoader = notepadPopoutLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
onActiveChanged: {
|
||||||
|
if (active && item) {
|
||||||
|
PopoutService.notepadPopout = item;
|
||||||
|
PopoutService._onNotepadPopoutLoaded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NotepadPopoutWindow {}
|
||||||
|
}
|
||||||
|
|
||||||
LazyLoader {
|
LazyLoader {
|
||||||
id: powerMenuModalLoader
|
id: powerMenuModalLoader
|
||||||
|
|
||||||
|
|||||||
@@ -373,6 +373,10 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function open(): string {
|
function open(): string {
|
||||||
|
if (SettingsData.notepadDefaultMode === "popout") {
|
||||||
|
PopoutService.openNotepadPopout();
|
||||||
|
return "NOTEPAD_OPEN_SUCCESS";
|
||||||
|
}
|
||||||
var instance = getActiveNotepadInstance();
|
var instance = getActiveNotepadInstance();
|
||||||
if (instance) {
|
if (instance) {
|
||||||
instance.show();
|
instance.show();
|
||||||
@@ -382,6 +386,10 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function close(): string {
|
function close(): string {
|
||||||
|
if (SettingsData.notepadDefaultMode === "popout") {
|
||||||
|
PopoutService.notepadPopout?.hide();
|
||||||
|
return "NOTEPAD_CLOSE_SUCCESS";
|
||||||
|
}
|
||||||
var instance = getActiveNotepadInstance();
|
var instance = getActiveNotepadInstance();
|
||||||
if (instance) {
|
if (instance) {
|
||||||
instance.hide();
|
instance.hide();
|
||||||
@@ -391,6 +399,10 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function toggle(): string {
|
function toggle(): string {
|
||||||
|
if (SettingsData.notepadDefaultMode === "popout") {
|
||||||
|
PopoutService.toggleNotepadPopout();
|
||||||
|
return "NOTEPAD_TOGGLE_SUCCESS";
|
||||||
|
}
|
||||||
var instance = getActiveNotepadInstance();
|
var instance = getActiveNotepadInstance();
|
||||||
if (instance) {
|
if (instance) {
|
||||||
instance.toggle();
|
instance.toggle();
|
||||||
@@ -944,7 +956,7 @@ Item {
|
|||||||
|
|
||||||
function tabs(): string {
|
function tabs(): string {
|
||||||
if (!PopoutService.settingsModal)
|
if (!PopoutService.settingsModal)
|
||||||
return "wallpaper\ntheme\ntypography\ntime_weather\nsounds\ndankbar\ndankbar_settings\ndankbar_appearance\ndankbar_widgets\nframe\nworkspaces\ncompositor\nmedia_player\nnotifications\nosd\nrunning_apps\nupdater\ndock\nlauncher\nkeybinds\ndisplays\nnetwork\nprinters\nlock_screen\npower_sleep\nplugins\nabout";
|
return "wallpaper\ntheme\ntypography\ntime_weather\nsounds\ndankbar\ndankbar_settings\ndankbar_appearance\ndankbar_widgets\nframe\nworkspaces\ncompositor\nmedia_player\nnotifications\nosd\nrunning_apps\nupdater\ndock\nlauncher\nkeybinds\ndisplays\nnetwork\nnetwork_status\nnetwork_ethernet\nnetwork_wifi\nnetwork_vpn\nprinters\nlock_screen\npower_sleep\nplugins\nabout";
|
||||||
var modal = PopoutService.settingsModal;
|
var modal = PopoutService.settingsModal;
|
||||||
var ids = [];
|
var ids = [];
|
||||||
var structure = modal.sidebar?.categoryStructure ?? [];
|
var structure = modal.sidebar?.categoryStructure ?? [];
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Hyprland
|
|
||||||
import qs.Common
|
import qs.Common
|
||||||
import qs.Modals.Common
|
import qs.Modals.Common
|
||||||
import qs.Services
|
import qs.Services
|
||||||
@@ -11,11 +10,6 @@ DankModal {
|
|||||||
|
|
||||||
layerNamespace: "dms:bluetooth-pairing"
|
layerNamespace: "dms:bluetooth-pairing"
|
||||||
|
|
||||||
HyprlandFocusGrab {
|
|
||||||
windows: [root.contentWindow]
|
|
||||||
active: root.useHyprlandFocusGrab && root.shouldHaveFocus
|
|
||||||
}
|
|
||||||
|
|
||||||
property string deviceName: ""
|
property string deviceName: ""
|
||||||
property string deviceAddress: ""
|
property string deviceAddress: ""
|
||||||
property string requestType: ""
|
property string requestType: ""
|
||||||
|
|||||||
@@ -2,18 +2,80 @@ import QtQuick
|
|||||||
import Quickshell
|
import Quickshell
|
||||||
import qs.Common
|
import qs.Common
|
||||||
import qs.Widgets
|
import qs.Widgets
|
||||||
|
import qs.Services
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: clipboardContent
|
id: clipboardContent
|
||||||
|
|
||||||
required property var modal
|
required property var modal
|
||||||
required property var clearConfirmDialog
|
|
||||||
|
|
||||||
property alias searchField: searchField
|
property alias searchField: searchField
|
||||||
property alias clipboardListView: clipboardListView
|
property alias clipboardListView: clipboardListView
|
||||||
|
|
||||||
|
readonly property var filterOptions: [I18n.tr("All"), I18n.tr("Text"), I18n.tr("Long Text"), I18n.tr("Image")]
|
||||||
|
readonly property var filterValues: ["all", "text", "long_text", "image"]
|
||||||
|
|
||||||
|
function closeFilterMenu() {
|
||||||
|
filterMenuLoader.active = false;
|
||||||
|
filterMenuLoader.active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showContextMenu(entry, sceneX, sceneY) {
|
||||||
|
const localPos = mapFromItem(null, sceneX, sceneY);
|
||||||
|
contextMenu.show(localPos.x, localPos.y, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
function contextEntryAtScreen(screenX, screenY) {
|
||||||
|
const host = modal.surfaceHost ?? null;
|
||||||
|
const hostX = host?.alignedX;
|
||||||
|
const hostY = host?.renderedAlignedY ?? host?.alignedY;
|
||||||
|
|
||||||
|
if (!isNaN(hostX) && !isNaN(hostY))
|
||||||
|
return contextEntryAtLocal(screenX - hostX, screenY - hostY);
|
||||||
|
|
||||||
|
const screenRef = host?.effectiveScreen ?? host?.screen ?? modal.Window?.window?.screen ?? null;
|
||||||
|
const globalOrigin = mapToGlobal(0, 0);
|
||||||
|
const screenOriginX = screenRef?.x || 0;
|
||||||
|
const screenOriginY = screenRef?.y || 0;
|
||||||
|
return contextEntryAtLocal(screenOriginX + screenX - globalOrigin.x, screenOriginY + screenY - globalOrigin.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
function contextEntryAtLocal(localX, localY) {
|
||||||
|
const listView = modal.activeTab === "saved" ? savedListView : clipboardListView;
|
||||||
|
const entries = modal.activeTab === "saved" ? modal.pinnedEntries : modal.unpinnedEntries;
|
||||||
|
|
||||||
|
if (!listView.visible || !entries)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
const listPos = mapToItem(listView, localX, localY);
|
||||||
|
if (listPos.x < 0 || listPos.x > listView.width || listPos.y < 0 || listPos.y > listView.height)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
const index = listView.indexAt(listPos.x + listView.contentX, listPos.y + listView.contentY);
|
||||||
|
if (index < 0 || index >= entries.length)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
entry: entries[index],
|
||||||
|
x: localX,
|
||||||
|
y: localY
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeContextMenu() {
|
||||||
|
contextMenu.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly property bool contextMenuActive: contextMenu.openState
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
ClipboardContextMenu {
|
||||||
|
id: contextMenu
|
||||||
|
modal: clipboardContent.modal
|
||||||
|
parentHandler: clipboardContent
|
||||||
|
}
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: headerColumn
|
id: headerColumn
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
@@ -33,40 +95,93 @@ Item {
|
|||||||
pinnedCount: modal.pinnedCount
|
pinnedCount: modal.pinnedCount
|
||||||
onKeyboardHintsToggled: modal.showKeyboardHints = !modal.showKeyboardHints
|
onKeyboardHintsToggled: modal.showKeyboardHints = !modal.showKeyboardHints
|
||||||
onTabChanged: tabName => modal.activeTab = tabName
|
onTabChanged: tabName => modal.activeTab = tabName
|
||||||
onClearAllClicked: {
|
onClearAllClicked: modal.confirmClearAll()
|
||||||
const hasPinned = modal.pinnedCount > 0;
|
|
||||||
const message = hasPinned ? I18n.tr("This will delete all unpinned entries. %1 pinned entries will be kept.").arg(modal.pinnedCount) : I18n.tr("This will permanently delete all clipboard history.");
|
|
||||||
clearConfirmDialog.show(I18n.tr("Clear History?"), message, function () {
|
|
||||||
modal.clearAll();
|
|
||||||
modal.hide();
|
|
||||||
}, function () {});
|
|
||||||
}
|
|
||||||
onCloseClicked: modal.hide()
|
onCloseClicked: modal.hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: searchRow
|
||||||
|
width: parent.width
|
||||||
|
implicitHeight: searchField.height
|
||||||
|
|
||||||
DankTextField {
|
DankTextField {
|
||||||
id: searchField
|
id: searchField
|
||||||
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
rightAccessoryWidth: filterButton.width + Theme.spacingS
|
||||||
placeholderText: ""
|
placeholderText: ""
|
||||||
leftIconName: "search"
|
leftIconName: "search"
|
||||||
showClearButton: true
|
showClearButton: true
|
||||||
focus: true
|
focus: true
|
||||||
ignoreTabKeys: true
|
ignoreTabKeys: true
|
||||||
keyForwardTargets: [modal.modalFocusScope]
|
keyForwardTargets: [modal.modalFocusScope]
|
||||||
|
|
||||||
onTextChanged: {
|
onTextChanged: {
|
||||||
modal.searchText = text;
|
modal.searchText = text;
|
||||||
modal.updateFilteredModel();
|
modal.updateFilteredModel();
|
||||||
|
ClipboardService.selectedIndex = 0;
|
||||||
|
ClipboardService.keyboardNavigationActive = true;
|
||||||
|
Qt.callLater(function () {
|
||||||
|
clipboardListView.positionViewAtBeginning();
|
||||||
|
savedListView.positionViewAtBeginning();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Keys.onEscapePressed: function (event) {
|
Keys.onEscapePressed: function (event) {
|
||||||
modal.hide();
|
modal.hide();
|
||||||
event.accepted = true;
|
event.accepted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
Qt.callLater(function () {
|
Qt.callLater(function () {
|
||||||
forceActiveFocus();
|
forceActiveFocus();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DankActionButton {
|
||||||
|
id: filterButton
|
||||||
|
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: Theme.spacingS
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
iconName: "filter_list"
|
||||||
|
iconColor: modal.activeFilter !== "all" ? Theme.primary : Theme.surfaceText
|
||||||
|
backgroundColor: modal.activeFilter !== "all" ? Theme.primarySelected : "transparent"
|
||||||
|
tooltipText: I18n.tr("Filter by type", "Clipboard history type filter button tooltip")
|
||||||
|
onClicked: filterMenuLoader.item?.openDropdownMenu()
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: filterMenuLoader
|
||||||
|
|
||||||
|
active: true
|
||||||
|
sourceComponent: filterMenuComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: filterMenuComponent
|
||||||
|
|
||||||
|
DankDropdown {
|
||||||
|
showTrigger: false
|
||||||
|
popupAnchorItem: filterButton
|
||||||
|
popupWidth: 180
|
||||||
|
alignPopupRight: true
|
||||||
|
options: clipboardContent.filterOptions
|
||||||
|
currentValue: {
|
||||||
|
const idx = clipboardContent.filterValues.indexOf(clipboardContent.modal.activeFilter);
|
||||||
|
return idx >= 0 ? clipboardContent.filterOptions[idx] : clipboardContent.filterOptions[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
onValueChanged: value => {
|
||||||
|
const idx = clipboardContent.filterOptions.indexOf(value);
|
||||||
|
if (idx >= 0) {
|
||||||
|
clipboardContent.modal.activeFilter = clipboardContent.filterValues[idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
@@ -148,10 +263,12 @@ Item {
|
|||||||
modal: clipboardContent.modal
|
modal: clipboardContent.modal
|
||||||
listView: clipboardListView
|
listView: clipboardListView
|
||||||
onCopyRequested: clipboardContent.modal.copyEntry(modelData)
|
onCopyRequested: clipboardContent.modal.copyEntry(modelData)
|
||||||
|
onPasteRequested: clipboardContent.modal.pasteEntry(modelData)
|
||||||
onDeleteRequested: clipboardContent.modal.deleteEntry(modelData)
|
onDeleteRequested: clipboardContent.modal.deleteEntry(modelData)
|
||||||
onPinRequested: clipboardContent.modal.pinEntry(modelData)
|
onPinRequested: targetEntry => clipboardContent.modal.pinEntry(targetEntry)
|
||||||
onUnpinRequested: clipboardContent.modal.unpinEntry(modelData)
|
onUnpinRequested: targetEntry => clipboardContent.modal.unpinEntry(targetEntry)
|
||||||
onEditRequested: clipboardContent.modal.editEntry(modelData)
|
onEditRequested: clipboardContent.modal.editEntry(modelData)
|
||||||
|
onContextMenuRequested: (mouseX, mouseY) => clipboardContent.showContextMenu(modelData, mouseX, mouseY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,10 +339,12 @@ Item {
|
|||||||
modal: clipboardContent.modal
|
modal: clipboardContent.modal
|
||||||
listView: savedListView
|
listView: savedListView
|
||||||
onCopyRequested: clipboardContent.modal.copyEntry(modelData)
|
onCopyRequested: clipboardContent.modal.copyEntry(modelData)
|
||||||
|
onPasteRequested: clipboardContent.modal.pasteEntry(modelData)
|
||||||
onDeleteRequested: clipboardContent.modal.deletePinnedEntry(modelData)
|
onDeleteRequested: clipboardContent.modal.deletePinnedEntry(modelData)
|
||||||
onPinRequested: clipboardContent.modal.pinEntry(modelData)
|
onPinRequested: targetEntry => clipboardContent.modal.pinEntry(targetEntry)
|
||||||
onUnpinRequested: clipboardContent.modal.unpinEntry(modelData)
|
onUnpinRequested: targetEntry => clipboardContent.modal.unpinEntry(targetEntry)
|
||||||
onEditRequested: clipboardContent.modal.editEntry(modelData)
|
onEditRequested: clipboardContent.modal.editEntry(modelData)
|
||||||
|
onContextMenuRequested: (mouseX, mouseY) => clipboardContent.showContextMenu(modelData, mouseX, mouseY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,400 @@
|
|||||||
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Wayland
|
||||||
|
import qs.Common
|
||||||
|
import qs.Services
|
||||||
|
import qs.Widgets
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
visible: false
|
||||||
|
width: 0
|
||||||
|
height: 0
|
||||||
|
|
||||||
|
property var entry: null
|
||||||
|
property var modal: null
|
||||||
|
property var parentHandler: null
|
||||||
|
property real menuMargin: 8
|
||||||
|
property var targetScreen: null
|
||||||
|
property real anchorX: 0
|
||||||
|
property real anchorY: 0
|
||||||
|
property bool openState: false
|
||||||
|
property bool renderActive: false
|
||||||
|
readonly property bool blurActive: renderActive && openState && BlurService.enabled && Theme.connectedSurfaceBlurEnabled
|
||||||
|
|
||||||
|
readonly property bool hasPinnedDuplicate: !!entry && !entry.pinned && ClipboardService.getPinnedEntryByHash(entry.hash) !== null
|
||||||
|
readonly property bool canEditEntry: !!entry && !(entry.isImage ?? false)
|
||||||
|
readonly property string pinText: entry?.pinned || hasPinnedDuplicate ? I18n.tr("Unpin") : I18n.tr("Pin")
|
||||||
|
readonly property string pinIcon: entry?.pinned || hasPinnedDuplicate ? "keep_off" : "push_pin"
|
||||||
|
|
||||||
|
readonly property var menuItems: {
|
||||||
|
const items = [
|
||||||
|
{
|
||||||
|
type: "item",
|
||||||
|
icon: "content_copy",
|
||||||
|
text: I18n.tr("Copy"),
|
||||||
|
action: copyEntry
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "item",
|
||||||
|
icon: pinIcon,
|
||||||
|
text: pinText,
|
||||||
|
action: togglePin
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
if (canEditEntry) {
|
||||||
|
items.push({
|
||||||
|
type: "item",
|
||||||
|
icon: "edit",
|
||||||
|
text: I18n.tr("Edit"),
|
||||||
|
action: editEntry
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
items.push({
|
||||||
|
type: "item",
|
||||||
|
icon: "delete",
|
||||||
|
text: I18n.tr("Delete"),
|
||||||
|
action: deleteEntry
|
||||||
|
}, {
|
||||||
|
type: "separator"
|
||||||
|
}, {
|
||||||
|
type: "item",
|
||||||
|
icon: "content_paste",
|
||||||
|
text: I18n.tr("Paste"),
|
||||||
|
action: pasteEntry
|
||||||
|
});
|
||||||
|
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly property real minMenuWidth: 160
|
||||||
|
readonly property real maxMenuWidth: Math.max(0, (targetScreen?.width ?? 500) - menuMargin * 2)
|
||||||
|
readonly property real maxMenuHeight: Math.max(0, (targetScreen?.height ?? 600) - menuMargin * 2)
|
||||||
|
readonly property string longestMenuText: {
|
||||||
|
let longest = "";
|
||||||
|
for (let i = 0; i < menuItems.length; i++) {
|
||||||
|
const text = menuItems[i].text || "";
|
||||||
|
if (text.length > longest.length)
|
||||||
|
longest = text;
|
||||||
|
}
|
||||||
|
return longest;
|
||||||
|
}
|
||||||
|
readonly property real naturalMenuWidth: Math.max(minMenuWidth, menuTextMetrics.width + Theme.iconSize + Theme.spacingS * 5)
|
||||||
|
readonly property real effectiveMenuWidth: Math.max(0, Math.min(maxMenuWidth, naturalMenuWidth))
|
||||||
|
readonly property real naturalMenuHeight: menuItemsHeight() + Theme.spacingS * 2
|
||||||
|
readonly property real effectiveMenuHeight: Math.min(maxMenuHeight, naturalMenuHeight)
|
||||||
|
readonly property bool menuScrolls: naturalMenuHeight > effectiveMenuHeight + 0.5
|
||||||
|
|
||||||
|
TextMetrics {
|
||||||
|
id: menuTextMetrics
|
||||||
|
text: root.longestMenuText
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
font.weight: Font.Normal
|
||||||
|
}
|
||||||
|
|
||||||
|
function menuItemsHeight() {
|
||||||
|
let h = 0;
|
||||||
|
for (let i = 0; i < menuItems.length; i++) {
|
||||||
|
h += menuItems[i].type === "separator" ? 5 : 32;
|
||||||
|
}
|
||||||
|
if (menuItems.length > 1)
|
||||||
|
h += menuItems.length - 1;
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
function show(x, y, targetEntry) {
|
||||||
|
if (!targetEntry)
|
||||||
|
return;
|
||||||
|
|
||||||
|
entry = targetEntry;
|
||||||
|
|
||||||
|
const host = modal?.surfaceHost ?? null;
|
||||||
|
const modalWindow = modal?.Window?.window ?? null;
|
||||||
|
const screenRef = host?.effectiveScreen ?? host?.screen ?? modalWindow?.screen ?? parentHandler?.Window?.window?.screen ?? null;
|
||||||
|
const screenX = screenRef?.x || 0;
|
||||||
|
const screenY = screenRef?.y || 0;
|
||||||
|
const hostX = host?.alignedX;
|
||||||
|
const hostY = host?.renderedAlignedY ?? host?.alignedY;
|
||||||
|
const globalPos = (!isNaN(hostX) && !isNaN(hostY)) ? ({
|
||||||
|
x: screenX + hostX + x,
|
||||||
|
y: screenY + hostY + y
|
||||||
|
}) : (parentHandler ? parentHandler.mapToGlobal(x, y) : ({
|
||||||
|
x: screenX + x,
|
||||||
|
y: screenY + y
|
||||||
|
}));
|
||||||
|
|
||||||
|
targetScreen = screenRef;
|
||||||
|
anchorX = globalPos.x - screenX + 4;
|
||||||
|
anchorY = globalPos.y - screenY + 4;
|
||||||
|
renderActive = true;
|
||||||
|
openState = true;
|
||||||
|
|
||||||
|
Qt.callLater(() => menuFlickable.contentY = 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hide() {
|
||||||
|
if (!renderActive)
|
||||||
|
return;
|
||||||
|
openState = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showFromWindowPoint(x, y) {
|
||||||
|
if (!parentHandler || typeof parentHandler.contextEntryAtScreen !== "function") {
|
||||||
|
hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const hit = parentHandler.contextEntryAtScreen(x, y);
|
||||||
|
|
||||||
|
if (!hit || !hit.entry) {
|
||||||
|
hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
show(hit.x, hit.y, hit.entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyEntry() {
|
||||||
|
if (!entry)
|
||||||
|
return;
|
||||||
|
modal?.copyEntry(entry);
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function togglePin() {
|
||||||
|
if (!entry)
|
||||||
|
return;
|
||||||
|
if (entry.pinned) {
|
||||||
|
modal?.unpinEntry(entry);
|
||||||
|
} else {
|
||||||
|
const duplicate = ClipboardService.getPinnedEntryByHash(entry.hash);
|
||||||
|
if (duplicate)
|
||||||
|
modal?.unpinEntry(duplicate);
|
||||||
|
else
|
||||||
|
modal?.pinEntry(entry);
|
||||||
|
}
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function editEntry() {
|
||||||
|
if (!entry || !canEditEntry)
|
||||||
|
return;
|
||||||
|
modal?.editEntry(entry);
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteEntry() {
|
||||||
|
if (!entry)
|
||||||
|
return;
|
||||||
|
if (entry.pinned)
|
||||||
|
modal?.deletePinnedEntry(entry);
|
||||||
|
else
|
||||||
|
modal?.deleteEntry(entry);
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function pasteEntry() {
|
||||||
|
if (!entry)
|
||||||
|
return;
|
||||||
|
modal?.pasteEntry(entry);
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
PanelWindow {
|
||||||
|
id: menuWindow
|
||||||
|
|
||||||
|
screen: root.targetScreen
|
||||||
|
visible: root.renderActive
|
||||||
|
color: "transparent"
|
||||||
|
|
||||||
|
WlrLayershell.namespace: "dms:clipboard-context-menu"
|
||||||
|
WlrLayershell.layer: WlrLayershell.Overlay
|
||||||
|
WlrLayershell.exclusiveZone: -1
|
||||||
|
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: true
|
||||||
|
left: true
|
||||||
|
right: true
|
||||||
|
bottom: true
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowBlur {
|
||||||
|
targetWindow: menuWindow
|
||||||
|
blurX: root.blurActive ? menuContainer.x : 0
|
||||||
|
blurY: root.blurActive ? menuContainer.y : 0
|
||||||
|
blurWidth: root.blurActive ? menuContainer.width : 0
|
||||||
|
blurHeight: root.blurActive ? menuContainer.height : 0
|
||||||
|
blurRadius: Theme.cornerRadius
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
z: -1
|
||||||
|
enabled: root.renderActive
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||||
|
onClicked: mouse => {
|
||||||
|
if (mouse.button === Qt.RightButton) {
|
||||||
|
root.showFromWindowPoint(mouse.x, mouse.y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
root.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: menuContainer
|
||||||
|
x: Math.max(root.menuMargin, Math.min(menuWindow.width - width - root.menuMargin, root.anchorX))
|
||||||
|
y: Math.max(root.menuMargin, Math.min(menuWindow.height - height - root.menuMargin, root.anchorY))
|
||||||
|
width: root.effectiveMenuWidth
|
||||||
|
height: root.effectiveMenuHeight
|
||||||
|
color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency)
|
||||||
|
radius: Theme.cornerRadius
|
||||||
|
border.color: BlurService.enabled ? BlurService.borderColor : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08)
|
||||||
|
border.width: BlurService.enabled ? BlurService.borderWidth : 1
|
||||||
|
opacity: root.openState ? 1 : 0
|
||||||
|
|
||||||
|
Behavior on opacity {
|
||||||
|
NumberAnimation {
|
||||||
|
duration: Theme.shortDuration
|
||||||
|
easing.type: Theme.emphasizedEasing
|
||||||
|
onRunningChanged: {
|
||||||
|
if (!running && !root.openState) {
|
||||||
|
root.renderActive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.topMargin: 4
|
||||||
|
anchors.leftMargin: 2
|
||||||
|
anchors.rightMargin: -2
|
||||||
|
anchors.bottomMargin: -4
|
||||||
|
radius: parent.radius
|
||||||
|
color: Qt.rgba(0, 0, 0, 0.15)
|
||||||
|
z: -1
|
||||||
|
}
|
||||||
|
|
||||||
|
Flickable {
|
||||||
|
id: menuFlickable
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: Theme.spacingS
|
||||||
|
clip: true
|
||||||
|
contentWidth: width
|
||||||
|
contentHeight: menuColumn.implicitHeight
|
||||||
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
interactive: root.menuScrolls
|
||||||
|
|
||||||
|
Column {
|
||||||
|
id: menuColumn
|
||||||
|
width: menuFlickable.width
|
||||||
|
spacing: 1
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: root.menuItems
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: menuItemDelegate
|
||||||
|
required property var modelData
|
||||||
|
|
||||||
|
width: menuColumn.width
|
||||||
|
height: modelData.type === "separator" ? 5 : 32
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
visible: menuItemDelegate.modelData.type === "separator"
|
||||||
|
width: parent.width - Theme.spacingS * 2
|
||||||
|
height: parent.height
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
color: "transparent"
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: parent.width
|
||||||
|
height: 1
|
||||||
|
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
visible: menuItemDelegate.modelData.type === "item"
|
||||||
|
width: parent.width
|
||||||
|
height: parent.height
|
||||||
|
radius: Theme.cornerRadius
|
||||||
|
color: itemMouseArea.containsMouse ? BlurService.hoverColor(Theme.widgetBaseHoverColor) : "transparent"
|
||||||
|
|
||||||
|
Row {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: Theme.spacingS
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: Theme.spacingS
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
spacing: Theme.spacingS
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: Theme.iconSize - 2
|
||||||
|
height: Theme.iconSize - 2
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
|
DankIcon {
|
||||||
|
visible: (menuItemDelegate.modelData?.icon ?? "").length > 0
|
||||||
|
name: menuItemDelegate.modelData?.icon ?? ""
|
||||||
|
size: Theme.iconSize - 2
|
||||||
|
color: Theme.surfaceText
|
||||||
|
opacity: 0.7
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: menuItemDelegate.modelData.text || ""
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.surfaceText
|
||||||
|
font.weight: Font.Normal
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
elide: Text.ElideRight
|
||||||
|
width: parent.width - (Theme.iconSize - 2) - Theme.spacingS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DankRipple {
|
||||||
|
id: menuItemRipple
|
||||||
|
rippleColor: Theme.surfaceText
|
||||||
|
cornerRadius: Theme.cornerRadius
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: itemMouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||||
|
onPressed: mouse => menuItemRipple.trigger(mouse.x, mouse.y)
|
||||||
|
onClicked: mouse => {
|
||||||
|
if (mouse.button === Qt.RightButton) {
|
||||||
|
root.hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const menuItem = menuItemDelegate.modelData;
|
||||||
|
if (menuItem.action)
|
||||||
|
menuItem.action();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,12 @@ Item {
|
|||||||
property var entry: null
|
property var entry: null
|
||||||
property string editorText: ""
|
property string editorText: ""
|
||||||
|
|
||||||
|
function releaseTextInputFocus() {
|
||||||
|
if (editField) {
|
||||||
|
editField.focus = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function decodeEntryData(data) {
|
function decodeEntryData(data) {
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@@ -14,14 +14,26 @@ Rectangle {
|
|||||||
required property var listView
|
required property var listView
|
||||||
|
|
||||||
signal copyRequested
|
signal copyRequested
|
||||||
|
signal pasteRequested
|
||||||
signal deleteRequested
|
signal deleteRequested
|
||||||
signal pinRequested
|
signal pinRequested(var targetEntry)
|
||||||
signal unpinRequested
|
signal unpinRequested(var targetEntry)
|
||||||
signal editRequested
|
signal editRequested
|
||||||
|
signal contextMenuRequested(real mouseX, real mouseY)
|
||||||
|
|
||||||
readonly property string entryType: modal ? modal.getEntryType(entry) : "text"
|
readonly property string entryType: modal ? modal.getEntryType(entry) : "text"
|
||||||
readonly property string entryPreview: modal ? modal.getEntryPreview(entry) : ""
|
readonly property string entryPreview: modal ? modal.getEntryPreview(entry) : ""
|
||||||
readonly property bool hasPinnedDuplicate: !entry.pinned && ClipboardService.hashedPinnedEntry(entry.hash)
|
readonly property var pinnedDuplicateEntry: !entry.pinned ? ClipboardService.getPinnedEntryByHash(entry.hash) : null
|
||||||
|
readonly property bool hasPinnedDuplicate: pinnedDuplicateEntry !== null
|
||||||
|
readonly property bool effectivePinned: entry.pinned || hasPinnedDuplicate
|
||||||
|
readonly property var visibleEntryActions: SettingsData.clipboardVisibleEntryActions || ["pin", "edit", "delete"]
|
||||||
|
readonly property bool showCopyAction: visibleEntryActions.includes("copy")
|
||||||
|
readonly property bool showPasteAction: visibleEntryActions.includes("paste")
|
||||||
|
readonly property bool showPinAction: visibleEntryActions.includes("pin")
|
||||||
|
readonly property bool showEditAction: visibleEntryActions.includes("edit")
|
||||||
|
readonly property bool showDeleteAction: visibleEntryActions.includes("delete")
|
||||||
|
readonly property bool showPinnedIndicator: hasPinnedDuplicate && !showPinAction
|
||||||
|
readonly property bool showAnyAction: showCopyAction || showPasteAction || showPinAction || showEditAction || showDeleteAction || showPinnedIndicator
|
||||||
|
|
||||||
radius: Theme.cornerRadius
|
radius: Theme.cornerRadius
|
||||||
color: {
|
color: {
|
||||||
@@ -62,19 +74,62 @@ Rectangle {
|
|||||||
anchors.rightMargin: Theme.spacingS
|
anchors.rightMargin: Theme.spacingS
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
spacing: Theme.spacingXS
|
spacing: Theme.spacingXS
|
||||||
|
visible: root.showAnyAction
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
visible: root.showPinnedIndicator
|
||||||
|
|
||||||
|
// Status indicator only; the Pin action remains hidden.
|
||||||
|
DankIcon {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
name: "push_pin"
|
||||||
|
size: Theme.iconSize - 6
|
||||||
|
color: Theme.primary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DankActionButton {
|
||||||
|
iconName: "content_copy"
|
||||||
|
iconSize: Theme.iconSize - 6
|
||||||
|
iconColor: Theme.surfaceText
|
||||||
|
visible: root.showCopyAction
|
||||||
|
onClicked: copyRequested()
|
||||||
|
}
|
||||||
|
|
||||||
|
DankActionButton {
|
||||||
|
iconName: "content_paste"
|
||||||
|
iconSize: Theme.iconSize - 6
|
||||||
|
iconColor: Theme.surfaceText
|
||||||
|
visible: root.showPasteAction
|
||||||
|
onClicked: pasteRequested()
|
||||||
|
}
|
||||||
|
|
||||||
DankActionButton {
|
DankActionButton {
|
||||||
iconName: "push_pin"
|
iconName: "push_pin"
|
||||||
iconSize: Theme.iconSize - 6
|
iconSize: Theme.iconSize - 6
|
||||||
iconColor: (entry.pinned || hasPinnedDuplicate) ? Theme.primary : Theme.surfaceText
|
iconColor: (entry.pinned || hasPinnedDuplicate) ? Theme.primary : Theme.surfaceText
|
||||||
backgroundColor: (entry.pinned || hasPinnedDuplicate) ? Theme.primarySelected : "transparent"
|
backgroundColor: (entry.pinned || hasPinnedDuplicate) ? Theme.primarySelected : "transparent"
|
||||||
onClicked: entry.pinned ? unpinRequested() : pinRequested()
|
visible: root.showPinAction
|
||||||
|
onClicked: {
|
||||||
|
if (entry.pinned) {
|
||||||
|
unpinRequested(entry);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (pinnedDuplicateEntry) {
|
||||||
|
unpinRequested(pinnedDuplicateEntry);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pinRequested(entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DankActionButton {
|
DankActionButton {
|
||||||
iconName: "edit"
|
iconName: "edit"
|
||||||
iconSize: Theme.iconSize - 6
|
iconSize: Theme.iconSize - 6
|
||||||
iconColor: Theme.surfaceText
|
iconColor: Theme.surfaceText
|
||||||
|
visible: root.showEditAction
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (entryType === "image") {
|
if (entryType === "image") {
|
||||||
@@ -88,6 +143,7 @@ Rectangle {
|
|||||||
iconName: "close"
|
iconName: "close"
|
||||||
iconSize: Theme.iconSize - 6
|
iconSize: Theme.iconSize - 6
|
||||||
iconColor: Theme.surfaceText
|
iconColor: Theme.surfaceText
|
||||||
|
visible: root.showDeleteAction
|
||||||
onClicked: deleteRequested()
|
onClicked: deleteRequested()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -95,8 +151,8 @@ Rectangle {
|
|||||||
Item {
|
Item {
|
||||||
anchors.left: indexBadge.right
|
anchors.left: indexBadge.right
|
||||||
anchors.leftMargin: Theme.spacingM
|
anchors.leftMargin: Theme.spacingM
|
||||||
anchors.right: actionButtons.left
|
anchors.right: root.showAnyAction ? actionButtons.left : parent.right
|
||||||
anchors.rightMargin: Theme.spacingM
|
anchors.rightMargin: root.showAnyAction ? Theme.spacingM : Theme.spacingS
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
// height: contentColumn.implicitHeight
|
// height: contentColumn.implicitHeight
|
||||||
height: ClipboardConstants.itemHeight
|
height: ClipboardConstants.itemHeight
|
||||||
@@ -157,16 +213,34 @@ Rectangle {
|
|||||||
MouseArea {
|
MouseArea {
|
||||||
id: mouseArea
|
id: mouseArea
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: actionButtons.left
|
anchors.right: root.showAnyAction ? actionButtons.left : parent.right
|
||||||
anchors.rightMargin: Theme.spacingS
|
anchors.rightMargin: root.showAnyAction ? Theme.spacingS : 0
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
acceptedButtons: Qt.LeftButton
|
||||||
onPressed: mouse => {
|
onPressed: mouse => {
|
||||||
|
if (mouse.button === Qt.LeftButton) {
|
||||||
const pos = mouseArea.mapToItem(root, mouse.x, mouse.y);
|
const pos = mouseArea.mapToItem(root, mouse.x, mouse.y);
|
||||||
rippleLayer.trigger(pos.x, pos.y);
|
rippleLayer.trigger(pos.x, pos.y);
|
||||||
}
|
}
|
||||||
onClicked: copyRequested()
|
}
|
||||||
|
onClicked: {
|
||||||
|
if (SettingsData.clipboardClickToPaste) {
|
||||||
|
pasteRequested()
|
||||||
|
} else {
|
||||||
|
copyRequested()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
acceptedButtons: Qt.RightButton
|
||||||
|
onClicked: mouse => {
|
||||||
|
const scenePos = mapToItem(null, mouse.x, mouse.y);
|
||||||
|
contextMenuRequested(scenePos.x, scenePos.y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ Item {
|
|||||||
font.weight: Font.Medium
|
font.weight: Font.Medium
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Row {
|
Row {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ FocusScope {
|
|||||||
id: root
|
id: root
|
||||||
|
|
||||||
property var clearConfirmDialog: null
|
property var clearConfirmDialog: null
|
||||||
|
property var surfaceHost: null
|
||||||
|
|
||||||
property string activeTab: "recents"
|
property string activeTab: "recents"
|
||||||
property bool showKeyboardHints: false
|
property bool showKeyboardHints: false
|
||||||
@@ -16,6 +17,7 @@ FocusScope {
|
|||||||
|
|
||||||
property string mode: "history"
|
property string mode: "history"
|
||||||
property string searchText: ClipboardService.searchText
|
property string searchText: ClipboardService.searchText
|
||||||
|
property string activeFilter: SettingsData.clipboardRememberTypeFilter ? SettingsData.clipboardTypeFilter : "all"
|
||||||
|
|
||||||
readonly property bool clipboardAvailable: ClipboardService.clipboardAvailable
|
readonly property bool clipboardAvailable: ClipboardService.clipboardAvailable
|
||||||
readonly property bool wtypeAvailable: ClipboardService.wtypeAvailable
|
readonly property bool wtypeAvailable: ClipboardService.wtypeAvailable
|
||||||
@@ -31,6 +33,11 @@ FocusScope {
|
|||||||
property alias searchField: historyContent.searchField
|
property alias searchField: historyContent.searchField
|
||||||
property alias editorView: editorView
|
property alias editorView: editorView
|
||||||
property alias keyboardController: keyboardController
|
property alias keyboardController: keyboardController
|
||||||
|
readonly property alias contextMenuActive: historyContent.contextMenuActive
|
||||||
|
|
||||||
|
function closeContextMenu() {
|
||||||
|
historyContent.closeContextMenu();
|
||||||
|
}
|
||||||
|
|
||||||
signal closeRequested
|
signal closeRequested
|
||||||
signal instantCloseRequested
|
signal instantCloseRequested
|
||||||
@@ -41,7 +48,7 @@ FocusScope {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ClipboardService.selectedIndex = 0;
|
ClipboardService.selectedIndex = 0;
|
||||||
ClipboardService.keyboardNavigationActive = false;
|
ClipboardService.keyboardNavigationActive = true;
|
||||||
}
|
}
|
||||||
onPinnedCountChanged: {
|
onPinnedCountChanged: {
|
||||||
if (activeTab === "saved" && pinnedCount === 0) {
|
if (activeTab === "saved" && pinnedCount === 0) {
|
||||||
@@ -50,16 +57,60 @@ FocusScope {
|
|||||||
}
|
}
|
||||||
onSearchTextChanged: ClipboardService.searchText = searchText
|
onSearchTextChanged: ClipboardService.searchText = searchText
|
||||||
|
|
||||||
|
onActiveFilterChanged: {
|
||||||
|
ClipboardService.activeFilter = activeFilter;
|
||||||
|
ClipboardService.selectedIndex = 0;
|
||||||
|
ClipboardService.keyboardNavigationActive = true;
|
||||||
|
ClipboardService.updateFilteredModel();
|
||||||
|
if (SettingsData.clipboardRememberTypeFilter) {
|
||||||
|
SettingsData.set("clipboardTypeFilter", activeFilter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function releaseTextInputFocus() {
|
||||||
|
// Drop text-input focus before hiding the Wayland surface.
|
||||||
|
if (searchField) {
|
||||||
|
searchField.setFocus(false);
|
||||||
|
}
|
||||||
|
if (editorView) {
|
||||||
|
editorView.releaseTextInputFocus();
|
||||||
|
}
|
||||||
|
root.forceActiveFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestClose(instant) {
|
||||||
|
releaseTextInputFocus();
|
||||||
|
if (instant) {
|
||||||
|
root.instantCloseRequested();
|
||||||
|
} else {
|
||||||
|
root.closeRequested();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
closeRequested();
|
requestClose(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
function pasteSelected() {
|
function pasteSelected() {
|
||||||
ClipboardService.pasteSelected(() => root.instantCloseRequested());
|
const entry = selectedEntry();
|
||||||
|
if (!entry)
|
||||||
|
return;
|
||||||
|
ClipboardService.pasteEntry(entry, () => root.requestClose(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
function pasteEntry(entry) {
|
||||||
|
ClipboardService.pasteEntry(entry, () => root.requestClose(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
function copyEntry(entry) {
|
function copyEntry(entry) {
|
||||||
ClipboardService.copyEntry(entry, () => root.closeRequested());
|
ClipboardService.copyEntry(entry, () => root.requestClose(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectedEntry() {
|
||||||
|
const entries = activeTab === "saved" ? pinnedEntries : unpinnedEntries;
|
||||||
|
if (!entries || entries.length === 0 || selectedIndex < 0 || selectedIndex >= entries.length)
|
||||||
|
return null;
|
||||||
|
return entries[selectedIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteEntry(entry) {
|
function deleteEntry(entry) {
|
||||||
@@ -82,6 +133,15 @@ FocusScope {
|
|||||||
ClipboardService.clearAll();
|
ClipboardService.clearAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function confirmClearAll() {
|
||||||
|
const hasPinned = pinnedCount > 0;
|
||||||
|
const message = hasPinned ? I18n.tr("This will delete all unpinned entries. %1 pinned entries will be kept.").arg(pinnedCount) : I18n.tr("This will permanently delete all clipboard history.");
|
||||||
|
clearConfirmDialog.show(I18n.tr("Clear History?"), message, function () {
|
||||||
|
clearAll();
|
||||||
|
hide();
|
||||||
|
}, function () {});
|
||||||
|
}
|
||||||
|
|
||||||
function getEntryPreview(entry) {
|
function getEntryPreview(entry) {
|
||||||
return ClipboardService.getEntryPreview(entry);
|
return ClipboardService.getEntryPreview(entry);
|
||||||
}
|
}
|
||||||
@@ -109,6 +169,9 @@ FocusScope {
|
|||||||
function resetState() {
|
function resetState() {
|
||||||
activeImageLoads = 0;
|
activeImageLoads = 0;
|
||||||
mode = "history";
|
mode = "history";
|
||||||
|
historyContent.closeContextMenu();
|
||||||
|
historyContent.closeFilterMenu();
|
||||||
|
activeFilter = SettingsData.clipboardRememberTypeFilter ? SettingsData.clipboardTypeFilter : "all";
|
||||||
ClipboardService.reset();
|
ClipboardService.reset();
|
||||||
keyboardController.reset();
|
keyboardController.reset();
|
||||||
}
|
}
|
||||||
@@ -135,7 +198,6 @@ FocusScope {
|
|||||||
id: historyContent
|
id: historyContent
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
modal: root
|
modal: root
|
||||||
clearConfirmDialog: root.clearConfirmDialog
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
pragma ComponentBehavior: Bound
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Hyprland
|
|
||||||
import qs.Common
|
import qs.Common
|
||||||
import qs.Modals.Clipboard
|
import qs.Modals.Clipboard
|
||||||
import qs.Modals.Common
|
import qs.Modals.Common
|
||||||
@@ -12,11 +11,6 @@ DankModal {
|
|||||||
|
|
||||||
layerNamespace: "dms:clipboard"
|
layerNamespace: "dms:clipboard"
|
||||||
|
|
||||||
HyprlandFocusGrab {
|
|
||||||
windows: [clipboardHistoryModal.contentWindow]
|
|
||||||
active: clipboardHistoryModal.useHyprlandFocusGrab && clipboardHistoryModal.shouldHaveFocus
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggle() {
|
function toggle() {
|
||||||
if (shouldBeVisible) {
|
if (shouldBeVisible) {
|
||||||
hide();
|
hide();
|
||||||
@@ -51,8 +45,22 @@ DankModal {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function releaseTextInputFocus() {
|
||||||
|
contentLoader.item?.releaseTextInputFocus();
|
||||||
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
close();
|
releaseTextInputFocus();
|
||||||
|
Qt.callLater(function () {
|
||||||
|
clipboardHistoryModal.close();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function instantHide() {
|
||||||
|
releaseTextInputFocus();
|
||||||
|
Qt.callLater(function () {
|
||||||
|
clipboardHistoryModal.instantClose();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onDialogClosed: {
|
onDialogClosed: {
|
||||||
@@ -64,6 +72,7 @@ DankModal {
|
|||||||
readonly property bool clipboardAvailable: ClipboardService.clipboardAvailable
|
readonly property bool clipboardAvailable: ClipboardService.clipboardAvailable
|
||||||
|
|
||||||
visible: false
|
visible: false
|
||||||
|
keepContentLoaded: true
|
||||||
modalWidth: ClipboardConstants.modalWidth
|
modalWidth: ClipboardConstants.modalWidth
|
||||||
modalHeight: ClipboardConstants.modalHeight
|
modalHeight: ClipboardConstants.modalHeight
|
||||||
backgroundColor: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency)
|
backgroundColor: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency)
|
||||||
@@ -73,6 +82,11 @@ DankModal {
|
|||||||
enableShadow: true
|
enableShadow: true
|
||||||
closeOnEscapeKey: (contentLoader.item?.mode ?? "history") !== "editor"
|
closeOnEscapeKey: (contentLoader.item?.mode ?? "history") !== "editor"
|
||||||
onBackgroundClicked: hide()
|
onBackgroundClicked: hide()
|
||||||
|
onShouldBeVisibleChanged: {
|
||||||
|
if (!shouldBeVisible) {
|
||||||
|
releaseTextInputFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ref {
|
Ref {
|
||||||
service: ClipboardService
|
service: ClipboardService
|
||||||
@@ -82,29 +96,43 @@ DankModal {
|
|||||||
id: clearConfirmDialog
|
id: clearConfirmDialog
|
||||||
confirmButtonText: I18n.tr("Clear All")
|
confirmButtonText: I18n.tr("Clear All")
|
||||||
confirmButtonColor: Theme.primary
|
confirmButtonColor: Theme.primary
|
||||||
onVisibleChanged: {
|
onShouldBeVisibleChanged: {
|
||||||
if (visible) {
|
if (shouldBeVisible) {
|
||||||
clipboardHistoryModal.shouldHaveFocus = false;
|
clipboardHistoryModal.shouldHaveFocus = false;
|
||||||
|
selectedButton = 0;
|
||||||
|
keyboardNavigation = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Qt.callLater(function () {
|
Qt.callLater(function () {
|
||||||
if (!clipboardHistoryModal.shouldBeVisible) {
|
if (!clipboardHistoryModal.shouldBeVisible) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
clipboardHistoryModal.shouldHaveFocus = true;
|
clipboardHistoryModal.shouldHaveFocus = Qt.binding(() => clipboardHistoryModal.shouldBeVisible);
|
||||||
clipboardHistoryModal.modalFocusScope.forceActiveFocus();
|
clipboardHistoryModal.modalFocusScope.forceActiveFocus();
|
||||||
if (clipboardHistoryModal.contentLoader.item?.searchField) {
|
if (clipboardHistoryModal.contentLoader.item?.searchField) {
|
||||||
clipboardHistoryModal.contentLoader.item.searchField.forceActiveFocus();
|
clipboardHistoryModal.contentLoader.item.searchField.forceActiveFocus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Connections {
|
||||||
|
target: clearConfirmDialog.modalFocusScope.Keys
|
||||||
|
function onPressed(event) {
|
||||||
|
if (!clearConfirmDialog.shouldBeVisible || event.key !== Qt.Key_Backtab) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
clearConfirmDialog.selectedButton = clearConfirmDialog.selectedButton === -1 ? 1 : (clearConfirmDialog.selectedButton - 1 + 2) % 2;
|
||||||
|
clearConfirmDialog.keyboardNavigation = true;
|
||||||
|
event.accepted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
content: Component {
|
content: Component {
|
||||||
ClipboardHistoryContent {
|
ClipboardHistoryContent {
|
||||||
|
surfaceHost: clipboardHistoryModal
|
||||||
clearConfirmDialog: clearConfirmDialog
|
clearConfirmDialog: clearConfirmDialog
|
||||||
onCloseRequested: clipboardHistoryModal.hide()
|
onCloseRequested: clipboardHistoryModal.hide()
|
||||||
onInstantCloseRequested: clipboardHistoryModal.instantClose()
|
onInstantCloseRequested: clipboardHistoryModal.instantHide()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
pragma ComponentBehavior: Bound
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
import Quickshell.Wayland
|
||||||
import qs.Common
|
import qs.Common
|
||||||
import qs.Modals.Clipboard
|
import qs.Modals.Clipboard
|
||||||
import qs.Modals.Common
|
import qs.Modals.Common
|
||||||
@@ -36,8 +37,15 @@ DankPopout {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function releaseTextInputFocus() {
|
||||||
|
contentLoader.item?.releaseTextInputFocus();
|
||||||
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
close();
|
releaseTextInputFocus();
|
||||||
|
Qt.callLater(function () {
|
||||||
|
root.close();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearAll() {
|
function clearAll() {
|
||||||
@@ -56,6 +64,7 @@ DankPopout {
|
|||||||
|
|
||||||
onShouldBeVisibleChanged: {
|
onShouldBeVisibleChanged: {
|
||||||
if (!shouldBeVisible) {
|
if (!shouldBeVisible) {
|
||||||
|
releaseTextInputFocus();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (clipboardAvailable) {
|
if (clipboardAvailable) {
|
||||||
@@ -95,6 +104,35 @@ DankPopout {
|
|||||||
id: clearConfirmDialog
|
id: clearConfirmDialog
|
||||||
confirmButtonText: I18n.tr("Clear All")
|
confirmButtonText: I18n.tr("Clear All")
|
||||||
confirmButtonColor: Theme.primary
|
confirmButtonColor: Theme.primary
|
||||||
|
onShouldBeVisibleChanged: {
|
||||||
|
if (shouldBeVisible) {
|
||||||
|
root.customKeyboardFocus = WlrKeyboardFocus.None;
|
||||||
|
selectedButton = 0;
|
||||||
|
keyboardNavigation = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
root.customKeyboardFocus = null;
|
||||||
|
Qt.callLater(function () {
|
||||||
|
if (!root.shouldBeVisible || !root.contentLoader.item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
root.contentLoader.item.forceActiveFocus();
|
||||||
|
if (root.contentLoader.item.searchField) {
|
||||||
|
root.contentLoader.item.searchField.forceActiveFocus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: clearConfirmDialog.modalFocusScope.Keys
|
||||||
|
function onPressed(event) {
|
||||||
|
if (!clearConfirmDialog.shouldBeVisible || event.key !== Qt.Key_Backtab) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
clearConfirmDialog.selectedButton = clearConfirmDialog.selectedButton === -1 ? 1 : (clearConfirmDialog.selectedButton - 1 + 2) % 2;
|
||||||
|
clearConfirmDialog.keyboardNavigation = true;
|
||||||
|
event.accepted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
content: Component {
|
content: Component {
|
||||||
@@ -102,9 +140,10 @@ DankPopout {
|
|||||||
LayoutMirroring.enabled: I18n.isRtl
|
LayoutMirroring.enabled: I18n.isRtl
|
||||||
LayoutMirroring.childrenInherit: true
|
LayoutMirroring.childrenInherit: true
|
||||||
|
|
||||||
|
surfaceHost: root
|
||||||
clearConfirmDialog: clearConfirmDialog
|
clearConfirmDialog: clearConfirmDialog
|
||||||
onCloseRequested: root.hide()
|
onCloseRequested: root.hide()
|
||||||
onInstantCloseRequested: root.close()
|
onInstantCloseRequested: root.hide()
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
activeTab = root.activeTab;
|
activeTab = root.activeTab;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user