dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/** @file
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * Automated test of the X11 seamless Additions code.
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync * @todo Better separate test data from implementation details!
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2007-2011 Oracle Corporation
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * available from http://www.virtualbox.org. This file is free software;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * you can redistribute it and/or modify it under the terms of the GNU
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * General Public License (GPL) as published by the Free Software
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <stdlib.h> /* exit() */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <X11/Xatom.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <X11/Xmu/WinUtil.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <iprt/initterm.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <iprt/mem.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <iprt/path.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <iprt/semaphore.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <iprt/stream.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include <iprt/string.h>
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#include "../seamless.h"
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#undef DefaultRootWindow
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/******************************************************
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync* Mock X11 functions needed by the seamless X11 class *
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync******************************************************/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncint XFree(void *data)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTMemFree(data);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#define TEST_DISPLAY ((Display *)0xffff)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync#define TEST_ROOT ((Window)1)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Display *XOpenDisplay(const char *display_name);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncDisplay *XOpenDisplay(const char *display_name)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return TEST_DISPLAY;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" int XCloseDisplay(Display *display);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncint XCloseDisplay(Display *display)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncenum
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync ATOM_PROP = 1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync ATOM_DESKTOP_PROP
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Atom XInternAtom(Display *display, const char *atom_name,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Bool only_if_exists);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncAtom XInternAtom(Display *display, const char *atom_name, Bool only_if_exists)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if (!RTStrCmp(atom_name, WM_TYPE_PROP))
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return (Atom) ATOM_PROP;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if (!RTStrCmp(atom_name, WM_TYPE_DESKTOP_PROP))
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return (Atom) ATOM_DESKTOP_PROP;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertFailed();
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return (Atom)0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/** The window (if any) on which the WM_TYPE_PROP property is set to the
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * WM_TYPE_DESKTOP_PROP atom. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic Window g_hSmlsDesktopWindow = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" int XGetWindowProperty(Display *display, Window w, Atom property,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync long long_offset, long long_length,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Bool delProp, Atom req_type,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Atom *actual_type_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int *actual_format_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned long *nitems_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned long *bytes_after_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned char **prop_return);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncint XGetWindowProperty(Display *display, Window w, Atom property,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync long long_offset, long long_length, Bool delProp,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Atom req_type, Atom *actual_type_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int *actual_format_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned long *nitems_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned long *bytes_after_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned char **prop_return)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Atom atomType = XInternAtom (display, WM_TYPE_PROP, true);
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Atom atomTypeDesktop = XInternAtom (display, WM_TYPE_DESKTOP_PROP, true);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /* We only handle things we expect. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertReturn((req_type == XA_ATOM) || (req_type == AnyPropertyType),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 0xffff);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertReturn(property == atomType, 0xffff);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *actual_type_return = XA_ATOM;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *actual_format_return = sizeof(Atom) * 8;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *nitems_return = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *bytes_after_return = sizeof(Atom);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *prop_return = NULL;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if ((w != g_hSmlsDesktopWindow) || (g_hSmlsDesktopWindow == 0))
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return Success;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertReturn(long_offset == 0, 0);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertReturn(delProp == false, 0);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned char *pProp;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pProp = (unsigned char *)RTMemDup(&atomTypeDesktop,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync sizeof(atomTypeDesktop));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertReturn(pProp, 0xffff);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *nitems_return = 1;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *prop_return = pProp;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *bytes_after_return = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/** Sets the current set of properties for all mock X11 windows */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic void smlsSetDesktopWindow(Window hWin)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_hSmlsDesktopWindow = hWin;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Bool XShapeQueryExtension (Display *dpy, int *event_basep,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int *error_basep);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncBool XShapeQueryExtension (Display *dpy, int *event_basep, int *error_basep)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(dpy == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return true;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/* We silently ignore this for now. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" int XSelectInput(Display *display, Window w, long event_mask);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncint XSelectInput(Display *display, Window w, long event_mask)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/* We silently ignore this for now. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" void XShapeSelectInput(Display *display, Window w,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned long event_mask);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncvoid XShapeSelectInput(Display *display, Window w, unsigned long event_mask)
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Window XDefaultRootWindow(Display *display);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncWindow XDefaultRootWindow(Display *display)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return TEST_ROOT;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic unsigned g_cSmlsWindows = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic Window *g_paSmlsWindows = NULL;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XWindowAttributes *g_paSmlsWinAttribs = NULL;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic const char **g_papszSmlsWinNames = NULL;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Status XQueryTree(Display *display, Window w, Window *root_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window *parent_return, Window **children_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned int *nchildren_return);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncStatus XQueryTree(Display *display, Window w, Window *root_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window *parent_return, Window **children_return,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned int *nchildren_return)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertReturn(w == TEST_ROOT, False); /* We support nothing else */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertPtrReturn(children_return, False);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertReturn(g_paSmlsWindows, False);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if (root_return)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *root_return = TEST_ROOT;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if (parent_return)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *parent_return = TEST_ROOT;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *children_return = (Window *)RTMemDup(g_paSmlsWindows,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_cSmlsWindows * sizeof(Window));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if (nchildren_return)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *nchildren_return = g_cSmlsWindows;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return (g_cSmlsWindows != 0);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Window XmuClientWindow(Display *dpy, Window win);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncWindow XmuClientWindow(Display *dpy, Window win)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(dpy == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return win;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Status XGetWindowAttributes(Display *display, Window w,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync XWindowAttributes *window_attributes_return);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncStatus XGetWindowAttributes(Display *display, Window w,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync XWindowAttributes *window_attributes_return)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertPtrReturn(window_attributes_return, 1);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync for (unsigned i = 0; i < g_cSmlsWindows; ++i)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if (g_paSmlsWindows[i] == w)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync {
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *window_attributes_return = g_paSmlsWinAttribs[i];
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return 1;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsyncextern "C" Status XGetWMNormalHints(Display *display, Window w,
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync XSizeHints *hints_return,
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync long *supplied_return);
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsyncStatus XGetWMNormalHints(Display *display, Window w,
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync XSizeHints *hints_return, long *supplied_return)
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync return 1;
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync}
9cba9a10f12ba5184ad5d2a3ce05b0caba8d09favboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic void smlsSetWindowAttributes(XWindowAttributes *pAttribs,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window *pWindows, unsigned cAttribs,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync const char **paNames)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_paSmlsWinAttribs = pAttribs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_paSmlsWindows = pWindows;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_cSmlsWindows = cAttribs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_papszSmlsWinNames = paNames;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic Window g_SmlsShapedWindow = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic int g_cSmlsShapeRectangles = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XRectangle *g_pSmlsShapeRectangles = NULL;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" XRectangle *XShapeGetRectangles (Display *dpy, Window window,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int kind, int *count,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int *ordering);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncXRectangle *XShapeGetRectangles (Display *dpy, Window window, int kind,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int *count, int *ordering)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(dpy == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if ((window != g_SmlsShapedWindow) || (window == 0))
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return NULL; /* Probably not correct, but works for us. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *count = g_cSmlsShapeRectangles;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync *ordering = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return (XRectangle *)RTMemDup(g_pSmlsShapeRectangles,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync sizeof(XRectangle)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * g_cSmlsShapeRectangles);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic void smlsSetShapeRectangles(Window window, int cRects,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync XRectangle *pRects)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_SmlsShapedWindow = window;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_cSmlsShapeRectangles = cRects;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_pSmlsShapeRectangles = pRects;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsyncstatic int g_SmlsEventType = 0;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsyncstatic Window g_SmlsEventWindow = 0;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/* This should not be needed in the bits of the code we test. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" int XNextEvent(Display *display, XEvent *event_return);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncint XNextEvent(Display *display, XEvent *event_return)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync event_return->xany.type = g_SmlsEventType;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync event_return->xany.window = g_SmlsEventWindow;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync event_return->xmap.window = g_SmlsEventWindow;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync return True;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync}
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsyncstatic void smlsSetNextEvent(int type, Window window)
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync{
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync g_SmlsEventType = type;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync g_SmlsEventWindow = window;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/* This should not be needed in the bits of the code we test. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" Status XSendEvent(Display *display, Window w, Bool propagate,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync long event_mask, XEvent *event_send);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncStatus XSendEvent(Display *display, Window w, Bool propagate,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync long event_mask, XEvent *event_send)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertFailedReturn(0);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/* This should not be needed in the bits of the code we test. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncextern "C" int XFlush(Display *display);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncint XFlush(Display *display)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync Assert(display == TEST_DISPLAY);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync AssertFailedReturn(0);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync/** Global "received a notification" flag. */
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsyncstatic bool g_fNotified = false;
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync/** Dummy host call-back. */
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsyncstatic void sendRegionUpdate(RTRECT *pRects, size_t cRects)
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync{
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync g_fNotified = true;
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync}
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsyncstatic bool gotNotification(void)
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync{
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync if (!g_fNotified)
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync return false;
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync g_fNotified = false;
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync return true;
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync}
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*****************************
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync* The actual tests to be run *
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync*****************************/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/** The name of the unit test */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic const char *g_pszTestName = NULL;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*** Test fixture data and data structures ***/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/** A structure describing a test fixture to be run through. Each fixture
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * describes the state of the windows visible (and unmapped) on the X server
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * before and after a particular event is delivered, and the expected
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * on-screen positions of all interesting visible windows at the end of the
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * fixture as reported by the code (currently in the order it is likely to
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * report them in, @todo sort this). We expect that the set of visible
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * windows will be the same whether we start the code before the event and
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * handle it or start the code after the event.
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstruct SMLSFIXTURE
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The number of windows visible before the event */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned cWindowsBefore;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** An array of Window IDs for the visible and unmapped windows before
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * the event */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window *pahWindowsBefore;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The window attributes matching the windows in @a paWindowsBefore */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync XWindowAttributes *paAttribsBefore;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The window names matching the windows in @a paWindowsBefore */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync const char **papszNamesBefore;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The shaped window before the event - we allow at most one of these.
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * Zero for none. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window hShapeWindowBefore;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The number of rectangles in the shaped window before the event. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int cShapeRectsBefore;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The rectangles in the shaped window before the event */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync XRectangle *paShapeRectsBefore;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The number of windows visible after the event */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned cWindowsAfter;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** An array of Window IDs for the visible and unmapped windows after
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * the event */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window *pahWindowsAfter;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The window attributes matching the windows in @a paWindowsAfter */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync XWindowAttributes *paAttribsAfter;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The window names matching the windows in @a paWindowsAfter */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync const char **papszNamesAfter;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The shaped window after the event - we allow at most one of these.
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * Zero for none. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window hShapeWindowAfter;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The number of rectangles in the shaped window after the event. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int cShapeRectsAfter;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The rectangles in the shaped window after the event */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync XRectangle *paShapeRectsAfter;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The event to delivered */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync int x11EventType;
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync /** The window for which the event in @enmEvent is delivered */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync Window hEventWindow;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The number of windows expected to be reported at the end of the
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync * fixture */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned cReportedRects;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync /** The onscreen positions of those windows. */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTRECT *paReportedRects;
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync /** Do we expect notification after the event? */
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync bool fExpectNotification;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*** Test fixture to test the code against X11 configure (move) events ***/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic Window g_ahWin1[] = { 20 };
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XWindowAttributes g_aAttrib1Before[] =
7f581f9444a4d569475da724d7fde45b9a225899vboxsync{ { 100, 200, 200, 300, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, IsViewable }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XRectangle g_aRectangle1[] =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync { 0, 0, 50, 50 },
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync { 50, 50, 150, 250 }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XWindowAttributes g_aAttrib1After[] =
7f581f9444a4d569475da724d7fde45b9a225899vboxsync{ { 200, 300, 200, 300, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, IsViewable }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic const char *g_apszNames1[] = { "Test Window" };
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncAssertCompile(RT_ELEMENTS(g_ahWin1) == RT_ELEMENTS(g_aAttrib1Before));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncAssertCompile(RT_ELEMENTS(g_ahWin1) == RT_ELEMENTS(g_aAttrib1After));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncAssertCompile(RT_ELEMENTS(g_ahWin1) == RT_ELEMENTS(g_apszNames1));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic RTRECT g_aRects1[] =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync { 200, 300, 250, 350 },
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync { 250, 350, 400, 600 }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic SMLSFIXTURE g_testMove =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib1Before,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib1After,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync ConfigureNotify,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRects1),
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync g_aRects1,
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync true
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*** Test fixture to test the code against X11 configure (resize) events ***/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XWindowAttributes g_aAttrib2Before[] =
7f581f9444a4d569475da724d7fde45b9a225899vboxsync{ { 100, 200, 200, 300, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, IsViewable }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XRectangle g_aRectangle2Before[] =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync { 0, 0, 50, 50 },
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync { 50, 50, 100, 100 }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncAssertCompile(RT_ELEMENTS(g_ahWin1) == RT_ELEMENTS(g_aAttrib2Before));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic SMLSFIXTURE g_testResize =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib2Before,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle2Before),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle2Before,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib1After,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
b65d53aa41a5d4f584a5ae6833c741dad0a4da43vboxsync ConfigureNotify,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRects1),
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync g_aRects1,
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync true
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*** Test fixture to test the code against X11 map events ***/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XWindowAttributes g_aAttrib3Before[] =
7f581f9444a4d569475da724d7fde45b9a225899vboxsync{ { 200, 300, 200, 300, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, IsUnmapped }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncAssertCompile(RT_ELEMENTS(g_ahWin1) == RT_ELEMENTS(g_aAttrib3Before));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic SMLSFIXTURE g_testMap =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib3Before,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib1After,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync MapNotify,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRects1),
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync g_aRects1,
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync true
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync/*** Test fixtures to test the code against X11 unmap events ***/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XWindowAttributes g_aAttrib4After[] =
7f581f9444a4d569475da724d7fde45b9a225899vboxsync{ { 100, 200, 300, 400, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, IsUnmapped }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncAssertCompile(RT_ELEMENTS(g_ahWin1) == RT_ELEMENTS(g_aAttrib4After));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic SMLSFIXTURE g_testUnmap =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib1Before,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib4After,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync UnmapNotify,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 0,
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync NULL,
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync true
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync/*** A window we are not monitoring has been unmapped. Nothing should
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync *** happen, especially nothing bad. ***/
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsyncstatic RTRECT g_aRects2[] =
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync { 100, 200, 150, 250 },
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync { 150, 250, 300, 500 }
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync};
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsyncstatic SMLSFIXTURE g_testUnmapOther =
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync{
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync RT_ELEMENTS(g_ahWin1),
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_ahWin1,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_aAttrib1Before,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_apszNames1,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync 20,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync RT_ELEMENTS(g_aRectangle1),
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_aRectangle1,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync RT_ELEMENTS(g_ahWin1),
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_ahWin1,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_aAttrib1Before,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_apszNames1,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync 20,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync RT_ELEMENTS(g_aRectangle1),
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync g_aRectangle1,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync UnmapNotify,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync 21,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync RT_ELEMENTS(g_aRects2),
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync g_aRects2,
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync false
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync};
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*** Test fixture to test the code against X11 shape events ***/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic XRectangle g_aRectangle5Before[] =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync { 0, 0, 200, 200 }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic SMLSFIXTURE g_testShape =
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
d6e0f6a5d8642c681e6d12d43fc0069da7a5dff6vboxsync g_aAttrib1After,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle5Before),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle5Before,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_ahWin1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_ahWin1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aAttrib1After,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_apszNames1,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRectangle1),
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_aRectangle1,
d6e0f6a5d8642c681e6d12d43fc0069da7a5dff6vboxsync VBoxShapeNotify,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync 20,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RT_ELEMENTS(g_aRects1),
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync g_aRects1,
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync true
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync};
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/*** And the test code proper ***/
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/** Compare two RTRECT structures */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic bool smlsCompRect(RTRECT *pFirst, RTRECT *pSecond)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return ( (pFirst->xLeft == pSecond->xLeft)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync && (pFirst->yTop == pSecond->yTop)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync && (pFirst->xRight == pSecond->xRight)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync && (pFirst->yBottom == pSecond->yBottom));
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic void smlsPrintDiffRects(RTRECT *pExp, RTRECT *pGot)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTPrintf(" Expected: %d, %d, %d, %d. Got: %d, %d, %d, %d\n",
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pExp->xLeft, pExp->yTop, pExp->xRight, pExp->yBottom,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pGot->xLeft, pGot->yTop, pGot->xRight, pGot->yBottom);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync/** Run through a test fixture */
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncstatic unsigned smlsDoFixture(SMLSFIXTURE *pFixture, const char *pszDesc)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
cf59f0d26d20b28df49bd34b4c33401e009c4fe6vboxsync SeamlessX11 subject;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned cErrs = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync subject.init(sendRegionUpdate);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync smlsSetWindowAttributes(pFixture->paAttribsBefore,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->pahWindowsBefore,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->cWindowsBefore,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->papszNamesBefore);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync smlsSetShapeRectangles(pFixture->hShapeWindowBefore,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->cShapeRectsBefore,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->paShapeRectsBefore);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync subject.start();
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync smlsSetWindowAttributes(pFixture->paAttribsAfter,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->pahWindowsAfter,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->cWindowsAfter,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->papszNamesAfter);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync smlsSetShapeRectangles(pFixture->hShapeWindowAfter,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->cShapeRectsAfter,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync pFixture->paShapeRectsAfter);
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync smlsSetNextEvent(pFixture->x11EventType, pFixture->hEventWindow);
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync if (gotNotification()) /* Initial window tree rebuild */
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync {
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync RTPrintf("%s: fixture: %s. Notification was set before the first event!!!\n",
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync g_pszTestName, pszDesc);
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync ++cErrs;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync }
55f8207f2ca77fc138ff90d0587fba188db994b6vboxsync subject.nextConfigurationEvent();
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync if (!gotNotification())
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync {
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync RTPrintf("%s: fixture: %s. No notification was sent for the initial window tree rebuild.\n",
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync g_pszTestName, pszDesc);
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync ++cErrs;
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync }
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync smlsSetNextEvent(0, 0);
55f8207f2ca77fc138ff90d0587fba188db994b6vboxsync subject.nextConfigurationEvent();
d94f612deb40b0526d5752b3bfd04707d3f7ff2bvboxsync if (pFixture->fExpectNotification && !gotNotification())
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync {
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync RTPrintf("%s: fixture: %s. No notification was sent after the event.\n",
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync g_pszTestName, pszDesc);
938e0729a8e58abec28ef5e9cdb7bf1fabac6b58vboxsync ++cErrs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync }
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync RTRECT *pRects = subject.getRects();
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync size_t cRects = subject.getRectCount();
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync if (cRects != pFixture->cReportedRects)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync {
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTPrintf("%s: fixture: %s. Wrong number of rectangles reported after processing event (expected %u, got %u).\n",
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_pszTestName, pszDesc, pFixture->cReportedRects,
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync cRects);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync ++cErrs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync else
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync for (unsigned i = 0; i < cRects; ++i)
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync if (!smlsCompRect(&pRects[i], &pFixture->paReportedRects[i]))
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync {
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTPrintf("%s: fixture: %s. Rectangle %u wrong after processing event.\n",
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_pszTestName, pszDesc, i);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync smlsPrintDiffRects(&pFixture->paReportedRects[i],
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync &pRects[i]);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync ++cErrs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync break;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync subject.stop();
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync subject.start();
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync if (cRects != pFixture->cReportedRects)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync {
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTPrintf("%s: fixture: %s. Wrong number of rectangles reported without processing event (expected %u, got %u).\n",
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_pszTestName, pszDesc, pFixture->cReportedRects,
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync cRects);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync ++cErrs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync else
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync for (unsigned i = 0; i < cRects; ++i)
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync if (!smlsCompRect(&pRects[i], &pFixture->paReportedRects[i]))
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync {
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTPrintf("%s: fixture: %s. Rectangle %u wrong without processing event.\n",
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_pszTestName, pszDesc, i);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync smlsPrintDiffRects(&pFixture->paReportedRects[i],
133ac536a3d32062cf6b4c076da39da9e80f91a5vboxsync &pRects[i]);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync ++cErrs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync break;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync }
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return cErrs;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsyncint main( int argc, char **argv)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync{
230bd8589bba39933ac5ec21482d6186d675e604vboxsync RTR3InitExe(argc, &argv, 0);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync unsigned cErrs = 0;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync g_pszTestName = RTPathFilename(argv[0]);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTPrintf("%s: TESTING\n", g_pszTestName);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync cErrs += smlsDoFixture(&g_testMove,
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync "ConfigureNotify event (window moved)");
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync // Currently not working
b65d53aa41a5d4f584a5ae6833c741dad0a4da43vboxsync cErrs += smlsDoFixture(&g_testResize,
b65d53aa41a5d4f584a5ae6833c741dad0a4da43vboxsync "ConfigureNotify event (window resized)");
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync cErrs += smlsDoFixture(&g_testMap, "MapNotify event");
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync cErrs += smlsDoFixture(&g_testUnmap, "UnmapNotify event");
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync cErrs += smlsDoFixture(&g_testUnmapOther,
b6415accd33648174afbfd16edc4dc0f894a6bf2vboxsync "UnmapNotify event for unmonitored window");
d6e0f6a5d8642c681e6d12d43fc0069da7a5dff6vboxsync cErrs += smlsDoFixture(&g_testShape, "ShapeNotify event");
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync if (cErrs > 0)
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync RTPrintf("%u errors\n", cErrs);
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync return cErrs == 0 ? 0 : 1;
dab2041a9c063e43814b7b69538c2856cd78bd18vboxsync}