Xnest: write through window properties to upstream server

Write through the window properties set by Xnest's client to the
upstream windows.

This is important for rootless mode.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-09-03 16:34:52 +02:00
parent 731e84e592
commit 00da0f625f
4 changed files with 118 additions and 0 deletions

View File

@ -22,6 +22,7 @@ is" without express or implied warranty.
#include <xcb/xcb_icccm.h> #include <xcb/xcb_icccm.h>
#include "dix/property_priv.h"
#include "mi/mi_priv.h" #include "mi/mi_priv.h"
#include "scrnintstr.h" #include "scrnintstr.h"
@ -512,6 +513,8 @@ breakout:
&attributes); &attributes);
} }
AddCallback(&PropertyStateCallback, xnest_property_state_callback, pScreen);
if (!xnestCreateDefaultColormap(pScreen)) if (!xnestCreateDefaultColormap(pScreen))
return FALSE; return FALSE;

View File

@ -12,6 +12,7 @@ srcs = [
'Keyboard.c', 'Keyboard.c',
'Pixmap.c', 'Pixmap.c',
'Pointer.c', 'Pointer.c',
'properties.c',
'Screen.c', 'Screen.c',
'Window.c', 'Window.c',
'../../mi/miinitext.c', '../../mi/miinitext.c',

112
hw/xnest/properties.c Normal file
View File

@ -0,0 +1,112 @@
/* SPDX-License-Identifier: MIT OR X11
*
* Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
*
* @brief property management functions
*/
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "dix/property_priv.h"
#include "include/propertyst.h"
#include "include/windowstr.h"
#include "xnest-xcb.h"
#include "Drawable.h"
static xcb_atom_t xnest_xlate_atom(struct xnest_upstream_info *upstream, ATOM outAtom)
{
return xnest_intern_atom(upstream->conn, NameForAtom(outAtom));
}
static xcb_window_t xnest_xlate_window(Window window)
{
WindowPtr pWin = dixLookupWindowByXID(window);
return (pWin ? xnestWindow(pWin) : 0);
}
static void xnest_property_xlate(ScreenPtr pScreen, PropertyStateRec *rec, void *dataBuf)
{
// must translate
switch (rec->prop->type) {
/* nothing to do for these */
case XCB_ATOM_STRING:
case XCB_ATOM_INTEGER:
case XCB_ATOM_POINT:
case XCB_ATOM_RECTANGLE:
case XCB_ATOM_WM_SIZE_HINTS:
case XCB_ATOM_CARDINAL:
case XCB_ATOM_WM_HINTS:
return;
case XCB_ATOM_ATOM:
{
xcb_atom_t *atoms = dataBuf;
for (int x=0; x<rec->prop->size; x++)
atoms[x] = xnest_xlate_atom(&xnestUpstreamInfo, atoms[x]);
return;
}
case XCB_ATOM_WINDOW:
{
xcb_window_t *windows = dataBuf;
for (int x=0; x<rec->prop->size; x++)
windows[x] = xnest_xlate_window(windows[x]);
return;
}
}
const char *atomName = NameForAtom(rec->prop->type);
if (strcmp(atomName, "UTF8_STRING")==0)
return;
if (strcmp(atomName, "_MOTIF_DRAG_RECEIVER_INFO")==0)
return;
fprintf(stderr, "WARN: unknown atom type %s\n", atomName);
}
static void xnest_property_xlate_set(ScreenPtr pScreen, PropertyStateRec *rec)
{
void *dataBuf = calloc(rec->prop->format, rec->prop->size);
if (!dataBuf)
return;
memcpy(dataBuf, rec->prop->data, (rec->prop->format / 8) * rec->prop->size);
xnest_property_xlate(pScreen, rec, dataBuf);
xnest_upstream_set_property(&xnestUpstreamInfo,
xnestWindow(rec->win),
NameForAtom(rec->prop->propertyName),
NameForAtom(rec->prop->type),
rec->state,
rec->prop->format,
rec->prop->size,
dataBuf);
free(dataBuf);
}
void xnest_property_state_callback(CallbackListPtr *pcbl, void *closure, void *calldata)
{
ScreenPtr pScreen = closure;
PropertyStateRec *rec = calldata;
if (rec->win->drawable.pScreen != pScreen)
return;
if (rec->state == PropertyNewValue) {
xnest_property_xlate_set(pScreen, rec);
return;
}
xnest_upstream_set_property(&xnestUpstreamInfo,
xnestWindow(rec->win),
NameForAtom(rec->prop->propertyName),
NameForAtom(rec->prop->type),
rec->state,
rec->prop->format,
rec->prop->size,
rec->prop->data);
}

View File

@ -117,4 +117,6 @@ void xnest_upstream_set_property(
uint32_t size, uint32_t size,
void *data); void *data);
void xnest_property_state_callback(CallbackListPtr *pcbl, void *closure, void *calldata);
#endif /* __XNEST__XCB_H */ #endif /* __XNEST__XCB_H */