Improve XWayland detection
This commit is contained in:
parent
2fc5d0825b
commit
681d9c4f1d
2 changed files with 32 additions and 9 deletions
|
|
@ -21,16 +21,19 @@
|
||||||
|
|
||||||
package inputcontrol
|
package inputcontrol
|
||||||
|
|
||||||
// #cgo LDFLAGS: -lX11 -lXtst
|
// #cgo LDFLAGS: -lX11 -lXrandr -lXtst
|
||||||
// #include <X11/Xlib.h>
|
// #include <X11/Xlib.h>
|
||||||
// #include <X11/Intrinsic.h>
|
// #include <X11/Intrinsic.h>
|
||||||
|
// #include <X11/extensions/Xrandr.h>
|
||||||
// #include <X11/extensions/XTest.h>
|
// #include <X11/extensions/XTest.h>
|
||||||
// #include <X11/XKBlib.h>
|
// #include <X11/XKBlib.h>
|
||||||
|
// Window MacroDefaultRootWindow(Display *dpy) {
|
||||||
|
// return DefaultRootWindow(dpy);
|
||||||
|
// }
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"strings"
|
||||||
"os"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
@ -55,17 +58,35 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitX11Controller() (Controller, error) {
|
func InitX11Controller() (Controller, error) {
|
||||||
sessionType := os.Getenv("XDG_SESSION_TYPE")
|
|
||||||
if sessionType != "" && sessionType != "x11" {
|
|
||||||
return nil, UnsupportedPlatformError{errors.New(fmt.Sprintf(
|
|
||||||
"unsupported session type '%v'", sessionType))}
|
|
||||||
}
|
|
||||||
display := C.XOpenDisplay(nil)
|
display := C.XOpenDisplay(nil)
|
||||||
if display == nil {
|
if display == nil {
|
||||||
return nil, UnsupportedPlatformError{
|
return nil, UnsupportedPlatformError{
|
||||||
errors.New("failed to connect to X server")}
|
errors.New("failed to connect to X server")}
|
||||||
}
|
}
|
||||||
return &x11Controller{display: display}, nil
|
p := &x11Controller{display: display}
|
||||||
|
if p.xIsXwayland() {
|
||||||
|
p.Close()
|
||||||
|
return nil, UnsupportedPlatformError{
|
||||||
|
errors.New("X server is Xwayland")}
|
||||||
|
}
|
||||||
|
return p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *x11Controller) xIsXwayland() bool {
|
||||||
|
resources := C.XRRGetScreenResourcesCurrent(p.display, C.MacroDefaultRootWindow(p.display))
|
||||||
|
if resources == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
defer C.XRRFreeScreenResources(resources)
|
||||||
|
if resources.noutput < 1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
output := C.XRRGetOutputInfo(p.display, resources, *resources.outputs)
|
||||||
|
if output == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
defer C.XRRFreeOutputInfo(output)
|
||||||
|
return strings.HasPrefix(C.GoString(output.name), "XWAYLAND")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *x11Controller) Close() error {
|
func (p *x11Controller) Close() error {
|
||||||
|
|
|
||||||
|
|
@ -40,9 +40,11 @@ parts:
|
||||||
- gcc
|
- gcc
|
||||||
- libc6-dev
|
- libc6-dev
|
||||||
- libxt-dev
|
- libxt-dev
|
||||||
|
- libxrandr-dev
|
||||||
- libxtst-dev
|
- libxtst-dev
|
||||||
stage-packages:
|
stage-packages:
|
||||||
- libxt6
|
- libxt6
|
||||||
|
- libxrandr2
|
||||||
- libxtst6
|
- libxtst6
|
||||||
override-pull: |
|
override-pull: |
|
||||||
snapcraftctl pull
|
snapcraftctl pull
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue