WindowSensor.st
author claus
Tue, 28 Feb 1995 22:51:15 +0100
changeset 110 60c08d82e209
parent 103 6156d12a414d
child 115 1d93fd8c5371
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     1
"
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
     3
	      All Rights Reserved
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     4
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     5
 This software is furnished under a license and may be used
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     6
 only in accordance with the terms of that license and with the
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     8
 be provided or otherwise made available to, or used by, any
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
     9
 other person.  No title to or ownership of the software is
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
    10
 hereby transferred.
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
    11
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    12
48194c26a46c Initial revision
claus
parents:
diff changeset
    13
Object subclass:#WindowSensor
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    14
	 instanceVariableNames:'eventSemaphore damage mouseAndKeyboard 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    15
				compressMotionEvents ignoreUserInput
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    16
				buttonState exposeEventSemaphore 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    17
				catchExpose gotExpose gotOtherEvent
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
    18
				translateKeyboardEvents'
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    19
	 classVariableNames:'ControlCEnabled'
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    20
	 poolDictionaries:''
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    21
	 category:'Interface-Support'
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    22
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    23
48194c26a46c Initial revision
claus
parents:
diff changeset
    24
WindowSensor comment:'
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    25
COPYRIGHT (c) 1993 by Claus Gittinger
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    26
	      All Rights Reserved
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
    27
110
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
    28
$Header: /cvs/stx/stx/libview/WindowSensor.st,v 1.18 1995-02-28 21:51:15 claus Exp $
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
    29
'!
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    30
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    31
!WindowSensor class methodsFor:'documentation'!
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    32
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    33
copyright
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    34
"
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    35
 COPYRIGHT (c) 1993 by Claus Gittinger
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    36
	      All Rights Reserved
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    37
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    38
 This software is furnished under a license and may be used
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    39
 only in accordance with the terms of that license and with the
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    40
 inclusion of the above copyright notice.   This software may not
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    41
 be provided or otherwise made available to, or used by, any
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    42
 other person.  No title to or ownership of the software is
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    43
 hereby transferred.
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    44
"
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    45
!
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    47
version
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    48
"
110
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
    49
$Header: /cvs/stx/stx/libview/WindowSensor.st,v 1.18 1995-02-28 21:51:15 claus Exp $
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    50
"
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    51
!
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    52
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    53
documentation
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
    54
"
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    55
    Instances of this class keep track of events and damage areas for a group of 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    56
    views. All incoming expose rectangles and events (from Workstation) are 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    57
    collected here, until someone gets a chance to handle them. 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    58
    When adding an expose rectangle, WindowSensor tries to merge the rectangle 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    59
    with the list of existing damages to minimize redrawing.
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    60
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    61
    instance variables:
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    62
	eventSemaphore          <Semaphore>     the semaphore to be signalled when an event
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    63
						(or damage) arrives
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    64
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    65
	damage                  <Collection>    collection of damage events
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    66
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    67
	mouseAndKeyboard        <Collection>    collection of user events
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    68
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    69
	compressMotionEvents    <Boolean>       if true, multiple motion events are
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    70
						compressed to one event. If false, each
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    71
						event is handled individual.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    72
						(should be set to false when doing free-hand drawing)
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    73
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    74
	ignoreUserInput         <Boolean>       if true, key & button events are ignored
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    75
						(usually set to true by WindowGroup, while a
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    76
						 modalbox covers a view)
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    77
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    78
	buttonState                             the current state (currently unused)
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    79
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    80
	exposeEventSemaphore    <Semaphore>     X-special: semaphore to be signalled when
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    81
						expose event arrives after a copyArea.
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    82
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    83
	catchExpose             <Boolean>       true, while waiting for an expose event 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    84
						(after a copyArea)
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    85
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    86
	gotExpose               <Boolean>       set to true, when an expose event arrives
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    87
						(after a copyarea)
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    88
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    89
	gotOtherEvent           <Boolean>       set to true if other events arrive while
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    90
						waiting for expose (after a copyarea).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    91
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
    92
	translateKeyboardEvents <Boolean>       if true, keyboard events are translated via
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
    93
						the devices leyboardMap; if false, they
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
    94
						are reported as raw-keys. Default is true.
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
    95
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
    96
    class variables:
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    97
	ControlCEnabled         <Boolean>       if true (which is the default) Control-C
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    98
						will interrupt the process handling the
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
    99
						view.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   100
						For secure stand-alone applications,
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   101
						this can be set to false, in which case 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   102
						Control-C does NOT interrupt the process.
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   103
"
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   104
! !
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   105
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   106
!WindowSensor class methodsFor:'initialization'!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   107
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   108
initialize
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   109
    ControlCEnabled := true.
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   110
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   111
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   112
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   113
disableControlC
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   114
    "disable Control-C processing. If enabled,
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   115
     pressing CNTL-C in a view will interrupt it and bring
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   116
     its process into the debugger (actually raising signal).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   117
     Otherwise, CNTL-C is sent to the view like any other key.
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   118
    "
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   119
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   120
    ControlCEnabled := false
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   121
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   122
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   123
enableControlC
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   124
    "enable Control-C processing. If enabled,
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   125
     pressing CNTL-C in a view will interrupt it and bring
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   126
     its process into the debugger (actually raising signal).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   127
     Otherwise, CNTL-C is sent to the view like any other key.
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   128
    "
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   129
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   130
    ControlCEnabled := true
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   131
! !
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   132
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   133
!WindowSensor class methodsFor:'instance creation'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   134
48194c26a46c Initial revision
claus
parents:
diff changeset
   135
new
48194c26a46c Initial revision
claus
parents:
diff changeset
   136
    ^ self basicNew initialize
48194c26a46c Initial revision
claus
parents:
diff changeset
   137
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   138
48194c26a46c Initial revision
claus
parents:
diff changeset
   139
!WindowSensor methodsFor:'damage'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   140
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   141
addDamage: aRectangle view:aView
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   142
    "Add aRectangle to the damage list.
48194c26a46c Initial revision
claus
parents:
diff changeset
   143
     We try to merge incoming rectangles with the existing damage by discarding
48194c26a46c Initial revision
claus
parents:
diff changeset
   144
     incoming rectangles which are contained in the existing damage or replacing
48194c26a46c Initial revision
claus
parents:
diff changeset
   145
     any existing damage rectangle with incoming rectangles that completely contain it.
48194c26a46c Initial revision
claus
parents:
diff changeset
   146
     There could be much more optimization here (for example joining rectangles)..."
48194c26a46c Initial revision
claus
parents:
diff changeset
   147
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   148
    |count temp index newEvent 
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   149
     sz "{ Class: SmallInteger }" |
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   150
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   151
    sz := damage size.
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   152
    sz == 0 ifTrue: [
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   153
	newEvent := WindowEvent damageFor:aView rectangle:aRectangle.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   154
	damage := OrderedCollection with:newEvent.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   155
	^ self
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   156
    ].
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   157
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   158
    "
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   159
     first look, if this rectangle is already in the expose list;
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   160
     if so, dont add to queue
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   161
    "
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   162
    damage do: [:aDamage | 
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   163
	aDamage notNil ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   164
	    aDamage isDamage ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   165
		aDamage view == aView ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   166
		    ((aDamage rectangle) contains:aRectangle) ifTrue: [^self]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   167
		]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   168
	    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   169
	].
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   170
    ].
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   171
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   172
    "
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   173
     then look, if new rectangle contains any in the expose list;
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   174
     if so, remove the old damage
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   175
    "
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   176
    count := 0.
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   177
    1 to:sz do:[:i |
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   178
	|aDamage|
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   179
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   180
	aDamage := damage at:i.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   181
	aDamage notNil ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   182
	    aDamage isDamage ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   183
		(aDamage view) == aView ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   184
		    (aRectangle contains:(aDamage rectangle)) ifTrue: [ 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   185
			damage at:i put:nil.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   186
			count := count + 1
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   187
		    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   188
		]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   189
	    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   190
	]
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   191
    ].
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   192
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   193
    count > 10 ifTrue: [
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   194
	temp := OrderedCollection new:(sz - count + 1).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   195
	index := 1.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   196
	damage do:[:aDamage |
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   197
	    aDamage notNil ifTrue: [
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   198
		temp add: aDamage.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   199
	    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   200
	].
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   201
	damage := temp
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   202
    ].
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   203
    newEvent := WindowEvent damageFor:aView rectangle:aRectangle.
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   204
    damage add:newEvent.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   205
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   206
48194c26a46c Initial revision
claus
parents:
diff changeset
   207
nextDamage
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   208
    "retrieve the next damage rectangle or nil, if there is none"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   209
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   210
    |d|
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   211
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   212
    [d isNil] whileTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   213
	damage size == 0 ifTrue:[^ nil].
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   214
	d := damage removeFirst.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   215
    ].
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   216
    ^ d
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   217
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   218
48194c26a46c Initial revision
claus
parents:
diff changeset
   219
nextEvent
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   220
    "retrieve the next event or nil, if there is none"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   221
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   222
    |e|
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   223
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   224
    [e isNil] whileTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   225
	mouseAndKeyboard size == 0 ifTrue:[^ nil].
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   226
	e := mouseAndKeyboard removeFirst.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   227
    ].
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   228
    ^ e
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   229
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   230
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   231
!WindowSensor methodsFor:'special'!
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   232
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   233
catchExpose
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   234
    "start catching noExpose events (must be done BEFORE a bitblt,
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   235
     to prepare for the exposeEventSemaphore to be signalled when 
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   236
     the noExpose event arrives)."
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   237
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   238
    gotExpose := false.
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   239
    gotOtherEvent := false.
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   240
    catchExpose := true.
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   241
    exposeEventSemaphore := Semaphore new.
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   242
!
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   243
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   244
waitForExposeFor:aView
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   245
    "wait until a noExpose arrives (after a bitblt)"
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   246
90
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   247
    Processor activeProcessIsSystemProcess ifTrue:[
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   248
	"
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   249
	 cannot really suspend, if its a systemProcess
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   250
	"
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   251
	[gotExpose] whileFalse:[
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   252
	    aView device dispatchExposeEventFor:aView id.
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   253
	    Processor yield.
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   254
	]
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   255
    ] ifFalse:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   256
	[gotExpose] whileFalse:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   257
	    "
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   258
	     just in case we have a (network or software) problem ...
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   259
	     explanation: it may happen, that an expose event is totally
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   260
	     lost - for example, if the network breaks down.
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   261
	     To not block forever, we wait with a timeout, to get out of here
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   262
	     if the event does not arrive after 15 seconds.
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   263
	    "
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   264
	    (exposeEventSemaphore waitWithTimeout:5) ifFalse:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   265
		aView device synchronizeOutput.
90
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   266
		'WSENSOR: late expose event' errorPrintNL.
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   267
		(exposeEventSemaphore waitWithTimeout:10) ifFalse:[
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   268
		    'WSENSOR: lost expose event again - ignore' errorPrintNL.
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   269
		].
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   270
		"
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   271
		 you can put a comment around the following line, if you dont
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   272
		 like the message ...
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   273
		"
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   274
		gotExpose := true.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   275
		^ self
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   276
	    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   277
	].
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   278
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   279
	"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   280
	 other incoming events have been ignored during the wait.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   281
	 Now handle those ...
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   282
	"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   283
	gotOtherEvent ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   284
	    eventSemaphore signal
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   285
	].
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   286
    ].
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   287
    catchExpose := false
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   288
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   289
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   290
flushUserEvents
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   291
    "throw away all pending user events"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   292
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   293
    (mouseAndKeyboard isNil or:[mouseAndKeyboard size > 0]) ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   294
	mouseAndKeyboard := OrderedCollection new
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   295
    ].
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   296
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   297
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   298
flushExposeEvents
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   299
    "throw away all pending expose events; this
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   300
     can be done after a full redraw (or in views, which are
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   301
     doing full redraws anly)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   302
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   303
    (damage isNil or:[damage size > 0]) ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   304
	damage := OrderedCollection new
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   305
    ].
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   306
!
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   307
78
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   308
flushExposeEventsFor:aView
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   309
    "throw away all pending expose events for aView; 
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   310
     this can be done after a full redraw 
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   311
     (or in views, which are always doing full redraws -
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   312
      instead of drawing the clip-area only)"
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   313
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   314
    damage notNil ifTrue:[
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   315
	1 to:damage size do:[:index |
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   316
	    |aDamage|
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   317
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   318
	    aDamage := damage at:index.
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   319
	    aDamage notNil ifTrue:[
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   320
		aDamage view == aView ifTrue:[
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   321
		    damage at:index put:nil
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   322
		]
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   323
	    ]
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   324
	]
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   325
    ].
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   326
!
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   327
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   328
flushUserEventsFor:aView
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   329
    "throw away all pending user events for aView" 
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   330
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   331
    mouseAndKeyboard notNil ifTrue:[
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   332
	1 to:mouseAndKeyboard size do:[:i |
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   333
	    |anEvent|
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   334
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   335
	    anEvent := mouseAndKeyboard at:i.
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   336
	    anEvent notNil ifTrue:[
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   337
		anEvent view == aView ifTrue:[
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   338
		    mouseAndKeyboard at:i put:nil
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   339
		]
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   340
	    ]
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   341
	]
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   342
    ].
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   343
!
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   344
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   345
flushEventsFor:aView
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   346
    "throw away all events for aView"
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   347
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   348
    self flushExposeEventsFor:aView.
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   349
    self flushUserEventsFor:aView.
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   350
!
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   351
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   352
pushUserEvent:anEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   353
    "manually put an event into the queue - this allows
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   354
     simulation of events (implementation of recorders & playback)."
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   355
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   356
    mouseAndKeyboard addLast:anEvent.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   357
    self notifyEventArrival
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   358
!
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   359
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   360
pushUserEvent:aSelector for:aView withArguments:arguments
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   361
    "manually put an event into the queue - this allows
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   362
     simulation of events (implementation of recorders & playback)."
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   363
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   364
    self pushEvent:(WindowEvent 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   365
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   366
		     type:aSelector
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   367
		     arguments:arguments).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   368
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   369
    "
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   370
     |b|
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   371
     b := Button label:'test'.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   372
     b open.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   373
     (Delay forSeconds:5) wait.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   374
     b sensor pushEvent:#pointerEnter:x:y: for:b withArguments:#(0 1 1).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   375
     (Delay forSeconds:1) wait.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   376
     b sensor pushEvent:#buttonPress:x:y: for:b withArguments:#(1 1 1).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   377
     (Delay forSeconds:2) wait.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   378
     b sensor pushEvent:#buttonRelease:x:y: for:b withArguments:#(1 1 1).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   379
     (Delay forSeconds:1) wait.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   380
     b sensor pushEvent:#pointerLeave: for:b withArguments:#(0).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   381
    "
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   382
!
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   383
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   384
forwardKeyEventsTo:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   385
    "remove all keyboard events and send them to aSensor instead"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   386
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   387
"/ 'fwd' printNL.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   388
    1 to:mouseAndKeyboard size do:[:i |
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   389
	|anEvent|
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   390
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   391
	anEvent := mouseAndKeyboard at:i.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   392
	anEvent notNil ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   393
	    anEvent isKeyEvent ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   394
		anEvent view:aView.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   395
		aView sensor pushUserEvent:anEvent.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   396
"/ anEvent type printNL.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   397
		mouseAndKeyboard at:i put:nil
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   398
	    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   399
	]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   400
    ].
26
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   401
! !
ac9f66dc8f53 *** empty log message ***
claus
parents: 19
diff changeset
   402
90
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   403
!WindowSensor methodsFor:'queries '!
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   404
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   405
hasDamageFor:aView 
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   406
    "return true, if any exposure events are pending for aView"
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   407
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   408
    damage size ~~ 0 ifTrue:[
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   409
	damage do:[:aDamage |
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   410
	    aDamage notNil ifTrue:[
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   411
		aDamage view == aView ifTrue:[^ true].
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   412
	    ].
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   413
	]
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   414
    ].
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   415
    ^ false
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   416
!
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   417
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   418
hasDamage 
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   419
    "return true, if any exposure events are pending"
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   420
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   421
    ^ damage size ~~ 0
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   422
!
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   423
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   424
hasEvents 
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   425
    "return true, if any mouse/keyboard events are pending"
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   426
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   427
    ^ mouseAndKeyboard size ~~ 0
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   428
!
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   429
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   430
eventPending
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   431
    "return true, if either damage or events are pending"
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   432
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   433
    mouseAndKeyboard size ~~ 0 ifTrue:[^ true].
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   434
    ^ damage size ~~ 0
110
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   435
!
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   436
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   437
hasButtonMotionEventsFor:aView 
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   438
    "return true, if any buttonMotion events are pending"
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   439
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   440
    mouseAndKeyboard size ~~ 0 ifTrue:[
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   441
	mouseAndKeyboard do:[:anEvent |
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   442
	    anEvent notNil ifTrue:[
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   443
		anEvent view == aView ifTrue:[
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   444
		    anEvent type == #buttonMotion:x:y: ifTrue:[^ true].
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   445
		]
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   446
	    ].
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   447
	]
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   448
    ].
60c08d82e209 *** empty log message ***
claus
parents: 103
diff changeset
   449
    ^ aView device eventPending:#buttonMotion for:aView id
90
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   450
! !
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   451
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   452
!WindowSensor methodsFor:'event processing'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   453
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   454
notifyEventArrival
78
1c9c22df3251 *** empty log message ***
claus
parents: 72
diff changeset
   455
    "an event arrived - if there is an eventSemaphore,
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   456
     signal it, to wake up any controller process"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   457
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   458
    catchExpose == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   459
	"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   460
	 dont wake up, if we are currently waiting for an expose
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   461
	 but remember arrival of something.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   462
	"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   463
	gotOtherEvent := true.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   464
	^ self
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   465
    ].
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   466
    eventSemaphore notNil ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   467
	eventSemaphore signal
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   468
    ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   469
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   470
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   471
exposeX:left y:top width:width height:height view:aView
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   472
    "an expose event arrived - this is sent from the device (Display)"
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   473
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   474
    self addDamage:(Rectangle left:left top:top width:width height:height) view:aView.
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   475
    self notifyEventArrival
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   476
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   477
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   478
noExposeView:aView
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   479
    "an noexpose event arrived - this is sent from the device (Display)"
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   480
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   481
    gotExpose := true.
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   482
    exposeEventSemaphore notNil ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   483
	exposeEventSemaphore signal
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   484
    ]
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   485
!
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   486
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   487
graphicExposeX:left y:top width:width height:height view:aView
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   488
    self addDamage:(left @ top extent:width @ height) view:aView.
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   489
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   490
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   491
buttonMotion:state x:x y:y view:aView
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   492
    "mouse was moved - this is sent from the device (Display)"
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   493
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   494
    |args|
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   495
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   496
    ignoreUserInput == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   497
	^ self
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   498
    ].
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   499
    args := Array with:state with:x with:y.
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   500
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   501
    compressMotionEvents ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   502
	"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   503
	 merge with last motion
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   504
	"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   505
	mouseAndKeyboard reverseDo:[:ev |
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   506
	    ev notNil ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   507
		((ev type == #buttonMotion:x:y:) 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   508
		and:[(ev view == aView)
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   509
		and:[(ev arguments at:1) == state]]) ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   510
		    ev arguments:args.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   511
		    ^ self
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   512
		]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   513
	    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   514
	]
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   515
    ].
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   516
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   517
	addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   518
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   519
		     type:#buttonMotion:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   520
		     arguments:args).
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   521
    self notifyEventArrival
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   522
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   523
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   524
buttonPress:button x:x y:y view:aView
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   525
    "mouse button was pressed - this is sent from the device (Display)"
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   526
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   527
    ignoreUserInput == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   528
	^ self
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   529
    ].
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   530
    mouseAndKeyboard 
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   531
	addLast:(WindowEvent 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   532
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   533
		     type:#buttonPress:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   534
		     arguments:(Array with:button with:x with:y)).
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   535
    self notifyEventArrival
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   536
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   537
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   538
buttonRelease:button x:x y:y view:aView
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   539
    "mouse button was released- this is sent from the device (Display)"
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   540
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   541
    ignoreUserInput == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   542
	^ self
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   543
    ].
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   544
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   545
	addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   546
		     for:aView 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   547
		     type:#buttonRelease:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   548
		     arguments:(Array with:button with:x with:y)).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   549
    self notifyEventArrival
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   550
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   551
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   552
buttonMultiPress:button x:x y:y view:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   553
    "mouse button was pressed - this is sent from the device (Display)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   554
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   555
    ignoreUserInput == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   556
	^ self
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   557
    ].
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   558
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   559
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   560
		      for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   561
		      type:#buttonMultiPress:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   562
		      arguments:(Array with:button with:x with:y)).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   563
    self notifyEventArrival
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   564
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   565
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   566
buttonShiftPress:button x:x y:y view:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   567
    "mouse button was pressed - this is sent from the device (Display)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   568
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   569
    ignoreUserInput == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   570
	^ self
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   571
    ].
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   572
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   573
	addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   574
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   575
		     type:#buttonShiftPress:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   576
		     arguments:(Array with:button with:x with:y)).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   577
    self notifyEventArrival
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   578
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   579
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   580
keyPress:key x:x y:y view:aView
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   581
    "key was pressed - this is sent from the device (Display).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   582
     beside the keyboard translation, CntlC processing is done here."
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   583
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   584
    |xlatedKey group process|
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   585
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   586
    translateKeyboardEvents ifTrue:[
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   587
	xlatedKey := aView device translateKey:key.
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   588
    ] ifFalse:[
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   589
	xlatedKey := key.
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   590
    ].
85
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   591
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   592
    (xlatedKey == #CtrlV) ifTrue:[
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   593
	'Smalltalk/X ' errorPrint. 
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   594
	Smalltalk versionString errorPrint. ' of ' errorPrint.
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   595
	Smalltalk versionDate errorPrintNL.
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   596
	Smalltalk copyrightString errorPrintNL.
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   597
    ].
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   598
32687feafcc1 *** empty log message ***
claus
parents: 81
diff changeset
   599
    ((xlatedKey == #UserInterrupt) and:[ControlCEnabled]) ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   600
	"
90
b1f1d7fc96eb *** empty log message ***
claus
parents: 85
diff changeset
   601
	 Special handling for Ctrl-C: interrupt the underlying process.
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   602
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   603
	 cannot halt here (this would stop the event-dispatcher),
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   604
	 but instead interrupt the underlying process and have it
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   605
	 perform the userInterrupt in the interrupt-method.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   606
	"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   607
	group := aView windowGroup.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   608
	group notNil ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   609
	    process := group process.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   610
	    process notNil ifTrue:[
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   611
		process interruptWith:[process userInterrupt]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   612
	    ]
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   613
	].
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   614
	^ self
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   615
    ].
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   616
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   617
    ignoreUserInput == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   618
	^ self
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   619
    ].
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   620
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   621
	addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   622
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   623
		     type:#keyPress:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   624
		     arguments:(Array with:xlatedKey with:x with:y)).
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   625
    self notifyEventArrival
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   626
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   627
62
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   628
keyRelease:key x:x y:y view:aView
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   629
    "key was released - this is sent from the device (Display)."
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   630
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   631
    |xlatedKey|
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   632
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   633
    ignoreUserInput == true ifTrue:[
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   634
	^ self
62
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   635
    ].
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   636
    translateKeyboardEvents ifTrue:[
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   637
	xlatedKey := aView device translateKey:key.
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   638
    ] ifFalse:[
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   639
	xlatedKey := key.
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   640
    ].
62
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   641
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   642
	addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   643
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   644
		     type:#keyRelease:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   645
		     arguments:(Array with:xlatedKey with:x with:y)).
62
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   646
    self notifyEventArrival
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   647
!
e94fb93481c7 added keyRelease events
claus
parents: 54
diff changeset
   648
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   649
pointerEnter:state x:x y:y view:aView
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   650
    "mouse cursor was moved into the view - this is sent from the device (Display)"
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   651
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   652
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   653
	addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   654
		  for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   655
		  type:#pointerEnter:x:y:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   656
		  arguments:(Array with:state with:x with:y)).
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   657
    self notifyEventArrival
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   658
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   659
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   660
pointerLeave:state view:aView
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   661
    "mouse cursor was moved out of the view - this is sent from the device (Display)"
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   662
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   663
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   664
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   665
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   666
		     type:#pointerLeave: 
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   667
		     arguments:(Array with:state)).
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   668
    self notifyEventArrival
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   669
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   670
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   671
configureX:x y:y width:w height:h view:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   672
    damage
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   673
	addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   674
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   675
		     type:#configureX:y:width:height:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   676
		     arguments:(Array with:x with:y with:w with:h)).
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   677
    self notifyEventArrival
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   678
!
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   679
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   680
coveredBy:sibling view:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   681
    "aView was covered by one of its siblings"
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   682
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   683
    damage
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   684
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   685
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   686
		     type:#coveredBy:
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   687
		     arguments:(Array with:sibling)).
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   688
    self notifyEventArrival
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   689
!
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   690
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   691
focusInView:aView
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   692
    "view got input focus - this is sent from the device (Display)"
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   693
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   694
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   695
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   696
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   697
		     type:#focusIn).
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   698
    self notifyEventArrival
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   699
!
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   700
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   701
focusOutView:aView
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   702
    "view lost input focus - this is sent from the device (Display)"
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   703
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   704
    mouseAndKeyboard
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   705
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   706
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   707
		     type:#focusOut).
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   708
    self notifyEventArrival
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   709
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   710
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   711
mappedView:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   712
    "view was mapped (from window manager)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   713
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   714
    damage
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   715
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   716
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   717
		     type:#mapped).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   718
    self notifyEventArrival
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   719
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   720
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   721
unmappedView:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   722
    "view was unmapped (from window manager)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   723
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   724
    damage
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   725
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   726
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   727
		     type:#unmapped).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   728
    self notifyEventArrival
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   729
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   730
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   731
terminateView:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   732
    "view should terminate (from window manager)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   733
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   734
    self flushEventsFor:aView.
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   735
    damage
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   736
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   737
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   738
		     type:#terminate).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   739
    self notifyEventArrival
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   740
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   741
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   742
saveAndTerminateView:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   743
    "view should save & terminate (from window manager)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   744
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   745
    self flushEventsFor:aView.
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   746
    damage
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   747
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   748
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   749
		     type:#saveAndTerminate).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   750
    self notifyEventArrival
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   751
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   752
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   753
destroyedView:aView
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   754
    "view was destroyed (from window manager)"
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   755
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   756
    "at this time, the view is already gone; remove
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   757
     all pending events for this one ..."
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   758
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   759
    self flushEventsFor:aView.
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   760
    damage
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   761
	 addLast:(WindowEvent
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   762
		     for:aView
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   763
		     type:#destroyed).
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   764
    self notifyEventArrival
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   765
! !
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   766
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   767
!WindowSensor methodsFor:'initialization'!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   768
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   769
initialize
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   770
    "initialize the event queues to empty"
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   771
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   772
    damage := OrderedCollection new.
28
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   773
    mouseAndKeyboard := OrderedCollection new.
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   774
    gotExpose := true.
3879ff2138f1 *** empty log message ***
claus
parents: 27
diff changeset
   775
    catchExpose := false.
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   776
    compressMotionEvents := true.
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   777
    ignoreUserInput := false.
81
4ba554473294 *** empty log message ***
claus
parents: 78
diff changeset
   778
    translateKeyboardEvents := true
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   779
!
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   780
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   781
reinitialize
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   782
    "reinitialize the event queues to empty; leave other setup as-is"
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   783
72
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   784
    self flushUserEvents.
3e84121988c3 *** empty log message ***
claus
parents: 66
diff changeset
   785
    self flushExposeEvents.
54
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   786
    gotExpose := true.
29a6b2f8e042 *** empty log message ***
claus
parents: 47
diff changeset
   787
    catchExpose := false.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   788
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   789
48194c26a46c Initial revision
claus
parents:
diff changeset
   790
!WindowSensor methodsFor:'accessing'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   791
47
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   792
ignoreUserInput:aBoolean
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   793
    ignoreUserInput := aBoolean
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   794
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   795
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   796
ignoreUserInput
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   797
    ^ ignoreUserInput
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   798
!
209bc432e4e3 last version with separate queue
claus
parents: 46
diff changeset
   799
12
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   800
eventSemaphore:aSemaphore
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   801
    "set the semaphore used to signal event arrival"
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   802
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   803
    eventSemaphore := aSemaphore
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   804
!
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   805
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   806
eventSemaphore
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   807
    "return the semaphore used to signal event arrival"
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   808
9f0995fac1fa *** empty log message ***
claus
parents: 0
diff changeset
   809
    ^ eventSemaphore
46
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   810
!
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   811
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   812
compressMotionEvents:aBoolean
7b331e9012fd *** empty log message ***
claus
parents: 28
diff changeset
   813
    compressMotionEvents := aBoolean
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   814
! !