@@ -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