Skip to content

Commit d18c242

Browse files
committed
[PR #1063] dix: use xorg_list saveSet list
PR: #1063
1 parent 2316959 commit d18c242

File tree

5 files changed

+68
-66
lines changed

5 files changed

+68
-66
lines changed

dix/dispatch.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3721,6 +3721,7 @@ InitClient(ClientPtr client, int i, void *ospriv)
37213721
client->index = i;
37223722
xorg_list_init(&client->ready);
37233723
xorg_list_init(&client->output_pending);
3724+
xorg_list_init(&client->saveSets);
37243725
client->clientAsMask = ((Mask) i) << CLIENTOFFSET;
37253726
client->closeDownMode = i ? DestroyAll : RetainPermanent;
37263727
client->requestVector = InitialVector;

dix/dixutils.c

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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
250251
AlterSaveSetForClient(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

dix/saveset_priv.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/* SPDX-License-Identifier: MIT OR X11
2+
*
3+
* Copyright © 2024 Enrico Weigelt, metux IT consult <[email protected]>
4+
*/
5+
#ifndef _XSERVER_DIX_SAVESET_PRIV_H
6+
#define _XSERVER_DIX_SAVESET_PRIV_H
7+
8+
#include <stdbool.h>
9+
10+
#include "include/list.h"
11+
#include "include/window.h"
12+
13+
typedef struct {
14+
struct xorg_list entry;
15+
WindowPtr windowPtr;
16+
bool toRoot;
17+
bool map;
18+
} SaveSetEntry;
19+
20+
#endif /*_XSERVER_DIX_SAVESET_PRIV_H */

dix/window.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ Equipment Corporation.
108108
#include "dix/property_priv.h"
109109
#include "dix/request_priv.h"
110110
#include "dix/resource_priv.h"
111+
#include "dix/saveset_priv.h"
111112
#include "dix/screenint_priv.h"
112113
#include "dix/screensaver_priv.h"
113114
#include "dix/selection_priv.h"
@@ -2924,11 +2925,11 @@ UnmapSubwindows(WindowPtr pWin)
29242925
void
29252926
HandleSaveSet(ClientPtr client)
29262927
{
2927-
WindowPtr pParent, pWin;
2928-
2929-
for (unsigned j = 0; j < client->numSaved; j++) {
2930-
pWin = SaveSetWindow(client->saveSet[j]);
2931-
if (SaveSetToRoot(client->saveSet[j]))
2928+
SaveSetEntry *walk, *tmp;
2929+
xorg_list_for_each_entry_safe(walk, tmp, &client->saveSets, entry) {
2930+
WindowPtr pParent = NULL;
2931+
WindowPtr pWin = walk->windowPtr;
2932+
if (walk->toRoot)
29322933
pParent = pWin->drawable.pScreen->root;
29332934
else
29342935
{
@@ -2939,7 +2940,7 @@ HandleSaveSet(ClientPtr client)
29392940
if (pParent) {
29402941
if (pParent != pWin->parent) {
29412942
/* unmap first so that ReparentWindow doesn't remap */
2942-
if (!SaveSetShouldMap(client->saveSet[j]))
2943+
if (!walk->map)
29432944
UnmapWindow(pWin, FALSE);
29442945
ReparentWindow(pWin, pParent,
29452946
pWin->drawable.x - wBorderWidth(pWin) -
@@ -2949,13 +2950,13 @@ HandleSaveSet(ClientPtr client)
29492950
if (!pWin->realized && pWin->mapped)
29502951
pWin->mapped = FALSE;
29512952
}
2952-
if (SaveSetShouldMap(client->saveSet[j]))
2953+
if (walk->map)
29532954
MapWindow(pWin, client);
29542955
}
2956+
2957+
xorg_list_del(&walk->entry);
2958+
free(walk);
29552959
}
2956-
free(client->saveSet);
2957-
client->numSaved = 0;
2958-
client->saveSet = NULL;
29592960
}
29602961

29612962
/**

include/dixstruct.h

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,21 +59,11 @@ typedef enum { ClientStateInitial,
5959
ClientStateGone
6060
} ClientState;
6161

62-
typedef struct _saveSet {
63-
struct _Window *windowPtr;
64-
Bool toRoot;
65-
Bool map;
66-
} SaveSetElt;
67-
#define SaveSetWindow(ss) ((ss).windowPtr)
68-
#define SaveSetToRoot(ss) ((ss).toRoot)
69-
#define SaveSetShouldMap(ss) ((ss).map)
70-
#define SaveSetAssignWindow(ss,w) ((ss).windowPtr = (w))
71-
#define SaveSetAssignToRoot(ss,tr) ((ss).toRoot = (tr))
72-
#define SaveSetAssignMap(ss,m) ((ss).map = (m))
73-
7462
struct _ClientId;
7563

7664
typedef struct _Client {
65+
/* changes in here must be done with great caution, as long as some
66+
external drivers might still depend on specific layout */
7767
void *requestBuffer;
7868
void *osPrivate; /* for OS layer, including scheduler */
7969
struct xorg_list ready; /* List of clients ready to run */
@@ -94,8 +84,10 @@ typedef struct _Client {
9484
XID errorValue;
9585
int sequence;
9686
int ignoreCount; /* count for Attend/IgnoreClient */
97-
unsigned numSaved; /* amount of windows in saveSet */
98-
SaveSetElt *saveSet;
87+
88+
int __dummy0; /* used to be numSave */
89+
void *__dummy1; /* used to be saveSet */
90+
9991
int (**requestVector) (ClientPtr /* pClient */ );
10092
CARD32 req_len; /* length of current request */
10193
unsigned int replyBytesRemaining;
@@ -111,6 +103,10 @@ typedef struct _Client {
111103
DeviceIntPtr clientPtr;
112104
struct _ClientId *clientIds;
113105
int req_fds;
106+
107+
/* driver should NEVER EVER touch anything beyond here */
108+
109+
struct xorg_list saveSets;
114110
} ClientRec;
115111

116112
extern _X_EXPORT TimeStamp currentTime;

0 commit comments

Comments
 (0)