]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/programs/Xserver/hw/vnc/cutpaste.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / programs / Xserver / hw / vnc / cutpaste.c
diff --git a/Xserver/programs/Xserver/hw/vnc/cutpaste.c b/Xserver/programs/Xserver/hw/vnc/cutpaste.c
new file mode 100644 (file)
index 0000000..2860f51
--- /dev/null
@@ -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 <stdio.h>
+#define NEED_EVENTS
+#include <X.h>
+#include <Xproto.h>
+#include "rfb.h"
+#include "selection.h"
+#include "input.h"
+#include <property.h>
+#include <Xatom.h>
+
+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);
+}