@@ -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+
13191339func (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+
13361357func (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
13551376func (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