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  }