@@ -89,6 +89,7 @@ Author: Adobe Systems Incorporated
8989#include "dix/client_priv.h"
9090#include "dix/dix_priv.h"
9191#include "dix/resource_priv.h"
92+ #include "dix/saveset_priv.h"
9293#include "dix/screenint_priv.h"
9394
9495#include "misc.h"
@@ -250,50 +251,35 @@ XRetCode
250251AlterSaveSetForClient (ClientPtr client , WindowPtr pWin , unsigned mode ,
251252 Bool toRoot , Bool map )
252253{
253- unsigned numnow ;
254- SaveSetElt * pTmp = NULL ;
255- int j ;
256-
257- numnow = client -> numSaved ;
258- j = 0 ;
259- if (numnow ) {
260- pTmp = client -> saveSet ;
261- while ((j < numnow ) && (SaveSetWindow (pTmp [j ]) != (void * ) pWin ))
262- j ++ ;
263- }
264- if (mode == SetModeInsert ) {
265- if (j < numnow ) /* duplicate */
266- return Success ;
267- numnow ++ ;
268- pTmp = (SaveSetElt * ) realloc (client -> saveSet , sizeof (* pTmp ) * numnow );
269- if (!pTmp )
270- return BadAlloc ;
271- client -> saveSet = pTmp ;
272- client -> numSaved = numnow ;
273- SaveSetAssignWindow (client -> saveSet [numnow - 1 ], pWin );
274- SaveSetAssignToRoot (client -> saveSet [numnow - 1 ], toRoot );
275- SaveSetAssignMap (client -> saveSet [numnow - 1 ], map );
254+ if (mode == SetModeDelete ) {
255+ SaveSetEntry * walk , * tmp ;
256+ xorg_list_for_each_entry_safe (walk , tmp , & client -> saveSets , entry ) {
257+ if (walk -> windowPtr == pWin ) {
258+ xorg_list_del (& (walk -> entry ));
259+ free (walk );
260+ }
261+ }
276262 return Success ;
277263 }
278- else if ((mode == SetModeDelete ) && (j < numnow )) {
279- while (j < numnow - 1 ) {
280- pTmp [j ] = pTmp [j + 1 ];
281- j ++ ;
282- }
283- numnow -- ;
284- if (numnow ) {
285- pTmp =
286- (SaveSetElt * ) realloc (client -> saveSet , sizeof (* pTmp ) * numnow );
287- if (pTmp )
288- client -> saveSet = pTmp ;
289- }
290- else {
291- free (client -> saveSet );
292- client -> saveSet = (SaveSetElt * ) NULL ;
264+
265+ if (mode == SetModeInsert ) {
266+ SaveSetEntry * walk ;
267+ xorg_list_for_each_entry (walk , & client -> saveSets , entry ) {
268+ if (walk -> windowPtr == pWin )
269+ return Success ; /* duplicate */
293270 }
294- client -> numSaved = numnow ;
271+
272+ SaveSetEntry * newent = calloc (1 , sizeof (SaveSetEntry ));
273+ if (!newent )
274+ return BadAlloc ;
275+
276+ newent -> windowPtr = pWin ;
277+ newent -> toRoot = toRoot ;
278+ newent -> map = map ;
279+ xorg_list_add (& newent -> entry , & client -> saveSets );
295280 return Success ;
296281 }
282+
297283 return Success ;
298284}
299285
@@ -304,9 +290,7 @@ DeleteWindowFromAnySaveSet(WindowPtr pWin)
304290
305291 for (int i = 0 ; i < currentMaxClients ; i ++ ) {
306292 client = clients [i ];
307- if (client && client -> numSaved )
308- (void ) AlterSaveSetForClient (client , pWin , SetModeDelete , FALSE,
309- TRUE);
293+ (void ) AlterSaveSetForClient (client , pWin , SetModeDelete , FALSE, TRUE);
310294 }
311295}
312296
0 commit comments