1
/* $Xorg: pexRndrPick.c,v 1.4 2001/02/09 02:04:14 xorgcvs Exp $ */
3
/************************************************************
5
Copyright 1992, 1998 The Open Group
7
Permission to use, copy, modify, distribute, and sell this software and its
8
documentation for any purpose is hereby granted without fee, provided that
9
the above copyright notice appear in all copies and that both that
10
copyright notice and this permission notice appear in supporting
13
The above copyright notice and this permission notice shall be included in
14
all copies or substantial portions of the Software.
16
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
Except as contained in this notice, the name of The Open Group shall not be
24
used in advertising or otherwise to promote the sale, use or other dealings
25
in this Software without prior written authorization from The Open Group.
27
******************************************************************/
32
* --- Renderer Picking ---
46
#include "PEXprotost.h"
50
#include "pexLookup.h"
61
/*++ Renderer Picking ++*/
64
PEXBeginPickOne( cntxtPtr, strmPtr )
66
pexBeginPickOneReq *strmPtr;
68
ErrorCode err = Success;
69
ddRendererStr *prend = 0;
70
pexPickRecord *pr = (pexPickRecord *)(strmPtr+1);
73
LU_RENDERER(strmPtr->rdr, prend);
74
LU_DRAWABLE(strmPtr->drawable, prend->pDrawable);
75
prend->drawableId = strmPtr->drawable;
76
/* this is evil but necessary, use the pickid field of the
77
sIDlist to store the structure ID that corresponds to the
78
top level fake structure
80
sIDpp = (ddPickPath *)(prend->pickstr.sIDlist)->pList;
81
sIDpp->pickid = strmPtr->sid;
83
prend->pickstr.pick_method = strmPtr->method;
84
prend->pickstr.state = DD_PICK_ONE;
85
prend->pickstr.server = DD_CLIENT;
87
err = ChangePseudoPickMeasure (prend, pr);
88
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
90
/* This is set up to use this instead of defining a BeginPickOne */
91
err = BeginPicking(prend, prend->pickstr.pseudoPM);
92
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
95
} /* end-PEXBeginPickOne() */
98
PEXEndPickOne( cntxtPtr, strmPtr )
100
pexEndPickOneReq *strmPtr;
102
ErrorCode err = Success;
103
ddRendererStr *prend = 0;
104
extern ddBufferPtr pPEXBuffer;
105
pexEndPickOneReply *reply = (pexEndPickOneReply*)(pPEXBuffer->pHead);
107
LU_RENDERER(strmPtr->rdr, prend);
109
if (prend->pickstr.state != DD_PICK_ONE)
110
PEX_ERR_EXIT(PEX_ERROR_CODE(PEXRendererStateError),0,cntxtPtr);
112
SETUP_INQ(pexEndPickOneReply);
114
err = EndPickOne(prend, pPEXBuffer, &(reply->numPickElRefs),
115
&(reply->pickStatus), &(reply->betterPick));
116
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
118
err = EndPicking(prend);
119
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
122
reply->length = LWORDS(pPEXBuffer->dataSize);
123
WritePEXBufferReply(pexEndPickOneReply);
127
} /* end-PEXEndPickOne() */
130
PEXPickOne( cntxtPtr, strmPtr )
131
pexContext *cntxtPtr;
132
pexPickOneReq *strmPtr;
134
ErrorCode err = Success;
135
extern ddBufferPtr pPEXBuffer;
136
ddRendererStr *prend = 0;
137
pexPickRecord *pr = (pexPickRecord *)(strmPtr+1);
138
pexPickOneReply *reply = (pexPickOneReply*)(pPEXBuffer->pHead);
140
/* do stuff same as BeginPickOne */
141
LU_RENDERER(strmPtr->rdr, prend);
142
LU_DRAWABLE(strmPtr->drawable, prend->pDrawable);
143
prend->drawableId = strmPtr->drawable;
144
LU_STRUCTURE(strmPtr->sid, prend->pickstr.strHandle);
146
prend->pickstr.pick_method = strmPtr->method;
147
prend->pickstr.state = DD_PICK_ONE;
148
prend->pickstr.server = DD_SERVER;
150
err = ChangePseudoPickMeasure (prend, pr);
151
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
153
err = BeginPicking(prend, prend->pickstr.pseudoPM);
154
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
156
/* now call PickOne which does set up and calls the traverser */
157
err = PickOne(prend);
159
/* now do stuff same as EndPickOne */
160
SETUP_INQ(pexPickOneReply);
162
err = EndPickOne(prend, pPEXBuffer, &(reply->numPickElRefs),
163
&(reply->pickStatus), &(reply->betterPick));
164
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
166
err = EndPicking(prend);
167
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
170
reply->length = LWORDS(pPEXBuffer->dataSize);
171
WritePEXBufferReply(pexPickOneReply);
174
} /* end-PEXPickOne() */
177
PEXBeginPickAll( cntxtPtr, strmPtr )
178
pexContext *cntxtPtr;
179
pexBeginPickAllReq *strmPtr;
181
ErrorCode err = Success;
182
ddRendererStr *prend = 0;
183
pexPickRecord *pr = (pexPickRecord *)(strmPtr+1);
186
LU_RENDERER(strmPtr->rdr, prend);
187
LU_DRAWABLE(strmPtr->drawable, prend->pDrawable);
188
prend->drawableId = strmPtr->drawable;
189
/* this is evil but necessary, use the pickid field of the
190
sIDlist to store the structure ID that corresponds to the
191
top level fake structure
193
sIDpp = (ddPickPath *)(prend->pickstr.sIDlist)->pList;
194
sIDpp->pickid = strmPtr->sid;
196
prend->pickstr.pick_method = strmPtr->method;
197
prend->pickstr.state = DD_PICK_ALL;
198
prend->pickstr.server = DD_CLIENT;
199
prend->pickstr.send_event = strmPtr->sendEvent;
200
prend->pickstr.max_hits = strmPtr->pickMaxHits;
201
prend->pickstr.client = cntxtPtr->client;
203
err = ChangePseudoPickMeasure (prend, pr);
204
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
206
/* This is set up to use this instead of defining a BeginPickOne */
207
err = BeginPicking(prend, prend->pickstr.pseudoPM);
208
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
211
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
213
} /* end-PEXBeginPickAll() */
216
PEXEndPickAll( cntxtPtr, strmPtr )
217
pexContext *cntxtPtr;
218
pexEndPickAllReq *strmPtr;
220
ErrorCode err = Success;
221
extern ddBufferPtr pPEXBuffer;
222
ddRendererStr *prend = 0;
224
LU_RENDERER(strmPtr->rdr, prend);
226
if (prend->pickstr.state != DD_PICK_ALL)
227
PEX_ERR_EXIT(err,0,cntxtPtr);
229
SETUP_INQ(pexEndPickAllReply);
231
err = EndPickAll(prend, pPEXBuffer);
232
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
234
err = EndPicking(prend);
235
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
238
SETUP_VAR_REPLY(pexEndPickAllReply);
239
WritePEXBufferReply(pexEndPickAllReply);
242
} /* end-PEXEndPickAll() */
245
PEXPickAll( cntxtPtr, strmPtr )
246
pexContext *cntxtPtr;
247
pexPickAllReq *strmPtr;
249
ErrorCode err = Success;
250
extern ddBufferPtr pPEXBuffer;
251
ddRendererStr *prend = 0;
252
pexPickRecord *pr = (pexPickRecord *)(strmPtr+1);
254
/* do stuff same as BeginPickAll */
255
LU_RENDERER(strmPtr->rdr, prend);
256
LU_DRAWABLE(strmPtr->drawable, prend->pDrawable);
257
prend->drawableId = strmPtr->drawable;
259
prend->pickstr.pick_method = strmPtr->method;
260
prend->pickstr.state = DD_PICK_ALL;
261
prend->pickstr.server = DD_SERVER;
262
prend->pickstr.max_hits = strmPtr->pickMaxHits;
264
err = ChangePseudoPickMeasure (prend, pr);
265
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
267
err = BeginPicking(prend, prend->pickstr.pseudoPM);
268
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
270
/* now call PickAll which does set up and calls RenderElements */
271
err = PickAll(prend);
273
/* now do stuff same as EndPickOne */
274
SETUP_INQ(pexPickAllReply);
276
err = EndPickAll(prend, pPEXBuffer);
277
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
279
err = EndPicking(prend);
280
if (err) PEX_ERR_EXIT(err,0,cntxtPtr);
283
SETUP_VAR_REPLY(pexPickAllReply);
285
WritePEXBufferReply(pexPickAllReply);
288
} /* end-PEXPickAll() */
291
/**** Renderer Pick Events ****/
294
PEXMaxHitsReachedNotify(client, rendId)
298
pexMaxHitsReachedEvent mhre;
300
mhre.type = PexEventBase + PEXMaxHitsReached;
301
mhre.sequenceNumber = client->sequence;
304
WriteEventsToClient (client, 1, (xEvent *) &mhre);
305
return(client->noClientException);