@@ -88,6 +88,7 @@ Author: Adobe Systems Incorporated
88
88
#include "dix/callback_priv.h"
89
89
#include "dix/dix_priv.h"
90
90
#include "dix/resource_priv.h"
91
+ #include "dix/saveset_priv.h"
91
92
92
93
#include "misc.h"
93
94
#include "windowstr.h"
@@ -248,50 +249,35 @@ XRetCode
248
249
AlterSaveSetForClient (ClientPtr client , WindowPtr pWin , unsigned mode ,
249
250
Bool toRoot , Bool map )
250
251
{
251
- unsigned numnow ;
252
- SaveSetElt * pTmp = NULL ;
253
- int j ;
254
-
255
- numnow = client -> numSaved ;
256
- j = 0 ;
257
- if (numnow ) {
258
- pTmp = client -> saveSet ;
259
- while ((j < numnow ) && (SaveSetWindow (pTmp [j ]) != (void * ) pWin ))
260
- j ++ ;
261
- }
262
- if (mode == SetModeInsert ) {
263
- if (j < numnow ) /* duplicate */
264
- return Success ;
265
- numnow ++ ;
266
- pTmp = (SaveSetElt * ) realloc (client -> saveSet , sizeof (* pTmp ) * numnow );
267
- if (!pTmp )
268
- return BadAlloc ;
269
- client -> saveSet = pTmp ;
270
- client -> numSaved = numnow ;
271
- SaveSetAssignWindow (client -> saveSet [numnow - 1 ], pWin );
272
- SaveSetAssignToRoot (client -> saveSet [numnow - 1 ], toRoot );
273
- SaveSetAssignMap (client -> saveSet [numnow - 1 ], map );
252
+ if (mode == SetModeDelete ) {
253
+ SaveSetEntry * walk , * tmp ;
254
+ xorg_list_for_each_entry_safe (walk , tmp , & client -> saveSets , entry ) {
255
+ if (walk -> windowPtr == pWin ) {
256
+ xorg_list_del (& (walk -> entry ));
257
+ free (walk );
258
+ }
259
+ }
274
260
return Success ;
275
261
}
276
- else if ((mode == SetModeDelete ) && (j < numnow )) {
277
- while (j < numnow - 1 ) {
278
- pTmp [j ] = pTmp [j + 1 ];
279
- j ++ ;
280
- }
281
- numnow -- ;
282
- if (numnow ) {
283
- pTmp =
284
- (SaveSetElt * ) realloc (client -> saveSet , sizeof (* pTmp ) * numnow );
285
- if (pTmp )
286
- client -> saveSet = pTmp ;
287
- }
288
- else {
289
- free (client -> saveSet );
290
- client -> saveSet = (SaveSetElt * ) NULL ;
262
+
263
+ if (mode == SetModeInsert ) {
264
+ SaveSetEntry * walk ;
265
+ xorg_list_for_each_entry (walk , & client -> saveSets , entry ) {
266
+ if (walk -> windowPtr == pWin )
267
+ return Success ; /* duplicate */
291
268
}
292
- client -> numSaved = numnow ;
269
+
270
+ SaveSetEntry * newent = calloc (1 , sizeof (SaveSetEntry ));
271
+ if (!newent )
272
+ return BadAlloc ;
273
+
274
+ newent -> windowPtr = pWin ;
275
+ newent -> toRoot = toRoot ;
276
+ newent -> map = map ;
277
+ xorg_list_add (& newent -> entry , & client -> saveSets );
293
278
return Success ;
294
279
}
280
+
295
281
return Success ;
296
282
}
297
283
@@ -302,9 +288,7 @@ DeleteWindowFromAnySaveSet(WindowPtr pWin)
302
288
303
289
for (int i = 0 ; i < currentMaxClients ; i ++ ) {
304
290
client = clients [i ];
305
- if (client && client -> numSaved )
306
- (void ) AlterSaveSetForClient (client , pWin , SetModeDelete , FALSE,
307
- TRUE);
291
+ (void ) AlterSaveSetForClient (client , pWin , SetModeDelete , FALSE, TRUE);
308
292
}
309
293
}
310
294
0 commit comments