Skip to content

Commit c9f3713

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

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
@@ -3598,6 +3598,7 @@ InitClient(ClientPtr client, int i, void *ospriv)
35983598
client->index = i;
35993599
xorg_list_init(&client->ready);
36003600
xorg_list_init(&client->output_pending);
3601+
xorg_list_init(&client->saveSets);
36013602
client->clientAsMask = ((Mask) i) << CLIENTOFFSET;
36023603
client->closeDownMode = i ? DestroyAll : RetainPermanent;
36033604
client->requestVector = InitialVector;

dix/dixutils.c

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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
248249
AlterSaveSetForClient(ClientPtr client, WindowPtr pWin, unsigned mode,
249250
Bool toRoot, Bool map)
250251
{
251-
unsigned 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

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"
@@ -2917,11 +2918,11 @@ UnmapSubwindows(WindowPtr pWin)
29172918
void
29182919
HandleSaveSet(ClientPtr client)
29192920
{
2920-
WindowPtr pParent, pWin;
2921-
2922-
for (unsigned j = 0; j < client->numSaved; j++) {
2923-
pWin = SaveSetWindow(client->saveSet[j]);
2924-
if (SaveSetToRoot(client->saveSet[j]))
2921+
SaveSetEntry *walk, *tmp;
2922+
xorg_list_for_each_entry_safe(walk, tmp, &client->saveSets, entry) {
2923+
WindowPtr pParent = NULL;
2924+
WindowPtr pWin = walk->windowPtr;
2925+
if (walk->toRoot)
29252926
pParent = pWin->drawable.pScreen->root;
29262927
else
29272928
{
@@ -2932,7 +2933,7 @@ HandleSaveSet(ClientPtr client)
29322933
if (pParent) {
29332934
if (pParent != pWin->parent) {
29342935
/* unmap first so that ReparentWindow doesn't remap */
2935-
if (!SaveSetShouldMap(client->saveSet[j]))
2936+
if (!walk->map)
29362937
UnmapWindow(pWin, FALSE);
29372938
ReparentWindow(pWin, pParent,
29382939
pWin->drawable.x - wBorderWidth(pWin) -
@@ -2942,13 +2943,13 @@ HandleSaveSet(ClientPtr client)
29422943
if (!pWin->realized && pWin->mapped)
29432944
pWin->mapped = FALSE;
29442945
}
2945-
if (SaveSetShouldMap(client->saveSet[j]))
2946+
if (walk->map)
29462947
MapWindow(pWin, client);
29472948
}
2949+
2950+
xorg_list_del(&walk->entry);
2951+
free(walk);
29482952
}
2949-
free(client->saveSet);
2950-
client->numSaved = 0;
2951-
client->saveSet = NULL;
29522953
}
29532954

29542955
/**

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)