Commit 3e7c6697 authored by Reinhard Tartler's avatar Reinhard Tartler

Imported nxagent-3.1.0-6.tar.gz

Summary: Imported nxagent-3.1.0-6.tar.gz Keywords: Imported nxagent-3.1.0-6.tar.gz into Git repository
parent 9e337102
......@@ -1215,6 +1215,12 @@ static void nxagentParseOptions(char *name, char *value)
return;
}
else if (strcmp(name, "copysize") == 0)
{
nxagentChangeOption(CopyBufferSize, atoi(value));
return;
}
else
{
#ifdef DEBUG
......
ChangeLog:
nxagent-3.1.0-6
- Fixed a compile warning in Args.c.
- The synchronization loop breaks if the drawable is clean when it's
not supposed to be.
- Fixed TR12E01966. Emacs tooltips were not displayed properly. Added
a check on the event mask before calling miWindowExposures().
- Fixed TR01F01982. ConfigureNotify warning is printed in verbose mode
only.
nxagent-3.1.0-5
- Moved some variable definitions placed in ProcGetProperty().
nxagent-3.1.0-4
- Fixed TR06D01397. The problem was: drag & drop operations between
windows of Java applications didn't work in NX Client for Windows.
- Implemented FR12E01957. Added a limit to the amount of data that can
be pasted from an NX session into an external application. The new
option - named 'copysize' - can be read from the 'options' file.
nxagent-3.1.0-3
- Fixed TR12E01963. The window tree is revalidated explicitly after
recomputing the root window clip regions.
nxagent-3.1.0-2
- Fixed TR11E01946. Forcing exposures on regions saved in the backing
......
......@@ -59,7 +59,7 @@ static int agentClipboardStatus;
static int clientAccum;
Atom serverCutProperty;
static Atom clientCutProperty;
Atom clientCutProperty;
static Window serverWindow;
static const int nxagentPrimarySelection = 0;
......
......@@ -650,6 +650,22 @@ int nxagentSynchronizeRegion(DrawablePtr pDrawable, RegionPtr pRegion, unsigned
{
w = MIN(box.x2 - x, tileWidth);
/*
* FIXME: This should not occur.
*/
if (nxagentDrawableStatus(pDrawable) == Synchronized)
{
#ifdef WARNING
if (pDrawable -> type == DRAWABLE_WINDOW && pSrcDrawable != pDrawable)
fprintf(stderr, "nxagentSynchronizeRegion: WARNING! Trying to synchronize "
"the clean drawable type [%d] at [%p] with source at [%p].\n",
pDrawable -> type, (void *) pDrawable, (void *) pSrcDrawable);
#endif
goto nxagentSynchronizeRegionStop;
}
if (canBreakOnTimeout(breakMask))
{
/*
......
......@@ -55,6 +55,7 @@
#include "Drawable.h"
#include "Handlers.h"
#include "Utils.h"
#include "Error.h"
#include "NX.h"
#include "NXvars.h"
......@@ -1478,7 +1479,10 @@ void nxagentDispatchEvents(PredicateFuncPtr predicate)
if (nxagentExposeQueue.exposures[nxagentExposeQueue.start].serial != X.xconfigure.x)
{
#ifdef WARNING
fprintf(stderr, "nxagentDispatchEvents: Requested ConfigureNotify changes didn't take place.\n");
if (nxagentVerbose == 1)
{
fprintf(stderr, "nxagentDispatchEvents: Requested ConfigureNotify changes didn't take place.\n");
}
#endif
}
......@@ -3358,7 +3362,8 @@ void nxagentSynchronizeExpose(void)
(nxagentExposeQueueHead.remoteRegion),
(nxagentExposeQueueHead.localRegion));
if (REGION_NIL(nxagentExposeQueueHead.remoteRegion) == 0)
if (REGION_NIL(nxagentExposeQueueHead.remoteRegion) == 0 &&
((pWin -> eventMask|wOtherEventMasks(pWin)) & ExposureMask))
{
#ifdef TEST
fprintf(stderr, "nxagentSynchronizeExpose: Going to call miWindowExposures"
......
......@@ -139,6 +139,8 @@ void nxagentInitOptions()
nxagentOptions.ClientOs = UNDEFINED;
nxagentOptions.InhibitXkb = 1;
nxagentOptions.CopyBufferSize = COPY_UNLIMITED;
}
/*
......
......@@ -27,6 +27,7 @@
#endif
#define UNDEFINED -1
#define COPY_UNLIMITED -1
typedef enum _BackingStoreMode
{
......@@ -349,6 +350,13 @@ typedef struct _AgentOptions
int InhibitXkb;
/*
* Maximum number of bytes that can be pasted from
* an NX session into an external application.
*/
int CopyBufferSize;
} AgentOptionsRec;
typedef AgentOptionsRec *AgentOptionsPtr;
......
......@@ -46,6 +46,7 @@ is" without express or implied warranty.
#include "../../fb/fb.h"
#include "../../randr/randrstr.h"
#include "inputstr.h"
#include "mivalidate.h"
#include "Agent.h"
#include "Display.h"
......@@ -1989,6 +1990,144 @@ Bool nxagentCloseScreen(int index, ScreenPtr pScreen)
return True;
}
/*
* This function comes from the xfree86 Xserver.
*/
static void nxagentSetRootClip (ScreenPtr pScreen, Bool enable)
{
WindowPtr pWin = WindowTable[pScreen->myNum];
WindowPtr pChild;
Bool WasViewable = (Bool)(pWin->viewable);
Bool anyMarked = FALSE;
RegionPtr pOldClip = NULL, bsExposed;
#ifdef DO_SAVE_UNDERS
Bool dosave = FALSE;
#endif
WindowPtr pLayerWin;
BoxRec box;
if (WasViewable)
{
for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib)
{
(void) (*pScreen->MarkOverlappedWindows)(pChild,
pChild,
&pLayerWin);
}
(*pScreen->MarkWindow) (pWin);
anyMarked = TRUE;
if (pWin->valdata)
{
if (HasBorder (pWin))
{
RegionPtr borderVisible;
borderVisible = REGION_CREATE(pScreen, NullBox, 1);
REGION_SUBTRACT(pScreen, borderVisible,
&pWin->borderClip, &pWin->winSize);
pWin->valdata->before.borderVisible = borderVisible;
}
pWin->valdata->before.resized = TRUE;
}
}
/*
* Use REGION_BREAK to avoid optimizations in ValidateTree
* that assume the root borderClip can't change well, normally
* it doesn't...)
*/
if (enable)
{
box.x1 = 0;
box.y1 = 0;
box.x2 = pScreen->width;
box.y2 = pScreen->height;
REGION_INIT (pScreen, &pWin->winSize, &box, 1);
REGION_INIT (pScreen, &pWin->borderSize, &box, 1);
if (WasViewable)
REGION_RESET(pScreen, &pWin->borderClip, &box);
pWin->drawable.width = pScreen->width;
pWin->drawable.height = pScreen->height;
REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList);
}
else
{
REGION_EMPTY(pScreen, &pWin->borderClip);
REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList);
}
ResizeChildrenWinSize (pWin, 0, 0, 0, 0);
if (WasViewable)
{
if (pWin->backStorage)
{
pOldClip = REGION_CREATE(pScreen, NullBox, 1);
REGION_COPY(pScreen, pOldClip, &pWin->clipList);
}
if (pWin->firstChild)
{
anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin->firstChild,
pWin->firstChild,
(WindowPtr *)NULL);
}
else
{
(*pScreen->MarkWindow) (pWin);
anyMarked = TRUE;
}
#ifdef DO_SAVE_UNDERS
if (DO_SAVE_UNDERS(pWin))
{
dosave = (*pScreen->ChangeSaveUnder)(pLayerWin, pLayerWin);
}
#endif /* DO_SAVE_UNDERS */
if (anyMarked)
(*pScreen->ValidateTree)(pWin, NullWindow, VTOther);
}
if (pWin->backStorage &&
((pWin->backingStore == Always) || WasViewable))
{
if (!WasViewable)
pOldClip = &pWin->clipList; /* a convenient empty region */
bsExposed = (*pScreen->TranslateBackingStore)
(pWin, 0, 0, pOldClip,
pWin->drawable.x, pWin->drawable.y);
if (WasViewable)
REGION_DESTROY(pScreen, pOldClip);
if (bsExposed)
{
RegionPtr valExposed = NullRegion;
if (pWin->valdata)
valExposed = &pWin->valdata->after.exposed;
(*pScreen->WindowExposures) (pWin, valExposed, bsExposed);
if (valExposed)
REGION_EMPTY(pScreen, valExposed);
REGION_DESTROY(pScreen, bsExposed);
}
}
if (WasViewable)
{
if (anyMarked)
(*pScreen->HandleExposures)(pWin);
#ifdef DO_SAVE_UNDERS
if (dosave)
(*pScreen->PostChangeSaveUnder)(pLayerWin, pLayerWin);
#endif /* DO_SAVE_UNDERS */
if (anyMarked && pScreen->PostValidateTree)
(*pScreen->PostValidateTree)(pWin, NullWindow, VTOther);
}
if (pWin->realized)
WindowsRestructured ();
FlushAllOutput ();
}
Bool nxagentResizeScreen(ScreenPtr pScreen, int width, int height,
int mmWidth, int mmHeight)
{
......@@ -2002,7 +2141,6 @@ Bool nxagentResizeScreen(ScreenPtr pScreen, int width, int height,
int oldMmWidth;
int oldMmHeight;
WindowPtr pWin;
RegionPtr pRootWinSize;
#ifdef TEST
......@@ -2180,25 +2318,7 @@ FIXME: We should try to restore the previously
pRootWinSize = &WindowTable[pScreen -> myNum] -> winSize;
/*
* Force a fictitious resize of all the top
* level windows, in order to trigger the
* window tree validation.
*/
if (nxagentOption(Rootless) == 0)
{
for (pWin = WindowTable[pScreen -> myNum] -> firstChild; pWin != NULL; pWin = pWin -> nextSib)
{
(*pWin -> drawable.pScreen -> ResizeWindow)(pWin, pWin -> drawable.x,
pWin -> drawable.y,
pWin -> drawable.width,
pWin -> drawable.height,
pWin -> nextSib);
}
}
nxagentSetRootClip(pScreen, 1);
XMoveWindow(nxagentDisplay, nxagentWindow(WindowTable[0]),
nxagentOption(RootX), nxagentOption(RootY));
......
......@@ -89,6 +89,7 @@ SOFTWARE.
#include "Options.h"
#include "Rootless.h"
#include "Client.h"
#include "Windows.h"
#if defined(LBX) || defined(LBX_COMPAT)
#if 0 /* no header in X11 environment, not used in X11 environment */
......@@ -99,6 +100,17 @@ int fWriteToClient(ClientPtr client, int len, char *buf)
#endif
#endif
extern Atom clientCutProperty;
#ifdef NXAGENT_SERVER
typedef struct
{
CARD32 state;
Window icon;
}
nxagentWMStateRec;
#endif
/*****************************************************************
* Property Stuff
*
......@@ -343,10 +355,23 @@ ChangeWindowProperty(WindowPtr pWin, Atom property, Atom type, int format,
int sizeInBytes;
int totalSize;
pointer data;
int copySize;
sizeInBytes = format>>3;
totalSize = len * sizeInBytes;
copySize = nxagentOption(CopyBufferSize);
if (copySize != COPY_UNLIMITED && property == clientCutProperty)
{
if (totalSize > copySize)
{
totalSize = copySize;
totalSize = totalSize - (totalSize % sizeInBytes);
len = totalSize / sizeInBytes;
}
}
/* first see if property already exists */
pProp = wUserProps (pWin);
......@@ -545,6 +570,11 @@ NullPropertyReply(
int
ProcGetProperty(ClientPtr client)
{
#ifdef NXAGENT_SERVER
nxagentWMStateRec wmState;
nxagentWMStateRec *wmsP = &wmState;
#endif
PropertyPtr pProp, prevProp;
unsigned long n, len, ind;
WindowPtr pWin;
......@@ -552,6 +582,7 @@ ProcGetProperty(ClientPtr client)
REQUEST(xGetPropertyReq);
REQUEST_SIZE_MATCH(xGetPropertyReq);
if (stuff->delete)
UpdateCurrentTime();
pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
......@@ -587,6 +618,59 @@ ProcGetProperty(ClientPtr client)
reply.type = X_Reply;
reply.sequenceNumber = client->sequence;
#ifdef NXAGENT_SERVER
/*
* Creating a reply for WM_STATE property if it doesn't exist.
* This is intended to allow drag & drop work in JAva 1.6 when
* the agent is connected to NXWin in multiwindow mode.
*/
if (nxagentOption(Rootless) &&
nxagentWindowTopLevel(pWin) &&
(!pProp) &&
strcmp(NameForAtom(stuff->property), "WM_STATE") == 0)
{
wmState.state = 1;
wmState.icon = None;
if (ChangeWindowProperty(pWin, stuff->property, stuff->property, 32, 0, 2, &wmState, 1) == Success)
{
nxagentExportProperty(pWin, stuff->property, stuff->property, 32, 0, 2, &wmState);
}
n = 8;
ind = stuff->longOffset << 2;
if (n < ind)
{
client->errorValue = stuff->longOffset;
return BadValue;
}
len = min(n - ind, 4 * stuff->longLength);
reply.bytesAfter = n - (ind + len);
reply.length = (len + 3) >> 2;
reply.format = 32;
reply.nItems = len / 4;
reply.propertyType = stuff->property;
WriteReplyToClient(client, sizeof(xGenericReply), &reply);
if (len)
{
client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write;
WriteSwappedDataToClient(client, len, (char *)wmsP + ind);
}
return(client->noClientException);
}
#endif
if (!pProp)
return NullPropertyReply(client, None, 0, &reply);
......
......@@ -89,6 +89,7 @@ SOFTWARE.
#include "Options.h"
#include "Rootless.h"
#include "Client.h"
#include "Windows.h"
#if defined(LBX) || defined(LBX_COMPAT)
#if 0 /* no header in X11 environment, not used in X11 environment */
......@@ -99,6 +100,17 @@ int fWriteToClient(ClientPtr client, int len, char *buf)
#endif
#endif
extern Atom clientCutProperty;
#ifdef NXAGENT_SERVER
typedef struct
{
CARD32 state;
Window icon;
}
nxagentWMStateRec;
#endif
/*****************************************************************
* Property Stuff
*
......@@ -343,10 +355,23 @@ ChangeWindowProperty(WindowPtr pWin, Atom property, Atom type, int format,
int sizeInBytes;
int totalSize;
pointer data;
int copySize;
sizeInBytes = format>>3;
totalSize = len * sizeInBytes;
copySize = nxagentOption(CopyBufferSize);
if (copySize != COPY_UNLIMITED && property == clientCutProperty)
{
if (totalSize > copySize)
{
totalSize = copySize;
totalSize = totalSize - (totalSize % sizeInBytes);
len = totalSize / sizeInBytes;
}
}
/* first see if property already exists */
pProp = wUserProps (pWin);
......@@ -545,6 +570,11 @@ NullPropertyReply(
int
ProcGetProperty(ClientPtr client)
{
#ifdef NXAGENT_SERVER
nxagentWMStateRec wmState;
nxagentWMStateRec *wmsP = &wmState;
#endif
PropertyPtr pProp, prevProp;
unsigned long n, len, ind;
WindowPtr pWin;
......@@ -552,6 +582,7 @@ ProcGetProperty(ClientPtr client)
REQUEST(xGetPropertyReq);
REQUEST_SIZE_MATCH(xGetPropertyReq);
if (stuff->delete)
UpdateCurrentTime();
pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
......@@ -587,6 +618,59 @@ ProcGetProperty(ClientPtr client)
reply.type = X_Reply;
reply.sequenceNumber = client->sequence;
#ifdef NXAGENT_SERVER
/*
* Creating a reply for WM_STATE property if it doesn't exist.
* This is intended to allow drag & drop work in JAva 1.6 when
* the agent is connected to NXWin in multiwindow mode.
*/
if (nxagentOption(Rootless) &&
nxagentWindowTopLevel(pWin) &&
(!pProp) &&
strcmp(NameForAtom(stuff->property), "WM_STATE") == 0)
{
wmState.state = 1;
wmState.icon = None;
if (ChangeWindowProperty(pWin, stuff->property, stuff->property, 32, 0, 2, &wmState, 1) == Success)
{
nxagentExportProperty(pWin, stuff->property, stuff->property, 32, 0, 2, &wmState);
}
n = 8;
ind = stuff->longOffset << 2;
if (n < ind)
{
client->errorValue = stuff->longOffset;
return BadValue;
}
len = min(n - ind, 4 * stuff->longLength);
reply.bytesAfter = n - (ind + len);
reply.length = (len + 3) >> 2;
reply.format = 32;
reply.nItems = len / 4;
reply.propertyType = stuff->property;
WriteReplyToClient(client, sizeof(xGenericReply), &reply);
if (len)
{
client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write;
WriteSwappedDataToClient(client, len, (char *)wmsP + ind);
}
return(client->noClientException);
}
#endif
if (!pProp)
return NullPropertyReply(client, None, 0, &reply);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment