X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=Xserver%2Fprograms%2FXserver%2Fhw%2Fvnc%2Fcutpaste.c;fp=Xserver%2Fprograms%2FXserver%2Fhw%2Fvnc%2Fcutpaste.c;h=2860f514d8b8bcb43d859b41585ed969c3687f0d;hp=0000000000000000000000000000000000000000;hb=b6e6afccf37f4ad0515ef2a698f714fdf1bf23b3;hpb=e3340a110a3b01756b8e67531395a33b40a17d37 diff --git a/Xserver/programs/Xserver/hw/vnc/cutpaste.c b/Xserver/programs/Xserver/hw/vnc/cutpaste.c new file mode 100644 index 0000000..2860f51 --- /dev/null +++ b/Xserver/programs/Xserver/hw/vnc/cutpaste.c @@ -0,0 +1,88 @@ +/* + * cutpaste.c - routines to deal with cut & paste buffers / selection. + */ + +/* + * Copyright (C) 2002 RealVNC Ltd. + * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#include +#define NEED_EVENTS +#include +#include +#include "rfb.h" +#include "selection.h" +#include "input.h" +#include +#include + +extern WindowPtr *WindowTable; /* Why isn't this in a header file? */ +extern Selection *CurrentSelections; +extern int NumCurrentSelections; + + +static Bool inSetXCutText = FALSE; + +/* + * rfbSetXCutText sets the cut buffer to be the given string. We also clear + * the primary selection. Ideally we'd like to set it to the same thing, but I + * can't work out how to do that without some kind of helper X client. + */ + +void +rfbSetXCutText(char *str, int len) +{ + int i = 0; + + inSetXCutText = TRUE; + ChangeWindowProperty(WindowTable[0], XA_CUT_BUFFER0, XA_STRING, + 8, PropModeReplace, len, + (pointer)str, TRUE); + + while ((i < NumCurrentSelections) && + CurrentSelections[i].selection != XA_PRIMARY) + i++; + + if (i < NumCurrentSelections) { + xEvent event; + + if (CurrentSelections[i].client) { + event.u.u.type = SelectionClear; + event.u.selectionClear.time = GetTimeInMillis(); + event.u.selectionClear.window = CurrentSelections[i].window; + event.u.selectionClear.atom = CurrentSelections[i].selection; + (void) TryClientEvents (CurrentSelections[i].client, &event, 1, + NoEventMask, NoEventMask /* CantBeFiltered */, + NullGrab); + } + + CurrentSelections[i].window = None; + CurrentSelections[i].pWin = NULL; + CurrentSelections[i].client = NullClient; + } + + inSetXCutText = FALSE; +} + + +void rfbGotXCutText(char *str, int len) +{ + if (!inSetXCutText) + rfbSendServerCutText(str, len); +}