@@ -88,6 +88,7 @@ Author: Adobe Systems Incorporated
8888#include "dix/callback_priv.h"
8989#include "dix/dix_priv.h"
9090#include "dix/resource_priv.h"
91+ #include "dix/saveset_priv.h"
9192
9293#include "misc.h"
9394#include "windowstr.h"
@@ -248,50 +249,35 @@ XRetCode
248249AlterSaveSetForClient (ClientPtr client , WindowPtr pWin , unsigned mode ,
249250 Bool toRoot , Bool map )
250251{
251- int 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+ }
274260 return Success ;
275261 }
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 */
291268 }
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 );
293278 return Success ;
294279 }
280+
295281 return Success ;
296282}
297283
@@ -302,9 +288,7 @@ DeleteWindowFromAnySaveSet(WindowPtr pWin)
302288
303289 for (int i = 0 ; i < currentMaxClients ; i ++ ) {
304290 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);
308292 }
309293}
310294
0 commit comments