mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
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:
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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(),
|
||||
|
Reference in New Issue
Block a user