Skip to content

Commit 0ce2feb

Browse files
committed
dix: use xorg_list saveSet list
Simplify saveSet handling by just using trivial `struct xorg_list` instead of complicated dynamically resized array. Common operations like insert or remove are much simpler using lists instead of arrays. Signed-off-by: Enrico Weigelt, metux IT consult <[email protected]>
1 parent a449d59 commit 0ce2feb

File tree

4 files changed

+67
-66
lines changed

4 files changed

+67
-66
lines changed

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-
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

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
@@ -107,6 +107,7 @@ Equipment Corporation.
107107
#include "dix/inpututils_priv.h"
108108
#include "dix/property_priv.h"
109109
#include "dix/resource_priv.h"
110+
#include "dix/saveset_priv.h"
110111
#include "dix/screenint_priv.h"
111112
#include "dix/selection_priv.h"
112113
#include "dix/window_priv.h"
@@ -2916,11 +2917,11 @@ UnmapSubwindows(WindowPtr pWin)
29162917
void
29172918
HandleSaveSet(ClientPtr client)
29182919
{
2919-
WindowPtr pParent, pWin;
2920-
2921-
for (int j = 0; j < client->numSaved; j++) {
2922-
pWin = SaveSetWindow(client->saveSet[j]);
2923-
if (SaveSetToRoot(client->saveSet[j]))
2920+
SaveSetEntry *walk, *tmp;
2921+
xorg_list_for_each_entry_safe(walk, tmp, &client->saveSets, entry) {
2922+
WindowPtr pParent = NULL;
2923+
WindowPtr pWin = walk->windowPtr;
2924+
if (walk->toRoot)
29242925
pParent = pWin->drawable.pScreen->root;
29252926
else
29262927
{
@@ -2931,7 +2932,7 @@ HandleSaveSet(ClientPtr client)
29312932
if (pParent) {
29322933
if (pParent != pWin->parent) {
29332934
/* unmap first so that ReparentWindow doesn't remap */
2934-
if (!SaveSetShouldMap(client->saveSet[j]))
2935+
if (!walk->map)
29352936
UnmapWindow(pWin, FALSE);
29362937
ReparentWindow(pWin, pParent,
29372938
pWin->drawable.x - wBorderWidth(pWin) -
@@ -2941,13 +2942,13 @@ HandleSaveSet(ClientPtr client)
29412942
if (!pWin->realized && pWin->mapped)
29422943
pWin->mapped = FALSE;
29432944
}
2944-
if (SaveSetShouldMap(client->saveSet[j]))
2945+
if (walk->map)
29452946
MapWindow(pWin, client);
29462947
}
2948+
2949+
xorg_list_del(&walk->entry);
2950+
free(walk);
29472951
}
2948-
free(client->saveSet);
2949-
client->numSaved = 0;
2950-
client->saveSet = NULL;
29512952
}
29522953

29532954
/**

include/dixstruct.h

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

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

7866
typedef struct _Client {
67+
/* changes in here must be done with great caution, as long as some
68+
external drivers might still depend on specific layout */
7969
void *requestBuffer;
8070
void *osPrivate; /* for OS layer, including scheduler */
8171
struct xorg_list ready; /* List of clients ready to run */
@@ -96,8 +86,10 @@ typedef struct _Client {
9686
XID errorValue;
9787
int sequence;
9888
int ignoreCount; /* count for Attend/IgnoreClient */
99-
int numSaved;
100-
SaveSetElt *saveSet;
89+
90+
int __dummy0; /* used to be numSave */
91+
void *__dummy1; /* used to be saveSet */
92+
10193
int (**requestVector) (ClientPtr /* pClient */ );
10294
CARD32 req_len; /* length of current request */
10395
unsigned int replyBytesRemaining;
@@ -113,6 +105,10 @@ typedef struct _Client {
113105
DeviceIntPtr clientPtr;
114106
struct _ClientId *clientIds;
115107
int req_fds;
108+
109+
/* driver should NEVER EVER touch anything beyond here */
110+
111+
struct xorg_list saveSets;
116112
} ClientRec;
117113

118114
typedef struct _WorkQueue {

0 commit comments

Comments
 (0)