2023-06-11 10:24:15 +00:00
|
|
|
package bsp
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
|
2023-06-15 03:20:55 +00:00
|
|
|
"github.com/jezek/xgb/xproto"
|
2023-06-11 10:24:15 +00:00
|
|
|
"github.com/jezek/xgbutil"
|
2023-06-15 03:20:55 +00:00
|
|
|
"github.com/jezek/xgbutil/keybind"
|
|
|
|
|
"github.com/jezek/xgbutil/mousebind"
|
|
|
|
|
"github.com/jezek/xgbutil/xevent"
|
|
|
|
|
"tuxpa.in/a/zlog/log"
|
2023-06-11 10:24:15 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type XWM struct {
|
2023-06-11 14:11:36 +00:00
|
|
|
W *WM
|
|
|
|
|
X *xgbutil.XUtil
|
2023-06-11 10:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewXWM(w *WM, x *xgbutil.XUtil) *XWM {
|
|
|
|
|
xwm := &XWM{
|
2023-06-11 14:11:36 +00:00
|
|
|
W: w,
|
|
|
|
|
X: x,
|
2023-06-11 10:24:15 +00:00
|
|
|
}
|
|
|
|
|
return xwm
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (xwm *XWM) Start(ctx context.Context) error {
|
2023-06-15 03:20:55 +00:00
|
|
|
keybind.Initialize(xwm.X)
|
|
|
|
|
|
|
|
|
|
mousebind.Initialize(xwm.X)
|
|
|
|
|
|
|
|
|
|
captureCombos := []string{
|
|
|
|
|
"Mod4-1",
|
|
|
|
|
"Mod3-1",
|
|
|
|
|
"Mod2-1",
|
|
|
|
|
"Mod1-1",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, combo := range captureCombos {
|
|
|
|
|
err := mousebind.ButtonPressFun(func(xu *xgbutil.XUtil, event xevent.ButtonPressEvent) {
|
|
|
|
|
log.Trace().Str("name", event.String()).Str("mod", combo).Msg("press")
|
|
|
|
|
}).Connect(xwm.X, xwm.X.RootWin(), combo, false, true)
|
2023-06-11 10:24:15 +00:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2023-06-15 03:20:55 +00:00
|
|
|
err = mousebind.ButtonReleaseFun(func(xu *xgbutil.XUtil, event xevent.ButtonReleaseEvent) {
|
|
|
|
|
log.Trace().Str("name", event.String()).Str("mod", combo).Msg("depress")
|
|
|
|
|
}).Connect(xwm.X, xwm.X.RootWin(), combo, false, true)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tree, err := xproto.QueryTree(xwm.X.Conn(), xwm.X.RootWin()).Reply()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, v := range tree.Children {
|
|
|
|
|
if v == xwm.X.Dummy() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
attrs, err := xproto.GetWindowAttributes(xwm.X.Conn(), v).Reply()
|
|
|
|
|
if err != nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if attrs.MapState == xproto.MapStateUnmapped {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Trace().
|
|
|
|
|
Uint16("class", attrs.Class).
|
|
|
|
|
Msg("found existing window")
|
|
|
|
|
log.Println(attrs)
|
2023-06-11 10:24:15 +00:00
|
|
|
}
|
2023-06-15 03:20:55 +00:00
|
|
|
|
|
|
|
|
xevent.ConfigureNotifyFun(func(xu *xgbutil.XUtil, event xevent.ConfigureNotifyEvent) {
|
|
|
|
|
log.Trace().Str("name", event.String()).Msg("notify event")
|
|
|
|
|
}).Connect(xwm.X, xwm.X.RootWin())
|
|
|
|
|
xevent.Main(xwm.X)
|
|
|
|
|
|
|
|
|
|
// for {
|
|
|
|
|
// err := xwm.run(ctx)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return err
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
return nil
|
2023-06-11 10:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (xwm *XWM) run(ctx context.Context) error {
|
2023-06-15 03:20:55 +00:00
|
|
|
|
2023-06-11 10:24:15 +00:00
|
|
|
return nil
|
|
|
|
|
}
|