github.com/jmigpin/editor@v1.6.0/driver/xdriver/wmprotocols/wmp.go (about) 1 package wmprotocols 2 3 import ( 4 "encoding/binary" 5 "log" 6 7 "github.com/BurntSushi/xgb" 8 "github.com/BurntSushi/xgb/xproto" 9 "github.com/jmigpin/editor/driver/xdriver/xutil" 10 ) 11 12 // https://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8.1 13 14 type WMP struct { 15 conn *xgb.Conn 16 win xproto.Window 17 } 18 19 func NewWMP(conn *xgb.Conn, win xproto.Window) (*WMP, error) { 20 if err := xutil.LoadAtoms(conn, &atoms, false); err != nil { 21 return nil, err 22 } 23 wmp := &WMP{conn: conn, win: win} 24 if err := wmp.setupWindowProperty(); err != nil { 25 return nil, err 26 } 27 return wmp, nil 28 } 29 func (wmp *WMP) setupWindowProperty() error { 30 data := make([]byte, 4) 31 binary.LittleEndian.PutUint32(data, uint32(atoms.WM_DELETE_WINDOW)) 32 cookie := xproto.ChangePropertyChecked( 33 wmp.conn, 34 xproto.PropModeAppend, // mode 35 wmp.win, 36 atoms.WM_PROTOCOLS, // property 37 xproto.AtomAtom, // type 38 32, // format: xprop says that it should be 32 bit 39 uint32(len(data))/4, 40 data) 41 return cookie.Check() 42 } 43 func (wmp *WMP) OnClientMessageDeleteWindow(ev *xproto.ClientMessageEvent) (deleteWindow bool) { 44 if ev.Type != atoms.WM_PROTOCOLS { 45 return false 46 } 47 if ev.Format != 32 { 48 log.Printf("ev format not 32: %+v", ev) 49 return false 50 } 51 data := ev.Data.Data32 52 for _, e := range data { 53 atom := xproto.Atom(e) 54 if atom == atoms.WM_DELETE_WINDOW { 55 return true 56 } 57 } 58 return false 59 } 60 61 var atoms struct { 62 WM_PROTOCOLS xproto.Atom 63 WM_DELETE_WINDOW xproto.Atom 64 }