Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
4690d6b7
Commit
4690d6b7
authored
Apr 11, 2016
by
Mike Gabriel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hw/nxagent/NXwindow.c: Shrink file, drop duplicate code that can identically be…
hw/nxagent/NXwindow.c: Shrink file, drop duplicate code that can identically be found in dix/window.c.
parent
e60f281a
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
164 additions
and
3132 deletions
+164
-3132
Imakefile
nx-X11/programs/Xserver/dix/Imakefile
+2
-2
window.c
nx-X11/programs/Xserver/dix/window.c
+51
-3
NXwindow.c
nx-X11/programs/Xserver/hw/nxagent/NXwindow.c
+109
-3127
Screen.h
nx-X11/programs/Xserver/hw/nxagent/Screen.h
+2
-0
No files found.
nx-X11/programs/Xserver/dix/Imakefile
View file @
4690d6b7
...
...
@@ -16,9 +16,11 @@ FFS_OBJ = ffs.o
#if (!(defined(NXAgentServer) && NXAgentServer))
NXAGENT_SKIP_SRCS = \
extension.c \
window.c \
$(NULL)
NXAGENT_SKIP_OBJS = \
extension.o \
window.o \
$(NULL)
#endif
...
...
@@ -42,7 +44,6 @@ SRCS = \
swaprep.c \
swapreq.c \
tables.c \
window.c \
initatoms.c \
dixfonts.c \
privates.c \
...
...
@@ -70,7 +71,6 @@ OBJS = \
swaprep.o \
swapreq.o \
tables.o \
window.o \
initatoms.o \
dixfonts.o \
privates.o \
...
...
nx-X11/programs/Xserver/dix/window.c
View file @
4690d6b7
...
...
@@ -160,7 +160,7 @@ static Bool TileScreenSaver(int i, int kind);
int
numSaveUndersViewable
=
0
;
int
deltaSaveUndersViewable
=
0
;
#if
def DEBUG
#if
defined(DEBUG) || (defined(NXAGENT_SERVER) && defined(WINDOW_TREE_DEBUG))
/******
* PrintWindowTree
* For debugging only
...
...
@@ -286,6 +286,7 @@ SetWindowToDefaults(register WindowPtr pWin)
#endif
}
#ifndef NXAGENT_SERVER
static
void
MakeRootTile
(
WindowPtr
pWin
)
{
...
...
@@ -331,6 +332,7 @@ MakeRootTile(WindowPtr pWin)
FreeScratchGC
(
pGC
);
}
#endif
/* NXAGENT_SERVER */
WindowPtr
AllocateWindow
(
ScreenPtr
pScreen
)
...
...
@@ -477,6 +479,7 @@ CreateRootWindow(ScreenPtr pScreen)
return
TRUE
;
}
#ifndef NXAGENT_SERVER
void
InitRootWindow
(
WindowPtr
pWin
)
{
...
...
@@ -498,6 +501,7 @@ InitRootWindow(WindowPtr pWin)
MapWindow
(
pWin
,
serverClient
);
}
#endif
/* NXAGENT_SERVER */
/* Set the region to the intersection of the rectangle and the
* window's winSize. The window is typically the parent of the
...
...
@@ -872,13 +876,15 @@ CrushTree(WindowPtr pWin)
}
}
}
/*****
* DeleteWindow
* Deletes child of window then window itself
* If wid is None, don't send any events
*****/
#ifndef NXAGENT_SERVER
int
DeleteWindow
(
void
*
value
,
XID
wid
)
{
...
...
@@ -914,6 +920,7 @@ DeleteWindow(void * value, XID wid)
xfree
(
pWin
);
return
Success
;
}
#endif
/* NXAGENT_SERVER */
void
DestroySubwindows
(
register
WindowPtr
pWin
,
ClientPtr
client
)
...
...
@@ -1231,6 +1238,25 @@ ChangeWindowAttributes(register WindowPtr pWin, Mask vmask, XID *vlist, ClientPt
#endif
/* DO_SAVE_UNDERS */
break
;
case
CWEventMask
:
/*
* TODO: Some applications like java bean shell
* don' t work if they cannot monitor the root
* window for Structure Redirect events. However
* this doesn't seem to be the best solution, since
* also an X server with a window manager running,
* doesn't allow to monitor for those events, but
* the java bean shell works flawlessy on this
* server.
*
* #ifdef NXAGENT_SERVER
* if (nxagentCheckIllegalRootMonitoring(pWin, (Mask)*pVlist))
* {
* return BadAccess;
* }
* #endif
*/
result
=
EventSelectForWindow
(
pWin
,
client
,
(
Mask
)
*
pVlist
);
if
(
result
)
{
...
...
@@ -1752,6 +1778,7 @@ GravityTranslate (register int x, register int y, int oldx, int oldy,
}
/* XXX need to retile border on each window with ParentRelative origin */
#ifndef NXAGENT_SERVER
void
ResizeChildrenWinSize
(
register
WindowPtr
pWin
,
int
dx
,
int
dy
,
int
dw
,
int
dh
)
{
...
...
@@ -1816,6 +1843,7 @@ ResizeChildrenWinSize(register WindowPtr pWin, int dx, int dy, int dw, int dh)
}
}
}
#endif
/* NXAGENT_SERVER */
#define GET_INT16(m, f) \
if (m & mask) \
...
...
@@ -2164,6 +2192,7 @@ ReflectStackChange(
* ConfigureWindow
*****/
#ifndef NXAGENT_SERVER
int
ConfigureWindow
(
register
WindowPtr
pWin
,
register
Mask
mask
,
XID
*
vlist
,
ClientPtr
client
)
{
...
...
@@ -2417,6 +2446,7 @@ ActuallyDoSomething:
#undef RESIZE_WIN
#undef REBORDER_WIN
}
#endif
/* NXAGENT_SERVER */
/******
...
...
@@ -2436,6 +2466,17 @@ CirculateWindow(WindowPtr pParent, int direction, ClientPtr client)
xEvent
event
;
BoxRec
box
;
/*
* #ifdef NXAGENT_SERVER
* if (nxagentOption(Rootless) && nxagentWMIsRunning &&
* nxagentWindowTopLevel(pWin) && pWin -> overrideRedirect == 0)
* {
* nxagentCirculateRootlessWindows(direction);
* return Success;
* }
* #endif
*/
pHead
=
RealChildHead
(
pParent
);
pFirst
=
pHead
?
pHead
->
nextSib
:
pParent
->
firstChild
;
if
(
direction
==
RaiseLowest
)
...
...
@@ -2501,6 +2542,7 @@ CompareWIDs(
* ReparentWindow
*****/
#ifndef NXAGENT_SERVER
int
ReparentWindow
(
register
WindowPtr
pWin
,
register
WindowPtr
pParent
,
int
x
,
int
y
,
ClientPtr
client
)
...
...
@@ -2593,6 +2635,7 @@ ReparentWindow(register WindowPtr pWin, register WindowPtr pParent,
RecalculateDeliverableEvents
(
pWin
);
return
(
Success
);
}
#endif
/* NXAGENT_SERVER */
static
void
RealizeTree
(
WindowPtr
pWin
)
...
...
@@ -2635,6 +2678,7 @@ RealizeTree(WindowPtr pWin)
* MapNotify event is generated.
*****/
#ifndef NXAGENT_SERVER
int
MapWindow
(
register
WindowPtr
pWin
,
ClientPtr
client
)
{
...
...
@@ -2737,7 +2781,7 @@ MapWindow(register WindowPtr pWin, ClientPtr client)
return
(
Success
);
}
#endif
/* NXAGENT_SERVER */
/*****
* MapSubwindows
...
...
@@ -2926,6 +2970,7 @@ UnrealizeTree(
* generated. Cannot unmap a root window.
*****/
#ifndef NXAGENT_SERVER
int
UnmapWindow
(
register
WindowPtr
pWin
,
Bool
fromConfigure
)
{
...
...
@@ -2979,6 +3024,7 @@ UnmapWindow(register WindowPtr pWin, Bool fromConfigure)
WindowsRestructured
();
return
(
Success
);
}
#endif
/* NXAGENT_SERVER */
/*****
* UnmapSubwindows
...
...
@@ -3251,6 +3297,7 @@ static void DrawLogo(
);
#endif
#ifndef NXAGENT_SERVER
void
SaveScreens
(
int
on
,
int
mode
)
{
...
...
@@ -3363,6 +3410,7 @@ SaveScreens(int on, int mode)
if
(
mode
==
ScreenSaverReset
)
SetScreenSaverTimer
();
}
#endif
/* NXAGENT_SERVER */
static
Bool
TileScreenSaver
(
int
i
,
int
kind
)
...
...
nx-X11/programs/Xserver/hw/nxagent/NXwindow.c
View file @
4690d6b7
...
...
@@ -97,38 +97,7 @@ Equipment Corporation.
/* $XFree86: xc/programs/Xserver/dix/window.c,v 3.36 2003/11/14 23:52:50 torrey Exp $ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "misc.h"
#include "scrnintstr.h"
#include "os.h"
#include "regionstr.h"
#include "validate.h"
#include "windowstr.h"
#include "input.h"
#include "resource.h"
#include "colormapst.h"
#include "cursorstr.h"
#include "dixstruct.h"
#include "gcstruct.h"
#include "servermd.h"
#include "selection.h"
#ifdef PANORAMIX
#include "../../Xext/panoramiX.h"
#include "../../Xext/panoramiXsrv.h"
#endif
#include "dixevents.h"
#include "globals.h"
#ifdef XAPPGROUP
#include <nx-X11/extensions/Xagsrv.h>
#endif
#ifdef XCSECURITY
#define _SECURITY_SERVER
#include <nx-X11/extensions/security.h>
#endif
#include "Screen.h"
#include "Options.h"
...
...
@@ -140,56 +109,14 @@ Equipment Corporation.
#include "Drawable.h"
#include "Colormap.h"
extern
Bool
nxagentWMIsRunning
;
extern
Bool
nxagentScreenTrap
;
/******
* Window stuff for server
*
* CreateRootWindow, CreateWindow, ChangeWindowAttributes,
* GetWindowAttributes, DeleteWindow, DestroySubWindows,
* HandleSaveSet, ReparentWindow, MapWindow, MapSubWindows,
* UnmapWindow, UnmapSubWindows, ConfigureWindow, CirculateWindow,
*
******/
static
unsigned
char
_back_lsb
[
4
]
=
{
0x88
,
0x22
,
0x44
,
0x11
};
static
unsigned
char
_back_msb
[
4
]
=
{
0x11
,
0x44
,
0x22
,
0x88
};
int
screenIsSaved
=
SCREEN_SAVER_OFF
;
ScreenSaverStuffRec
savedScreenInfo
[
MAXSCREENS
];
#if 0
extern void DeleteWindowFromAnyEvents();
extern Mask EventMaskForClient();
extern void WindowHasNewCursor();
extern void RecalculateDeliverableEvents();
#endif
static
Bool
TileScreenSaver
(
int
i
,
int
kind
);
#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
CWDontPropagate | CWOverrideRedirect | CWCursor )
/* prototypes (only MakeRootTile() required here) */
#define BOXES_OVERLAP(b1, b2) \
(!( ((b1)->x2 <= (b2)->x1) || \
( ((b1)->x1 >= (b2)->x2)) || \
( ((b1)->y2 <= (b2)->y1)) || \
( ((b1)->y1 >= (b2)->y2)) ) )
static
void
MakeRootTile
(
WindowPtr
pWin
);
#define RedirectSend(pWin) \
((pWin->eventMask|wOtherEventMasks(pWin)) & SubstructureRedirectMask)
#define SubSend(pWin) \
((pWin->eventMask|wOtherEventMasks(pWin)) & SubstructureNotifyMask)
#define StrSend(pWin) \
((pWin->eventMask|wOtherEventMasks(pWin)) & StructureNotifyMask)
#define SubStrSend(pWin,pParent) (StrSend(pWin) || SubSend(pParent))
#include "../../dix/window.c"
extern
Bool
nxagentWMIsRunning
;
extern
Bool
nxagentScreenTrap
;
/*
* Set here the required log level.
...
...
@@ -200,143 +127,8 @@ static Bool TileScreenSaver(int i, int kind);
#undef TEST
#undef DEBUG
int
numSaveUndersViewable
=
0
;
int
deltaSaveUndersViewable
=
0
;
WindowPtr
nxagentRootTileWindow
;
/*
* This block used the DEBUG symbol.
*/
#ifdef WINDOW_TREE_DEBUG
/******
* PrintWindowTree
* For debugging only
******/
int
PrintChildren
(
WindowPtr
p1
,
int
indent
)
{
WindowPtr
p2
;
int
i
;
while
(
p1
)
{
p2
=
p1
->
firstChild
;
for
(
i
=
0
;
i
<
indent
;
i
++
)
ErrorF
(
" "
);
ErrorF
(
"%x
\n
"
,
p1
->
drawable
.
id
);
RegionPrint
(
&
p1
->
clipList
);
PrintChildren
(
p2
,
indent
+
4
);
p1
=
p1
->
nextSib
;
}
}
PrintWindowTree
()
{
int
i
;
WindowPtr
pWin
,
p1
;
for
(
i
=
0
;
i
<
screenInfo
.
numScreens
;
i
++
)
{
ErrorF
(
"WINDOW %d
\n
"
,
i
);
pWin
=
screenInfo
.
screens
[
i
]
->
root
;
RegionPrint
(
&
pWin
->
clipList
);
p1
=
pWin
->
firstChild
;
PrintChildren
(
p1
,
4
);
}
}
#endif
int
TraverseTree
(
register
WindowPtr
pWin
,
VisitWindowProcPtr
func
,
void
*
data
)
{
register
int
result
;
register
WindowPtr
pChild
;
if
(
!
(
pChild
=
pWin
))
return
(
WT_NOMATCH
);
while
(
1
)
{
result
=
(
*
func
)(
pChild
,
data
);
if
(
result
==
WT_STOPWALKING
)
return
(
WT_STOPWALKING
);
if
((
result
==
WT_WALKCHILDREN
)
&&
pChild
->
firstChild
)
{
pChild
=
pChild
->
firstChild
;
continue
;
}
while
(
!
pChild
->
nextSib
&&
(
pChild
!=
pWin
))
pChild
=
pChild
->
parent
;
if
(
pChild
==
pWin
)
break
;
pChild
=
pChild
->
nextSib
;
}
return
(
WT_NOMATCH
);
}
/*****
* WalkTree
* Walk the window tree, for SCREEN, preforming FUNC(pWin, data) on
* each window. If FUNC returns WT_WALKCHILDREN, traverse the children,
* if it returns WT_DONTWALKCHILDREN, dont. If it returns WT_STOPWALKING
* exit WalkTree. Does depth-first traverse.
*****/
int
WalkTree
(
ScreenPtr
pScreen
,
VisitWindowProcPtr
func
,
void
*
data
)
{
return
(
TraverseTree
(
pScreen
->
root
,
func
,
data
));
}
/* hack for forcing backing store on all windows */
int
defaultBackingStore
=
NotUseful
;
/* hack to force no backing store */
Bool
disableBackingStore
=
FALSE
;
Bool
enableBackingStore
=
FALSE
;
/* hack to force no save unders */
Bool
disableSaveUnders
=
FALSE
;
static
void
SetWindowToDefaults
(
register
WindowPtr
pWin
)
{
pWin
->
prevSib
=
NullWindow
;
pWin
->
firstChild
=
NullWindow
;
pWin
->
lastChild
=
NullWindow
;
pWin
->
valdata
=
(
ValidatePtr
)
NULL
;
pWin
->
optional
=
(
WindowOptPtr
)
NULL
;
pWin
->
cursorIsNone
=
TRUE
;
pWin
->
backingStore
=
NotUseful
;
pWin
->
DIXsaveUnder
=
FALSE
;
pWin
->
backStorage
=
(
void
*
)
NULL
;
pWin
->
mapped
=
FALSE
;
/* off */
pWin
->
realized
=
FALSE
;
/* off */
pWin
->
viewable
=
FALSE
;
pWin
->
visibility
=
VisibilityNotViewable
;
pWin
->
overrideRedirect
=
FALSE
;
pWin
->
saveUnder
=
FALSE
;
pWin
->
bitGravity
=
ForgetGravity
;
pWin
->
winGravity
=
NorthWestGravity
;
pWin
->
eventMask
=
0
;
pWin
->
deliverableEvents
=
0
;
pWin
->
dontPropagate
=
0
;
pWin
->
forcedBS
=
FALSE
;
#ifdef NEED_DBE_BUF_BITS
pWin
->
srcBuffer
=
DBE_FRONT_BUFFER
;
pWin
->
dstBuffer
=
DBE_FRONT_BUFFER
;
#endif
#ifdef COMPOSITE
pWin
->
redirectDraw
=
0
;
#endif
}
#ifdef NXAGENT_SERVER
void
nxagentClearSplash
(
WindowPtr
pW
)
{
ScreenPtr
pScreen
;
...
...
@@ -354,8 +146,6 @@ void nxagentClearSplash(WindowPtr pW)
(
*
pScreen
->
ChangeWindowAttributes
)(
pW
,
CWBackPixmap
|
CWBackPixel
);
}
#endif
/* NXAGENT_SERVER */
static
void
MakeRootTile
(
WindowPtr
pWin
)
{
...
...
@@ -400,167 +190,9 @@ MakeRootTile(WindowPtr pWin)
FreeScratchGC
(
pGC
);
#ifdef NXAGENT_SERVER
nxagentRootTileWindow
=
pWin
;
#endif
/* NXAGENT_SERVER */
}
WindowPtr
AllocateWindow
(
ScreenPtr
pScreen
)
{
WindowPtr
pWin
;
register
char
*
ptr
;
register
DevUnion
*
ppriv
;
register
unsigned
*
sizes
;
register
unsigned
size
;
register
int
i
;
pWin
=
(
WindowPtr
)
xalloc
(
pScreen
->
totalWindowSize
);
if
(
pWin
)
{
ppriv
=
(
DevUnion
*
)(
pWin
+
1
);
pWin
->
devPrivates
=
ppriv
;
sizes
=
pScreen
->
WindowPrivateSizes
;
ptr
=
(
char
*
)(
ppriv
+
pScreen
->
WindowPrivateLen
);
for
(
i
=
pScreen
->
WindowPrivateLen
;
--
i
>=
0
;
ppriv
++
,
sizes
++
)
{
if
(
(
size
=
*
sizes
)
)
{
ppriv
->
ptr
=
(
void
*
)
ptr
;
ptr
+=
size
;
}
else
ppriv
->
ptr
=
(
void
*
)
NULL
;
}
}
return
pWin
;
}
/*****
* CreateRootWindow
* Makes a window at initialization time for specified screen
*****/
Bool
CreateRootWindow
(
ScreenPtr
pScreen
)
{
WindowPtr
pWin
;
BoxRec
box
;
PixmapFormatRec
*
format
;
pWin
=
AllocateWindow
(
pScreen
);
if
(
!
pWin
)
return
FALSE
;
savedScreenInfo
[
pScreen
->
myNum
].
pWindow
=
NULL
;
savedScreenInfo
[
pScreen
->
myNum
].
wid
=
FakeClientID
(
0
);
savedScreenInfo
[
pScreen
->
myNum
].
ExternalScreenSaver
=
NULL
;
screenIsSaved
=
SCREEN_SAVER_OFF
;
pScreen
->
root
=
pWin
;
pScreen
->
root
=
pWin
;
pWin
->
drawable
.
pScreen
=
pScreen
;
pWin
->
drawable
.
type
=
DRAWABLE_WINDOW
;
pWin
->
drawable
.
depth
=
pScreen
->
rootDepth
;
for
(
format
=
screenInfo
.
formats
;
format
->
depth
!=
pScreen
->
rootDepth
;
format
++
)
;
pWin
->
drawable
.
bitsPerPixel
=
format
->
bitsPerPixel
;
pWin
->
drawable
.
serialNumber
=
NEXT_SERIAL_NUMBER
;
pWin
->
parent
=
NullWindow
;
SetWindowToDefaults
(
pWin
);
pWin
->
optional
=
(
WindowOptRec
*
)
xalloc
(
sizeof
(
WindowOptRec
));
if
(
!
pWin
->
optional
)
return
FALSE
;
pWin
->
optional
->
dontPropagateMask
=
0
;
pWin
->
optional
->
otherEventMasks
=
0
;
pWin
->
optional
->
otherClients
=
NULL
;
pWin
->
optional
->
passiveGrabs
=
NULL
;
pWin
->
optional
->
userProps
=
NULL
;
pWin
->
optional
->
backingBitPlanes
=
~
0L
;
pWin
->
optional
->
backingPixel
=
0
;
#ifdef SHAPE
pWin
->
optional
->
boundingShape
=
NULL
;
pWin
->
optional
->
clipShape
=
NULL
;
pWin
->
optional
->
inputShape
=
NULL
;
#endif
#ifdef XINPUT
pWin
->
optional
->
inputMasks
=
NULL
;
#endif
pWin
->
optional
->
colormap
=
pScreen
->
defColormap
;
pWin
->
optional
->
visual
=
pScreen
->
rootVisual
;
pWin
->
nextSib
=
NullWindow
;
pWin
->
drawable
.
id
=
FakeClientID
(
0
);
pWin
->
origin
.
x
=
pWin
->
origin
.
y
=
0
;
pWin
->
drawable
.
height
=
pScreen
->
height
;
pWin
->
drawable
.
width
=
pScreen
->
width
;
pWin
->
drawable
.
x
=
pWin
->
drawable
.
y
=
0
;
box
.
x1
=
0
;
box
.
y1
=
0
;
box
.
x2
=
pScreen
->
width
;
box
.
y2
=
pScreen
->
height
;
RegionInit
(
&
pWin
->
clipList
,
&
box
,
1
);
RegionInit
(
&
pWin
->
winSize
,
&
box
,
1
);
RegionInit
(
&
pWin
->
borderSize
,
&
box
,
1
);
RegionInit
(
&
pWin
->
borderClip
,
&
box
,
1
);
pWin
->
drawable
.
class
=
InputOutput
;
pWin
->
optional
->
visual
=
pScreen
->
rootVisual
;
pWin
->
backgroundState
=
BackgroundPixel
;
pWin
->
background
.
pixel
=
pScreen
->
whitePixel
;
pWin
->
borderIsPixel
=
TRUE
;
pWin
->
border
.
pixel
=
pScreen
->
blackPixel
;
pWin
->
borderWidth
=
0
;
if
(
!
AddResource
(
pWin
->
drawable
.
id
,
RT_WINDOW
,
(
void
*
)
pWin
))
return
FALSE
;
if
(
disableBackingStore
)
{
pScreen
->
backingStoreSupport
=
NotUseful
;
}
if
(
enableBackingStore
)
{
pScreen
->
backingStoreSupport
=
Always
;
}
pScreen
->
saveUnderSupport
=
False
;
#ifdef DO_SAVE_UNDERS
if
((
pScreen
->
backingStoreSupport
!=
NotUseful
)
&&
(
pScreen
->
saveUnderSupport
==
NotUseful
))
{
/*
* If the screen has backing-store but no save-unders, let the
* clients know we can support save-unders using backing-store.
*/
pScreen
->
saveUnderSupport
=
USE_DIX_SAVE_UNDERS
;
}
#endif
/* DO_SAVE_UNDERS */
if
(
disableSaveUnders
)
pScreen
->
saveUnderSupport
=
NotUseful
;
return
TRUE
;
}
#ifdef NXAGENT_SERVER
void
InitRootWindow
(
WindowPtr
pWin
)
{
...
...
@@ -658,1391 +290,108 @@ InitRootWindow(WindowPtr pWin)
#endif
}
#else
/* NXAGENT_SERVER */
void
InitRootWindow
(
WindowPtr
pWin
)
{
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
if
(
!
(
*
pScreen
->
CreateWindow
)(
pWin
))
return
;
/* XXX */
(
*
pScreen
->
PositionWindow
)(
pWin
,
0
,
0
);
pWin
->
cursorIsNone
=
FALSE
;
pWin
->
optional
->
cursor
=
rootCursor
;
rootCursor
->
refcnt
++
;
MakeRootTile
(
pWin
);
pWin
->
backingStore
=
defaultBackingStore
;
pWin
->
forcedBS
=
(
defaultBackingStore
!=
NotUseful
);
/* We SHOULD check for an error value here XXX */
(
*
pScreen
->
ChangeWindowAttributes
)(
pWin
,
CWBackPixmap
|
CWBorderPixel
|
CWCursor
|
CWBackingStore
);
MapWindow
(
pWin
,
serverClient
);
}
#endif
/* NXAGENT_SERVER */
/* Set the region to the intersection of the rectangle and the
* window's winSize. The window is typically the parent of the
* window from which the region came.
*/
void
ClippedRegionFromBox
(
register
WindowPtr
pWin
,
RegionPtr
Rgn
,
register
int
x
,
register
int
y
,
register
int
w
,
register
int
h
)
{
#ifndef NXAGENT_SERVER
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
#endif
/* NXAGENT_SERVER */
BoxRec
box
;
box
=
*
(
RegionExtents
(
&
pWin
->
winSize
));
/* we do these calculations to avoid overflows */
if
(
x
>
box
.
x1
)
box
.
x1
=
x
;
if
(
y
>
box
.
y1
)
box
.
y1
=
y
;
x
+=
w
;
if
(
x
<
box
.
x2
)
box
.
x2
=
x
;
y
+=
h
;
if
(
y
<
box
.
y2
)
box
.
y2
=
y
;
if
(
box
.
x1
>
box
.
x2
)
box
.
x2
=
box
.
x1
;
if
(
box
.
y1
>
box
.
y2
)
box
.
y2
=
box
.
y1
;
RegionReset
(
Rgn
,
&
box
);
RegionIntersect
(
Rgn
,
Rgn
,
&
pWin
->
winSize
);
}
static
RealChildHeadProc
realChildHeadProc
=
NULL
;
void
RegisterRealChildHeadProc
(
RealChildHeadProc
proc
)
{
realChildHeadProc
=
proc
;
}
WindowPtr
RealChildHead
(
register
WindowPtr
pWin
)
{
if
(
!
pWin
->
parent
&&
(
screenIsSaved
==
SCREEN_SAVER_ON
)
&&
(
HasSaverWindow
(
pWin
->
drawable
.
pScreen
->
myNum
)))
return
(
pWin
->
firstChild
);
else
return
(
NullWindow
);
}
/*****
* CreateWindow
* Makes a window in response to client request
* DeleteWindow
* Deletes child of window then window itself
* If wid is None, don't send any events
*****/
WindowPtr
CreateWindow
(
Window
wid
,
register
WindowPtr
pParent
,
int
x
,
int
y
,
unsigned
w
,
unsigned
h
,
unsigned
bw
,
unsigned
class
,
register
Mask
vmask
,
XID
*
vlist
,
int
depth
,
ClientPtr
client
,
VisualID
visual
,
int
*
error
)
{
register
WindowPtr
pWin
;
WindowPtr
pHead
;
register
ScreenPtr
pScreen
;
int
DeleteWindow
(
void
*
value
,
XID
wid
)
{
register
WindowPtr
pParent
;
register
WindowPtr
pWin
=
(
WindowPtr
)
value
;
xEvent
event
;
int
idepth
,
ivisual
;
Bool
fOK
;
DepthPtr
pDepth
;
PixmapFormatRec
*
format
;
register
WindowOptPtr
ancwopt
;
if
(
class
==
CopyFromParent
)
class
=
pParent
->
drawable
.
class
;
UnmapWindow
(
pWin
,
FALSE
);
CrushTree
(
pWin
);
if
((
class
!=
InputOutput
)
&&
(
class
!=
InputOnly
))
pParent
=
pWin
->
parent
;
if
(
wid
&&
pParent
&&
SubStrSend
(
pWin
,
pParent
))
{
*
error
=
BadValue
;
client
->
errorValue
=
class
;
return
NullWindow
;
memset
(
&
event
,
0
,
sizeof
(
xEvent
));
event
.
u
.
u
.
type
=
DestroyNotify
;
event
.
u
.
destroyNotify
.
window
=
pWin
->
drawable
.
id
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
}
if
((
class
!=
InputOnly
)
&&
(
pParent
->
drawable
.
class
==
InputOnly
))
FreeWindowResources
(
pWin
);
if
(
pParent
)
{
*
error
=
BadMatch
;
return
NullWindow
;
if
(
pParent
->
firstChild
==
pWin
)
pParent
->
firstChild
=
pWin
->
nextSib
;
if
(
pParent
->
lastChild
==
pWin
)
pParent
->
lastChild
=
pWin
->
prevSib
;
if
(
pWin
->
nextSib
)
pWin
->
nextSib
->
prevSib
=
pWin
->
prevSib
;
if
(
pWin
->
prevSib
)
pWin
->
prevSib
->
nextSib
=
pWin
->
nextSib
;
}
if
((
class
==
InputOnly
)
&&
((
bw
!=
0
)
||
(
depth
!=
0
)))
if
(
pWin
->
optional
&&
pWin
->
optional
->
colormap
&&
pWin
->
parent
)
{
*
error
=
BadMatch
;
return
NullWindow
;
nxagentSetInstalledColormapWindows
(
pWin
->
drawable
.
pScreen
);
}
pScreen
=
pParent
->
drawable
.
pScreen
;
if
((
class
==
InputOutput
)
&&
(
depth
==
0
))
depth
=
pParent
->
drawable
.
depth
;
ancwopt
=
pParent
->
optional
;
if
(
!
ancwopt
)
ancwopt
=
FindWindowWithOptional
(
pParent
)
->
optional
;
if
(
visual
==
CopyFromParent
)
{
#ifdef XAPPGROUP
VisualID
ag_visual
;
xfree
(
pWin
);
return
Success
;
}
if
(
client
->
appgroup
&&
!
pParent
->
parent
&&
(
ag_visual
=
XagRootVisual
(
client
)))
visual
=
ag_visual
;
else
#endif
visual
=
ancwopt
->
visual
;
}
/* XXX need to retile border on each window with ParentRelative origin */
void
ResizeChildrenWinSize
(
register
WindowPtr
pWin
,
int
dx
,
int
dy
,
int
dw
,
int
dh
)
{
register
ScreenPtr
pScreen
;
register
WindowPtr
pSib
,
pChild
;
Bool
resized
=
(
dw
||
dh
);
pScreen
=
pWin
->
drawable
.
pScreen
;
/* Find out if the depth and visual are acceptable for this Screen */
if
((
visual
!=
ancwopt
->
visual
)
||
(
depth
!=
pParent
->
drawable
.
depth
))
for
(
pSib
=
pWin
->
firstChild
;
pSib
;
pSib
=
pSib
->
nextSib
)
{
fOK
=
FALSE
;
for
(
idepth
=
0
;
idepth
<
pScreen
->
numDepths
;
idepth
++
)
if
(
resized
&&
(
pSib
->
winGravity
>
NorthWestGravity
))
{
pDepth
=
(
DepthPtr
)
&
pScreen
->
allowedDepths
[
idepth
];
if
((
depth
==
pDepth
->
depth
)
||
(
depth
==
0
))
int
cwsx
,
cwsy
;
cwsx
=
pSib
->
origin
.
x
;
cwsy
=
pSib
->
origin
.
y
;
GravityTranslate
(
cwsx
,
cwsy
,
cwsx
-
dx
,
cwsy
-
dy
,
dw
,
dh
,
pSib
->
winGravity
,
&
cwsx
,
&
cwsy
);
if
(
cwsx
!=
pSib
->
origin
.
x
||
cwsy
!=
pSib
->
origin
.
y
)
{
for
(
ivisual
=
0
;
ivisual
<
pDepth
->
numVids
;
ivisual
++
)
{
if
(
visual
==
pDepth
->
vids
[
ivisual
])
{
fOK
=
TRUE
;
break
;
}
}
xEvent
event
;
event
.
u
.
u
.
type
=
GravityNotify
;
event
.
u
.
gravity
.
window
=
pSib
->
drawable
.
id
;
event
.
u
.
gravity
.
x
=
cwsx
-
wBorderWidth
(
pSib
);
event
.
u
.
gravity
.
y
=
cwsy
-
wBorderWidth
(
pSib
);
DeliverEvents
(
pSib
,
&
event
,
1
,
NullWindow
);
pSib
->
origin
.
x
=
cwsx
;
pSib
->
origin
.
y
=
cwsy
;
}
}
if
(
fOK
==
FALSE
)
{
*
error
=
BadMatch
;
return
NullWindow
;
}
}
if
(((
vmask
&
(
CWBorderPixmap
|
CWBorderPixel
))
==
0
)
&&
(
class
!=
InputOnly
)
&&
(
depth
!=
pParent
->
drawable
.
depth
))
{
*
error
=
BadMatch
;
return
NullWindow
;
}
if
(((
vmask
&
CWColormap
)
==
0
)
&&
(
class
!=
InputOnly
)
&&
((
visual
!=
ancwopt
->
visual
)
||
(
ancwopt
->
colormap
==
None
)))
{
*
error
=
BadMatch
;
return
NullWindow
;
}
pSib
->
drawable
.
x
=
pWin
->
drawable
.
x
+
pSib
->
origin
.
x
;
pSib
->
drawable
.
y
=
pWin
->
drawable
.
y
+
pSib
->
origin
.
y
;
SetWinSize
(
pSib
);
SetBorderSize
(
pSib
);
pWin
=
AllocateWindow
(
pScreen
);
if
(
!
pWin
)
{
*
error
=
BadAlloc
;
return
NullWindow
;
}
pWin
->
drawable
=
pParent
->
drawable
;
pWin
->
drawable
.
depth
=
depth
;
if
(
depth
==
pParent
->
drawable
.
depth
)
pWin
->
drawable
.
bitsPerPixel
=
pParent
->
drawable
.
bitsPerPixel
;
else
{
for
(
format
=
screenInfo
.
formats
;
format
->
depth
!=
depth
;
format
++
)
;
pWin
->
drawable
.
bitsPerPixel
=
format
->
bitsPerPixel
;
}
if
(
class
==
InputOnly
)
pWin
->
drawable
.
type
=
(
short
)
UNDRAWABLE_WINDOW
;
pWin
->
drawable
.
serialNumber
=
NEXT_SERIAL_NUMBER
;
/*
* Don't force X to move children. It will position them
* according with gravity.
*
* (*pScreen->PositionWindow)(pSib, pSib->drawable.x, pSib->drawable.y);
*/
pWin
->
drawable
.
id
=
wid
;
pWin
->
drawable
.
class
=
class
;
/*
* Update pSib privates, as this window is moved by X.
*/
pWin
->
parent
=
pParent
;
SetWindowToDefaults
(
pWin
);
nxagentAddConfiguredWindow
(
pSib
,
CW_Update
);
if
(
visual
!=
ancwopt
->
visual
)
{
if
(
!
MakeWindowOptional
(
pWin
))
{
xfree
(
pWin
);
*
error
=
BadAlloc
;
return
NullWindow
;
}
pWin
->
optional
->
visual
=
visual
;
pWin
->
optional
->
colormap
=
None
;
}
pWin
->
borderWidth
=
bw
;
#ifdef XCSECURITY
/* can't let untrusted clients have background None windows;
* they make it too easy to steal window contents
*/
if
(
client
->
trustLevel
!=
XSecurityClientTrusted
)
{
pWin
->
backgroundState
=
BackgroundPixel
;
pWin
->
background
.
pixel
=
0
;
}
else
#endif
pWin
->
backgroundState
=
None
;
pWin
->
borderIsPixel
=
pParent
->
borderIsPixel
;
pWin
->
border
=
pParent
->
border
;
if
(
pWin
->
borderIsPixel
==
FALSE
)
pWin
->
border
.
pixmap
->
refcnt
++
;
pWin
->
origin
.
x
=
x
+
(
int
)
bw
;
pWin
->
origin
.
y
=
y
+
(
int
)
bw
;
pWin
->
drawable
.
width
=
w
;
pWin
->
drawable
.
height
=
h
;
pWin
->
drawable
.
x
=
pParent
->
drawable
.
x
+
x
+
(
int
)
bw
;
pWin
->
drawable
.
y
=
pParent
->
drawable
.
y
+
y
+
(
int
)
bw
;
/* set up clip list correctly for unobscured WindowPtr */
RegionNull
(
&
pWin
->
clipList
);
RegionNull
(
&
pWin
->
borderClip
);
RegionNull
(
&
pWin
->
winSize
);
RegionNull
(
&
pWin
->
borderSize
);
pHead
=
RealChildHead
(
pParent
);
if
(
pHead
)
{
pWin
->
nextSib
=
pHead
->
nextSib
;
if
(
pHead
->
nextSib
)
pHead
->
nextSib
->
prevSib
=
pWin
;
else
pParent
->
lastChild
=
pWin
;
pHead
->
nextSib
=
pWin
;
pWin
->
prevSib
=
pHead
;
}
else
{
pWin
->
nextSib
=
pParent
->
firstChild
;
if
(
pParent
->
firstChild
)
pParent
->
firstChild
->
prevSib
=
pWin
;
else
pParent
->
lastChild
=
pWin
;
pParent
->
firstChild
=
pWin
;
}
SetWinSize
(
pWin
);
SetBorderSize
(
pWin
);
/* We SHOULD check for an error value here XXX */
if
(
!
(
*
pScreen
->
CreateWindow
)(
pWin
))
{
*
error
=
BadAlloc
;
DeleteWindow
(
pWin
,
None
);
return
NullWindow
;
}
/* We SHOULD check for an error value here XXX */
(
*
pScreen
->
PositionWindow
)(
pWin
,
pWin
->
drawable
.
x
,
pWin
->
drawable
.
y
);
if
(
!
(
vmask
&
CWEventMask
))
RecalculateDeliverableEvents
(
pWin
);
if
(
vmask
)
*
error
=
ChangeWindowAttributes
(
pWin
,
vmask
,
vlist
,
wClient
(
pWin
));
else
*
error
=
Success
;
if
(
*
error
!=
Success
)
{
DeleteWindow
(
pWin
,
None
);
return
NullWindow
;
}
if
(
!
(
vmask
&
CWBackingStore
)
&&
(
defaultBackingStore
!=
NotUseful
))
{
XID
value
=
defaultBackingStore
;
(
void
)
ChangeWindowAttributes
(
pWin
,
CWBackingStore
,
&
value
,
wClient
(
pWin
));
pWin
->
forcedBS
=
TRUE
;
}
if
(
SubSend
(
pParent
))
{
memset
(
&
event
,
0
,
sizeof
(
xEvent
));
event
.
u
.
u
.
type
=
CreateNotify
;
event
.
u
.
createNotify
.
window
=
wid
;
event
.
u
.
createNotify
.
parent
=
pParent
->
drawable
.
id
;
event
.
u
.
createNotify
.
x
=
x
;
event
.
u
.
createNotify
.
y
=
y
;
event
.
u
.
createNotify
.
width
=
w
;
event
.
u
.
createNotify
.
height
=
h
;
event
.
u
.
createNotify
.
borderWidth
=
bw
;
event
.
u
.
createNotify
.
override
=
pWin
->
overrideRedirect
;
DeliverEvents
(
pParent
,
&
event
,
1
,
NullWindow
);
}
return
pWin
;
}
static
void
FreeWindowResources
(
register
WindowPtr
pWin
)
{
register
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
DeleteWindowFromAnySaveSet
(
pWin
);
DeleteWindowFromAnySelections
(
pWin
);
DeleteWindowFromAnyEvents
(
pWin
,
TRUE
);
RegionUninit
(
&
pWin
->
clipList
);
RegionUninit
(
&
pWin
->
winSize
);
RegionUninit
(
&
pWin
->
borderClip
);
RegionUninit
(
&
pWin
->
borderSize
);
#ifdef SHAPE
if
(
wBoundingShape
(
pWin
))
RegionDestroy
(
wBoundingShape
(
pWin
));
if
(
wClipShape
(
pWin
))
RegionDestroy
(
wClipShape
(
pWin
));
if
(
wInputShape
(
pWin
))
RegionDestroy
(
wInputShape
(
pWin
));
#endif
if
(
pWin
->
borderIsPixel
==
FALSE
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
border
.
pixmap
);
if
(
pWin
->
backgroundState
==
BackgroundPixmap
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
background
.
pixmap
);
DeleteAllWindowProperties
(
pWin
);
/* We SHOULD check for an error value here XXX */
(
*
pScreen
->
DestroyWindow
)(
pWin
);
DisposeWindowOptional
(
pWin
);
}
static
void
CrushTree
(
WindowPtr
pWin
)
{
register
WindowPtr
pChild
,
pSib
,
pParent
;
UnrealizeWindowProcPtr
UnrealizeWindow
;
xEvent
event
;
if
(
!
(
pChild
=
pWin
->
firstChild
))
return
;
UnrealizeWindow
=
pWin
->
drawable
.
pScreen
->
UnrealizeWindow
;
while
(
1
)
{
if
(
pChild
->
firstChild
)
{
pChild
=
pChild
->
firstChild
;
continue
;
}
while
(
1
)
{
pParent
=
pChild
->
parent
;
if
(
SubStrSend
(
pChild
,
pParent
))
{
memset
(
&
event
,
0
,
sizeof
(
xEvent
));
event
.
u
.
u
.
type
=
DestroyNotify
;
event
.
u
.
destroyNotify
.
window
=
pChild
->
drawable
.
id
;
DeliverEvents
(
pChild
,
&
event
,
1
,
NullWindow
);
}
FreeResource
(
pChild
->
drawable
.
id
,
RT_WINDOW
);
pSib
=
pChild
->
nextSib
;
#ifdef DO_SAVE_UNDERS
if
(
pChild
->
saveUnder
&&
pChild
->
viewable
)
deltaSaveUndersViewable
--
;
#endif
pChild
->
viewable
=
FALSE
;
if
(
pChild
->
realized
)
{
pChild
->
realized
=
FALSE
;
(
*
UnrealizeWindow
)(
pChild
);
}
FreeWindowResources
(
pChild
);
xfree
(
pChild
);
if
(
(
pChild
=
pSib
)
)
break
;
pChild
=
pParent
;
pChild
->
firstChild
=
NullWindow
;
pChild
->
lastChild
=
NullWindow
;
if
(
pChild
==
pWin
)
return
;
}
}
}
/*****
* DeleteWindow
* Deletes child of window then window itself
* If wid is None, don't send any events
*****/
int
DeleteWindow
(
void
*
value
,
XID
wid
)
{
register
WindowPtr
pParent
;
register
WindowPtr
pWin
=
(
WindowPtr
)
value
;
xEvent
event
;
UnmapWindow
(
pWin
,
FALSE
);
CrushTree
(
pWin
);
pParent
=
pWin
->
parent
;
if
(
wid
&&
pParent
&&
SubStrSend
(
pWin
,
pParent
))
{
memset
(
&
event
,
0
,
sizeof
(
xEvent
));
event
.
u
.
u
.
type
=
DestroyNotify
;
event
.
u
.
destroyNotify
.
window
=
pWin
->
drawable
.
id
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
}
FreeWindowResources
(
pWin
);
if
(
pParent
)
{
if
(
pParent
->
firstChild
==
pWin
)
pParent
->
firstChild
=
pWin
->
nextSib
;
if
(
pParent
->
lastChild
==
pWin
)
pParent
->
lastChild
=
pWin
->
prevSib
;
if
(
pWin
->
nextSib
)
pWin
->
nextSib
->
prevSib
=
pWin
->
prevSib
;
if
(
pWin
->
prevSib
)
pWin
->
prevSib
->
nextSib
=
pWin
->
nextSib
;
}
if
(
pWin
->
optional
&&
pWin
->
optional
->
colormap
&&
pWin
->
parent
)
{
nxagentSetInstalledColormapWindows
(
pWin
->
drawable
.
pScreen
);
}
xfree
(
pWin
);
return
Success
;
}
void
DestroySubwindows
(
register
WindowPtr
pWin
,
ClientPtr
client
)
{
/* XXX
* The protocol is quite clear that each window should be
* destroyed in turn, however, unmapping all of the first
* eliminates most of the calls to ValidateTree. So,
* this implementation is incorrect in that all of the
* UnmapNotifies occur before all of the DestroyNotifies.
* If you care, simply delete the call to UnmapSubwindows.
*/
UnmapSubwindows
(
pWin
);
while
(
pWin
->
lastChild
)
FreeResource
(
pWin
->
lastChild
->
drawable
.
id
,
RT_NONE
);
}
#define DeviceEventMasks (KeyPressMask | KeyReleaseMask | ButtonPressMask | \
ButtonReleaseMask | PointerMotionMask)
/*****
* ChangeWindowAttributes
*
* The value-mask specifies which attributes are to be changed; the
* value-list contains one value for each one bit in the mask, from least
* to most significant bit in the mask.
*****/
int
ChangeWindowAttributes
(
register
WindowPtr
pWin
,
Mask
vmask
,
XID
*
vlist
,
ClientPtr
client
)
{
register
Mask
index2
;
register
XID
*
pVlist
;
PixmapPtr
pPixmap
;
Pixmap
pixID
;
CursorPtr
pCursor
,
pOldCursor
;
Cursor
cursorID
;
WindowPtr
pChild
;
Colormap
cmap
;
ColormapPtr
pCmap
;
xEvent
xE
;
int
result
;
register
ScreenPtr
pScreen
;
Mask
vmaskCopy
=
0
;
register
Mask
tmask
;
unsigned
int
val
;
int
error
;
Bool
checkOptional
=
FALSE
;
Bool
borderRelative
=
FALSE
;
WindowPtr
pLayerWin
;
if
((
pWin
->
drawable
.
class
==
InputOnly
)
&&
(
vmask
&
(
~
INPUTONLY_LEGAL_MASK
)))
return
BadMatch
;
error
=
Success
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pVlist
=
vlist
;
tmask
=
vmask
;
while
(
tmask
)
{
index2
=
(
Mask
)
lowbit
(
tmask
);
tmask
&=
~
index2
;
switch
(
index2
)
{
case
CWBackPixmap
:
pixID
=
(
Pixmap
)
*
pVlist
;
pVlist
++
;
if
(
pWin
->
backgroundState
==
ParentRelative
)
borderRelative
=
TRUE
;
if
(
pixID
==
None
)
{
#ifdef XCSECURITY
/* can't let untrusted clients have background None windows */
if
(
client
->
trustLevel
==
XSecurityClientTrusted
)
{
#endif
if
(
pWin
->
backgroundState
==
BackgroundPixmap
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
background
.
pixmap
);
if
(
!
pWin
->
parent
)
MakeRootTile
(
pWin
);
else
pWin
->
backgroundState
=
None
;
#ifdef XCSECURITY
}
else
{
/* didn't change the background to None, so don't tell ddx */
index2
=
0
;
}
#endif
}
else
if
(
pixID
==
ParentRelative
)
{
if
(
pWin
->
parent
&&
pWin
->
drawable
.
depth
!=
pWin
->
parent
->
drawable
.
depth
)
{
error
=
BadMatch
;
goto
PatchUp
;
}
if
(
pWin
->
backgroundState
==
BackgroundPixmap
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
background
.
pixmap
);
if
(
!
pWin
->
parent
)
MakeRootTile
(
pWin
);
else
pWin
->
backgroundState
=
ParentRelative
;
borderRelative
=
TRUE
;
/* Note that the parent's backgroundTile's refcnt is NOT
* incremented. */
}
else
{
pPixmap
=
(
PixmapPtr
)
SecurityLookupIDByType
(
client
,
pixID
,
RT_PIXMAP
,
SecurityReadAccess
);
if
(
pPixmap
!=
(
PixmapPtr
)
NULL
)
{
if
((
pPixmap
->
drawable
.
depth
!=
pWin
->
drawable
.
depth
)
||
(
pPixmap
->
drawable
.
pScreen
!=
pScreen
))
{
error
=
BadMatch
;
goto
PatchUp
;
}
if
(
pWin
->
backgroundState
==
BackgroundPixmap
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
background
.
pixmap
);
pWin
->
backgroundState
=
BackgroundPixmap
;
pWin
->
background
.
pixmap
=
pPixmap
;
pPixmap
->
refcnt
++
;
}
else
{
error
=
BadPixmap
;
client
->
errorValue
=
pixID
;
goto
PatchUp
;
}
}
break
;
case
CWBackPixel
:
if
(
pWin
->
backgroundState
==
ParentRelative
)
borderRelative
=
TRUE
;
if
(
pWin
->
backgroundState
==
BackgroundPixmap
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
background
.
pixmap
);
pWin
->
backgroundState
=
BackgroundPixel
;
pWin
->
background
.
pixel
=
(
CARD32
)
*
pVlist
;
/* background pixel overrides background pixmap,
so don't let the ddx layer see both bits */
vmaskCopy
&=
~
CWBackPixmap
;
pVlist
++
;
break
;
case
CWBorderPixmap
:
pixID
=
(
Pixmap
)
*
pVlist
;
pVlist
++
;
if
(
pixID
==
CopyFromParent
)
{
if
(
!
pWin
->
parent
||
(
pWin
->
drawable
.
depth
!=
pWin
->
parent
->
drawable
.
depth
))
{
error
=
BadMatch
;
goto
PatchUp
;
}
if
(
pWin
->
borderIsPixel
==
FALSE
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
border
.
pixmap
);
pWin
->
border
=
pWin
->
parent
->
border
;
if
((
pWin
->
borderIsPixel
=
pWin
->
parent
->
borderIsPixel
)
==
TRUE
)
{
index2
=
CWBorderPixel
;
}
else
{
pWin
->
parent
->
border
.
pixmap
->
refcnt
++
;
}
}
else
{
pPixmap
=
(
PixmapPtr
)
SecurityLookupIDByType
(
client
,
pixID
,
RT_PIXMAP
,
SecurityReadAccess
);
if
(
pPixmap
)
{
if
((
pPixmap
->
drawable
.
depth
!=
pWin
->
drawable
.
depth
)
||
(
pPixmap
->
drawable
.
pScreen
!=
pScreen
))
{
error
=
BadMatch
;
goto
PatchUp
;
}
if
(
pWin
->
borderIsPixel
==
FALSE
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
border
.
pixmap
);
pWin
->
borderIsPixel
=
FALSE
;
pWin
->
border
.
pixmap
=
pPixmap
;
pPixmap
->
refcnt
++
;
}
else
{
error
=
BadPixmap
;
client
->
errorValue
=
pixID
;
goto
PatchUp
;
}
}
break
;
case
CWBorderPixel
:
if
(
pWin
->
borderIsPixel
==
FALSE
)
(
*
pScreen
->
DestroyPixmap
)(
pWin
->
border
.
pixmap
);
pWin
->
borderIsPixel
=
TRUE
;
pWin
->
border
.
pixel
=
(
CARD32
)
*
pVlist
;
/* border pixel overrides border pixmap,
so don't let the ddx layer see both bits */
vmaskCopy
&=
~
CWBorderPixmap
;
pVlist
++
;
break
;
case
CWBitGravity
:
val
=
(
CARD8
)
*
pVlist
;
pVlist
++
;
if
(
val
>
StaticGravity
)
{
error
=
BadValue
;
client
->
errorValue
=
val
;
goto
PatchUp
;
}
pWin
->
bitGravity
=
val
;
break
;
case
CWWinGravity
:
val
=
(
CARD8
)
*
pVlist
;
pVlist
++
;
if
(
val
>
StaticGravity
)
{
error
=
BadValue
;
client
->
errorValue
=
val
;
goto
PatchUp
;
}
pWin
->
winGravity
=
val
;
break
;
case
CWBackingStore
:
val
=
(
CARD8
)
*
pVlist
;
pVlist
++
;
if
((
val
!=
NotUseful
)
&&
(
val
!=
WhenMapped
)
&&
(
val
!=
Always
))
{
error
=
BadValue
;
client
->
errorValue
=
val
;
goto
PatchUp
;
}
pWin
->
backingStore
=
val
;
#ifdef TEST
fprintf
(
stderr
,
"ChangeWindowAttributes: Changed backing store value to %d for window at %p.
\n
"
,
val
,
(
void
*
)
pWin
);
#endif
pWin
->
forcedBS
=
FALSE
;
break
;
case
CWBackingPlanes
:
if
(
pWin
->
optional
||
((
CARD32
)
*
pVlist
!=
(
CARD32
)
~
0L
))
{
if
(
!
pWin
->
optional
&&
!
MakeWindowOptional
(
pWin
))
{
error
=
BadAlloc
;
goto
PatchUp
;
}
pWin
->
optional
->
backingBitPlanes
=
(
CARD32
)
*
pVlist
;
if
((
CARD32
)
*
pVlist
==
(
CARD32
)
~
0L
)
checkOptional
=
TRUE
;
}
pVlist
++
;
break
;
case
CWBackingPixel
:
if
(
pWin
->
optional
||
(
CARD32
)
*
pVlist
)
{
if
(
!
pWin
->
optional
&&
!
MakeWindowOptional
(
pWin
))
{
error
=
BadAlloc
;
goto
PatchUp
;
}
pWin
->
optional
->
backingPixel
=
(
CARD32
)
*
pVlist
;
if
(
!*
pVlist
)
checkOptional
=
TRUE
;
}
pVlist
++
;
break
;
case
CWSaveUnder
:
val
=
(
BOOL
)
*
pVlist
;
pVlist
++
;
if
((
val
!=
xTrue
)
&&
(
val
!=
xFalse
))
{
error
=
BadValue
;
client
->
errorValue
=
val
;
goto
PatchUp
;
}
#ifdef DO_SAVE_UNDERS
if
(
pWin
->
parent
&&
(
pWin
->
saveUnder
!=
val
)
&&
(
pWin
->
viewable
)
&&
DO_SAVE_UNDERS
(
pWin
))
{
/*
* Re-check all siblings and inferiors for obscurity or
* exposition (hee hee).
*/
if
(
pWin
->
saveUnder
)
deltaSaveUndersViewable
--
;
else
deltaSaveUndersViewable
++
;
pWin
->
saveUnder
=
val
;
if
(
pWin
->
firstChild
)
{
pLayerWin
=
(
*
pScreen
->
GetLayerWindow
)(
pWin
);
if
((
*
pScreen
->
ChangeSaveUnder
)(
pLayerWin
->
parent
,
pWin
->
nextSib
))
(
*
pScreen
->
PostChangeSaveUnder
)(
pLayerWin
->
parent
,
pWin
->
nextSib
);
}
else
{
if
((
*
pScreen
->
ChangeSaveUnder
)(
pWin
,
pWin
->
nextSib
))
(
*
pScreen
->
PostChangeSaveUnder
)(
pWin
,
pWin
->
nextSib
);
}
}
else
{
/* If we're changing the saveUnder attribute of the root
* window, all we do is set pWin->saveUnder so that
* GetWindowAttributes returns the right value. We don't
* do the "normal" save-under processing (as above).
* Hope that doesn't cause any problems.
*/
pWin
->
saveUnder
=
val
;
}
#else
pWin
->
saveUnder
=
val
;
#endif
/* DO_SAVE_UNDERS */
break
;
case
CWEventMask
:
/*
* TODO: Some applications like java bean shell
* don' t work if they cannot monitor the root
* window for Structure Redirect events. However
* this doesn't seem to be the best solution, since
* also an X server with a window manager running,
* doesn't allow to monitor for those events, but
* the java bean shell works flawlessy on this
* server.
*
* if (nxagentCheckIllegalRootMonitoring(pWin, (Mask)*pVlist))
* {
* return BadAccess;
* }
*/
result
=
EventSelectForWindow
(
pWin
,
client
,
(
Mask
)
*
pVlist
);
if
(
result
)
{
error
=
result
;
goto
PatchUp
;
}
pVlist
++
;
break
;
case
CWDontPropagate
:
result
=
EventSuppressForWindow
(
pWin
,
client
,
(
Mask
)
*
pVlist
,
&
checkOptional
);
if
(
result
)
{
error
=
result
;
goto
PatchUp
;
}
pVlist
++
;
break
;
case
CWOverrideRedirect
:
val
=
(
BOOL
)
*
pVlist
;
pVlist
++
;
if
((
val
!=
xTrue
)
&&
(
val
!=
xFalse
))
{
error
=
BadValue
;
client
->
errorValue
=
val
;
goto
PatchUp
;
}
pWin
->
overrideRedirect
=
val
;
break
;
case
CWColormap
:
cmap
=
(
Colormap
)
*
pVlist
;
pVlist
++
;
if
(
cmap
==
CopyFromParent
)
{
#ifdef XAPPGROUP
Colormap
ag_colormap
;
ClientPtr
win_owner
;
/*
* win_owner == client for CreateWindow, other clients
* can ChangeWindowAttributes
*/
win_owner
=
clients
[
CLIENT_ID
(
pWin
->
drawable
.
id
)];
if
(
win_owner
&&
win_owner
->
appgroup
&&
!
pWin
->
parent
->
parent
&&
(
ag_colormap
=
XagDefaultColormap
(
win_owner
)))
cmap
=
ag_colormap
;
else
#endif
if
(
pWin
->
parent
&&
(
!
pWin
->
optional
||
pWin
->
optional
->
visual
==
wVisual
(
pWin
->
parent
)))
{
cmap
=
wColormap
(
pWin
->
parent
);
}
else
cmap
=
None
;
}
if
(
cmap
==
None
)
{
error
=
BadMatch
;
goto
PatchUp
;
}
pCmap
=
(
ColormapPtr
)
SecurityLookupIDByType
(
client
,
cmap
,
RT_COLORMAP
,
SecurityReadAccess
);
if
(
!
pCmap
)
{
error
=
BadColor
;
client
->
errorValue
=
cmap
;
goto
PatchUp
;
}
if
(
pCmap
->
pVisual
->
vid
!=
wVisual
(
pWin
)
||
pCmap
->
pScreen
!=
pScreen
)
{
error
=
BadMatch
;
goto
PatchUp
;
}
if
(
cmap
!=
wColormap
(
pWin
))
{
if
(
!
pWin
->
optional
)
{
if
(
!
MakeWindowOptional
(
pWin
))
{
error
=
BadAlloc
;
goto
PatchUp
;
}
}
else
if
(
pWin
->
parent
&&
cmap
==
wColormap
(
pWin
->
parent
))
checkOptional
=
TRUE
;
/*
* propagate the original colormap to any children
* inheriting it
*/
for
(
pChild
=
pWin
->
firstChild
;
pChild
;
pChild
=
pChild
->
nextSib
)
{
if
(
!
pChild
->
optional
&&
!
MakeWindowOptional
(
pChild
))
{
error
=
BadAlloc
;
goto
PatchUp
;
}
}
pWin
->
optional
->
colormap
=
cmap
;
/*
* check on any children now matching the new colormap
*/
for
(
pChild
=
pWin
->
firstChild
;
pChild
;
pChild
=
pChild
->
nextSib
)
{
if
(
pChild
->
optional
->
colormap
==
cmap
)
CheckWindowOptionalNeed
(
pChild
);
}
xE
.
u
.
u
.
type
=
ColormapNotify
;
xE
.
u
.
colormap
.
window
=
pWin
->
drawable
.
id
;
xE
.
u
.
colormap
.
colormap
=
cmap
;
xE
.
u
.
colormap
.
new
=
xTrue
;
xE
.
u
.
colormap
.
state
=
IsMapInstalled
(
cmap
,
pWin
);
DeliverEvents
(
pWin
,
&
xE
,
1
,
NullWindow
);
}
break
;
case
CWCursor
:
cursorID
=
(
Cursor
)
*
pVlist
;
pVlist
++
;
/*
* install the new
*/
if
(
cursorID
==
None
)
{
if
(
pWin
==
pWin
->
drawable
.
pScreen
->
root
)
pCursor
=
rootCursor
;
else
pCursor
=
(
CursorPtr
)
None
;
}
else
{
pCursor
=
(
CursorPtr
)
SecurityLookupIDByType
(
client
,
cursorID
,
RT_CURSOR
,
SecurityReadAccess
);
if
(
!
pCursor
)
{
error
=
BadCursor
;
client
->
errorValue
=
cursorID
;
goto
PatchUp
;
}
}
if
(
pCursor
!=
wCursor
(
pWin
))
{
/*
* patch up child windows so they don't lose cursors.
*/
for
(
pChild
=
pWin
->
firstChild
;
pChild
;
pChild
=
pChild
->
nextSib
)
{
if
(
!
pChild
->
optional
&&
!
pChild
->
cursorIsNone
&&
!
MakeWindowOptional
(
pChild
))
{
error
=
BadAlloc
;
goto
PatchUp
;
}
}
pOldCursor
=
0
;
if
(
pCursor
==
(
CursorPtr
)
None
)
{
pWin
->
cursorIsNone
=
TRUE
;
if
(
pWin
->
optional
)
{
pOldCursor
=
pWin
->
optional
->
cursor
;
pWin
->
optional
->
cursor
=
(
CursorPtr
)
None
;
checkOptional
=
TRUE
;
}
}
else
{
if
(
!
pWin
->
optional
)
{
if
(
!
MakeWindowOptional
(
pWin
))
{
error
=
BadAlloc
;
goto
PatchUp
;
}
}
else
if
(
pWin
->
parent
&&
pCursor
==
wCursor
(
pWin
->
parent
))
checkOptional
=
TRUE
;
pOldCursor
=
pWin
->
optional
->
cursor
;
pWin
->
optional
->
cursor
=
pCursor
;
pCursor
->
refcnt
++
;
pWin
->
cursorIsNone
=
FALSE
;
/*
* check on any children now matching the new cursor
*/
for
(
pChild
=
pWin
->
firstChild
;
pChild
;
pChild
=
pChild
->
nextSib
)
{
if
(
pChild
->
optional
&&
(
pChild
->
optional
->
cursor
==
pCursor
))
CheckWindowOptionalNeed
(
pChild
);
}
}
if
(
pWin
->
realized
)
WindowHasNewCursor
(
pWin
);
/* Can't free cursor until here - old cursor
* is needed in WindowHasNewCursor
*/
if
(
pOldCursor
)
FreeCursor
(
pOldCursor
,
(
Cursor
)
0
);
}
break
;
default:
error
=
BadValue
;
client
->
errorValue
=
vmask
;
goto
PatchUp
;
}
vmaskCopy
|=
index2
;
}
PatchUp:
if
(
checkOptional
)
CheckWindowOptionalNeed
(
pWin
);
/* We SHOULD check for an error value here XXX */
(
*
pScreen
->
ChangeWindowAttributes
)(
pWin
,
vmaskCopy
);
/*
If the border contents have changed, redraw the border.
Note that this has to be done AFTER pScreen->ChangeWindowAttributes
for the tile to be rotated, and the correct function selected.
*/
if
(((
vmaskCopy
&
(
CWBorderPixel
|
CWBorderPixmap
))
||
borderRelative
)
&&
pWin
->
viewable
&&
HasBorder
(
pWin
))
{
RegionRec
exposed
;
RegionNull
(
&
exposed
);
RegionSubtract
(
&
exposed
,
&
pWin
->
borderClip
,
&
pWin
->
winSize
);
(
*
pWin
->
drawable
.
pScreen
->
PaintWindowBorder
)(
pWin
,
&
exposed
,
PW_BORDER
);
RegionUninit
(
&
exposed
);
}
return
error
;
}
/*****
* GetWindowAttributes
* Notice that this is different than ChangeWindowAttributes
*****/
void
GetWindowAttributes
(
register
WindowPtr
pWin
,
ClientPtr
client
,
xGetWindowAttributesReply
*
wa
)
{
wa
->
type
=
X_Reply
;
wa
->
bitGravity
=
pWin
->
bitGravity
;
wa
->
winGravity
=
pWin
->
winGravity
;
if
(
pWin
->
forcedBS
&&
pWin
->
backingStore
!=
Always
)
wa
->
backingStore
=
NotUseful
;
else
wa
->
backingStore
=
pWin
->
backingStore
;
wa
->
length
=
(
sizeof
(
xGetWindowAttributesReply
)
-
sizeof
(
xGenericReply
))
>>
2
;
wa
->
sequenceNumber
=
client
->
sequence
;
wa
->
backingBitPlanes
=
wBackingBitPlanes
(
pWin
);
wa
->
backingPixel
=
wBackingPixel
(
pWin
);
wa
->
saveUnder
=
(
BOOL
)
pWin
->
saveUnder
;
wa
->
override
=
pWin
->
overrideRedirect
;
if
(
!
pWin
->
mapped
)
wa
->
mapState
=
IsUnmapped
;
else
if
(
pWin
->
realized
)
wa
->
mapState
=
IsViewable
;
else
wa
->
mapState
=
IsUnviewable
;
wa
->
colormap
=
wColormap
(
pWin
);
wa
->
mapInstalled
=
(
wa
->
colormap
==
None
)
?
xFalse
:
IsMapInstalled
(
wa
->
colormap
,
pWin
);
wa
->
yourEventMask
=
EventMaskForClient
(
pWin
,
client
);
wa
->
allEventMasks
=
pWin
->
eventMask
|
wOtherEventMasks
(
pWin
);
wa
->
doNotPropagateMask
=
wDontPropagateMask
(
pWin
);
wa
->
class
=
pWin
->
drawable
.
class
;
wa
->
visualID
=
wVisual
(
pWin
);
}
WindowPtr
MoveWindowInStack
(
register
WindowPtr
pWin
,
register
WindowPtr
pNextSib
)
{
register
WindowPtr
pParent
=
pWin
->
parent
;
WindowPtr
pFirstChange
=
pWin
;
/* highest window where list changes */
if
(
pWin
->
nextSib
!=
pNextSib
)
{
WindowPtr
pOldNextSib
=
pWin
->
nextSib
;
if
(
!
pNextSib
)
/* move to bottom */
{
if
(
pParent
->
firstChild
==
pWin
)
pParent
->
firstChild
=
pWin
->
nextSib
;
/* if (pWin->nextSib) */
/* is always True: pNextSib == NULL
* and pWin->nextSib != pNextSib
* therefore pWin->nextSib != NULL */
pFirstChange
=
pWin
->
nextSib
;
pWin
->
nextSib
->
prevSib
=
pWin
->
prevSib
;
if
(
pWin
->
prevSib
)
pWin
->
prevSib
->
nextSib
=
pWin
->
nextSib
;
pParent
->
lastChild
->
nextSib
=
pWin
;
pWin
->
prevSib
=
pParent
->
lastChild
;
pWin
->
nextSib
=
NullWindow
;
pParent
->
lastChild
=
pWin
;
}
else
if
(
pParent
->
firstChild
==
pNextSib
)
/* move to top */
{
pFirstChange
=
pWin
;
if
(
pParent
->
lastChild
==
pWin
)
pParent
->
lastChild
=
pWin
->
prevSib
;
if
(
pWin
->
nextSib
)
pWin
->
nextSib
->
prevSib
=
pWin
->
prevSib
;
if
(
pWin
->
prevSib
)
pWin
->
prevSib
->
nextSib
=
pWin
->
nextSib
;
pWin
->
nextSib
=
pParent
->
firstChild
;
pWin
->
prevSib
=
(
WindowPtr
)
NULL
;
pNextSib
->
prevSib
=
pWin
;
pParent
->
firstChild
=
pWin
;
}
else
/* move in middle of list */
{
WindowPtr
pOldNext
=
pWin
->
nextSib
;
pFirstChange
=
NullWindow
;
if
(
pParent
->
firstChild
==
pWin
)
pFirstChange
=
pParent
->
firstChild
=
pWin
->
nextSib
;
if
(
pParent
->
lastChild
==
pWin
)
{
pFirstChange
=
pWin
;
pParent
->
lastChild
=
pWin
->
prevSib
;
}
if
(
pWin
->
nextSib
)
pWin
->
nextSib
->
prevSib
=
pWin
->
prevSib
;
if
(
pWin
->
prevSib
)
pWin
->
prevSib
->
nextSib
=
pWin
->
nextSib
;
pWin
->
nextSib
=
pNextSib
;
pWin
->
prevSib
=
pNextSib
->
prevSib
;
if
(
pNextSib
->
prevSib
)
pNextSib
->
prevSib
->
nextSib
=
pWin
;
pNextSib
->
prevSib
=
pWin
;
if
(
!
pFirstChange
)
{
/* do we know it yet? */
pFirstChange
=
pParent
->
firstChild
;
/* no, search from top */
while
((
pFirstChange
!=
pWin
)
&&
(
pFirstChange
!=
pOldNext
))
pFirstChange
=
pFirstChange
->
nextSib
;
}
}
if
(
pWin
->
drawable
.
pScreen
->
RestackWindow
)
(
*
pWin
->
drawable
.
pScreen
->
RestackWindow
)(
pWin
,
pOldNextSib
);
}
#ifdef ROOTLESS
/*
* In rootless mode we can't optimize away window restacks.
* There may be non-X windows around, so even if the window
* is in the correct position from X's point of view,
* the underlying window system may want to reorder it.
*/
else
if
(
pWin
->
drawable
.
pScreen
->
RestackWindow
)
(
*
pWin
->
drawable
.
pScreen
->
RestackWindow
)(
pWin
,
pWin
->
nextSib
);
#endif
return
(
pFirstChange
);
}
RegionPtr
CreateUnclippedWinSize
(
register
WindowPtr
pWin
)
{
RegionPtr
pRgn
;
BoxRec
box
;
box
.
x1
=
pWin
->
drawable
.
x
;
box
.
y1
=
pWin
->
drawable
.
y
;
box
.
x2
=
pWin
->
drawable
.
x
+
(
int
)
pWin
->
drawable
.
width
;
box
.
y2
=
pWin
->
drawable
.
y
+
(
int
)
pWin
->
drawable
.
height
;
pRgn
=
RegionCreate
(
&
box
,
1
);
#ifdef SHAPE
if
(
wBoundingShape
(
pWin
)
||
wClipShape
(
pWin
))
{
#ifndef NXAGENT_SERVER
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
#endif
/* NXAGENT_SERVER */
RegionTranslate
(
pRgn
,
-
pWin
->
drawable
.
x
,
-
pWin
->
drawable
.
y
);
if
(
wBoundingShape
(
pWin
))
RegionIntersect
(
pRgn
,
pRgn
,
wBoundingShape
(
pWin
));
if
(
wClipShape
(
pWin
))
RegionIntersect
(
pRgn
,
pRgn
,
wClipShape
(
pWin
));
RegionTranslate
(
pRgn
,
pWin
->
drawable
.
x
,
pWin
->
drawable
.
y
);
}
#endif
return
pRgn
;
}
void
SetWinSize
(
register
WindowPtr
pWin
)
{
#ifdef COMPOSITE
if
(
pWin
->
redirectDraw
)
{
BoxRec
box
;
box
.
x1
=
pWin
->
drawable
.
x
;
box
.
y1
=
pWin
->
drawable
.
y
;
box
.
x2
=
pWin
->
drawable
.
x
+
pWin
->
drawable
.
width
;
box
.
y2
=
pWin
->
drawable
.
y
+
pWin
->
drawable
.
height
;
RegionReset
(
&
pWin
->
winSize
,
&
box
);
}
else
#endif
ClippedRegionFromBox
(
pWin
->
parent
,
&
pWin
->
winSize
,
pWin
->
drawable
.
x
,
pWin
->
drawable
.
y
,
(
int
)
pWin
->
drawable
.
width
,
(
int
)
pWin
->
drawable
.
height
);
#ifdef SHAPE
if
(
wBoundingShape
(
pWin
)
||
wClipShape
(
pWin
))
{
#ifndef NXAGENT_SERVER
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
#endif
/* NXAGENT_SERVER */
RegionTranslate
(
&
pWin
->
winSize
,
-
pWin
->
drawable
.
x
,
-
pWin
->
drawable
.
y
);
if
(
wBoundingShape
(
pWin
))
RegionIntersect
(
&
pWin
->
winSize
,
&
pWin
->
winSize
,
wBoundingShape
(
pWin
));
if
(
wClipShape
(
pWin
))
RegionIntersect
(
&
pWin
->
winSize
,
&
pWin
->
winSize
,
wClipShape
(
pWin
));
RegionTranslate
(
&
pWin
->
winSize
,
pWin
->
drawable
.
x
,
pWin
->
drawable
.
y
);
}
#endif
}
void
SetBorderSize
(
register
WindowPtr
pWin
)
{
int
bw
;
if
(
HasBorder
(
pWin
))
{
bw
=
wBorderWidth
(
pWin
);
#ifdef COMPOSITE
if
(
pWin
->
redirectDraw
)
{
BoxRec
box
;
box
.
x1
=
pWin
->
drawable
.
x
-
bw
;
box
.
y1
=
pWin
->
drawable
.
y
-
bw
;
box
.
x2
=
pWin
->
drawable
.
x
+
pWin
->
drawable
.
width
+
bw
;
box
.
y2
=
pWin
->
drawable
.
y
+
pWin
->
drawable
.
height
+
bw
;
RegionReset
(
&
pWin
->
borderSize
,
&
box
);
}
else
#endif
ClippedRegionFromBox
(
pWin
->
parent
,
&
pWin
->
borderSize
,
pWin
->
drawable
.
x
-
bw
,
pWin
->
drawable
.
y
-
bw
,
(
int
)(
pWin
->
drawable
.
width
+
(
bw
<<
1
)),
(
int
)(
pWin
->
drawable
.
height
+
(
bw
<<
1
)));
#ifdef SHAPE
if
(
wBoundingShape
(
pWin
))
{
#ifndef NXAGENT_SERVER
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
#endif
/* NXAGENT_SERVER */
RegionTranslate
(
&
pWin
->
borderSize
,
-
pWin
->
drawable
.
x
,
-
pWin
->
drawable
.
y
);
RegionIntersect
(
&
pWin
->
borderSize
,
&
pWin
->
borderSize
,
wBoundingShape
(
pWin
));
RegionTranslate
(
&
pWin
->
borderSize
,
pWin
->
drawable
.
x
,
pWin
->
drawable
.
y
);
RegionUnion
(
&
pWin
->
borderSize
,
&
pWin
->
borderSize
,
&
pWin
->
winSize
);
}
#endif
}
else
{
RegionCopy
(
&
pWin
->
borderSize
,
&
pWin
->
winSize
);
}
}
/**
*
* \param x,y new window position
* \param oldx,oldy old window position
* \param destx,desty position relative to gravity
*/
void
GravityTranslate
(
register
int
x
,
register
int
y
,
int
oldx
,
int
oldy
,
int
dw
,
int
dh
,
unsigned
gravity
,
register
int
*
destx
,
register
int
*
desty
)
{
switch
(
gravity
)
{
case
NorthGravity
:
*
destx
=
x
+
dw
/
2
;
*
desty
=
y
;
break
;
case
NorthEastGravity
:
*
destx
=
x
+
dw
;
*
desty
=
y
;
break
;
case
WestGravity
:
*
destx
=
x
;
*
desty
=
y
+
dh
/
2
;
break
;
case
CenterGravity
:
*
destx
=
x
+
dw
/
2
;
*
desty
=
y
+
dh
/
2
;
break
;
case
EastGravity
:
*
destx
=
x
+
dw
;
*
desty
=
y
+
dh
/
2
;
break
;
case
SouthWestGravity
:
*
destx
=
x
;
*
desty
=
y
+
dh
;
break
;
case
SouthGravity
:
*
destx
=
x
+
dw
/
2
;
*
desty
=
y
+
dh
;
break
;
case
SouthEastGravity
:
*
destx
=
x
+
dw
;
*
desty
=
y
+
dh
;
break
;
case
StaticGravity
:
*
destx
=
oldx
;
*
desty
=
oldy
;
break
;
default:
*
destx
=
x
;
*
desty
=
y
;
break
;
}
}
/* XXX need to retile border on each window with ParentRelative origin */
void
ResizeChildrenWinSize
(
register
WindowPtr
pWin
,
int
dx
,
int
dy
,
int
dw
,
int
dh
)
{
register
ScreenPtr
pScreen
;
register
WindowPtr
pSib
,
pChild
;
Bool
resized
=
(
dw
||
dh
);
pScreen
=
pWin
->
drawable
.
pScreen
;
for
(
pSib
=
pWin
->
firstChild
;
pSib
;
pSib
=
pSib
->
nextSib
)
{
if
(
resized
&&
(
pSib
->
winGravity
>
NorthWestGravity
))
{
int
cwsx
,
cwsy
;
cwsx
=
pSib
->
origin
.
x
;
cwsy
=
pSib
->
origin
.
y
;
GravityTranslate
(
cwsx
,
cwsy
,
cwsx
-
dx
,
cwsy
-
dy
,
dw
,
dh
,
pSib
->
winGravity
,
&
cwsx
,
&
cwsy
);
if
(
cwsx
!=
pSib
->
origin
.
x
||
cwsy
!=
pSib
->
origin
.
y
)
{
xEvent
event
;
event
.
u
.
u
.
type
=
GravityNotify
;
event
.
u
.
gravity
.
window
=
pSib
->
drawable
.
id
;
event
.
u
.
gravity
.
x
=
cwsx
-
wBorderWidth
(
pSib
);
event
.
u
.
gravity
.
y
=
cwsy
-
wBorderWidth
(
pSib
);
DeliverEvents
(
pSib
,
&
event
,
1
,
NullWindow
);
pSib
->
origin
.
x
=
cwsx
;
pSib
->
origin
.
y
=
cwsy
;
}
}
pSib
->
drawable
.
x
=
pWin
->
drawable
.
x
+
pSib
->
origin
.
x
;
pSib
->
drawable
.
y
=
pWin
->
drawable
.
y
+
pSib
->
origin
.
y
;
SetWinSize
(
pSib
);
SetBorderSize
(
pSib
);
/*
* Don't force X to move children. It will position them
* according with gravity.
*
* (*pScreen->PositionWindow)(pSib, pSib->drawable.x, pSib->drawable.y);
*/
/*
* Update pSib privates, as this window is moved by X.
*/
nxagentAddConfiguredWindow
(
pSib
,
CW_Update
);
if
(
(
pChild
=
pSib
->
firstChild
)
)
if
(
(
pChild
=
pSib
->
firstChild
)
)
{
while
(
1
)
{
...
...
@@ -2071,346 +420,6 @@ ResizeChildrenWinSize(register WindowPtr pWin, int dx, int dy, int dw, int dh)
}
}
#define GET_INT16(m, f) \
if (m & mask) \
{ \
f = (INT16) *pVlist;\
pVlist++; \
}
#define GET_CARD16(m, f) \
if (m & mask) \
{ \
f = (CARD16) *pVlist;\
pVlist++;\
}
#define GET_CARD8(m, f) \
if (m & mask) \
{ \
f = (CARD8) *pVlist;\
pVlist++;\
}
#define ChangeMask ((Mask)(CWX | CWY | CWWidth | CWHeight))
#define IllegalInputOnlyConfigureMask (CWBorderWidth)
/*
* IsSiblingAboveMe
* returns Above if pSib above pMe in stack or Below otherwise
*/
static
int
IsSiblingAboveMe
(
register
WindowPtr
pMe
,
register
WindowPtr
pSib
)
{
register
WindowPtr
pWin
;
pWin
=
pMe
->
parent
->
firstChild
;
while
(
pWin
)
{
if
(
pWin
==
pSib
)
return
(
Above
);
else
if
(
pWin
==
pMe
)
return
(
Below
);
pWin
=
pWin
->
nextSib
;
}
return
(
Below
);
}
static
BoxPtr
WindowExtents
(
register
WindowPtr
pWin
,
register
BoxPtr
pBox
)
{
pBox
->
x1
=
pWin
->
drawable
.
x
-
wBorderWidth
(
pWin
);
pBox
->
y1
=
pWin
->
drawable
.
y
-
wBorderWidth
(
pWin
);
pBox
->
x2
=
pWin
->
drawable
.
x
+
(
int
)
pWin
->
drawable
.
width
+
wBorderWidth
(
pWin
);
pBox
->
y2
=
pWin
->
drawable
.
y
+
(
int
)
pWin
->
drawable
.
height
+
wBorderWidth
(
pWin
);
return
(
pBox
);
}
#ifdef SHAPE
#define IS_SHAPED(pWin) (wBoundingShape (pWin) != (RegionPtr) NULL)
static
RegionPtr
MakeBoundingRegion
(
register
WindowPtr
pWin
,
BoxPtr
pBox
)
{
RegionPtr
pRgn
;
#ifndef NXAGENT_SERVER
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
#endif
/* NXAGENT_SERVER */
pRgn
=
RegionCreate
(
pBox
,
1
);
if
(
wBoundingShape
(
pWin
))
{
RegionTranslate
(
pRgn
,
-
pWin
->
origin
.
x
,
-
pWin
->
origin
.
y
);
RegionIntersect
(
pRgn
,
pRgn
,
wBoundingShape
(
pWin
));
RegionTranslate
(
pRgn
,
pWin
->
origin
.
x
,
pWin
->
origin
.
y
);
}
return
pRgn
;
}
static
Bool
ShapeOverlap
(
WindowPtr
pWin
,
BoxPtr
pWinBox
,
WindowPtr
pSib
,
BoxPtr
pSibBox
)
{
RegionPtr
pWinRgn
,
pSibRgn
;
Bool
ret
;
if
(
!
IS_SHAPED
(
pWin
)
&&
!
IS_SHAPED
(
pSib
))
return
TRUE
;
pWinRgn
=
MakeBoundingRegion
(
pWin
,
pWinBox
);
pSibRgn
=
MakeBoundingRegion
(
pSib
,
pSibBox
);
RegionIntersect
(
pWinRgn
,
pWinRgn
,
pSibRgn
);
ret
=
RegionNotEmpty
(
pWinRgn
);
RegionDestroy
(
pWinRgn
);
RegionDestroy
(
pSibRgn
);
return
ret
;
}
#endif
static
Bool
AnyWindowOverlapsMe
(
WindowPtr
pWin
,
WindowPtr
pHead
,
register
BoxPtr
box
)
{
register
WindowPtr
pSib
;
BoxRec
sboxrec
;
register
BoxPtr
sbox
;
for
(
pSib
=
pWin
->
prevSib
;
pSib
!=
pHead
;
pSib
=
pSib
->
prevSib
)
{
if
(
pSib
->
mapped
)
{
sbox
=
WindowExtents
(
pSib
,
&
sboxrec
);
if
(
BOXES_OVERLAP
(
sbox
,
box
)
#ifdef SHAPE
&&
ShapeOverlap
(
pWin
,
box
,
pSib
,
sbox
)
#endif
)
return
(
TRUE
);
}
}
return
(
FALSE
);
}
static
Bool
IOverlapAnyWindow
(
WindowPtr
pWin
,
register
BoxPtr
box
)
{
register
WindowPtr
pSib
;
BoxRec
sboxrec
;
register
BoxPtr
sbox
;
for
(
pSib
=
pWin
->
nextSib
;
pSib
;
pSib
=
pSib
->
nextSib
)
{
if
(
pSib
->
mapped
)
{
sbox
=
WindowExtents
(
pSib
,
&
sboxrec
);
if
(
BOXES_OVERLAP
(
sbox
,
box
)
#ifdef SHAPE
&&
ShapeOverlap
(
pWin
,
box
,
pSib
,
sbox
)
#endif
)
return
(
TRUE
);
}
}
return
(
FALSE
);
}
/*
* WhereDoIGoInTheStack()
* Given pWin and pSib and the relationshipe smode, return
* the window that pWin should go ABOVE.
* If a pSib is specified:
* Above: pWin is placed just above pSib
* Below: pWin is placed just below pSib
* TopIf: if pSib occludes pWin, then pWin is placed
* at the top of the stack
* BottomIf: if pWin occludes pSib, then pWin is
* placed at the bottom of the stack
* Opposite: if pSib occludes pWin, then pWin is placed at the
* top of the stack, else if pWin occludes pSib, then
* pWin is placed at the bottom of the stack
*
* If pSib is NULL:
* Above: pWin is placed at the top of the stack
* Below: pWin is placed at the bottom of the stack
* TopIf: if any sibling occludes pWin, then pWin is placed at
* the top of the stack
* BottomIf: if pWin occludes any sibline, then pWin is placed at
* the bottom of the stack
* Opposite: if any sibling occludes pWin, then pWin is placed at
* the top of the stack, else if pWin occludes any
* sibling, then pWin is placed at the bottom of the stack
*
*/
static
WindowPtr
WhereDoIGoInTheStack
(
register
WindowPtr
pWin
,
register
WindowPtr
pSib
,
short
x
,
short
y
,
unsigned
short
w
,
unsigned
short
h
,
int
smode
)
{
BoxRec
box
;
WindowPtr
pHead
,
pFirst
;
if
((
pWin
==
pWin
->
parent
->
firstChild
)
&&
(
pWin
==
pWin
->
parent
->
lastChild
))
return
((
WindowPtr
)
NULL
);
pHead
=
RealChildHead
(
pWin
->
parent
);
pFirst
=
pHead
?
pHead
->
nextSib
:
pWin
->
parent
->
firstChild
;
box
.
x1
=
x
;
box
.
y1
=
y
;
box
.
x2
=
x
+
(
int
)
w
;
box
.
y2
=
y
+
(
int
)
h
;
switch
(
smode
)
{
case
Above
:
if
(
pSib
)
return
(
pSib
);
else
if
(
pWin
==
pFirst
)
return
(
pWin
->
nextSib
);
else
return
(
pFirst
);
case
Below
:
if
(
pSib
)
if
(
pSib
->
nextSib
!=
pWin
)
return
(
pSib
->
nextSib
);
else
return
(
pWin
->
nextSib
);
else
return
NullWindow
;
case
TopIf
:
if
((
!
pWin
->
mapped
||
(
pSib
&&
!
pSib
->
mapped
))
&&
!
permitOldBugs
)
return
(
pWin
->
nextSib
);
else
if
(
pSib
)
{
if
((
IsSiblingAboveMe
(
pWin
,
pSib
)
==
Above
)
&&
(
RegionContainsRect
(
&
pSib
->
borderSize
,
&
box
)
!=
rgnOUT
))
return
(
pFirst
);
else
return
(
pWin
->
nextSib
);
}
else
if
(
AnyWindowOverlapsMe
(
pWin
,
pHead
,
&
box
))
return
(
pFirst
);
else
return
(
pWin
->
nextSib
);
case
BottomIf
:
if
((
!
pWin
->
mapped
||
(
pSib
&&
!
pSib
->
mapped
))
&&
!
permitOldBugs
)
return
(
pWin
->
nextSib
);
else
if
(
pSib
)
{
if
((
IsSiblingAboveMe
(
pWin
,
pSib
)
==
Below
)
&&
(
RegionContainsRect
(
&
pSib
->
borderSize
,
&
box
)
!=
rgnOUT
))
return
NullWindow
;
else
return
(
pWin
->
nextSib
);
}
else
if
(
IOverlapAnyWindow
(
pWin
,
&
box
))
return
NullWindow
;
else
return
(
pWin
->
nextSib
);
case
Opposite
:
if
((
!
pWin
->
mapped
||
(
pSib
&&
!
pSib
->
mapped
))
&&
!
permitOldBugs
)
return
(
pWin
->
nextSib
);
else
if
(
pSib
)
{
if
(
RegionContainsRect
(
&
pSib
->
borderSize
,
&
box
)
!=
rgnOUT
)
{
if
(
IsSiblingAboveMe
(
pWin
,
pSib
)
==
Above
)
return
(
pFirst
);
else
return
NullWindow
;
}
else
return
(
pWin
->
nextSib
);
}
else
if
(
AnyWindowOverlapsMe
(
pWin
,
pHead
,
&
box
))
{
/* If I'm occluded, I can't possibly be the first child
* if (pWin == pWin->parent->firstChild)
* return pWin->nextSib;
*/
return
(
pFirst
);
}
else
if
(
IOverlapAnyWindow
(
pWin
,
&
box
))
return
NullWindow
;
else
return
pWin
->
nextSib
;
default:
{
ErrorF
(
"Internal error in ConfigureWindow, smode == %d
\n
"
,
smode
);
return
pWin
->
nextSib
;
}
}
}
static
void
ReflectStackChange
(
register
WindowPtr
pWin
,
register
WindowPtr
pSib
,
VTKind
kind
)
{
/* Note that pSib might be NULL */
Bool
WasViewable
=
(
Bool
)
pWin
->
viewable
;
Bool
anyMarked
;
WindowPtr
pFirstChange
;
#ifdef DO_SAVE_UNDERS
Bool
dosave
=
FALSE
;
#endif
WindowPtr
pLayerWin
;
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
/* if this is a root window, can't be restacked */
if
(
!
pWin
->
parent
)
return
;
pFirstChange
=
MoveWindowInStack
(
pWin
,
pSib
);
if
(
WasViewable
)
{
anyMarked
=
(
*
pScreen
->
MarkOverlappedWindows
)(
pWin
,
pFirstChange
,
&
pLayerWin
);
if
(
pLayerWin
!=
pWin
)
pFirstChange
=
pLayerWin
;
#ifdef DO_SAVE_UNDERS
if
(
DO_SAVE_UNDERS
(
pWin
))
{
dosave
=
(
*
pScreen
->
ChangeSaveUnder
)(
pLayerWin
,
pFirstChange
);
}
#endif
/* DO_SAVE_UNDERS */
if
(
anyMarked
)
{
(
*
pScreen
->
ValidateTree
)(
pLayerWin
->
parent
,
pFirstChange
,
kind
);
(
*
pScreen
->
HandleExposures
)(
pLayerWin
->
parent
);
}
#ifdef DO_SAVE_UNDERS
if
(
dosave
)
(
*
pScreen
->
PostChangeSaveUnder
)(
pLayerWin
,
pFirstChange
);
#endif
/* DO_SAVE_UNDERS */
if
(
anyMarked
&&
pWin
->
drawable
.
pScreen
->
PostValidateTree
)
(
*
pScreen
->
PostValidateTree
)(
pLayerWin
->
parent
,
pFirstChange
,
kind
);
}
if
(
pWin
->
realized
)
WindowsRestructured
();
}
/*****
* ConfigureWindow
*****/
...
...
@@ -2717,99 +726,6 @@ ActuallyDoSomething:
#undef REBORDER_WIN
}
/******
*
* CirculateWindow
* For RaiseLowest, raises the lowest mapped child (if any) that is
* obscured by another child to the top of the stack. For LowerHighest,
* lowers the highest mapped child (if any) that is obscuring another
* child to the bottom of the stack. Exposure processing is performed
*
******/
int
CirculateWindow
(
WindowPtr
pParent
,
int
direction
,
ClientPtr
client
)
{
register
WindowPtr
pWin
,
pHead
,
pFirst
;
xEvent
event
;
BoxRec
box
;
#ifdef TEST
fprintf
(
stderr
,
"CirculateWindow: pParent [%p] direction [%d] client [%p]
\n
"
,
pParent
,
direction
,
client
);
#endif
/*
* if (nxagentOption(Rootless) && nxagentWMIsRunning &&
* nxagentWindowTopLevel(pWin) && pWin -> overrideRedirect == 0)
* {
* nxagentCirculateRootlessWindows(direction);
* return Success;
* }
*/
pHead
=
RealChildHead
(
pParent
);
pFirst
=
pHead
?
pHead
->
nextSib
:
pParent
->
firstChild
;
if
(
direction
==
RaiseLowest
)
{
for
(
pWin
=
pParent
->
lastChild
;
(
pWin
!=
pHead
)
&&
!
(
pWin
->
mapped
&&
AnyWindowOverlapsMe
(
pWin
,
pHead
,
WindowExtents
(
pWin
,
&
box
)));
pWin
=
pWin
->
prevSib
)
;
if
(
pWin
==
pHead
)
return
Success
;
}
else
{
for
(
pWin
=
pFirst
;
pWin
&&
!
(
pWin
->
mapped
&&
IOverlapAnyWindow
(
pWin
,
WindowExtents
(
pWin
,
&
box
)));
pWin
=
pWin
->
nextSib
)
;
if
(
!
pWin
)
return
Success
;
}
event
.
u
.
circulate
.
window
=
pWin
->
drawable
.
id
;
event
.
u
.
circulate
.
parent
=
pParent
->
drawable
.
id
;
event
.
u
.
circulate
.
event
=
pParent
->
drawable
.
id
;
if
(
direction
==
RaiseLowest
)
event
.
u
.
circulate
.
place
=
PlaceOnTop
;
else
event
.
u
.
circulate
.
place
=
PlaceOnBottom
;
if
(
RedirectSend
(
pParent
))
{
event
.
u
.
u
.
type
=
CirculateRequest
;
if
(
MaybeDeliverEventsToClient
(
pParent
,
&
event
,
1
,
SubstructureRedirectMask
,
client
)
==
1
)
return
(
Success
);
}
event
.
u
.
u
.
type
=
CirculateNotify
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
ReflectStackChange
(
pWin
,
(
direction
==
RaiseLowest
)
?
pFirst
:
NullWindow
,
VTStack
);
return
(
Success
);
}
static
int
CompareWIDs
(
WindowPtr
pWin
,
void
*
value
)
/* must conform to VisitWindowProcPtr */
{
Window
*
wid
=
(
Window
*
)
value
;
if
(
pWin
->
drawable
.
id
==
*
wid
)
return
(
WT_STOPWALKING
);
else
return
(
WT_WALKCHILDREN
);
}
/*****
* ReparentWindow
*****/
...
...
@@ -2915,39 +831,6 @@ ReparentWindow(register WindowPtr pWin, register WindowPtr pParent,
return
(
Success
);
}
static
void
RealizeTree
(
WindowPtr
pWin
)
{
register
WindowPtr
pChild
;
RealizeWindowProcPtr
Realize
;
Realize
=
pWin
->
drawable
.
pScreen
->
RealizeWindow
;
pChild
=
pWin
;
while
(
1
)
{
if
(
pChild
->
mapped
)
{
pChild
->
realized
=
TRUE
;
#ifdef DO_SAVE_UNDERS
if
(
pChild
->
saveUnder
)
deltaSaveUndersViewable
++
;
#endif
pChild
->
viewable
=
(
pChild
->
drawable
.
class
==
InputOutput
);
(
*
Realize
)(
pChild
);
if
(
pChild
->
firstChild
)
{
pChild
=
pChild
->
firstChild
;
continue
;
}
}
while
(
!
pChild
->
nextSib
&&
(
pChild
!=
pWin
))
pChild
=
pChild
->
parent
;
if
(
pChild
==
pWin
)
return
;
pChild
=
pChild
->
nextSib
;
}
}
/*****
* MapWindow
* If some other client has selected SubStructureReDirect on the parent
...
...
@@ -3054,217 +937,36 @@ MapWindow(register WindowPtr pWin, ClientPtr client)
(
*
pScreen
->
HandleExposures
)(
pLayerWin
->
parent
);
}
#ifdef DO_SAVE_UNDERS
if
(
dosave
)
(
*
pScreen
->
PostChangeSaveUnder
)(
pLayerWin
,
pWin
->
nextSib
);
#endif
/* DO_SAVE_UNDERS */
if
(
anyMarked
&&
pScreen
->
PostValidateTree
)
(
*
pScreen
->
PostValidateTree
)(
pLayerWin
->
parent
,
pLayerWin
,
VTMap
);
}
WindowsRestructured
();
}
else
{
RegionRec
temp
;
pWin
->
mapped
=
TRUE
;
pWin
->
realized
=
TRUE
;
/* for roots */
pWin
->
viewable
=
pWin
->
drawable
.
class
==
InputOutput
;
/* We SHOULD check for an error value here XXX */
(
*
pScreen
->
RealizeWindow
)(
pWin
);
if
(
pScreen
->
ClipNotify
)
(
*
pScreen
->
ClipNotify
)
(
pWin
,
0
,
0
);
if
(
pScreen
->
PostValidateTree
)
(
*
pScreen
->
PostValidateTree
)(
NullWindow
,
pWin
,
VTMap
);
RegionNull
(
&
temp
);
RegionCopy
(
&
temp
,
&
pWin
->
clipList
);
(
*
pScreen
->
WindowExposures
)
(
pWin
,
&
temp
,
NullRegion
);
RegionUninit
(
&
temp
);
}
nxagentFlushConfigureWindow
();
return
(
Success
);
}
/*****
* MapSubwindows
* Performs a MapWindow all unmapped children of the window, in top
* to bottom stacking order.
*****/
void
MapSubwindows
(
register
WindowPtr
pParent
,
ClientPtr
client
)
{
register
WindowPtr
pWin
;
WindowPtr
pFirstMapped
=
NullWindow
;
#ifdef DO_SAVE_UNDERS
WindowPtr
pFirstSaveUndered
=
NullWindow
;
#endif
register
ScreenPtr
pScreen
;
register
Mask
parentRedirect
;
register
Mask
parentNotify
;
xEvent
event
;
Bool
anyMarked
;
#ifdef DO_SAVE_UNDERS
Bool
dosave
=
FALSE
;
#endif
WindowPtr
pLayerWin
;
pScreen
=
pParent
->
drawable
.
pScreen
;
parentRedirect
=
RedirectSend
(
pParent
);
parentNotify
=
SubSend
(
pParent
);
anyMarked
=
FALSE
;
for
(
pWin
=
pParent
->
firstChild
;
pWin
;
pWin
=
pWin
->
nextSib
)
{
if
(
!
pWin
->
mapped
)
{
if
(
parentRedirect
&&
!
pWin
->
overrideRedirect
)
{
memset
(
&
event
,
0
,
sizeof
(
xEvent
));
event
.
u
.
u
.
type
=
MapRequest
;
event
.
u
.
mapRequest
.
window
=
pWin
->
drawable
.
id
;
event
.
u
.
mapRequest
.
parent
=
pParent
->
drawable
.
id
;
if
(
MaybeDeliverEventsToClient
(
pParent
,
&
event
,
1
,
SubstructureRedirectMask
,
client
)
==
1
)
continue
;
}
pWin
->
mapped
=
TRUE
;
if
(
parentNotify
||
StrSend
(
pWin
))
{
memset
(
&
event
,
0
,
sizeof
(
xEvent
));
event
.
u
.
u
.
type
=
MapNotify
;
event
.
u
.
mapNotify
.
window
=
pWin
->
drawable
.
id
;
event
.
u
.
mapNotify
.
override
=
pWin
->
overrideRedirect
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
}
if
(
!
pFirstMapped
)
pFirstMapped
=
pWin
;
if
(
pParent
->
realized
)
{
RealizeTree
(
pWin
);
if
(
pWin
->
viewable
)
{
anyMarked
|=
(
*
pScreen
->
MarkOverlappedWindows
)(
pWin
,
pWin
,
(
WindowPtr
*
)
NULL
);
#ifdef DO_SAVE_UNDERS
if
(
DO_SAVE_UNDERS
(
pWin
))
{
dosave
=
TRUE
;
}
#endif
/* DO_SAVE_UNDERS */
}
}
}
}
if
(
pFirstMapped
)
{
pLayerWin
=
(
*
pScreen
->
GetLayerWindow
)(
pParent
);
if
(
pLayerWin
->
parent
!=
pParent
)
{
anyMarked
|=
(
*
pScreen
->
MarkOverlappedWindows
)(
pLayerWin
,
pLayerWin
,
(
WindowPtr
*
)
NULL
);
pFirstMapped
=
pLayerWin
;
}
if
(
anyMarked
)
{
#ifdef DO_SAVE_UNDERS
if
(
pLayerWin
->
parent
!=
pParent
)
{
if
(
dosave
||
(
DO_SAVE_UNDERS
(
pLayerWin
)))
{
dosave
=
(
*
pScreen
->
ChangeSaveUnder
)(
pLayerWin
,
pLayerWin
);
}
}
else
if
(
dosave
)
{
dosave
=
FALSE
;
for
(
pWin
=
pParent
->
firstChild
;
pWin
;
pWin
=
pWin
->
nextSib
)
{
if
(
DO_SAVE_UNDERS
(
pWin
))
{
dosave
|=
(
*
pScreen
->
ChangeSaveUnder
)(
pWin
,
pWin
->
nextSib
);
if
(
dosave
&&
!
pFirstSaveUndered
)
pFirstSaveUndered
=
pWin
;
}
}
}
#endif
/* DO_SAVE_UNDERS */
(
*
pScreen
->
ValidateTree
)(
pLayerWin
->
parent
,
pFirstMapped
,
VTMap
);
(
*
pScreen
->
HandleExposures
)(
pLayerWin
->
parent
);
}
#ifdef DO_SAVE_UNDERS
if
(
dosave
)
(
*
pScreen
->
PostChangeSaveUnder
)(
pLayerWin
,
pFirstSaveUndered
->
nextSib
);
#endif
/* DO_SAVE_UNDERS */
if
(
anyMarked
&&
pScreen
->
PostValidateTree
)
(
*
pScreen
->
PostValidateTree
)(
pLayerWin
->
parent
,
pFirstMapped
,
VTMap
);
WindowsRestructured
();
}
}
static
void
UnrealizeTree
(
WindowPtr
pWin
,
Bool
fromConfigure
)
{
register
WindowPtr
pChild
;
UnrealizeWindowProcPtr
Unrealize
;
MarkUnrealizedWindowProcPtr
MarkUnrealizedWindow
;
Unrealize
=
pWin
->
drawable
.
pScreen
->
UnrealizeWindow
;
MarkUnrealizedWindow
=
pWin
->
drawable
.
pScreen
->
MarkUnrealizedWindow
;
pChild
=
pWin
;
while
(
1
)
{
if
(
pChild
->
realized
)
{
pChild
->
realized
=
FALSE
;
pChild
->
visibility
=
VisibilityNotViewable
;
#ifdef PANORAMIX
if
(
!
noPanoramiXExtension
&&
!
pChild
->
drawable
.
pScreen
->
myNum
)
{
PanoramiXRes
*
win
;
win
=
(
PanoramiXRes
*
)
LookupIDByType
(
pChild
->
drawable
.
id
,
XRT_WINDOW
);
if
(
win
)
win
->
u
.
win
.
visibility
=
VisibilityNotViewable
;
}
#endif
(
*
Unrealize
)(
pChild
);
DeleteWindowFromAnyEvents
(
pChild
,
FALSE
);
if
(
pChild
->
viewable
)
{
#ifdef DO_SAVE_UNDERS
if
(
pChild
->
saveUnder
)
deltaSaveUndersViewable
--
;
#endif
pChild
->
viewable
=
FALSE
;
if
(
pChild
->
backStorage
)
(
*
pChild
->
drawable
.
pScreen
->
SaveDoomedAreas
)(
pChild
,
&
pChild
->
clipList
,
0
,
0
);
(
*
MarkUnrealizedWindow
)(
pChild
,
pWin
,
fromConfigure
);
pChild
->
drawable
.
serialNumber
=
NEXT_SERIAL_NUMBER
;
}
if
(
pChild
->
firstChild
)
{
pChild
=
pChild
->
firstChild
;
continue
;
}
if
(
dosave
)
(
*
pScreen
->
PostChangeSaveUnder
)(
pLayerWin
,
pWin
->
nextSib
);
#endif
/* DO_SAVE_UNDERS */
if
(
anyMarked
&&
pScreen
->
PostValidateTree
)
(
*
pScreen
->
PostValidateTree
)(
pLayerWin
->
parent
,
pLayerWin
,
VTMap
);
}
while
(
!
pChild
->
nextSib
&&
(
pChild
!=
pWin
))
pChild
=
pChild
->
parent
;
if
(
pChild
==
pWin
)
return
;
pChild
=
pChild
->
nextSib
;
WindowsRestructured
();
}
else
{
RegionRec
temp
;
pWin
->
mapped
=
TRUE
;
pWin
->
realized
=
TRUE
;
/* for roots */
pWin
->
viewable
=
pWin
->
drawable
.
class
==
InputOutput
;
/* We SHOULD check for an error value here XXX */
(
*
pScreen
->
RealizeWindow
)(
pWin
);
if
(
pScreen
->
ClipNotify
)
(
*
pScreen
->
ClipNotify
)
(
pWin
,
0
,
0
);
if
(
pScreen
->
PostValidateTree
)
(
*
pScreen
->
PostValidateTree
)(
NullWindow
,
pWin
,
VTMap
);
RegionNull
(
&
temp
);
RegionCopy
(
&
temp
,
&
pWin
->
clipList
);
(
*
pScreen
->
WindowExposures
)
(
pWin
,
&
temp
,
NullRegion
);
RegionUninit
(
&
temp
);
}
nxagentFlushConfigureWindow
();
return
(
Success
);
}
/*****
...
...
@@ -3336,275 +1038,6 @@ UnmapWindow(register WindowPtr pWin, Bool fromConfigure)
return
(
Success
);
}
/*****
* UnmapSubwindows
* Performs an UnmapWindow request with the specified mode on all mapped
* children of the window, in bottom to top stacking order.
*****/
void
UnmapSubwindows
(
register
WindowPtr
pWin
)
{
register
WindowPtr
pChild
,
pHead
;
xEvent
event
;
Bool
wasRealized
=
(
Bool
)
pWin
->
realized
;
Bool
wasViewable
=
(
Bool
)
pWin
->
viewable
;
Bool
anyMarked
=
FALSE
;
Mask
parentNotify
;
WindowPtr
pLayerWin
=
NULL
;
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
if
(
!
pWin
->
firstChild
)
return
;
parentNotify
=
SubSend
(
pWin
);
pHead
=
RealChildHead
(
pWin
);
if
(
wasViewable
)
pLayerWin
=
(
*
pScreen
->
GetLayerWindow
)(
pWin
);
for
(
pChild
=
pWin
->
lastChild
;
pChild
!=
pHead
;
pChild
=
pChild
->
prevSib
)
{
if
(
pChild
->
mapped
)
{
if
(
parentNotify
||
StrSend
(
pChild
))
{
event
.
u
.
u
.
type
=
UnmapNotify
;
event
.
u
.
unmapNotify
.
window
=
pChild
->
drawable
.
id
;
event
.
u
.
unmapNotify
.
fromConfigure
=
xFalse
;
DeliverEvents
(
pChild
,
&
event
,
1
,
NullWindow
);
}
if
(
pChild
->
viewable
)
{
pChild
->
valdata
=
UnmapValData
;
anyMarked
=
TRUE
;
}
pChild
->
mapped
=
FALSE
;
if
(
pChild
->
realized
)
UnrealizeTree
(
pChild
,
FALSE
);
if
(
wasViewable
)
{
#ifdef DO_SAVE_UNDERS
pChild
->
DIXsaveUnder
=
FALSE
;
#endif
/* DO_SAVE_UNDERS */
if
(
pChild
->
backStorage
)
(
*
pScreen
->
SaveDoomedAreas
)(
pChild
,
&
pChild
->
clipList
,
0
,
0
);
}
}
}
if
(
wasViewable
)
{
if
(
anyMarked
)
{
if
(
pLayerWin
->
parent
==
pWin
)
(
*
pScreen
->
MarkWindow
)(
pWin
);
else
{
WindowPtr
ptmp
;
(
*
pScreen
->
MarkOverlappedWindows
)(
pWin
,
pLayerWin
,
(
WindowPtr
*
)
NULL
);
(
*
pScreen
->
MarkWindow
)(
pLayerWin
->
parent
);
/* Windows between pWin and pLayerWin may not have been marked */
ptmp
=
pWin
;
while
(
ptmp
!=
pLayerWin
->
parent
)
{
(
*
pScreen
->
MarkWindow
)(
ptmp
);
ptmp
=
ptmp
->
parent
;
}
pHead
=
pWin
->
firstChild
;
}
(
*
pScreen
->
ValidateTree
)(
pLayerWin
->
parent
,
pHead
,
VTUnmap
);
(
*
pScreen
->
HandleExposures
)(
pLayerWin
->
parent
);
}
#ifdef DO_SAVE_UNDERS
if
(
DO_SAVE_UNDERS
(
pWin
))
{
if
(
(
*
pScreen
->
ChangeSaveUnder
)(
pLayerWin
,
pLayerWin
))
(
*
pScreen
->
PostChangeSaveUnder
)(
pLayerWin
,
pLayerWin
);
}
#endif
/* DO_SAVE_UNDERS */
if
(
anyMarked
&&
pScreen
->
PostValidateTree
)
(
*
pScreen
->
PostValidateTree
)(
pLayerWin
->
parent
,
pHead
,
VTUnmap
);
}
if
(
wasRealized
)
WindowsRestructured
();
}
void
HandleSaveSet
(
register
ClientPtr
client
)
{
register
WindowPtr
pParent
,
pWin
;
register
int
j
;
for
(
j
=
0
;
j
<
client
->
numSaved
;
j
++
)
{
pWin
=
SaveSetWindow
(
client
->
saveSet
[
j
]);
#ifdef XFIXES
if
(
SaveSetToRoot
(
client
->
saveSet
[
j
]))
pParent
=
pWin
->
drawable
.
pScreen
->
root
;
else
#endif
{
pParent
=
pWin
->
parent
;
while
(
pParent
&&
(
wClient
(
pParent
)
==
client
))
pParent
=
pParent
->
parent
;
}
if
(
pParent
)
{
if
(
pParent
!=
pWin
->
parent
)
{
ReparentWindow
(
pWin
,
pParent
,
pWin
->
drawable
.
x
-
wBorderWidth
(
pWin
)
-
pParent
->
drawable
.
x
,
pWin
->
drawable
.
y
-
wBorderWidth
(
pWin
)
-
pParent
->
drawable
.
y
,
client
);
if
(
!
pWin
->
realized
&&
pWin
->
mapped
)
pWin
->
mapped
=
FALSE
;
}
#ifdef XFIXES
if
(
SaveSetRemap
(
client
->
saveSet
[
j
]))
#endif
MapWindow
(
pWin
,
client
);
}
}
xfree
(
client
->
saveSet
);
client
->
numSaved
=
0
;
client
->
saveSet
=
(
SaveSetElt
*
)
NULL
;
}
/**
*
* \param x,y in root
* \param box "return" value
*/
Bool
VisibleBoundingBoxFromPoint
(
register
WindowPtr
pWin
,
int
x
,
int
y
,
BoxPtr
box
)
{
if
(
!
pWin
->
realized
)
return
(
FALSE
);
if
(
RegionContainsPoint
(
&
pWin
->
clipList
,
x
,
y
,
box
))
return
(
TRUE
);
return
(
FALSE
);
}
/**
*
* \param x,y in root
*/
Bool
PointInWindowIsVisible
(
register
WindowPtr
pWin
,
int
x
,
int
y
)
{
BoxRec
box
;
if
(
!
pWin
->
realized
)
return
(
FALSE
);
if
(
RegionContainsPoint
(
&
pWin
->
borderClip
,
x
,
y
,
&
box
)
&&
(
!
wInputShape
(
pWin
)
||
RegionContainsPoint
(
wInputShape
(
pWin
),
x
-
pWin
->
drawable
.
x
,
y
-
pWin
->
drawable
.
y
,
&
box
)))
return
(
TRUE
);
return
(
FALSE
);
}
RegionPtr
NotClippedByChildren
(
register
WindowPtr
pWin
)
{
RegionPtr
pReg
;
pReg
=
RegionCreate
(
NullBox
,
1
);
if
(
pWin
->
parent
||
screenIsSaved
!=
SCREEN_SAVER_ON
||
!
HasSaverWindow
(
pWin
->
drawable
.
pScreen
->
myNum
))
{
RegionIntersect
(
pReg
,
&
pWin
->
borderClip
,
&
pWin
->
winSize
);
}
return
(
pReg
);
}
void
SendVisibilityNotify
(
WindowPtr
pWin
)
{
xEvent
event
;
#ifndef NO_XINERAMA_PORT
unsigned
int
visibility
=
pWin
->
visibility
;
#endif
#ifdef PANORAMIX
/* This is not quite correct yet, but it's close */
if
(
!
noPanoramiXExtension
)
{
PanoramiXRes
*
win
;
WindowPtr
pWin2
;
int
i
,
Scrnum
;
Scrnum
=
pWin
->
drawable
.
pScreen
->
myNum
;
win
=
PanoramiXFindIDByScrnum
(
XRT_WINDOW
,
pWin
->
drawable
.
id
,
Scrnum
);
if
(
!
win
||
(
win
->
u
.
win
.
visibility
==
visibility
))
return
;
switch
(
visibility
)
{
case
VisibilityUnobscured
:
for
(
i
=
0
;
i
<
PanoramiXNumScreens
;
i
++
)
{
if
(
i
==
Scrnum
)
continue
;
pWin2
=
(
WindowPtr
)
LookupIDByType
(
win
->
info
[
i
].
id
,
RT_WINDOW
);
if
(
pWin2
)
{
if
(
pWin2
->
visibility
==
VisibilityPartiallyObscured
)
return
;
if
(
!
i
)
pWin
=
pWin2
;
}
}
break
;
case
VisibilityPartiallyObscured
:
if
(
Scrnum
)
{
pWin2
=
(
WindowPtr
)
LookupIDByType
(
win
->
info
[
0
].
id
,
RT_WINDOW
);
if
(
pWin2
)
pWin
=
pWin2
;
}
break
;
case
VisibilityFullyObscured
:
for
(
i
=
0
;
i
<
PanoramiXNumScreens
;
i
++
)
{
if
(
i
==
Scrnum
)
continue
;
pWin2
=
(
WindowPtr
)
LookupIDByType
(
win
->
info
[
i
].
id
,
RT_WINDOW
);
if
(
pWin2
)
{
if
(
pWin2
->
visibility
!=
VisibilityFullyObscured
)
return
;
if
(
!
i
)
pWin
=
pWin2
;
}
}
break
;
}
win
->
u
.
win
.
visibility
=
visibility
;
}
#endif
memset
(
&
event
,
0
,
sizeof
(
xEvent
));
event
.
u
.
u
.
type
=
VisibilityNotify
;
event
.
u
.
visibility
.
window
=
pWin
->
drawable
.
id
;
event
.
u
.
visibility
.
state
=
visibility
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
}
#define RANDOM_WIDTH 32
#ifndef NOLOGOHACK
static
void
DrawLogo
(
WindowPtr
pWin
);
#endif
void
SaveScreens
(
int
on
,
int
mode
)
{
...
...
@@ -3727,454 +1160,3 @@ SaveScreens(int on, int mode)
if
(
mode
==
ScreenSaverReset
)
SetScreenSaverTimer
();
}
static
Bool
TileScreenSaver
(
int
i
,
int
kind
)
{
int
j
;
int
result
;
XID
attributes
[
3
];
Mask
mask
;
WindowPtr
pWin
;
CursorMetricRec
cm
;
unsigned
char
*
srcbits
,
*
mskbits
;
CursorPtr
cursor
;
XID
cursorID
=
0
;
int
attri
;
mask
=
0
;
attri
=
0
;
switch
(
kind
)
{
case
SCREEN_IS_TILED
:
switch
(
screenInfo
.
screens
[
i
]
->
root
->
backgroundState
)
{
case
BackgroundPixel
:
attributes
[
attri
++
]
=
screenInfo
.
screens
[
i
]
->
root
->
background
.
pixel
;
mask
|=
CWBackPixel
;
break
;
case
BackgroundPixmap
:
attributes
[
attri
++
]
=
None
;
mask
|=
CWBackPixmap
;
break
;
default:
break
;
}
break
;
case
SCREEN_IS_BLACK
:
attributes
[
attri
++
]
=
screenInfo
.
screens
[
i
]
->
root
->
drawable
.
pScreen
->
blackPixel
;
mask
|=
CWBackPixel
;
break
;
}
mask
|=
CWOverrideRedirect
;
attributes
[
attri
++
]
=
xTrue
;
/*
* create a blank cursor
*/
cm
.
width
=
16
;
cm
.
height
=
16
;
cm
.
xhot
=
8
;
cm
.
yhot
=
8
;
srcbits
=
(
unsigned
char
*
)
xalloc
(
BitmapBytePad
(
32
)
*
16
);
mskbits
=
(
unsigned
char
*
)
xalloc
(
BitmapBytePad
(
32
)
*
16
);
if
(
!
srcbits
||
!
mskbits
)
{
xfree
(
srcbits
);
xfree
(
mskbits
);
cursor
=
0
;
}
else
{
for
(
j
=
0
;
j
<
BitmapBytePad
(
32
)
*
16
;
j
++
)
srcbits
[
j
]
=
mskbits
[
j
]
=
0x0
;
cursor
=
AllocCursor
(
srcbits
,
mskbits
,
&
cm
,
0
,
0
,
0
,
0
,
0
,
0
);
if
(
cursor
)
{
cursorID
=
FakeClientID
(
0
);
if
(
AddResource
(
cursorID
,
RT_CURSOR
,
(
void
*
)
cursor
))
{
attributes
[
attri
]
=
cursorID
;
mask
|=
CWCursor
;
}
else
cursor
=
0
;
}
else
{
xfree
(
srcbits
);
xfree
(
mskbits
);
}
}
pWin
=
savedScreenInfo
[
i
].
pWindow
=
CreateWindow
(
savedScreenInfo
[
i
].
wid
,
screenInfo
.
screens
[
i
]
->
root
,
-
RANDOM_WIDTH
,
-
RANDOM_WIDTH
,
(
unsigned
short
)
screenInfo
.
screens
[
i
]
->
width
+
RANDOM_WIDTH
,
(
unsigned
short
)
screenInfo
.
screens
[
i
]
->
height
+
RANDOM_WIDTH
,
0
,
InputOutput
,
mask
,
attributes
,
0
,
serverClient
,
wVisual
(
screenInfo
.
screens
[
i
]
->
root
),
&
result
);
if
(
cursor
)
FreeResource
(
cursorID
,
RT_NONE
);
if
(
!
pWin
)
return
FALSE
;
if
(
!
AddResource
(
pWin
->
drawable
.
id
,
RT_WINDOW
,
(
void
*
)
savedScreenInfo
[
i
].
pWindow
))
return
FALSE
;
if
(
mask
&
CWBackPixmap
)
{
MakeRootTile
(
pWin
);
(
*
pWin
->
drawable
.
pScreen
->
ChangeWindowAttributes
)(
pWin
,
CWBackPixmap
);
}
MapWindow
(
pWin
,
serverClient
);
#ifndef NOLOGOHACK
if
(
kind
==
SCREEN_IS_TILED
&&
logoScreenSaver
)
DrawLogo
(
pWin
);
#endif
return
TRUE
;
}
/*
* FindWindowWithOptional
*
* search ancestors of the given window for an entry containing
* a WindowOpt structure. Assumptions: some parent will
* contain the structure.
*/
WindowPtr
FindWindowWithOptional
(
register
WindowPtr
w
)
{
do
w
=
w
->
parent
;
while
(
!
w
->
optional
);
return
w
;
}
/*
* CheckWindowOptionalNeed
*
* check each optional entry in the given window to see if
* the value is satisfied by the default rules. If so,
* release the optional record
*/
void
CheckWindowOptionalNeed
(
register
WindowPtr
w
)
{
register
WindowOptPtr
optional
;
register
WindowOptPtr
parentOptional
;
if
(
!
w
->
parent
)
return
;
optional
=
w
->
optional
;
if
(
optional
->
dontPropagateMask
!=
DontPropagateMasks
[
w
->
dontPropagate
])
return
;
if
(
optional
->
otherEventMasks
!=
0
)
return
;
if
(
optional
->
otherClients
!=
NULL
)
return
;
if
(
optional
->
passiveGrabs
!=
NULL
)
return
;
if
(
optional
->
userProps
!=
NULL
)
return
;
if
(
optional
->
backingBitPlanes
!=
~
0L
)
return
;
if
(
optional
->
backingPixel
!=
0
)
return
;
#ifdef SHAPE
if
(
optional
->
boundingShape
!=
NULL
)
return
;
if
(
optional
->
clipShape
!=
NULL
)
return
;
if
(
optional
->
inputShape
!=
NULL
)
return
;
#endif
#ifdef XINPUT
if
(
optional
->
inputMasks
!=
NULL
)
return
;
#endif
parentOptional
=
FindWindowWithOptional
(
w
)
->
optional
;
if
(
optional
->
visual
!=
parentOptional
->
visual
)
return
;
if
(
optional
->
cursor
!=
None
&&
(
optional
->
cursor
!=
parentOptional
->
cursor
||
w
->
parent
->
cursorIsNone
))
return
;
if
(
optional
->
colormap
!=
parentOptional
->
colormap
)
return
;
DisposeWindowOptional
(
w
);
}
/*
* MakeWindowOptional
*
* create an optional record and initialize it with the default
* values.
*/
Bool
MakeWindowOptional
(
register
WindowPtr
pWin
)
{
register
WindowOptPtr
optional
;
register
WindowOptPtr
parentOptional
;
if
(
pWin
->
optional
)
return
TRUE
;
optional
=
(
WindowOptPtr
)
xalloc
(
sizeof
(
WindowOptRec
));
if
(
!
optional
)
return
FALSE
;
optional
->
dontPropagateMask
=
DontPropagateMasks
[
pWin
->
dontPropagate
];
optional
->
otherEventMasks
=
0
;
optional
->
otherClients
=
NULL
;
optional
->
passiveGrabs
=
NULL
;
optional
->
userProps
=
NULL
;
optional
->
backingBitPlanes
=
~
0L
;
optional
->
backingPixel
=
0
;
#ifdef SHAPE
optional
->
boundingShape
=
NULL
;
optional
->
clipShape
=
NULL
;
optional
->
inputShape
=
NULL
;
#endif
#ifdef XINPUT
optional
->
inputMasks
=
NULL
;
#endif
parentOptional
=
FindWindowWithOptional
(
pWin
)
->
optional
;
optional
->
visual
=
parentOptional
->
visual
;
if
(
!
pWin
->
cursorIsNone
)
{
optional
->
cursor
=
parentOptional
->
cursor
;
optional
->
cursor
->
refcnt
++
;
}
else
{
optional
->
cursor
=
None
;
}
optional
->
colormap
=
parentOptional
->
colormap
;
pWin
->
optional
=
optional
;
return
TRUE
;
}
void
DisposeWindowOptional
(
register
WindowPtr
pWin
)
{
if
(
!
pWin
->
optional
)
return
;
/*
* everything is peachy. Delete the optional record
* and clean up
*/
/*
* TOG changed this code to:
*
* if (pWin->cursorIsNone == FALSE)
* FreeCursor (pWin->optional->cursor, (Cursor)0);
* pWin->cursorIsNone = TRUE;
*
* This is blatently wrong; windows without optionals can have
* two different cursor values, either None or sharing their
* parents cursor. This difference is controlled by the
* cursorIsNone value; when TRUE, the window has no cursor,
* when false, it shares its cursor with its parent; TOG
* made it impossible for a window to have a cursor without
* an optional record.
*/
if
(
pWin
->
optional
->
cursor
)
{
FreeCursor
(
pWin
->
optional
->
cursor
,
(
Cursor
)
0
);
pWin
->
cursorIsNone
=
FALSE
;
}
else
pWin
->
cursorIsNone
=
TRUE
;
/* FIXME
There is an error when disposing ClientResources on Agent exit
this xfree is not valid in some window at exit
*/
xfree
(
pWin
->
optional
);
pWin
->
optional
=
NULL
;
}
#ifndef NOLOGOHACK
static
void
DrawLogo
(
WindowPtr
pWin
)
{
DrawablePtr
pDraw
;
ScreenPtr
pScreen
;
int
x
,
y
;
unsigned
int
width
,
height
,
size
;
GC
*
pGC
;
int
thin
,
gap
,
d31
;
DDXPointRec
poly
[
4
];
ChangeGCVal
fore
[
2
],
back
[
2
];
xrgb
rgb
[
2
];
BITS32
fmask
,
bmask
;
ColormapPtr
cmap
;
pDraw
=
(
DrawablePtr
)
pWin
;
pScreen
=
pDraw
->
pScreen
;
x
=
-
pWin
->
origin
.
x
;
y
=
-
pWin
->
origin
.
y
;
width
=
pScreen
->
width
;
height
=
pScreen
->
height
;
pGC
=
GetScratchGC
(
pScreen
->
rootDepth
,
pScreen
);
if
(
!
pGC
)
return
;
if
((
rand
()
%
100
)
<=
17
)
/* make the probability for white fairly low */
fore
[
0
].
val
=
pScreen
->
whitePixel
;
else
fore
[
0
].
val
=
pScreen
->
blackPixel
;
if
((
pWin
->
backgroundState
==
BackgroundPixel
)
&&
(
cmap
=
(
ColormapPtr
)
LookupIDByType
(
wColormap
(
pWin
),
RT_COLORMAP
)))
{
Pixel
querypixels
[
2
];
querypixels
[
0
]
=
fore
[
0
].
val
;
querypixels
[
1
]
=
pWin
->
background
.
pixel
;
QueryColors
(
cmap
,
2
,
querypixels
,
rgb
);
if
((
rgb
[
0
].
red
==
rgb
[
1
].
red
)
&&
(
rgb
[
0
].
green
==
rgb
[
1
].
green
)
&&
(
rgb
[
0
].
blue
==
rgb
[
1
].
blue
))
{
if
(
fore
[
0
].
val
==
pScreen
->
blackPixel
)
fore
[
0
].
val
=
pScreen
->
whitePixel
;
else
fore
[
0
].
val
=
pScreen
->
blackPixel
;
}
}
fore
[
1
].
val
=
FillSolid
;
fmask
=
GCForeground
|
GCFillStyle
;
if
(
pWin
->
backgroundState
==
BackgroundPixel
)
{
back
[
0
].
val
=
pWin
->
background
.
pixel
;
back
[
1
].
val
=
FillSolid
;
bmask
=
GCForeground
|
GCFillStyle
;
}
else
{
back
[
0
].
val
=
0
;
back
[
1
].
val
=
0
;
dixChangeGC
(
NullClient
,
pGC
,
GCTileStipXOrigin
|
GCTileStipYOrigin
,
NULL
,
back
);
back
[
0
].
val
=
FillTiled
;
back
[
1
].
ptr
=
pWin
->
background
.
pixmap
;
bmask
=
GCFillStyle
|
GCTile
;
}
/* should be the same as the reference function XmuDrawLogo() */
size
=
width
;
if
(
height
<
width
)
size
=
height
;
size
=
RANDOM_WIDTH
+
rand
()
%
(
size
-
RANDOM_WIDTH
);
size
&=
~
1
;
x
+=
rand
()
%
(
width
-
size
);
y
+=
rand
()
%
(
height
-
size
);
/*
* Draw what will be the thin strokes.
*
* -----
* / /
* / /
* / /
* / /
* /____/
* d
*
* Point d is 9/44 (~1/5) of the way across.
*/
thin
=
(
size
/
11
);
if
(
thin
<
1
)
thin
=
1
;
gap
=
(
thin
+
3
)
/
4
;
d31
=
thin
+
thin
+
gap
;
poly
[
0
].
x
=
x
+
size
;
poly
[
0
].
y
=
y
;
poly
[
1
].
x
=
x
+
size
-
d31
;
poly
[
1
].
y
=
y
;
poly
[
2
].
x
=
x
+
0
;
poly
[
2
].
y
=
y
+
size
;
poly
[
3
].
x
=
x
+
d31
;
poly
[
3
].
y
=
y
+
size
;
dixChangeGC
(
NullClient
,
pGC
,
fmask
,
NULL
,
fore
);
ValidateGC
(
pDraw
,
pGC
);
(
*
pGC
->
ops
->
FillPolygon
)(
pDraw
,
pGC
,
Convex
,
CoordModeOrigin
,
4
,
poly
);
/*
* Erase area not needed for lower thin stroke.
*
* ------
* / /
* / __ /
* / / /
* / / /
* /__/__/
*/
poly
[
0
].
x
=
x
+
d31
/
2
;
poly
[
0
].
y
=
y
+
size
;
poly
[
1
].
x
=
x
+
size
/
2
;
poly
[
1
].
y
=
y
+
size
/
2
;
poly
[
2
].
x
=
x
+
(
size
/
2
)
+
(
d31
-
(
d31
/
2
));
poly
[
2
].
y
=
y
+
size
/
2
;
poly
[
3
].
x
=
x
+
d31
;
poly
[
3
].
y
=
y
+
size
;
dixChangeGC
(
NullClient
,
pGC
,
bmask
,
NULL
,
back
);
ValidateGC
(
pDraw
,
pGC
);
(
*
pGC
->
ops
->
FillPolygon
)(
pDraw
,
pGC
,
Convex
,
CoordModeOrigin
,
4
,
poly
);
/*
* Erase area not needed for upper thin stroke.
*
* ------
* / / /
* /--/ /
* / /
* / /
* /_____/
*/
poly
[
0
].
x
=
x
+
size
-
d31
/
2
;
poly
[
0
].
y
=
y
;
poly
[
1
].
x
=
x
+
size
/
2
;
poly
[
1
].
y
=
y
+
size
/
2
;
poly
[
2
].
x
=
x
+
(
size
/
2
)
-
(
d31
-
(
d31
/
2
));
poly
[
2
].
y
=
y
+
size
/
2
;
poly
[
3
].
x
=
x
+
size
-
d31
;
poly
[
3
].
y
=
y
;
ValidateGC
(
pDraw
,
pGC
);
(
*
pGC
->
ops
->
FillPolygon
)(
pDraw
,
pGC
,
Convex
,
CoordModeOrigin
,
4
,
poly
);
/*
* Draw thick stroke.
* Point b is 1/4 of the way across.
*
* b
* -----
* \ \
* \ \
* \ \
* \ \
* \____\
*/
poly
[
0
].
x
=
x
;
poly
[
0
].
y
=
y
;
poly
[
1
].
x
=
x
+
size
/
4
;
poly
[
1
].
y
=
y
;
poly
[
2
].
x
=
x
+
size
;
poly
[
2
].
y
=
y
+
size
;
poly
[
3
].
x
=
x
+
size
-
size
/
4
;
poly
[
3
].
y
=
y
+
size
;
dixChangeGC
(
NullClient
,
pGC
,
fmask
,
NULL
,
fore
);
ValidateGC
(
pDraw
,
pGC
);
(
*
pGC
->
ops
->
FillPolygon
)(
pDraw
,
pGC
,
Convex
,
CoordModeOrigin
,
4
,
poly
);
/*
* Erase to create gap.
*
* /
* /
* /
* /
* /
*/
poly
[
0
].
x
=
x
+
size
-
thin
;
poly
[
0
].
y
=
y
;
poly
[
1
].
x
=
x
+
size
-
(
thin
+
gap
);
poly
[
1
].
y
=
y
;
poly
[
2
].
x
=
x
+
thin
;
poly
[
2
].
y
=
y
+
size
;
poly
[
3
].
x
=
x
+
thin
+
gap
;
poly
[
3
].
y
=
y
+
size
;
dixChangeGC
(
NullClient
,
pGC
,
bmask
,
NULL
,
back
);
ValidateGC
(
pDraw
,
pGC
);
(
*
pGC
->
ops
->
FillPolygon
)(
pDraw
,
pGC
,
Convex
,
CoordModeOrigin
,
4
,
poly
);
FreeScratchGC
(
pGC
);
}
#endif
nx-X11/programs/Xserver/hw/nxagent/Screen.h
View file @
4690d6b7
...
...
@@ -32,6 +32,8 @@ is" without express or implied warranty.
#ifndef __Screen_H__
#define __Screen_H__
#include "scrnintstr.h"
#define MIN_NXAGENT_WIDTH 80
#define MIN_NXAGENT_HEIGHT 60
#define NXAGENT_FRAME_WIDTH 2000
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment