Custom sizes with XRandR (#25)

* xserver dummy with RandR.

* update.

* remove screen configurations from xorg.

* screen size cannot be nil anymore.

* use predefined screen configurations.

* use screen configurations.

* fix error.

* remove comment.
This commit is contained in:
Miroslav Šedivý
2023-02-14 21:18:47 +01:00
committed by GitHub
parent bfabee12e2
commit f8b128e1e9
14 changed files with 666 additions and 107 deletions

View File

@ -20,12 +20,11 @@ type ScreenConfigurationPayload struct {
func (h *RoomHandler) screenConfiguration(w http.ResponseWriter, r *http.Request) error {
size := h.desktop.GetScreenSize()
if size == nil {
return utils.HttpInternalServerError().WithInternalMsg("unable to get screen configuration")
}
payload := ScreenConfigurationPayload(*size)
return utils.HttpSuccess(w, payload)
return utils.HttpSuccess(w, ScreenConfigurationPayload{
Width: size.Width,
Height: size.Height,
Rate: size.Rate,
})
}
func (h *RoomHandler) screenConfigurationChange(w http.ResponseWriter, r *http.Request) error {
@ -34,29 +33,36 @@ func (h *RoomHandler) screenConfigurationChange(w http.ResponseWriter, r *http.R
return err
}
size := types.ScreenSize(*data)
if err := h.desktop.SetScreenSize(size); err != nil {
size, err := h.desktop.SetScreenSize(types.ScreenSize{
Width: data.Width,
Height: data.Height,
Rate: data.Rate,
})
if err != nil {
return utils.HttpUnprocessableEntity("cannot set screen size").WithInternalErr(err)
}
payload := message.ScreenSize(*data)
h.sessions.Broadcast(event.SCREEN_UPDATED, payload)
h.sessions.Broadcast(event.SCREEN_UPDATED, message.ScreenSize{
Width: size.Width,
Height: size.Height,
Rate: size.Rate,
})
return utils.HttpSuccess(w, data)
}
// TODO: remove.
func (h *RoomHandler) screenConfigurationsList(w http.ResponseWriter, r *http.Request) error {
list := []ScreenConfigurationPayload{}
configurations := h.desktop.ScreenConfigurations()
ScreenConfigurations := h.desktop.ScreenConfigurations()
for _, size := range ScreenConfigurations {
for _, fps := range size.Rates {
list = append(list, ScreenConfigurationPayload{
Width: size.Width,
Height: size.Height,
Rate: fps,
})
}
list := make([]ScreenConfigurationPayload, 0, len(configurations))
for _, conf := range configurations {
list = append(list, ScreenConfigurationPayload{
Width: conf.Width,
Height: conf.Height,
Rate: conf.Rate,
})
}
return utils.HttpSuccess(w, list)

View File

@ -44,7 +44,7 @@ func New(desktop types.DesktopManager, config *config.Capture) *CaptureManagerCt
}
screen := desktop.GetScreenSize()
pipeline, err := pipelineConf.GetPipeline(*screen)
pipeline, err := pipelineConf.GetPipeline(screen)
if err != nil {
return "", err
}

View File

@ -40,9 +40,9 @@ func (manager *DesktopManagerCtx) Start() {
xorg.GetScreenConfigurations()
err := xorg.ChangeScreenSize(manager.config.ScreenWidth, manager.config.ScreenHeight, manager.config.ScreenRate)
width, height, rate, err := xorg.ChangeScreenSize(manager.config.ScreenWidth, manager.config.ScreenHeight, manager.config.ScreenRate)
manager.logger.Err(err).
Str("screen_size", fmt.Sprintf("%dx%d@%d", manager.config.ScreenWidth, manager.config.ScreenHeight, manager.config.ScreenRate)).
Str("screen_size", fmt.Sprintf("%dx%d@%d", width, height, rate)).
Msgf("setting initial screen size")
go xevent.EventLoop(manager.config.Display)

View File

@ -66,11 +66,26 @@ func (manager *DesktopManagerCtx) ResetKeys() {
xorg.ResetKeys()
}
func (manager *DesktopManagerCtx) ScreenConfigurations() map[int]types.ScreenConfiguration {
return xorg.ScreenConfigurations
func (manager *DesktopManagerCtx) ScreenConfigurations() []types.ScreenSize {
var configs []types.ScreenSize
for _, size := range xorg.ScreenConfigurations {
for _, fps := range size.Rates {
// filter out all irrelevant rates
if fps > 60 || (fps > 30 && fps%10 != 0) {
continue
}
configs = append(configs, types.ScreenSize{
Width: size.Width,
Height: size.Height,
Rate: fps,
})
}
}
return configs
}
func (manager *DesktopManagerCtx) SetScreenSize(size types.ScreenSize) error {
func (manager *DesktopManagerCtx) SetScreenSize(size types.ScreenSize) (types.ScreenSize, error) {
mu.Lock()
manager.emmiter.Emit("before_screen_size_change")
@ -79,10 +94,15 @@ func (manager *DesktopManagerCtx) SetScreenSize(size types.ScreenSize) error {
mu.Unlock()
}()
return xorg.ChangeScreenSize(size.Width, size.Height, size.Rate)
w, h, r, err := xorg.ChangeScreenSize(size.Width, size.Height, size.Rate)
return types.ScreenSize{
Width: w,
Height: h,
Rate: r,
}, err
}
func (manager *DesktopManagerCtx) GetScreenSize() *types.ScreenSize {
func (manager *DesktopManagerCtx) GetScreenSize() types.ScreenSize {
return xorg.GetScreenSize()
}

View File

@ -13,11 +13,20 @@ func (h *MessageHandlerCtx) screenSet(session types.Session, payload *message.Sc
return errors.New("is not the admin")
}
data := types.ScreenSize(*payload)
if err := h.desktop.SetScreenSize(data); err != nil {
size, err := h.desktop.SetScreenSize(types.ScreenSize{
Width: payload.Width,
Height: payload.Height,
Rate: payload.Rate,
})
if err != nil {
return err
}
h.sessions.Broadcast(event.SCREEN_UPDATED, payload)
h.sessions.Broadcast(event.SCREEN_UPDATED, message.ScreenSize{
Width: size.Width,
Height: size.Height,
Rate: size.Rate,
})
return nil
}

View File

@ -1,8 +1,6 @@
package handler
import (
"errors"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
@ -25,8 +23,10 @@ func (h *MessageHandlerCtx) systemInit(session types.Session) error {
}
size := h.desktop.GetScreenSize()
if size == nil {
return errors.New("could not get screen size")
screenSize := message.ScreenSize{
Width: size.Width,
Height: size.Height,
Rate: size.Rate,
}
sessions := map[string]message.SessionData{}
@ -44,7 +44,7 @@ func (h *MessageHandlerCtx) systemInit(session types.Session) error {
message.SystemInit{
SessionId: session.ID(),
ControlHost: controlHost,
ScreenSize: message.ScreenSize(*size),
ScreenSize: screenSize,
Sessions: sessions,
Settings: h.sessions.Settings(),
ScreencastEnabled: h.capture.Screencast().Enabled(),
@ -57,22 +57,22 @@ func (h *MessageHandlerCtx) systemInit(session types.Session) error {
}
func (h *MessageHandlerCtx) systemAdmin(session types.Session) error {
screenSizesList := []message.ScreenSize{}
for _, size := range h.desktop.ScreenConfigurations() {
for _, rate := range size.Rates {
screenSizesList = append(screenSizesList, message.ScreenSize{
Width: size.Width,
Height: size.Height,
Rate: rate,
})
}
configurations := h.desktop.ScreenConfigurations()
list := make([]message.ScreenSize, 0, len(configurations))
for _, conf := range configurations {
list = append(list, message.ScreenSize{
Width: conf.Width,
Height: conf.Height,
Rate: conf.Rate,
})
}
broadcast := h.capture.Broadcast()
session.Send(
event.SYSTEM_ADMIN,
message.SystemAdmin{
ScreenSizesList: screenSizesList,
ScreenSizesList: list, // TODO: remove
BroadcastStatus: message.BroadcastStatus{
IsActive: broadcast.Started(),
URL: broadcast.Url(),