Skip to content

Commit 11f6964

Browse files
committed
[PR #1063] dix: use xorg_list saveSet list
PR: #1063
1 parent 7186d66 commit 11f6964

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
@@ -3673,6 +3673,7 @@ InitClient(ClientPtr client, int i, void *ospriv)
36733673
client->index = i;
36743674
xorg_list_init(&client->ready);
36753675
xorg_list_init(&client->output_pending);
3676+
xorg_list_init(&client->saveSets);
36763677
client->clientAsMask = ((Mask) i) << CLIENTOFFSET;
36773678
client->closeDownMode = i ? DestroyAll : RetainPermanent;
36783679
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

9394
#include "misc.h"
9495
#include "windowstr.h"
@@ -249,50 +250,35 @@ XRetCode
249250
AlterSaveSetForClient(ClientPtr client, WindowPtr pWin, unsigned mode,
250251
Bool toRoot, Bool map)
251252
{
252-
unsigned numnow;
253-
SaveSetElt *pTmp = NULL;
254-
int j;
255-
256-
numnow = client->numSaved;
257-
j = 0;
258-
if (numnow) {
259-
pTmp = client->saveSet;
260-
while ((j < numnow) && (SaveSetWindow(pTmp[j]) != (void *) pWin))
261-
j++;
262-
}
263-
if (mode == SetModeInsert) {
264-
if (j < numnow) /* duplicate */
265-
return Success;
266-
numnow++;
267-
pTmp = (SaveSetElt *) realloc(client->saveSet, sizeof(*pTmp) * numnow);
268-
if (!pTmp)
269-
return BadAlloc;
270-
client->saveSet = pTmp;
271-
client->numSaved = numnow;
272-
SaveSetAssignWindow(client->saveSet[numnow - 1], pWin);
273-
SaveSetAssignToRoot(client->saveSet[numnow - 1], toRoot);
274-
SaveSetAssignMap(client->saveSet[numnow - 1], map);
253+
if (mode == SetModeDelete) {
254+
SaveSetEntry *walk, *tmp;
255+
xorg_list_for_each_entry_safe(walk, tmp, &client->saveSets, entry) {
256+
if (walk->windowPtr == pWin) {
257+
xorg_list_del(&(walk->entry));
258+
free(walk);
259+
}
260+
}
275261
return Success;
276262
}
277-
else if ((mode == SetModeDelete) && (j < numnow)) {
278-
while (j < numnow - 1) {
279-
pTmp[j] = pTmp[j + 1];
280-
j++;
281-
}
282-
numnow--;
283-
if (numnow) {
284-
pTmp =
285-
(SaveSetElt *) realloc(client->saveSet, sizeof(*pTmp) * numnow);
286-
if (pTmp)
287-
client->saveSet = pTmp;
288-
}
289-
else {
290-
free(client->saveSet);
291-
client->saveSet = (SaveSetElt *) NULL;
263+
264+
if (mode == SetModeInsert) {
265+
SaveSetEntry *walk;
266+
xorg_list_for_each_entry(walk, &client->saveSets, entry) {
267+
if (walk->windowPtr == pWin)
268+
return Success; /* duplicate */
292269
}
293-
client->numSaved = numnow;
270+
271+
SaveSetEntry *newent = calloc(1, sizeof(SaveSetEntry));
272+
if (!newent)
273+
return BadAlloc;
274+
275+
newent->windowPtr = pWin;
276+
newent->toRoot = toRoot;
277+
newent->map = map;
278+
xorg_list_add(&newent->entry, &client->saveSets);
294279
return Success;
295280
}
281+
296282
return Success;
297283
}
298284

@@ -303,9 +289,7 @@ DeleteWindowFromAnySaveSet(WindowPtr pWin)
303289

304290
for (int i = 0; i < currentMaxClients; i++) {
305291
client = clients[i];
306-
if (client && client->numSaved)
307-
(void) AlterSaveSetForClient(client, pWin, SetModeDelete, FALSE,
308-
TRUE);
292+
(void) AlterSaveSetForClient(client, pWin, SetModeDelete, FALSE, TRUE);
309293
}
310294
}
311295

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/window_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)