Modifications to how claims are closed

This commit is contained in:
Sasha Koshka 2024-07-11 04:14:16 -04:00
parent 54ad3ebee6
commit f4fadc0d3b

View File

@ -25,7 +25,7 @@ type Claim struct {
data Data data Data
selection xproto.Atom selection xproto.Atom
timestamp xproto.Timestamp timestamp xproto.Timestamp
active bool open bool
requests map[xproto.Atom] claimRequest requests map[xproto.Atom] claimRequest
} }
@ -64,7 +64,7 @@ func NewClaim (window *xwindow.Window, selection xproto.Atom, data Data, timesta
} }
return &Claim { return &Claim {
active: true, open: true,
window: window, window: window,
data: data, data: data,
selection: selection, selection: selection,
@ -131,6 +131,10 @@ func (claim *Claim) HandleSelectionRequest (
connection *xgbutil.XUtil, connection *xgbutil.XUtil,
event xevent.SelectionRequestEvent, event xevent.SelectionRequestEvent,
) { ) {
// do not fulfill *new* selection requests after the claim has been
// relinquished
if !claim.open { return }
// Follow: // Follow:
// https://tronche.com/gui/x/icccm/sec-2.html#s-2.2 // https://tronche.com/gui/x/icccm/sec-2.html#s-2.2
@ -279,15 +283,28 @@ func (claim *Claim) HandleSelectionClear (
// is, before it receives notification that the requestor has received // is, before it receives notification that the requestor has received
// all the data), it must continue to service the ongoing transfer until // all the data), it must continue to service the ongoing transfer until
// it is complete. // it is complete.
claim.active = false claim.open = false
}
// Open returns false if the claim has been relinquished, either from recieving
// a SelectionClear event or with the Close method.
func (claim *Claim) Open () bool {
return claim.open
}
// Active returns true if requests are currently being fulfilled. While this is
// true, the claim should still be forwarded events regardless if it is closed
// or not. It is safe to forward the same event to multiple claims.
func (claim *Claim) Active () bool {
return len(claim.requests) > 0
} }
// Close voluntarily relinquishes the selection claim. This will inform the X // Close voluntarily relinquishes the selection claim. This will inform the X
// server that the selection is being voluntarily given up, and cause the claim // server that the selection is being voluntarily given up, and cause the claim
// to stop responding to events. // to stop fulfilling new requests.
func (claim *Claim) Close () error { func (claim *Claim) Close () error {
if !claim.active { return nil } if !claim.open { return nil }
claim.active = false claim.open = false
// To relinquish ownership of a selection voluntarily, a client should // To relinquish ownership of a selection voluntarily, a client should
// execute a SetSelectionOwner request for that selection atom, with // execute a SetSelectionOwner request for that selection atom, with