package displayconfig import ( "context" "fmt" "edge-infra.dev/pkg/sds/display/displaymanager/manager" "edge-infra.dev/pkg/sds/display/displaymanager/reader" v2 "edge-infra.dev/pkg/sds/display/k8s/apis/v2" ) var readerOpts = []reader.Option{ reader.WithDefaultLayout(), reader.WithIgnoreRelativeInputDevices(), reader.WithIgnoreSupportedResolutions(), } // Apply applies the custom display configuration defined by customDisplayConfig. // // The current display configuration is read from the node. This is merged with the default configuration, // then merged with the custom configuration. If the custom configuration is nil, the configuration // remains as default. // // The resulting DisplayConfig is applied to the node and returned. func Apply(ctx context.Context, customDisplayConfig *v2.DisplayConfig, displayManager manager.DisplayManager) (*v2.DisplayConfig, error) { // wait for display manager to become ready before applying configuration if err := displayManager.Wait(ctx); err != nil { return nil, fmt.Errorf("display manager did not become ready: %w", err) } // read displays and input devices from node displayConfig, inputDevices, err := displayManager.Read(ctx, readerOpts...) if err != nil { return nil, fmt.Errorf("unable to read display configuration from node: %w", err) } // apply the default configuration displayConfig, err = displayConfig.GenerateDefaultDisplayConfig(v2.Defaults, inputDevices) if err != nil { return nil, fmt.Errorf("unable to apply defaults to node display configuration: %w", err) } // merge in custom DisplayConfig (does nothing when nil) displayConfig, err = displayConfig.Merge(customDisplayConfig) if err != nil { return nil, fmt.Errorf("unable to merge node display configuration with NodeDisplayConfig: %w", err) } // apply the node display configuration displayConfig, err = displayManager.Apply(ctx, displayConfig) if err != nil { return nil, fmt.Errorf("unable to apply node display configuration: %w", err) } return displayConfig, nil }