fixes to X11 primitives
[k8lst.git] / modules / x11 / x11button.st
blobb4873868a9f78e63794b73cb7658ac1822ed178c
1 Package [
2   X11
6 X11BaseWindow subclass: X11Button [
7   | bOnClick text hovered wasPress |
9   ^new: parent at: xy size: sz text: aText [
10     | obj wid |
11     wid := parent ifNotNil: [ parent wid ].
12     wid := X11Singleton XCreateSimpleWindow: wid
13       x: xy x y: xy y
14       width: sz x height: sz y
15       bgcolor: X11Singleton blackPixel.
16     obj := self newWithId: wid.
17     self in: obj var: #text put: aText.
18     parent ifNotNil: [ parent add: obj ].
19     obj fontColor: 1.0 g: 1.0 b: 1.0.
20     ^obj
21   ]
23   ^new: parent at: xy text: aText [
24     | gw gh |
25     gw := self textWidth: aText font: nil.
26     gh := self textHeight: aText font: nil.
27     ^self new: parent at: xy size: (gw + 12) @ (gh + 8) text: aText.
28   ]
30   onClick [
31     ^bOnClick
32   ]
33   onClick: aBlock [
34     bOnClick := aBlock
35   ]
37   draw [
38     | tpt |
39     hovered ifNil: [
40       self fgColor: 0.0 g: 0.0 b: 0.7.
41     ] ifNotNil: [
42       self fgColor: 0.0 g: 0.0 b: 0.9.
43     ].
44     self fillRect: -1 @ -1 to: (self dimensions moveX: 1 y: 1).
45     tpt := 6 @ 4.
46     wasPress ifNotNil: [ tpt := tpt moveX: 1 y: 1 ].
47     self putText: tpt text: text.
48   ]
50   onX11Expose: evt [
51     ^self draw.
52   ]
54   onX11EnterNotify: evt [
55     hovered := true.
56     ^self draw.
57   ]
59   onX11LeaveNotify: evt [
60     hovered := wasPress := nil.
61     ^self draw.
62   ]
64   onX11ButtonPress: evt [
65     (evt at: 8) = 1 ifTrue: [ wasPress := true. self draw. ].
66   ]
68   onX11ButtonRelease: evt [
69     ((wasPress notNil) and: [ (evt at: 8) = 1 ]) ifTrue: [
70       wasPress := nil. self draw.
71       bOnClick ifNotNil: [ bOnClick value: self ]
72     ].
73   ]