Skip to content

Commit 771c79c

Browse files
simple change
1 parent a3825bd commit 771c79c

1 file changed

Lines changed: 38 additions & 14 deletions

File tree

wm/window_manager.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"os/user"
1212
"path/filepath"
1313
"strconv"
14-
14+
"bytes"
1515
"github.com/BurntSushi/xgb"
1616
"github.com/BurntSushi/xgb/xproto"
1717
"github.com/BurntSushi/xgbutil"
@@ -1316,23 +1316,44 @@ func (wm *WindowManager) OnLeaveNotify(event xproto.LeaveNotifyEvent){
13161316
}
13171317
}
13181318

1319+
func setFrameWindowType(conn *xgb.Conn, win xproto.Window) {
1320+
atomWindowType, _ := xproto.InternAtom(conn, true, uint16(len("_NET_WM_WINDOW_TYPE")), "_NET_WM_WINDOW_TYPE").Reply()
1321+
atomNormal, _ := xproto.InternAtom(conn, true, uint16(len("_NET_WM_WINDOW_TYPE_NORMAL")), "_NET_WM_WINDOW_TYPE_NORMAL").Reply()
1322+
1323+
xproto.ChangeProperty(conn,
1324+
xproto.PropModeReplace,
1325+
win,
1326+
atomWindowType.Atom,
1327+
xproto.AtomAtom,
1328+
32,
1329+
1,
1330+
[]byte{
1331+
byte(atomNormal.Atom),
1332+
byte(atomNormal.Atom >> 8),
1333+
byte(atomNormal.Atom >> 16),
1334+
byte(atomNormal.Atom >> 24),
1335+
},
1336+
)
1337+
}
1338+
13191339
func (wm *WindowManager) setNetActiveWindow(win xproto.Window) {
13201340
atomActiveWin, _ := xproto.InternAtom(wm.conn, true, uint16(len("_NET_ACTIVE_WINDOW")), "_NET_ACTIVE_WINDOW").Reply()
13211341

1322-
ev := xproto.ClientMessageEvent{
1323-
Format: 32,
1324-
Window: win,
1325-
Type: atomActiveWin.Atom,
1326-
Data: xproto.ClientMessageDataUnionData32New([]uint32{
1327-
1, // Source indication (1 = application)
1328-
xproto.TimeCurrentTime, // Timestamp
1329-
0, 0, 0, // Unused
1330-
}),
1331-
}
1342+
// Convert uint32 to []byte
1343+
buf := new(bytes.Buffer)
1344+
binary.Write(buf, binary.LittleEndian, win)
13321345

1333-
mask := xproto.EventMaskSubstructureRedirect | xproto.EventMaskSubstructureNotify
1334-
xproto.SendEvent(wm.conn, false, wm.root, uint32(mask), string(ev.Bytes()))
1346+
xproto.ChangeProperty(wm.conn,
1347+
xproto.PropModeReplace,
1348+
wm.root, // Set on the root window
1349+
atomActiveWin.Atom, // _NET_ACTIVE_WINDOW
1350+
xproto.AtomWindow, // Type: WINDOW
1351+
32, // Format: 32-bit
1352+
1, // Only one window
1353+
buf.Bytes(), // Here's the []byte version
1354+
)
13351355
}
1356+
13361357
func (wm *WindowManager) OnEnterNotify(event xproto.EnterNotifyEvent){
13371358
// set focus when we enter a window and change border color
13381359
err:=xproto.SetInputFocusChecked(wm.conn, xproto.InputFocusPointerRoot, event.Event, xproto.TimeCurrentTime).Check()
@@ -1349,7 +1370,7 @@ func (wm *WindowManager) OnEnterNotify(event xproto.EnterNotifyEvent){
13491370
if err!=nil{
13501371
slog.Error("couldn't set focus on window", "error:", err)
13511372
}
1352-
wm.setNetActiveWindow(event.Event)
1373+
wm.setNetActiveWindow(wm.currWorkspace.clients[event.Event])
13531374
}
13541375

13551376
func (wm *WindowManager) findWindow(window xproto.Window) (bool,int, xproto.Window){
@@ -1677,6 +1698,9 @@ func (wm *WindowManager) Frame(w xproto.Window, createdBeforeWM bool){
16771698
if err != nil {
16781699
slog.Error("failed to set event mask on window", "error:", err)
16791700
}
1701+
1702+
setFrameWindowType(wm.conn, frameId)
1703+
16801704
// map the frame
16811705
err = xproto.MapWindowChecked(
16821706
wm.conn,

0 commit comments

Comments
 (0)