|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T x
Length: 3910 (0xf46)
Types: TextFile
Names: »x_input.clu«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/CLUlib/x_input.clu«
% Copyright Barbara Liskov 1985
x_input = cluster is init, set_squish,
enq, deq, edeq, mdeq, wdeq,
pending, epending, mpending, wpending,
empty_event
elist = array[event]
i2w = _cvt[int, x_window]
rep = null
own have: bool := false
own free: elist
own queue: elist
own squish: bool
init = proc ()
free := elist$new()
queue := elist$new()
squish := true
have := true
end init
set_squish = proc (flag: bool)
squish := flag
end set_squish
enq = proc (e: event)
if squish cand e.kind = MouseMoved
then ne: event := elist$top(queue)
if ne.kind = MouseMoved cand w2i(ne.win) = w2i(e.win)
then event$r_gets_r(ne, e)
return
end
end except when bounds: end
ne: event := empty_event()
event$r_gets_r(ne, e)
elist$addh(queue, ne)
end enq
deq = proc (e: event)
while elist$empty(queue) do
x_buf$events(true)
end
oe: event := elist$reml(queue)
event$r_gets_r(e, oe)
elist$addh(free, oe)
end deq
edeq = proc (kind: int, e: event)
while true do
for i: int in elist$indexes(queue) do
oe: event := queue[i]
if oe.kind = kind
then event$r_gets_r(e, oe)
elist$addh(free, oe)
while true do
queue[i] := queue[i + 1]
i := i + 1
end except when bounds: end
elist$remh(queue)
return
end
end
x_buf$events(true)
end
end edeq
mdeq = proc (kinds: int, e: event)
while true do
for i: int in elist$indexes(queue) do
oe: event := queue[i]
if i_and(oe.kind, kinds) ~= 0
then event$r_gets_r(e, oe)
elist$addh(free, oe)
while true do
queue[i] := queue[i + 1]
i := i + 1
end except when bounds: end
elist$remh(queue)
return
end
end
x_buf$events(true)
end
end mdeq
wdeq = proc (w: x_window, kinds: int, e: event)
while true do
for i: int in elist$indexes(queue) do
oe: event := queue[i]
if w2i(oe.win) = w2i(w) cand i_and(oe.kind, kinds) ~= 0
then event$r_gets_r(e, oe)
elist$addh(free, oe)
while true do
queue[i] := queue[i + 1]
i := i + 1
end except when bounds: end
elist$remh(queue)
return
end
end
x_buf$events(true)
end
end wdeq
pending = proc () returns (bool)
if ~elist$empty(queue)
then return(true) end
x_buf$events(false)
return(~elist$empty(queue))
end pending
epending = proc (kind: int) returns (bool)
for e: event in elist$elements(queue) do
if e.kind = kind
then return(true) end
end
i: int := elist$high(queue)
x_buf$events(false)
while true do
i := i + 1
if queue[i].kind = kind
then return(true) end
end except when bounds: end
return(false)
end epending
mpending = proc (kinds: int) returns (bool)
for e: event in elist$elements(queue) do
if i_and(e.kind, kinds) ~= 0
then return(true) end
end
i: int := elist$high(queue)
x_buf$events(false)
while true do
i := i + 1
if i_and(queue[i].kind, kinds) ~= 0
then return(true) end
end except when bounds: end
return(false)
end mpending
wpending = proc (w: x_window, kinds: int) returns (bool)
for e: event in elist$elements(queue) do
if w2i(e.win) = w2i(w) cand i_and(e.kind, kinds) ~= 0
then return(true) end
end
i: int := elist$high(queue)
x_buf$events(false)
while true do
i := i + 1
e: event := queue[i]
if w2i(e.win) = w2i(w) cand i_and(e.kind, kinds) ~= 0
then return(true) end
end except when bounds: end
return(false)
end wpending
empty_event = proc () returns (event)
if have
then return(elist$remh(free))
end except when bounds: end
return(event${kind: 0,
value: 0,
mask: 0,
win: i2w(0),
sub: i2w(0),
x: 0,
y: 0,
x0: 0,
y0: 0,
time: 0})
end empty_event
end x_input