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