Skip to content

Commit 4de73b5

Browse files
committed
[PR #1063] dix: use xorg_list saveSet list
PR: #1063
1 parent bf6310a commit 4de73b5

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
@@ -3648,6 +3648,7 @@ InitClient(ClientPtr client, int i, void *ospriv)
36483648
client->index = i;
36493649
xorg_list_init(&client->ready);
36503650
xorg_list_init(&client->output_pending);
3651+
xorg_list_init(&client->saveSets);
36513652
client->clientAsMask = ((Mask) i) << CLIENTOFFSET;
36523653
client->closeDownMode = i ? DestroyAll : RetainPermanent;
36533654
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/selection_priv.h"
113114
#include "dix/screenint_priv.h"
@@ -2920,11 +2921,11 @@ UnmapSubwindows(WindowPtr pWin)
29202921
void
29212922
HandleSaveSet(ClientPtr client)
29222923
{
2923-
WindowPtr pParent, pWin;
2924-
2925-
for (unsigned j = 0; j < client->numSaved; j++) {
2926-
pWin = SaveSetWindow(client->saveSet[j]);
2927-
if (SaveSetToRoot(client->saveSet[j]))
2924+
SaveSetEntry *walk, *tmp;
2925+
xorg_list_for_each_entry_safe(walk, tmp, &client->saveSets, entry) {
2926+
WindowPtr pParent = NULL;
2927+
WindowPtr pWin = walk->windowPtr;
2928+
if (walk->toRoot)
29282929
pParent = pWin->drawable.pScreen->root;
29292930
else
29302931
{
@@ -2935,7 +2936,7 @@ HandleSaveSet(ClientPtr client)
29352936
if (pParent) {
29362937
if (pParent != pWin->parent) {
29372938
/* unmap first so that ReparentWindow doesn't remap */
2938-
if (!SaveSetShouldMap(client->saveSet[j]))
2939+
if (!walk->map)
29392940
UnmapWindow(pWin, FALSE);
29402941
ReparentWindow(pWin, pParent,
29412942
pWin->drawable.x - wBorderWidth(pWin) -
@@ -2945,13 +2946,13 @@ HandleSaveSet(ClientPtr client)
29452946
if (!pWin->realized && pWin->mapped)
29462947
pWin->mapped = FALSE;
29472948
}
2948-
if (SaveSetShouldMap(client->saveSet[j]))
2949+
if (walk->map)
29492950
MapWindow(pWin, client);
29502951
}
2952+
2953+
xorg_list_del(&walk->entry);
2954+
free(walk);
29512955
}
2952-
free(client->saveSet);
2953-
client->numSaved = 0;
2954-
client->saveSet = NULL;
29552956
}
29562957

29572958
/**

include/dixstruct.h

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,11 @@ typedef enum { ClientStateInitial,
6464
ClientStateGone
6565
} ClientState;
6666

67-
typedef struct _saveSet {
68-
struct _Window *windowPtr;
69-
Bool toRoot;
70-
Bool map;
71-
} SaveSetElt;
72-
#define SaveSetWindow(ss) ((ss).windowPtr)
73-
#define SaveSetToRoot(ss) ((ss).toRoot)
74-
#define SaveSetShouldMap(ss) ((ss).map)
75-
#define SaveSetAssignWindow(ss,w) ((ss).windowPtr = (w))
76-
#define SaveSetAssignToRoot(ss,tr) ((ss).toRoot = (tr))
77-
#define SaveSetAssignMap(ss,m) ((ss).map = (m))
78-
7967
struct _ClientId;
8068

8169
typedef struct _Client {
70+
/* changes in here must be done with great caution, as long as some
71+
external drivers might still depend on specific layout */
8272
void *requestBuffer;
8373
void *osPrivate; /* for OS layer, including scheduler */
8474
struct xorg_list ready; /* List of clients ready to run */
@@ -99,8 +89,10 @@ typedef struct _Client {
9989
XID errorValue;
10090
int sequence;
10191
int ignoreCount; /* count for Attend/IgnoreClient */
102-
unsigned numSaved; /* amount of windows in saveSet */
103-
SaveSetElt *saveSet;
92+
93+
int __dummy0; /* used to be numSave */
94+
void *__dummy1; /* used to be saveSet */
95+
10496
int (**requestVector) (ClientPtr /* pClient */ );
10597
CARD32 req_len; /* length of current request */
10698
unsigned int replyBytesRemaining;
@@ -116,6 +108,10 @@ typedef struct _Client {
116108
DeviceIntPtr clientPtr;
117109
struct _ClientId *clientIds;
118110
int req_fds;
111+
112+
/* driver should NEVER EVER touch anything beyond here */
113+
114+
struct xorg_list saveSets;
119115
} ClientRec;
120116

121117
extern _X_EXPORT TimeStamp currentTime;

0 commit comments

Comments
 (0)