Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dix/dispatch.c
Original file line number Diff line number Diff line change
Expand Up @@ -3648,6 +3648,7 @@ InitClient(ClientPtr client, int i, void *ospriv)
client->index = i;
xorg_list_init(&client->ready);
xorg_list_init(&client->output_pending);
xorg_list_init(&client->saveSets);
client->clientAsMask = ((Mask) i) << CLIENTOFFSET;
client->closeDownMode = i ? DestroyAll : RetainPermanent;
client->requestVector = InitialVector;
Expand Down
68 changes: 26 additions & 42 deletions dix/dixutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ Author: Adobe Systems Incorporated
#include "dix/client_priv.h"
#include "dix/dix_priv.h"
#include "dix/resource_priv.h"
#include "dix/saveset_priv.h"
#include "dix/screenint_priv.h"

#include "misc.h"
Expand Down Expand Up @@ -250,50 +251,35 @@ XRetCode
AlterSaveSetForClient(ClientPtr client, WindowPtr pWin, unsigned mode,
Bool toRoot, Bool map)
{
unsigned numnow;
SaveSetElt *pTmp = NULL;
int j;

numnow = client->numSaved;
j = 0;
if (numnow) {
pTmp = client->saveSet;
while ((j < numnow) && (SaveSetWindow(pTmp[j]) != (void *) pWin))
j++;
}
if (mode == SetModeInsert) {
if (j < numnow) /* duplicate */
return Success;
numnow++;
pTmp = (SaveSetElt *) realloc(client->saveSet, sizeof(*pTmp) * numnow);
if (!pTmp)
return BadAlloc;
client->saveSet = pTmp;
client->numSaved = numnow;
SaveSetAssignWindow(client->saveSet[numnow - 1], pWin);
SaveSetAssignToRoot(client->saveSet[numnow - 1], toRoot);
SaveSetAssignMap(client->saveSet[numnow - 1], map);
if (mode == SetModeDelete) {
SaveSetEntry *walk, *tmp;
xorg_list_for_each_entry_safe(walk, tmp, &client->saveSets, entry) {
if (walk->windowPtr == pWin) {
xorg_list_del(&(walk->entry));
free(walk);
}
}
return Success;
}
else if ((mode == SetModeDelete) && (j < numnow)) {
while (j < numnow - 1) {
pTmp[j] = pTmp[j + 1];
j++;
}
numnow--;
if (numnow) {
pTmp =
(SaveSetElt *) realloc(client->saveSet, sizeof(*pTmp) * numnow);
if (pTmp)
client->saveSet = pTmp;
}
else {
free(client->saveSet);
client->saveSet = (SaveSetElt *) NULL;

if (mode == SetModeInsert) {
SaveSetEntry *walk;
xorg_list_for_each_entry(walk, &client->saveSets, entry) {
if (walk->windowPtr == pWin)
return Success; /* duplicate */
}
client->numSaved = numnow;

SaveSetEntry *newent = calloc(1, sizeof(SaveSetEntry));
if (!newent)
return BadAlloc;

newent->windowPtr = pWin;
newent->toRoot = toRoot;
newent->map = map;
xorg_list_add(&newent->entry, &client->saveSets);
return Success;
}

return Success;
}

Expand All @@ -304,9 +290,7 @@ DeleteWindowFromAnySaveSet(WindowPtr pWin)

for (int i = 0; i < currentMaxClients; i++) {
client = clients[i];
if (client && client->numSaved)
(void) AlterSaveSetForClient(client, pWin, SetModeDelete, FALSE,
TRUE);
(void) AlterSaveSetForClient(client, pWin, SetModeDelete, FALSE, TRUE);
}
}

Expand Down
20 changes: 20 additions & 0 deletions dix/saveset_priv.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* SPDX-License-Identifier: MIT OR X11
*
* Copyright © 2024 Enrico Weigelt, metux IT consult <[email protected]>
*/
#ifndef _XSERVER_DIX_SAVESET_PRIV_H
#define _XSERVER_DIX_SAVESET_PRIV_H

#include <stdbool.h>

#include "include/list.h"
#include "include/window.h"

typedef struct {
struct xorg_list entry;
WindowPtr windowPtr;
bool toRoot;
bool map;
} SaveSetEntry;

#endif /*_XSERVER_DIX_SAVESET_PRIV_H */
21 changes: 11 additions & 10 deletions dix/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ Equipment Corporation.
#include "dix/property_priv.h"
#include "dix/request_priv.h"
#include "dix/resource_priv.h"
#include "dix/saveset_priv.h"
#include "dix/screenint_priv.h"
#include "dix/selection_priv.h"
#include "dix/screenint_priv.h"
Expand Down Expand Up @@ -2920,11 +2921,11 @@ UnmapSubwindows(WindowPtr pWin)
void
HandleSaveSet(ClientPtr client)
{
WindowPtr pParent, pWin;

for (unsigned j = 0; j < client->numSaved; j++) {
pWin = SaveSetWindow(client->saveSet[j]);
if (SaveSetToRoot(client->saveSet[j]))
SaveSetEntry *walk, *tmp;
xorg_list_for_each_entry_safe(walk, tmp, &client->saveSets, entry) {
WindowPtr pParent = NULL;
WindowPtr pWin = walk->windowPtr;
if (walk->toRoot)
pParent = pWin->drawable.pScreen->root;
else
{
Expand All @@ -2935,7 +2936,7 @@ HandleSaveSet(ClientPtr client)
if (pParent) {
if (pParent != pWin->parent) {
/* unmap first so that ReparentWindow doesn't remap */
if (!SaveSetShouldMap(client->saveSet[j]))
if (!walk->map)
UnmapWindow(pWin, FALSE);
ReparentWindow(pWin, pParent,
pWin->drawable.x - wBorderWidth(pWin) -
Expand All @@ -2945,13 +2946,13 @@ HandleSaveSet(ClientPtr client)
if (!pWin->realized && pWin->mapped)
pWin->mapped = FALSE;
}
if (SaveSetShouldMap(client->saveSet[j]))
if (walk->map)
MapWindow(pWin, client);
}

xorg_list_del(&walk->entry);
free(walk);
}
free(client->saveSet);
client->numSaved = 0;
client->saveSet = NULL;
}

/**
Expand Down
24 changes: 10 additions & 14 deletions include/dixstruct.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,21 +64,11 @@ typedef enum { ClientStateInitial,
ClientStateGone
} ClientState;

typedef struct _saveSet {
struct _Window *windowPtr;
Bool toRoot;
Bool map;
} SaveSetElt;
#define SaveSetWindow(ss) ((ss).windowPtr)
#define SaveSetToRoot(ss) ((ss).toRoot)
#define SaveSetShouldMap(ss) ((ss).map)
#define SaveSetAssignWindow(ss,w) ((ss).windowPtr = (w))
#define SaveSetAssignToRoot(ss,tr) ((ss).toRoot = (tr))
#define SaveSetAssignMap(ss,m) ((ss).map = (m))

struct _ClientId;

typedef struct _Client {
/* changes in here must be done with great caution, as long as some
external drivers might still depend on specific layout */
void *requestBuffer;
void *osPrivate; /* for OS layer, including scheduler */
struct xorg_list ready; /* List of clients ready to run */
Expand All @@ -99,8 +89,10 @@ typedef struct _Client {
XID errorValue;
int sequence;
int ignoreCount; /* count for Attend/IgnoreClient */
unsigned numSaved; /* amount of windows in saveSet */
SaveSetElt *saveSet;

int __dummy0; /* used to be numSave */
void *__dummy1; /* used to be saveSet */

int (**requestVector) (ClientPtr /* pClient */ );
CARD32 req_len; /* length of current request */
unsigned int replyBytesRemaining;
Expand All @@ -116,6 +108,10 @@ typedef struct _Client {
DeviceIntPtr clientPtr;
struct _ClientId *clientIds;
int req_fds;

/* driver should NEVER EVER touch anything beyond here */

struct xorg_list saveSets;
} ClientRec;

extern _X_EXPORT TimeStamp currentTime;
Expand Down
Loading